[Pkg-virtualbox-commits] [virtualbox] 01/03: Imported Upstream version 5.0.0~beta3-dfsg
Gianfranco Costamagna
locutusofborg-guest at moszumanska.debian.org
Fri May 8 07:25:47 UTC 2015
This is an automated email from the git hooks/post-receive script.
locutusofborg-guest pushed a commit to branch experimental
in repository virtualbox.
commit d23b4f45b1b3ef8172bc714c102db82ffe4d5ce2
Author: Gianfranco Costamagna <costamagnagianfranco at yahoo.it>
Date: Fri May 8 09:13:42 2015 +0200
Imported Upstream version 5.0.0~beta3-dfsg
---
Config.kmk | 21 +-
Makefile.kmk | 22 +-
configure | 138 +-
doc/manual/Makefile.kmk | 10 +-
doc/manual/en_US/SDKRef.xml | 204 +-
doc/manual/en_US/user_AdvancedTopics.xml | 182 +
doc/manual/en_US/user_BasicConcepts.xml | 51 +-
doc/manual/en_US/user_Installation.xml | 17 +
doc/manual/en_US/user_Networking.xml | 37 +-
doc/manual/en_US/user_Technical.xml | 4 +-
doc/manual/en_US/user_Troubleshooting.xml | 2 +-
doc/manual/en_US/user_VBoxManage.xml | 237 +-
doc/manual/user_ChangeLogImpl.xml | 43 +-
include/VBox/GuestHost/DragAndDrop.h | 71 +-
include/VBox/HGSMI/HGSMI.h | 216 +-
include/VBox/HostServices/DragAndDropSvc.h | 474 ++-
include/VBox/HostServices/GuestControlSvc.h | 12 +-
include/VBox/HostServices/Service.h | 128 +-
include/VBox/VBoxGuestLib.h | 69 +-
include/VBox/com/ptr.h | 9 +
include/VBox/dbus-calls.h | 2 +
include/VBox/dbus.h | 2 +-
include/VBox/err.h | 169 +-
include/VBox/hgcmsvc.h | 28 +-
include/VBox/intnet.h | 39 +-
include/VBox/settings.h | 1 +
include/VBox/vmm/cpum.h | 2 +-
include/VBox/vmm/cpumctx.h | 33 +
include/VBox/vmm/hm.h | 6 +-
include/VBox/vmm/hm_svm.h | 20 +-
include/VBox/vmm/iem.h | 1 +
include/VBox/vmm/mm.h | 4 +
include/VBox/vmm/pdmaudioifs.h | 36 +-
include/VBox/vmm/pgm.h | 59 +-
include/VBox/vmm/rem.h | 12 +-
include/VBox/vmm/ssm.h | 62 +-
include/iprt/asm-amd64-x86.h | 59 +-
include/iprt/cdefs.h | 11 +
include/iprt/env.h | 105 +-
include/iprt/err.h | 82 +-
include/iprt/getopt.h | 9 +-
include/iprt/list-off32.h | 502 +++
include/iprt/log.h | 2 +-
include/iprt/mangling.h | 11 +
include/iprt/process.h | 8 +-
include/iprt/thread.h | 2 +-
include/iprt/x86.h | 44 +-
src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp | 4 +-
.../Additions/common/VBoxGuest/VBoxGuestInternal.h | 2 +-
.../common/VBoxGuestLib/GenericRequest.cpp | 2 +-
src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp | 2 +-
.../Additions/common/VBoxGuestLib/HGCMInternal.cpp | 2 +-
src/VBox/Additions/common/VBoxGuestLib/Init.cpp | 2 +-
src/VBox/Additions/common/VBoxGuestLib/Mouse.cpp | 2 +-
.../Additions/common/VBoxGuestLib/PhysHeap.cpp | 2 +-
src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp | 2 +-
src/VBox/Additions/common/VBoxGuestLib/SysHlp.h | 2 +-
.../Additions/common/VBoxGuestLib/VBGLInternal.h | 2 +-
.../Additions/common/VBoxGuestLib/VBoxGuestLog.h | 1 +
.../common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp | 1 +
.../common/VBoxGuestLib/VBoxGuestR0LibCrOgl.h | 1 +
.../VBoxGuestLib/VBoxGuestR0LibSharedFolders.c | 2 +-
.../VBoxGuestLib/VBoxGuestR0LibSharedFolders.h | 1 +
.../VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp | 953 +++--
src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp | 1 +
.../VBoxGuestLib/VbglR0CanUsePhysPageList.cpp | 2 +-
.../VBoxService/VBoxServiceControlProcess.cpp | 72 +-
.../VBoxService/VBoxServiceControlSession.cpp | 110 +-
.../common/VBoxService/VBoxServiceToolBox.cpp | 77 +-
src/VBox/Additions/common/VBoxVideo/HGSMIBase.cpp | 4 +-
src/VBox/Additions/common/crOpenGL/DD_glc.py | 0
src/VBox/Additions/common/crOpenGL/DD_glh.py | 0
src/VBox/Additions/common/crOpenGL/NULLfuncs.py | 0
src/VBox/Additions/common/crOpenGL/context.c | 15 +-
src/VBox/Additions/common/crOpenGL/cr_gl.py | 0
src/VBox/Additions/common/crOpenGL/entrypoints.py | 0
.../Additions/common/crOpenGL/feedback/feedback.py | 0
.../common/crOpenGL/feedback/feedback_funcs.py | 0
.../common/crOpenGL/feedback/feedback_state.py | 0
.../common/crOpenGL/feedback/feedbackspu_proto.py | 0
.../Additions/common/crOpenGL/getprocaddress.py | 0
src/VBox/Additions/common/crOpenGL/icd_drv.c | 24 +-
src/VBox/Additions/common/crOpenGL/pack/pack.py | 0
.../common/crOpenGL/pack/packspu_beginend.py | 0
.../common/crOpenGL/pack/packspu_context.c | 45 +-
.../common/crOpenGL/pack/packspu_flush.py | 0
.../Additions/common/crOpenGL/pack/packspu_get.py | 0
.../Additions/common/crOpenGL/pack/packspu_init.c | 10 +-
.../common/crOpenGL/pack/packspu_proto.py | 0
.../common/crOpenGL/passthrough/passthrough.py | 0
src/VBox/Additions/common/crOpenGL/stub.c | 2 +-
src/VBox/Additions/common/crOpenGL/stub.h | 2 +-
src/VBox/Additions/common/crOpenGL/stub_common.py | 0
src/VBox/Additions/common/crOpenGL/tsfuncs.py | 0
src/VBox/Additions/common/crOpenGL/wgl.c | 13 +-
.../common/crOpenGL/windows_getprocaddress.py | 0
src/VBox/Additions/freebsd/Makefile.kmk | 2 +-
src/VBox/Additions/linux/Makefile.kmk | 2 +-
src/VBox/Additions/x11/VBoxClient/VBoxClient.h | 1 +
src/VBox/Additions/x11/VBoxClient/draganddrop.cpp | 410 +-
src/VBox/Additions/x11/VBoxClient/hostversion.cpp | 3 +-
src/VBox/Additions/x11/VBoxClient/main.cpp | 25 +-
src/VBox/Additions/x11/VBoxClient/seamless-x11.cpp | 1 +
src/VBox/Additions/x11/VBoxClient/seamless-x11.h | 1 +
src/VBox/Additions/x11/VBoxClient/seamless.cpp | 1 +
src/VBox/Additions/x11/VBoxClient/seamless.h | 1 +
.../VBoxClient/testcase/tstSeamlessX11-auto.cpp | 1 +
.../x11/VBoxClient/testcase/tstSeamlessX11.cpp | 1 +
src/VBox/Additions/x11/undefined_xorg | 3 +-
src/VBox/Additions/x11/vboxmouse/vboxmouse.c | 1 +
src/VBox/Additions/x11/vboxvideo/Makefile.kmk | 3 +-
src/VBox/Additions/x11/vboxvideo/getmode.c | 8 -
src/VBox/Additions/x11/vboxvideo/pointer.c | 7 +-
src/VBox/Additions/x11/vboxvideo/vboxvideo.c | 137 +-
src/VBox/Additions/x11/vboxvideo/vboxvideo.h | 14 +-
src/VBox/Additions/x11/vboxvideo/vbva.c | 1 +
src/VBox/Devices/Audio/AudioMixBuffer.cpp | 214 +-
src/VBox/Devices/Audio/AudioMixBuffer.h | 20 +-
src/VBox/Devices/Audio/AudioMixer.cpp | 63 +-
src/VBox/Devices/Audio/AudioMixer.h | 4 +-
src/VBox/Devices/Audio/DevIchAc97.cpp | 125 +-
src/VBox/Devices/Audio/DevIchHda.cpp | 36 +-
src/VBox/Devices/Audio/DevIchHdaCodec.cpp | 26 +-
src/VBox/Devices/Audio/DevIchHdaCodec.h | 2 +-
src/VBox/Devices/Audio/DevSB16.cpp | 583 ++-
src/VBox/Devices/Audio/DrvAudio.cpp | 17 +-
src/VBox/Devices/Audio/DrvAudio.h | 4 +-
src/VBox/Devices/Audio/DrvAudioCommon.cpp | 8 +-
src/VBox/Devices/Audio/DrvHostALSAAudio.cpp | 26 +-
src/VBox/Devices/Audio/DrvHostDSound.cpp | 4 +-
src/VBox/Devices/Audio/DrvHostNullAudio.cpp | 26 +-
src/VBox/Devices/Audio/DrvHostOSSAudio.cpp | 34 +-
src/VBox/Devices/Audio/DrvHostPulseAudio.cpp | 22 +-
.../Devices/Audio/testcase/tstAudioMixBuffer.cpp | 358 +-
src/VBox/Devices/EFI/DevSmc.cpp | 93 +-
.../BaseTools/Source/C/PyEfiCompressor/setup.py | 0
.../Firmware/BaseTools/Source/C/PyUtility/setup.py | 0
.../BaseTools/Source/Python/AutoGen/AutoGen.py | 0
.../BaseTools/Source/Python/AutoGen/BuildEngine.py | 0
.../BaseTools/Source/Python/AutoGen/GenC.py | 0
.../BaseTools/Source/Python/AutoGen/GenDepex.py | 0
.../BaseTools/Source/Python/AutoGen/GenMake.py | 0
.../BaseTools/Source/Python/AutoGen/StrGather.py | 0
.../Source/Python/AutoGen/UniClassObject.py | 0
.../Firmware/BaseTools/Source/Python/BPDG/BPDG.py | 0
.../BaseTools/Source/Python/BPDG/GenVpd.py | 0
.../BaseTools/Source/Python/BPDG/StringTable.py | 0
.../BaseTools/Source/Python/Common/Database.py | 0
.../Source/Python/Common/DecClassObject.py | 0
.../BaseTools/Source/Python/Common/Dictionary.py | 0
.../Source/Python/Common/DscClassObject.py | 0
.../Source/Python/Common/EdkIIWorkspace.py | 0
.../Source/Python/Common/EdkIIWorkspaceBuild.py | 0
.../BaseTools/Source/Python/Common/EdkLogger.py | 0
.../BaseTools/Source/Python/Common/Expression.py | 0
.../Source/Python/Common/FdfClassObject.py | 0
.../Source/Python/Common/InfClassObject.py | 0
.../Source/Python/Common/MigrationUtilities.py | 0
.../BaseTools/Source/Python/Common/Misc.py | 0
.../BaseTools/Source/Python/Common/Parsing.py | 0
.../BaseTools/Source/Python/Common/String.py | 0
.../Source/Python/Common/TargetTxtClassObject.py | 0
.../Source/Python/Common/ToolDefClassObject.py | 0
.../Source/Python/CommonDataClass/ModuleClass.py | 0
.../Source/Python/CommonDataClass/PackageClass.py | 0
.../Source/Python/CommonDataClass/PlatformClass.py | 0
.../Firmware/BaseTools/Source/Python/Ecc/CLexer.py | 0
.../BaseTools/Source/Python/Ecc/CParser.py | 0
.../Firmware/BaseTools/Source/Python/Ecc/Check.py | 0
.../Source/Python/Ecc/CodeFragmentCollector.py | 0
.../BaseTools/Source/Python/Ecc/Configuration.py | 0
.../BaseTools/Source/Python/Ecc/Database.py | 0
.../Firmware/BaseTools/Source/Python/Ecc/Ecc.py | 0
.../BaseTools/Source/Python/Ecc/Exception.py | 0
.../BaseTools/Source/Python/Ecc/FileProfile.py | 0
.../BaseTools/Source/Python/Ecc/MetaDataParser.py | 0
.../Python/Ecc/MetaFileWorkspace/MetaDataTable.py | 0
.../Python/Ecc/MetaFileWorkspace/MetaFileParser.py | 0
.../Python/Ecc/MetaFileWorkspace/MetaFileTable.py | 0
.../BaseTools/Source/Python/Ecc/Xml/__init__.py | 0
.../EFI/Firmware/BaseTools/Source/Python/Ecc/c.py | 0
.../Firmware/BaseTools/Source/Python/Eot/CLexer.py | 0
.../BaseTools/Source/Python/Eot/CParser.py | 0
.../Source/Python/Eot/CodeFragmentCollector.py | 0
.../BaseTools/Source/Python/Eot/Database.py | 0
.../Firmware/BaseTools/Source/Python/Eot/Eot.py | 0
.../BaseTools/Source/Python/Eot/EotGlobalData.py | 0
.../BaseTools/Source/Python/Eot/FileProfile.py | 0
.../BaseTools/Source/Python/Eot/FvImage.py | 0
.../BaseTools/Source/Python/Eot/InfParserLite.py | 0
.../Firmware/BaseTools/Source/Python/Eot/Parser.py | 0
.../EFI/Firmware/BaseTools/Source/Python/Eot/c.py | 0
.../Source/Python/GenFds/AprioriSection.py | 0
.../BaseTools/Source/Python/GenFds/Capsule.py | 0
.../BaseTools/Source/Python/GenFds/CapsuleData.py | 0
.../Source/Python/GenFds/ComponentStatement.py | 0
.../Source/Python/GenFds/CompressSection.py | 0
.../BaseTools/Source/Python/GenFds/DataSection.py | 0
.../BaseTools/Source/Python/GenFds/DepexSection.py | 0
.../BaseTools/Source/Python/GenFds/EfiSection.py | 0
.../Firmware/BaseTools/Source/Python/GenFds/Fd.py | 0
.../BaseTools/Source/Python/GenFds/FdfParser.py | 0
.../Firmware/BaseTools/Source/Python/GenFds/Ffs.py | 0
.../Source/Python/GenFds/FfsFileStatement.py | 0
.../Source/Python/GenFds/FfsInfStatement.py | 0
.../Firmware/BaseTools/Source/Python/GenFds/Fv.py | 0
.../Source/Python/GenFds/FvImageSection.py | 0
.../BaseTools/Source/Python/GenFds/GenFds.py | 0
.../Source/Python/GenFds/GenFdsGlobalVariable.py | 0
.../BaseTools/Source/Python/GenFds/GuidSection.py | 0
.../Source/Python/GenFds/OptRomFileStatement.py | 0
.../Source/Python/GenFds/OptRomInfStatement.py | 0
.../BaseTools/Source/Python/GenFds/OptionRom.py | 0
.../BaseTools/Source/Python/GenFds/Region.py | 0
.../BaseTools/Source/Python/GenFds/Rule.py | 0
.../Source/Python/GenFds/RuleComplexFile.py | 0
.../Source/Python/GenFds/RuleSimpleFile.py | 0
.../BaseTools/Source/Python/GenFds/Section.py | 0
.../BaseTools/Source/Python/GenFds/UiSection.py | 0
.../BaseTools/Source/Python/GenFds/VerSection.py | 0
.../Firmware/BaseTools/Source/Python/GenFds/Vtf.py | 0
.../Python/GenPatchPcdTable/GenPatchPcdTable.py | 0
.../Source/Python/PatchPcdValue/PatchPcdValue.py | 0
.../Source/Python/Table/TableDataModel.py | 0
.../BaseTools/Source/Python/Table/TableDec.py | 0
.../BaseTools/Source/Python/Table/TableDsc.py | 0
.../Source/Python/Table/TableEotReport.py | 0
.../BaseTools/Source/Python/Table/TableFdf.py | 0
.../BaseTools/Source/Python/Table/TableFile.py | 0
.../BaseTools/Source/Python/Table/TableFunction.py | 0
.../Source/Python/Table/TableIdentifier.py | 0
.../BaseTools/Source/Python/Table/TableInf.py | 0
.../BaseTools/Source/Python/Table/TablePcd.py | 0
.../BaseTools/Source/Python/Table/TableQuery.py | 0
.../BaseTools/Source/Python/Table/TableReport.py | 0
.../Source/Python/TargetTool/TargetTool.py | 0
.../Firmware/BaseTools/Source/Python/Trim/Trim.py | 0
.../BaseTools/Source/Python/UPT/BuildVersion.py | 0
.../Source/Python/UPT/Core/DependencyRules.py | 0
.../Python/UPT/Core/DistributionPackageClass.py | 0
.../BaseTools/Source/Python/UPT/Core/IpiDb.py | 0
.../Source/Python/UPT/Core/PackageFile.py | 0
.../BaseTools/Source/Python/UPT/Core/__init__.py | 0
.../Source/Python/UPT/GenMetaFile/GenDecFile.py | 0
.../Source/Python/UPT/GenMetaFile/GenInfFile.py | 0
.../Python/UPT/GenMetaFile/GenMetaFileMisc.py | 0
.../Source/Python/UPT/GenMetaFile/GenXmlFile.py | 0
.../Source/Python/UPT/GenMetaFile/__init__.py | 0
.../BaseTools/Source/Python/UPT/InstallPkg.py | 0
.../Source/Python/UPT/Library/CommentGenerating.py | 0
.../Source/Python/UPT/Library/CommentParsing.py | 0
.../Source/Python/UPT/Library/DataType.py | 0
.../Python/UPT/Library/ExpressionValidate.py | 0
.../Source/Python/UPT/Library/GlobalData.py | 0
.../BaseTools/Source/Python/UPT/Library/Misc.py | 0
.../Source/Python/UPT/Library/ParserValidate.py | 0
.../BaseTools/Source/Python/UPT/Library/Parsing.py | 0
.../BaseTools/Source/Python/UPT/Library/String.py | 0
.../Source/Python/UPT/Library/Xml/XmlRoutines.py | 0
.../Source/Python/UPT/Library/Xml/__init__.py | 0
.../Source/Python/UPT/Library/__init__.py | 0
.../BaseTools/Source/Python/UPT/Logger/Log.py | 0
.../Source/Python/UPT/Logger/StringTable.py | 0
.../BaseTools/Source/Python/UPT/Logger/__init__.py | 0
.../Firmware/BaseTools/Source/Python/UPT/MkPkg.py | 0
.../Source/Python/UPT/Object/POM/CommonObject.py | 0
.../Source/Python/UPT/Object/POM/ModuleObject.py | 0
.../Source/Python/UPT/Object/POM/PackageObject.py | 0
.../Source/Python/UPT/Object/POM/__init__.py | 0
.../Source/Python/UPT/Object/Parser/DecObject.py | 0
.../Python/UPT/Object/Parser/InfBinaryObject.py | 0
.../UPT/Object/Parser/InfBuildOptionObject.py | 0
.../UPT/Object/Parser/InfDefineCommonObject.py | 0
.../Python/UPT/Object/Parser/InfDefineObject.py | 0
.../Python/UPT/Object/Parser/InfDepexObject.py | 0
.../Python/UPT/Object/Parser/InfGuidObject.py | 0
.../UPT/Object/Parser/InfLibraryClassesObject.py | 0
.../Source/Python/UPT/Object/Parser/InfMisc.py | 0
.../Python/UPT/Object/Parser/InfPackagesObject.py | 0
.../Python/UPT/Object/Parser/InfPcdObject.py | 0
.../Python/UPT/Object/Parser/InfPpiObject.py | 0
.../Python/UPT/Object/Parser/InfProtocolObject.py | 0
.../Python/UPT/Object/Parser/InfSoucesObject.py | 0
.../UPT/Object/Parser/InfUserExtensionObject.py | 0
.../Source/Python/UPT/Object/Parser/__init__.py | 0
.../BaseTools/Source/Python/UPT/Object/__init__.py | 0
.../Source/Python/UPT/Parser/DecParser.py | 0
.../Source/Python/UPT/Parser/DecParserMisc.py | 0
.../Source/Python/UPT/Parser/InfAsBuiltProcess.py | 0
.../Python/UPT/Parser/InfBinarySectionParser.py | 0
.../UPT/Parser/InfBuildOptionSectionParser.py | 0
.../Python/UPT/Parser/InfDefineSectionParser.py | 0
.../Python/UPT/Parser/InfDepexSectionParser.py | 0
.../UPT/Parser/InfGuidPpiProtocolSectionParser.py | 0
.../Python/UPT/Parser/InfLibrarySectionParser.py | 0
.../Python/UPT/Parser/InfPackageSectionParser.py | 0
.../Source/Python/UPT/Parser/InfParser.py | 0
.../Source/Python/UPT/Parser/InfParserMisc.py | 0
.../Python/UPT/Parser/InfPcdSectionParser.py | 0
.../Source/Python/UPT/Parser/InfSectionParser.py | 0
.../Python/UPT/Parser/InfSourceSectionParser.py | 0
.../BaseTools/Source/Python/UPT/Parser/__init__.py | 0
.../Python/UPT/PomAdapter/DecPomAlignment.py | 0
.../Python/UPT/PomAdapter/InfPomAlignment.py | 0
.../Python/UPT/PomAdapter/InfPomAlignmentMisc.py | 0
.../Source/Python/UPT/PomAdapter/__init__.py | 0
.../Firmware/BaseTools/Source/Python/UPT/RmPkg.py | 0
.../Firmware/BaseTools/Source/Python/UPT/UPT.py | 0
.../UPT/UnitTest/CommentGeneratingUnitTest.py | 0
.../Python/UPT/UnitTest/CommentParsingUnitTest.py | 0
.../Source/Python/UPT/UnitTest/DecParserTest.py | 0
.../Python/UPT/UnitTest/DecParserUnitTest.py | 0
.../Python/UPT/UnitTest/InfBinarySectionTest.py | 0
.../BaseTools/Source/Python/UPT/Xml/CommonXml.py | 0
.../Source/Python/UPT/Xml/GuidProtocolPpiXml.py | 0
.../BaseTools/Source/Python/UPT/Xml/IniToXml.py | 0
.../Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py | 0
.../Source/Python/UPT/Xml/PackageSurfaceAreaXml.py | 0
.../BaseTools/Source/Python/UPT/Xml/PcdXml.py | 0
.../BaseTools/Source/Python/UPT/Xml/XmlParser.py | 0
.../Source/Python/UPT/Xml/XmlParserMisc.py | 0
.../BaseTools/Source/Python/UPT/Xml/__init__.py | 0
.../Source/Python/Workspace/BuildClassObject.py | 0
.../Source/Python/Workspace/MetaDataTable.py | 0
.../Source/Python/Workspace/MetaFileParser.py | 0
.../Source/Python/Workspace/MetaFileTable.py | 0
.../Source/Python/Workspace/WorkspaceDatabase.py | 0
.../BaseTools/Source/Python/build/BuildReport.py | 0
.../BaseTools/Source/Python/build/build.py | 0
src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd | Bin 1048576 -> 1048576 bytes
src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd | Bin 1048576 -> 1048576 bytes
.../Graphics/BIOS/VBoxVgaBiosAlternative.asm | 18 +-
.../Graphics/BIOS/VBoxVgaBiosAlternative.md5sum | 2 +-
src/VBox/Devices/Graphics/BIOS/vberom.asm | 1 -
src/VBox/Devices/Graphics/DevVGA-SVGA.cpp | 78 +-
src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp | 67 +-
src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.cpp | 5 +-
src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h | 1 +
src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp | 8 +-
src/VBox/Devices/Graphics/DevVGA.cpp | 42 +-
src/VBox/Devices/Graphics/DevVGA.h | 15 +-
src/VBox/Devices/Graphics/DevVGA_VBVA.cpp | 11 +-
src/VBox/Devices/Graphics/DevVGA_VDMA.cpp | 2 +
src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp | 886 ++---
src/VBox/Devices/Graphics/HGSMI/HGSMIHost.h | 46 +-
src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.cpp | 1 +
src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.h | 1 +
src/VBox/Devices/Input/PS2Dev.h | 1 +
src/VBox/Devices/Input/PS2K.cpp | 1 +
src/VBox/Devices/Input/UsbMouse.cpp | 1 +
src/VBox/Devices/Makefile.kmk | 38 +-
src/VBox/Devices/Network/DevE1000.cpp | 3 +-
src/VBox/Devices/Network/DevINIP.cpp | 175 +-
src/VBox/Devices/Network/DevPCNet.cpp | 46 +-
src/VBox/Devices/Network/DrvNAT.cpp | 8 +-
src/VBox/Devices/Network/DrvNetShaper.cpp | 8 +-
src/VBox/Devices/Network/SrvIntNetR0.cpp | 296 +-
src/VBox/Devices/Network/lwip/CHANGELOG | 680 ----
src/VBox/Devices/Network/lwip/COPYING | 33 -
src/VBox/Devices/Network/lwip/FILES | 4 -
src/VBox/Devices/Network/lwip/Makefile.kmk | 49 -
src/VBox/Devices/Network/lwip/Makefile.kup | 0
src/VBox/Devices/Network/lwip/README | 74 -
src/VBox/Devices/Network/lwip/README.vbox | 1 -
src/VBox/Devices/Network/lwip/doc/FILES | 5 -
src/VBox/Devices/Network/lwip/doc/contrib.txt | 62 -
src/VBox/Devices/Network/lwip/doc/rawapi.txt | 419 --
src/VBox/Devices/Network/lwip/doc/savannah.txt | 135 -
src/VBox/Devices/Network/lwip/doc/snmp_agent.txt | 172 -
src/VBox/Devices/Network/lwip/doc/sys_arch.txt | 201 -
src/VBox/Devices/Network/lwip/src/FILES | 13 -
src/VBox/Devices/Network/lwip/src/api/api_lib.c | 722 ----
src/VBox/Devices/Network/lwip/src/api/api_msg.c | 807 ----
src/VBox/Devices/Network/lwip/src/api/err.c | 59 -
src/VBox/Devices/Network/lwip/src/api/sockets.c | 1367 -------
src/VBox/Devices/Network/lwip/src/api/tcpip.c | 224 --
src/VBox/Devices/Network/lwip/src/core/dhcp.c | 1464 -------
src/VBox/Devices/Network/lwip/src/core/inet.c | 537 ---
src/VBox/Devices/Network/lwip/src/core/inet6.c | 168 -
src/VBox/Devices/Network/lwip/src/core/ipv4/icmp.c | 202 -
src/VBox/Devices/Network/lwip/src/core/ipv4/ip.c | 516 ---
.../Devices/Network/lwip/src/core/ipv4/ip_addr.c | 78 -
.../Devices/Network/lwip/src/core/ipv4/ip_frag.c | 388 --
src/VBox/Devices/Network/lwip/src/core/ipv6/README | 1 -
.../Devices/Network/lwip/src/core/ipv6/icmp6.c | 184 -
src/VBox/Devices/Network/lwip/src/core/ipv6/ip6.c | 386 --
.../Devices/Network/lwip/src/core/ipv6/ip6_addr.c | 90 -
src/VBox/Devices/Network/lwip/src/core/mem.c | 414 --
src/VBox/Devices/Network/lwip/src/core/memp.c | 238 --
src/VBox/Devices/Network/lwip/src/core/netif.c | 325 --
src/VBox/Devices/Network/lwip/src/core/pbuf.c | 961 -----
src/VBox/Devices/Network/lwip/src/core/raw.c | 326 --
.../Devices/Network/lwip/src/core/snmp/asn1_dec.c | 652 ----
.../Devices/Network/lwip/src/core/snmp/asn1_enc.c | 610 ---
src/VBox/Devices/Network/lwip/src/core/snmp/mib2.c | 4021 --------------------
.../Network/lwip/src/core/snmp/mib_structs.c | 1185 ------
.../Devices/Network/lwip/src/core/snmp/msg_in.c | 1458 -------
.../Devices/Network/lwip/src/core/snmp/msg_out.c | 687 ----
src/VBox/Devices/Network/lwip/src/core/stats.c | 115 -
src/VBox/Devices/Network/lwip/src/core/sys.c | 294 --
src/VBox/Devices/Network/lwip/src/core/tcp.c | 1182 ------
src/VBox/Devices/Network/lwip/src/core/tcp_in.c | 1209 ------
src/VBox/Devices/Network/lwip/src/core/tcp_out.c | 727 ----
src/VBox/Devices/Network/lwip/src/core/udp.c | 661 ----
.../Network/lwip/src/include/ipv4/lwip/icmp.h | 112 -
.../Network/lwip/src/include/ipv4/lwip/inet.h | 99 -
.../Network/lwip/src/include/ipv4/lwip/ip.h | 154 -
.../Network/lwip/src/include/ipv4/lwip/ip_addr.h | 160 -
.../Network/lwip/src/include/ipv4/lwip/ip_frag.h | 49 -
.../Network/lwip/src/include/ipv6/lwip/icmp.h | 90 -
.../Network/lwip/src/include/ipv6/lwip/inet.h | 62 -
.../Network/lwip/src/include/ipv6/lwip/ip.h | 96 -
.../Network/lwip/src/include/ipv6/lwip/ip_addr.h | 59 -
.../Devices/Network/lwip/src/include/lwip/api.h | 159 -
.../Network/lwip/src/include/lwip/api_msg.h | 94 -
.../Devices/Network/lwip/src/include/lwip/arch.h | 216 --
.../Devices/Network/lwip/src/include/lwip/debug.h | 87 -
.../Devices/Network/lwip/src/include/lwip/def.h | 47 -
.../Devices/Network/lwip/src/include/lwip/dhcp.h | 223 --
.../Devices/Network/lwip/src/include/lwip/err.h | 70 -
.../Devices/Network/lwip/src/include/lwip/mem.h | 69 -
.../Devices/Network/lwip/src/include/lwip/memp.h | 63 -
.../Devices/Network/lwip/src/include/lwip/netif.h | 165 -
.../Devices/Network/lwip/src/include/lwip/opt.h | 722 ----
.../Devices/Network/lwip/src/include/lwip/pbuf.h | 113 -
.../Devices/Network/lwip/src/include/lwip/raw.h | 74 -
.../Devices/Network/lwip/src/include/lwip/sio.h | 63 -
.../Devices/Network/lwip/src/include/lwip/snmp.h | 309 --
.../Network/lwip/src/include/lwip/snmp_asn1.h | 90 -
.../Network/lwip/src/include/lwip/snmp_msg.h | 292 --
.../Network/lwip/src/include/lwip/snmp_structs.h | 253 --
.../Network/lwip/src/include/lwip/sockets.h | 271 --
.../Devices/Network/lwip/src/include/lwip/stats.h | 158 -
.../Devices/Network/lwip/src/include/lwip/sys.h | 187 -
.../Devices/Network/lwip/src/include/lwip/tcp.h | 531 ---
.../Devices/Network/lwip/src/include/lwip/tcpip.h | 75 -
.../Devices/Network/lwip/src/include/lwip/udp.h | 106 -
.../Network/lwip/src/include/netif/etharp.h | 129 -
.../Network/lwip/src/include/netif/loopif.h | 39 -
.../Network/lwip/src/include/netif/slipif.h | 42 -
src/VBox/Devices/Network/lwip/src/netif/FILES | 27 -
src/VBox/Devices/Network/lwip/src/netif/etharp.c | 892 -----
.../Devices/Network/lwip/src/netif/ethernetif.c | 326 --
src/VBox/Devices/Network/lwip/src/netif/loopif.c | 119 -
src/VBox/Devices/Network/lwip/src/netif/ppp/auth.c | 927 -----
src/VBox/Devices/Network/lwip/src/netif/ppp/auth.h | 94 -
src/VBox/Devices/Network/lwip/src/netif/ppp/chap.c | 872 -----
src/VBox/Devices/Network/lwip/src/netif/ppp/chap.h | 167 -
.../Devices/Network/lwip/src/netif/ppp/chpms.c | 398 --
.../Devices/Network/lwip/src/netif/ppp/chpms.h | 64 -
src/VBox/Devices/Network/lwip/src/netif/ppp/fsm.c | 838 ----
src/VBox/Devices/Network/lwip/src/netif/ppp/fsm.h | 187 -
src/VBox/Devices/Network/lwip/src/netif/ppp/ipcp.c | 1377 -------
src/VBox/Devices/Network/lwip/src/netif/ppp/ipcp.h | 126 -
src/VBox/Devices/Network/lwip/src/netif/ppp/lcp.c | 1991 ----------
src/VBox/Devices/Network/lwip/src/netif/ppp/lcp.h | 169 -
.../Devices/Network/lwip/src/netif/ppp/magic.c | 79 -
.../Devices/Network/lwip/src/netif/ppp/magic.h | 64 -
src/VBox/Devices/Network/lwip/src/netif/ppp/md5.c | 306 --
src/VBox/Devices/Network/lwip/src/netif/ppp/md5.h | 55 -
src/VBox/Devices/Network/lwip/src/netif/ppp/pap.c | 608 ---
src/VBox/Devices/Network/lwip/src/netif/ppp/pap.h | 129 -
src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.c | 1631 --------
src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.h | 446 ---
.../Devices/Network/lwip/src/netif/ppp/pppdebug.h | 89 -
.../Devices/Network/lwip/src/netif/ppp/randm.c | 242 --
.../Devices/Network/lwip/src/netif/ppp/randm.h | 81 -
src/VBox/Devices/Network/lwip/src/netif/ppp/vj.c | 633 ---
src/VBox/Devices/Network/lwip/src/netif/ppp/vj.h | 155 -
.../Devices/Network/lwip/src/netif/ppp/vjbsdhdr.h | 76 -
src/VBox/Devices/Network/lwip/src/netif/slipif.c | 213 --
.../Network/lwip/vbox/include/arch/bpstruct.h | 1 -
.../Devices/Network/lwip/vbox/include/arch/cc.h | 48 -
.../Network/lwip/vbox/include/arch/epstruct.h | 1 -
.../Devices/Network/lwip/vbox/include/arch/perf.h | 7 -
.../Network/lwip/vbox/include/arch/sys_arch.h | 33 -
.../Devices/Network/lwip/vbox/include/lwipopts.h | 300 --
src/VBox/Devices/Network/lwip/vbox/sys_arch.c | 445 ---
.../Devices/Network/slirp/libalias/alias_dns.c | 1 -
src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm | 4 +-
.../Devices/PC/BIOS/VBoxBiosAlternative.md5sum | 2 +-
src/VBox/Devices/Storage/DevAHCI.cpp | 2 +-
src/VBox/Devices/Storage/DevFdc.cpp | 129 +-
src/VBox/Devices/Storage/DrvHostFloppy.cpp | 1 +
src/VBox/Devices/Storage/DrvVD.cpp | 18 +-
src/VBox/Devices/Storage/PIIX3ATABmDma.h | 1 +
src/VBox/Devices/Storage/UsbMsd.cpp | 2 +-
src/VBox/Devices/Storage/swab.h | 1 +
src/VBox/Devices/USB/DevOHCI.cpp | 6 +
src/VBox/Devices/USB/VUSBDevice.cpp | 3 +-
src/VBox/Devices/VMMDev/VMMDev.cpp | 17 +-
src/VBox/Disassembler/DisasmFormatYasm.cpp | 41 +-
.../VBoxDTrace/onnv/cmd/dtrace/demo/mkdemo.pl | 0
.../dtrace/test/tst/common/funcs/tst.index.d.out | 0
.../dtrace/test/tst/common/funcs/tst.substr.d.out | 0
.../dtrace/test/tst/common/ip/tst.ipv4localtcp.ksh | 0
.../dtrace/test/tst/common/ip/tst.ipv4localudp.ksh | 0
.../test/tst/common/ip/tst.ipv4remotetcp.ksh | 0
.../test/tst/common/ip/tst.ipv4remoteudp.ksh | 0
.../test/tst/common/ip/tst.localtcpstate.ksh | 0
.../test/tst/common/ip/tst.remotetcpstate.ksh | 0
.../scripting/err.D_MACRO_UNDEF.invalidargs.d | 0
.../tst/common/scripting/err.D_OP_LVAL.rdonly.d | 0
.../common/scripting/err.D_OP_WRITE.usepidmacro.d | 0
.../test/tst/common/scripting/err.D_SYNTAX.inval.d | 0
.../test/tst/common/scripting/err.D_SYNTAX.pid.d | 0
.../dtrace/test/tst/common/scripting/tst.arg0.d | 0
.../dtrace/test/tst/common/scripting/tst.assign.d | 0
.../dtrace/test/tst/common/scripting/tst.basic.d | 0
.../dtrace/test/tst/common/scripting/tst.egid.d | 0
.../dtrace/test/tst/common/scripting/tst.euid.d | 0
.../cmd/dtrace/test/tst/common/scripting/tst.gid.d | 0
.../dtrace/test/tst/common/scripting/tst.pgid.d | 0
.../cmd/dtrace/test/tst/common/scripting/tst.pid.d | 0
.../dtrace/test/tst/common/scripting/tst.ppid.d | 0
.../dtrace/test/tst/common/scripting/tst.projid.d | 0
.../dtrace/test/tst/common/scripting/tst.quite.d | 0
.../cmd/dtrace/test/tst/common/scripting/tst.sid.d | 0
.../dtrace/test/tst/common/scripting/tst.taskid.d | 0
.../dtrace/test/tst/common/scripting/tst.trace.d | 0
.../cmd/dtrace/test/tst/common/scripting/tst.uid.d | 0
.../err.D_ACT_SPEC.SpeculateWithBreakPoint.d | 0
.../err.D_ACT_SPEC.SpeculateWithChill.d | 0
.../err.D_ACT_SPEC.SpeculateWithCopyOut.d | 0
.../err.D_ACT_SPEC.SpeculateWithCopyOutStr.d | 0
.../err.D_ACT_SPEC.SpeculateWithPanic.d | 0
.../err.D_ACT_SPEC.SpeculateWithRaise.d | 0
.../speculation/err.D_ACT_SPEC.SpeculateWithStop.d | 0
.../dtrace/test/tst/common/usdt/tst.corruptenv.ksh | 0
.../onnv/lib/libdtrace/common/mkerrtags.sh | 0
src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp | 268 +-
src/VBox/Frontends/VBoxManage/VBoxManage.h | 26 +-
.../Frontends/VBoxManage/VBoxManageAppliance.cpp | 3 +
.../Frontends/VBoxManage/VBoxManageGuestCtrl.cpp | 3173 ++++++++-------
.../Frontends/VBoxManage/VBoxManageGuestCtrl.h | 8 +-
.../VBoxManage/VBoxManageGuestCtrlListener.cpp | 48 +-
src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp | 2 +-
src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp | 2 +-
.../Frontends/VBoxManage/VBoxManageModifyVM.cpp | 8 +-
src/VBox/Frontends/VBoxSDL/Framebuffer.cpp | 1 +
src/VBox/Frontends/VBoxSDL/Framebuffer.h | 1 +
src/VBox/Frontends/VBoxSDL/Helper.cpp | 1 +
src/VBox/Frontends/VBoxSDL/Helper.h | 1 +
src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp | 7 +
src/VBox/Frontends/VBoxSDL/VBoxSDL.h | 1 +
src/VBox/Frontends/VBoxSDL/VBoxSDLMain-darwin.h | 1 +
src/VBox/Frontends/VBoxSDL/VBoxSDLTest.cpp | 1 +
src/VBox/Frontends/VirtualBox/Makefile.kmk | 2 +
src/VBox/Frontends/VirtualBox/VirtualBox1.qrc | 1 +
.../Frontends/VirtualBox/VirtualBox1_hidpi.qrc | 10 +
src/VBox/Frontends/VirtualBox/VirtualBox2.qrc | 2 +-
.../Frontends/VirtualBox/VirtualBox2_hidpi.qrc | 30 +-
.../images/hidpi/progress_clone_90px_hidpi.png | Bin 0 -> 18751 bytes
.../images/hidpi/progress_delete_90px_hidpi.png | Bin 0 -> 23048 bytes
.../images/hidpi/progress_dnd_gh_90px_hidpi.png | Bin 0 -> 16387 bytes
.../images/hidpi/progress_dnd_hg_90px_hidpi.png | Bin 0 -> 15317 bytes
.../images/hidpi/progress_export_90px_hidpi.png | Bin 0 -> 23241 bytes
.../images/hidpi/progress_import_90px_hidpi.png | Bin 0 -> 24803 bytes
...progress_install_guest_additions_90px_hidpi.png | Bin 0 -> 21651 bytes
.../hidpi/progress_media_create_90px_hidpi.png | Bin 0 -> 16752 bytes
.../hidpi/progress_media_delete_90px_hidpi.png | Bin 0 -> 17215 bytes
.../progress_network_interface_90px_hidpi.png | Bin 0 -> 4301 bytes
.../images/hidpi/progress_poweroff_90px_hidpi.png | Bin 0 -> 18732 bytes
.../progress_reading_appliance_90px_hidpi.png | Bin 0 -> 24756 bytes
.../images/hidpi/progress_refresh_90px_hidpi.png | Bin 0 -> 27797 bytes
.../images/hidpi/progress_settings_90px_hidpi.png | Bin 0 -> 22889 bytes
.../hidpi/progress_snapshot_create_90px_hidpi.png | Bin 0 -> 20206 bytes
.../hidpi/progress_snapshot_discard_90px_hidpi.png | Bin 0 -> 8012 bytes
.../hidpi/progress_snapshot_restore_90px_hidpi.png | Bin 0 -> 8700 bytes
.../images/hidpi/progress_start_90px_hidpi.png | Bin 0 -> 21443 bytes
.../hidpi/progress_state_restore_90px_hidpi.png | Bin 0 -> 30626 bytes
.../hidpi/progress_state_save_90px_hidpi.png | Bin 0 -> 31955 bytes
.../VirtualBox/images/progress_settings_90px.png | Bin 0 -> 9371 bytes
src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts | 1782 ++++++---
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts | 780 +++-
.../Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts | 780 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts | 756 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts | 784 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts | 943 ++++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts | 10 +-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts | 748 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts | 857 +++--
.../Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts | 765 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts | 860 +++--
src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts | 787 +++-
.../Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts | 854 ++++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts | 777 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts | 783 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts | 1520 ++++++--
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts | 746 +++-
.../Frontends/VirtualBox/nls/VirtualBox_km_KH.ts | 831 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts | 746 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts | 781 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts | 750 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts | 835 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts | 830 +++-
.../Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts | 1526 +++++---
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts | 840 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts | 750 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts | 824 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts | 783 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts | 781 +++-
src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts | 1160 ++++--
src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts | 782 +++-
.../Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts | 850 +++--
.../Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts | 1559 +++++---
.../Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts | 1288 ++++---
src/VBox/Frontends/VirtualBox/nls/qt_bg.ts | 444 +--
src/VBox/Frontends/VirtualBox/nls/qt_it.ts | 76 +-
src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts | 32 +-
src/VBox/Frontends/VirtualBox/shaders/cconvAYUV.c | 1 +
.../Frontends/VirtualBox/shaders/cconvAYUV_void.c | 1 +
.../Frontends/VirtualBox/shaders/cconvApplyAYUV.c | 1 +
src/VBox/Frontends/VirtualBox/shaders/cconvBGR.c | 1 +
.../Frontends/VirtualBox/shaders/cconvBGR_void.c | 1 +
src/VBox/Frontends/VirtualBox/shaders/cconvUYVY.c | 1 +
.../Frontends/VirtualBox/shaders/cconvUYVY_void.c | 1 +
src/VBox/Frontends/VirtualBox/shaders/cconvYUY2.c | 1 +
.../Frontends/VirtualBox/shaders/cconvYUY2_void.c | 1 +
src/VBox/Frontends/VirtualBox/shaders/cconvYV12.c | 1 +
.../Frontends/VirtualBox/shaders/cconvYV12_void.c | 1 +
src/VBox/Frontends/VirtualBox/shaders/ckeyDst.c | 1 +
src/VBox/Frontends/VirtualBox/shaders/ckeyDst2.c | 1 +
.../Frontends/VirtualBox/shaders/ckeyDst_void.c | 1 +
.../Frontends/VirtualBox/shaders/mainOverlay.c | 1 +
.../VirtualBox/shaders/mainOverlayNoCKey.c | 1 +
.../VirtualBox/shaders/mainOverlayNoDiscard.c | 1 +
.../VirtualBox/shaders/mainOverlayNoDiscard2.c | 1 +
src/VBox/Frontends/VirtualBox/shaders/splitBGRA.c | 1 +
.../VirtualBox/src/UIMediumTypeChangeDialog.h | 1 +
src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.h | 1 +
src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.h | 1 +
src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h | 1 +
src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h | 1 +
.../Frontends/VirtualBox/src/VBoxFBOverlayCommon.h | 1 +
.../VirtualBox/src/VBoxGlobalSettings.cpp | 6 -
.../Frontends/VirtualBox/src/VBoxGlobalSettings.h | 9 +-
.../Frontends/VirtualBox/src/VBoxLicenseViewer.h | 1 +
.../VirtualBox/src/VBoxSnapshotDetailsDlg.h | 1 +
.../Frontends/VirtualBox/src/VBoxTakeSnapshotDlg.h | 1 +
.../VirtualBox/src/converter/UIConverter.h | 1 +
.../VirtualBox/src/converter/UIConverterBackend.h | 1 +
.../VirtualBox/src/extensions/QIAdvancedSlider.h | 1 +
.../VirtualBox/src/extensions/QIAdvancedToolBar.h | 1 +
.../VirtualBox/src/extensions/QIArrowButtonPress.h | 1 +
.../src/extensions/QIArrowButtonSwitch.h | 1 +
.../VirtualBox/src/extensions/QIArrowSplitter.h | 1 +
.../Frontends/VirtualBox/src/extensions/QIDialog.h | 1 +
.../VirtualBox/src/extensions/QIDialogButtonBox.h | 1 +
.../VirtualBox/src/extensions/QIFileDialog.h | 1 +
.../Frontends/VirtualBox/src/extensions/QILabel.h | 1 +
.../VirtualBox/src/extensions/QILabelSeparator.h | 1 +
.../VirtualBox/src/extensions/QILineEdit.h | 1 +
.../VirtualBox/src/extensions/QIListView.h | 1 +
.../VirtualBox/src/extensions/QIMainDialog.h | 1 +
.../Frontends/VirtualBox/src/extensions/QIMenu.h | 1 +
.../VirtualBox/src/extensions/QIMessageBox.h | 1 +
.../VirtualBox/src/extensions/QIProcess.h | 1 +
.../VirtualBox/src/extensions/QIRichTextLabel.h | 1 +
.../VirtualBox/src/extensions/QIRichToolButton.h | 1 +
.../VirtualBox/src/extensions/QISplitter.h | 1 +
.../VirtualBox/src/extensions/QIStatusBar.h | 1 +
.../src/extensions/QIStatusBarIndicator.h | 1 +
.../VirtualBox/src/extensions/QITabWidget.h | 1 +
.../VirtualBox/src/extensions/QITableView.h | 1 +
.../VirtualBox/src/extensions/QIToolButton.h | 1 +
.../VirtualBox/src/extensions/QITreeView.h | 1 +
.../VirtualBox/src/extensions/QITreeWidget.h | 1 +
.../VirtualBox/src/extensions/QIWidgetValidator.h | 1 +
.../src/extensions/graphics/QIGraphicsWidget.h | 1 +
.../VirtualBox/src/extradata/UIExtraDataDefs.cpp | 1 -
.../VirtualBox/src/extradata/UIExtraDataDefs.h | 3 +-
.../src/extradata/UIExtraDataManager.cpp | 21 +-
.../VirtualBox/src/extradata/UIExtraDataManager.h | 9 +-
.../Frontends/VirtualBox/src/globals/CIShared.h | 1 +
.../Frontends/VirtualBox/src/globals/COMDefs.h | 1 +
.../VirtualBox/src/globals/QIWithRetranslateUI.h | 1 +
.../VirtualBox/src/globals/UIActionPool.cpp | 97 +-
.../VirtualBox/src/globals/UIActionPool.h | 60 +-
.../VirtualBox/src/globals/UIAnimationFramework.h | 1 +
src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h | 1 +
.../Frontends/VirtualBox/src/globals/UIIconPool.h | 1 +
.../VirtualBox/src/globals/UIImageTools.h | 1 +
.../VirtualBox/src/globals/UIMainEventListener.cpp | 13 +-
.../VirtualBox/src/globals/UIMainEventListener.h | 3 +
.../VirtualBox/src/globals/UIMessageCenter.cpp | 63 +-
.../VirtualBox/src/globals/UIMessageCenter.h | 14 +-
.../VirtualBox/src/globals/UIModalWindowManager.h | 1 +
.../VirtualBox/src/globals/UIPopupCenter.h | 1 +
.../VirtualBox/src/globals/UIShortcutPool.h | 1 +
.../VirtualBox/src/globals/UIThreadPool.h | 1 +
.../VirtualBox/src/globals/VBoxGlobal.cpp | 32 +-
.../Frontends/VirtualBox/src/globals/VBoxGlobal.h | 16 +
.../Frontends/VirtualBox/src/globals/VBoxUtils.h | 1 +
.../Frontends/VirtualBox/src/globals/VBoxVersion.h | 1 +
src/VBox/Frontends/VirtualBox/src/main.cpp | 2 +
.../Frontends/VirtualBox/src/medium/UIMedium.cpp | 32 +-
.../Frontends/VirtualBox/src/medium/UIMedium.h | 10 +
.../Frontends/VirtualBox/src/medium/UIMediumDefs.h | 1 +
.../VirtualBox/src/medium/UIMediumEnumerator.cpp | 27 +-
.../VirtualBox/src/medium/UIMediumEnumerator.h | 1 +
.../VirtualBox/src/medium/UIMediumManager.cpp | 23 +-
.../VirtualBox/src/medium/UIMediumManager.h | 1 +
.../Frontends/VirtualBox/src/net/UIDownloader.h | 1 +
.../VirtualBox/src/net/UIDownloaderAdditions.h | 1 +
.../VirtualBox/src/net/UIDownloaderExtensionPack.h | 1 +
.../VirtualBox/src/net/UIDownloaderUserManual.h | 1 +
.../VirtualBox/src/net/UINetworkCustomer.h | 1 +
.../Frontends/VirtualBox/src/net/UINetworkDefs.h | 1 +
.../VirtualBox/src/net/UINetworkManager.h | 1 +
.../VirtualBox/src/net/UINetworkManagerDialog.h | 1 +
.../VirtualBox/src/net/UINetworkManagerIndicator.h | 1 +
.../Frontends/VirtualBox/src/net/UINetworkReply.h | 1 +
.../VirtualBox/src/net/UINetworkRequest.h | 1 +
.../VirtualBox/src/net/UINetworkRequestWidget.h | 1 +
.../Frontends/VirtualBox/src/net/UIUpdateDefs.h | 1 +
.../Frontends/VirtualBox/src/net/UIUpdateManager.h | 1 +
.../VirtualBox/src/objects/UIRichTextString.cpp | 233 ++
.../VirtualBox/src/objects/UIRichTextString.h | 114 +
.../VirtualBox/src/platform/UIDesktopServices.h | 1 +
.../src/platform/darwin/CocoaEventHelper.h | 1 +
.../src/platform/darwin/DarwinKeyboard.h | 1 +
.../src/platform/darwin/UICocoaApplication.h | 1 +
.../src/platform/darwin/UICocoaSpecialControls.h | 1 +
.../platform/darwin/UIDesktopServices_darwin_p.h | 1 +
.../src/platform/darwin/UIWindowMenuManager.h | 1 +
.../src/platform/darwin/VBoxCocoaHelper.h | 1 +
.../src/platform/darwin/VBoxUtils-darwin.h | 1 +
.../VirtualBox/src/platform/os2/VBoxHlp.h | 1 +
.../VirtualBox/src/platform/win/VBoxUtils-win.h | 1 +
.../VirtualBox/src/platform/x11/VBoxX11Helper.h | 1 +
.../VirtualBox/src/platform/x11/XKeyboard.h | 1 +
src/VBox/Frontends/VirtualBox/src/precomp.cpp | 1 +
.../VirtualBox/src/runtime/UIActionPoolRuntime.h | 1 +
.../runtime/UIAddDiskEncryptionPasswordDialog.h | 1 +
.../VirtualBox/src/runtime/UIConsoleEventHandler.h | 1 +
.../Frontends/VirtualBox/src/runtime/UIDnDDrag.cpp | 15 +-
.../VirtualBox/src/runtime/UIDnDHandler.cpp | 27 +-
.../VirtualBox/src/runtime/UIFrameBuffer.cpp | 7 +-
.../VirtualBox/src/runtime/UIFrameBuffer.h | 1 +
.../VirtualBox/src/runtime/UIIndicatorsPool.h | 1 +
.../VirtualBox/src/runtime/UIKeyboardHandler.cpp | 4 +-
.../VirtualBox/src/runtime/UIKeyboardHandler.h | 1 +
.../Frontends/VirtualBox/src/runtime/UIMachine.h | 1 +
.../VirtualBox/src/runtime/UIMachineDefs.h | 1 +
.../VirtualBox/src/runtime/UIMachineLogic.cpp | 30 +-
.../VirtualBox/src/runtime/UIMachineLogic.h | 16 +-
.../VirtualBox/src/runtime/UIMachineView.cpp | 36 +-
.../VirtualBox/src/runtime/UIMachineView.h | 4 +
.../VirtualBox/src/runtime/UIMachineWindow.cpp | 35 +-
.../VirtualBox/src/runtime/UIMachineWindow.h | 1 +
.../VirtualBox/src/runtime/UIMenuBarEditorWindow.h | 1 +
.../VirtualBox/src/runtime/UIMouseHandler.cpp | 3 +-
.../VirtualBox/src/runtime/UIMouseHandler.h | 1 +
.../VirtualBox/src/runtime/UIMultiScreenLayout.cpp | 18 -
.../VirtualBox/src/runtime/UIMultiScreenLayout.h | 2 +-
.../Frontends/VirtualBox/src/runtime/UISession.cpp | 88 +-
.../Frontends/VirtualBox/src/runtime/UISession.h | 23 +-
.../VirtualBox/src/runtime/UISlidingToolBar.h | 1 +
.../src/runtime/UIStatusBarEditorWindow.h | 1 +
.../VirtualBox/src/runtime/UIVMCloseDialog.h | 1 +
.../fullscreen/UIKeyboardHandlerFullscreen.h | 1 +
.../fullscreen/UIMachineLogicFullscreen.cpp | 66 +-
.../runtime/fullscreen/UIMachineLogicFullscreen.h | 13 +-
.../runtime/fullscreen/UIMachineViewFullscreen.h | 1 +
.../runtime/fullscreen/UIMachineWindowFullscreen.h | 1 +
.../src/runtime/normal/UIKeyboardHandlerNormal.h | 1 +
.../src/runtime/normal/UIMachineLogicNormal.cpp | 4 +
.../src/runtime/normal/UIMachineLogicNormal.h | 1 +
.../src/runtime/normal/UIMachineViewNormal.h | 1 +
.../src/runtime/normal/UIMachineWindowNormal.h | 1 +
.../src/runtime/scale/UIKeyboardHandlerScale.h | 1 +
.../src/runtime/scale/UIMachineLogicScale.h | 1 +
.../src/runtime/scale/UIMachineViewScale.h | 1 +
.../src/runtime/scale/UIMachineWindowScale.h | 1 +
.../runtime/seamless/UIKeyboardHandlerSeamless.h | 1 +
.../runtime/seamless/UIMachineLogicSeamless.cpp | 4 +
.../src/runtime/seamless/UIMachineLogicSeamless.h | 1 +
.../src/runtime/seamless/UIMachineViewSeamless.h | 1 +
.../src/runtime/seamless/UIMachineWindowSeamless.h | 1 +
.../src/selector/UIActionPoolSelector.cpp | 95 +-
.../VirtualBox/src/selector/UIActionPoolSelector.h | 11 +-
.../VirtualBox/src/selector/UISelectorWindow.cpp | 174 +-
.../VirtualBox/src/selector/UISelectorWindow.h | 6 +
.../VirtualBox/src/selector/UIVMDesktop.h | 1 +
.../Frontends/VirtualBox/src/selector/UIVMItem.cpp | 70 +-
.../Frontends/VirtualBox/src/selector/UIVMItem.h | 2 +
.../src/selector/UIVirtualBoxEventHandler.cpp | 6 +-
.../src/selector/UIVirtualBoxEventHandler.h | 3 +
.../VirtualBox/src/selector/VBoxSnapshotsWgt.h | 1 +
.../src/selector/graphics/chooser/UIGChooser.h | 1 +
.../graphics/chooser/UIGChooserHandlerKeyboard.h | 1 +
.../graphics/chooser/UIGChooserHandlerMouse.h | 1 +
.../src/selector/graphics/chooser/UIGChooserItem.h | 1 +
.../graphics/chooser/UIGChooserItemGroup.h | 1 +
.../graphics/chooser/UIGChooserItemMachine.cpp | 2 +-
.../graphics/chooser/UIGChooserItemMachine.h | 1 +
.../selector/graphics/chooser/UIGChooserModel.cpp | 8 +-
.../selector/graphics/chooser/UIGChooserModel.h | 1 +
.../src/selector/graphics/chooser/UIGChooserView.h | 1 +
.../src/selector/graphics/details/UIGDetails.h | 1 +
.../selector/graphics/details/UIGDetailsElement.h | 1 +
.../graphics/details/UIGDetailsElements.cpp | 99 +-
.../selector/graphics/details/UIGDetailsElements.h | 1 +
.../selector/graphics/details/UIGDetailsGroup.h | 1 +
.../src/selector/graphics/details/UIGDetailsItem.h | 1 +
.../selector/graphics/details/UIGDetailsModel.h | 1 +
.../selector/graphics/details/UIGDetailsSet.cpp | 1 +
.../src/selector/graphics/details/UIGDetailsSet.h | 1 +
.../src/selector/graphics/details/UIGDetailsView.h | 1 +
.../selector/graphics/details/UIGMachinePreview.h | 1 +
.../VirtualBox/src/settings/UISettingsDefs.h | 1 +
.../VirtualBox/src/settings/UISettingsDialog.cpp | 80 +-
.../VirtualBox/src/settings/UISettingsDialog.h | 14 +-
.../src/settings/UISettingsDialogSpecific.cpp | 24 +
.../src/settings/UISettingsDialogSpecific.h | 7 +
.../VirtualBox/src/settings/UISettingsPage.h | 15 +
.../src/settings/UISettingsSerializer.cpp | 192 +-
.../VirtualBox/src/settings/UISettingsSerializer.h | 63 +-
.../VirtualBox/src/settings/VBoxSettingsSelector.h | 1 +
.../src/settings/global/UIGlobalSettingsDisplay.h | 1 +
.../settings/global/UIGlobalSettingsExtension.h | 1 +
.../settings/global/UIGlobalSettingsGeneral.cpp | 19 +-
.../src/settings/global/UIGlobalSettingsGeneral.h | 4 +-
.../src/settings/global/UIGlobalSettingsGeneral.ui | 27 +-
.../src/settings/global/UIGlobalSettingsInput.h | 1 +
.../src/settings/global/UIGlobalSettingsLanguage.h | 1 +
.../src/settings/global/UIGlobalSettingsNetwork.h | 1 +
.../global/UIGlobalSettingsNetworkDetailsHost.h | 1 +
.../global/UIGlobalSettingsNetworkDetailsNAT.h | 1 +
.../global/UIGlobalSettingsPortForwardingDlg.h | 1 +
.../src/settings/global/UIGlobalSettingsProxy.h | 1 +
.../src/settings/global/UIGlobalSettingsUpdate.h | 1 +
.../src/settings/machine/UIMachineSettingsAudio.h | 1 +
.../settings/machine/UIMachineSettingsDisplay.cpp | 121 +-
.../settings/machine/UIMachineSettingsDisplay.h | 21 +-
.../settings/machine/UIMachineSettingsDisplay.ui | 98 +-
.../settings/machine/UIMachineSettingsGeneral.cpp | 56 +-
.../settings/machine/UIMachineSettingsGeneral.h | 1 +
.../machine/UIMachineSettingsInterface.cpp | 75 +-
.../settings/machine/UIMachineSettingsInterface.h | 34 +-
.../settings/machine/UIMachineSettingsInterface.ui | 103 +-
.../settings/machine/UIMachineSettingsNetwork.h | 1 +
.../settings/machine/UIMachineSettingsParallel.h | 1 +
.../machine/UIMachineSettingsPortForwardingDlg.h | 1 +
.../src/settings/machine/UIMachineSettingsSF.h | 1 +
.../settings/machine/UIMachineSettingsSFDetails.h | 1 +
.../settings/machine/UIMachineSettingsSerial.cpp | 4 +-
.../src/settings/machine/UIMachineSettingsSerial.h | 1 +
.../settings/machine/UIMachineSettingsSerial.ui | 11 +-
.../settings/machine/UIMachineSettingsStorage.cpp | 23 +
.../settings/machine/UIMachineSettingsStorage.h | 4 +
.../settings/machine/UIMachineSettingsStorage.ui | 22 +-
.../src/settings/machine/UIMachineSettingsSystem.h | 1 +
.../src/settings/machine/UIMachineSettingsUSB.cpp | 8 +-
.../src/settings/machine/UIMachineSettingsUSB.h | 1 +
.../machine/UIMachineSettingsUSBFilterDetails.h | 1 +
.../src/widgets/UIApplianceEditorWidget.h | 1 +
.../src/widgets/UIApplianceExportEditorWidget.h | 1 +
.../src/widgets/UIApplianceImportEditorWidget.h | 1 +
src/VBox/Frontends/VirtualBox/src/widgets/UIBar.h | 1 +
.../Frontends/VirtualBox/src/widgets/UIBootTable.h | 1 +
.../VirtualBox/src/widgets/UIFilmContainer.cpp | 0
.../VirtualBox/src/widgets/UIFilmContainer.h | 1 +
.../VirtualBox/src/widgets/UIHostComboEditor.h | 1 +
.../VirtualBox/src/widgets/UIHotKeyEditor.h | 1 +
.../VirtualBox/src/widgets/UILineTextEdit.h | 1 +
.../Frontends/VirtualBox/src/widgets/UIMenuBar.h | 1 +
.../VirtualBox/src/widgets/UIMiniToolBar.h | 1 +
.../VirtualBox/src/widgets/UINameAndSystemEditor.h | 1 +
.../Frontends/VirtualBox/src/widgets/UIPopupBox.h | 1 +
.../Frontends/VirtualBox/src/widgets/UIPopupPane.h | 1 +
.../VirtualBox/src/widgets/UIPopupPaneButtonPane.h | 1 +
.../VirtualBox/src/widgets/UIPopupPaneTextPane.h | 1 +
.../VirtualBox/src/widgets/UIPopupStack.h | 1 +
.../VirtualBox/src/widgets/UIPopupStackViewport.h | 1 +
.../VirtualBox/src/widgets/UIPortForwardingTable.h | 1 +
.../VirtualBox/src/widgets/UIProgressDialog.cpp | 111 +-
.../VirtualBox/src/widgets/UIProgressDialog.h | 59 +-
.../VirtualBox/src/widgets/UISpacerWidgets.h | 1 +
.../VirtualBox/src/widgets/UISpecialControls.h | 1 +
.../Frontends/VirtualBox/src/widgets/UIToolBar.h | 1 +
.../VirtualBox/src/widgets/UIWarningPane.h | 1 +
.../src/widgets/VBoxFilePathSelectorWidget.h | 1 +
.../VirtualBox/src/widgets/VBoxGuestRAMSlider.h | 1 +
.../VirtualBox/src/widgets/VBoxMediaComboBox.h | 1 +
.../src/widgets/VBoxOSTypeSelectorButton.h | 1 +
.../src/widgets/graphics/UIGraphicsButton.h | 1 +
.../src/widgets/graphics/UIGraphicsRotatorButton.h | 1 +
.../src/widgets/graphics/UIGraphicsTextPane.cpp | 61 +-
.../src/widgets/graphics/UIGraphicsTextPane.h | 4 +-
.../src/widgets/graphics/UIGraphicsToolBar.h | 1 +
.../src/widgets/graphics/UIGraphicsZoomButton.h | 1 +
.../Frontends/VirtualBox/src/wizards/UIWizard.h | 1 +
.../VirtualBox/src/wizards/UIWizardPage.h | 1 +
.../src/wizards/clonevd/UIWizardCloneVD.h | 1 +
.../wizards/clonevd/UIWizardCloneVDPageBasic1.h | 1 +
.../wizards/clonevd/UIWizardCloneVDPageBasic2.h | 1 +
.../wizards/clonevd/UIWizardCloneVDPageBasic3.h | 1 +
.../wizards/clonevd/UIWizardCloneVDPageBasic4.h | 1 +
.../wizards/clonevd/UIWizardCloneVDPageExpert.h | 1 +
.../src/wizards/clonevm/UIWizardCloneVM.h | 1 +
.../wizards/clonevm/UIWizardCloneVMPageBasic1.h | 1 +
.../wizards/clonevm/UIWizardCloneVMPageBasic2.h | 1 +
.../wizards/clonevm/UIWizardCloneVMPageBasic3.h | 1 +
.../wizards/clonevm/UIWizardCloneVMPageExpert.h | 1 +
.../wizards/exportappliance/UIWizardExportApp.cpp | 54 +
.../wizards/exportappliance/UIWizardExportApp.h | 1 +
.../exportappliance/UIWizardExportAppDefs.h | 1 +
.../exportappliance/UIWizardExportAppPageBasic1.h | 1 +
.../exportappliance/UIWizardExportAppPageBasic2.h | 1 +
.../exportappliance/UIWizardExportAppPageBasic3.h | 1 +
.../exportappliance/UIWizardExportAppPageBasic4.h | 1 +
.../UIWizardExportAppPageExpert.cpp | 4 +-
.../exportappliance/UIWizardExportAppPageExpert.h | 1 +
.../src/wizards/firstrun/UIWizardFirstRun.h | 1 +
.../wizards/firstrun/UIWizardFirstRunPageBasic.h | 1 +
.../wizards/importappliance/UIWizardImportApp.h | 1 +
.../importappliance/UIWizardImportAppDefs.h | 1 +
.../importappliance/UIWizardImportAppPageBasic1.h | 1 +
.../importappliance/UIWizardImportAppPageBasic2.h | 1 +
.../importappliance/UIWizardImportAppPageExpert.h | 1 +
.../VirtualBox/src/wizards/newvd/UIWizardNewVD.h | 1 +
.../src/wizards/newvd/UIWizardNewVDPageBasic1.h | 1 +
.../src/wizards/newvd/UIWizardNewVDPageBasic2.h | 1 +
.../src/wizards/newvd/UIWizardNewVDPageBasic3.h | 1 +
.../src/wizards/newvd/UIWizardNewVDPageExpert.h | 1 +
.../VirtualBox/src/wizards/newvm/UIWizardNewVM.h | 1 +
.../src/wizards/newvm/UIWizardNewVMPageBasic1.cpp | 8 +-
.../src/wizards/newvm/UIWizardNewVMPageBasic1.h | 1 +
.../src/wizards/newvm/UIWizardNewVMPageBasic2.h | 1 +
.../src/wizards/newvm/UIWizardNewVMPageBasic3.h | 1 +
.../src/wizards/newvm/UIWizardNewVMPageExpert.h | 1 +
src/VBox/GuestHost/DragAndDrop/DnDDir.cpp | 125 +-
src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp | 227 +-
src/VBox/GuestHost/DragAndDrop/DnDURIObject.cpp | 402 ++
src/VBox/GuestHost/DragAndDrop/Makefile.kmk | 7 +-
src/VBox/GuestHost/HGSMI/HGSMICommon.cpp | 570 +--
src/VBox/GuestHost/OpenGL/error/error.py | 0
src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.py | 0
src/VBox/GuestHost/OpenGL/include/chromium.h | 2 +-
src/VBox/GuestHost/OpenGL/packer/pack_current.py | 0
.../GuestHost/OpenGL/packer/pack_currentheader.py | 0
src/VBox/GuestHost/OpenGL/packer/pack_header.py | 0
src/VBox/GuestHost/OpenGL/packer/packer.py | 0
src/VBox/GuestHost/OpenGL/packer/packer_bbox.py | 0
src/VBox/GuestHost/OpenGL/spu_loader/dispatch.py | 0
.../GuestHost/OpenGL/spu_loader/dispatchheader.py | 0
src/VBox/GuestHost/OpenGL/spu_loader/glloader.py | 0
src/VBox/GuestHost/OpenGL/spu_loader/spuchange.py | 0
src/VBox/GuestHost/OpenGL/spu_loader/spucopy.py | 0
src/VBox/GuestHost/OpenGL/state_tracker/convert.py | 0
.../GuestHost/OpenGL/state_tracker/dump_gen.py | 0
.../OpenGL/state_tracker/state_current.py | 0
.../GuestHost/OpenGL/state_tracker/state_defs.py | 0
.../GuestHost/OpenGL/state_tracker/state_funcs.py | 0
.../GuestHost/OpenGL/state_tracker/state_get.py | 0
.../GuestHost/OpenGL/state_tracker/state_init.c | 32 +-
.../OpenGL/state_tracker/state_isenabled.py | 0
src/VBox/GuestHost/OpenGL/util/debug_opcodes.py | 0
src/VBox/GuestHost/OpenGL/util/error.c | 634 +--
src/VBox/GuestHost/OpenGL/util/hash.c | 5 +-
src/VBox/HostDrivers/Support/SUPDrvGip.cpp | 8 +-
src/VBox/HostDrivers/Support/SUPDrvIOC.h | 8 +-
src/VBox/HostDrivers/Support/SUPDrvSem.cpp | 2 +-
src/VBox/HostDrivers/Support/SUPLib.cpp | 4 +-
.../HostDrivers/Support/darwin/SUPDrv-darwin.cpp | 49 +
src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c | 2 +-
.../Support/win/SUPHardenedVerifyProcess-win.cpp | 1 +
src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk | 6 +-
.../HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h | 6 +-
.../VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp | 261 +-
.../VBoxNetFlt/linux/VBoxNetFlt-linux.c | 179 +
src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c | 3 +-
.../HostDrivers/VBoxUSB/win/mon/VBoxUSBMon.inf | 9 +-
.../HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp | 62 +-
src/VBox/HostServices/DragAndDrop/dndmanager.cpp | 652 +---
src/VBox/HostServices/DragAndDrop/dndmanager.h | 52 +-
src/VBox/HostServices/DragAndDrop/service.cpp | 506 ++-
src/VBox/HostServices/GuestControl/gctrl.cpp | 2 +-
.../SharedOpenGL/crserverlib/server_dispatch.py | 0
.../crserverlib/server_dispatch_header.py | 0
.../SharedOpenGL/crserverlib/server_get.py | 0
.../SharedOpenGL/crserverlib/server_retval.py | 0
.../SharedOpenGL/crserverlib/server_simpleget.py | 0
.../HostServices/SharedOpenGL/expando/expando.py | 0
.../HostServices/SharedOpenGL/unpacker/unpack.py | 0
.../SharedOpenGL/unpacker/unpack_extend.py | 0
.../SharedOpenGL/unpacker/unpack_header.py | 0
src/VBox/Installer/linux/vboxdrv-pardus.py | 0
src/VBox/Installer/win/UserInterface.wxi | 15 +-
src/VBox/Main/Makefile.kmk | 17 +-
src/VBox/Main/cbinding/VBoxCAPIGlue.c | 2 +-
src/VBox/Main/cbinding/tstCAPIGlue.c | 2 +-
src/VBox/Main/glue/initterm.cpp | 3 +-
src/VBox/Main/glue/vboxapi.py | 28 +-
src/VBox/Main/glue/xpcom/helpers.cpp | 1 +
src/VBox/Main/idl/VirtualBox.xidl | 1668 +++++---
src/VBox/Main/idl/apiwrap-server.xsl | 41 +-
src/VBox/Main/idl/comimpl.xsl | 18 +-
src/VBox/Main/include/AdditionsFacilityImpl.h | 1 +
src/VBox/Main/include/ApplianceImpl.h | 1 +
src/VBox/Main/include/ApplianceImplPrivate.h | 5 +
src/VBox/Main/include/AudioAdapterImpl.h | 4 +
src/VBox/Main/include/AudioSnifferInterface.h | 1 +
src/VBox/Main/include/AutoCaller.h | 1 +
src/VBox/Main/include/AutoStateDep.h | 1 +
src/VBox/Main/include/AutostartDb.h | 1 +
src/VBox/Main/include/BandwidthControlImpl.h | 1 +
src/VBox/Main/include/BandwidthGroupImpl.h | 1 +
src/VBox/Main/include/ConsoleImpl.h | 4 +
src/VBox/Main/include/DisplayUtils.h | 1 +
src/VBox/Main/include/EventImpl.h | 3 +
src/VBox/Main/include/GuestCtrlImplPrivate.h | 570 ++-
src/VBox/Main/include/GuestDnDPrivate.h | 443 ++-
src/VBox/Main/include/GuestDnDSourceImpl.h | 46 +-
src/VBox/Main/include/GuestDnDTargetImpl.h | 40 +-
src/VBox/Main/include/GuestFileImpl.h | 18 +-
src/VBox/Main/include/GuestImpl.h | 22 +-
src/VBox/Main/include/GuestOSTypeImpl.h | 1 +
src/VBox/Main/include/GuestProcessImpl.h | 22 +-
src/VBox/Main/include/GuestSessionImpl.h | 159 +-
src/VBox/Main/include/HGCM.h | 1 +
src/VBox/Main/include/HGCMObjects.h | 1 +
src/VBox/Main/include/HGCMThread.h | 1 +
src/VBox/Main/include/HostPower.h | 28 +
src/VBox/Main/include/MachineImpl.h | 10 +-
src/VBox/Main/include/MachineImplCloneVM.h | 1 +
src/VBox/Main/include/Matching.h | 1 +
src/VBox/Main/include/MediumAttachmentImpl.h | 1 +
src/VBox/Main/include/ObjectState.h | 1 +
src/VBox/Main/include/RemoteUSBBackend.h | 1 +
src/VBox/Main/include/SecretKeyStore.h | 1 +
src/VBox/Main/include/SessionImpl.h | 1 +
src/VBox/Main/include/SharedFolderImpl.h | 1 +
src/VBox/Main/include/VFSExplorerImpl.h | 2 +-
src/VBox/Main/include/VMMDev.h | 1 +
src/VBox/Main/include/VirtualBoxBase.h | 8 +-
src/VBox/Main/include/VirtualBoxErrorInfoImpl.h | 1 +
src/VBox/Main/include/netif.h | 1 +
src/VBox/Main/include/objectslist.h | 1 +
src/VBox/Main/include/vbox-libhal.h | 1 +
src/VBox/Main/include/vector.h | 1 +
src/VBox/Main/include/win/resource.h | 1 +
src/VBox/Main/src-all/DisplayResampleImage.cpp | 1 +
src/VBox/Main/src-all/EventImpl.cpp | 27 +
src/VBox/Main/src-all/Logging.cpp | 1 +
src/VBox/Main/src-all/SharedFolderImpl.cpp | 1 +
src/VBox/Main/src-all/VirtualBoxBase.cpp | 112 +-
src/VBox/Main/src-all/VirtualBoxErrorInfoImpl.cpp | 1 +
src/VBox/Main/src-client/AdditionsFacilityImpl.cpp | 1 +
src/VBox/Main/src-client/ClientTokenHolder.cpp | 1 +
src/VBox/Main/src-client/ConsoleImpl.cpp | 87 +-
src/VBox/Main/src-client/ConsoleImpl2.cpp | 253 +-
.../Main/src-client/DisplaySourceBitmapImpl.cpp | 6 +-
src/VBox/Main/src-client/DrvAudioVRDE.cpp | 28 +-
src/VBox/Main/src-client/GuestCtrlImpl.cpp | 224 +-
src/VBox/Main/src-client/GuestCtrlPrivate.cpp | 261 +-
src/VBox/Main/src-client/GuestDirectoryImpl.cpp | 21 +-
src/VBox/Main/src-client/GuestDnDPrivate.cpp | 766 ++--
src/VBox/Main/src-client/GuestDnDSourceImpl.cpp | 981 ++++-
src/VBox/Main/src-client/GuestDnDTargetImpl.cpp | 905 ++++-
src/VBox/Main/src-client/GuestFileImpl.cpp | 145 +-
src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp | 103 +-
src/VBox/Main/src-client/GuestImpl.cpp | 24 +-
src/VBox/Main/src-client/GuestProcessImpl.cpp | 221 +-
src/VBox/Main/src-client/GuestSessionImpl.cpp | 1238 +++---
src/VBox/Main/src-client/GuestSessionImplTasks.cpp | 31 +-
src/VBox/Main/src-client/HGCM.cpp | 1 +
src/VBox/Main/src-client/MachineDebuggerImpl.cpp | 14 +-
src/VBox/Main/src-client/RemoteUSBBackend.cpp | 1 +
src/VBox/Main/src-client/VBoxDriversRegister.cpp | 1 +
src/VBox/Main/src-client/xpcom/module.cpp | 1 +
.../Main/src-helper-apps/VBoxExtPackHelperApp.cpp | 2 +-
src/VBox/Main/src-server/ApplianceImpl.cpp | 14 +
src/VBox/Main/src-server/ApplianceImplExport.cpp | 18 +-
src/VBox/Main/src-server/AudioAdapterImpl.cpp | 25 +
src/VBox/Main/src-server/BIOSSettingsImpl.cpp | 1 +
src/VBox/Main/src-server/BandwidthControlImpl.cpp | 1 +
src/VBox/Main/src-server/BandwidthGroupImpl.cpp | 1 +
src/VBox/Main/src-server/ClientToken.cpp | 1 +
src/VBox/Main/src-server/ClientWatcher.cpp | 1 +
src/VBox/Main/src-server/GuestOSTypeImpl.cpp | 1 +
src/VBox/Main/src-server/HostDnsService.cpp | 54 +-
src/VBox/Main/src-server/HostDnsService.h | 3 +-
src/VBox/Main/src-server/HostImpl.cpp | 40 +-
src/VBox/Main/src-server/HostPower.cpp | 1 +
.../Main/src-server/HostVideoInputDeviceImpl.cpp | 8 +-
src/VBox/Main/src-server/MachineImpl.cpp | 103 +-
src/VBox/Main/src-server/Matching.cpp | 1 +
src/VBox/Main/src-server/MediumAttachmentImpl.cpp | 1 +
src/VBox/Main/src-server/MediumImpl.cpp | 30 +-
src/VBox/Main/src-server/MediumLock.cpp | 1 +
src/VBox/Main/src-server/PerformanceImpl.cpp | 8 +-
src/VBox/Main/src-server/SerialPortImpl.cpp | 1 +
src/VBox/Main/src-server/SnapshotImpl.cpp | 73 +-
src/VBox/Main/src-server/VFSExplorerImpl.cpp | 32 +-
.../Main/src-server/darwin/HostPowerDarwin.cpp | 1 +
src/VBox/Main/src-server/linux/HostPowerLinux.cpp | 144 +
src/VBox/Main/src-server/linux/vbox-libhal.cpp | 1 +
src/VBox/Main/src-server/win/HostPowerWin.cpp | 1 +
src/VBox/Main/src-server/win/VBoxComEvents.cpp | 1 +
src/VBox/Main/src-server/win/VBoxComEvents.h | 1 +
src/VBox/Main/src-server/win/svchlp.cpp | 1 +
src/VBox/Main/src-server/win/svchlp.h | 1 +
src/VBox/Main/src-server/win/svcmain.cpp | 1 +
src/VBox/Main/src-server/xpcom/server.cpp | 34 +-
src/VBox/Main/src-server/xpcom/server.h | 1 +
src/VBox/Main/src-server/xpcom/server_module.cpp | 1 +
src/VBox/Main/testcase/tstAPI.cpp | 1 +
src/VBox/Main/testcase/tstVBoxAPIXPCOM.cpp | 1 +
src/VBox/Main/xml/Settings.cpp | 125 +-
.../NetworkServices/DHCP/NetworkManagerDhcp.cpp | 3 +-
src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp | 14 +-
src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp | 138 +-
src/VBox/NetworkServices/NetLib/VBoxNetARP.cpp | 2 +-
.../NetworkServices/NetLib/VBoxNetBaseService.cpp | 34 +-
.../NetworkServices/NetLib/VBoxNetBaseService.h | 8 +-
.../NetLib/VBoxNetPortForwardString.cpp | 17 +-
src/VBox/RDP/client-1.8.3/vrdp/rdpusb.c | 1 +
src/VBox/Runtime/Makefile.kmk | 12 +
src/VBox/Runtime/VBox/dbus.cpp | 1 +
src/VBox/Runtime/common/asm/ASMGetXcr0.asm | 2 +
src/VBox/Runtime/common/asm/ASMSetXcr0.asm | 2 +
.../common/asm/{ASMSetXcr0.asm => ASMXRstor.asm} | 35 +-
.../common/asm/{ASMSetXcr0.asm => ASMXSave.asm} | 35 +-
.../Runtime/common/checksum/RTSha256Digest.cpp | 1 +
src/VBox/Runtime/common/dbg/dbgcfg.cpp | 4 +-
src/VBox/Runtime/common/ldr/ldrPE.cpp | 3 +-
src/VBox/Runtime/common/log/tracebuf.cpp | 26 +
src/VBox/Runtime/common/log/tracedefault.cpp | 26 +
src/VBox/Runtime/common/misc/getoptargv.cpp | 173 +-
src/VBox/Runtime/common/misc/lockvalidator.cpp | 6 +
src/VBox/Runtime/common/zip/tarvfs.cpp | 7 +-
src/VBox/Runtime/generic/env-generic.cpp | 390 +-
src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c | 2 +-
src/VBox/Runtime/r0drv/memobj-r0drv.cpp | 2 +-
.../r0drv/solaris/modulestub-r0drv-solaris.c | 26 +-
src/VBox/Runtime/r3/posix/env-posix.cpp | 7 +-
.../Runtime/r3/posix/process-creation-posix.cpp | 2 +-
src/VBox/Runtime/r3/posix/process-posix.cpp | 1 +
src/VBox/Runtime/r3/win/env-win.cpp | 14 +-
src/VBox/Runtime/r3/win/fileio-win.cpp | 7 +-
src/VBox/Runtime/r3/win/internal-r3-win.h | 26 +
src/VBox/Runtime/r3/win/localipc-win.cpp | 7 +-
src/VBox/Runtime/r3/win/process-win.cpp | 8 +-
src/VBox/Runtime/testcase/tstDarwinSched.cpp | 26 +
src/VBox/Runtime/testcase/tstLdr-3.cpp | 5 +
src/VBox/Runtime/testcase/tstRTGetOptArgv.cpp | 502 ++-
src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.S | 126 +
.../Runtime/testcase/tstRTLdrMachORelocs-1.disas | 206 +
src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.o | Bin 0 -> 1480 bytes
src/VBox/Runtime/testcase/tstRTTcp-1.cpp | 27 +
src/VBox/Storage/VD.cpp | 5 +-
src/VBox/VMM/VMMAll/CPUMAllRegs.cpp | 71 +-
src/VBox/VMM/VMMAll/GIMAllKvm.cpp | 11 +-
src/VBox/VMM/VMMAll/IEMAll.cpp | 71 +-
src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h | 75 +
src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h | 18 +-
src/VBox/VMM/VMMAll/MMAll.cpp | 1 +
src/VBox/VMM/VMMAll/MMAllHyper.cpp | 30 +
src/VBox/VMM/VMMAll/PGMAllBth.h | 24 +-
src/VBox/VMM/VMMAll/PGMAllHandler.cpp | 271 +-
src/VBox/VMM/VMMAll/PGMAllPhys.cpp | 17 +-
src/VBox/VMM/VMMAll/PGMAllPool.cpp | 17 +-
src/VBox/VMM/VMMAll/REMAll.cpp | 18 +-
src/VBox/VMM/VMMR0/HMR0A.asm | 25 +-
src/VBox/VMM/VMMR0/HMR0Mixed.mac | 320 +-
src/VBox/VMM/VMMR0/HMSVMR0.cpp | 74 +-
src/VBox/VMM/VMMR0/HMVMXR0.cpp | 152 +-
src/VBox/VMM/VMMR0/PGMR0.cpp | 9 +-
src/VBox/VMM/VMMR0/VMMR0.cpp | 15 +-
src/VBox/VMM/VMMR3/CPUM.cpp | 712 ++--
src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp | 146 +-
src/VBox/VMM/VMMR3/GIM.cpp | 41 +-
src/VBox/VMM/VMMR3/GIMHv.cpp | 2 +-
src/VBox/VMM/VMMR3/GIMKvm.cpp | 94 +-
src/VBox/VMM/VMMR3/IOM.cpp | 103 +-
src/VBox/VMM/VMMR3/MM.cpp | 12 +
src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp | 4 +-
src/VBox/VMM/VMMR3/PDMBlkCache.cpp | 2 +-
src/VBox/VMM/VMMR3/PDMLdr.cpp | 69 +-
src/VBox/VMM/VMMR3/PDMNetShaper.cpp | 2 +-
src/VBox/VMM/VMMR3/PGM.cpp | 91 +-
src/VBox/VMM/VMMR3/PGMHandler.cpp | 143 +-
src/VBox/VMM/VMMR3/PGMPhys.cpp | 41 +-
src/VBox/VMM/VMMR3/PGMPool.cpp | 25 +-
src/VBox/VMM/VMMR3/SSM.cpp | 366 +-
src/VBox/VMM/VMMR3/TM.cpp | 11 +-
src/VBox/VMM/VMMR3/VMM.cpp | 5 +
src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac | 108 +-
src/VBox/VMM/include/CPUMInternal.h | 7 +-
src/VBox/VMM/include/GIMInternal.h | 8 +-
src/VBox/VMM/include/GIMKvmInternal.h | 2 +-
src/VBox/VMM/include/HMInternal.h | 8 +-
src/VBox/VMM/include/HMInternal.mac | 25 +
src/VBox/VMM/include/IOMInternal.h | 10 +-
src/VBox/VMM/include/PGMInline.h | 23 -
src/VBox/VMM/include/PGMInternal.h | 104 +-
src/VBox/VMM/include/REMInternal.h | 6 +-
src/VBox/VMM/testcase/Makefile.kmk | 1 +
src/VBox/VMM/testcase/tstIEMCheckMc.cpp | 1 +
src/VBox/VMM/testcase/tstVMStruct.h | 23 +-
src/VBox/ValidationKit/common/__init__.py | 0
.../ValidationKit/common/constants/__init__.py | 0
src/VBox/ValidationKit/common/constants/result.py | 0
.../ValidationKit/common/constants/rtexitcode.py | 0
src/VBox/ValidationKit/common/constants/tbreq.py | 0
src/VBox/ValidationKit/common/constants/tbresp.py | 0
.../ValidationKit/common/constants/valueunit.py | 0
src/VBox/ValidationKit/common/utils.py | 0
src/VBox/ValidationKit/common/webutils.py | 0
src/VBox/ValidationKit/testanalysis/__init__.py | 0
src/VBox/ValidationKit/testanalysis/diff.py | 0
src/VBox/ValidationKit/testboxscript/setup.sh | 0
.../ValidationKit/testboxscript/testboxcommand.py | 0
.../ValidationKit/testboxscript/testboxcommons.py | 0
.../testboxscript/testboxconnection.py | 0
.../ValidationKit/testboxscript/testboxtasks.py | 0
.../ValidationKit/testboxscript/testboxupgrade.py | 0
.../ValidationKit/testboxscript/win/readme.txt | 2 +
src/VBox/ValidationKit/testdriver/__init__.py | 0
src/VBox/ValidationKit/testdriver/base.py | 0
src/VBox/ValidationKit/testdriver/reporter.py | 0
src/VBox/ValidationKit/testdriver/tst-txsclient.py | 0
src/VBox/ValidationKit/testdriver/txsclient.py | 0
src/VBox/ValidationKit/testdriver/vbox.py | 0
src/VBox/ValidationKit/testdriver/vboxtestvms.py | 0
src/VBox/ValidationKit/testdriver/vboxwrappers.py | 0
src/VBox/ValidationKit/testdriver/winbase.py | 0
src/VBox/ValidationKit/testmanager/__init__.py | 0
src/VBox/ValidationKit/testmanager/config.py | 0
.../ValidationKit/testmanager/core/__init__.py | 0
src/VBox/ValidationKit/testmanager/core/base.py | 0
src/VBox/ValidationKit/testmanager/core/build.py | 0
.../testmanager/core/buildblacklist.py | 0
.../ValidationKit/testmanager/core/buildsource.py | 0
.../ValidationKit/testmanager/core/coreconsts.py | 0
src/VBox/ValidationKit/testmanager/core/db.py | 0
.../ValidationKit/testmanager/core/dbobjcache.py | 0
.../testmanager/core/failurecategory.py | 0
.../testmanager/core/failurereason.py | 0
.../testmanager/core/globalresource.py | 0
src/VBox/ValidationKit/testmanager/core/report.py | 0
.../ValidationKit/testmanager/core/schedgroup.py | 0
.../testmanager/core/schedulerbase.py | 0
.../testmanager/core/schedulerbeci.py | 0
.../ValidationKit/testmanager/core/systemlog.py | 0
src/VBox/ValidationKit/testmanager/core/testbox.py | 0
.../testmanager/core/testboxcontroller.py | 0
.../testmanager/core/testboxstatus.py | 0
.../ValidationKit/testmanager/core/testcase.py | 0
.../ValidationKit/testmanager/core/testcaseargs.py | 0
.../ValidationKit/testmanager/core/testgroup.py | 0
.../ValidationKit/testmanager/core/testresults.py | 0
src/VBox/ValidationKit/testmanager/core/testset.py | 0
.../ValidationKit/testmanager/core/useraccount.py | 0
.../ValidationKit/testmanager/core/vcsrevisions.py | 0
.../testmanager/core/webservergluebase.py | 0
.../testmanager/core/webservergluecgi.py | 0
.../ValidationKit/testmanager/debug/__init__.py | 0
.../ValidationKit/testmanager/webui/__init__.py | 0
.../ValidationKit/testmanager/webui/wuiadmin.py | 0
.../testmanager/webui/wuiadminbuild.py | 0
.../testmanager/webui/wuiadminbuildblacklist.py | 0
.../testmanager/webui/wuiadminbuildcategory.py | 0
.../testmanager/webui/wuiadminbuildsource.py | 0
.../testmanager/webui/wuiadminfailurereason.py | 0
.../testmanager/webui/wuiadminglobalrsrc.py | 0
.../testmanager/webui/wuiadminschedgroup.py | 0
.../testmanager/webui/wuiadminsystemlog.py | 0
.../testmanager/webui/wuiadmintestbox.py | 0
.../testmanager/webui/wuiadmintestcase.py | 0
.../testmanager/webui/wuiadmintestgroup.py | 0
.../testmanager/webui/wuiadminuseraccount.py | 0
.../ValidationKit/testmanager/webui/wuibase.py | 0
.../testmanager/webui/wuicontentbase.py | 0
.../testmanager/webui/wuifailurecategory.py | 0
.../ValidationKit/testmanager/webui/wuigraphwiz.py | 0
.../ValidationKit/testmanager/webui/wuihlpform.py | 0
.../testmanager/webui/wuihlpgraphgooglechart.py | 0
.../testmanager/webui/wuihlpgraphmatplotlib.py | 0
.../testmanager/webui/wuihlpgraphsimple.py | 0
.../testmanager/webui/wuilogviewer.py | 0
.../ValidationKit/testmanager/webui/wuimain.py | 0
.../ValidationKit/testmanager/webui/wuireport.py | 0
.../testmanager/webui/wuitestresult.py | 0
.../testmanager/webui/wuivcshistory.py | 0
.../tests/additions/tdAddGuestCtrl.py | 302 +-
src/bldprogs/scm.cpp | 4 +-
src/libs/Makefile.kmk | 4 +-
src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c | 90 +-
src/libs/xpcom18a4/nsprpub/Makefile.in | 0
src/libs/xpcom18a4/nsprpub/config/config.mk | 0
src/libs/xpcom18a4/nsprpub/config/rules.mk | 0
src/libs/xpcom18a4/python/client/__init__.py | 0
src/libs/xpcom18a4/python/file.py | 0
src/libs/xpcom18a4/python/primitives.py | 0
src/libs/xpcom18a4/python/server/__init__.py | 0
src/libs/xpcom18a4/python/server/enumerator.py | 0
src/libs/xpcom18a4/python/server/factory.py | 0
src/libs/xpcom18a4/python/server/loader.py | 0
src/libs/xpcom18a4/python/server/module.py | 0
src/libs/xpcom18a4/python/server/policy.py | 0
.../xpcom18a4/python/test/pyxpcom_test_tools.py | 0
.../xpcom18a4/python/test/test_com_exceptions.py | 0
src/libs/xpcom18a4/python/test/test_comfile.py | 0
.../test/test_component/py_test_component.py | 0
src/libs/xpcom18a4/python/test/test_components.py | 0
.../python/test/test_isupports_primitives.py | 0
src/libs/xpcom18a4/python/test/test_misc.py | 0
src/libs/xpcom18a4/python/test/test_streams.py | 0
.../xpcom18a4/python/test/test_test_component.py | 0
.../xpcom18a4/python/test/test_weakreferences.py | 0
src/libs/xpcom18a4/python/tools/regxpcom.py | 0
src/libs/xpcom18a4/python/xpt.py | 0
src/recompiler/Makefile.kmk | 2 +-
src/recompiler/VBoxREMWrapper.cpp | 24 +-
src/recompiler/VBoxRecompiler.c | 64 +-
1319 files changed, 46965 insertions(+), 62665 deletions(-)
diff --git a/Config.kmk b/Config.kmk
index bf6fba6..80297bb 100644
--- a/Config.kmk
+++ b/Config.kmk
@@ -220,17 +220,17 @@ VBOX_BUILD_PUBLISHER =
# Note! The BETA[n],ALPHA[n],RC[n] indicators should be inserted before the
# publisher so that RTStrVersionCompare have a chance of comparing
# prerelease from different publishers correctly.
-VBOX_VERSION_STRING = $(VBOX_VERSION_STRING_RAW)_BETA2$(VBOX_BUILD_PUBLISHER)
+VBOX_VERSION_STRING = $(VBOX_VERSION_STRING_RAW)_BETA3$(VBOX_BUILD_PUBLISHER)
# Force the additions.sh script to get an exact additions build when we're doing the release.
ifeq ($(int-mod $(VBOX_VERSION_BUILD),2),0)
VBOX_RELEASE_EXACT_MATCH=1
endif
ifneq ($(VBOX_RELEASE_EXACT_MATCH),)
-# export VBOX_ADDITIONS_SH_MODE = release
-# export VBOX_DOCUMENTATION_SH_MODE = release
-# export VBOX_EFI_SH_MODE = release
-# export VBOX_EXTPACKS_SH_MODE = release
+ export VBOX_ADDITIONS_SH_MODE = release
+ export VBOX_DOCUMENTATION_SH_MODE = release
+ export VBOX_EFI_SH_MODE = release
+ export VBOX_EXTPACKS_SH_MODE = release
endif
# Some info on the vendor
@@ -402,8 +402,6 @@ VBOX_WITH_EHCI = 1
VBOX_WITH_ISCSI = 1
# Enable INIP support in the ISCSI feature.
VBOX_WITH_INIP = 1
-# Enable new (pre-1.5.0 release) version of LWIP.
-VBOX_WITH_NEW_LWIP = 1
# Enables lwip as a core of NAT service
VBOX_WITH_LWIP_NAT = 1
# Enables compilation of NAT service
@@ -636,8 +634,6 @@ VBOX_WITH_MEMBALLOON = 1
if1of ($(KBUILD_TARGET), darwin freebsd linux solaris win)
VBOX_WITH_CROGL = 1
endif
-# enable new wined3d code
-VBOX_WITH_NEW_WINE = 1
# Enable S3 support (requires libcurl)
VBOX_WITH_S3 = 1
# Enable Host=>Guest Drag'n'Drop
@@ -3095,12 +3091,12 @@ SDK_VBoxOpenSslExtPack_LIBS = \
ifdef VBOX_WITH_S3
VBOX_WITH_LIBCURL = 1
SDK_VBOX_LIBCURL = .
-SDK_VBOX_LIBCURL_INCS ?= $(PATH_ROOT)/src/libs/curl-7.27.0/include
+SDK_VBOX_LIBCURL_INCS ?= $(PATH_ROOT)/src/libs/curl-7.42.1/include
SDK_VBOX_LIBCURL_LIBS ?= $(PATH_STAGE_LIB)/VBox-libcurl$(VBOX_SUFF_LIB)
SDK_VBOX_LIBCURL_DEFS ?= BUILDING_LIBCURL
SDK_VBOX_LIBCURL-x86 = .
-SDK_VBOX_LIBCURL-x86_INCS ?= $(PATH_ROOT)/src/libs/curl-7.27.0/include
+SDK_VBOX_LIBCURL-x86_INCS ?= $(PATH_ROOT)/src/libs/curl-7.42.1/include
SDK_VBOX_LIBCURL-x86_LIBS.x86 ?= $(PATH_STAGE_LIB)/VBox-libcurl-x86$(VBOX_SUFF_LIB)
SDK_VBOX_LIBCURL-x86_DEFS ?= BUILDING_LIBCURL
endif
@@ -5955,7 +5951,7 @@ endif
SVN ?= svn$(HOSTSUFF_EXE)
VBOX_SVN_REV_KMK = $(PATH_OUT)/revision.kmk
ifndef VBOX_SVN_REV
- VBOX_SVN_REV_FALLBACK := $(patsubst %:,, $Rev: 99573 $ )
+ VBOX_SVN_REV_FALLBACK := $(patsubst %:,, $Rev: 100143 $ )
VBOX_SVN_DEP := $(firstword $(wildcard $(PATH_ROOT)/.svn/wc.db $(abspath $(PATH_ROOT)/../.svn/wc.db) $(abspath $(PATH_ROOT)/../../.svn/wc.db) $(PATH_ROOT)/.svn/entries))
ifeq ($(which $(SVN)),)
VBOX_SVN_DEP :=
@@ -6107,4 +6103,3 @@ st stat status:
quick:
$(MAKE) VBOX_QUICK=1
-
diff --git a/Makefile.kmk b/Makefile.kmk
index df124f3..d86269e 100644
--- a/Makefile.kmk
+++ b/Makefile.kmk
@@ -570,17 +570,17 @@ VBOX_CORE_DOXYFILE_INPUT_DIRS = \
src/VBox/Additions/WINNT/Graphics/Video/mp/common \
src/VBox/Additions/WINNT/Graphics/Video/mp/wddm \
src/VBox/Additions/WINNT/Graphics/Video/mp/xpdm \
- src/VBox/Additions/WINNT/Graphics/Wine \
- src/VBox/Additions/WINNT/Graphics/Wine/d3d8 \
- src/VBox/Additions/WINNT/Graphics/Wine/d3d9 \
- src/VBox/Additions/WINNT/Graphics/Wine/libWine \
- src/VBox/Additions/WINNT/Graphics/Wine/switcher \
- src/VBox/Additions/WINNT/Graphics/Wine/vbox \
- src/VBox/Additions/WINNT/Graphics/Wine/vbox/libWineStub \
- src/VBox/Additions/WINNT/Graphics/Wine/vbox/libWineStub/include \
- src/VBox/Additions/WINNT/Graphics/Wine/vbox/libWineStub/include/backup \
- src/VBox/Additions/WINNT/Graphics/Wine/vbox/libWineStub/include/wine \
- src/VBox/Additions/WINNT/Graphics/Wine/wined3d \
+ src/VBox/Additions/WINNT/Graphics/Wine_new \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/d3d8 \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/d3d9 \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/libWine \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/switcher \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/vbox \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/libWineStub \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/libWineStub/include \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/libWineStub/include/backup \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/vbox/libWineStub/include/wine \
+ src/VBox/Additions/WINNT/Graphics/Wine_new/wined3d \
src/VBox/Additions/WINNT/Installer \
src/VBox/Additions/WINNT/Installer/ISO \
src/VBox/Additions/WINNT/Installer/InstallHelper \
diff --git a/configure b/configure
index e8415ac..a77f450 100755
--- a/configure
+++ b/configure
@@ -71,6 +71,7 @@ ODIR_OVERRIDE=0
OUT_PATH=""
OUT_PATH_OVERRIDE=0
SETUP_WINE=
+ONLY_ADDITIONS=0
TARGET_MACHINE=""
TARGET_CPU=""
WITH_XPCOM=1
@@ -421,8 +422,9 @@ check_gcc()
-o \( $cc_maj -eq 3 -a $cc_min -lt 2 \) \
-o \( $cc_maj -eq 4 -a $cc_min -lt 1 -a "$OS" != "darwin" \) \
-o \( $cc_maj -eq 4 -a $cc_min -gt 9 \) \
- -o $cc_maj -gt 4 ]; then
- log_failure "gcc version $cc_ver found, expected gcc 3.x with x>1 or gcc 4.x with 0<x<10"
+ -o \( $cc_maj -eq 5 -a $cc_min -gt 1 \) \
+ -o $cc_maj -gt 5 ]; then
+ log_failure "gcc version $cc_maj.$cc_min found, expected gcc 3.x with x>1 or gcc 4.x with 0<x<10 or gcc 5.1"
fail really
else
log_success "found version $cc_ver"
@@ -2296,6 +2298,7 @@ EOF
EOF
[ "$OS" != "darwin" ] && echo " --setup-wine setup a Wine directory and register the hhc hack"
cat << EOF
+ --only-additions only build the Guest Additions
Paths:
--with-gcc=PATH location of the gcc compiler [$CC]
@@ -2563,6 +2566,9 @@ for option in "$@"; do
--setup-wine)
[ "$OS" != "darwin" ] && SETUP_WINE=1
;;
+ --only-additions)
+ ONLY_ADDITIONS=1
+ ;;
*)
echo
echo "Unrecognized option \"$option\""
@@ -2656,7 +2662,9 @@ if [ $OSE -ge 1 ]; then
fi
# extpack
-if [ $OSE -eq 0 ]; then
+if [ $ONLY_ADDITIONS -eq 1 ]; then
+ cnf_append "VBOX_WITH_EXTPACK_PUEL_BUILD" ""
+elif [ $OSE -eq 0 ]; then
if [ $WITH_EXTPACK -eq 1 ]; then
BUILD_LIBSSL=1
else
@@ -2692,43 +2700,47 @@ if [ "$OS" = "darwin" ]; then
fi
# the tools
check_gcc
-check_open_watcom
-[ "$OS" != "darwin" ] && check_iasl
-# don't check for yasm for the time beeing as 0.40 and 0.50 both have known bugs
-# [ "$OS" != "darwin" ] && check_yasm
-[ "$OS" != "darwin" ] && check_xsltproc
-[ "$OS" != "darwin" ] && check_mkisofs
+if [ $ONLY_ADDITIONS -eq 0 ]; then
+ check_open_watcom
+ [ "$OS" != "darwin" ] && check_iasl
+ # don't check for yasm for the time beeing as 0.40 and 0.50 both have known bugs
+ # [ "$OS" != "darwin" ] && check_yasm
+ [ "$OS" != "darwin" ] && check_xsltproc
+ [ "$OS" != "darwin" ] && check_mkisofs
+fi
# the libraries
-[ "$OS" != "darwin" ] && check_pthread
-check_libxml2
-[ $WITH_LIBIDL -eq 1 ] && check_libidl
-check_ssl
-check_curl
-[ $WITH_LIBVPX -eq 1 ] && check_vpx
-[ "$OS" != "darwin" ] && check_z
-[ "$OS" != "darwin" ] && check_png
-[ $OSE -eq 0 -a "$OS" = "linux" ] && check_pam
-[ $WITH_SDL -eq 1 ] && check_sdl
-[ $WITH_SDL_TTF -eq 1 -a $OSE -eq 0 ] && check_sdl_ttf
-[ $WITH_X11 -eq 1 ] && check_x
-# TODO check for xcomposite-dev (X11/extensions/Xcomposite.h, additions only)
-# TODO check for libxdamange-dev (X11/extensions/Xdamage.h, additions only)
-[ $WITH_X11 -eq 1 ] && check_xcursor
-[ $WITH_X11 -eq 1 ] && check_xinerama
-[ $WITH_X11 -eq 1 ] && check_xrandr
-[ $WITH_OPENGL -eq 1 ] && check_opengl
-[ $WITH_QT4 -eq 1 ] && check_qt4
-[ $WITH_PYTHON -eq 1 ] && check_python
-[ $WITH_JAVA -eq 1 ] && check_java
-
-# PulseAudio
-if [ "$OS" = "linux" -o "$OS" = "freebsd" ]; then
- if [ $WITH_PULSE -eq 1 ]; then
- check_pulse
- elif [ $WITH_PULSE -eq 0 ]; then
- cnf_append "VBOX_WITH_PULSE" ""
- fi
+if [ $ONLY_ADDITIONS -eq 0 ]; then
+ [ "$OS" != "darwin" ] && check_pthread
+ check_libxml2
+ [ $WITH_LIBIDL -eq 1 ] && check_libidl
+ check_ssl
+ check_curl
+ [ $WITH_LIBVPX -eq 1 ] && check_vpx
+ [ "$OS" != "darwin" ] && check_z
+ [ "$OS" != "darwin" ] && check_png
+ [ $OSE -eq 0 -a "$OS" = "linux" ] && check_pam
+ [ $WITH_SDL -eq 1 ] && check_sdl
+ [ $WITH_SDL_TTF -eq 1 -a $OSE -eq 0 ] && check_sdl_ttf
+ [ $WITH_X11 -eq 1 ] && check_x
+ # TODO check for xcomposite-dev (X11/extensions/Xcomposite.h, additions only)
+ # TODO check for libxdamange-dev (X11/extensions/Xdamage.h, additions only)
+ [ $WITH_X11 -eq 1 ] && check_xcursor
+ [ $WITH_X11 -eq 1 ] && check_xinerama
+ [ $WITH_X11 -eq 1 ] && check_xrandr
+ [ $WITH_OPENGL -eq 1 ] && check_opengl
+ [ $WITH_QT4 -eq 1 ] && check_qt4
+ [ $WITH_PYTHON -eq 1 ] && check_python
+ [ $WITH_JAVA -eq 1 ] && check_java
+
+ # PulseAudio
+ if [ "$OS" = "linux" -o "$OS" = "freebsd" ]; then
+ if [ $WITH_PULSE -eq 1 ]; then
+ check_pulse
+ elif [ $WITH_PULSE -eq 0 ]; then
+ cnf_append "VBOX_WITH_PULSE" ""
+ fi
+ fi
fi
# Linux-specific
@@ -2743,29 +2755,31 @@ if [ "$OS" = "linux" ]; then
cnf_append "VBOX_WITH_VBOXDRV" ""
cnf_append "VBOX_WITH_ADDITION_DRIVERS" ""
fi
- if [ $WITH_ALSA -eq 1 ]; then
- check_alsa
- else
- cnf_append "VBOX_WITH_ALSA" ""
- fi
- if [ $WITH_DBUS -eq 0 ]; then
- cnf_append "VBOX_WITH_DBUS" ""
- fi
- if [ $WITH_DEVMAPPER -eq 1 ]; then
- check_libdevmapper
- else
- cnf_append "VBOX_WITH_DEVMAPPER" ""
+ if [ $ONLY_ADDITIONS -eq 0 ]; then
+ if [ $WITH_ALSA -eq 1 ]; then
+ check_alsa
+ else
+ cnf_append "VBOX_WITH_ALSA" ""
+ fi
+ if [ $WITH_DBUS -eq 0 ]; then
+ cnf_append "VBOX_WITH_DBUS" ""
+ fi
+ if [ $WITH_DEVMAPPER -eq 1 ]; then
+ check_libdevmapper
+ else
+ cnf_append "VBOX_WITH_DEVMAPPER" ""
+ fi
+ check_libcap
fi
- check_libcap
check_compiler_h
- [ "$BUILD_MACHINE" = "amd64" -a $WITH_VMMRAW -eq 1 ] && check_32bit
+ [ $ONLY_ADDITIONS -eq 0 -a "$BUILD_MACHINE" = "amd64" -a $WITH_VMMRAW -eq 1 ] && check_32bit
# tools/common/makeself*
[ $OSE -ge 1 ] && check_makeself
fi
[ -n "$SETUP_WINE" ] && setup_wine
-if [ $WITH_GSOAP -eq 1 ]; then
+if [ $ONLY_ADDITIONS -eq 0 -a $WITH_GSOAP -eq 1 ]; then
check_gsoap
else
if [ $OSE -ge 1 ]; then
@@ -2774,25 +2788,25 @@ else
fi
# UDPTUNNEL
-if [ $WITH_UDPTUNNEL -eq 0 ]; then
+if [ $ONLY_ADDITIONS -eq 0 -a $WITH_UDPTUNNEL -eq 0 ]; then
cnf_append "VBOX_WITH_UDPTUNNEL" ""
fi
# VDE
-if [ "$OS" = "linux" -o "$OS" = "freebsd" ]; then
+if [ $ONLY_ADDITIONS -eq 0 -a "$OS" = "linux" -o "$OS" = "freebsd" ]; then
if [ $WITH_VDE -eq 1 ]; then
cnf_append "VBOX_WITH_VDE" "1"
fi
fi
# DOCS
-if [ $WITH_DOCS -eq 0 ]; then
+if [ $ONLY_ADDITIONS -eq 1 -o $WITH_DOCS -eq 0 ]; then
cnf_append "VBOX_WITH_DOCS" ""
cnf_append "VBOX_WITH_DOCS_PACKING" ""
fi
# VNC server support
-if [ $OSE -ge 1 ]; then
+if [ $ONLY_ADDITIONS -eq 0 -a $OSE -ge 1 ]; then
if [ $WITH_VNC = 1 ]; then
check_vncserver
else
@@ -2800,6 +2814,10 @@ if [ $OSE -ge 1 ]; then
fi
fi
+if [ $ONLY_ADDITIONS -eq 1 ]; then
+ cnf_append "VBOX_ONLY_ADDITIONS" "1"
+fi
+
# success!
echo
echo "Successfully generated '$CNF' and '$ENV'."
@@ -2820,7 +2838,11 @@ if [ "$OS" = "linux" ]; then
echo " make"
echo ""
fi
-if [ $WITH_HARDENING -gt 0 ]; then
+if [ $ONLY_ADDITIONS -eq 1 ]; then
+ echo ""
+ echo " Tree configured to build only the Guest Additions"
+ echo ""
+elif [ $WITH_HARDENING -gt 0 ]; then
echo ""
echo " +++ WARNING +++ WARNING +++ WARNING +++ WARNING +++ WARNING +++ WARNING +++"
echo " Hardening is enabled which means that the VBox binaries will not run from"
diff --git a/doc/manual/Makefile.kmk b/doc/manual/Makefile.kmk
index 3e7f8f5..ce14e49 100644
--- a/doc/manual/Makefile.kmk
+++ b/doc/manual/Makefile.kmk
@@ -520,9 +520,10 @@ $(foreach f,$(VBOX_MANUAL_LANGUAGES),$(VBOX_PATH_MANUAL_OUTBASE)/$f/UserManual.p
$(QUIET)$(REDIRECT) -w+ti /dev/null -C $(@D) -- $(PDFLATEX) UserManual.tex
$(QUIET)$(REDIRECT) -w+ti /dev/null -C $(@D) -- $(PDFLATEX) UserManual.tex
$(QUIET)$(REDIRECT) -w+ti /dev/null -C $(@D) -- $(PDFLATEX) UserManual.tex
+ $(QUIET)$(SED) -ne '/Warning: Hyper reference/p' $(basename $<).log
$(QUIET)$(SED) -n \
- -e '/Warning: There were \(undefined references\|multiply-defined labels\)/{p; q 1}' \
- $(basename $@).log
+ -e '/Warning: There were \(undefined references\|multiply-defined labels\)/{p; q 1}' \
+ $(basename $@).log
##@todo restore this when above has been converted to INSTALLS target. $(call MSG_L1,Fresh LaTeX-generated PDF is now at $@)
@@ -564,9 +565,10 @@ $(VBOX_PATH_SDK)/docs/SDKRef.pdf: \
$(QUIET)$(REDIRECT) -C $(<D) -- $(PDFLATEX) SDKRef.tex
$(QUIET)$(REDIRECT) -C $(<D) -- $(PDFLATEX) SDKRef.tex
$(QUIET)$(REDIRECT) -C $(<D) -- $(PDFLATEX) SDKRef.tex
+ $(QUIET)$(SED) -ne '/Warning: Hyper reference/p' $(basename $<).log
$(QUIET)$(SED) -n \
- -e '/Warning: There were \(undefined references\|multiply-defined labels\)/{p; q 1}' \
- $(basename $<).log
+ -e '/Warning: There were \(undefined references\|multiply-defined labels\)/{p; q 1}' \
+ $(basename $<).log
$(QUIET)$(CP) $(<D)/SDKRef.pdf $@
$(call MSG_L1,Fresh LaTeX-generated PDF is now at $@)
diff --git a/doc/manual/en_US/SDKRef.xml b/doc/manual/en_US/SDKRef.xml
index 61e282d..e986983 100644
--- a/doc/manual/en_US/SDKRef.xml
+++ b/doc/manual/en_US/SDKRef.xml
@@ -3996,6 +3996,198 @@ AuthResult AUTHCALL AuthEntry(
</itemizedlist></para>
</listitem>
+ <listitem><para>IDisplay and IFramebuffer interfaces were changed to allow IFramebuffer
+ object to reside in a separate frontend process:<itemizedlist>
+
+ <listitem><para>
+ IDisplay::ResizeCompleted() has been removed, because the IFramebuffer object
+ does not provide the screen memory anymore.
+ </para></listitem>
+
+ <listitem><para>
+ IDisplay::SetFramebuffer() has been replaced with IDisplay::AttachFramebuffer()
+ and IDisplay::DetachFramebuffer().
+ </para></listitem>
+
+ <listitem><para>
+ IDisplay::GetFramebuffer() has been replaced with IDisplay::QueryFramebuffer().
+ </para></listitem>
+
+ <listitem><para>
+ IDisplay::GetScreenResolution() has a new output parameter
+ <computeroutput>guestMonitorStatus</computeroutput>
+ which tells whether the monitor is enabled in the guest.
+ </para></listitem>
+
+ <listitem><para>
+ IDisplay::TakeScreenShot() and IDisplay::TakeScreenShotToArray() have a new parameter
+ <computeroutput>bitmapFormat</computeroutput>. As a consequence of this,
+ IDisplay::TakeScreenShotPNGToArray() has been removed.
+ </para></listitem>
+
+ <listitem><para>
+ IFramebuffer::RequestResize() has been replaced with IFramebuffer::NotifyChange().
+ </para></listitem>
+
+ <listitem><para>
+ IFramebuffer::NotifyUpdateImage() added to support IFramebuffer objects in a different process.
+ </para></listitem>
+
+ <listitem><para>
+ IFramebuffer::Lock(), IFramebuffer::Unlock(), IFramebuffer::Address(), IFramebuffer::UsesGuestVRAM()
+ have been removed because the IFramebuffer object does not provide the screen memory anymore.
+ </para></listitem>
+
+ </itemizedlist></para>
+ </listitem>
+
+ <listitem><para>IGuestSession, IGuestFile and IGuestProcess interfaces were changed as follows:
+ <itemizedlist>
+ <listitem>
+ <para>Replaced IGuestSession::directoryQueryInfo and IGuestSession::fileQueryInfo with a new
+ <xref linkend="IGuestSession__fsObjQueryInfo" xreflabel="IGuestSession::fsObjQueryInfo"/> method
+ that works on any type of file system object.</para>
+ </listitem>
+ <listitem>
+ <para>Replaced IGuestSession::fileRemove, IGuestSession::symlinkRemoveDirectory and
+ IGuestSession::symlinkRemoveFile with a new
+ <xref linkend="IGuestSession__fsObjRemove" xreflabel="IGuestSession::fsObjRemove"/> method that works
+ on any type of file system object except directories. (fileRemove also worked on any type of object too,
+ though that was not the intent of the method.)</para>
+ </listitem>
+ <listitem>
+ <para>Replaced IGuestSession::directoryRename and IGuestSession::directoryRename with a new
+ <xref linkend="IGuestSession__fsObjRename" xreflabel="IGuestSession::fsObjRename"/> method that works
+ on any type of file system object. (directoryRename and fileRename may already have worked for any kind
+ of object, but that was never the intent of the methods.)</para>
+ </listitem>
+ <listitem>
+ <para>Replaced the unimplemented IGuestSession::directorySetACL and IGuestSession::fileSetACL with a new
+ <xref linkend="IGuestSession__fsObjSetACL" xreflabel="IGuestSession::fsObjSetACL"/> method that works
+ on all type of file system object. Also added a UNIX-style mode parameter as an alternative to the ACL.</para>
+ </listitem>
+ <listitem>
+ <para>Replaced IGuestSession::fileRemove, IGuestSession::symlinkRemoveDirectory and
+ IGuestSession::symlinkRemoveFile with a new
+ <xref linkend="IGuestSession__fsObjRemove" xreflabel="IGuestSession::fsObjRemove"/> method that works
+ on any type of file system object except directories (fileRemove also worked on any type of object,
+ though that was not the intent of the method.)</para>
+ </listitem>
+ <listitem>
+ <para>Renamed IGuestSession::copyTo to <xref linkend="IGuestSession__fileCopyToGuest"
+ xreflabel="IGuestSession::fileCopyToGuest"/>.</para>
+ </listitem>
+ <listitem>
+ <para>Renamed IGuestSession::copyFrom to <xref linkend="IGuestSession__fileCopyFromGuest"
+ xreflabel="IGuestSession::fileCopyFromGuest"/>.</para>
+ </listitem>
+ <listitem>
+ <para>Renamed the CopyFileFlag enum to <xref linkend="FileCopyFlag" xreflabel="FileCopyFlag"/>.</para>
+ </listitem>
+ <listitem>
+ <para>Renamed the IGuestSession::environment attribute to <xref linkend="IGuestSession__environmentChanges"
+ xreflabel="IGuestSession::environmentChanges"/> to better reflect what it does.</para>
+ </listitem>
+ <listitem>
+ <para>Changed the <xref linkend="IProcess__environment" xreflabel="IGuestProcess::environment"/> to
+ a stub returning E_NOTIMPL since it wasn't doing what was advertised (returned changes, not the
+ actual environment).</para>
+ </listitem>
+ <listitem>
+ <para>Renamed IGuestSession::environmentSet to <xref linkend="IGuestSession__environmentScheduleSet"
+ xreflabel="IGuestSession::environmentScheduleSet"/> to better reflect what it does.</para>
+ </listitem>
+ <listitem>
+ <para>Renamed IGuestSession::environmentUnset to <xref linkend="IGuestSession__environmentScheduleUnset"
+ xreflabel="IGuestSession::environmentScheduleUnset"/> to better reflect what it does.</para>
+ </listitem>
+ <listitem>
+ <para>Removed IGuestSession::environmentGet it was only getting changes while giving the impression it was
+ actual environment variables, and it did not represent scheduled unset operations.</para>
+ </listitem>
+ <listitem>
+ <para>Removed IGuestSession::environmentClear as it duplicates assigning an empty array to the
+ <xref linkend="IGuestSession__environmentChanges" xreflabel="IGuestSession::environmentChanges"/> (formerly
+ known as IGuestSession::environment).</para>
+ </listitem>
+ <listitem>
+ <para>Changed the <xref linkend="IGuestSession__processCreate" xreflabel="IGuestSession::processCreate"/> and
+ <xref linkend="IGuestSession__processCreateEx" xreflabel="IGuestSession::processCreateEx"/> methods to accept
+ arguments starting with argument zero (argv[0]) instead of argument one (argv[1]). (Not yet implemented on the
+ guest additions side, so argv[0] will probably be ignored for a short while.)</para>
+ </listitem>
+
+ <listitem>
+ <para>Added a followSymlink parameter to the following methods:<itemizedlist>
+ <listitem><para><xref linkend="IGuestSession__directoryExists"
+ xreflabel="IGuestSession::directoryExists"/></para></listitem>
+ <listitem><para><xref linkend="IGuestSession__fileExists"
+ xreflabel="IGuestSession::fileExists"/></para></listitem>
+ <listitem><para><xref linkend="IGuestSession__fileQuerySize"
+ xreflabel="IGuestSession::fileQuerySize"/></para></listitem>
+ </itemizedlist></para>
+ </listitem>
+ <listitem>
+ <para>The parameters to the <xref linkend="IGuestSession__fileOpen" xreflabel="IGuestSession::fileOpen"/>
+ and <xref linkend="IGuestSession__fileOpenEx" xreflabel="IGuestSession::fileOpenEx"/> methods were
+ altered:<itemizedlist>
+ <listitem><para>The openMode string parameter was replaced by the enum
+ <xref linkend="FileAccessMode" xreflabel="FileAccessMode"/> and renamed to accessMode.</para></listitem>
+ <listitem><para>The disposition string parameter was replaced by the enum
+ <xref linkend="FileOpenAction" xreflabel="FileOpenAction"/> and renamed to openAction.</para></listitem>
+ <listitem><para>The unimplemented sharingMode string parameter was replaced by the enum
+ <xref linkend="FileSharingMode" xreflabel="FileSharingMode"/> (fileOpenEx only).</para></listitem>
+ <listitem><para>Added a flags parameter taking a list of <xref linkend="FileOpenExFlags"
+ xreflabel="FileOpenExFlags"/> values (fileOpenEx only).</para></listitem>
+ <listitem><para>Removed the offset parameter (fileOpenEx only).</para></listitem>
+ </itemizedlist></para>
+ </listitem>
+
+ <listitem>
+ <para><xref linkend="IFile__seek" xreflabel="IGuestFile::seek"/> now returns the new offset.</para>
+ </listitem>
+ <listitem>
+ <para>Renamed the FileSeekType enum used by <xref linkend="IFile__seek" xreflabel="IGuestFile::seek"/>
+ to <xref linkend="FileSeekOrigin" xreflabel="FileSeekOrigin"/> and added the missing End value
+ and renaming the Set to Begin.</para>
+ </listitem>
+ <listitem>
+ <para>Extended the unimplemented <xref linkend="IFile__setACL" xreflabel="IGuestFile::setACL"/>
+ method with a UNIX-style mode parameter as an alternative to the ACL.</para>
+ </listitem>
+ <listitem>
+ <para>Renamed the IFile::openMode attribute to <xref linkend="IFile__accessMode" xreflabel="IFile::accessMode"/>
+ and change the type from string to <xref linkend="FileAccessMode" xreflabel="FileAccessMode"/> to reflect
+ the changes to the fileOpen methods.</para>
+ </listitem>
+ <listitem>
+ <para>Renamed the IGuestFile::disposition attribute to <xref linkend="IFile__openAction"
+ xreflabel="IFile::openAction"/> and change the type from string to <xref linkend="FileOpenAction"
+ xreflabel="FileOpenAction"/> to reflect the changes to the fileOpen methods.</para>
+ </listitem>
+
+ <!-- Non-incompatible things worth mentioning (stubbed methods/attrs aren't worth it). -->
+ <listitem>
+ <para>Added <xref linkend="IGuestSession__pathStyle" xreflabel="IGuestSession::pathStyle"/> attribute.</para>
+ </listitem>
+ <listitem>
+ <para>Added <xref linkend="IGuestSession__fsObjExists" xreflabel="IGuestSession::fsObjExists"/> attribute.</para>
+ </listitem>
+
+ </itemizedlist>
+ </para>
+ </listitem>
+
+ <listitem><para>
+ IConsole::GetDeviceActivity() returns information about multiple devices.
+ </para></listitem>
+
+ <listitem><para>
+ IMachine::ReadSavedThumbnailToArray() has a new parameter
+ <computeroutput>bitmapFormat</computeroutput>. As a consequence of this,
+ IMachine::ReadSavedThumbnailPNGToArray() has been removed.
+ </para></listitem>
+
<listitem>
<para>The method <xref linkend="IWebsessionManager__getSessionObject"
xreflabel="IWebsessionManager::getSessionObject()" /> now returns
@@ -4239,10 +4431,8 @@ AuthResult AUTHCALL AuthEntry(
xreflabel="IGuestSession::symlinkExists()" />,
<xref linkend="IGuestSession__symlinkRead"
xreflabel="IGuestSession::symlinkRead()" />,
- <xref linkend="IGuestSession__symlinkRemoveDirectory"
- xreflabel="IGuestSession::symlinkRemoveDirectory()" /> and
- <xref linkend="IGuestSession__symlinkRemoveFile"
- xreflabel="IGuestSession::symlinkRemoveFile()" /> are not
+ IGuestSession::symlinkRemoveDirectory() and
+ IGuestSession::symlinkRemoveFile() are not
implemented yet.</para>
</listitem>
<listitem><para>The directory APIs
@@ -4250,10 +4440,8 @@ AuthResult AUTHCALL AuthEntry(
xreflabel="IGuestSession::directoryRemove()" />,
<xref linkend="IGuestSession__directoryRemoveRecursive"
xreflabel="IGuestSession::directoryRemoveRecursive()" />,
- <xref linkend="IGuestSession__directoryRename"
- xreflabel="IGuestSession::directoryRename()" /> and
- <xref linkend="IGuestSession__directorySetACL"
- xreflabel="IGuestSession::directorySetACL()" /> are not
+ IGuestSession::directoryRename() and
+ IGuestSession::directorySetACL() are not
implemented yet.</para>
</listitem>
<listitem><para>The temporary file creation API
diff --git a/doc/manual/en_US/user_AdvancedTopics.xml b/doc/manual/en_US/user_AdvancedTopics.xml
index 01de728..d223eb4 100644
--- a/doc/manual/en_US/user_AdvancedTopics.xml
+++ b/doc/manual/en_US/user_AdvancedTopics.xml
@@ -3690,4 +3690,186 @@ VBoxManage setextradata "VM name" VBoxInternal/CPUM/SSE4.2 1</screen>
</sect1>
+ <sect1 id="heartbeatservice">
+ <title>Configuring the heartbeat service</title>
+ <para>
+ VirtualBox ships a simple heartbeat service. Once the Guest Additions are
+ active, the guest sends frequent heartbeat pings to the host. If the guest
+ stops sending the heartbeat pings without properly termination the service,
+ the VM process will log this event in the VBox.log file. In the future it
+ might be possible to configure dedicated actions but for there is only a
+ warning in the log file.</para>
+
+ <para>
+ There are two parameters to configure. The <emphasis>heartbeat interval</emphasis>
+ defines the time between two heartbeat pings. The default value is 2 seconds, that
+ is, the heartbeat service of the VirtualBox Guest Additions will send a heartbeat
+ ping every two seconds. The value in nanoseconds can be configured like this:
+ </para>
+ <screen>VBoxManage controlvm "VM name" VBoxInternal/Devices/VMMDev/0/Config/HeartbeatInterval 2000000000</screen>
+ <para>
+ The <emphasis>heartbeat timeout</emphasis> defines the time the host waits
+ starting from the last heartbeat ping before it defines the guest as unresponsive.
+ The default value is 2 times the heartbeat interval (4 seconds) and can be configured
+ as following (in nanoseconds):
+ </para>
+
+ <screen>VBoxManage controlvm "VM name" VBoxInternal/Devices/VMMDev/0/Config/HeartbeatTimeout 4000000000</screen>
+
+ <para>
+ If the heartbeat timeout expires, there will be a log message like
+ <emphasis>VMMDev: HeartBeatCheckTimer: Guest seems to be unresponsive. Last heartbeat
+ received 5 seconds ago.</emphasis>
+ If another heartbeat ping arrives after this warning, there will be a log
+ message like
+ <emphasis>VMMDev: GuestHeartBeat: Guest is alive.</emphasis>
+ </para>
+
+ </sect1>
+
+ <sect1 id="diskencryption">
+ <title>Encryption of disk images</title>
+
+ <para>
+ Starting with VirtualBox 5.0, it is possible to encrypt the data stored in
+ hard disk images transparently for the guest. It does not depend on a specific
+ image format to be used. Images which have the data encrypted are not portable
+ between VirtualBox and other virtualization software though.
+ </para>
+
+ <para>
+ VirtualBox uses the AES algorithm in XTS mode and supports 128 or 256 bit
+ data encryption keys (DEK).
+ The DEK is stored encrypted in the medium properties and is decrypted during
+ VM startup by entering a password which was chosen when the image was encrypted.
+ </para>
+
+ <sect2 id="diskencryption-limitations">
+ <title>Limitations</title>
+
+ <para>
+ There are some limitations the user needs to be aware of when using this
+ feature:
+ </para>
+
+ <itemizedlist>
+
+ <listitem>
+ <para>This feature is currently closed source and requires the VirtualBox extension
+ pack to be installed to work.</para>
+ </listitem>
+
+ <listitem>
+ <para>Since encryption works only on the stored user data,
+ it is currently not possible to check for metadata integrity of the disk image.
+ Attackers might take advantage of this to remove or insert blocks of data
+ into the image or change certain metadata items such as the disk size.</para>
+ </listitem>
+
+ <listitem>
+ <para>Exporting appliances which contain encrypted disk images is not
+ possible because the OVF specification doesn't support this.
+ All images are therefore decrypted during export.</para>
+ </listitem>
+
+ <listitem>
+ <para>The DEK is kept in memory while the VM is running to be able to
+ decrypt data read and encrypt data written by the guest. While this should
+ be obvious the user needs to be aware of this because an attacker might be able
+ to extract the key on a compromised host and get access to the data later.</para>
+ </listitem>
+
+ <listitem>
+ <para>When encrypting or decrypting the images, the password is passed unencrypted
+ via the Main API from the frontend to VBoxSVC. This needs to be kept in mind,
+ especially when using third party frontends which make use of the webservice
+ where the password might be transmitted unencrypted over the network.</para>
+ </listitem>
+
+ <listitem>
+ <para>Encrypting images with differencing images is only possible if there
+ are no branches. This limitation may be addressed in a future
+ VirtualBox version.</para>
+ </listitem>
+
+ </itemizedlist>
+
+ </sect2>
+
+ <sect2 id="diskencryption-encryption">
+ <title>Encrypting disk images</title>
+
+ <para>
+ Encrypting disk images can be done either using the GUI or VBoxManage.
+ While the GUI is easier to use, it works on a per VM basis and encrypts
+ all disk images attached to the specific VM.
+ With VBoxManage one can encrypt individual images (including all differencing
+ images). To encrypt an unencrypted medium with VBoxManage, use:
+ </para>
+
+ <screen>VBoxManage encryptmedium "uuid|filename" --newpassword "file|-" --cipher "cipher id" --newpasswordid "id"</screen>
+
+ <para>
+ To supply the encryption password point VBoxManage to the file where the
+ password is stored or specify <computeroutput>-</computeroutput> to let VBoxManage
+ ask you for the password on the command line.
+ </para>
+ <para>
+ The cipher parameter specifies the cipher to use for encryption and can be either
+ <computeroutput>AES-XTS128-PLAIN64</computeroutput> or <computeroutput>AES-XTS256-PLAIN64</computeroutput>.
+ The specified password identifier can be freely chosen by the user and is
+ used for correct identification when supplying multiple passwords during
+ VM startup.
+ </para>
+ <para>
+ If the user uses the same password when encrypting multiple images and also the
+ same password identifier, the user needs to supply the password only once during
+ VM startup.
+ </para>
+ </sect2>
+
+ <sect2 id="diskencryption-startvm">
+ <title>Starting a VM with encrypted images</title>
+
+ <para>
+ When a VM is started using the GUI, a dialog will open where the user
+ needs to enter all passwords for all encrypted images attached to the VM.
+ If another frontend like VBoxHeadless is used, the VM will be paused as soon
+ as the guest tries to access an encrypted disk.
+ The user needs to provide the passwords through VBoxManage using the following
+ command:
+ </para>
+
+ <screen>VBoxManage controlvm "uuid|vmname" addencpassword "id" "password" [--removeonsuspend "yes|no"]</screen>
+
+ <para>
+ The <computeroutput>id</computeroutput> parameter must be the same as the password identifier
+ supplied when encrypting the images. <computeroutput>password</computeroutput> is the password
+ used when encrypting the images. The user can optionally specify
+ <computeroutput>--removeonsuspend "yes|no"</computeroutput> to specify whether
+ to remove the password from VM memory when the VM is suspended. Before the VM can be
+ resumed, the user needs to supply the passwords again. This is useful when
+ a VM is suspended by a host suspend event and the user doesn't want
+ the password to remain in memory.
+ </para>
+ </sect2>
+
+ <sect2 id="diskencryption-decryption">
+ <title>Decrypting encrypted images</title>
+
+ <para>
+ In some circumstances it might be required to decrypt previously encrypted
+ images. This can be done in the GUI for a complete VM or using VBoxManage
+ with the following command:
+ </para>
+
+ <screen>VBoxManage encryptmedium "uuid|filename" --oldpassword "file|-"</screen>
+
+ <para>
+ The only required parameter is the password the image was encrypted with.
+ The options are the same as for encrypting images.
+ </para>
+ </sect2>
+ </sect1>
+
</chapter>
diff --git a/doc/manual/en_US/user_BasicConcepts.xml b/doc/manual/en_US/user_BasicConcepts.xml
index 2ae956f..5eb8ba7 100644
--- a/doc/manual/en_US/user_BasicConcepts.xml
+++ b/doc/manual/en_US/user_BasicConcepts.xml
@@ -537,9 +537,11 @@
modern ICH9 chipset, which supports PCI express, three PCI
buses, PCI-to-PCI bridges and Message Signaled Interrupts
(MSI). This allows modern operating systems to address more PCI
- devices and no longer requires IRQ sharing. Note that the ICH9
- support is experimental and not recommended for guest operating
- systems which do not require it.</para>
+ devices and no longer requires IRQ sharing. Using the ICH9 chipset
+ it is also possible to configure up to 36 network cards (up to 8
+ network adapters with PIIX3). Note that the ICH9 support is
+ experimental and not recommended for guest operating systems which
+ do not require it.</para>
</glossdef>
</glossentry>
@@ -1178,23 +1180,34 @@
</listitem>
<listitem>
- <para>TCP Socket: useful for forwarding serial traffic over TCP/IP, acting as a server,
- or it can act as a TCP client connecting to other servers.
- It allows remote machine to connect via TCP directly to guest's serial port.
- </para>
- <para>TCP Server: use "create socket" mode, and type in only the <emphasis role="bold">
- <computeroutput>port</computeroutput></emphasis> number.
- Typically 23 or 2023. Note that on UNIX-like systems you will have to use port
- number over 1024 for normal users.
- </para>
- <para>
- The client can use software such as "Putty" or command-line "telnet" to access TCP Server.
- </para>
- <para>TCP Client: to create a virtual null-modem cable over the Internet or LAN,
- the other side can connect via TCP by specifying <emphasis role="bold">
- <computeroutput>hostname:port</computeroutput></emphasis>.
- TCP socket will act in client mode, if you remove "create socket" mode.
+ <para>TCP Socket: Useful for forwarding serial traffic over TCP/IP,
+ acting as a server, or it can act as a TCP client connecting to other
+ servers. It allows a remote machine to directly connect to the guest's
+ serial port via TCP.
</para>
+ <itemizedlist>
+ <listitem>
+ <para>TCP Server: Uncheck the
+ <emphasis>Connect to existing pipe/socket</emphasis> checkbox and specify
+ the <emphasis role="bold"><computeroutput>port</computeroutput></emphasis>
+ number. Typically 23 or 2023. Note that on UNIX-like systems you will
+ have to use a port a number greater than 1024 for regular users.
+ </para>
+ <para>
+ The client can use software such as <computeroutput>PuTTY</computeroutput>
+ or the <computeroutput>telnet</computeroutput> command line
+ tool to access the TCP Server.
+ </para>
+ </listitem>
+ <listitem>
+ <para>TCP Client: To create a virtual null-modem cable over the Internet or
+ LAN, the other side can connect via TCP by specifying <emphasis role="bold">
+ <computeroutput>hostname:port</computeroutput></emphasis>. The TCP socket
+ will act in client mode if check the <emphasis>Connect to existing pipe/socket</emphasis>
+ checkbox.
+ </para>
+ </listitem>
+ </itemizedlist>
</listitem>
</itemizedlist></para>
diff --git a/doc/manual/en_US/user_Installation.xml b/doc/manual/en_US/user_Installation.xml
index 576d8f9..fdff9ec 100644
--- a/doc/manual/en_US/user_Installation.xml
+++ b/doc/manual/en_US/user_Installation.xml
@@ -158,6 +158,22 @@
</glosslist>For example, to only install USB support along with the
main binaries, do a: <screen>VirtualBox.exe -msiparams ADDLOCAL=VBoxApplication,VBoxUSB</screen>
or <screen>msiexec /i VirtualBox-<version>-MultiArch_<x86|amd64>.msi ADDLOCAL=VBoxApplication,VBoxUSB</screen></para>
+
+ <para>
+ The user is able to choose between NDIS5 and NDIS6 host network filters drivers during
+ the installation. This is realized via a command line parameter
+ <computeroutput>NETWORKTYPE</computeroutput>.
+ The NDIS6 driver is default for Windows Vista and later. For older Windows versions,
+ the installer will automatically select the NDIS5 driver and this cannot be changed.
+ For Windows Vista and later the user can force to install the (legacy) NDIS5 host
+ network filter driver using <computeroutput>NETWORKTYPE=NDIS5</computeroutput>. For
+ example, to install the NDIS5 driver on Windows 7, do
+ <screen>VirtualBox.exe -msiparams NETWORKTYPE=NDIS5</screen>
+ or
+ <screen>msiexec /i VirtualBox-<version>-MultiArch_<x86|amd64>.msi NETWORKTYPE=NDIS5</screen>
+ </para>
+
+
</sect2>
<sect2>
@@ -174,6 +190,7 @@
<para>Unattended installations can be performed using the standard MSI
support.</para>
+
</sect2>
</sect1>
diff --git a/doc/manual/en_US/user_Networking.xml b/doc/manual/en_US/user_Networking.xml
index afdbb07..900e1d4 100644
--- a/doc/manual/en_US/user_Networking.xml
+++ b/doc/manual/en_US/user_Networking.xml
@@ -431,38 +431,38 @@
the internal network will be created if it does not already exist. An
example command to create a NAT network is:
</para>
- <para><screen>VBoxManage natnetwork add -t nat-int-network -n "192.168.15.0/24" -e</screen></para>
+ <para><screen>VBoxManage natnetwork add --netname natnet1 --network "192.168.15.0/24" --enable</screen></para>
<para>
- Here, "nat-int-network" is the name of the internal network to be used and
+ Here, "natnet1" is the name of the internal network to be used and
"192.168.15.0/24" is the network address and mask of the NAT service
interface. By default in this static configuration the gateway will be
assigned the address 192.168.15.1 (the address following the interface
address), though this is subject to change. To attach a DHCP server to the
internal network, we modify the example as follows:</para>
- <para><screen>VBoxManage natnetwork add -t nat-int-network -n "192.168.15.0/24" -e -h on</screen></para>
+ <para><screen>VBoxManage natnetwork add --netname natnet1 --network "192.168.15.0/24" --enable --dhcp on</screen></para>
<para> or to add a DHCP server to the network after creation:</para>
- <para><screen>VBoxManage natnetwork modify -t nat-int-network -h on</screen></para>
+ <para><screen>VBoxManage natnetwork modify --netname natnet1 --dhcp on</screen></para>
<para>To disable it again, use:</para>
- <para><screen>VBoxManage natnetwork modify -t nat-int-network -h off</screen></para>
+ <para><screen>VBoxManage natnetwork modify --netname natnet1 --dhcp off</screen></para>
<para>DHCP server provides list of registered nameservers, but doesn't map
servers from 127/8 network.</para>
<para>To start the NAT service, use the following command:</para>
- <para><screen>VBoxManage natnetwork start -t nat-int-network</screen></para>
+ <para><screen>VBoxManage natnetwork start --netname natnet1</screen></para>
<para>If the network has a DHCP server attached then it will start together
with the NAT network service.</para>
- <para><screen>VBoxManage natnetwork stop -t nat-int-network</screen> stops
+ <para><screen>VBoxManage natnetwork stop --netname natnet1</screen> stops
the NAT network service, together with DHCP server if any.</para>
<para>To delete the NAT network service use:</para>
- <para><screen>VBoxManage natnetwork remove -t nat-int-network</screen></para>
+ <para><screen>VBoxManage natnetwork remove --netname natnet1</screen></para>
<para>This command does not remove the DHCP server if one is enabled on the
internal network.</para>
- <para>Port-forwarding is supported (using the "-p" switch for IPv4 and "-P"
+ <para>Port-forwarding is supported (using the "--port-forward-4" switch for IPv4 and "--port-forward-6"
for IPv6):</para>
- <para><screen>VBoxManage natnetwork modify -t nat-int-network -p "ssh:tcp:[]:10022:[192.168.15.15]:22"</screen></para>
- <para>This adds a port-forwarding rule from the host's TCP 10022 port to
- the port 22 on the guest with IP address 192.168.15.15. To delete the rule,
- use:</para>
- <para><screen>VBoxManage natnetwork modify -t nat-int-network -p delete ssh</screen></para>
+ <para><screen>VBoxManage natnetwork modify --netname natnet1 --port-forward-4 "ssh:tcp:[]:1022:[192.168.15.5]:22"</screen></para>
+ <para>This adds a port-forwarding rule from the host's TCP 1022 port to
+ the port 22 on the guest with IP address 192.168.15.5. Host port, guest port and guest IP
+ are mandatory. To delete the rule, use:</para>
+ <para><screen>VBoxManage natnetwork modify --netname natnet1 --port-forward-4 delete ssh</screen></para>
<para>It's possible to bind NAT service to specified interface:</para>
<screen>VBoxManage setextradata global "NAT/win-nat-test-0/SourceIp4" 192.168.1.185</screen>
<para>To see the list of registered NAT networks, use:</para>
@@ -696,7 +696,14 @@
"VM name" --nic<x> hostonly</computeroutput>; see <xref
linkend="vboxmanage-modifyvm" /> for details.</para>
</listitem>
- </itemizedlist></para>
+ </itemizedlist></para>
+
+ <para>Before you can attach a VM to a host-only network you have to
+ create at least one host-only interface, either from the GUI:
+ "File" -> "Preferences" -> "Network" -> "Host-only network"
+ -> "(+)Add host-only network", or via command line with</para>
+ <screen>VBoxManage hostonlyif create</screen>
+ <para>see <xref linkend="vboxmanage-hostonlyif" /> for details.</para>
<para>For host-only networking, like with internal networking, you may
find the DHCP server useful that is built into VirtualBox. This can be
diff --git a/doc/manual/en_US/user_Technical.xml b/doc/manual/en_US/user_Technical.xml
index 674ffb3..3b3c06d 100644
--- a/doc/manual/en_US/user_Technical.xml
+++ b/doc/manual/en_US/user_Technical.xml
@@ -593,7 +593,7 @@
virtual machine. These interfaces require the guest operating system
to recognize their presence and make use of them in order to leverage
the benefits of communicating with the VirtualBox hypervisor.</para>
-
+
<para>Most mainstream, modern operating systems, including Windows and
Linux, ship with support for one or more paravirtualization interfaces.
Hence, there is typically no need to install additional software in the
@@ -604,7 +604,7 @@
<itemizedlist>
<listitem>
<para><emphasis role="bold">Minimal</emphasis>: Announces the
- presence of a virtualized environment, additionally reports the
+ presence of a virtualized environment. Additionally, reports the
TSC and APIC frequency to the guest operating system. This provider
is mandatory for running any Mac OS X guests.</para>
</listitem>
diff --git a/doc/manual/en_US/user_Troubleshooting.xml b/doc/manual/en_US/user_Troubleshooting.xml
index 1445efa..c574f47 100644
--- a/doc/manual/en_US/user_Troubleshooting.xml
+++ b/doc/manual/en_US/user_Troubleshooting.xml
@@ -88,7 +88,7 @@
</orderedlist></para>
</sect2>
- <sect2>
+ <sect2 id="collect-debug-info">
<title>Collecting debugging information</title>
<para>For problem determination, it is often important to collect
diff --git a/doc/manual/en_US/user_VBoxManage.xml b/doc/manual/en_US/user_VBoxManage.xml
index 3f5e96a..82f2b0d 100644
--- a/doc/manual/en_US/user_VBoxManage.xml
+++ b/doc/manual/en_US/user_VBoxManage.xml
@@ -531,12 +531,6 @@ Statistics update: disabled</screen></para>
</listitem>
<listitem>
- <para><computeroutput>--rtcuseutc on|off</computeroutput>: This
- option lets the real-time clock (RTC) operate in UTC time (see
- <xref linkend="settings-motherboard" />).</para>
- </listitem>
-
- <listitem>
<para><computeroutput>--cpuhotplug on|off</computeroutput>: This
enables CPU hot-plugging. When enabled, virtual CPUs can be added
to and removed from a virtual machine while it is running. See
@@ -663,6 +657,21 @@ Statistics update: disabled</screen></para>
</listitem>
<listitem>
+ <para><computeroutput>--accelerate2dvideo on|off</computeroutput>:
+ This enables, if the Guest Additions are installed, whether 2D video
+ acceleration should be available; see <xref
+ linkend="guestadd-2d" />.</para>
+ </listitem>
+
+ <listitem>
+ <para><computeroutput>--chipset piix3|ich9</computeroutput>:
+ By default VirtualBox emulates an Intel PIIX3 chipset. Usually there
+ is no reason to change the default setting unless it is required to
+ relax some of its constraints; see <xref
+ linkend="settings-motherboard" />.</para>
+ </listitem>
+
+ <listitem>
<para>You can influence the BIOS logo that is displayed when a
virtual machine starts up with a number of settings. Per default,
a VirtualBox logo is displayed.</para>
@@ -705,6 +714,13 @@ Statistics update: disabled</screen></para>
ROM is used.
</para>
</listitem>
+
+ <listitem>
+ <para><computeroutput>--biospxedebug on|off</computeroutput>:
+ This option enables additional debugging output when using the
+ Intel PXE boot ROM. The output will be written to the release log
+ file (<xref linkend="collect-debug-info" />.</para>
+ </listitem>
<listitem>
<para><computeroutput>--boot<1-4>
@@ -715,6 +731,19 @@ Statistics update: disabled</screen></para>
</listitem>
<listitem>
+ <para><computeroutput>--rtcuseutc on|off</computeroutput>: This
+ option lets the real-time clock (RTC) operate in UTC time (see
+ <xref linkend="settings-motherboard" />).</para>
+ </listitem>
+
+ <listitem>
+ <para><computeroutput>--biossystemtimeoffset <ms></computeroutput>:
+ This allows you to set a fixed time offset of the guest relative to
+ the host time. The offset is specified in milliseconds. If the offset
+ is positive the guest time runs ahead the host time.</para>
+ </listitem>
+
+ <listitem>
<para><computeroutput>--snapshotfolder
default|<path></computeroutput>: This allows you to specify
the folder in which snapshots will be kept for a virtual
@@ -740,25 +769,6 @@ Statistics update: disabled</screen></para>
</listitem>
<listitem>
- <para><computeroutput>--lptmode<1-N>
- <Device></computeroutput>
- Specifies the Device Name of the parallel port that
- the Parallel Port feature will be using. Use this
- <emphasis>before</emphasis> <computeroutput>--lpt</computeroutput>.
- This feature is host operating system specific.</para>
- </listitem>
-
- <listitem>
- <para><computeroutput>--lpt<1-N>
- <I/O base> <IRQ></computeroutput>
- Specifies the I/O address of the parallel port and the IRQ
- number that the Parallel Port feature will be using. Use this
- <emphasis>after</emphasis>
- <computeroutput>--lptmod</computeroutput>. I/O base address and IRQ are
- the values that guest sees i.e. the values avalable under guest Device Manager.</para>
- </listitem>
-
- <listitem>
<para><computeroutput>--defaultfrontend
default|<name></computeroutput>: This allows you to specify
the default frontend which will be used when starting this VM; see
@@ -777,13 +787,14 @@ Statistics update: disabled</screen></para>
should be changed.<itemizedlist>
<listitem>
<para><computeroutput>--nic<1-N>
- none|null|nat|bridged|intnet|hostonly|generic
- </computeroutput>: With
- this, you can set, for each of the VM's virtual network cards,
+ none|null|nat|natnetwork|bridged|intnet|hostonly|generic</computeroutput>:
+ With this, you can set, for each of the VM's virtual network cards,
what type of networking should be available. They can be not
present (<computeroutput>none</computeroutput>), not connected to
the host (<computeroutput>null</computeroutput>), use network
address translation (<computeroutput>nat</computeroutput>),
+ use the new network address translation engine
+ (<computeroutput>natnetwork</computeroutput>),
bridged networking (<computeroutput>bridged</computeroutput>) or
communicate with other virtual machines using internal networking
(<computeroutput>intnet</computeroutput>), host-only networking
@@ -795,6 +806,21 @@ Statistics update: disabled</screen></para>
</listitem>
<listitem>
+ <para><computeroutput>--nicpromisc<1-N>
+ deny|allow-vms|allow-all</computeroutput>:
+ This allows you, for each of the VM's virtual network cards, to
+ specify how the promiscious mode is handled. This setting is only
+ relevant for bridged networking.
+ <computeroutput>deny</computeroutput> (default setting) hides
+ any traffic not intended for this VM.
+ <computeroutput>allow-vms</computeroutput> hides all host
+ traffic from this VM but allows the VM to see traffic from/to other
+ VMs.
+ <computeroutput>allow-all</computeroutput> removes this
+ restriction completely.</para>
+ </listitem>
+
+ <listitem>
<para><computeroutput>--nictype<1-N>
Am79C970A|Am79C973|82540EM|82543GC|82545EM|virtio</computeroutput>:
This allows you, for each of the VM's virtual network cards, to
@@ -826,6 +852,25 @@ Statistics update: disabled</screen></para>
</listitem>
<listitem>
+ <para><computeroutput>--natnet<1-N>
+ <network>|default</computeroutput>:
+ If the networking type is set to <computeroutput>nat</computeroutput>
+ (not <computeroutput>natnetwork</computeroutput>) then this
+ setting specifies the IP address range to be used for
+ this network. See <xref linkend="changenat" /> for an
+ example.</para>
+ </listitem>
+
+ <listitem>
+ <para><computeroutput>--nat-network<1-N> <network
+ name></computeroutput>: If the networking type is set to
+ <computeroutput>natnetwork</computeroutput> (not
+ <computeroutput>nat</computeroutput>) then this setting specifies
+ the name of the NAT network this adapter is connected to.</para>
+ </listitem>
+
+ This allows you to change the address range occupied by
+ <listitem>
<para><computeroutput>--bridgeadapter<1-N>
none|<devicename></computeroutput>: If bridged networking
has been enabled for a virtual network card (see the
@@ -1038,7 +1083,7 @@ Statistics update: disabled</screen></para>
TCP socket is not created by VirtualBox,
but assumed to exist already.</para>
</listitem>
-
+
<listitem>
<para><computeroutput><devicename></computeroutput>:
If, instead of the above, the device name of a physical
@@ -1054,6 +1099,25 @@ Statistics update: disabled</screen></para>
</listitem>
<listitem>
+ <para><computeroutput>--lptmode<1-N>
+ <Device></computeroutput>:
+ Specifies the Device Name of the parallel port that
+ the Parallel Port feature will be using. Use this
+ <emphasis>before</emphasis> <computeroutput>--lpt</computeroutput>.
+ This feature is host operating system specific.</para>
+ </listitem>
+
+ <listitem>
+ <para><computeroutput>--lpt<1-N>
+ <I/O base> <IRQ></computeroutput>:
+ Specifies the I/O address of the parallel port and the IRQ
+ number that the Parallel Port feature will be using. Use this
+ <emphasis>after</emphasis>
+ <computeroutput>--lptmod</computeroutput>. I/O base address and IRQ are
+ the values that guest sees i.e. the values avalable under guest Device Manager.</para>
+ </listitem>
+
+ <listitem>
<para><computeroutput>--audio none|null|oss</computeroutput>: With
this option, you can set whether the VM should have audio
support.</para>
@@ -1094,6 +1158,12 @@ Statistics update: disabled</screen></para>
option enables or disables the VM's virtual USB 2.0 controller;
see <xref linkend="settings-usb" /> for details.</para>
</listitem>
+
+ <listitem>
+ <para><computeroutput>--usbxhci on|off</computeroutput>: This
+ option enables or disables the VM's virtual USB 3.0 controller;
+ see <xref linkend="settings-usb" /> for details.</para>
+ </listitem>
</itemizedlist></para>
<!-- @todo r=andy Document tracing-* commands -->
@@ -1117,6 +1187,13 @@ Statistics update: disabled</screen></para>
<!-- @todo r=andy Document vrdeproperty -->
<listitem>
+ <para><computeroutput>--vrdeextpack default|<name></computeroutput>:
+ Allows to specify the library to use for to access the VM
+ remotely. The default is to use the RDP code which is part of the
+ Oracle VM VirtualBox Extension Pack.</para>
+ </listitem>
+
+ <listitem>
<para><computeroutput>--vrdeport
default|<ports></computeroutput>: A port or a range of ports
the VRDE server can bind to; "default" or "0" means port 3389, the
@@ -1162,6 +1239,13 @@ Statistics update: disabled</screen></para>
</listitem>
<listitem>
+ <para><computeroutput>--vrdeauthlibrary
+ default|<name></computeroutput>: This allos to set the
+ library used for RDP authentication, see <xref lang=""
+ linkend="vbox-auth" /> for details.</para>
+ </listitem>
+
+ <listitem>
<para><computeroutput>--vrdemulticon on|off</computeroutput>: This
enables multiple connections to the same VRDE server, if the
server supports this feature; see <xref lang=""
@@ -1256,6 +1340,26 @@ Statistics update: disabled</screen></para>
</listitem>
</itemizedlist></para>
</sect2>
+
+ <sect2 id="vboxmanage-modifyvm-debugging">
+ <title>Debugging settings</title>
+
+ <para>The following settings are only relevant for low-level VM
+ debugging. Regular users will never need these settings.<itemizedlist>
+ <listitem>
+ <para><computeroutput>--tracing-enabled on|off</computeroutput>:
+ Enable the tracebuffer. This consumes some memory for the tracebuffer
+ and adds extra overhead.</para>
+ </listitem>
+ <listitem>
+ <para><computeroutput>--tracing-config <config-string></computeroutput>:
+ Allows to configure tracing. In particular this defines which group of
+ tracepoints are enabled.</para>
+ </listitem>
+ </itemizedlist>
+ </para>
+ </sect2>
+
</sect1>
<sect1 id="vboxmanage-clonevm">
@@ -1618,7 +1722,7 @@ Virtual system 0:
network traffic by dumping it to a file, for debugging
purposes.</para>
- <para>With <computeroutput>--nictrace<1-N>
+ <para>With <computeroutput>nictrace<1-N>
on|off</computeroutput>, you can enable network tracing for a
particular virtual network card.</para>
@@ -1628,7 +1732,20 @@ Virtual system 0:
logged to.</para>
</listitem>
- <!-- @todo r=andy Document nicpromisc -->
+ <listitem>
+ <para><computeroutput>nicpromisc<1-N>
+ deny|allow-vms|allow-all</computeroutput>:
+ This allows you, for each of the VM's virtual network cards, to
+ specify how the promiscious mode is handled. This setting is only
+ relevant for bridged networking.
+ <computeroutput>deny</computeroutput> (default setting) hides
+ any traffic not intended for this VM.
+ <computeroutput>allow-vms</computeroutput> hides all host
+ traffic from this VM but allows the VM to see traffic from/to other
+ VMs.
+ <computeroutput>allow-all</computeroutput> removes this
+ restriction completely.</para>
+ </listitem>
<listitem>
<para><computeroutput>nicproperty<1-N>
@@ -1712,9 +1829,10 @@ Virtual system 0:
</listitem>
<listitem>
- <para><computeroutput>videocapscreens all|<screen ID> [<screen ID> ...]]</computeroutput>
- allows to specify which screens of the VM are being recorded. This setting
- cannot be changed while video capturing is enabled.</para>
+ <para><computeroutput>videocapscreens all|<screen ID> [<screen ID> ...]]</computeroutput>
+ allows to specify which screens of the VM are being recorded. This setting
+ cannot be changed while video capturing is enabled. Each screen is recorded
+ into a separate file.</para>
</listitem>
<listitem>
@@ -1724,20 +1842,20 @@ Virtual system 0:
</listitem>
<listitem>
- <para><computeroutput>videocapres <width> <height></computeroutput>
+ <para><computeroutput>videocapres <width> <height></computeroutput>
sets the resolution (in pixels) of the recorded video. This setting cannot be
changed while video capturing is enabled.</para>
</listitem>
<listitem> <!-- @todo r=andy Clarify rate. -->
- <para><computeroutput>videocaprate <rate></computeroutput> sets the
- bitrate in kilobits (kb) per second. Increasing this value makes the video
- look better for the cost of an increased file size. This setting cannot be
+ <para><computeroutput>videocaprate <rate></computeroutput> sets the
+ bitrate in kilobits (kb) per second. Increasing this value makes the video
+ look better for the cost of an increased file size. This setting cannot be
changed while video capturing is enabled.</para>
</listitem>
<listitem>
- <para><computeroutput>videocapfps <fps></computeroutput> sets the
+ <para><computeroutput>videocapfps <fps></computeroutput> sets the
maximum number of frames per second (FPS) to be recorded. Frames with a
higher frequency will be skipped. Reducing this value increases the number
of skipped frames and reduces the file size. This setting cannot be changed
@@ -1745,25 +1863,25 @@ Virtual system 0:
</listitem>
<listitem> <!-- @todo r=andy Clarify time format. -->
- <para><computeroutput>videocapmaxtime <time></computeroutput> sets
- the maximum time the video capturing will take place since activation.
- The capturing stops when the defined time interval has elapsed. If this
- value is zero the capturing is not limited by time. This setting cannot
+ <para><computeroutput>videocapmaxtime <time></computeroutput> sets
+ the maximum time the video capturing will take place since activation.
+ The capturing stops when the defined time interval has elapsed. If this
+ value is zero the capturing is not limited by time. This setting cannot
be changed while video capturing is enabled.</para>
</listitem>
<listitem>
<para><computeroutput>videocapmaxsize <MB></computeroutput> limits
the maximum size of the captured video file (in MB). The capturing stops
- when file size has reached the specified size. If this value is zero
+ when file size has reached the specified size. If this value is zero
the capturing will not be limited by file size. This setting cannot be
changed while video capturing is enabled.</para>
</listitem>
<listitem>
<para><computeroutput>videocapopts <key=value> [<key=value> ...]</computeroutput>
- can be used to specify additional video capturing options. These options
- only are for advanced users and must be specified in a comma-separated
+ can be used to specify additional video capturing options. These options
+ only are for advanced users and must be specified in a comma-separated
key=value format, e.g. <computeroutput>foo=bar,a=b</computeroutput>.
This setting cannot be changed while video capturing is enabled.</para>
</listitem>
@@ -4338,7 +4456,7 @@ Value: 2006.01.01</screen>
</glosslist>
</sect1>
- <sect1>
+ <sect1 id="vboxmanage-hostonlyif">
<title>VBoxManage hostonlyif</title>
<para>With "hostonlyif" you can change the IP configuration of a host-only
@@ -4346,6 +4464,31 @@ Value: 2006.01.01</screen>
refer to <xref linkend="network_hostonly" />. Each host-only interface is
identified by a name and can either use the internal DHCP server or a
manual IP configuration (both IP4 and IP6).</para>
+
+ <para>The following list summarizes the available subcommands:</para>
+
+ <glosslist>
+ <glossentry>
+ <glossterm><computeroutput>ipconfig "<name>"</computeroutput></glossterm>
+ <glossdef>
+ <para>Configure a hostonly interface</para>
+ </glossdef>
+ </glossentry>
+ <glossentry>
+ <glossterm><computeroutput>create</computeroutput></glossterm>
+ <glossdef>
+ <para>Ceates a new vboxnet<N> interface on the host OS.
+ This command is essential before you can attach VMs to host-only network.</para>
+ </glossdef>
+ </glossentry>
+ <glossentry>
+ <glossterm><computeroutput>remove vboxnet<N></computeroutput></glossterm>
+ <glossdef>
+ <para>Removes a vboxnet<N> interface from the host OS.</para>
+ </glossdef>
+ </glossentry>
+ </glosslist>
+
</sect1>
<sect1 id="vboxmanage-dhcpserver">
diff --git a/doc/manual/user_ChangeLogImpl.xml b/doc/manual/user_ChangeLogImpl.xml
index 21f8612..8b17dbb 100644
--- a/doc/manual/user_ChangeLogImpl.xml
+++ b/doc/manual/user_ChangeLogImpl.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<sect1>
- <title>Version 5.0.0 Beta 1 (2015-04-01)</title>
+ <title>Version 5.0.0 Beta 3 (2015-05-07)</title>
<para>This is a major update. The following major new features
were added:</para>
@@ -78,6 +78,11 @@
</listitem>
<listitem>
+ <para>GUI: take the guest screen aspect ratio into account for the
+ preview window</para>
+ </listitem>
+
+ <listitem>
<para>VMM: improved timing on Solaris hosts with older VT-x hosts
without preemption timers</para>
</listitem>
@@ -135,6 +140,42 @@
<para>3D: fixed a possible memory leak in the host service</para>
</listitem>
+ <listitem>
+ <para>Serial: new TCP/IP backend (see <xref linkend="serialports"/>)</para>
+ </listitem>
+
+ <listitem>
+ <para>Storage: added USB mass storage device class
+ (see <xref linkend="harddiskcontrollers"/>)</para>
+ </listitem>
+
+ <listitem>
+ <para>BIOS: fix for booting from SCSI CD/DVD media</para>
+ </listitem>
+
+ <listitem>
+ <para>BIOS: fix for reads partially beyond end of disk (bug #14021)</para>
+ </listitem>
+
+ <listitem>
+ <para>VRDP: fixed listening for IPv6 on some systems (bug #14038)</para>
+ </listitem>
+
+ <listitem>
+ <para>rdesktop-vrdp: upgraded to version 1.8.3</para>
+ </listitem>
+
+ <listitem>
+ <para>Guest Additions: added a heartbeat service
+ (see <xref linkend="heartbeatservice" />)</para>
+ </listitem>
+
+ <listitem>
+ <para>Windows Additions/WDDM: improved video memory utilization and
+ allow more/bigger guest screens with large resolutions (including HiDPI
+ </para>
+ </listitem>
+
</itemizedlist>
</sect1>
diff --git a/include/VBox/GuestHost/DragAndDrop.h b/include/VBox/GuestHost/DragAndDrop.h
index 2f252bd..f31ef15 100644
--- a/include/VBox/GuestHost/DragAndDrop.h
+++ b/include/VBox/GuestHost/DragAndDrop.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2014 Oracle Corporation
+ * Copyright (C) 2014-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -29,6 +29,7 @@
#include <iprt/assert.h>
#include <iprt/cdefs.h>
+#include <iprt/dir.h>
#include <iprt/err.h>
#include <iprt/file.h>
#include <iprt/types.h>
@@ -36,8 +37,31 @@
#include <iprt/cpp/list.h>
#include <iprt/cpp/ministring.h>
-int DnDDirCreateDroppedFilesEx(const char *pszPath, char *pszDropDir, size_t cbDropDir);
-int DnDDirCreateDroppedFiles(char *pszDropDir, size_t cbDropDir);
+/**
+ * Structure for maintaining a "dropped files" directory
+ * on the host or guest. This will contain all received files & directories
+ * for a single transfer.
+ */
+typedef struct DNDDIRDROPPEDFILES
+{
+ /** Directory handle for drop directory. */
+ PRTDIR hDir;
+ /** Absolute path to drop directory. */
+ RTCString strPathAbs;
+ /** List for holding created directories in the case of a rollback. */
+ RTCList<RTCString> lstDirs;
+ /** List for holding created files in the case of a rollback. */
+ RTCList<RTCString> lstFiles;
+
+} DNDDIRDROPPEDFILES, *PDNDDIRDROPPEDFILES;
+
+int DnDDirDroppedAddFile(PDNDDIRDROPPEDFILES pDir, const char *pszFile);
+int DnDDirDroppedAddDir(PDNDDIRDROPPEDFILES pDir, const char *pszDir);
+int DnDDirDroppedFilesCreateAndOpenEx(const char *pszPath, PDNDDIRDROPPEDFILES pDir);
+int DnDDirDroppedFilesCreateAndOpenTemp(PDNDDIRDROPPEDFILES pDir);
+int DnDDirDroppedFilesClose(PDNDDIRDROPPEDFILES pDir, bool fRemove);
+const char *DnDDirDroppedFilesGetDirAbs(PDNDDIRDROPPEDFILES pDir);
+int DnDDirDroppedFilesRollback(PDNDDIRDROPPEDFILES pDir);
bool DnDMIMEHasFileURLs(const char *pcszFormat, size_t cchFormatMax);
bool DnDMIMENeedsDropDir(const char *pcszFormat, size_t cchFormatMax);
@@ -59,25 +83,46 @@ public:
Directory
};
+ enum Dest
+ {
+ Source = 0,
+ Target
+ };
+
+ DnDURIObject(void);
DnDURIObject(Type type,
- const RTCString &strSrcPath,
- const RTCString &strDstPath,
- uint32_t fMode, uint64_t cbSize);
+ const RTCString &strSrcPath = "",
+ const RTCString &strDstPath = "",
+ uint32_t fMode = 0, uint64_t cbSize = 0);
virtual ~DnDURIObject(void);
public:
const RTCString &GetSourcePath(void) const { return m_strSrcPath; }
- const RTCString &GetDestPath(void) const { return m_strDstPath; }
+ const RTCString &GetDestPath(void) const { return m_strTgtPath; }
uint32_t GetMode(void) const { return m_fMode; }
+ uint64_t GetProcessed(void) const { return m_cbProcessed; }
uint64_t GetSize(void) const { return m_cbSize; }
Type GetType(void) const { return m_Type; }
public:
+ int SetSize(uint64_t uSize) { m_cbSize = uSize; return VINF_SUCCESS; }
+
+public:
+
+ void Close(void);
bool IsComplete(void) const;
- static int RebaseURIPath(RTCString &strPath, const RTCString &strBaseOld, const RTCString &strBaseNew);
- int Read(void *pvBuf, uint32_t cbToRead, uint32_t *pcbRead);
+ bool IsOpen(void) const;
+ int Open(Dest enmDest, uint64_t fOpen, uint32_t fMode = 0);
+ int OpenEx(const RTCString &strPath, Type enmType, Dest enmDest, uint64_t fOpen = 0, uint32_t fMode = 0, uint32_t fFlags = 0);
+ int Read(void *pvBuf, size_t cbBuf, uint32_t *pcbRead);
+ void Reset(void);
+ int Write(const void *pvBuf, size_t cbBuf, uint32_t *pcbWritten);
+
+public:
+
+ static int RebaseURIPath(RTCString &strPath, const RTCString &strBaseOld = "", const RTCString &strBaseNew = "");
protected:
@@ -87,7 +132,8 @@ protected:
Type m_Type;
RTCString m_strSrcPath;
- RTCString m_strDstPath;
+ RTCString m_strTgtPath;
+ /** Object (file/directory) mode. */
uint32_t m_fMode;
/** Size (in bytes) to read/write. */
uint64_t m_cbSize;
@@ -121,8 +167,9 @@ public:
bool IsEmpty(void) { return m_lstTree.isEmpty(); }
void RemoveFirst(void);
int RootFromURIData(const void *pvData, size_t cbData, uint32_t fFlags);
- RTCString RootToString(const RTCString &strBasePath = "", const RTCString &strSeparator = "\r\n");
+ RTCString RootToString(const RTCString &strPathBase = "", const RTCString &strSeparator = "\r\n");
size_t RootCount(void) { return m_lstRoot.size(); }
+ uint32_t TotalCount(void) { return m_cTotal; }
size_t TotalBytes(void) { return m_cbTotal; }
protected:
@@ -137,6 +184,8 @@ protected:
RTCList<RTCString> m_lstRoot;
/** List of all URI objects added. */
RTCList<DnDURIObject> m_lstTree;
+ /** Total number of all URI objects. */
+ uint32_t m_cTotal;
/** Total size of all URI objects, that is, the file
* size of all objects (in bytes). */
size_t m_cbTotal;
diff --git a/include/VBox/HGSMI/HGSMI.h b/include/VBox/HGSMI/HGSMI.h
index ce2b1e1..a258951 100644
--- a/include/VBox/HGSMI/HGSMI.h
+++ b/include/VBox/HGSMI/HGSMI.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -71,28 +71,12 @@
* * the channel information.
*/
-/* Heap types. */
-#define HGSMI_HEAP_TYPE_NULL 0 /* Heap not initialized. */
-#define HGSMI_HEAP_TYPE_POINTER 1 /* Deprecated. RTHEAPSIMPLE. */
-#define HGSMI_HEAP_TYPE_OFFSET 2 /* Deprecated. RTHEAPOFFSET. */
-#define HGSMI_HEAP_TYPE_MA 3 /* Memory allocator. */
-
-#pragma pack(1)
typedef struct HGSMIHEAP
{
- union
- {
- HGSMIMADATA ma; /* Memory Allocator */
- RTHEAPSIMPLE hPtr; /* Pointer based heap. */
- RTHEAPOFFSET hOff; /* Offset based heap. */
- } u;
- HGSMIAREA area; /* Description. */
- int cRefs; /* Number of heap allocations. */
- uint32_t u32HeapType; /* HGSMI_HEAP_TYPE_* */
+ HGSMIAREA area; /* Description. */
+ HGSMIMADATA ma; /* Memory allocator */
} HGSMIHEAP;
-#pragma pack()
-#pragma pack(1)
/* The size of the array of channels. Array indexes are uint8_t. Note: the value must not be changed. */
#define HGSMI_NUMBER_OF_CHANNELS 0x100
@@ -122,34 +106,39 @@ typedef struct _HGSMICHANNELINFO
* The array is accessed under the instance lock.
*/
} HGSMICHANNELINFO;
-#pragma pack()
RT_C_DECLS_BEGIN
-DECLINLINE(HGSMISIZE) HGSMIBufferMinimumSize (void)
+DECLINLINE(HGSMIBUFFERHEADER *) HGSMIBufferHeaderFromPtr(void *pvBuffer)
+{
+ return (HGSMIBUFFERHEADER *)pvBuffer;
+}
+
+DECLINLINE(uint8_t *) HGSMIBufferDataFromPtr(void *pvBuffer)
{
- return sizeof (HGSMIBUFFERHEADER) + sizeof (HGSMIBUFFERTAIL);
+ return (uint8_t *)pvBuffer + sizeof(HGSMIBUFFERHEADER);
}
-DECLINLINE(uint8_t *) HGSMIBufferData (const HGSMIBUFFERHEADER *pHeader)
+DECLINLINE(HGSMIBUFFERTAIL *) HGSMIBufferTailFromPtr(void *pvBuffer,
+ uint32_t u32DataSize)
{
- return (uint8_t *)pHeader + sizeof (HGSMIBUFFERHEADER);
+ return (HGSMIBUFFERTAIL *)(HGSMIBufferDataFromPtr(pvBuffer) + u32DataSize);
}
-DECLINLINE(HGSMIBUFFERTAIL *) HGSMIBufferTail (const HGSMIBUFFERHEADER *pHeader)
+DECLINLINE(HGSMISIZE) HGSMIBufferMinimumSize(void)
{
- return (HGSMIBUFFERTAIL *)(HGSMIBufferData (pHeader) + pHeader->u32DataSize);
+ return sizeof(HGSMIBUFFERHEADER) + sizeof(HGSMIBUFFERTAIL);
}
-DECLINLINE(HGSMIBUFFERHEADER *) HGSMIBufferHeaderFromData (const void *pvData)
+DECLINLINE(HGSMIBUFFERHEADER *) HGSMIBufferHeaderFromData(const void *pvData)
{
- return (HGSMIBUFFERHEADER *)((uint8_t *)pvData - sizeof (HGSMIBUFFERHEADER));
+ return (HGSMIBUFFERHEADER *)((uint8_t *)pvData - sizeof(HGSMIBUFFERHEADER));
}
-DECLINLINE(HGSMISIZE) HGSMIBufferRequiredSize (uint32_t u32DataSize)
+DECLINLINE(HGSMISIZE) HGSMIBufferRequiredSize(uint32_t u32DataSize)
{
- return HGSMIBufferMinimumSize () + u32DataSize;
+ return HGSMIBufferMinimumSize() + u32DataSize;
}
DECLINLINE(HGSMIOFFSET) HGSMIPointerToOffset(const HGSMIAREA *pArea,
@@ -164,39 +153,39 @@ DECLINLINE(void *) HGSMIOffsetToPointer(const HGSMIAREA *pArea,
return pArea->pu8Base + (offBuffer - pArea->offBase);
}
-DECLINLINE(uint8_t *) HGSMIBufferDataFromOffset (const HGSMIAREA *pArea, HGSMIOFFSET offBuffer)
+DECLINLINE(uint8_t *) HGSMIBufferDataFromOffset(const HGSMIAREA *pArea,
+ HGSMIOFFSET offBuffer)
{
- HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIOffsetToPointer(pArea, offBuffer);
- Assert(pHeader);
- if(pHeader)
- return HGSMIBufferData(pHeader);
- return NULL;
+ void *pvBuffer = HGSMIOffsetToPointer(pArea, offBuffer);
+ return HGSMIBufferDataFromPtr(pvBuffer);
}
-DECLINLINE(uint8_t *) HGSMIBufferDataAndChInfoFromOffset (const HGSMIAREA *pArea, HGSMIOFFSET offBuffer, uint16_t * pChInfo)
+DECLINLINE(HGSMIOFFSET) HGSMIBufferOffsetFromData(const HGSMIAREA *pArea,
+ void *pvData)
{
- HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIOffsetToPointer (pArea, offBuffer);
- Assert(pHeader);
- if(pHeader)
- {
- *pChInfo = pHeader->u16ChannelInfo;
- return HGSMIBufferData(pHeader);
- }
- return NULL;
+ HGSMIBUFFERHEADER *pHeader = HGSMIBufferHeaderFromData(pvData);
+ return HGSMIPointerToOffset(pArea, pHeader);
}
-HGSMICHANNEL *HGSMIChannelFindById (HGSMICHANNELINFO * pChannelInfo, uint8_t u8Channel);
+DECLINLINE(uint8_t *) HGSMIBufferDataAndChInfoFromOffset(const HGSMIAREA *pArea,
+ HGSMIOFFSET offBuffer,
+ uint16_t *pu16ChannelInfo)
+{
+ HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIOffsetToPointer(pArea, offBuffer);
+ *pu16ChannelInfo = pHeader->u16ChannelInfo;
+ return HGSMIBufferDataFromPtr(pHeader);
+}
-uint32_t HGSMIChecksum (HGSMIOFFSET offBuffer,
- const HGSMIBUFFERHEADER *pHeader,
- const HGSMIBUFFERTAIL *pTail);
+uint32_t HGSMIChecksum(HGSMIOFFSET offBuffer,
+ const HGSMIBUFFERHEADER *pHeader,
+ const HGSMIBUFFERTAIL *pTail);
-int HGSMIAreaInitialize (HGSMIAREA *pArea,
- void *pvBase,
- HGSMISIZE cbArea,
- HGSMIOFFSET offBase);
+int HGSMIAreaInitialize(HGSMIAREA *pArea,
+ void *pvBase,
+ HGSMISIZE cbArea,
+ HGSMIOFFSET offBase);
-void HGSMIAreaClear (HGSMIAREA *pArea);
+void HGSMIAreaClear(HGSMIAREA *pArea);
DECLINLINE(bool) HGSMIAreaContainsOffset(const HGSMIAREA *pArea, HGSMIOFFSET off)
{
@@ -208,98 +197,67 @@ DECLINLINE(bool) HGSMIAreaContainsPointer(const HGSMIAREA *pArea, const void *pv
return (uintptr_t)pv >= (uintptr_t)pArea->pu8Base && (uintptr_t)pv - (uintptr_t)pArea->pu8Base < pArea->cbArea;
}
-HGSMIOFFSET HGSMIBufferInitializeSingle (const HGSMIAREA *pArea,
- HGSMIBUFFERHEADER *pHeader,
- HGSMISIZE cbBuffer,
- uint8_t u8Channel,
- uint16_t u16ChannelInfo);
-
-int HGSMIHeapSetup (HGSMIHEAP *pHeap,
- uint32_t u32HeapType,
- void *pvBase,
- HGSMISIZE cbArea,
- HGSMIOFFSET offBase,
- const HGSMIENV *pEnv);
-
-int HGSMIHeapRelocate (HGSMIHEAP *pHeap,
- uint32_t u32HeapType,
- void *pvBase,
- uint32_t offHeapHandle,
- uintptr_t offDelta,
- HGSMISIZE cbArea,
- HGSMIOFFSET offBase);
-
-int HGSMIHeapRestoreMA(HGSMIHEAP *pHeap,
- void *pvBase,
- HGSMISIZE cbArea,
- HGSMIOFFSET offBase,
- uint32_t cBlocks,
- HGSMIOFFSET *paDescriptors,
- HGSMISIZE cbMaxBlock,
- HGSMIENV *pEnv);
-
-void HGSMIHeapSetupUninitialized (HGSMIHEAP *pHeap);
-
-void HGSMIHeapDestroy (HGSMIHEAP *pHeap);
-
-void* HGSMIHeapBufferAlloc (HGSMIHEAP *pHeap,
- HGSMISIZE cbBuffer);
+HGSMIOFFSET HGSMIBufferInitializeSingle(const HGSMIAREA *pArea,
+ HGSMIBUFFERHEADER *pHeader,
+ HGSMISIZE cbBuffer,
+ uint8_t u8Channel,
+ uint16_t u16ChannelInfo);
+
+int HGSMIHeapSetup(HGSMIHEAP *pHeap,
+ void *pvBase,
+ HGSMISIZE cbArea,
+ HGSMIOFFSET offBase,
+ const HGSMIENV *pEnv);
+
+void HGSMIHeapDestroy(HGSMIHEAP *pHeap);
+
+void *HGSMIHeapBufferAlloc(HGSMIHEAP *pHeap,
+ HGSMISIZE cbBuffer);
void HGSMIHeapBufferFree(HGSMIHEAP *pHeap,
- void *pvBuf);
+ void *pvBuf);
-void *HGSMIHeapAlloc (HGSMIHEAP *pHeap,
- HGSMISIZE cbData,
- uint8_t u8Channel,
- uint16_t u16ChannelInfo);
+void *HGSMIHeapAlloc(HGSMIHEAP *pHeap,
+ HGSMISIZE cbData,
+ uint8_t u8Channel,
+ uint16_t u16ChannelInfo);
-HGSMIOFFSET HGSMIHeapBufferOffset (HGSMIHEAP *pHeap,
- void *pvData);
+void HGSMIHeapFree(HGSMIHEAP *pHeap,
+ void *pvData);
-void HGSMIHeapFree (HGSMIHEAP *pHeap,
- void *pvData);
+DECLINLINE(const HGSMIAREA *) HGSMIHeapArea(HGSMIHEAP *pHeap)
+{
+ return &pHeap->area;
+}
DECLINLINE(HGSMIOFFSET) HGSMIHeapOffset(HGSMIHEAP *pHeap)
{
- return pHeap->area.offBase;
+ return HGSMIHeapArea(pHeap)->offBase;
}
-#ifdef IN_RING3
-/* Needed for heap relocation: offset of the heap handle relative to the start of heap area. */
-DECLINLINE(HGSMIOFFSET) HGSMIHeapHandleLocationOffset(HGSMIHEAP *pHeap)
+DECLINLINE(HGSMISIZE) HGSMIHeapSize(HGSMIHEAP *pHeap)
{
- HGSMIOFFSET offHeapHandle;
- if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_POINTER)
- {
- offHeapHandle = (HGSMIOFFSET)((uintptr_t)pHeap->u.hPtr - (uintptr_t)pHeap->area.pu8Base);
- }
- else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
- {
- offHeapHandle = (HGSMIOFFSET)((uintptr_t)pHeap->u.hOff - (uintptr_t)pHeap->area.pu8Base);
- }
- else
- {
- offHeapHandle = HGSMIOFFSET_VOID;
- }
- return offHeapHandle;
+ return HGSMIHeapArea(pHeap)->cbArea;
}
-#endif /* IN_RING3 */
-DECLINLINE(HGSMISIZE) HGSMIHeapSize(HGSMIHEAP *pHeap)
+DECLINLINE(HGSMIOFFSET) HGSMIHeapBufferOffset(HGSMIHEAP *pHeap,
+ void *pvData)
{
- return pHeap->area.cbArea;
+ return HGSMIBufferOffsetFromData(HGSMIHeapArea(pHeap), pvData);
}
-int HGSMIChannelRegister (HGSMICHANNELINFO * pChannelInfo,
- uint8_t u8Channel,
- const char *pszName,
- PFNHGSMICHANNELHANDLER pfnChannelHandler,
- void *pvChannelHandler,
- HGSMICHANNELHANDLER *pOldHandler);
+HGSMICHANNEL *HGSMIChannelFindById(HGSMICHANNELINFO *pChannelInfo,
+ uint8_t u8Channel);
+
+int HGSMIChannelRegister(HGSMICHANNELINFO *pChannelInfo,
+ uint8_t u8Channel,
+ const char *pszName,
+ PFNHGSMICHANNELHANDLER pfnChannelHandler,
+ void *pvChannelHandler);
-int HGSMIBufferProcess (HGSMIAREA *pArea,
- HGSMICHANNELINFO * pChannelInfo,
- HGSMIOFFSET offBuffer);
+int HGSMIBufferProcess(const HGSMIAREA *pArea,
+ HGSMICHANNELINFO *pChannelInfo,
+ HGSMIOFFSET offBuffer);
RT_C_DECLS_END
#endif /* !___VBox_HGSMI_HGSMI_h */
diff --git a/include/VBox/HostServices/DragAndDropSvc.h b/include/VBox/HostServices/DragAndDropSvc.h
index 784ad9b..ab102b0 100644
--- a/include/VBox/HostServices/DragAndDropSvc.h
+++ b/include/VBox/HostServices/DragAndDropSvc.h
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -26,6 +26,7 @@
#ifndef ___VBox_HostService_DragAndDropSvc_h
#define ___VBox_HostService_DragAndDropSvc_h
+#include <VBox/hgcmsvc.h>
#include <VBox/VMMDev.h>
#include <VBox/VBoxGuest2.h>
@@ -85,27 +86,40 @@ namespace DragAndDropSvc {
*/
enum eHostFn
{
+ /** The host just has set a new DnD mode. */
HOST_DND_SET_MODE = 100,
/*
* Host -> Guest messages
*/
+ /** The host entered the VM window for starting an actual
+ * DnD operation. */
HOST_DND_HG_EVT_ENTER = 200,
+ /** The host's DnD cursor moved within the VM window. */
HOST_DND_HG_EVT_MOVE = 201,
+ /** The host left the guest VM window. */
HOST_DND_HG_EVT_LEAVE = 202,
+ /** The host issued a "drop" event, meaning that the host is
+ * ready to transfer data over to the guest. */
HOST_DND_HG_EVT_DROPPED = 203,
+ /** The host requested to cancel the current DnD operation. */
HOST_DND_HG_EVT_CANCEL = 204,
/** Gets the actual MIME data, based on
- * the format(s) specified by HOST_DND_HG_EVT_ENTER. */
+ * the format(s) specified by HOST_DND_HG_EVT_ENTER. If the guest
+ * supplied buffer too small to send the actual data, the host
+ * will send a HOST_DND_HG_SND_MORE_DATA message as follow-up. */
HOST_DND_HG_SND_DATA = 205,
/** Sent when the actual buffer for HOST_DND_HG_SND_DATA
* was too small, issued by the DnD host service. */
HOST_DND_HG_SND_MORE_DATA = 206,
- /** Directory entry to be handled on the guest. */
+ /** Directory entry to be sent to the guest. */
HOST_DND_HG_SND_DIR = 207,
- /** File entry to be handled on the guest. */
- HOST_DND_HG_SND_FILE = 208,
+ /** File data chunk to send to the guest. */
+ HOST_DND_HG_SND_FILE_DATA = 208,
+ /** File header to send to the guest.
+ * Note: Only for protocol version 2 and up (>= VBox 5.0). */
+ HOST_DND_HG_SND_FILE_HDR = 209,
/*
* Guest -> Host messages
@@ -117,26 +131,39 @@ enum eHostFn
/** The host informs the guest that a DnD drop operation
* has been started and that the host wants the data in
* a specific MIME type. */
- HOST_DND_GH_EVT_DROPPED,
-
+ HOST_DND_GH_EVT_DROPPED = 601,
+ /** Creates a directory on the guest. */
HOST_DND_GH_RECV_DIR = 650,
- HOST_DND_GH_RECV_FILE = 670
+ /** Retrieves file data from the guest. */
+ HOST_DND_GH_RECV_FILE_DATA = 670,
+ /** Retrieves a file header from the guest.
+ * Note: Only for protocol version 2 and up (>= VBox 5.0). */
+ HOST_DND_GH_RECV_FILE_HDR = 671,
+ /** Blow the type up to 32-bit. */
+ HOST_DND_32BIT_HACK = 0x7fffffff
};
/**
* The service functions which are called by guest.
* Note: When adding new functions to this table, make sure that the actual ID
- * does *not* overlap with the eGuestFn enumeration above!
+ * does *not* overlap with the eHostFn enumeration above!
*/
enum eGuestFn
{
+ /* Guest sends a connection request to the HGCM service.
+ * Note: New since protocol version 2. */
+ GUEST_DND_CONNECT = 10,
+
/**
* Guest waits for a new message the host wants to process
* on the guest side. This can be a blocking call.
*/
GUEST_DND_GET_NEXT_HOST_MSG = 300,
- /* H->G */
+ /*
+ * Host -> Guest operation messages.
+ */
+
/** The guest acknowledges that the pending DnD data from
* the host can be dropped on the currently selected source
* on the guest. */
@@ -144,9 +171,13 @@ enum eGuestFn
/** The guest requests the actual DnD data to be sent
* from the host. */
GUEST_DND_HG_REQ_DATA = 401,
+ /** Reports back the guest's progress on a host -> guest operation. */
GUEST_DND_HG_EVT_PROGRESS = 402,
- /* G->H */
+ /*
+ * Guest -> Host operation messages.
+ */
+
/**
* The guests acknowledges that it currently has a drag'n drop
* operation in progress on the guest, which eventually could be
@@ -159,22 +190,35 @@ enum eGuestFn
* into one.
*/
GUEST_DND_GH_SND_DATA = 501,
+ /** Reports an error back to the host. */
GUEST_DND_GH_EVT_ERROR = 502,
-
+ /** Guest sends a directory entry to the host. */
GUEST_DND_GH_SND_DIR = 700,
- GUEST_DND_GH_SND_FILE = 701
+ /** Guest sends file data to the host. */
+ /* Note: On protocol version 1 this also contains the file name
+ * and other attributes. */
+ GUEST_DND_GH_SND_FILE_DATA = 701,
+ /** Guest sends a file header to the host, marking the
+ * beginning of a (new) file transfer.
+ * Note: Available since protocol version 2 (VBox 5.0). */
+ GUEST_DND_GH_SND_FILE_HDR = 702,
+ /** Blow the type up to 32-bit. */
+ GUEST_DND_32BIT_HACK = 0x7fffffff
};
/**
- * The possible states for the progress operations.
+ * DnD operation progress states.
*/
-enum
+typedef enum DNDPROGRESS
{
- DND_PROGRESS_RUNNING = 1,
+ DND_PROGRESS_UNKNOWN = 0,
+ DND_PROGRESS_RUNNING = 1,
DND_PROGRESS_COMPLETE,
DND_PROGRESS_CANCELLED,
- DND_PROGRESS_ERROR
-};
+ DND_PROGRESS_ERROR,
+ /** Blow the type up to 32-bit. */
+ DND_PROGRESS_32BIT_HACK = 0x7fffffff
+} DNDPROGRESS, *PDNDPROGRESS;
#pragma pack (1)
@@ -272,22 +316,68 @@ typedef struct VBOXDNDHGSENDDIRMSG
HGCMFunctionParameter fMode; /* OUT uint32_t */
} VBOXDNDHGSENDDIRMSG;
-typedef struct VBOXDNDHGSENDFILEMSG
+/**
+ * File header event.
+ * Note: Only for protocol version 2 and up.
+ *
+ * Used by:
+ * HOST_DND_HG_SND_FILE_HDR
+ * HOST_DND_GH_SND_FILE_HDR
+ */
+typedef struct VBOXDNDHGSENDFILEHDRMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * HG File event.
- *
- * Used by:
- * HOST_DND_HG_SND_FILE
- */
+ /** Context ID. Unused at the moment. */
+ HGCMFunctionParameter uContext; /* OUT uint32_t */
+ /** File path. */
HGCMFunctionParameter pvName; /* OUT ptr */
+ /** Size (in bytes) of file path. */
HGCMFunctionParameter cbName; /* OUT uint32_t */
- HGCMFunctionParameter pvData; /* OUT ptr */
- HGCMFunctionParameter cbData; /* OUT uint32_t */
+ /** Optional flags; unused at the moment. */
+ HGCMFunctionParameter uFlags; /* OUT uint32_t */
+ /** File creation mode. */
HGCMFunctionParameter fMode; /* OUT uint32_t */
-} VBOXDNDHGSENDFILEMSG;
+ /** Total size (in bytes). */
+ HGCMFunctionParameter cbTotal; /* OUT uint64_t */
+
+} VBOXDNDHGSENDFILEHDRMSG;
+
+/**
+ * HG: File data (chunk) event.
+ *
+ * Used by:
+ * HOST_DND_HG_SND_FILE
+ */
+typedef struct VBOXDNDHGSENDFILEDATAMSG
+{
+ VBoxGuestHGCMCallInfo hdr;
+
+ union
+ {
+ /* Note: Protocol v1 sends the file name + file mode
+ * every time a file data chunk is being sent. */
+ struct
+ {
+ HGCMFunctionParameter pvName; /* OUT ptr */
+ HGCMFunctionParameter cbName; /* OUT uint32_t */
+ HGCMFunctionParameter pvData; /* OUT ptr */
+ HGCMFunctionParameter cbData; /* OUT uint32_t */
+ HGCMFunctionParameter fMode; /* OUT uint32_t */
+ } v1;
+ struct
+ {
+ /** Note: pvName is now part of the VBOXDNDHGSENDFILEHDRMSG message. */
+ /** Note: cbName is now part of the VBOXDNDHGSENDFILEHDRMSG message. */
+ /** Context ID. Unused at the moment. */
+ HGCMFunctionParameter uContext; /* OUT uint32_t */
+ HGCMFunctionParameter pvData; /* OUT ptr */
+ HGCMFunctionParameter cbData; /* OUT uint32_t */
+ /** Note: fMode is now part of the VBOXDNDHGSENDFILEHDRMSG message. */
+ } v2;
+ } u;
+
+} VBOXDNDHGSENDFILEDATAMSG;
typedef struct VBOXDNDGHREQPENDINGMSG
{
@@ -321,17 +411,17 @@ typedef struct VBOXDNDGHDROPPEDMSG
* Guest events
*/
+/**
+ * The returned command the host wants to
+ * run on the guest.
+ *
+ * Used by:
+ * GUEST_DND_GET_NEXT_HOST_MSG
+ */
typedef struct VBOXDNDNEXTMSGMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * The returned command the host wants to
- * run on the guest.
- *
- * Used by:
- * GUEST_DND_GET_NEXT_HOST_MSG
- */
HGCMFunctionParameter msg; /* OUT uint32_t */
/** Number of parameters the message needs. */
HGCMFunctionParameter num_parms; /* OUT uint32_t */
@@ -341,57 +431,84 @@ typedef struct VBOXDNDNEXTMSGMSG
} VBOXDNDNEXTMSGMSG;
+/**
+ * Connection request. Used to tell the DnD protocol
+ * version to the (host) service.
+ *
+ * Used by:
+ * GUEST_DND_CONNECT
+ */
+typedef struct VBOXDNDCONNECTPMSG
+{
+ VBoxGuestHGCMCallInfo hdr;
+
+ /** Protocol version to use. */
+ HGCMFunctionParameter uProtocol; /* OUT uint32_t */
+ /** Connection flags. Optional. */
+ HGCMFunctionParameter uFlags; /* OUT uint32_t */
+
+} VBOXDNDCONNECTPMSG;
+
+/**
+ * HG Acknowledge Operation event.
+ *
+ * Used by:
+ * GUEST_DND_HG_ACK_OP
+ */
typedef struct VBOXDNDHGACKOPMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * HG Acknowledge Operation event.
- *
- * Used by:
- * GUEST_DND_HG_ACK_OP
- */
HGCMFunctionParameter uAction; /* OUT uint32_t */
} VBOXDNDHGACKOPMSG;
+/**
+ * HG request for data event.
+ *
+ * Used by:
+ * GUEST_DND_HG_REQ_DATA
+ */
typedef struct VBOXDNDHGREQDATAMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * HG request for data event.
- *
- * Used by:
- * GUEST_DND_HG_REQ_DATA
- */
HGCMFunctionParameter pFormat; /* OUT ptr */
} VBOXDNDHGREQDATAMSG;
+typedef struct VBOXDNDHGEVTPROGRESSMSG
+{
+ VBoxGuestHGCMCallInfo hdr;
+
+ HGCMFunctionParameter uStatus;
+ HGCMFunctionParameter uPercent;
+ HGCMFunctionParameter rc;
+} VBOXDNDHGEVTPROGRESSMSG;
+
+/**
+ * GH Acknowledge Pending event.
+ *
+ * Used by:
+ * GUEST_DND_GH_ACK_PENDING
+ */
typedef struct VBOXDNDGHACKPENDINGMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * GH Acknowledge Pending event.
- *
- * Used by:
- * GUEST_DND_GH_ACK_PENDING
- */
HGCMFunctionParameter uDefAction; /* OUT uint32_t */
HGCMFunctionParameter uAllActions; /* OUT uint32_t */
HGCMFunctionParameter pFormat; /* OUT ptr */
} VBOXDNDGHACKPENDINGMSG;
+/**
+ * GH Send Data event.
+ *
+ * Used by:
+ * GUEST_DND_GH_SND_DATA
+ */
typedef struct VBOXDNDGHSENDDATAMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * GH Send Data event.
- *
- * Used by:
- * GUEST_DND_GH_SND_DATA
- */
HGCMFunctionParameter pvData; /* OUT ptr */
/** Total bytes to send. This can be more than
* the data block specified in pvData above, e.g.
@@ -399,49 +516,77 @@ typedef struct VBOXDNDGHSENDDATAMSG
HGCMFunctionParameter cbTotalBytes; /* OUT uint32_t */
} VBOXDNDGHSENDDATAMSG;
+/**
+ * GH Directory event.
+ *
+ * Used by:
+ * GUEST_DND_GH_SND_DIR
+ */
typedef struct VBOXDNDGHSENDDIRMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * GH Directory event.
- *
- * Used by:
- * GUEST_DND_HG_SND_DIR
- */
HGCMFunctionParameter pvName; /* OUT ptr */
HGCMFunctionParameter cbName; /* OUT uint32_t */
HGCMFunctionParameter fMode; /* OUT uint32_t */
} VBOXDNDGHSENDDIRMSG;
-typedef struct VBOXDNDGHSENDFILEMSG
+/**
+ * GH File header event.
+ * Note: Only for protocol version 2 and up.
+ *
+ * Used by:
+ * HOST_DND_GH_SND_FILE_HDR
+ */
+typedef struct VBOXDNDHGSENDFILEHDRMSG VBOXDNDGHSENDFILEHDRMSG;
+
+/**
+ * GH File data event.
+ *
+ * Used by:
+ * GUEST_DND_HG_SND_FILE_DATA
+ */
+typedef struct VBOXDNDGHSENDFILEDATAMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * GH File event.
- *
- * Used by:
- * GUEST_DND_HG_SND_FILE
- */
- HGCMFunctionParameter pvName; /* OUT ptr */
- HGCMFunctionParameter cbName; /* OUT uint32_t */
- HGCMFunctionParameter pvData; /* OUT ptr */
- HGCMFunctionParameter cbData; /* OUT uint32_t */
- HGCMFunctionParameter fMode; /* OUT uint32_t */
-} VBOXDNDGHSENDFILEMSG;
+ union
+ {
+ /* Note: Protocol v1 sends the file name + file mode
+ * every time a file data chunk is being sent. */
+ struct
+ {
+ HGCMFunctionParameter pvName; /* OUT ptr */
+ HGCMFunctionParameter cbName; /* OUT uint32_t */
+ HGCMFunctionParameter fMode; /* OUT uint32_t */
+ HGCMFunctionParameter pvData; /* OUT ptr */
+ HGCMFunctionParameter cbData; /* OUT uint32_t */
+ } v1;
+ struct
+ {
+ /** Note: pvName is now part of the VBOXDNDHGSENDFILEHDRMSG message. */
+ /** Note: cbName is now part of the VBOXDNDHGSENDFILEHDRMSG message. */
+ /** Context ID. Unused at the moment. */
+ HGCMFunctionParameter uContext; /* OUT uint32_t */
+ HGCMFunctionParameter pvData; /* OUT ptr */
+ HGCMFunctionParameter cbData; /* OUT uint32_t */
+ /** Note: fMode is now part of the VBOXDNDHGSENDFILEHDRMSG message. */
+ } v2;
+ } u;
+
+} VBOXDNDGHSENDFILEDATAMSG;
+/**
+ * GH Error event.
+ *
+ * Used by:
+ * GUEST_DND_GH_EVT_ERROR
+ */
typedef struct VBOXDNDGHEVTERRORMSG
{
VBoxGuestHGCMCallInfo hdr;
- /**
- * GH Error event.
- *
- * Used by:
- * GUEST_DND_GH_EVT_ERROR
- */
- HGCMFunctionParameter uRC; /* OUT uint32_t */
+ HGCMFunctionParameter rc; /* OUT uint32_t */
} VBOXDNDGHEVTERRORMSG;
#pragma pack()
@@ -451,102 +596,145 @@ typedef struct VBOXDNDGHEVTERRORMSG
*/
enum
{
- CB_MAGIC_DND_HG_ACK_OP = 0xe2100b93,
- CB_MAGIC_DND_HG_REQ_DATA = 0x5cb3faf9,
- CB_MAGIC_DND_HG_EVT_PROGRESS = 0x8c8a6956,
- CB_MAGIC_DND_GH_ACK_PENDING = 0xbe975a14,
- CB_MAGIC_DND_GH_SND_DATA = 0x4eb61bff,
- CB_MAGIC_DND_GH_SND_DIR = 0x411ca754,
- CB_MAGIC_DND_GH_SND_FILE = 0x65e35eaf,
- CB_MAGIC_DND_GH_EVT_ERROR = 0x117a87c4
+ CB_MAGIC_DND_HG_GET_NEXT_HOST_MSG = 0x19820126,
+ CB_MAGIC_DND_HG_GET_NEXT_HOST_MSG_DATA = 0x19850630,
+ CB_MAGIC_DND_HG_ACK_OP = 0xe2100b93,
+ CB_MAGIC_DND_HG_REQ_DATA = 0x5cb3faf9,
+ CB_MAGIC_DND_HG_EVT_PROGRESS = 0x8c8a6956,
+ CB_MAGIC_DND_GH_ACK_PENDING = 0xbe975a14,
+ CB_MAGIC_DND_GH_SND_DATA = 0x4eb61bff,
+ CB_MAGIC_DND_GH_SND_DIR = 0x411ca754,
+ CB_MAGIC_DND_GH_SND_FILE_HDR = 0x65e35eaf,
+ CB_MAGIC_DND_GH_SND_FILE_DATA = 0x19840804,
+ CB_MAGIC_DND_GH_EVT_ERROR = 0x117a87c4
};
typedef struct VBOXDNDCBHEADERDATA
{
/** Magic number to identify the structure. */
- uint32_t u32Magic;
+ uint32_t u32Magic;
/** Context ID to identify callback data. */
- uint32_t u32ContextID;
-} VBOXDNDCBHEADERDATA;
-typedef VBOXDNDCBHEADERDATA *PVBOXDNDCBHEADERDATA;
+ uint32_t u32ContextID;
+} VBOXDNDCBHEADERDATA, *PVBOXDNDCBHEADERDATA;
+
+typedef struct VBOXDNDCBHGGETNEXTHOSTMSG
+{
+ /** Callback data header. */
+ VBOXDNDCBHEADERDATA hdr;
+ uint32_t uMsg;
+ uint32_t cParms;
+} VBOXDNDCBHGGETNEXTHOSTMSG, *PVBOXDNDCBHGGETNEXTHOSTMSG;
+
+typedef struct VBOXDNDCBHGGETNEXTHOSTMSGDATA
+{
+ /** Callback data header. */
+ VBOXDNDCBHEADERDATA hdr;
+ uint32_t uMsg;
+ uint32_t cParms;
+ PVBOXHGCMSVCPARM paParms;
+} VBOXDNDCBHGGETNEXTHOSTMSGDATA, *PVBOXDNDCBHGGETNEXTHOSTMSGDATA;
typedef struct VBOXDNDCBHGACKOPDATA
{
/** Callback data header. */
- VBOXDNDCBHEADERDATA hdr;
- uint32_t uAction;
-} VBOXDNDCBHGACKOPDATA;
-typedef VBOXDNDCBHGACKOPDATA *PVBOXDNDCBHGACKOPDATA;
+ VBOXDNDCBHEADERDATA hdr;
+ uint32_t uAction;
+} VBOXDNDCBHGACKOPDATA, *PVBOXDNDCBHGACKOPDATA;
typedef struct VBOXDNDCBHGREQDATADATA
{
/** Callback data header. */
- VBOXDNDCBHEADERDATA hdr;
- char *pszFormat;
-} VBOXDNDCBHGREQDATADATA;
-typedef VBOXDNDCBHGREQDATADATA *PVBOXDNDCBHGREQDATADATA;
+ VBOXDNDCBHEADERDATA hdr;
+ char *pszFormat;
+ uint32_t cbFormat;
+} VBOXDNDCBHGREQDATADATA, *PVBOXDNDCBHGREQDATADATA;
typedef struct VBOXDNDCBHGEVTPROGRESSDATA
{
/** Callback data header. */
- VBOXDNDCBHEADERDATA hdr;
- uint32_t uPercentage;
- uint32_t uState;
- int rc;
-} VBOXDNDCBHGEVTPROGRESSDATA;
-typedef VBOXDNDCBHGEVTPROGRESSDATA *PVBOXDNDCBHGEVTPROGRESSDATA;
+ VBOXDNDCBHEADERDATA hdr;
+ uint32_t uPercentage;
+ uint32_t uStatus;
+ uint32_t rc;
+} VBOXDNDCBHGEVTPROGRESSDATA, *PVBOXDNDCBHGEVTPROGRESSDATA;
typedef struct VBOXDNDCBGHACKPENDINGDATA
{
/** Callback data header. */
- VBOXDNDCBHEADERDATA hdr;
- uint32_t uDefAction;
- uint32_t uAllActions;
- char *pszFormat;
-} VBOXDNDCBGHACKPENDINGDATA;
-typedef VBOXDNDCBGHACKPENDINGDATA *PVBOXDNDCBGHACKPENDINGDATA;
+ VBOXDNDCBHEADERDATA hdr;
+ uint32_t uDefAction;
+ uint32_t uAllActions;
+ char *pszFormat;
+ uint32_t cbFormat;
+} VBOXDNDCBGHACKPENDINGDATA, *PVBOXDNDCBGHACKPENDINGDATA;
typedef struct VBOXDNDCBSNDDATADATA
{
/** Callback data header. */
- VBOXDNDCBHEADERDATA hdr;
- void *pvData;
- uint32_t cbData;
+ VBOXDNDCBHEADERDATA hdr;
+ void *pvData;
+ uint32_t cbData;
/** Total metadata size (in bytes). This is transmitted
* with every message because the size can change. */
- uint32_t cbTotalSize;
-} VBOXDNDCBSNDDATADATA;
-typedef VBOXDNDCBSNDDATADATA *PVBOXDNDCBSNDDATADATA;
+ uint32_t cbTotalSize;
+} VBOXDNDCBSNDDATADATA, *PVBOXDNDCBSNDDATADATA;
typedef struct VBOXDNDCBSNDDIRDATA
{
/** Callback data header. */
- VBOXDNDCBHEADERDATA hdr;
- char *pszPath;
- uint32_t cbPath;
- uint32_t fMode;
-} VBOXDNDCBSNDDIRDATA;
-typedef VBOXDNDCBSNDDIRDATA *PVBOXDNDCBSNDDIRDATA;
-
-typedef struct VBOXDNDCBSNDFILEDATA
+ VBOXDNDCBHEADERDATA hdr;
+ char *pszPath;
+ uint32_t cbPath;
+ uint32_t fMode;
+} VBOXDNDCBSNDDIRDATA, *PVBOXDNDCBSNDDIRDATA;
+
+/* Note: Only for protocol version 2 and up (>= VBox 5.0). */
+typedef struct VBOXDNDCBSNDFILEHDRDATA
+{
+ /** Callback data header. */
+ VBOXDNDCBHEADERDATA hdr;
+ /** File path (name). */
+ char *pszFilePath;
+ /** Size (in bytes) of file path. */
+ uint32_t cbFilePath;
+ /** Total size (in bytes) of this file. */
+ uint64_t cbSize;
+ /** File (creation) mode. */
+ uint32_t fMode;
+ /** Additional flags. Not used at the moment. */
+ uint32_t fFlags;
+} VBOXDNDCBSNDFILEHDRDATA, *PVBOXDNDCBSNDFILEHDRDATA;
+
+typedef struct VBOXDNDCBSNDFILEDATADATA
{
/** Callback data header. */
- VBOXDNDCBHEADERDATA hdr;
- char *pszFilePath;
- uint32_t cbFilePath;
- uint32_t fMode;
- void *pvData;
- uint32_t cbData;
-} VBOXDNDCBSNDFILEDATA;
-typedef VBOXDNDCBSNDFILEDATA *PVBOXDNDCBSNDFILEDATA;
+ VBOXDNDCBHEADERDATA hdr;
+ /** Current file data chunk. */
+ void *pvData;
+ /** Size (in bytes) of current data chunk. */
+ uint32_t cbData;
+ union
+ {
+ struct
+ {
+ /** File path (name). */
+ char *pszFilePath;
+ /** Size (in bytes) of file path. */
+ uint32_t cbFilePath;
+ /** File (creation) mode. */
+ uint32_t fMode;
+ } v1;
+ /* Note: Protocol version 2 has the file attributes (name, size,
+ mode, ...) in the VBOXDNDCBSNDFILEHDRDATA structure. */
+ } u;
+} VBOXDNDCBSNDFILEDATADATA, *PVBOXDNDCBSNDFILEDATADATA;
typedef struct VBOXDNDCBEVTERRORDATA
{
/** Callback data header. */
- VBOXDNDCBHEADERDATA hdr;
- int32_t rc;
-} VBOXDNDCBEVTERRORDATA;
-typedef VBOXDNDCBEVTERRORDATA *PVBOXDNDCBEVTERRORDATA;
+ VBOXDNDCBHEADERDATA hdr;
+ int32_t rc;
+} VBOXDNDCBEVTERRORDATA, *PVBOXDNDCBEVTERRORDATA;
} /* namespace DragAndDropSvc */
diff --git a/include/VBox/HostServices/GuestControlSvc.h b/include/VBox/HostServices/GuestControlSvc.h
index a173fbe..37c24f6 100644
--- a/include/VBox/HostServices/GuestControlSvc.h
+++ b/include/VBox/HostServices/GuestControlSvc.h
@@ -105,6 +105,9 @@ enum eProcessStatus
PROC_STS_ERROR = 8
};
+/** @todo r=bird: Most defines in this file needs to be scoped a little
+ * better! For instance INPUT_FLAG_NONE is very generic. */
+
/**
* Input flags, set by the host. This is needed for
* handling flags on the guest side.
@@ -132,11 +135,10 @@ enum eProcessStatus
/** Mask of valid flags. */
#define DIRREMOVE_FLAG_VALID_MASK UINT32_C(0x00000003)
-/**
- * Guest process creation flags.
- * Note: Has to match Main's ProcessCreateFlag_* flags!
+/** @name EXECUTEPROCESSFLAG_XXX Guest process creation flags.
+ * @note Has to match Main's ProcessCreateFlag_* flags!
*/
-#define EXECUTEPROCESSFLAG_NONE 0x0
+#define EXECUTEPROCESSFLAG_NONE UINT32_C(0x0)
#define EXECUTEPROCESSFLAG_WAIT_START RT_BIT(0)
#define EXECUTEPROCESSFLAG_IGNORE_ORPHANED RT_BIT(1)
#define EXECUTEPROCESSFLAG_HIDDEN RT_BIT(2)
@@ -144,6 +146,8 @@ enum eProcessStatus
#define EXECUTEPROCESSFLAG_WAIT_STDOUT RT_BIT(4)
#define EXECUTEPROCESSFLAG_WAIT_STDERR RT_BIT(5)
#define EXECUTEPROCESSFLAG_EXPAND_ARGUMENTS RT_BIT(6)
+#define EXECUTEPROCESSFLAG_UNQUOTED_ARGS RT_BIT(7)
+/** @} */
/**
* Pipe handle IDs used internally for referencing to
diff --git a/include/VBox/HostServices/Service.h b/include/VBox/HostServices/Service.h
index 54d65f3..6ac7385 100644
--- a/include/VBox/HostServices/Service.h
+++ b/include/VBox/HostServices/Service.h
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 2011-2012 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -40,15 +40,17 @@ namespace HGCM
class Message
{
+ /* Contains a copy of HGCM parameters. */
public:
Message(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM aParms[])
: m_uMsg(0)
, m_cParms(0)
, m_paParms(0)
{
- setData(uMsg, cParms, aParms);
+ initData(uMsg, cParms, aParms);
}
- ~Message()
+
+ virtual ~Message(void)
{
cleanup();
}
@@ -71,37 +73,12 @@ public:
return VERR_INVALID_PARAMETER;
}
- int rc = copyParms(cParms, m_paParms, &aParms[0], false /* fCreatePtrs */);
+ int rc = copyParmsInternal(cParms, m_paParms, &aParms[0], false /* fCreatePtrs */);
// if (RT_FAILURE(rc))
// cleanup(aParms);
return rc;
}
- int setData(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM aParms[])
- {
- AssertReturn(cParms < 256, VERR_INVALID_PARAMETER);
- AssertPtrNullReturn(aParms, VERR_INVALID_PARAMETER);
-
- /* Cleanup old messages. */
- cleanup();
-
- m_uMsg = uMsg;
- m_cParms = cParms;
-
- if (cParms > 0)
- {
- m_paParms = (VBOXHGCMSVCPARM*)RTMemAllocZ(sizeof(VBOXHGCMSVCPARM) * m_cParms);
- if (!m_paParms)
- return VERR_NO_MEMORY;
- }
-
- int rc = copyParms(cParms, &aParms[0], m_paParms, true /* fCreatePtrs */);
-
- if (RT_FAILURE(rc))
- cleanup();
-
- return rc;
- }
int getParmU32Info(uint32_t iParm, uint32_t *pu32Info) const
{
@@ -113,6 +90,7 @@ public:
return VINF_SUCCESS;
}
+
int getParmU64Info(uint32_t iParm, uint64_t *pu64Info) const
{
AssertPtrNullReturn(pu64Info, VERR_INVALID_PARAMETER);
@@ -123,6 +101,7 @@ public:
return VINF_SUCCESS;
}
+
int getParmPtrInfo(uint32_t iParm, void **ppvAddr, uint32_t *pcSize) const
{
AssertPtrNullReturn(ppvAddr, VERR_INVALID_PARAMETER);
@@ -136,7 +115,44 @@ public:
return VINF_SUCCESS;
}
- int copyParms(uint32_t cParms, PVBOXHGCMSVCPARM paParmsSrc, PVBOXHGCMSVCPARM paParmsDst, bool fCreatePtrs) const
+ static int copyParms(uint32_t cParms, PVBOXHGCMSVCPARM paParmsSrc, PVBOXHGCMSVCPARM paParmsDst)
+ {
+ return copyParmsInternal(cParms, paParmsSrc, paParmsDst, false /* fCreatePtrs */);
+ }
+
+private:
+
+ uint32_t m_uMsg;
+ uint32_t m_cParms;
+ PVBOXHGCMSVCPARM m_paParms;
+
+ int initData(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM aParms[])
+ {
+ AssertReturn(cParms < 256, VERR_INVALID_PARAMETER);
+ AssertPtrNullReturn(aParms, VERR_INVALID_PARAMETER);
+
+ /* Cleanup old messages. */
+ cleanup();
+
+ m_uMsg = uMsg;
+ m_cParms = cParms;
+
+ if (cParms > 0)
+ {
+ m_paParms = (VBOXHGCMSVCPARM*)RTMemAllocZ(sizeof(VBOXHGCMSVCPARM) * m_cParms);
+ if (!m_paParms)
+ return VERR_NO_MEMORY;
+ }
+
+ int rc = copyParmsInternal(cParms, &aParms[0], m_paParms, true /* fCreatePtrs */);
+
+ if (RT_FAILURE(rc))
+ cleanup();
+
+ return rc;
+ }
+
+ static int copyParmsInternal(uint32_t cParms, PVBOXHGCMSVCPARM paParmsSrc, PVBOXHGCMSVCPARM paParmsDst, bool fCreatePtrs)
{
int rc = VINF_SUCCESS;
for (uint32_t i = 0; i < cParms; ++i)
@@ -175,14 +191,24 @@ public:
{
/* No, but we have to check if there is enough room. */
if (paParmsDst[i].u.pointer.size < paParmsSrc[i].u.pointer.size)
+ {
rc = VERR_BUFFER_OVERFLOW;
+ break;
+ }
+ }
+
+ if (paParmsSrc[i].u.pointer.size)
+ {
+ if ( paParmsDst[i].u.pointer.addr
+ && paParmsDst[i].u.pointer.size)
+ {
+ memcpy(paParmsDst[i].u.pointer.addr,
+ paParmsSrc[i].u.pointer.addr,
+ RT_MIN(paParmsDst[i].u.pointer.size, paParmsSrc[i].u.pointer.size));
+ }
+ else
+ rc = VERR_INVALID_POINTER;
}
- if ( paParmsDst[i].u.pointer.addr
- && paParmsSrc[i].u.pointer.size > 0
- && paParmsDst[i].u.pointer.size > 0)
- memcpy(paParmsDst[i].u.pointer.addr,
- paParmsSrc[i].u.pointer.addr,
- RT_MIN(paParmsDst[i].u.pointer.size, paParmsSrc[i].u.pointer.size));
break;
}
default:
@@ -218,26 +244,32 @@ public:
m_cParms = 0;
m_uMsg = 0;
}
-
-protected:
- uint32_t m_uMsg;
- uint32_t m_cParms;
- PVBOXHGCMSVCPARM m_paParms;
};
class Client
{
public:
- Client(uint32_t uClientId, VBOXHGCMCALLHANDLE hHandle, uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM aParms[])
+ Client(uint32_t uClientId, VBOXHGCMCALLHANDLE hHandle = NULL,
+ uint32_t uMsg = 0, uint32_t cParms = 0, VBOXHGCMSVCPARM aParms[] = NULL)
: m_uClientId(uClientId)
+ , m_uProtocol(0)
, m_hHandle(hHandle)
, m_uMsg(uMsg)
, m_cParms(cParms)
, m_paParms(aParms) {}
- VBOXHGCMCALLHANDLE handle() const { return m_hHandle; }
- uint32_t message() const { return m_uMsg; }
- uint32_t clientId() const { return m_uClientId; }
+public:
+
+ VBOXHGCMCALLHANDLE handle(void) const { return m_hHandle; }
+ uint32_t message(void) const { return m_uMsg; }
+ uint32_t clientId(void) const { return m_uClientId; }
+ uint32_t protocol(void) const { return m_uProtocol; }
+
+public:
+
+ int setProtocol(uint32_t uProtocol) { m_uProtocol = uProtocol; return VINF_SUCCESS; }
+
+public:
int addMessageInfo(uint32_t uMsg, uint32_t cParms)
{
@@ -251,6 +283,7 @@ public:
}
int addMessageInfo(const Message *pMessage)
{
+ AssertPtrReturn(pMessage, VERR_INVALID_POINTER);
if (m_cParms != 3)
return VERR_INVALID_PARAMETER;
@@ -261,10 +294,15 @@ public:
}
int addMessage(const Message *pMessage)
{
+ AssertPtrReturn(pMessage, VERR_INVALID_POINTER);
return pMessage->getData(m_uMsg, m_cParms, m_paParms);
}
+
private:
+
uint32_t m_uClientId;
+ /** Optional protocol version the client uses. */
+ uint32_t m_uProtocol;
VBOXHGCMCALLHANDLE m_hHandle;
uint32_t m_uMsg;
uint32_t m_cParms;
diff --git a/include/VBox/VBoxGuestLib.h b/include/VBox/VBoxGuestLib.h
index c180f94..1d3dda2 100644
--- a/include/VBox/VBoxGuestLib.h
+++ b/include/VBox/VBoxGuestLib.h
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -605,7 +605,7 @@ VBGLR3DECL(int) VbglR3SharedFolderGetMountDir(char **ppszDir);
/**
* Structure containing the context required for
* either retrieving or sending a HGCM guest control
- * command from or to the host.
+ * commands from or to the host.
*
* Note: Do not change parameter order without also
* adapting all structure initializers.
@@ -712,41 +712,64 @@ VBGLR3DECL(int) VbglR3PageIsShared(RTGCPTR pPage, bool *pfShared, uint64_t *
# ifdef VBOX_WITH_DRAG_AND_DROP
/** @name Drag and Drop
* @{ */
+/**
+ * Structure containing the context required for
+ * either retrieving or sending a HGCM guest drag'n drop
+ * commands from or to the host.
+ *
+ * Note: Do not change parameter order without also
+ * adapting all structure initializers.
+ */
+typedef struct VBGLR3GUESTDNDCMDCTX
+{
+ /** @todo This struct could be handy if we want to implement
+ * a second communication channel, e.g. via TCP/IP.
+ * Use a union for the HGCM stuff then. */
+
+ /** IN: HGCM client ID to use for communication. */
+ uint32_t uClientID;
+ /** IN: Protocol version to use. */
+ uint32_t uProtocol;
+ /** OUT: Number of parameters retrieved. */
+ uint32_t uNumParms;
+} VBGLR3GUESTDNDCMDCTX, *PVBGLR3GUESTDNDCMDCTX;
+
typedef struct VBGLR3DNDHGCMEVENT
{
- uint32_t uType; /** The event type this struct contains */
- uint32_t uScreenId; /** Screen ID this request belongs to */
- char *pszFormats; /** Format list (\r\n separated) */
- uint32_t cbFormats; /** Size of pszFormats (\0 included) */
+ uint32_t uType; /** The event type this struct contains. */
+ uint32_t uScreenId; /** Screen ID this request belongs to. */
+ char *pszFormats; /** Format list (\r\n separated). */
+ uint32_t cbFormats; /** Size of pszFormats (\0 included). */
union
{
struct
{
- uint32_t uXpos; /** X position of guest screen */
- uint32_t uYpos; /** Y position of guest screen */
- uint32_t uDefAction; /** Proposed DnD action */
- uint32_t uAllActions; /** Allowed DnD actions */
- }a; /** Values used in init, move and drop event type */
+ uint32_t uXpos; /** X position of guest screen. */
+ uint32_t uYpos; /** Y position of guest screen. */
+ uint32_t uDefAction; /** Proposed DnD action. */
+ uint32_t uAllActions; /** Allowed DnD actions. */
+ } a; /** Values used in init, move and drop event type. */
struct
{
- void *pvData; /** Data request */
- size_t cbData; /** Size of pvData */
- }b; /** Values used in drop data event type */
- }u;
+ void *pvData; /** Data request. */
+ size_t cbData; /** Size of pvData. */
+ } b; /** Values used in drop data event type. */
+ } u;
} VBGLR3DNDHGCMEVENT;
typedef VBGLR3DNDHGCMEVENT *PVBGLR3DNDHGCMEVENT;
typedef const PVBGLR3DNDHGCMEVENT CPVBGLR3DNDHGCMEVENT;
-VBGLR3DECL(int) VbglR3DnDConnect(uint32_t *pu32ClientId);
-VBGLR3DECL(int) VbglR3DnDDisconnect(uint32_t u32ClientId);
+VBGLR3DECL(int) VbglR3DnDConnect(PVBGLR3GUESTDNDCMDCTX pCtx);
+VBGLR3DECL(int) VbglR3DnDDisconnect(PVBGLR3GUESTDNDCMDCTX pCtx);
-VBGLR3DECL(int) VbglR3DnDProcessNextMessage(uint32_t u32ClientId, CPVBGLR3DNDHGCMEVENT pEvent);
+VBGLR3DECL(int) VbglR3DnDProcessNextMessage(PVBGLR3GUESTDNDCMDCTX pCtx, CPVBGLR3DNDHGCMEVENT pEvent);
-VBGLR3DECL(int) VbglR3DnDHGAcknowledgeOperation(uint32_t u32ClientId, uint32_t uAction);
-VBGLR3DECL(int) VbglR3DnDHGRequestData(uint32_t u32ClientId, const char* pcszFormat);
+VBGLR3DECL(int) VbglR3DnDHGAcknowledgeOperation(PVBGLR3GUESTDNDCMDCTX pCtx, uint32_t uAction);
+VBGLR3DECL(int) VbglR3DnDHGRequestData(PVBGLR3GUESTDNDCMDCTX pCtx, const char* pcszFormat);
+VBGLR3DECL(int) VbglR3DnDHGSetProgress(PVBGLR3GUESTDNDCMDCTX pCtx, uint32_t uStatus, uint8_t uPercent, int rcErr);
# ifdef VBOX_WITH_DRAG_AND_DROP_GH
-VBGLR3DECL(int) VbglR3DnDGHAcknowledgePending(uint32_t u32ClientId, uint32_t uDefAction, uint32_t uAllActions, const char* pcszFormats);
-VBGLR3DECL(int) VbglR3DnDGHSendData(uint32_t u32ClientId, const char *pszFormat, void *pvData, uint32_t cbData);
-VBGLR3DECL(int) VbglR3DnDGHSendError(uint32_t u32ClientId, int rcOp);
+VBGLR3DECL(int) VbglR3DnDGHAcknowledgePending(PVBGLR3GUESTDNDCMDCTX pCtx, uint32_t uDefAction, uint32_t uAllActions, const char* pcszFormats);
+VBGLR3DECL(int) VbglR3DnDGHSendData(PVBGLR3GUESTDNDCMDCTX pCtx, const char *pszFormat, void *pvData, uint32_t cbData);
+VBGLR3DECL(int) VbglR3DnDGHSendError(PVBGLR3GUESTDNDCMDCTX pCtx, int rcOp);
# endif /* VBOX_WITH_DRAG_AND_DROP_GH */
/** @} */
# endif /* VBOX_WITH_DRAG_AND_DROP */
diff --git a/include/VBox/com/ptr.h b/include/VBox/com/ptr.h
index bb6e571..f7d8ac5 100644
--- a/include/VBox/com/ptr.h
+++ b/include/VBox/com/ptr.h
@@ -228,6 +228,15 @@ public:
return (m_p == NULL);
}
+ /**
+ * Returns true if the pointer is not NULL.
+ */
+ bool isNotNull() const
+ {
+ return (m_p != NULL);
+ }
+
+
bool operator<(T* p) const
{
return m_p < p;
diff --git a/include/VBox/dbus-calls.h b/include/VBox/dbus-calls.h
index 315be67..084ef9a 100644
--- a/include/VBox/dbus-calls.h
+++ b/include/VBox/dbus-calls.h
@@ -124,6 +124,8 @@
(DBusConnection *connection, \
DBusHandleMessageFunction function, void *pvoid), \
(connection, function, pvoid)) \
+ RT_PROXY_STUB(dbus_connection_read_write, dbus_bool_t, \
+ (DBusConnection *connection, int val), (connection, val)) \
RT_PROXY_STUB(dbus_connection_read_write_dispatch, dbus_bool_t, \
(DBusConnection *connection, int val), (connection, val)) \
RT_PROXY_STUB(dbus_message_is_signal, dbus_bool_t, \
diff --git a/include/VBox/dbus.h b/include/VBox/dbus.h
index 468525b..87f2295 100644
--- a/include/VBox/dbus.h
+++ b/include/VBox/dbus.h
@@ -54,7 +54,7 @@ typedef struct DBusConnection DBusConnection;
typedef uint32_t dbus_bool_t;
typedef uint32_t dbus_uint32_t;
-typedef enum { DBUS_BUS_SESSON, DBUS_BUS_SYSTEM, DBUS_BUS_STARTER } DBusBusType;
+typedef enum { DBUS_BUS_SESSION, DBUS_BUS_SYSTEM, DBUS_BUS_STARTER } DBusBusType;
struct DBusMessage;
typedef struct DBusMessage DBusMessage;
diff --git a/include/VBox/err.h b/include/VBox/err.h
index 156dfbc..c6cd7c7 100644
--- a/include/VBox/err.h
+++ b/include/VBox/err.h
@@ -64,7 +64,7 @@
#define VERR_OUT_OF_SELECTOR_BOUNDS (-1010)
/** Invalid selector. Usually beyond table limits. */
#define VERR_INVALID_SELECTOR (-1011)
-/** Invalid requested privilegde level. */
+/** Invalid requested privilege level. */
#define VERR_INVALID_RPL (-1012)
/** PML4 entry not present. */
#define VERR_PAGE_MAP_LEVEL4_NOT_PRESENT (-1013)
@@ -100,7 +100,7 @@
*/
/** First scheduling related status code. */
#define VINF_EM_FIRST 1100
-/** Indicating that the VM is being terminated and that the the execution
+/** Indicating that the VM is being terminated and that the execution
* shall stop. */
#define VINF_EM_TERMINATE 1100
/** Hypervisor code was stepped.
@@ -130,7 +130,7 @@
/** Indicating that the VM is being turned off and that the EM should
* exit to the VM awaiting the destruction request. */
#define VINF_EM_OFF 1109
-/** Indicating that the VM has been suspended and that the the thread
+/** Indicating that the VM has been suspended and that the thread
* should wait for request telling it what to do next. */
#define VINF_EM_SUSPEND 1110
/** Indicating that the VM has been reset and that scheduling goes
@@ -262,7 +262,7 @@
/** Someone (including the caller) was already attached as
* debugger to the VM. */
#define VERR_DBGF_ALREADY_ATTACHED (-1201)
-/** Tried to hald a debugger which was already halted.
+/** Tried to halt a debugger which was already halted.
* (This is a warning and not an error.) */
#define VWRN_DBGF_ALREADY_HALTED 1202
/** The DBGF has no more free breakpoint slots. */
@@ -571,7 +571,7 @@
#define VERR_PGM_PHYS_PAGE_MAP_IPE_4 (-1674)
/** Too many loops looking for a page to reuse. */
#define VERR_PGM_POOL_TOO_MANY_LOOPS (-1675)
-/** Internal procesing error related to guest mappings. */
+/** Internal processing error related to guest mappings. */
#define VERR_PGM_MAPPING_IPE (-1676)
/** An attempt was made to grow an already maxed out page pool. */
#define VERR_PGM_POOL_MAXED_OUT_ALREADY (-1677)
@@ -613,7 +613,7 @@
#define VERR_CPUM_RAISE_GP_0 (-1750)
/** Incompatible CPUM configuration. */
#define VERR_CPUM_INCOMPATIBLE_CONFIG (-1751)
-/** CPUMR3DisasmInstrCPU unexpectedly failed to determin the hidden
+/** CPUMR3DisasmInstrCPU unexpectedly failed to determine the hidden
* parts of the CS register. */
#define VERR_CPUM_HIDDEN_CS_LOAD_ERROR (-1752)
/** Couldn't find the end of CPUID sub-leaves. */
@@ -630,10 +630,19 @@
#define VINF_CPUM_R3_MSR_READ (1758)
/** Return to ring-3 to write the MSR there. */
#define VINF_CPUM_R3_MSR_WRITE (1759)
-/** Too may CPUID leaves. */
-#define VERR_TOO_MANY_CPUID_LEAVES (1760)
+/** Too many CPUID leaves. */
+#define VERR_TOO_MANY_CPUID_LEAVES (-1760)
/** Invalid config value. */
-#define VERR_CPUM_INVALID_CONFIG_VALUE (1761)
+#define VERR_CPUM_INVALID_CONFIG_VALUE (-1761)
+/** The loaded XSAVE component mask is not compatible with the host CPU
+ * or/and VM config. */
+#define VERR_CPUM_INCOMPATIBLE_XSAVE_COMP_MASK (-1762)
+/** The loaded XSAVE component mask is not valid. */
+#define VERR_CPUM_INVALID_XSAVE_COMP_MASK (-1763)
+/** The loaded XSAVE header is not valid. */
+#define VERR_CPUM_INVALID_XSAVE_HDR (-1764)
+/** The loaded XCR0 register value is not valid. */
+#define VERR_CPUM_INVALID_XCR0 (-1765)
/** @} */
@@ -677,9 +686,9 @@
#define VERR_SSM_INTEGRITY_REC_TERM (-1823)
/** Termination record CRC mismatch. */
#define VERR_SSM_INTEGRITY_REC_TERM_CRC (-1824)
-/** Decompression interity error. */
+/** Decompression integrity error. */
#define VERR_SSM_INTEGRITY_DECOMPRESSION (-1825)
-/** Saved state directory iintegrity error. */
+/** Saved state directory wintertides error. */
#define VERR_SSM_INTEGRITY_DIR (-1826)
/** The saved state directory magic is wrong. */
#define VERR_SSM_INTEGRITY_DIR_MAGIC (-1827)
@@ -705,7 +714,7 @@
* Normally caused by hardware changes on the host, but could also be caused by
* changes in the BIOS setup. */
#define VERR_SSM_LOAD_CPUID_MISMATCH (-1842)
-/** The RAM size differes between the saved state and the VM config. */
+/** The RAM size differs between the saved state and the VM config. */
#define VERR_SSM_LOAD_MEMORY_SIZE_MISMATCH (-1843)
/** The state doesn't match the VM configuration in one or another way.
* (There are certain PCI reconfiguration which the OS could potentially
@@ -808,7 +817,7 @@
* the interface user screwed up, or we've got corruption/broken logic. */
#define VERR_VM_REQUEST_STATE (-1902)
/** Invalid VM request packet.
- * One or more of the the VM controlled packet members didn't contain the correct
+ * One or more of the VM controlled packet members didn't contain the correct
* values. Some thing's broken. */
#define VERR_VM_REQUEST_INVALID_PACKAGE (-1903)
/** The status field has not been updated yet as the request is still
@@ -917,7 +926,7 @@
#define VERR_CFGM_NOT_BYTES (-2108)
/** The specified string / bytes buffer was to small. Specify a larger one and retry. */
#define VERR_CFGM_NOT_ENOUGH_SPACE (-2109)
-/** The path of a new node contained slashs or was empty. */
+/** The path of a new node contained slashes or was empty. */
#define VERR_CFGM_INVALID_NODE_PATH (-2160)
/** A new node couldn't be inserted because one with the same name exists. */
#define VERR_CFGM_NODE_EXISTS (-2161)
@@ -986,7 +995,7 @@
*/
/** No active trap. Cannot query or reset a non-existing trap. */
#define VERR_TRPM_NO_ACTIVE_TRAP (-2400)
-/** Active trap. Cannot assert a new trap when when one is already active. */
+/** Active trap. Cannot assert a new trap when one is already active. */
#define VERR_TRPM_ACTIVE_TRAP (-2401)
/** Reason for leaving RC: Guest tried to write to our IDT - fatal.
* The VM will be terminated assuming the worst, i.e. that the
@@ -1240,7 +1249,7 @@
/** A attach or prepare mount call failed because the driver already
* had a driver attached. */
#define VERR_PDM_DRIVER_ALREADY_ATTACHED (-2820)
-/** An attempt on deattaching a driver without anyone actually being attached, or
+/** An attempt on detaching a driver without anyone actually being attached, or
* performing any other operation on an attached driver. */
#define VERR_PDM_NO_DRIVER_ATTACHED (-2821)
/** The attached driver configuration is missing the 'Driver' attribute. */
@@ -1258,7 +1267,7 @@
/** A module name is too long. */
#define VERR_PDM_MODULE_NAME_TOO_LONG (-2827)
/** Driver name clash. Another driver with the same name as the
- * one begin registred exists. */
+ * one being registered exists. */
#define VERR_PDM_DRIVER_NAME_CLASH (-2828)
/** The version of the driver registration structure is unknown
* to this VBox version. Either mixing incompatible versions or
@@ -1289,7 +1298,7 @@
/** The guest bit mask didn't match the guest being loaded. */
#define VERR_PDM_INVALID_DEVICE_HOST_BITS (-2838)
/** Device name clash. Another device with the same name as the
- * one begin registred exists. */
+ * one being registered exists. */
#define VERR_PDM_DEVICE_NAME_CLASH (-2839)
/** The device wasn't found. There was no registered device
* by that name. */
@@ -1340,7 +1349,7 @@
/** Invalid entry in the device registration structure. */
#define VERR_PDM_INVALID_USB_REGISTRATION (-2857)
/** Driver name clash. Another driver with the same name as the
- * one begin registred exists. */
+ * one being registered exists. */
#define VERR_PDM_USB_NAME_CLASH (-2858)
/** The USB hub is already registered. */
#define VERR_PDM_USB_HUB_EXISTS (-2859)
@@ -2358,7 +2367,7 @@
/** Syntax error - you hit a debugger feature which isn't implemented yet.
* (Feel free to help implement it.) */
#define VERR_DBGC_PARSE_NOT_IMPLEMENTED (VERR_DBGC_PARSE_LOWEST + 20)
-/** Syntax error - Couldn't staisfy a request for a sepcific result type. */
+/** Syntax error - Couldn't satisfy a request for a specific result type. */
#define VERR_DBGC_PARSE_BAD_RESULT_TYPE (VERR_DBGC_PARSE_LOWEST + 21)
/** Syntax error - Cannot read symbol value, it is a set-only symbol. */
#define VERR_DBGC_PARSE_WRITEONLY_SYMBOL (VERR_DBGC_PARSE_LOWEST + 22)
@@ -2371,147 +2380,147 @@
/** @} */
-/** @name Support driver/library shared verfication status codes.
+/** @name Support driver/library shared verification status codes.
* @{ */
-/** Process Verficiation Failure: The memory content does not match the image
+/** Process Verification Failure: The memory content does not match the image
* file. */
#define VERR_SUP_VP_MEMORY_VS_FILE_MISMATCH (-5600)
-/** Process Verficiation Failure: The memory protection of a image file section
+/** Process Verification Failure: The memory protection of a image file section
* does not match what the section header prescribes. */
#define VERR_SUP_VP_SECTION_PROTECTION_MISMATCH (-5601)
-/** Process Verficiation Failure: One of the section in the image file is not
+/** Process Verification Failure: One of the section in the image file is not
* mapped into memory. */
#define VERR_SUP_VP_SECTION_NOT_MAPPED (-5602)
-/** Process Verficiation Failure: One of the section in the image file is not
+/** Process Verification Failure: One of the section in the image file is not
* fully mapped into memory. */
#define VERR_SUP_VP_SECTION_NOT_FULLY_MAPPED (-5603)
-/** Process Verficiation Failure: Bad file alignment value in image header. */
+/** Process Verification Failure: Bad file alignment value in image header. */
#define VERR_SUP_VP_BAD_FILE_ALIGNMENT_VALUE (-5604)
-/** Process Verficiation Failure: Bad image base in header. */
+/** Process Verification Failure: Bad image base in header. */
#define VERR_SUP_VP_BAD_IMAGE_BASE (-5605)
-/** Process Verficiation Failure: Bad image signature. */
+/** Process Verification Failure: Bad image signature. */
#define VERR_SUP_VP_BAD_IMAGE_SIGNATURE (-5606)
-/** Process Verficiation Failure: Bad image size. */
+/** Process Verification Failure: Bad image size. */
#define VERR_SUP_VP_BAD_IMAGE_SIZE (-5607)
-/** Process Verficiation Failure: Bad new-header offset in the MZ header. */
+/** Process Verification Failure: Bad new-header offset in the MZ header. */
#define VERR_SUP_VP_BAD_MZ_OFFSET (-5608)
-/** Process Verficiation Failure: Bad optional header field. */
+/** Process Verification Failure: Bad optional header field. */
#define VERR_SUP_VP_BAD_OPTIONAL_HEADER (-5609)
-/** Process Verficiation Failure: Bad section alignment value in image
+/** Process Verification Failure: Bad section alignment value in image
* header. */
#define VERR_SUP_VP_BAD_SECTION_ALIGNMENT_VALUE (-5610)
-/** Process Verficiation Failure: Bad section raw data size. */
+/** Process Verification Failure: Bad section raw data size. */
#define VERR_SUP_VP_BAD_SECTION_FILE_SIZE (-5611)
-/** Process Verficiation Failure: Bad virtual section address. */
+/** Process Verification Failure: Bad virtual section address. */
#define VERR_SUP_VP_BAD_SECTION_RVA (-5612)
-/** Process Verficiation Failure: Bad virtual section size. */
+/** Process Verification Failure: Bad virtual section size. */
#define VERR_SUP_VP_BAD_SECTION_VIRTUAL_SIZE (-5613)
-/** Process Verficiation Failure: Bad size of image header. */
+/** Process Verification Failure: Bad size of image header. */
#define VERR_SUP_VP_BAD_SIZE_OF_HEADERS (-5614)
-/** Process Verficiation Failure: The process is being debugged. */
+/** Process Verification Failure: The process is being debugged. */
#define VERR_SUP_VP_DEBUGGED (-5615)
-/** Process Verficiation Failure: A DLL was found more than once. */
+/** Process Verification Failure: A DLL was found more than once. */
#define VERR_SUP_VP_DUPLICATE_DLL_MAPPING (-5616)
-/** Process Verficiation Failure: Image section region is too large. */
+/** Process Verification Failure: Image section region is too large. */
#define VERR_SUP_VP_EMPTY_REGION_TOO_LARGE (-5617)
-/** Process Verficiation Failure: Exectuable file name and process image name
+/** Process Verification Failure: Executable file name and process image name
* does not match up. */
#define VERR_SUP_VP_EXE_VS_PROC_NAME_MISMATCH (-5618)
-/** Process Verficiation Failure: Found executable memory allocated in the
+/** Process Verification Failure: Found executable memory allocated in the
* process. There is only supposed be executable memory associated with
* image file mappings (DLLs & EXE). */
#define VERR_SUP_VP_FOUND_EXEC_MEMORY (-5619)
-/** Process Verficiation Failure: There is more than one known executable mapped
+/** Process Verification Failure: There is more than one known executable mapped
* into the process. */
#define VERR_SUP_VP_FOUND_MORE_THAN_ONE_EXE_MAPPING (-5620)
-/** Process Verficiation Failure: Error closing image file handle. */
+/** Process Verification Failure: Error closing image file handle. */
#define VERR_SUP_VP_IMAGE_FILE_CLOSE_ERROR (-5621)
-/** Process Verficiation Failure: Error opening image file. */
+/** Process Verification Failure: Error opening image file. */
#define VERR_SUP_VP_IMAGE_FILE_OPEN_ERROR (-5622)
-/** Process Verficiation Failure: Error reading image file header. */
+/** Process Verification Failure: Error reading image file header. */
#define VERR_SUP_VP_IMAGE_HDR_READ_ERROR (-5623)
-/** Process Verficiation Failure: Image mapping is bogus as the first region
+/** Process Verification Failure: Image mapping is bogus as the first region
* has different AllocationBase and BaseAddress values, indicating that a
* section was unmapped or otherwise tampered with. */
#define VERR_SUP_VP_IMAGE_MAPPING_BASE_ERROR (-5624)
-/** Process Verficiation Failure: Error reading process memory for comparing
+/** Process Verification Failure: Error reading process memory for comparing
* with disk data. */
#define VERR_SUP_VP_MEMORY_READ_ERROR (-5625)
-/** Process Verficiation Failure: Found no executable mapped into the process
+/** Process Verification Failure: Found no executable mapped into the process
* address space. */
#define VERR_SUP_VP_NO_FOUND_NO_EXE_MAPPING (-5626)
-/** Process Verficiation Failure: An image mapping failed to report a name. */
+/** Process Verification Failure: An image mapping failed to report a name. */
#define VERR_SUP_VP_NO_IMAGE_MAPPING_NAME (-5627)
-/** Process Verficiation Failure: No KERNE32.DLL mapping found. This is
+/** Process Verification Failure: No KERNE32.DLL mapping found. This is
* impossible. */
#define VERR_SUP_VP_NO_KERNEL32_MAPPING (-5628)
-/** Process Verficiation Failure: Error allocating memory. */
+/** Process Verification Failure: Error allocating memory. */
#define VERR_SUP_VP_NO_MEMORY (-5629)
-/** Process Verficiation Failure: Erorr allocating state memory or querying
+/** Process Verification Failure: Error allocating state memory or querying
* the system32 path. */
#define VERR_SUP_VP_NO_MEMORY_STATE (-5630)
-/** Process Verficiation Failure: No NTDLL.DLL mapping found. This is
+/** Process Verification Failure: No NTDLL.DLL mapping found. This is
* impossible. */
#define VERR_SUP_VP_NO_NTDLL_MAPPING (-5631)
-/** Process Verficiation Failure: A DLL residing outside System32 was found
+/** Process Verification Failure: A DLL residing outside System32 was found
* in the process. */
#define VERR_SUP_VP_NON_SYSTEM32_DLL (-5632)
-/** Process Verficiation Failure: An unknown and unwanted DLL was found loaded
+/** Process Verification Failure: An unknown and unwanted DLL was found loaded
* into the process. */
#define VERR_SUP_VP_NOT_KNOWN_DLL_OR_EXE (-5633)
-/** Process Verficiation Failure: The name of an image file changes between
+/** Process Verification Failure: The name of an image file changes between
* mapping regions. */
#define VERR_SUP_VP_NT_MAPPING_NAME_CHANGED (-5634)
-/** Process Verficiation Failure: Error querying process name. */
+/** Process Verification Failure: Error querying process name. */
#define VERR_SUP_VP_NT_QI_PROCESS_NM_ERROR (-5635)
-/** Process Verficiation Failure: Error querying thread information. */
+/** Process Verification Failure: Error querying thread information. */
#define VERR_SUP_VP_NT_QI_THREAD_ERROR (-5636)
-/** Process Verficiation Failure: Error query virtual memory information. */
+/** Process Verification Failure: Error query virtual memory information. */
#define VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_ERROR (-5637)
-/** Process Verficiation Failure: Error query virtual memory mapping name. */
+/** Process Verification Failure: Error query virtual memory mapping name. */
#define VERR_SUP_VP_NT_QI_VIRTUAL_MEMORY_NM_ERROR (-5638)
-/** Process Verficiation Failure: Error determining the full path of
+/** Process Verification Failure: Error determining the full path of
* System32. */
#define VERR_SUP_VP_SYSTEM32_PATH (-5639)
-/** Process Verficiation Failure: The process has more than one thread. */
+/** Process Verification Failure: The process has more than one thread. */
#define VERR_SUP_VP_THREAD_NOT_ALONE (-5640)
-/** Process Verficiation Failure: The image mapping is too large (>= 2GB). */
+/** Process Verification Failure: The image mapping is too large (>= 2GB). */
#define VERR_SUP_VP_TOO_HIGH_REGION_RVA (-5641)
-/** Process Verficiation Failure: The memory region is too large (>= 2GB). */
+/** Process Verification Failure: The memory region is too large (>= 2GB). */
#define VERR_SUP_VP_TOO_LARGE_REGION (-5642)
-/** Process Verficiation Failure: There are too many DLLs loaded. */
+/** Process Verification Failure: There are too many DLLs loaded. */
#define VERR_SUP_VP_TOO_MANY_DLLS_LOADED (-5643)
-/** Process Verficiation Failure: An image has too many regions. */
+/** Process Verification Failure: An image has too many regions. */
#define VERR_SUP_VP_TOO_MANY_IMAGE_REGIONS (-5644)
-/** Process Verficiation Failure: The process has too many virtual memory
+/** Process Verification Failure: The process has too many virtual memory
* regions. */
#define VERR_SUP_VP_TOO_MANY_MEMORY_REGIONS (-5645)
-/** Process Verficiation Failure: An image has too many sections. */
+/** Process Verification Failure: An image has too many sections. */
#define VERR_SUP_VP_TOO_MANY_SECTIONS (-5646)
-/** Process Verficiation Failure: An image is targeting an unexpected
+/** Process Verification Failure: An image is targeting an unexpected
* machine/CPU. */
#define VERR_SUP_VP_UNEXPECTED_IMAGE_MACHINE (-5647)
-/** Process Verficiation Failure: Unexpected section protection flag
+/** Process Verification Failure: Unexpected section protection flag
* combination. */
#define VERR_SUP_VP_UNEXPECTED_SECTION_FLAGS (-5648)
-/** Process Verficiation Failure: Expected the process and exe to have forced
+/** Process Verification Failure: Expected the process and exe to have forced
* integrity checking enabled (verifying signatures). */
#define VERR_SUP_VP_EXE_MISSING_FORCE_INTEGRITY (-5649)
-/** Process Verficiation Failure: Expected the process and exe to have dynamic
+/** Process Verification Failure: Expected the process and exe to have dynamic
* base enabled. */
#define VERR_SUP_VP_EXE_MISSING_DYNAMIC_BASE (-5650)
-/** Process Verficiation Failure: Expected the process and exe to advertise
+/** Process Verification Failure: Expected the process and exe to advertise
* NX compatibility. */
#define VERR_SUP_VP_EXE_MISSING_NX_COMPAT (-5651)
-/** Process Verficiation Failure: The DllCharacteristics of the process
+/** Process Verification Failure: The DllCharacteristics of the process
* does not match the value in the optional header in the exe file. */
#define VERR_SUP_VP_DLL_CHARECTERISTICS_MISMATCH (-5652)
-/** Process Verficiation Failure: The ImageCharacteristics of the process
+/** Process Verification Failure: The ImageCharacteristics of the process
* does not match the value in the file header in the exe file. */
#define VERR_SUP_VP_IMAGE_CHARECTERISTICS_MISMATCH (-5653)
-/** Process Verficiation Failure: Error querying image information. */
+/** Process Verification Failure: Error querying image information. */
#define VERR_SUP_VP_NT_QI_PROCESS_IMG_INFO_ERROR (-5654)
-/** Process Verficiation Failure: Error querying debug port. */
+/** Process Verification Failure: Error querying debug port. */
#define VERR_SUP_VP_NT_QI_PROCESS_DBG_PORT_ERROR (-5655)
/** WinVerifyTrust failed with an unexpected status code when using the
* catalog-file approach. */
@@ -2527,7 +2536,7 @@
#define VERR_SUP_VP_UNEXPECTED_VALID_PATH_COUNT (-5660)
/** The image is required to force integrity checks. */
#define VERR_SUP_VP_SIGNATURE_CHECKS_NOT_ENFORCED (-5661)
-/** Process Verficiation Failure: Symantec Endpoint Protection must be
+/** Process Verification Failure: Symantec Endpoint Protection must be
* disabled for the VirtualBox VM processes.
* http://www.symantec.com/connect/articles/creating-application-control-exclusions-symantec-endpoint-protection-121 */
#define VERR_SUP_VP_SYSFER_DLL (-5662)
@@ -2539,7 +2548,7 @@
#define VERR_SUP_VP_FREE_VIRTUAL_MEMORY_FAILED (-5664)
/** Process Purification Failure: Both NtUnmapViewOfSetion and
* NtProtectVirtualMemory failed to get rid of or passify an non-image
- * exectuable mapping. */
+ * executable mapping. */
#define VERR_SUP_VP_UNMAP_AND_PROTECT_FAILED (-5665)
/** Process Purification Failure: Unknown memory type of executable memory. */
#define VERR_SUP_VP_UNKOWN_MEM_TYPE (-5666)
@@ -2550,7 +2559,7 @@
/** Stub process not found so it cannot be revalidated when vboxdrv is opened
* by the VM process. */
#define VERR_SUP_VP_STUB_NOT_FOUND (-5669)
-/** Error openeing the stub process for revalidation when vboxdrv is opened by
+/** Error opening the stub process for revalidation when vboxdrv is opened by
* the VM process. */
#define VERR_SUP_VP_STUB_OPEN_ERROR (-5670)
/** Stub process thread not found during revalidation upon vboxdrv opening by
diff --git a/include/VBox/hgcmsvc.h b/include/VBox/hgcmsvc.h
index 9442bb7..b3412ac 100644
--- a/include/VBox/hgcmsvc.h
+++ b/include/VBox/hgcmsvc.h
@@ -107,8 +107,8 @@ typedef struct VBOXHGCMSVCPARM
} pointer;
} u;
#ifdef __cplusplus
- /** Extract a uint32_t value from an HGCM parameter structure */
- int getUInt32 (uint32_t *u32)
+ /** Extract an uint32_t value from an HGCM parameter structure */
+ int getUInt32(uint32_t *u32)
{
AssertPtrReturn(u32, VERR_INVALID_POINTER);
int rc = VINF_SUCCESS;
@@ -120,7 +120,7 @@ typedef struct VBOXHGCMSVCPARM
}
/** Extract a uint64_t value from an HGCM parameter structure */
- int getUInt64 (uint64_t *u64)
+ int getUInt64(uint64_t *u64)
{
AssertPtrReturn(u64, VERR_INVALID_POINTER);
int rc = VINF_SUCCESS;
@@ -132,7 +132,7 @@ typedef struct VBOXHGCMSVCPARM
}
/** Extract a pointer value from an HGCM parameter structure */
- int getPointer (void **ppv, uint32_t *pcb)
+ int getPointer(void **ppv, uint32_t *pcb)
{
AssertPtrReturn(ppv, VERR_INVALID_POINTER);
AssertPtrReturn(pcb, VERR_INVALID_POINTER);
@@ -147,7 +147,7 @@ typedef struct VBOXHGCMSVCPARM
}
/** Extract a constant pointer value from an HGCM parameter structure */
- int getPointer (const void **ppcv, uint32_t *pcb)
+ int getPointer(const void **ppcv, uint32_t *pcb)
{
AssertPtrReturn(ppcv, VERR_INVALID_POINTER);
AssertPtrReturn(pcb, VERR_INVALID_POINTER);
@@ -159,7 +159,7 @@ typedef struct VBOXHGCMSVCPARM
/** Extract a pointer value to a non-empty buffer from an HGCM parameter
* structure */
- int getBuffer (void **ppv, uint32_t *pcb)
+ int getBuffer(void **ppv, uint32_t *pcb)
{
AssertPtrReturn(ppv, VERR_INVALID_POINTER);
AssertPtrReturn(pcb, VERR_INVALID_POINTER);
@@ -180,7 +180,7 @@ typedef struct VBOXHGCMSVCPARM
/** Extract a pointer value to a non-empty constant buffer from an HGCM
* parameter structure */
- int getBuffer (const void **ppcv, uint32_t *pcb)
+ int getBuffer(const void **ppcv, uint32_t *pcb)
{
AssertPtrReturn(ppcv, VERR_INVALID_POINTER);
AssertPtrReturn(pcb, VERR_INVALID_POINTER);
@@ -191,7 +191,7 @@ typedef struct VBOXHGCMSVCPARM
}
/** Extract a string value from an HGCM parameter structure */
- int getString (char **ppch, uint32_t *pcb)
+ int getString(char **ppch, uint32_t *pcb)
{
uint32_t cb = 0;
char *pch = NULL;
@@ -210,7 +210,7 @@ typedef struct VBOXHGCMSVCPARM
}
/** Extract a constant string value from an HGCM parameter structure */
- int getString (const char **ppch, uint32_t *pcb)
+ int getString(const char **ppch, uint32_t *pcb)
{
char *pch = NULL;
int rc = getString(&pch, pcb);
@@ -248,6 +248,16 @@ typedef struct VBOXHGCMSVCPARM
u.pointer.size = (uint32_t)strlen(psz) + 1;
}
+#ifdef ___iprt_cpp_ministring_h
+ /** Set a const string value to an HGCM parameter structure */
+ void setCppString(const RTCString &rString)
+ {
+ type = VBOX_HGCM_SVC_PARM_PTR;
+ u.pointer.addr = (void *)rString.c_str();
+ u.pointer.size = (uint32_t)rString.length() + 1;
+ }
+#endif
+
#ifdef VBOX_TEST_HGCM_PARMS
/** Test the getString member function. Indirectly tests the getPointer
* and getBuffer APIs.
diff --git a/include/VBox/intnet.h b/include/VBox/intnet.h
index 9fad909..19d398b 100644
--- a/include/VBox/intnet.h
+++ b/include/VBox/intnet.h
@@ -386,6 +386,26 @@ typedef enum INTNETSWDECISION
} INTNETSWDECISION;
+/**
+ * Network layer address type.
+ */
+typedef enum INTNETADDRTYPE
+{
+ /** The invalid 0 entry. */
+ kIntNetAddrType_Invalid = 0,
+ /** IP version 4. */
+ kIntNetAddrType_IPv4,
+ /** IP version 6. */
+ kIntNetAddrType_IPv6,
+ /** IPX. */
+ kIntNetAddrType_IPX,
+ /** The end of the valid values. */
+ kIntNetAddrType_End,
+ /** The usual 32-bit hack. */
+ kIntNetAddrType_32BitHack = 0x7fffffff
+} INTNETADDRTYPE;
+
+
/** Pointer to the interface side of a trunk port. */
typedef struct INTNETTRUNKIFPORT *PINTNETTRUNKIFPORT;
@@ -576,6 +596,23 @@ typedef struct INTNETTRUNKSWPORT
DECLR0CALLBACKMEMBER(void, pfnReportNoPreemptDsts,(PINTNETTRUNKSWPORT pSwitchPort, uint32_t fNoPreemptDsts));
/**
+ * Notifications about changes to host IP addresses.
+ *
+ * This is used by networks bridged to wifi that share mac with
+ * the host. Host reports changes to its IP addresses so that L3
+ * switching can ingore guests spoofing host's own IP addresses
+ *
+ * This callback may be null to indicate we are not interested.
+ *
+ * @param pSwitchPort Pointer to this structure.
+ * @param fAdded Whether address is added of removed.
+ * @param enmType Address type.
+ * @param pvAddr Pointer to the address.
+ */
+ DECLR0CALLBACKMEMBER(void, pfnNotifyHostAddress,(PINTNETTRUNKSWPORT pSwitchPort, bool fAdded,
+ INTNETADDRTYPE enmType, const void *pvAddr));
+
+ /**
* OS triggered trunk disconnect.
*
* The caller shall must be busy when calling this method to prevent racing the
@@ -602,7 +639,7 @@ typedef struct INTNETTRUNKSWPORT
} INTNETTRUNKSWPORT;
/** Version number for the INTNETTRUNKIFPORT::u32Version and INTNETTRUNKIFPORT::u32VersionEnd fields. */
-# define INTNETTRUNKSWPORT_VERSION UINT32_C(0xA2CDf003)
+# define INTNETTRUNKSWPORT_VERSION UINT32_C(0xA2CDf004)
/**
diff --git a/include/VBox/settings.h b/include/VBox/settings.h
index dbad7b4..9ca23f8 100644
--- a/include/VBox/settings.h
+++ b/include/VBox/settings.h
@@ -920,6 +920,7 @@ struct Hardware
CpuList llCpus; // requires settings version 1.10 (VirtualBox 3.2)
bool fHPETEnabled; // requires settings version 1.10 (VirtualBox 3.2)
uint32_t ulCpuExecutionCap; // requires settings version 1.11 (VirtualBox 3.3)
+ uint32_t uCpuIdPortabilityLevel; // requires settings version 1.15 (VirtualBox 5.0)
CpuIdLeafsList llCpuIdLeafs;
diff --git a/include/VBox/vmm/cpum.h b/include/VBox/vmm/cpum.h
index 244bc5a..85ee5a8 100644
--- a/include/VBox/vmm/cpum.h
+++ b/include/VBox/vmm/cpum.h
@@ -1073,6 +1073,7 @@ VMMDECL(int) CPUMSetGuestDR3(PVMCPU pVCpu, uint64_t uDr3);
VMMDECL(int) CPUMSetGuestDR6(PVMCPU pVCpu, uint64_t uDr6);
VMMDECL(int) CPUMSetGuestDR7(PVMCPU pVCpu, uint64_t uDr7);
VMMDECL(int) CPUMSetGuestDRx(PVMCPU pVCpu, uint32_t iReg, uint64_t Value);
+VMM_INT_DECL(int) CPUMSetGuestXcr0(PVMCPU pVCpu, uint64_t uNewValue);
VMMDECL(int) CPUMSetGuestEFlags(PVMCPU pVCpu, uint32_t eflags);
VMMDECL(int) CPUMSetGuestEIP(PVMCPU pVCpu, uint32_t eip);
VMMDECL(int) CPUMSetGuestEAX(PVMCPU pVCpu, uint32_t eax);
@@ -1344,7 +1345,6 @@ VMMDECL(bool) CPUMSupportsXSave(PVM pVM);
VMMDECL(bool) CPUMIsHostUsingSysEnter(PVM pVM);
VMMDECL(bool) CPUMIsHostUsingSysCall(PVM pVM);
VMMDECL(bool) CPUMIsGuestFPUStateActive(PVMCPU pVCpu);
-VMMDECL(void) CPUMDeactivateGuestFPUState(PVMCPU pVCpu);
VMMDECL(bool) CPUMIsGuestDebugStateActive(PVMCPU pVCpu);
VMMDECL(bool) CPUMIsGuestDebugStateActivePending(PVMCPU pVCpu);
VMMDECL(void) CPUMDeactivateGuestDebugState(PVMCPU pVCpu);
diff --git a/include/VBox/vmm/cpumctx.h b/include/VBox/vmm/cpumctx.h
index 7bfb1ff..4d98582 100644
--- a/include/VBox/vmm/cpumctx.h
+++ b/include/VBox/vmm/cpumctx.h
@@ -422,6 +422,39 @@ typedef struct CPUMCTX
AssertCompileSizeAlignment(CPUMCTX, 64);
/**
+ * Calculates the pointer to the given extended state component.
+ *
+ * @returns Pointer of type @a a_PtrType
+ * @param a_pCtx Pointer to the context.
+ * @param a_iCompBit The extended state component bit number. This bit
+ * must be set in CPUMCTX::fXStateMask.
+ * @param a_PtrType The pointer type of the extended state component.
+ *
+ */
+#if defined(VBOX_STRICT) && defined(RT_COMPILER_SUPPORTS_LAMBDA)
+# define CPUMCTX_XSAVE_C_PTR(a_pCtx, a_iCompBit, a_PtrType) \
+ ([](PCCPUMCTX a_pLambdaCtx) -> a_PtrType \
+ { \
+ AssertCompile((a_iCompBit) < 64U); \
+ AssertMsg(a_pLambdaCtx->fXStateMask & RT_BIT_64(a_iCompBit), (#a_iCompBit "\n")); \
+ AssertMsg(a_pLambdaCtx->aoffXState[(a_iCompBit)] != UINT16_MAX, (#a_iCompBit "\n")); \
+ return (a_PtrType)((uint8_t *)a_pLambdaCtx->CTX_SUFF(pXState) + a_pLambdaCtx->aoffXState[(a_iCompBit)]); \
+ }(a_pCtx))
+#elif defined(VBOX_STRICT) && defined(__GNUC__)
+# define CPUMCTX_XSAVE_C_PTR(a_pCtx, a_iCompBit, a_PtrType) \
+ __extension__ (\
+ { \
+ AssertCompile((a_iCompBit) < 64U); \
+ AssertMsg((a_pCtx)->fXStateMask & RT_BIT_64(a_iCompBit), (#a_iCompBit "\n")); \
+ AssertMsg((a_pCtx)->aoffXState[(a_iCompBit)] != UINT16_MAX, (#a_iCompBit "\n")); \
+ (a_PtrType)((uint8_t *)(a_pCtx)->CTX_SUFF(pXState) + (a_pCtx)->aoffXState[(a_iCompBit)]); \
+ })
+#else
+# define CPUMCTX_XSAVE_C_PTR(a_pCtx, a_iCompBit, a_PtrType) \
+ ((a_PtrType)((uint8_t *)(a_pCtx)->CTX_SUFF(pXState) + (a_pCtx)->aoffXState[(a_iCompBit)]))
+#endif
+
+/**
* Gets the CPUMCTXCORE part of a CPUMCTX.
*/
# define CPUMCTX2CORE(pCtx) ((PCPUMCTXCORE)(void *)&(pCtx)->rax)
diff --git a/include/VBox/vmm/hm.h b/include/VBox/vmm/hm.h
index fa3b4e7..9b5d3e2 100644
--- a/include/VBox/vmm/hm.h
+++ b/include/VBox/vmm/hm.h
@@ -182,16 +182,16 @@ VMMR0_INT_DECL(void) HMR0SavePendingIOPortWrite(PVMCPU pVCpu, RTGCPTR
VMMR0_INT_DECL(void) HMR0SavePendingIOPortRead(PVMCPU pVCpu, RTGCPTR GCPtrRip, RTGCPTR GCPtrRipNext,
unsigned uPort, unsigned uAndVal, unsigned cbSize);
#ifdef VBOX_STRICT
-# define HM_DISABLE_PREEMPT_IF_NEEDED() \
+# define HM_DISABLE_PREEMPT() \
RTTHREADPREEMPTSTATE PreemptStateInternal = RTTHREADPREEMPTSTATE_INITIALIZER; \
Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD) || VMMR0ThreadCtxHooksAreRegistered(pVCpu)); \
RTThreadPreemptDisable(&PreemptStateInternal);
#else
-# define HM_DISABLE_PREEMPT_IF_NEEDED() \
+# define HM_DISABLE_PREEMPT() \
RTTHREADPREEMPTSTATE PreemptStateInternal = RTTHREADPREEMPTSTATE_INITIALIZER; \
RTThreadPreemptDisable(&PreemptStateInternal);
#endif /* VBOX_STRICT */
-# define HM_RESTORE_PREEMPT_IF_NEEDED() do { RTThreadPreemptRestore(&PreemptStateInternal); } while(0)
+# define HM_RESTORE_PREEMPT() do { RTThreadPreemptRestore(&PreemptStateInternal); } while(0)
VMMR0_INT_DECL(int) HMR0SetupVM(PVM pVM);
diff --git a/include/VBox/vmm/hm_svm.h b/include/VBox/vmm/hm_svm.h
index ccb6bdb..5cd73f8 100644
--- a/include/VBox/vmm/hm_svm.h
+++ b/include/VBox/vmm/hm_svm.h
@@ -263,6 +263,8 @@
#define SVM_EXIT_MWAIT 0x8B
/** MWAIT instruction, when armed. */
#define SVM_EXIT_MWAIT_ARMED 0x8C
+/** XSETBV instruction. */
+#define SVM_EXIT_XSETBV 0x8D
/** Nested paging: host-level page fault occurred (EXITINFO1 contains fault errorcode; EXITINFO2 contains the guest physical address causing the fault). */
#define SVM_EXIT_NPF 0x400
/** AVIC: Virtual IPI delivery not completed. */
@@ -280,22 +282,22 @@
* @{
*/
/** Set to 1 if the task switch was caused by an IRET; else cleared to 0. */
-#define SVM_EXIT2_TASK_SWITCH_IRET RT_BIT_64(36)
+#define SVM_EXIT2_TASK_SWITCH_IRET RT_BIT_64(36)
/** Set to 1 if the task switch was caused by a far jump; else cleared to 0. */
-#define SVM_EXIT2_TASK_SWITCH_JMP RT_BIT_64(38)
+#define SVM_EXIT2_TASK_SWITCH_JMP RT_BIT_64(38)
/** Set to 1 if the task switch has an error code; else cleared to 0. */
-#define SVM_EXIT2_TASK_SWITCH_HAS_ERROR_CODE RT_BIT_64(44)
+#define SVM_EXIT2_TASK_SWITCH_HAS_ERROR_CODE RT_BIT_64(44)
/** The value of EFLAGS.RF that would be saved in the outgoing TSS if the task switch were not intercepted. */
-#define SVM_EXIT2_TASK_SWITCH_EFLAGS_RF RT_BIT_64(48)
+#define SVM_EXIT2_TASK_SWITCH_EFLAGS_RF RT_BIT_64(48)
/** @} */
/** @name SVMVMCB.u64ExitInfo1 for MSR accesses
* @{
*/
/** The access was a read MSR. */
-#define SVM_EXIT1_MSR_READ 0x0
+#define SVM_EXIT1_MSR_READ 0x0
/** The access was a write MSR. */
-#define SVM_EXIT1_MSR_WRITE 0x1
+#define SVM_EXIT1_MSR_WRITE 0x1
/** @} */
/** @name SVMVMCB.ctrl.u32InterceptCtrl1
@@ -404,13 +406,13 @@
/** @name SVMVMCB.ctrl.u64NestedPaging
* @{
*/
-#define SVM_NESTED_PAGING_ENABLE RT_BIT(0)
+#define SVM_NESTED_PAGING_ENABLE RT_BIT(0)
/** @} */
/** @name SVMVMCB.ctrl.u64IntShadow
* @{
*/
-#define SVM_INTERRUPT_SHADOW_ACTIVE RT_BIT(0)
+#define SVM_INTERRUPT_SHADOW_ACTIVE RT_BIT(0)
/** @} */
@@ -850,7 +852,7 @@ AssertCompileMemberOffset(SVMVMCB, guest.u64BR_FROM, 0x678);
AssertCompileMemberOffset(SVMVMCB, guest.u64BR_TO, 0x680);
AssertCompileMemberOffset(SVMVMCB, guest.u64LASTEXCPFROM, 0x688);
AssertCompileMemberOffset(SVMVMCB, guest.u64LASTEXCPTO, 0x690);
-AssertCompileMemberOffset(SVMVMCB, u8Reserved10, 0x698);
+AssertCompileMemberOffset(SVMVMCB, u8Reserved10, 0x698);
AssertCompileSize(SVMVMCB, 0x1000);
#ifdef IN_RING0
diff --git a/include/VBox/vmm/iem.h b/include/VBox/vmm/iem.h
index 6c298f2..3a5f249 100644
--- a/include/VBox/vmm/iem.h
+++ b/include/VBox/vmm/iem.h
@@ -85,6 +85,7 @@ VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxWrite(PVMCPU pVCpu, uint8_t cbIn
VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxRead(PVMCPU pVCpu, uint8_t cbInstr, uint8_t iGReg, uint8_t iCrReg);
VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedClts(PVMCPU pVCpu, uint8_t cbInstr);
VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedLmsw(PVMCPU pVCpu, uint8_t cbInstr, uint16_t uValue);
+VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedXsetbv(PVMCPU pVCpu, uint8_t cbInstr);
/** @} */
#if defined(IEM_VERIFICATION_MODE) && defined(IN_RING3)
diff --git a/include/VBox/vmm/mm.h b/include/VBox/vmm/mm.h
index 615a58d..d7117a0 100644
--- a/include/VBox/vmm/mm.h
+++ b/include/VBox/vmm/mm.h
@@ -111,6 +111,7 @@ typedef enum MMTAG
MM_TAG_PGM,
MM_TAG_PGM_CHUNK_MAPPING,
MM_TAG_PGM_HANDLERS,
+ MM_TAG_PGM_HANDLER_TYPES,
MM_TAG_PGM_MAPPINGS,
MM_TAG_PGM_PHYS,
MM_TAG_PGM_POOL,
@@ -215,6 +216,8 @@ VMMDECL(void) MMHyperHeapDump(PVM pVM);
#endif
VMMDECL(size_t) MMHyperHeapGetFreeSize(PVM pVM);
VMMDECL(size_t) MMHyperHeapGetSize(PVM pVM);
+VMMDECL(void *) MMHyperHeapOffsetToPtr(PVM pVM, uint32_t offHeap);
+VMMDECL(uint32_t) MMHyperHeapPtrToOffset(PVM pVM, void *pv);
VMMDECL(RTGCPTR) MMHyperGetArea(PVM pVM, size_t *pcb);
VMMDECL(bool) MMHyperIsInsideArea(PVM pVM, RTGCPTR GCPtr);
@@ -250,6 +253,7 @@ VMMR3DECL(int) MMR3InitPaging(PVM pVM);
VMMR3DECL(int) MMR3HyperInitFinalize(PVM pVM);
VMMR3DECL(int) MMR3Term(PVM pVM);
VMMR3DECL(void) MMR3TermUVM(PUVM pUVM);
+VMMR3_INT_DECL(bool) MMR3IsInitialized(PVM pVM);
VMMR3DECL(int) MMR3ReserveHandyPages(PVM pVM, uint32_t cHandyPages);
VMMR3DECL(int) MMR3IncreaseBaseReservation(PVM pVM, uint64_t cAddBasePages);
VMMR3DECL(int) MMR3AdjustFixedReservation(PVM pVM, int32_t cDeltaFixedPages, const char *pszDesc);
diff --git a/include/VBox/vmm/pdmaudioifs.h b/include/VBox/vmm/pdmaudioifs.h
index bc3f6dc..ed77904 100644
--- a/include/VBox/vmm/pdmaudioifs.h
+++ b/include/VBox/vmm/pdmaudioifs.h
@@ -69,8 +69,8 @@ typedef enum PDMAUDIOFMT
*/
typedef struct PDMAUDIOBACKENDCFG
{
- size_t cbStreamOut;
- size_t cbStreamIn;
+ uint32_t cbStreamOut;
+ uint32_t cbStreamIn;
uint32_t cMaxHstStrmsOut;
uint32_t cMaxHstStrmsIn;
} PDMAUDIOBACKENDCFG, *PPDMAUDIOBACKENDCFG;
@@ -82,25 +82,25 @@ typedef struct PDMAUDIOBACKENDCFG
*/
typedef struct PDMAUDIOSAMPLE
{
- int64_t u64LSample;
- int64_t u64RSample;
+ int64_t i64LSample;
+ int64_t i64RSample;
} PDMAUDIOSAMPLE, *PPDMAUDIOSAMPLE;
-typedef enum PDMAUDIOENDIANESS
+typedef enum PDMAUDIOENDIANNESS
{
/** The usual invalid endian. */
- PDMAUDIOENDIANESS_INVALID,
+ PDMAUDIOENDIANNESS_INVALID,
/** Little endian. */
- PDMAUDIOENDIANESS_LITTLE,
+ PDMAUDIOENDIANNESS_LITTLE,
/** Bit endian. */
- PDMAUDIOENDIANESS_BIG,
+ PDMAUDIOENDIANNESS_BIG,
/** Endianness doesn't have a meaning in the context. */
- PDMAUDIOENDIANESS_NA,
+ PDMAUDIOENDIANNESS_NA,
/** The end of the valid endian values (exclusive). */
- PDMAUDIOENDIANESS_END,
+ PDMAUDIOENDIANNESS_END,
/** Hack to blow the type up to 32-bit. */
- PDMAUDIOENDIANESS_32BIT_HACK = 0x7fffffff
-} PDMAUDIOENDIANESS;
+ PDMAUDIOENDIANNESS_32BIT_HACK = 0x7fffffff
+} PDMAUDIOENDIANNESS;
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
typedef struct PDMAUDIOSTREAMCFG
@@ -112,14 +112,14 @@ typedef struct PDMAUDIOSTREAMCFG
/** Audio format. */
PDMAUDIOFMT enmFormat;
/** @todo Use RT_LE2H_*? */
- PDMAUDIOENDIANESS enmEndianness;
+ PDMAUDIOENDIANNESS enmEndianness;
} PDMAUDIOSTREAMCFG, *PPDMAUDIOSTREAMCFG;
#endif
#if defined(RT_LITTLE_ENDIAN)
-# define PDMAUDIOHOSTENDIANESS PDMAUDIOENDIANESS_LITTLE
+# define PDMAUDIOHOSTENDIANNESS PDMAUDIOENDIANNESS_LITTLE
#elif defined(RT_BIG_ENDIAN)
-# define PDMAUDIOHOSTENDIANESS PDMAUDIOENDIANESS_BIG
+# define PDMAUDIOHOSTENDIANNESS PDMAUDIOENDIANNESS_BIG
#else
# error "Port me!"
#endif
@@ -198,7 +198,7 @@ typedef struct PDMPCMPROPS
uint32_t uHz;
/** Bandwidth (bytes/s). */
uint32_t cbPerSec;
- /** Whether the endianess is swapped or not. */
+ /** Whether the endianness is swapped or not. */
bool fSwapEndian;
} PDMPCMPROPS, *PPDMPCMPROPS;
@@ -414,7 +414,7 @@ typedef struct PDMIAUDIOCONNECTOR
* @param cbSize Number of bytes to read.
* @param pcbRead Bytes of audio data read. Optional.
*/
- DECLR3CALLBACKMEMBER(int, pfnRead, (PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMIN pGstStrmIn, void *pvBuf, size_t cbSize, uint32_t *pcbRead));
+ DECLR3CALLBACKMEMBER(int, pfnRead, (PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMIN pGstStrmIn, void *pvBuf, uint32_t cbSize, uint32_t *pcbRead));
/**
* Writes PCM audio data to the host (output).
@@ -426,7 +426,7 @@ typedef struct PDMIAUDIOCONNECTOR
* @param cbSize Number of bytes to be written.
* @param pcbWritten Bytes of audio data written. Optional.
*/
- DECLR3CALLBACKMEMBER(int, pfnWrite, (PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut, const void *pvBuf, size_t cbSize, uint32_t *pcbWritten));
+ DECLR3CALLBACKMEMBER(int, pfnWrite, (PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut, const void *pvBuf, uint32_t cbSize, uint32_t *pcbWritten));
/**
* Checks whether the specified guest input stream is in a working state.
diff --git a/include/VBox/vmm/pgm.h b/include/VBox/vmm/pgm.h
index 8f1e23c..5327056 100644
--- a/include/VBox/vmm/pgm.h
+++ b/include/VBox/vmm/pgm.h
@@ -76,18 +76,18 @@ typedef FNPGMRELOCATE *PFNPGMRELOCATE;
/**
- * Physical page access handler type.
+ * Physical page access handler kind.
*/
-typedef enum PGMPHYSHANDLERTYPE
+typedef enum PGMPHYSHANDLERKIND
{
/** MMIO range. Pages are not present, all access is done in interpreter or recompiler. */
- PGMPHYSHANDLERTYPE_MMIO = 1,
+ PGMPHYSHANDLERKIND_MMIO = 1,
/** Handler all write access to a physical page range. */
- PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
+ PGMPHYSHANDLERKIND_WRITE,
/** Handler all access to a physical page range. */
- PGMPHYSHANDLERTYPE_PHYSICAL_ALL
+ PGMPHYSHANDLERKIND_ALL
-} PGMPHYSHANDLERTYPE;
+} PGMPHYSHANDLERKIND;
/**
* \#PF Handler callback for physical access handler ranges in RC.
@@ -347,18 +347,24 @@ VMMDECL(PGMMODE) PGMGetHostMode(PVM pVM);
VMMDECL(const char *) PGMGetModeName(PGMMODE enmMode);
VMM_INT_DECL(void) PGMNotifyNxeChanged(PVMCPU pVCpu, bool fNxe);
VMMDECL(bool) PGMHasDirtyPages(PVM pVM);
-VMMDECL(int) PGMHandlerPhysicalRegisterEx(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast,
- R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
- R3PTRTYPE(const char *) pszDesc);
+
+/** PGM physical access handler type registration handle (heap offset, valid
+ * cross contexts without needing fixing up). Callbacks and handler type is
+ * associated with this and it is shared by all handler registrations. */
+typedef uint32_t PGMPHYSHANDLERTYPE;
+/** Pointer to a PGM physical handler type registration handle. */
+typedef PGMPHYSHANDLERTYPE *PPGMPHYSHANDLERTYPE;
+/** NIL value for PGM physical access handler type handle. */
+#define NIL_PGMPHYSHANDLERTYPE UINT32_MAX
+VMMDECL(uint32_t) PGMHandlerPhysicalTypeRelease(PVM pVM, PGMPHYSHANDLERTYPE hCallbacks);
+VMMDECL(uint32_t) PGMHandlerPhysicalTypeRetain(PVM pVM, PGMPHYSHANDLERTYPE hCallbacks);
+
+VMMDECL(int) PGMHandlerPhysicalRegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast, PGMPHYSHANDLERTYPE hType,
+ RTR3PTR pvUserR3, RTR0PTR pvUserR0, RTRCPTR pvUserRC,
+ R3PTRTYPE(const char *) pszDesc);
VMMDECL(int) PGMHandlerPhysicalModify(PVM pVM, RTGCPHYS GCPhysCurrent, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast);
VMMDECL(int) PGMHandlerPhysicalDeregister(PVM pVM, RTGCPHYS GCPhys);
-VMMDECL(int) PGMHandlerPhysicalChangeCallbacks(PVM pVM, RTGCPHYS GCPhys,
- R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
- R3PTRTYPE(const char *) pszDesc);
+VMMDECL(int) PGMHandlerPhysicalChangeUserArgs(PVM pVM, RTGCPHYS GCPhys, RTR3PTR pvUserR3, RTR0PTR pvUserR0, RTRCPTR pvUserRC);
VMMDECL(int) PGMHandlerPhysicalSplit(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysSplit);
VMMDECL(int) PGMHandlerPhysicalJoin(PVM pVM, RTGCPHYS GCPhys1, RTGCPHYS GCPhys2);
VMMDECL(int) PGMHandlerPhysicalPageTempOff(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage);
@@ -472,11 +478,8 @@ VMMR3DECL(int) PGMR3PhysGetRange(PVM pVM, uint32_t iRange, PRTGCPHYS pGCPhy
VMMR3DECL(int) PGMR3QueryMemoryStats(PUVM pUVM, uint64_t *pcbTotalMem, uint64_t *pcbPrivateMem, uint64_t *pcbSharedMem, uint64_t *pcbZeroMem);
VMMR3DECL(int) PGMR3QueryGlobalMemoryStats(PUVM pUVM, uint64_t *pcbAllocMem, uint64_t *pcbFreeMem, uint64_t *pcbBallonedMem, uint64_t *pcbSharedMem);
-VMMR3DECL(int) PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb,
- R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
- R3PTRTYPE(const char *) pszDesc);
+VMMR3DECL(int) PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, PGMPHYSHANDLERTYPE hType,
+ RTR3PTR pvUserR3, RTR0PTR pvUserR0, RTRCPTR pvUserRC, const char *pszDesc);
VMMR3DECL(int) PGMR3PhysMMIODeregister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb);
VMMR3DECL(int) PGMR3PhysMMIO2Register(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion, RTGCPHYS cb, uint32_t fFlags, void **ppv, const char *pszDesc);
VMMR3DECL(int) PGMR3PhysMMIO2Deregister(PVM pVM, PPDMDEVINS pDevIns, uint32_t iRegion);
@@ -517,10 +520,16 @@ VMMR3DECL(int) PGMR3MapIntermediate(PVM pVM, RTUINTPTR Addr, RTHCPHYS HCPhy
#endif
VMMR3DECL(int) PGMR3MapRead(PVM pVM, void *pvDst, RTGCPTR GCPtrSrc, size_t cb);
-VMMR3DECL(int) PGMR3HandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast,
- PFNPGMR3PHYSHANDLER pfnHandlerR3, void *pvUserR3,
- const char *pszModR0, const char *pszHandlerR0, RTR0PTR pvUserR0,
- const char *pszModRC, const char *pszHandlerRC, RTRCPTR pvUserRC, const char *pszDesc);
+VMM_INT_DECL(int) PGMR3HandlerPhysicalTypeRegisterEx(PVM pVM, PGMPHYSHANDLERKIND enmKind,
+ PFNPGMR3PHYSHANDLER pfnHandlerR3,
+ R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0,
+ RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC,
+ const char *pszDesc, PPGMPHYSHANDLERTYPE phType);
+VMMR3DECL(int) PGMR3HandlerPhysicalTypeRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind,
+ R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3,
+ const char *pszModR0, const char *pszHandlerR0,
+ const char *pszModRC, const char *pszHandlerRC, const char *pszDesc,
+ PPGMPHYSHANDLERTYPE phType);
VMMDECL(int) PGMR3HandlerVirtualRegisterEx(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
R3PTRTYPE(PFNPGMR3VIRTINVALIDATE) pfnInvalidateR3,
R3PTRTYPE(PFNPGMR3VIRTHANDLER) pfnHandlerR3,
diff --git a/include/VBox/vmm/rem.h b/include/VBox/vmm/rem.h
index adae97e..77fa325 100644
--- a/include/VBox/vmm/rem.h
+++ b/include/VBox/vmm/rem.h
@@ -43,9 +43,9 @@ RT_C_DECLS_BEGIN
#if defined(IN_RING0) || defined(IN_RC)
VMMDECL(void) REMNotifyInvalidatePage(PVM pVM, RTGCPTR GCPtrPage);
-VMMDECL(void) REMNotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler);
-VMMDECL(void) REMNotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
-VMMDECL(void) REMNotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
+VMMDECL(void) REMNotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler);
+VMMDECL(void) REMNotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
+VMMDECL(void) REMNotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
#endif /* IN_RING0 || IN_RC */
#ifdef IN_RC
VMMDECL(void) REMNotifyHandlerPhysicalFlushIfAlmostFull(PVM pVM, PVMCPU pVCpu);
@@ -81,9 +81,9 @@ REMR3DECL(void) REMR3NotifyPhysRamRegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb
/** @} */
REMR3DECL(void) REMR3NotifyPhysRomRegister(PVM pVM, RTGCPHYS GCPhys, RTUINT cb, void *pvCopy, bool fShadow);
REMR3DECL(void) REMR3NotifyPhysRamDeregister(PVM pVM, RTGCPHYS GCPhys, RTUINT cb);
-REMR3DECL(void) REMR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler);
-REMR3DECL(void) REMR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
-REMR3DECL(void) REMR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
+REMR3DECL(void) REMR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler);
+REMR3DECL(void) REMR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
+REMR3DECL(void) REMR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
REMR3DECL(void) REMR3NotifyPendingInterrupt(PVM pVM, PVMCPU pVCpu, uint8_t u8Interrupt);
REMR3DECL(uint32_t) REMR3QueryPendingInterrupt(PVM pVM, PVMCPU pVCpu);
REMR3DECL(void) REMR3NotifyInterruptSet(PVM pVM, PVMCPU pVCpu);
diff --git a/include/VBox/vmm/ssm.h b/include/VBox/vmm/ssm.h
index b56152f..5d7dda9 100644
--- a/include/VBox/vmm/ssm.h
+++ b/include/VBox/vmm/ssm.h
@@ -224,73 +224,78 @@ typedef struct SSMFIELD
uint32_t off;
/** The size of the field. */
uint32_t cb;
+ /** This field was first saved by this unit version number. */
+ uint32_t uFirstVer;
/** Field name. */
const char *pszName;
} SSMFIELD;
/** Emit a SSMFIELD array entry.
* @internal */
-#define SSMFIELD_ENTRY_INT(Name, off, cb, enmTransformer) \
- { (PFNSSMFIELDGETPUT)(uintptr_t)(enmTransformer), (off), (cb), Name }
+#define SSMFIELD_ENTRY_INT(Name, off, cb, enmTransformer, uFirstVer) \
+ { (PFNSSMFIELDGETPUT)(uintptr_t)(enmTransformer), (off), (cb), (uFirstVer), Name }
/** Emit a SSMFIELD array entry.
* @internal */
-#define SSMFIELD_ENTRY_TF_INT(Type, Field, enmTransformer) \
- SSMFIELD_ENTRY_INT(#Type "::" #Field, RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), enmTransformer)
+#define SSMFIELD_ENTRY_TF_INT(Type, Field, enmTransformer, uFirstVer) \
+ SSMFIELD_ENTRY_INT(#Type "::" #Field, RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), enmTransformer, uFirstVer)
/** Emit a SSMFIELD array entry for an old field.
* @internal */
#define SSMFIELD_ENTRY_OLD_INT(Field, cb, enmTransformer) \
- SSMFIELD_ENTRY_INT("old::" #Field, UINT32_MAX / 2, (cb), enmTransformer)
+ SSMFIELD_ENTRY_INT("old::" #Field, UINT32_MAX / 2, (cb), enmTransformer, 0)
/** Emit a SSMFIELD array entry for an alignment padding.
* @internal */
#define SSMFIELD_ENTRY_PAD_INT(Type, Field, cb32, cb64, enmTransformer) \
SSMFIELD_ENTRY_INT(#Type "::" #Field, RT_OFFSETOF(Type, Field), \
- (RT_SIZEOFMEMB(Type, Field) << 16) | (cb32) | ((cb64) << 8), enmTransformer)
+ (RT_SIZEOFMEMB(Type, Field) << 16) | (cb32) | ((cb64) << 8), enmTransformer, 0)
/** Emit a SSMFIELD array entry for an alignment padding.
* @internal */
#define SSMFIELD_ENTRY_PAD_OTHER_INT(Type, Field, cb32, cb64, enmTransformer) \
- SSMFIELD_ENTRY_INT(#Type "::" #Field, UINT32_MAX / 2, 0 | (cb32) | ((cb64) << 8), enmTransformer)
+ SSMFIELD_ENTRY_INT(#Type "::" #Field, UINT32_MAX / 2, 0 | (cb32) | ((cb64) << 8), enmTransformer, 0)
/** Emit a SSMFIELD array entry. */
-#define SSMFIELD_ENTRY(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_NO_TRANSFORMATION)
+#define SSMFIELD_ENTRY(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_NO_TRANSFORMATION, 0)
+/** Emit a SSMFIELD array entry with first version. */
+#define SSMFIELD_ENTRY_VER(Type, Field, uFirstVer) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_NO_TRANSFORMATION, uFirstVer)
/** Emit a SSMFIELD array entry for a custom made field. This is intended
* for working around bitfields in old structures. */
-#define SSMFIELD_ENTRY_CUSTOM(Field, off, cb) SSMFIELD_ENTRY_INT("custom::" #Field, off, cb, SSMFIELDTRANS_NO_TRANSFORMATION)
+#define SSMFIELD_ENTRY_CUSTOM(Field, off, cb) SSMFIELD_ENTRY_INT("custom::" #Field, off, cb, \
+ SSMFIELDTRANS_NO_TRANSFORMATION, 0)
/** Emit a SSMFIELD array entry for a RTGCPHYS type. */
-#define SSMFIELD_ENTRY_GCPHYS(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_GCPHYS)
+#define SSMFIELD_ENTRY_GCPHYS(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_GCPHYS, 0)
/** Emit a SSMFIELD array entry for a RTGCPTR type. */
-#define SSMFIELD_ENTRY_GCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_GCPTR)
+#define SSMFIELD_ENTRY_GCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_GCPTR, 0)
/** Emit a SSMFIELD array entry for a raw-mode context pointer. */
-#define SSMFIELD_ENTRY_RCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_RCPTR)
+#define SSMFIELD_ENTRY_RCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_RCPTR, 0)
/** Emit a SSMFIELD array entry for a raw-mode context pointer. */
-#define SSMFIELD_ENTRY_RCPTR_ARRAY(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_RCPTR_ARRAY)
+#define SSMFIELD_ENTRY_RCPTR_ARRAY(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_RCPTR_ARRAY, 0)
/** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that is only
* of interest as a NULL indicator.
*
* This is always restored as a 0 (NULL) or 1 value. When
* SSMSTRUCT_FLAGS_DONT_IGNORE is set, the pointer will be saved in its
* entirety, when clear it will be saved as a boolean. */
-#define SSMFIELD_ENTRY_HCPTR_NI(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI)
+#define SSMFIELD_ENTRY_HCPTR_NI(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI, 0)
/** Same as SSMFIELD_ENTRY_HCPTR_NI, except it's an array of the buggers. */
-#define SSMFIELD_ENTRY_HCPTR_NI_ARRAY(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI_ARRAY)
+#define SSMFIELD_ENTRY_HCPTR_NI_ARRAY(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI_ARRAY, 0)
/** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that has
* been hacked such that it will never exceed 32-bit. No sign extending. */
-#define SSMFIELD_ENTRY_HCPTR_HACK_U32(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_HACK_U32)
+#define SSMFIELD_ENTRY_HCPTR_HACK_U32(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_HACK_U32, 0)
/** Emit a SSMFIELD array entry for loading a 32-bit field into a 64-bit
* structure member, zero extending the value. */
-#define SSMFIELD_ENTRY_U32_ZX_U64(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_U32_ZX_U64)
+#define SSMFIELD_ENTRY_U32_ZX_U64(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_U32_ZX_U64, 0)
/** Emit a SSMFIELD array entry for a field that can be ignored.
* It is stored as zeros if SSMSTRUCT_FLAGS_DONT_IGNORE is specified to
* SSMR3PutStructEx. The member is never touched upon restore. */
-#define SSMFIELD_ENTRY_IGNORE(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGNORE)
+#define SSMFIELD_ENTRY_IGNORE(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGNORE, 0)
/** Emit a SSMFIELD array entry for an ignorable RTGCPHYS type. */
-#define SSMFIELD_ENTRY_IGN_GCPHYS(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_GCPHYS)
+#define SSMFIELD_ENTRY_IGN_GCPHYS(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_GCPHYS, 0)
/** Emit a SSMFIELD array entry for an ignorable RTGCPHYS type. */
-#define SSMFIELD_ENTRY_IGN_GCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_GCPTR)
+#define SSMFIELD_ENTRY_IGN_GCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_GCPTR, 0)
/** Emit a SSMFIELD array entry for an ignorable raw-mode context pointer. */
-#define SSMFIELD_ENTRY_IGN_RCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_RCPTR)
+#define SSMFIELD_ENTRY_IGN_RCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_RCPTR, 0)
/** Emit a SSMFIELD array entry for an ignorable ring-3 or/and ring-0 pointer. */
-#define SSMFIELD_ENTRY_IGN_HCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_HCPTR)
+#define SSMFIELD_ENTRY_IGN_HCPTR(Type, Field) SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_HCPTR, 0)
/** Emit a SSMFIELD array entry for an old field that should be ignored now.
* It is stored as zeros and skipped on load. */
@@ -334,13 +339,13 @@ typedef struct SSMFIELD
# define SSMFIELD_ENTRY_PAD_HC_AUTO(cb32, cb64) \
{ \
(PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_HC_AUTO), \
- UINT32_MAX / 2, (cb64 << 16) | (cb32) | ((cb64) << 8), "<compiler-padding>" \
+ UINT32_MAX / 2, (cb64 << 16) | (cb32) | ((cb64) << 8), 0, "<compiler-padding>" \
}
#else
# define SSMFIELD_ENTRY_PAD_HC_AUTO(cb32, cb64) \
{ \
(PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_HC_AUTO), \
- UINT32_MAX / 2, (cb32 << 16) | (cb32) | ((cb64) << 8), "<compiler-padding>" \
+ UINT32_MAX / 2, (cb32 << 16) | (cb32) | ((cb64) << 8), 0, "<compiler-padding>" \
}
#endif
/** Emit a SSMFIELD array entry for an automatic compiler padding that is unique
@@ -350,21 +355,22 @@ typedef struct SSMFIELD
# define SSMFIELD_ENTRY_PAD_MSC32_AUTO(cb) \
{ \
(PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_MSC32_AUTO), \
- UINT32_MAX / 2, ((cb) << 16) | (cb), "<msc32-padding>" \
+ UINT32_MAX / 2, ((cb) << 16) | (cb), 0, "<msc32-padding>" \
}
#else
# define SSMFIELD_ENTRY_PAD_MSC32_AUTO(cb) \
{ \
(PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_MSC32_AUTO), \
- UINT32_MAX / 2, (cb), "<msc32-padding>" \
+ UINT32_MAX / 2, (cb), 0, "<msc32-padding>" \
}
#endif
/** Emit a SSMFIELD array entry for a field with a custom callback. */
#define SSMFIELD_ENTRY_CALLBACK(Type, Field, pfnGetPut) \
- { (pfnGetPut), RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), #Type "::" #Field }
+ { (pfnGetPut), RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), 0, #Type "::" #Field }
/** Emit the terminating entry of a SSMFIELD array. */
-#define SSMFIELD_ENTRY_TERM() { (PFNSSMFIELDGETPUT)(uintptr_t)SSMFIELDTRANS_INVALID, UINT32_MAX, UINT32_MAX, NULL }
+#define SSMFIELD_ENTRY_TERM() \
+ { (PFNSSMFIELDGETPUT)(uintptr_t)SSMFIELDTRANS_INVALID, UINT32_MAX, UINT32_MAX, UINT32_MAX, NULL }
/** @name SSMR3GetStructEx and SSMR3PutStructEx flags.
diff --git a/include/iprt/asm-amd64-x86.h b/include/iprt/asm-amd64-x86.h
index 0f6a4c1..5d172b6 100644
--- a/include/iprt/asm-amd64-x86.h
+++ b/include/iprt/asm-amd64-x86.h
@@ -1731,13 +1731,27 @@ DECLINLINE(RTCCUINTREG) ASMGetCR8(void)
*/
DECLASM(uint64_t) ASMGetXcr0(void);
-
/**
* Sets the XCR0 register.
* @param uXcr0 The new XCR0 value.
*/
DECLASM(void) ASMSetXcr0(uint64_t uXcr0);
+struct X86XSAVEAREA;
+/**
+ * Save extended CPU state.
+ * @param pXStateArea Where to save the state.
+ * @param fComponents Which state components to save.
+ */
+DECLASM(void) ASMXSave(struct X86XSAVEAREA *pXStateArea, uint64_t fComponents);
+
+/**
+ * Loads extended CPU state.
+ * @param pXStateArea Where to load the state from.
+ * @param fComponents Which state components to load.
+ */
+DECLASM(void) ASMXRstor(struct X86XSAVEAREA const *pXStateArea, uint64_t fComponents);
+
/**
* Enables interrupts (EFLAGS.IF).
@@ -3078,6 +3092,49 @@ DECLINLINE(void) ASMReadFenceSSE2(void)
#endif
}
+#if !defined(_MSC_VER) || !defined(RT_ARCH_AMD64)
+
+/*
+ * Clear the AC bit in the EFLAGS register.
+ * Requires the X86_CPUID_STEXT_FEATURE_EBX_SMAP CPUID bit set.
+ * Requires to be executed in R0.
+ */
+DECLINLINE(void) ASMClearAC(void)
+{
+#if RT_INLINE_ASM_GNU_STYLE
+ __asm__ __volatile__ (".byte 0x0f,0x01,0xca\n\t");
+#else
+ __asm
+ {
+ _emit 0x0f
+ _emit 0x01
+ _emit 0xca
+ }
+#endif
+}
+
+
+/*
+ * Set the AC bit in the EFLAGS register.
+ * Requires the X86_CPUID_STEXT_FEATURE_EBX_SMAP CPUID bit set.
+ * Requires to be executed in R0.
+ */
+DECLINLINE(void) ASMSetAC(void)
+{
+#if RT_INLINE_ASM_GNU_STYLE
+ __asm__ __volatile__ (".byte 0x0f,0x01,0xcb\n\t");
+#else
+ __asm
+ {
+ _emit 0x0f
+ _emit 0x01
+ _emit 0xcb
+ }
+#endif
+}
+
+#endif /* !_MSC_VER) || !RT_ARCH_AMD64 */
+
/** @} */
#endif
diff --git a/include/iprt/cdefs.h b/include/iprt/cdefs.h
index ca58a9f..14d2f87 100644
--- a/include/iprt/cdefs.h
+++ b/include/iprt/cdefs.h
@@ -2687,6 +2687,17 @@
# define RT_INLINE_ASM_USES_INTRIN 0
#endif
+/** @def RT_COMPILER_SUPPORTS_LAMBDA
+ * If the defined, the compiler supports lambda expressions. These expressions
+ * are useful for embedding assertions and type checks into macros. */
+#if defined(_MSC_VER) && defined(__cplusplus)
+# if _MSC_VER >= 1600 /* Visual C++ v10.0 / 2010 */
+# define RT_COMPILER_SUPPORTS_LAMBDA
+# endif
+#elif defined(__GNUC__) && defined(__cplusplus)
+/* 4.5 or later, I think, if in ++11 mode... */
+#endif
+
/** @} */
diff --git a/include/iprt/env.h b/include/iprt/env.h
index 916e6ee..abb424d 100644
--- a/include/iprt/env.h
+++ b/include/iprt/env.h
@@ -80,6 +80,15 @@ RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone);
RTDECL(int) RTEnvDestroy(RTENV Env);
/**
+ * Resets the environment block to contain zero variables.
+ *
+ * @returns IPRT status code.
+ *
+ * @param hEnv Environment block handle. RTENV_DEFAULT is not supported.
+ */
+RTDECL(int) RTEnvReset(RTENV hEnv);
+
+/**
* Get the execve/spawnve/main envp.
*
* All returned strings are in the current process' codepage.
@@ -113,6 +122,30 @@ RTDECL(int) RTEnvQueryUtf16Block(RTENV hEnv, PRTUTF16 *ppwszzBlock);
RTDECL(void) RTEnvFreeUtf16Block(PRTUTF16 pwszzBlock);
/**
+ * Get a sorted, UTF-8 environment block.
+ *
+ * The environment block is a sequence of putenv formatted ("NAME=VALUE" or
+ * "NAME") zero terminated strings ending with an empty string (i.e. last string
+ * has two zeros).
+ *
+ * @returns IPRT status code.
+ *
+ * @param hEnv Environment block handle.
+ * @param fSorted Whether to sort it, this will affect @a hEnv.
+ * @param ppszzBlock Where to return the environment block. This must be
+ * freed by calling RTEnvFreeUtf8Block.
+ * @param pcbBlock Where to return the size of the block. Optional.
+ */
+RTDECL(int) RTEnvQueryUtf8Block(RTENV hEnv, bool fSorted, char **ppszzBlock, size_t *pcbBlock);
+
+/**
+ * Frees an environment block returned by RTEnvGetUtf8Block().
+ *
+ * @param pszzBlock What RTEnvGetUtf8Block returned. NULL is ignored.
+ */
+RTDECL(void) RTEnvFreeUtf8Block(char *pszzBlock);
+
+/**
* Checks if an environment variable exists in the default environment block.
*
* @returns IPRT status code. Typical error is VERR_NO_MEMORY.
@@ -157,14 +190,16 @@ RTDECL(int) RTEnvGetUtf8(const char *pszVar, char *pszValue, size_t cbValue, siz
*
* @returns IPRT status code.
* @retval VERR_ENV_VAR_NOT_FOUND if the variable was not found.
+ * @retval VERR_ENV_VAR_UNSET if @a hEnv is an environment change record and
+ * the variable has been recorded as unset.
*
- * @param Env The environment handle.
+ * @param hEnv The environment handle.
* @param pszVar The environment variable name.
* @param pszValue Where to put the buffer.
* @param cbValue The size of the value buffer.
* @param pcchActual Returns the actual value string length. Optional.
*/
-RTDECL(int) RTEnvGetEx(RTENV Env, const char *pszVar, char *pszValue, size_t cbValue, size_t *pcchActual);
+RTDECL(int) RTEnvGetEx(RTENV hEnv, const char *pszVar, char *pszValue, size_t cbValue, size_t *pcchActual);
/**
* Puts an variable=value string into the environment (putenv).
@@ -275,6 +310,8 @@ RTDECL(uint32_t) RTEnvCountEx(RTENV hEnv);
* untouched.
* @retval VERR_BUFFER_OVERFLOW if one of the buffers are too small. We'll
* fill it with as much we can in RTStrCopy fashion.
+ * @retval VINF_ENV_VAR_UNSET if @a hEnv is an environment change record and
+ * the variable at @a iVar is recorded as being unset.
*
* @param hEnv The environment handle.
* RTENV_DEFAULT is currently not accepted.
@@ -284,7 +321,69 @@ RTDECL(uint32_t) RTEnvCountEx(RTENV hEnv);
* @param pszValue Value buffer.
* @param cbValue The size of the value buffer.
*/
-RTDECL(uint32_t) RTEnvGetByIndexEx(RTENV hEnv, uint32_t iVar, char *pszVar, size_t cbVar, char *pszValue, size_t cbValue);
+RTDECL(int) RTEnvGetByIndexEx(RTENV hEnv, uint32_t iVar, char *pszVar, size_t cbVar, char *pszValue, size_t cbValue);
+
+/**
+ * Leaner and meaner version of RTEnvGetByIndexEx.
+ *
+ * This can be used together with RTEnvCount to enumerate the environment block.
+ *
+ * Use with caution as the returned pointer may change by the next call using
+ * the environment handle. Please only use this API in cases where there is no
+ * chance of races.
+ *
+ * @returns Pointer to the internal environment variable=value string on
+ * success. If @a hEnv is an environment change recordthe string may
+ * also be on the "variable" form, representing an unset operation. Do
+ * NOT change this string, it is read only!
+ *
+ * If the index is out of range on the environment handle is invalid,
+ * NULL is returned.
+ *
+ * @param hEnv The environment handle.
+ * RTENV_DEFAULT is currently not accepted.
+ * @param iVar The variable index.
+ */
+RTDECL(const char *) RTEnvGetByIndexRawEx(RTENV hEnv, uint32_t iVar);
+
+
+/**
+ * Creates an empty environment change record.
+ *
+ * This is a special environment for use with RTEnvApplyChanges and similar
+ * purposes. The
+ *
+ * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
+ *
+ * @param phEnv Where to store the handle of the new environment block.
+ */
+RTDECL(int) RTEnvCreateChangeRecord(PRTENV phEnv);
+
+/**
+ * Checks if @a hEnv is an environment change record.
+ *
+ * @returns true if it is, false if it's not or if the handle is invalid.
+ * @param hEnv The environment handle.
+ * @sa RTEnvCreateChangeRecord.
+ */
+RTDECL(bool) RTEnvIsChangeRecord(RTENV hEnv);
+
+/**
+ * Applies changes from one environment onto another.
+ *
+ * If @a hEnvChanges is a normal environment, its content is just added to @a
+ * hEnvDst, where variables in the destination can only be overwritten. However
+ * if @a hEnvChanges is a change record environment, variables in the
+ * destination can also be removed.
+ *
+ * @returns IPRT status code. Typical error is VERR_NO_MEMORY.
+ * @param hEnvDst The destination environment.
+ * @param hEnvChanges Handle to the environment containig the changes to
+ * apply. As said, especially useful if it's a environment
+ * change record. RTENV_DEFAULT is not supported here.
+ */
+RTDECL(int) RTEnvApplyChanges(RTENV hEnvDst, RTENV hEnvChanges);
+
#endif /* IN_RING3 */
diff --git a/include/iprt/err.h b/include/iprt/err.h
index c6c14b9..7c533d1 100644
--- a/include/iprt/err.h
+++ b/include/iprt/err.h
@@ -802,7 +802,7 @@ RT_C_DECLS_END
#define VERR_CODE_POINT_SURROGATE (-60)
/** A string claiming to be UTF-8 is incorrectly encoded. */
#define VERR_INVALID_UTF8_ENCODING (-61)
-/** Ad string claiming to be in UTF-16 is incorrectly encoded. */
+/** A string claiming to be in UTF-16 is incorrectly encoded. */
#define VERR_INVALID_UTF16_ENCODING (-62)
/** Encountered a unicode code point which cannot be represented as UTF-16. */
#define VERR_CANT_RECODE_AS_UTF16 (-63)
@@ -816,7 +816,7 @@ RT_C_DECLS_END
#define VERR_MEMORY_BUSY (-67)
/** The timer can't be started because it's already active. */
#define VERR_TIMER_ACTIVE (-68)
-/** The timer can't be stopped because i's already suspended. */
+/** The timer can't be stopped because it's already suspended. */
#define VERR_TIMER_SUSPENDED (-69)
/** The operation was cancelled by the user (copy) or another thread (local ipc). */
#define VERR_CANCELLED (-70)
@@ -1197,7 +1197,7 @@ RT_C_DECLS_END
#define VERR_SEM_LV_WRONG_ORDER (-368)
/** Wrong release order detected. */
#define VERR_SEM_LV_WRONG_RELEASE_ORDER (-369)
-/** Attempt to recursively enter a non-recurisve lock. */
+/** Attempt to recursively enter a non-recursive lock. */
#define VERR_SEM_LV_NESTED (-370)
/** Invalid parameters passed to the lock validator. */
#define VERR_SEM_LV_INVALID_PARAMETER (-371)
@@ -1599,6 +1599,12 @@ RT_C_DECLS_END
/** Unable to translate all the variables in the default environment due to
* codeset issues (LANG / LC_ALL / LC_CTYPE). */
#define VWRN_ENV_NOT_FULLY_TRANSLATED (751)
+/** Invalid environment variable name. */
+#define VERR_ENV_INVALID_VAR_NAME (-752)
+/** The environment variable is an unset record. */
+#define VINF_ENV_VAR_UNSET (753)
+/** The environment variable has been recorded as being unset. */
+#define VERR_ENV_VAR_UNSET (-753)
/** @} */
/** @name Multiprocessor Status Codes.
@@ -1808,9 +1814,9 @@ RT_C_DECLS_END
#define VERR_VFS_CHAIN_EXPECTED_ELEMENT (-22102)
/** The VFS object type is not known. */
#define VERR_VFS_CHAIN_UNKNOWN_TYPE (-22103)
-/** Expected a left paranthese. */
+/** Expected a left parentheses. */
#define VERR_VFS_CHAIN_EXPECTED_LEFT_PARENTHESES (-22104)
-/** Expected a right paranthese. */
+/** Expected a right parentheses. */
#define VERR_VFS_CHAIN_EXPECTED_RIGHT_PARENTHESES (-22105)
/** Expected a provider name. */
#define VERR_VFS_CHAIN_EXPECTED_PROVIDER_NAME (-22106)
@@ -1887,7 +1893,7 @@ RT_C_DECLS_END
#define VERR_XAR_TOC_XML_PARSE_ERROR (-22710)
/** The table of content XML document does not have a toc element. */
#define VERR_XML_TOC_ELEMENT_MISSING (-22711)
-/** The table of content XML element (toc) has sibilings, we expected it to be
+/** The table of content XML element (toc) has siblings, we expected it to be
* an only child or the root element (xar). */
#define VERR_XML_TOC_ELEMENT_HAS_SIBLINGS (-22712)
/** The XAR table of content digest doesn't match. */
@@ -2108,45 +2114,45 @@ RT_C_DECLS_END
/** @name More RTLdr status codes.
* @{ */
-/** Image Verficiation Failure: No Authenticode Signature. */
+/** Image Verification Failure: No Authenticode Signature. */
#define VERR_LDRVI_NOT_SIGNED (-22900)
-/** Image Verficiation Warning: No Authenticode Signature, but on whitelist. */
+/** Image Verification Warning: No Authenticode Signature, but on whitelist. */
#define VINF_LDRVI_NOT_SIGNED (22900)
-/** Image Verficiation Failure: Error reading image headers. */
+/** Image Verification Failure: Error reading image headers. */
#define VERR_LDRVI_READ_ERROR_HDR (-22901)
-/** Image Verficiation Failure: Error reading section headers. */
+/** Image Verification Failure: Error reading section headers. */
#define VERR_LDRVI_READ_ERROR_SHDRS (-22902)
-/** Image Verficiation Failure: Error reading authenticode signature data. */
+/** Image Verification Failure: Error reading authenticode signature data. */
#define VERR_LDRVI_READ_ERROR_SIGNATURE (-22903)
-/** Image Verficiation Failure: Error reading file for hashing. */
+/** Image Verification Failure: Error reading file for hashing. */
#define VERR_LDRVI_READ_ERROR_HASH (-22904)
-/** Image Verficiation Failure: Error determining the file length. */
+/** Image Verification Failure: Error determining the file length. */
#define VERR_LDRVI_FILE_LENGTH_ERROR (-22905)
-/** Image Verficiation Failure: Error allocating memory for state data. */
+/** Image Verification Failure: Error allocating memory for state data. */
#define VERR_LDRVI_NO_MEMORY_STATE (-22906)
-/** Image Verficiation Failure: Error allocating memory for authenticode
+/** Image Verification Failure: Error allocating memory for authenticode
* signature data. */
#define VERR_LDRVI_NO_MEMORY_SIGNATURE (-22907)
-/** Image Verficiation Failure: Error allocating memory for section headers. */
+/** Image Verification Failure: Error allocating memory for section headers. */
#define VERR_LDRVI_NO_MEMORY_SHDRS (-22908)
-/** Image Verficiation Failure: Authenticode parsing output. */
+/** Image Verification Failure: Authenticode parsing output. */
#define VERR_LDRVI_NO_MEMORY_PARSE_OUTPUT (-22909)
-/** Image Verficiation Failure: Invalid security directory entry. */
+/** Image Verification Failure: Invalid security directory entry. */
#define VERR_LDRVI_INVALID_SECURITY_DIR_ENTRY (-22910)
-/** Image Verficiation Failure: */
+/** Image Verification Failure: */
#define VERR_LDRVI_BAD_CERT_HDR_LENGTH (-22911)
-/** Image Verficiation Failure: */
+/** Image Verification Failure: */
#define VERR_LDRVI_BAD_CERT_HDR_REVISION (-22912)
-/** Image Verficiation Failure: */
+/** Image Verification Failure: */
#define VERR_LDRVI_BAD_CERT_HDR_TYPE (-22913)
-/** Image Verficiation Failure: More than one certificate table entry. */
+/** Image Verification Failure: More than one certificate table entry. */
#define VERR_LDRVI_BAD_CERT_MULTIPLE (-22914)
-/** Image Verficiation Failure: */
+/** Image Verification Failure: */
#define VERR_LDRVI_BAD_MZ_OFFSET (-22915)
-/** Image Verficiation Failure: Invalid section count. */
+/** Image Verification Failure: Invalid section count. */
#define VERR_LDRVI_INVALID_SECTION_COUNT (-22916)
-/** Image Verficiation Failure: Raw data offsets and sizes are out of range. */
+/** Image Verification Failure: Raw data offsets and sizes are out of range. */
#define VERR_LDRVI_SECTION_RAW_DATA_VALUES (-22917)
/** Optional header magic and target machine does not match. */
#define VERR_LDRVI_MACHINE_OPT_HDR_MAGIC_MISMATCH (-22918)
@@ -2167,7 +2173,7 @@ RT_C_DECLS_END
#define VERR_LDRVI_PAGE_HASH_TAB_TOO_LONG (-22925)
/** The page hash table is not strictly ordered by offset. */
#define VERR_LDRVI_PAGE_HASH_TAB_NOT_STRICTLY_SORTED (-22926)
-/** The page hash table hashes data outside the defined and implict sections. */
+/** The page hash table hashes data outside the defined and implicit sections. */
#define VERR_PAGE_HASH_TAB_HASHES_NON_SECTION_DATA (-22927)
/** Page hash mismatch. */
#define VERR_LDRVI_PAGE_HASH_MISMATCH (-22928)
@@ -2203,8 +2209,8 @@ RT_C_DECLS_END
#define VERR_CR_X509_UNKNOWN_CERT_SIGN_ALGO (-23005)
/** Certificate signature algorithm mismatch. */
#define VERR_CR_X509_CERT_SIGN_ALGO_MISMATCH (-23006)
-/** The signature algorithm in the to-be-signed certifcate part does not match
- * the one assoicated with the signature. */
+/** The signature algorithm in the to-be-signed certificate part does not match
+ * the one associated with the signature. */
#define VERR_CR_X509_CERT_TBS_SIGN_ALGO_MISMATCH (-23007)
/** Certificate extensions requires certificate version 3 or later. */
#define VERR_CR_X509_TBSCERT_EXTS_REQ_V3 (-23008)
@@ -2216,7 +2222,7 @@ RT_C_DECLS_END
#define VERR_CR_X509_TBSCERT_UNSUPPORTED_VERSION (-23011)
/** Public key is too small. */
#define VERR_CR_X509_PUBLIC_KEY_TOO_SMALL (-23012)
-/** Invalid strnig tag for a X.509 name object. */
+/** Invalid string tag for a X.509 name object. */
#define VERR_CR_X509_INVALID_NAME_STRING_TAG (-23013)
/** Empty string in X.509 name object. */
#define VERR_CR_X509_NAME_EMPTY_STRING (-23014)
@@ -2248,7 +2254,7 @@ RT_C_DECLS_END
/** Certificate path validator: Intermediate certificate is not marked as a
* certificate authority (CA). */
#define VERR_CR_X509_CPV_NOT_CA_CERT (-23026)
-/** Certificate path validator: Intermeidate certificate is not a version 3
+/** Certificate path validator: Intermediate certificate is not a version 3
* certificate. */
#define VERR_CR_X509_CPV_NOT_V3_CERT (-23027)
/** Certificate path validator: Invalid policy mapping (to/from anyPolicy). */
@@ -2265,7 +2271,7 @@ RT_C_DECLS_END
* match child issuer property. */
#define VERR_CR_X509_CPV_ISSUER_MISMATCH (-23032)
/** Certificate path validator: The certificate is not valid at the
- * specificed time. */
+ * specified time. */
#define VERR_CR_X509_CPV_NOT_VALID_AT_TIME (-23033)
/** Certificate path validator: Unexpected choice found in general subtree
* object (name constraints). */
@@ -2286,7 +2292,7 @@ RT_C_DECLS_END
* @{ */
/** Generic PKCS \#7 error. */
#define VERR_CR_PKCS7_GENERIC_ERROR (-23300)
-/** Signed data verfication failed because there are zero signer infos. */
+/** Signed data verification failed because there are zero signer infos. */
#define VERR_CR_PKCS7_NO_SIGNER_INFOS (-23301)
/** Signed data certificate not found. */
#define VERR_CR_PKCS7_SIGNED_DATA_CERT_NOT_FOUND (-23302)
@@ -2332,7 +2338,7 @@ RT_C_DECLS_END
#define VERR_CR_PKCS7_TOO_MANY_DIGEST_ALGORITHMS (-22318)
/** Error creating digest algorithm calculator. */
#define VERR_CR_PKCS7_DIGEST_CREATE_ERROR (-22319)
-/** Error while calculating a digest for a PKCS \#7 verficiation operation. */
+/** Error while calculating a digest for a PKCS \#7 verification operation. */
#define VERR_CR_PKCS7_DIGEST_CALC_ERROR (-22320)
/** Unsupported PKCS \#7 signed data version. */
#define VERR_CR_PKCS7_SIGNED_DATA_VERSION (-22350)
@@ -2375,7 +2381,7 @@ RT_C_DECLS_END
#define VERR_CR_SPC_UNKNOWN_DIGEST_ALGO (-23405)
/** The indirect data digest size does not match the digest algorithm. */
#define VERR_CR_SPC_IND_DATA_DIGEST_SIZE_MISMATCH (-23406)
-/** Exptected PE image data inside indirect data object. */
+/** Expected PE image data inside indirect data object. */
#define VERR_CR_SPC_EXPECTED_PE_IMAGE_DATA (-23407)
/** Internal SPC error: The PE image data is missing. */
#define VERR_CR_SPC_PEIMAGE_DATA_NOT_PRESENT (-23408)
@@ -2383,10 +2389,10 @@ RT_C_DECLS_END
#define VERR_CR_SPC_BAD_MONIKER_UUID (-23409)
/** Unknown SPC object moniker UUID. */
#define VERR_CR_SPC_UNKNOWN_MONIKER_UUID (-23410)
-/** Internal SPC error: Bad object monker choice value. */
+/** Internal SPC error: Bad object moniker choice value. */
#define VERR_CR_SPC_BAD_MONIKER_CHOICE (-23411)
/** Internal SPC error: Bad object moniker data pointer. */
-#define VERR_CR_SPC_MONIKER_BAD_DATA (-23412)
+#define VERR_CR_SPC_MONIKER_BAD_DATA (-23412)
/** Multiple PE image page hash tables. */
#define VERR_CR_SPC_PEIMAGE_MULTIPLE_HASH_TABS (-23413)
/** Unknown SPC PE image attribute. */
@@ -2421,7 +2427,7 @@ RT_C_DECLS_END
#define VERR_CR_PKIX_SIGNATURE_MISMATCH (-23509)
/** PKIX cipher algorithm parameters are not implemented. */
#define VERR_CR_PKIX_CIPHER_ALGO_PARAMS_NOT_IMPL (-23510)
-/** ipher algorithm is not known to us. */
+/** Cipher algorithm is not known to us. */
#define VERR_CR_PKIX_CIPHER_ALGO_NOT_KNOWN (-23511)
/** PKIX cipher algorithm is not known to OpenSSL. */
#define VERR_CR_PKIX_OSSL_CIPHER_ALGO_NOT_KNOWN (-23512)
@@ -2464,7 +2470,7 @@ RT_C_DECLS_END
* @{ */
/** OpenSSL failed to initialize the digest algorithm contextn. */
#define VERR_CR_DIGEST_OSSL_DIGEST_INIT_ERROR (-24200)
-/** OpenSSL failed to clone the digest algorithm contextn. */
+/** OpenSSL failed to clone the digest algorithm context. */
#define VERR_CR_DIGEST_OSSL_DIGEST_CTX_COPY_ERROR (-24201)
/** @} */
diff --git a/include/iprt/getopt.h b/include/iprt/getopt.h
index 042a6e5..4bc4f89 100644
--- a/include/iprt/getopt.h
+++ b/include/iprt/getopt.h
@@ -401,11 +401,14 @@ RTDECL(RTEXITCODE) RTGetOptPrintError(int ch, PCRTGETOPTUNION pValueUnion);
* freed by calling RTGetOptArgvFree.
* @param pcArgs Where to return the argument count.
* @param pszCmdLine The string to parse.
+ * @param fFlags A combination of the RTGETOPTARGV_CNV_XXX flags,
+ * except RTGETOPTARGV_CNV_UNQUOTED is not supported.
* @param pszSeparators String containing the argument separators. If NULL,
* then space, tab, line feed (\\n) and return (\\r)
* are used.
*/
-RTDECL(int) RTGetOptArgvFromString(char ***ppapszArgv, int *pcArgs, const char *pszCmdLine, const char *pszSeparators);
+RTDECL(int) RTGetOptArgvFromString(char ***ppapszArgv, int *pcArgs, const char *pszCmdLine, uint32_t fFlags,
+ const char *pszSeparators);
/**
* Frees and argument vector returned by RTGetOptStringToArgv.
@@ -437,8 +440,10 @@ RTDECL(int) RTGetOptArgvToString(char **ppszCmdLine, const char * const *papszAr
#define RTGETOPTARGV_CNV_QUOTE_MS_CRT UINT32_C(0)
/** Quote strings according to the Unix Bourne Shell. */
#define RTGETOPTARGV_CNV_QUOTE_BOURNE_SH UINT32_C(1)
+/** Don't quote any strings at all. */
+#define RTGETOPTARGV_CNV_UNQUOTED UINT32_C(2)
/** Mask for the quoting style. */
-#define RTGETOPTARGV_CNV_QUOTE_MASK UINT32_C(1)
+#define RTGETOPTARGV_CNV_QUOTE_MASK UINT32_C(3)
/** @} */
/**
diff --git a/include/iprt/list-off32.h b/include/iprt/list-off32.h
new file mode 100644
index 0000000..9026772
--- /dev/null
+++ b/include/iprt/list-off32.h
@@ -0,0 +1,502 @@
+/** @file
+ * IPRT - Generic Doubly Linked List, using 32-bit offset instead of pointers.
+ */
+
+/*
+ * Copyright (C) 2010-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+#ifndef ___iprt_list_off32_h
+#define ___iprt_list_off32_h
+
+#include <iprt/types.h>
+
+/* @defgroup grp_rt_list_off32 RTListOff32 - Generic Doubly Linked List based on 32-bit offset.
+ * @ingroup grp_rt
+ *
+ * This is the same as @link grp_rt_list, except that instead of pointers we
+ * use 32-bit offsets. The list implementation is circular, with a dummy node
+ * as anchor. Be careful with the dummy node when walking the list.
+ *
+ * @{
+ */
+
+RT_C_DECLS_BEGIN
+
+/**
+ * A list node of a doubly linked list.
+ */
+typedef struct RTLISTOFF32NODE
+{
+ /** Offset to the next list node, relative to this structure. */
+ int32_t offNext;
+ /** Offset to the previous list node, relative to this structure. */
+ int32_t offPrev;
+} RTLISTOFF32NODE;
+/** Pointer to a list node. */
+typedef RTLISTOFF32NODE *PRTLISTOFF32NODE;
+/** Pointer to a const list node. */
+typedef RTLISTOFF32NODE const *PCRTLISTOFF32NODE;
+/** Pointer to a list node pointer. */
+typedef PRTLISTOFF32NODE *PPRTLISTOFF32NODE;
+
+/** The anchor (head/tail) of a doubly linked list.
+ *
+ * @remarks Please always use this instead of RTLISTOFF32NODE to indicate a list
+ * head/tail. It makes the code so much easier to read. Also,
+ * always mention the actual list node type(s) in the comment.
+ * @remarks Must be allocated in a similar manner as the nodes, so as to
+ * keep it within a 32-bit distance from them.
+ */
+typedef RTLISTOFF32NODE RTLISTOFF32ANCHOR;
+/** Pointer to a doubly linked list anchor. */
+typedef RTLISTOFF32ANCHOR *PRTLISTOFF32ANCHOR;
+/** Pointer to a const doubly linked list anchor. */
+typedef RTLISTOFF32ANCHOR const *PCRTLISTOFF32ANCHOR;
+
+
+/**
+ * Initialize a list.
+ *
+ * @param pList Pointer to an unitialised list.
+ */
+DECLINLINE(void) RTListOff32Init(PRTLISTOFF32NODE pList)
+{
+ pList->offNext = 0;
+ pList->offPrev = 0;
+}
+
+/**
+ * Internal macro for converting an offset to a pointer.
+ * @returns PRTLISTOFF32NODE
+ * @param a_pNode The node the offset is relative to.
+ * @param a_off The offset.
+ */
+#define RTLISTOFF32_TO_PTR(a_pNode, a_off) ((PRTLISTOFF32NODE)((intptr_t)(a_pNode) + (a_off)))
+
+/**
+ * Internal macro for getting the pointer to the next node.
+ * @returns PRTLISTOFF32NODE
+ * @param a_pNode The node the offset is relative to.
+ */
+#define RTLISTOFF32_NEXT_PTR(a_pNode) RTLISTOFF32_TO_PTR(a_pNode, (a_pNode)->offNext)
+
+/**
+ * Internal macro for getting the pointer to the previous node.
+ * @returns PRTLISTOFF32NODE
+ * @param a_pNode The node the offset is relative to.
+ */
+#define RTLISTOFF32_PREV_PTR(a_pNode) RTLISTOFF32_TO_PTR(a_pNode, (a_pNode)->offPrev)
+
+/**
+ * Internal macro for converting an a pointer to an offset.
+ * @returns offset
+ * @param a_pNode The node the offset is relative to.
+ * @param a_pOtherNode The pointer to convert.
+ */
+#define RTLISTOFF32_TO_OFF(a_pNode, a_pOtherNode) ((int32_t)((intptr_t)(a_pOtherNode) - (intptr_t)(a_pNode)))
+
+/**
+ * Internal macro for getting the pointer to the next node.
+ * @returns PRTLISTOFF32NODE
+ * @param a_pNode The node which offNext member should be set.
+ * @param a_pNewNext Pointer to the new next node.
+ */
+#define RTLISTOFF32_SET_NEXT_PTR(a_pNode, a_pNewNext) \
+ do { (a_pNode)->offNext = RTLISTOFF32_TO_OFF(a_pNode, a_pNewNext); } while (0)
+
+/**
+ * Internal macro for getting the pointer to the previous node.
+ * @returns PRTLISTOFF32NODE
+ * @param a_pNode The node which offPrev member should be set.
+ * @param a_pNewPrev Pointer to the new previous node.
+ */
+#define RTLISTOFF32_SET_PREV_PTR(a_pNode, a_pNewPrev) \
+ do { (a_pNode)->offPrev = RTLISTOFF32_TO_OFF(a_pNode, a_pNewPrev); } while (0)
+
+
+
+/**
+ * Append a node to the end of the list.
+ *
+ * @param pList The list to append the node to.
+ * @param pNode The node to append.
+ */
+DECLINLINE(void) RTListOff32Append(PRTLISTOFF32NODE pList, PRTLISTOFF32NODE pNode)
+{
+ PRTLISTOFF32NODE pLast = RTLISTOFF32_PREV_PTR(pList);
+ RTLISTOFF32_SET_NEXT_PTR(pLast, pNode);
+ RTLISTOFF32_SET_PREV_PTR(pNode, pLast);
+ RTLISTOFF32_SET_NEXT_PTR(pNode, pList);
+ RTLISTOFF32_SET_PREV_PTR(pList, pNode);
+}
+
+/**
+ * Add a node as the first element of the list.
+ *
+ * @param pList The list to prepend the node to.
+ * @param pNode The node to prepend.
+ */
+DECLINLINE(void) RTListOff32Prepend(PRTLISTOFF32NODE pList, PRTLISTOFF32NODE pNode)
+{
+ PRTLISTOFF32NODE pFirst = RTLISTOFF32_NEXT_PTR(pList);
+ RTLISTOFF32_SET_PREV_PTR(pFirst, pNode);
+ RTLISTOFF32_SET_NEXT_PTR(pNode, pFirst);
+ RTLISTOFF32_SET_PREV_PTR(pNode, pList);
+ RTLISTOFF32_SET_NEXT_PTR(pList, pNode);
+}
+
+/**
+ * Inserts a node after the specified one.
+ *
+ * @param pCurNode The current node.
+ * @param pNewNode The node to insert.
+ */
+DECLINLINE(void) RTListOff32NodeInsertAfter(PRTLISTOFF32NODE pCurNode, PRTLISTOFF32NODE pNewNode)
+{
+ RTListOff32Prepend(pCurNode, pNewNode);
+}
+
+/**
+ * Inserts a node before the specified one.
+ *
+ * @param pCurNode The current node.
+ * @param pNewNode The node to insert.
+ */
+DECLINLINE(void) RTListOff32NodeInsertBefore(PRTLISTOFF32NODE pCurNode, PRTLISTOFF32NODE pNewNode)
+{
+ RTListOff32Append(pCurNode, pNewNode);
+}
+
+/**
+ * Remove a node from a list.
+ *
+ * @param pNode The node to remove.
+ */
+DECLINLINE(void) RTListOff32NodeRemove(PRTLISTOFF32NODE pNode)
+{
+ PRTLISTOFF32NODE pPrev = RTLISTOFF32_PREV_PTR(pNode);
+ PRTLISTOFF32NODE pNext = RTLISTOFF32_NEXT_PTR(pNode);
+
+ RTLISTOFF32_SET_NEXT_PTR(pPrev, pNext);
+ RTLISTOFF32_SET_PREV_PTR(pNext, pPrev);
+
+ /* poison */
+ pNode->offNext = INT32_MAX / 2;
+ pNode->offPrev = INT32_MAX / 2;
+}
+
+/**
+ * Checks if a node is the last element in the list.
+ *
+ * @retval @c true if the node is the last element in the list.
+ * @retval @c false otherwise
+ *
+ * @param pList The list.
+ * @param pNode The node to check.
+ */
+#define RTListOff32NodeIsLast(pList, pNode) (RTLISTOFF32_NEXT_PTR(pNode) == (pList))
+
+/**
+ * Checks if a node is the first element in the list.
+ *
+ * @retval @c true if the node is the first element in the list.
+ * @retval @c false otherwise.
+ *
+ * @param pList The list.
+ * @param pNode The node to check.
+ */
+#define RTListOff32NodeIsFirst(pList, pNode) (RTLISTOFF32_PREV_PTR(pNode) == (pList))
+
+/**
+ * Checks if a type converted node is actually the dummy element (@a pList).
+ *
+ * @retval @c true if the node is the dummy element in the list.
+ * @retval @c false otherwise.
+ *
+ * @param pList The list.
+ * @param pNodeStruct The node structure to check. Typically
+ * something obtained from RTListOff32NodeGetNext()
+ * or RTListOff32NodeGetPrev(). This is NOT a
+ * PRTLISTOFF32NODE but something that contains a
+ * RTLISTOFF32NODE member!
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member.
+ */
+#define RTListOff32NodeIsDummy(pList, pNode, Type, Member) \
+ ( (pNode) == RT_FROM_MEMBER((pList), Type, Member) )
+/** @copydoc RTListOff32NodeIsDummy */
+#define RTListOff32NodeIsDummyCpp(pList, pNode, Type, Member) \
+ ( (pNode) == RT_FROM_CPP_MEMBER((pList), Type, Member) )
+
+/**
+ * Checks if a list is empty.
+ *
+ * @retval @c true if the list is empty.
+ * @retval @c false otherwise.
+ *
+ * @param pList The list to check.
+ */
+#define RTListOff32IsEmpty(pList) ((pList)->offNext == 0)
+
+/**
+ * Returns the next node in the list.
+ *
+ * @returns The next node.
+ *
+ * @param pCurNode The current node.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member.
+ */
+#define RTListOff32NodeGetNext(pCurNode, Type, Member) \
+ RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(pCurNode), Type, Member)
+/** @copydoc RTListOff32NodeGetNext */
+#define RTListOff32NodeGetNextCpp(pCurNode, Type, Member) \
+ RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(pCurNode), Type, Member)
+
+/**
+ * Returns the previous node in the list.
+ *
+ * @returns The previous node.
+ *
+ * @param pCurNode The current node.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member.
+ */
+#define RTListOff32NodeGetPrev(pCurNode, Type, Member) \
+ RT_FROM_MEMBER(RTLISTOFF32_PREV_PTR(pCurNode), Type, Member)
+/** @copydoc RTListOff32NodeGetPrev */
+#define RTListOff32NodeGetPrevCpp(pCurNode, Type, Member) \
+ RT_FROM_CPP_MEMBER(RTLISTOFF32_PREV_PTR(pCurNode), Type, Member)
+
+/**
+ * Returns the first element in the list (checks for empty list).
+ *
+ * @retval Pointer to the first list element.
+ * @retval NULL if the list is empty.
+ *
+ * @param pList List to get the first element from.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member.
+ */
+#define RTListOff32GetFirst(pList, Type, Member) \
+ ((pList)->offNext != 0 ? RTListOff32NodeGetNext(pList, Type, Member) : NULL)
+/** @copydoc RTListOff32GetFirst */
+#define RTListOff32GetFirstCpp(pList, Type, Member) \
+ ((pList)->offNext != 0 ? RTListOff32NodeGetNextCpp(pList, Type, Member) : NULL)
+
+/**
+ * Returns the last element in the list (checks for empty list).
+ *
+ * @retval Pointer to the last list element.
+ * @retval NULL if the list is empty.
+ *
+ * @param pList List to get the last element from.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member.
+ */
+#define RTListOff32GetLast(pList, Type, Member) \
+ ((pList)->offPrev != 0 ? RTListOff32NodeGetPrev(pList, Type, Member) : NULL)
+/** @copydoc RTListOff32GetLast */
+#define RTListOff32GetLastCpp(pList, Type, Member) \
+ ((pList)->offPrev != 0 ? RTListOff32NodeGetPrevCpp(pList, Type, Member) : NULL)
+
+/**
+ * Returns the next node in the list or NULL if the end has been reached.
+ *
+ * @returns The next node or NULL.
+ *
+ * @param pList The list @a pCurNode is linked on.
+ * @param pCurNode The current node, of type @a Type.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member.
+ */
+#define RTListOff32GetNext(pList, pCurNode, Type, Member) \
+ ( RTLISTOFF32_NEXT_PTR(&(pCurNode)->Member) != (pList) \
+ ? RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pCurNode)->Member), Type, Member) : NULL )
+/** @copydoc RTListOff32GetNext */
+#define RTListOff32GetNextCpp(pList, pCurNode, Type, Member) \
+ ( RTLISTOFF32_NEXT_PTR(&(pCurNode)->Member) != (pList) \
+ ? RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pCurNode)->Member), Type, Member) : NULL )
+
+/**
+ * Returns the previous node in the list or NULL if the start has been reached.
+ *
+ * @returns The previous node or NULL.
+ *
+ * @param pList The list @a pCurNode is linked on.
+ * @param pCurNode The current node, of type @a Type.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member.
+ */
+#define RTListOff32GetPrev(pList, pCurNode, Type, Member) \
+ ( RTLISTOFF32_PREV_PTR(&(pCurNode)->Member) != (pList) \
+ ? RT_FROM_MEMBER(RTLISTOFF32_PREV_PTR(&(pCurNode)->Member), Type, Member) : NULL )
+/** @copydoc RTListOff32GetPrev */
+#define RTListOff32GetPrevCpp(pList, pCurNode, Type, Member) \
+ ( RTLISTOFF32_PREV_PTR(&(pCurNode)->Member) != (pList) \
+ ? RT_FROM_CPP_MEMBER(RTLISTOFF32_PREV_PTR(&(pCurNode)->Member), Type, Member) : NULL )
+
+/**
+ * Enumerate the list in head to tail order.
+ *
+ * @param pList List to enumerate.
+ * @param pIterator The iterator variable name.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member name.
+ */
+#define RTListOff32ForEach(pList, pIterator, Type, Member) \
+ for (pIterator = RTListOff32NodeGetNext(pList, Type, Member); \
+ !RTListOff32NodeIsDummy(pList, pIterator, Type, Member); \
+ pIterator = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) )
+/** @copydoc RTListOff32ForEach */
+#define RTListOff32ForEachCpp(pList, pIterator, Type, Member) \
+ for (pIterator = RTListOff32NodeGetNextCpp(pList, Type, Member); \
+ !RTListOff32NodeIsDummyCpp(pList, pIterator, Type, Member); \
+ pIterator = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) )
+
+
+/**
+ * Enumerate the list in head to tail order, safe against removal of the
+ * current node.
+ *
+ * @param pList List to enumerate.
+ * @param pIterator The iterator variable name.
+ * @param pIterNext The name of the variable saving the pointer to
+ * the next element.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member name.
+ */
+#define RTListOff32ForEachSafe(pList, pIterator, pIterNext, Type, Member) \
+ for (pIterator = RTListOff32NodeGetNext(pList, Type, Member), \
+ pIterNext = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member); \
+ !RTListOff32NodeIsDummy(pList, pIterator, Type, Member); \
+ pIterator = pIterNext, \
+ pIterNext = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) )
+/** @copydoc RTListOff32ForEachSafe */
+#define RTListOff32ForEachSafeCpp(pList, pIterator, pIterNext, Type, Member) \
+ for (pIterator = RTListOff32NodeGetNextCpp(pList, Type, Member), \
+ pIterNext = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member); \
+ !RTListOff32NodeIsDummyCpp(pList, pIterator, Type, Member); \
+ pIterator = pIterNext, \
+ pIterNext = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) )
+
+
+/**
+ * Enumerate the list in reverse order (tail to head).
+ *
+ * @param pList List to enumerate.
+ * @param pIterator The iterator variable name.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member name.
+ */
+#define RTListOff32ForEachReverse(pList, pIterator, Type, Member) \
+ for (pIterator = RTListOff32NodeGetPrev(pList, Type, Member); \
+ !RTListOff32NodeIsDummy(pList, pIterator, Type, Member); \
+ pIterator = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) )
+/** @copydoc RTListOff32ForEachReverse */
+#define RTListOff32ForEachReverseCpp(pList, pIterator, Type, Member) \
+ for (pIterator = RTListOff32NodeGetPrevCpp(pList, Type, Member); \
+ !RTListOff32NodeIsDummyCpp(pList, pIterator, Type, Member); \
+ pIterator = RT_FROM_CPP_MEMBER(RTLISTOFF32_PREV_PTR(&(pIterator)->Member), Type, Member) )
+
+
+/**
+ * Enumerate the list in reverse order (tail to head).
+ *
+ * @param pList List to enumerate.
+ * @param pIterator The iterator variable name.
+ * @param pIterPrev The name of the variable saving the pointer to
+ * the previous element.
+ * @param Type Structure the list node is a member of.
+ * @param Member The list node member name.
+ */
+#define RTListOff32ForEachReverseSafe(pList, pIterator, pIterPrev, Type, Member) \
+ for (pIterator = RTListOff32NodeGetPrev(pList, Type, Member), \
+ pIterPrev = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member); \
+ !RTListOff32NodeIsDummy(pList, pIterator, Type, Member); \
+ pIterator = pIterPrev, \
+ pIterPrev = RT_FROM_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) )
+/** @copydoc RTListOff32ForEachReverseSafe */
+#define RTListOff32ForEachReverseSafeCpp(pList, pIterator, pIterPrev, Type, Member) \
+ for (pIterator = RTListOff32NodeGetPrevCpp(pList, Type, Member), \
+ pIterPrev = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member); \
+ !RTListOff32NodeIsDummyCpp(pList, pIterator, Type, Member); \
+ pIterator = pIterPrev, \
+ pIterPrev = RT_FROM_CPP_MEMBER(RTLISTOFF32_NEXT_PTR(&(pIterator)->Member), Type, Member) )
+
+
+/**
+ * Move the given list to a new list header.
+ *
+ * @param pListDst The new list.
+ * @param pListSrc The list to move.
+ */
+DECLINLINE(void) RTListOff32Move(PRTLISTOFF32NODE pListDst, PRTLISTOFF32NODE pListSrc)
+{
+ if (!RTListOff32IsEmpty(pListSrc))
+ {
+ PRTLISTOFF32NODE pFirst = RTLISTOFF32_NEXT_PTR(pListSrc);
+ PRTLISTOFF32NODE pLast = RTLISTOFF32_PREV_PTR(pListSrc);
+
+ RTLISTOFF32_SET_NEXT_PTR(pListDst, pFirst);
+ RTLISTOFF32_SET_PREV_PTR(pListDst, pLast);
+
+ /* Adjust the first and last element links */
+ RTLISTOFF32_SET_NEXT_PTR(pLast, pListDst);
+ RTLISTOFF32_SET_PREV_PTR(pFirst, pListDst);
+
+ /* Finally remove the elements from the source list */
+ RTListOff32Init(pListSrc);
+ }
+}
+
+/**
+ * List concatenation.
+ *
+ * @returns nothing.
+ * @param pListDst The destination list.
+ * @param pListSrc The source list to concatenate.
+ */
+DECLINLINE(void) RTListOff32Concatenate(PRTLISTOFF32ANCHOR pListDst, PRTLISTOFF32ANCHOR pListSrc)
+{
+ if (!RTListOff32IsEmpty(pListSrc))
+ {
+ PRTLISTOFF32NODE pFirstSrc = RTLISTOFF32_NEXT_PTR(pListSrc);
+ PRTLISTOFF32NODE pLastSrc = RTLISTOFF32_PREV_PTR(pListSrc);
+ PRTLISTOFF32NODE pLastDst = RTLISTOFF32_PREV_PTR(pListDst);
+
+ RTLISTOFF32_SET_NEXT_PTR(pLastDst, pFirstSrc);
+ RTLISTOFF32_SET_PREV_PTR(pFirstSrc, pLastDst);
+
+ RTLISTOFF32_SET_NEXT_PTR(pLastSrc, pListDst);
+ RTLISTOFF32_SET_PREV_PTR(pListDst, pLastSrc);
+
+ /* Finally remove the elements from the source list */
+ RTListOff32Init(pListSrc);
+ }
+}
+
+RT_C_DECLS_END
+
+/** @} */
+
+#endif
+
diff --git a/include/iprt/log.h b/include/iprt/log.h
index a88bf99..46751f8 100644
--- a/include/iprt/log.h
+++ b/include/iprt/log.h
@@ -1130,7 +1130,7 @@ RTDECL(void) RTLogPrintfEx(void *pvInstance, unsigned fFlags, unsigned iGroup, c
*/
#ifdef LOG_USE_C99
# define LogRelFunc(a) \
- _LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
+ _LogRelIt(LOG_REL_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, LOG_FN_FMT ": %M", RT_GCC_EXTENSION __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
# define LogFunc(a) \
_LogIt(LOG_INSTANCE, RTLOGGRPFLAGS_LEVEL_1, LOG_GROUP, LOG_FN_FMT ": %M", __PRETTY_FUNCTION__, _LogRemoveParentheseis a )
#else
diff --git a/include/iprt/mangling.h b/include/iprt/mangling.h
index 5f2cb21..99ab58e 100644
--- a/include/iprt/mangling.h
+++ b/include/iprt/mangling.h
@@ -79,6 +79,10 @@
# define ASMSetXcr0_EndProc RT_MANGLER(ASMSetXcr0_EndProc)
# define ASMWrMsrEx RT_MANGLER(ASMWrMsrEx)
# define ASMWrMsrEx_EndProc RT_MANGLER(ASMWrMsrEx_EndProc)
+# define ASMXRstor RT_MANGLER(ASMXRstor)
+# define ASMXRstor_EndProc RT_MANGLER(ASMXRstor_EndProc)
+# define ASMXSave RT_MANGLER(ASMXSave)
+# define ASMXSave_EndProc RT_MANGLER(ASMXSave_EndProc)
# define RTAssertAreQuiet RT_MANGLER(RTAssertAreQuiet)
# define RTAssertMayPanic RT_MANGLER(RTAssertMayPanic)
# define RTAssertMsg1 RT_MANGLER(RTAssertMsg1)
@@ -503,27 +507,34 @@
# define RTDvmVolumeSetQueryBlockStatusCallback RT_MANGLER(RTDvmVolumeSetQueryBlockStatusCallback)
# define RTDvmVolumeTypeGetDescr RT_MANGLER(RTDvmVolumeTypeGetDescr)
# define RTDvmVolumeCreateVfsFile RT_MANGLER(RTDvmVolumeCreateVfsFile)
+# define RTEnvApplyChanges RT_MANGLER(RTEnvApplyChanges)
# define RTEnvClone RT_MANGLER(RTEnvClone)
# define RTEnvCountEx RT_MANGLER(RTEnvCountEx)
# define RTEnvCreate RT_MANGLER(RTEnvCreate)
+# define RTEnvCreateChangeRecord RT_MANGLER(RTEnvCreateChangeRecord)
# define RTEnvDestroy RT_MANGLER(RTEnvDestroy)
# define RTEnvDupEx RT_MANGLER(RTEnvDupEx)
# define RTEnvExist RT_MANGLER(RTEnvExist)
# define RTEnvExistsBad RT_MANGLER(RTEnvExistsBad)
# define RTEnvExistsUtf8 RT_MANGLER(RTEnvExistsUtf8)
# define RTEnvExistEx RT_MANGLER(RTEnvExistEx)
+# define RTEnvFreeUtf8Block RT_MANGLER(RTEnvFreeUtf8Block)
# define RTEnvFreeUtf16Block RT_MANGLER(RTEnvFreeUtf16Block)
# define RTEnvGet RT_MANGLER(RTEnvGet)
# define RTEnvGetBad RT_MANGLER(RTEnvGetBad)
# define RTEnvGetByIndexEx RT_MANGLER(RTEnvGetByIndexEx)
+# define RTEnvGetByIndexRawEx RT_MANGLER(RTEnvGetByIndexRawEx)
# define RTEnvGetUtf8 RT_MANGLER(RTEnvGetUtf8)
# define RTEnvGetEx RT_MANGLER(RTEnvGetEx)
# define RTEnvGetExecEnvP RT_MANGLER(RTEnvGetExecEnvP)
+# define RTEnvIsChangeRecord RT_MANGLER(RTEnvIsChangeRecord)
# define RTEnvPut RT_MANGLER(RTEnvPut)
# define RTEnvPutBad RT_MANGLER(RTEnvPutBad)
# define RTEnvPutUtf8 RT_MANGLER(RTEnvPutUtf8)
# define RTEnvPutEx RT_MANGLER(RTEnvPutEx)
# define RTEnvQueryUtf16Block RT_MANGLER(RTEnvQueryUtf16Block)
+# define RTEnvQueryUtf8Block RT_MANGLER(RTEnvQueryUtf8Block)
+# define RTEnvReset RT_MANGLER(RTEnvReset)
# define RTEnvSet RT_MANGLER(RTEnvSet)
# define RTEnvSetBad RT_MANGLER(RTEnvSetBad)
# define RTEnvSetUtf8 RT_MANGLER(RTEnvSetUtf8)
diff --git a/include/iprt/process.h b/include/iprt/process.h
index 2760306..f9124e7 100644
--- a/include/iprt/process.h
+++ b/include/iprt/process.h
@@ -205,7 +205,13 @@ RTR3DECL(int) RTProcCreateEx(const char *pszExec, const char * const *papszArg
#define RTPROC_FLAGS_NO_WINDOW RT_BIT(5)
/** Search the PATH for the executable. */
#define RTPROC_FLAGS_SEARCH_PATH RT_BIT(6)
-
+/** Don't quote and escape arguments on Windows and similar platforms where a
+ * command line is passed to the child process instead of an argument vector,
+ * just join up argv with a space between each. Ignored on platforms
+ * passing argument the vector. */
+#define RTPROC_FLAGS_UNQUOTED_ARGS RT_BIT(7)
+/** Valid flag mask. */
+#define RTPROC_FLAGS_VALID_MASK UINT32_C(0xff)
/** @} */
diff --git a/include/iprt/thread.h b/include/iprt/thread.h
index 17a80d0..16da2e6 100644
--- a/include/iprt/thread.h
+++ b/include/iprt/thread.h
@@ -141,7 +141,7 @@ typedef enum RTTHREADTYPE
/** Message pump thread.
* Thread pumping messages from one thread/process to another
* thread/process. The workload is very small, most of the time
- * it's blocked waiting for messages to be procduced or processed.
+ * it's blocked waiting for messages to be produced or processed.
* This type of thread will be favored after I/O threads.
*/
RTTHREADTYPE_MSG_PUMP,
diff --git a/include/iprt/x86.h b/include/iprt/x86.h
index ee7a96f..ac67262 100644
--- a/include/iprt/x86.h
+++ b/include/iprt/x86.h
@@ -822,6 +822,8 @@ typedef const X86CPUIDFEATEDX *PCX86CPUIDFEATEDX;
#define X86_CR4_SMEP RT_BIT(20)
/** Bit 21 - SMAP - Supervisor-mode Access Prevention enabled. */
#define X86_CR4_SMAP RT_BIT(21)
+/** Bit 22 - PKE - Protection Key Enable. */
+#define X86_CR4_PKE RT_BIT(22)
/** @} */
@@ -2799,24 +2801,46 @@ typedef X86XSAVEAREA const *PCX86XSAVEAREA;
/** @name XSAVE_C_XXX - XSAVE State Components Bits.
* @{ */
+/** Bit 0 - x87 - Legacy FPU state (bit number) */
+#define XSAVE_C_X87_BIT 0
/** Bit 0 - x87 - Legacy FPU state. */
-#define XSAVE_C_X87 RT_BIT_64(0)
+#define XSAVE_C_X87 RT_BIT_64(XSAVE_C_X87_BIT)
+/** Bit 1 - SSE - 128-bit SSE state (bit number). */
+#define XSAVE_C_SSE_BIT 1
/** Bit 1 - SSE - 128-bit SSE state. */
-#define XSAVE_C_SSE RT_BIT_64(1)
+#define XSAVE_C_SSE RT_BIT_64(XSAVE_C_SSE_BIT)
+/** Bit 2 - YMM_Hi128 - Upper 128 bits of YMM0-15 (AVX) (bit number). */
+#define XSAVE_C_YMM_BIT 2
/** Bit 2 - YMM_Hi128 - Upper 128 bits of YMM0-15 (AVX). */
-#define XSAVE_C_YMM RT_BIT_64(2)
+#define XSAVE_C_YMM RT_BIT_64(XSAVE_C_YMM_BIT)
+/** Bit 3 - BNDREGS - MPX bound register state (bit number). */
+#define XSAVE_C_BNDREGS_BIT 3
/** Bit 3 - BNDREGS - MPX bound register state. */
-#define XSAVE_C_BNDREGS RT_BIT_64(3)
+#define XSAVE_C_BNDREGS RT_BIT_64(XSAVE_C_BNDREGS_BIT)
+/** Bit 4 - BNDCSR - MPX bound config and status state (bit number). */
+#define XSAVE_C_BNDCSR_BIT 4
/** Bit 4 - BNDCSR - MPX bound config and status state. */
-#define XSAVE_C_BNDCSR RT_BIT_64(4)
+#define XSAVE_C_BNDCSR RT_BIT_64(XSAVE_C_BNDCSR_BIT)
+/** Bit 5 - Opmask - opmask state (bit number). */
+#define XSAVE_C_OPMASK_BIT 5
/** Bit 5 - Opmask - opmask state. */
-#define XSAVE_C_OPMASK RT_BIT_64(5)
+#define XSAVE_C_OPMASK RT_BIT_64(XSAVE_C_OPMASK_BIT)
+/** Bit 6 - ZMM_Hi256 - Upper 256 bits of ZMM0-15 (AVX-512) (bit number). */
+#define XSAVE_C_ZMM_HI256_BIT 6
/** Bit 6 - ZMM_Hi256 - Upper 256 bits of ZMM0-15 (AVX-512). */
-#define XSAVE_C_ZMM_HI256 RT_BIT_64(6)
+#define XSAVE_C_ZMM_HI256 RT_BIT_64(XSAVE_C_ZMM_HI256_BIT)
+/** Bit 7 - Hi16_ZMM - 512-bits ZMM16-31 state (AVX-512) (bit number). */
+#define XSAVE_C_ZMM_16HI_BIT 7
/** Bit 7 - Hi16_ZMM - 512-bits ZMM16-31 state (AVX-512). */
-#define XSAVE_C_ZMM_16HI RT_BIT_64(7)
+#define XSAVE_C_ZMM_16HI RT_BIT_64(XSAVE_C_ZMM_16HI_BIT)
+/** Bit 9 - PKRU - Protection-key state (bit number). */
+#define XSAVE_C_PKRU_BIT 9
+/** Bit 9 - PKRU - Protection-key state. */
+#define XSAVE_C_PKRU RT_BIT_64(XSAVE_C_PKRU_BIT)
+/** Bit 62 - LWP - Lightweight Profiling (AMD) (bit number). */
+#define XSAVE_C_LWP_BIT 62
/** Bit 62 - LWP - Lightweight Profiling (AMD). */
-#define XSAVE_C_LWP RT_BIT_64(62)
+#define XSAVE_C_LWP RT_BIT_64(XSAVE_C_LWP_BIT)
/** @} */
@@ -3719,6 +3743,8 @@ typedef const X86XCPT *PCX86XCPT;
#define X86_TRAP_PF_RSVD RT_BIT(3)
/** Bit 4 - I/D - Instruction fetch (set) / Data access (clear) - PAE + NXE. */
#define X86_TRAP_PF_ID RT_BIT(4)
+/** Bit 5 - PK - Protection-key violation (AMD64 mode only). */
+#define X86_TRAP_PF_PK RT_BIT(5)
/** @} */
#pragma pack(1)
diff --git a/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp b/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
index 0b7f7d7..71006ec 100644
--- a/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
+++ b/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
@@ -843,8 +843,8 @@ static int vbgdHeartbeatInit(PVBOXGUESTDEVEXT pDevExt)
rc = VbglGRAlloc(&pDevExt->pReqGuestHeartbeat, sizeof(*pDevExt->pReqGuestHeartbeat), VMMDevReq_GuestHeartbeat);
if (RT_SUCCESS(rc))
{
- LogRel(("VbgdCommonInitDevExt: Setting up heartbeat to trigger every %RU64 sec\n",
- pDevExt->cNsHeartbeatInterval / RT_NS_1SEC));
+ LogRel(("VbgdCommonInitDevExt: Setting up heartbeat to trigger every %RU64 milliseconds\n",
+ pDevExt->cNsHeartbeatInterval / RT_NS_1MS));
rc = RTTimerCreateEx(&pDevExt->pHeartbeatTimer, pDevExt->cNsHeartbeatInterval, 0 /*fFlags*/,
(PFNRTTIMER)vbgdHeartbeatTimerHandler, pDevExt);
if (RT_SUCCESS(rc))
diff --git a/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h b/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h
index a76f496..0d43f38 100644
--- a/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h
+++ b/src/VBox/Additions/common/VBoxGuest/VBoxGuestInternal.h
@@ -236,7 +236,7 @@ typedef struct VBOXGUESTDEVEXT
/** Heartbeat timer interval in nanoseconds. */
uint64_t cNsHeartbeatInterval;
/** Preallocated VMMDevReq_GuestHeartbeat request. */
- VMMDevRequestHeader *pReqGuestHeartbeat;
+ VMMDevRequestHeader *pReqGuestHeartbeat;
} VBOXGUESTDEVEXT;
/** Pointer to the VBoxGuest driver data. */
typedef VBOXGUESTDEVEXT *PVBOXGUESTDEVEXT;
diff --git a/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp b/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp
index bedc903..0d7eade 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 98758 $ */
+/* $Id: GenericRequest.cpp $ */
/** @file
* VBoxGuestLibR0 - Generic VMMDev request management.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp b/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp
index 2b936b4..c434c85 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/HGCM.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 92918 $ */
+/* $Id: HGCM.cpp $ */
/** @file
* VBoxGuestLib - Host-Guest Communication Manager.
*
diff --git a/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp b/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp
index a126089..7521f88 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 94149 $ */
+/* $Id: HGCMInternal.cpp $ */
/** @file
* VBoxGuestLib - Host-Guest Communication Manager internal functions, implemented by VBoxGuest
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/Init.cpp b/src/VBox/Additions/common/VBoxGuestLib/Init.cpp
index 5298ffe..7a9ada0 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/Init.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/Init.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 89635 $ */
+/* $Id: Init.cpp $ */
/** @file
* VBoxGuestLibR0 - Library initialization.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/Mouse.cpp b/src/VBox/Additions/common/VBoxGuestLib/Mouse.cpp
index 2bcb101..e6bca47 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/Mouse.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/Mouse.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 92917 $ */
+/* $Id: Mouse.cpp $ */
/** @file
* VBoxGuestLibR0 - Mouse Integration.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp b/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp
index 1f1d24f..414e6b8 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/PhysHeap.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 85891 $ */
+/* $Id: PhysHeap.cpp $ */
/** @file
* VBoxGuestLibR0 - Physical memory heap.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp
index 008c5e1..188c8e0 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 83575 $ */
+/* $Id: SysHlp.cpp $ */
/** @file
* VBoxGuestLibR0 - IDC with VBoxGuest and HGCM helpers.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h
index 6860364..844b014 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h
+++ b/src/VBox/Additions/common/VBoxGuestLib/SysHlp.h
@@ -1,4 +1,4 @@
-/* $Revision: 83575 $ */
+/* $Id: SysHlp.h $ */
/** @file
* VBoxGuestLibR0 - System dependent helpers internal header.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h b/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h
index 6fe015d..e519af8 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBGLInternal.h
@@ -1,4 +1,4 @@
-/* Id: 73443 $ */
+/* $Id: VBGLInternal.h $ */
/** @file
* VBoxGuestLibR0 - Internal header.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h
index fccd343..7e7f6c4 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestLog.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxGuestLog.h $ */
/** @file
* VBoxGuestLibR0 - Guest Logging facility.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp
index 893b471..4115eb4 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.cpp
@@ -1,3 +1,4 @@
+/* $Id: VBoxGuestR0LibCrOgl.cpp $ */
/** @file
* VBoxGuestLib - Central calls header.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.h b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.h
index ae0eac2..2136293 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.h
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibCrOgl.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxGuestR0LibCrOgl.h $ */
/** @file
* VBoxGuestLib - Central calls header.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c
index 368ca08..a4e44bd 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.c
@@ -1,4 +1,4 @@
-/* $Revision: 94876 $ */
+/* $Id: VBoxGuestR0LibSharedFolders.c $ */
/** @file
* VBoxGuestR0LibSharedFolders - Ring 0 Shared Folders calls.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h
index 5e5c957..1ba1bcd 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR0LibSharedFolders.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxGuestR0LibSharedFolders.h $ */
/** @file
* VBoxGuestLib - Central calls header.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp
index 4b4cad7..f2d84f7 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibDragAndDrop.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2011-2013 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -43,6 +43,7 @@
#define LOG_GROUP LOG_GROUP_GUEST_DND
#include <VBox/log.h>
+#include <VBox/VBoxGuestLib.h>
#include <VBox/GuestHost/DragAndDrop.h>
#include <VBox/HostServices/DragAndDropSvc.h>
@@ -62,21 +63,22 @@
* Private internal functions *
******************************************************************************/
-static int vbglR3DnDQueryNextHostMessageType(uint32_t uClientId, uint32_t *puMsg, uint32_t *pcParms, bool fWait)
+static int vbglR3DnDQueryNextHostMessageType(PVBGLR3GUESTDNDCMDCTX pCtx, uint32_t *puMsg, uint32_t *pcParms, bool fWait)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(puMsg, VERR_INVALID_POINTER);
AssertPtrReturn(pcParms, VERR_INVALID_POINTER);
DragAndDropSvc::VBOXDNDNEXTMSGMSG Msg;
RT_ZERO(Msg);
Msg.hdr.result = VERR_WRONG_ORDER;
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG;
Msg.hdr.cParms = 3;
Msg.msg.SetUInt32(0);
Msg.num_parms.SetUInt32(0);
- Msg.block.SetUInt32(fWait);
+ Msg.block.SetUInt32(fWait ? 1 : 0);
int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
if (RT_SUCCESS(rc))
@@ -92,7 +94,7 @@ static int vbglR3DnDQueryNextHostMessageType(uint32_t uClientId, uint32_t *puMsg
return rc;
}
-static int vbglR3DnDHGProcessActionMessage(uint32_t uClientId,
+static int vbglR3DnDHGProcessActionMessage(PVBGLR3GUESTDNDCMDCTX pCtx,
uint32_t uMsg,
uint32_t *puScreenId,
uint32_t *puX,
@@ -103,6 +105,7 @@ static int vbglR3DnDHGProcessActionMessage(uint32_t uClientId,
uint32_t cbFormats,
uint32_t *pcbFormatsRecv)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(puScreenId, VERR_INVALID_POINTER);
AssertPtrReturn(puX, VERR_INVALID_POINTER);
AssertPtrReturn(puY, VERR_INVALID_POINTER);
@@ -114,7 +117,7 @@ static int vbglR3DnDHGProcessActionMessage(uint32_t uClientId,
DragAndDropSvc::VBOXDNDHGACTIONMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = uMsg;
Msg.hdr.cParms = 7;
@@ -146,11 +149,13 @@ static int vbglR3DnDHGProcessActionMessage(uint32_t uClientId,
return rc;
}
-static int vbglR3DnDHGProcessLeaveMessage(uint32_t uClientId)
+static int vbglR3DnDHGProcessLeaveMessage(PVBGLR3GUESTDNDCMDCTX pCtx)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
DragAndDropSvc::VBOXDNDHGLEAVEMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_EVT_LEAVE;
Msg.hdr.cParms = 0;
@@ -161,11 +166,13 @@ static int vbglR3DnDHGProcessLeaveMessage(uint32_t uClientId)
return rc;
}
-static int vbglR3DnDHGProcessCancelMessage(uint32_t uClientId)
+static int vbglR3DnDHGProcessCancelMessage(PVBGLR3GUESTDNDCMDCTX pCtx)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
DragAndDropSvc::VBOXDNDHGCANCELMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_EVT_CANCEL;
Msg.hdr.cParms = 0;
@@ -176,12 +183,13 @@ static int vbglR3DnDHGProcessCancelMessage(uint32_t uClientId)
return rc;
}
-static int vbglR3DnDHGProcessSendDirMessage(uint32_t uClientId,
+static int vbglR3DnDHGProcessSendDirMessage(PVBGLR3GUESTDNDCMDCTX pCtx,
char *pszDirname,
uint32_t cbDirname,
uint32_t *pcbDirnameRecv,
uint32_t *pfMode)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pszDirname, VERR_INVALID_POINTER);
AssertReturn(cbDirname, VERR_INVALID_PARAMETER);
AssertPtrReturn(pcbDirnameRecv, VERR_INVALID_POINTER);
@@ -189,7 +197,7 @@ static int vbglR3DnDHGProcessSendDirMessage(uint32_t uClientId,
DragAndDropSvc::VBOXDNDHGSENDDIRMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_DIR;
Msg.hdr.cParms = 3;
@@ -213,15 +221,16 @@ static int vbglR3DnDHGProcessSendDirMessage(uint32_t uClientId,
return rc;
}
-static int vbglR3DnDHGProcessSendFileMessage(uint32_t uClientId,
- char *pszFilename,
- uint32_t cbFilename,
- uint32_t *pcbFilenameRecv,
- void *pvData,
- uint32_t cbData,
- uint32_t *pcbDataRecv,
- uint32_t *pfMode)
+static int vbglR3DnDHGProcessSendFileMessage(PVBGLR3GUESTDNDCMDCTX pCtx,
+ char *pszFilename,
+ uint32_t cbFilename,
+ uint32_t *pcbFilenameRecv,
+ void *pvData,
+ uint32_t cbData,
+ uint32_t *pcbDataRecv,
+ uint32_t *pfMode)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pszFilename, VERR_INVALID_POINTER);
AssertReturn(cbFilename, VERR_INVALID_PARAMETER);
AssertPtrReturn(pcbFilenameRecv, VERR_INVALID_POINTER);
@@ -230,17 +239,29 @@ static int vbglR3DnDHGProcessSendFileMessage(uint32_t uClientId,
AssertPtrReturn(pcbDataRecv, VERR_INVALID_POINTER);
AssertPtrReturn(pfMode, VERR_INVALID_POINTER);
- DragAndDropSvc::VBOXDNDHGSENDFILEMSG Msg;
+ DragAndDropSvc::VBOXDNDHGSENDFILEDATAMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
- Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_FILE;
- Msg.hdr.cParms = 5;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
+ Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA;
- Msg.pvName.SetPtr(pszFilename, cbFilename);
- Msg.cbName.SetUInt32(0);
- Msg.pvData.SetPtr(pvData, cbData);
- Msg.cbData.SetUInt32(0);
- Msg.fMode.SetUInt32(0);
+ if (pCtx->uProtocol <= 1)
+ {
+ Msg.u.v1.pvName.SetPtr(pszFilename, cbFilename);
+ Msg.u.v1.cbName.SetUInt32(cbFilename);
+ Msg.u.v1.pvData.SetPtr(pvData, cbData);
+ Msg.u.v1.cbData.SetUInt32(cbData);
+ Msg.u.v1.fMode.SetUInt32(0);
+
+ Msg.hdr.cParms = 5;
+ }
+ else
+ {
+ Msg.u.v2.uContext.SetUInt32(0); /** @todo Not used yet. */
+ Msg.u.v2.pvData.SetPtr(pvData, cbData);
+ Msg.u.v2.cbData.SetUInt32(cbData);
+
+ Msg.hdr.cParms = 3;
+ }
int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
if (RT_SUCCESS(rc))
@@ -248,33 +269,103 @@ static int vbglR3DnDHGProcessSendFileMessage(uint32_t uClientId,
rc = Msg.hdr.result;
if (RT_SUCCESS(rc))
{
- rc = Msg.cbName.GetUInt32(pcbFilenameRecv); AssertRC(rc);
- rc = Msg.cbData.GetUInt32(pcbDataRecv); AssertRC(rc);
- rc = Msg.fMode.GetUInt32(pfMode); AssertRC(rc);
+ if (pCtx->uProtocol <= 1)
+ {
+ rc = Msg.u.v1.cbName.GetUInt32(pcbFilenameRecv); AssertRC(rc);
+ rc = Msg.u.v1.cbData.GetUInt32(pcbDataRecv); AssertRC(rc);
+ rc = Msg.u.v1.fMode.GetUInt32(pfMode); AssertRC(rc);
+
+ AssertReturn(cbFilename >= *pcbFilenameRecv, VERR_TOO_MUCH_DATA);
+ AssertReturn(cbData >= *pcbDataRecv, VERR_TOO_MUCH_DATA);
+ }
+ else
+ {
+ rc = Msg.u.v2.cbData.GetUInt32(pcbDataRecv); AssertRC(rc);
+ AssertReturn(cbData >= *pcbDataRecv, VERR_TOO_MUCH_DATA);
+ }
+ }
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+static int vbglR3DnDHGProcessSendFileHdrMessage(PVBGLR3GUESTDNDCMDCTX pCtx,
+ char *pszFilename,
+ uint32_t cbFilename,
+ uint32_t *puFlags,
+ uint32_t *pfMode,
+ uint64_t *pcbTotal)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(pszFilename, VERR_INVALID_POINTER);
+ AssertReturn(cbFilename, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(puFlags, VERR_INVALID_POINTER);
+ AssertPtrReturn(pfMode, VERR_INVALID_POINTER);
+ AssertReturn(pcbTotal, VERR_INVALID_POINTER);
+
+ DragAndDropSvc::VBOXDNDHGSENDFILEHDRMSG Msg;
+ RT_ZERO(Msg);
+ Msg.hdr.u32ClientID = pCtx->uClientID;
+ Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR;
+
+ int rc;
+
+ if (pCtx->uProtocol <= 1)
+ {
+ rc = VERR_NOT_SUPPORTED;
+ }
+ else
+ {
+ Msg.uContext.SetUInt32(0); /** @todo Not used yet. */
+ Msg.pvName.SetPtr(pszFilename, cbFilename);
+ Msg.cbName.SetUInt32(cbFilename);
+ Msg.uFlags.SetUInt32(0);
+ Msg.fMode.SetUInt32(0);
+ Msg.cbTotal.SetUInt64(0);
- AssertReturn(cbFilename >= *pcbFilenameRecv, VERR_TOO_MUCH_DATA);
- AssertReturn(cbData >= *pcbDataRecv, VERR_TOO_MUCH_DATA);
+ Msg.hdr.cParms = 6;
+
+ rc = VINF_SUCCESS;
+ }
+
+ if (RT_SUCCESS(rc))
+ rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
+ if (RT_SUCCESS(rc))
+ {
+ rc = Msg.hdr.result;
+ if (RT_SUCCESS(rc))
+ {
+ /** @todo Get context ID. */
+ rc = Msg.uFlags.GetUInt32(puFlags); AssertRC(rc);
+ rc = Msg.fMode.GetUInt32(pfMode); AssertRC(rc);
+ rc = Msg.cbTotal.GetUInt64(pcbTotal); AssertRC(rc);
}
}
return rc;
}
-static int vbglR3DnDHGProcessURIMessages(uint32_t uClientId,
- uint32_t *puScreenId,
- char *pszFormat,
- uint32_t cbFormat,
- uint32_t *pcbFormatRecv,
- void **ppvData,
- uint32_t cbData,
- size_t *pcbDataRecv)
+static int vbglR3DnDHGProcessURIMessages(PVBGLR3GUESTDNDCMDCTX pCtx,
+ uint32_t *puScreenId,
+ char *pszFormat,
+ uint32_t cbFormat,
+ uint32_t *pcbFormatRecv,
+ void **ppvData,
+ uint32_t cbData,
+ size_t *pcbDataRecv)
{
- AssertPtrReturn(ppvData, VERR_INVALID_POINTER);
- AssertPtrReturn(cbData, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(ppvData, VERR_INVALID_POINTER);
+ AssertPtrReturn(cbData, VERR_INVALID_PARAMETER);
AssertPtrReturn(pcbDataRecv, VERR_INVALID_POINTER);
- if (!*pcbDataRecv)
- return VERR_INVALID_PARAMETER;
+ void *pvData = *ppvData;
+ uint32_t cbDataRecv = 0;
+ uint64_t cbDataToRead = *pcbDataRecv;
+ uint64_t cbDataWritten = 0;
+
+ int rc = VINF_SUCCESS;
/* Allocate temp buffer. */
uint32_t cbTmpData = _64K; /** @todo Make this configurable? */
@@ -282,153 +373,216 @@ static int vbglR3DnDHGProcessURIMessages(uint32_t uClientId,
if (!pvTmpData)
return VERR_NO_MEMORY;
- /* Create and query the (unique) drop target directory. */
- char pszDropDir[RTPATH_MAX];
- int rc = DnDDirCreateDroppedFiles(pszDropDir, sizeof(pszDropDir));
- if (RT_FAILURE(rc))
- {
- RTMemFree(pvTmpData);
- return rc;
- }
-
- /* Patch the old drop data with the new drop directory, so the drop target
- * can find the files. */
- DnDURIList lstURI;
- rc = lstURI.RootFromURIData(*ppvData, *pcbDataRecv,
- 0 /* fFlags */);
+ /* Create and query the (unique) drop target directory in the user's temporary directory. */
+ DNDDIRDROPPEDFILES dirDroppedFiles;
+ const char *pszDropDir;
+ rc = DnDDirDroppedFilesCreateAndOpenTemp(&dirDroppedFiles);
if (RT_SUCCESS(rc))
- {
- /* Cleanup the old data and write the new data back to the event. */
- RTMemFree(*ppvData);
+ pszDropDir = DnDDirDroppedFilesGetDirAbs(&dirDroppedFiles);
- RTCString strData = lstURI.RootToString(pszDropDir);
- *ppvData = RTStrDupN(strData.c_str(), strData.length());
- *pcbDataRecv = strData.length() + 1;
- }
-
- /* Lists for holding created files & directories
- * in the case of a rollback. */
- RTCList<RTCString> guestDirList;
- RTCList<RTCString> guestFileList;
+ DnDURIList lstURI;
+ DnDURIObject objFile(DnDURIObject::File);
- char szPathName[RTPATH_MAX];
+ char szPathName[RTPATH_MAX] = { 0 };
uint32_t cbPathName = 0;
+ uint32_t fFlags = 0;
+ uint32_t fMode = 0;
- bool fLoop = RT_SUCCESS(rc); /* No error occurred yet? */
- while (fLoop)
+ while (RT_SUCCESS(rc))
{
uint32_t uNextMsg;
uint32_t cNextParms;
- rc = vbglR3DnDQueryNextHostMessageType(uClientId, &uNextMsg, &cNextParms, false /* fWait */);
+ rc = vbglR3DnDQueryNextHostMessageType(pCtx, &uNextMsg, &cNextParms, false /* fWait */);
if (RT_SUCCESS(rc))
{
+ LogFlowFunc(("uNextMsg=%RU32, cNextParms=%RU32\n", uNextMsg, cNextParms));
+
switch (uNextMsg)
{
case DragAndDropSvc::HOST_DND_HG_SND_DIR:
{
- uint32_t fMode = 0;
- rc = vbglR3DnDHGProcessSendDirMessage(uClientId,
+ rc = vbglR3DnDHGProcessSendDirMessage(pCtx,
szPathName,
sizeof(szPathName),
&cbPathName,
&fMode);
-#ifdef DEBUG_andy
LogFlowFunc(("HOST_DND_HG_SND_DIR pszPathName=%s, cbPathName=%RU32, fMode=0x%x, rc=%Rrc\n",
szPathName, cbPathName, fMode, rc));
-#endif
- if (RT_SUCCESS(rc))
- rc = DnDPathSanitize(szPathName, sizeof(szPathName));
- if (RT_SUCCESS(rc))
+
+ char *pszPathAbs = RTPathJoinA(pszDropDir, szPathName);
+ if (pszPathAbs)
{
- char *pszNewDir = RTPathJoinA(pszDropDir, szPathName);
- if (pszNewDir)
- {
- rc = RTDirCreate(pszNewDir, (fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRWXU, 0);
- if (!guestDirList.contains(pszNewDir))
- guestDirList.append(pszNewDir);
+ rc = RTDirCreate(pszPathAbs, (fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRWXU, 0);
+ if (RT_SUCCESS(rc))
+ rc = DnDDirDroppedAddDir(&dirDroppedFiles, pszPathAbs);
- RTStrFree(pszNewDir);
- }
- else
- rc = VERR_NO_MEMORY;
+ RTStrFree(pszPathAbs);
}
+ else
+ rc = VERR_NO_MEMORY;
break;
}
- case DragAndDropSvc::HOST_DND_HG_SND_FILE:
+ case DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR:
+ case DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA:
{
- uint32_t cbDataRecv;
- uint32_t fMode = 0;
- rc = vbglR3DnDHGProcessSendFileMessage(uClientId,
- szPathName,
- sizeof(szPathName),
- &cbPathName,
- pvTmpData,
- cbTmpData,
- &cbDataRecv,
- &fMode);
-#ifdef DEBUG_andy
- LogFlowFunc(("HOST_DND_HG_SND_FILE pszPathName=%s, cbPathName=%RU32, pvData=0x%p, cbDataRecv=%RU32, fMode=0x%x, rc=%Rrc\n",
- szPathName, cbPathName, pvTmpData, cbDataRecv, fMode, rc));
-#endif
- if (RT_SUCCESS(rc))
- rc = DnDPathSanitize(szPathName, sizeof(szPathName));
- if (RT_SUCCESS(rc))
+ if (uNextMsg == DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR)
+ rc = vbglR3DnDHGProcessSendFileHdrMessage(pCtx,
+ szPathName,
+ sizeof(szPathName),
+ &fFlags,
+ &fMode,
+ &cbDataToRead);
+ else
+ rc = vbglR3DnDHGProcessSendFileMessage(pCtx,
+ szPathName,
+ sizeof(szPathName),
+ &cbPathName,
+ pvTmpData,
+ cbTmpData,
+ &cbDataRecv,
+ &fMode);
+ if ( RT_SUCCESS(rc)
+ && ( uNextMsg == DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR
+ /* Protocol v1 always sends the file name, so try opening every time. */
+ || pCtx->uProtocol <= 1)
+ )
{
char *pszPathAbs = RTPathJoinA(pszDropDir, szPathName);
if (pszPathAbs)
{
- RTFILE hFile;
- /** @todo r=andy Keep the file open and locked during the actual file transfer. Otherwise this will
- * create all sorts of funny races because we don't know if the guest has
- * modified the file in between the file data send calls. */
- rc = RTFileOpen(&hFile, pszPathAbs,
- RTFILE_O_WRITE | RTFILE_O_APPEND | RTFILE_O_DENY_ALL | RTFILE_O_OPEN_CREATE);
- if (RT_SUCCESS(rc))
+ LogFlowFunc(("Opening pszPathName=%s, cbPathName=%RU32, fMode=0x%x, cbSize=%RU64\n",
+ szPathName, cbPathName, fMode, cbDataToRead));
+
+ uint64_t fOpen = RTFILE_O_WRITE | RTFILE_O_DENY_ALL;
+ if (pCtx->uProtocol <= 1)
+ fOpen |= RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND;
+ else
+ fOpen |= RTFILE_O_CREATE_REPLACE;
+
+ /* Is there already a file open, e.g. in transfer? */
+ if (!objFile.IsOpen())
{
- /** @todo r=andy Not very safe to assume that we were last appending to the current file. */
- rc = RTFileSeek(hFile, 0, RTFILE_SEEK_END, NULL);
+
+ RTCString strPathAbs(pszPathAbs);
+ rc = objFile.OpenEx(strPathAbs, DnDURIObject::File, DnDURIObject::Target, fOpen,
+ (fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR);
if (RT_SUCCESS(rc))
{
- rc = RTFileWrite(hFile, pvTmpData, cbDataRecv, 0);
- /* Valid UNIX mode? */
- if ( RT_SUCCESS(rc)
- && (fMode & RTFS_UNIX_MASK))
- rc = RTFileSetMode(hFile, (fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR);
+ rc = DnDDirDroppedAddFile(&dirDroppedFiles, strPathAbs.c_str());
+ if (RT_SUCCESS(rc))
+ {
+ cbDataWritten = 0;
+
+ if (pCtx->uProtocol >= 2) /* Set the expected file size. */
+ objFile.SetSize(cbDataToRead);
+ }
}
-
- RTFileClose(hFile);
-
- if (!guestFileList.contains(pszPathAbs))
- guestFileList.append(pszPathAbs);
}
-#ifdef DEBUG
else
- LogFlowFunc(("Opening file failed with rc=%Rrc\n", rc));
-#endif
+ rc = VERR_WRONG_ORDER;
+
RTStrFree(pszPathAbs);
}
else
rc = VERR_NO_MEMORY;
}
+
+ if ( RT_SUCCESS(rc)
+ && uNextMsg == DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA)
+ {
+ bool fClose = false;
+
+ uint32_t cbWritten;
+ rc = objFile.Write(pvTmpData, cbDataRecv, &cbWritten);
+ if (RT_SUCCESS(rc))
+ {
+ if (pCtx->uProtocol >= 2)
+ {
+ /* Data transfer complete? Close the file. */
+ fClose = objFile.IsComplete();
+ }
+ else
+ fClose = true; /* Always close the file after each chunk. */
+
+ cbDataWritten += cbWritten;
+ Assert(cbDataWritten <= cbDataToRead);
+ }
+
+ if (fClose)
+ {
+ LogFlowFunc(("Closing file\n"));
+ objFile.Close();
+ }
+ }
break;
}
case DragAndDropSvc::HOST_DND_HG_EVT_CANCEL:
{
- rc = vbglR3DnDHGProcessCancelMessage(uClientId);
+ rc = vbglR3DnDHGProcessCancelMessage(pCtx);
if (RT_SUCCESS(rc))
rc = VERR_CANCELLED;
- /* Break out of the loop. */
+ break;
}
default:
- fLoop = false;
+ LogFlowFunc(("Message %RU32 not supported\n", uNextMsg));
+ rc = VERR_NOT_SUPPORTED;
break;
}
- }
- else
- {
- if (rc == VERR_NO_DATA)
- rc = VINF_SUCCESS;
- break;
+
+#if 0 /* Not used yet. */
+ if (pCtx->uProtocol >= XXX)
+ {
+ /*
+ * Send the progress back to the host.
+ */
+ uint32_t uStatus;
+ int guestRc;
+ uint8_t uPercent;
+ switch (rc)
+ {
+ case VINF_SUCCESS:
+ {
+ if (!cbData)
+ cbData = 1;
+ uPercent = cbDataWritten * 100 / (cbDataToRead ? cbDataToRead : 1);
+ uStatus = uPercent >= 100 ?
+ DragAndDropSvc::DND_PROGRESS_COMPLETE : DragAndDropSvc::DND_PROGRESS_RUNNING;
+ guestRc = VINF_SUCCESS;
+ break;
+ }
+
+ case VERR_CANCELLED:
+ {
+ uStatus = DragAndDropSvc::DND_PROGRESS_CANCELLED;
+ uPercent = 100;
+ guestRc = VINF_SUCCESS;
+ break;
+ }
+
+ default:
+ {
+ uStatus = DragAndDropSvc::DND_PROGRESS_ERROR;
+ uPercent = 100;
+ guestRc = rc;
+ break;
+ }
+ }
+
+ int rc2 = VbglR3DnDHGSetProgress(pCtx, uStatus, uPercent, guestRc);
+ LogFlowFunc(("cbDataWritten=%RU64 / cbDataToRead=%RU64 => %RU8%% (uStatus=%ld, %Rrc), rc=%Rrc\n", cbDataWritten, cbDataToRead,
+ uPercent, uStatus, guestRc, rc2));
+ if (RT_SUCCESS(rc))
+ rc = rc2;
+
+ /* All data transferred? */
+ if ( RT_SUCCESS(rc)
+ && uPercent == 100)
+ {
+ rc = VINF_EOF;
+ break;
+ }
+ }
+#endif
}
if (RT_FAILURE(rc))
@@ -436,26 +590,63 @@ static int vbglR3DnDHGProcessURIMessages(uint32_t uClientId,
} /* while */
+ LogFlowFunc(("Loop ended with %Rrc\n", rc));
+
+ /* All URI data processed? */
+ if (rc == VERR_NO_DATA)
+ rc = VINF_SUCCESS;
+
if (pvTmpData)
RTMemFree(pvTmpData);
- /* Cleanup on failure or if the user has canceled. */
+ /* Cleanup on failure or if the user has canceled the operation or
+ * something else went wrong. */
if (RT_FAILURE(rc))
{
- /* Remove any stuff created. */
- for (size_t i = 0; i < guestFileList.size(); ++i)
- RTFileDelete(guestFileList.at(i).c_str());
- for (size_t i = 0; i < guestDirList.size(); ++i)
- RTDirRemove(guestDirList.at(i).c_str());
- RTDirRemove(pszDropDir);
-
- LogFlowFunc(("Failed with rc=%Rrc\n", rc));
+ int rc2 = DnDDirDroppedFilesRollback(&dirDroppedFiles);
+ AssertRC(rc2); /* Not fatal, don't report back to host. */
}
+ else
+ {
+ /*
+ * Patch the old drop data with the new drop directory, so the drop target can find the files.
+ */
+ rc = lstURI.RootFromURIData(pvData, cbDataToRead, 0 /* fFlags */);
+ if (RT_SUCCESS(rc))
+ {
+ /* Cleanup the old data and write the new data back to the event. */
+ RTMemFree(pvData);
+
+ RTCString strData = lstURI.RootToString(pszDropDir);
+ LogFlowFunc(("cbDataToRead: %zu -> %zu\n", cbDataToRead, strData.length() + 1));
+
+ pvData = RTStrDupN(strData.c_str(), strData.length());
+ cbDataToRead = strData.length() + 1;
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ *ppvData = pvData;
+ *pcbDataRecv = cbDataToRead;
+ }
+
+ /** @todo Compare the URI list with the dirs/files we really transferred. */
+ }
+
+ /*
+ * Close the dropped files directory.
+ * Don't try to remove it here, however, as the files are being needed
+ * by the client's drag'n drop operation lateron.
+ */
+ int rc2 = DnDDirDroppedFilesClose(&dirDroppedFiles, false);
+ if (RT_FAILURE(rc2)) /* Not fatal, don't report back to host. */
+ LogFlowFunc(("Closing dropped files directory failed with %Rrc\n", rc2));
+ LogFlowFuncLeaveRC(rc);
return rc;
}
-static int vbglR3DnDHGProcessDataMessageInternal(uint32_t uClientId,
+static int vbglR3DnDHGProcessDataMessageInternal(PVBGLR3GUESTDNDCMDCTX pCtx,
uint32_t *puScreenId,
char *pszFormat,
uint32_t cbFormat,
@@ -464,6 +655,7 @@ static int vbglR3DnDHGProcessDataMessageInternal(uint32_t uClientId,
uint32_t cbData,
uint32_t *pcbDataTotal)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(puScreenId, VERR_INVALID_POINTER);
AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
AssertReturn(cbFormat, VERR_INVALID_PARAMETER);
@@ -474,7 +666,7 @@ static int vbglR3DnDHGProcessDataMessageInternal(uint32_t uClientId,
DragAndDropSvc::VBOXDNDHGSENDDATAMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_DATA;
Msg.hdr.cParms = 5;
@@ -492,29 +684,35 @@ static int vbglR3DnDHGProcessDataMessageInternal(uint32_t uClientId,
|| rc == VERR_BUFFER_OVERFLOW)
{
rc = Msg.uScreenId.GetUInt32(puScreenId); AssertRC(rc);
+
+ /*
+ * In case of VERR_BUFFER_OVERFLOW get the data sizes required
+ * for the format + data blocks.
+ */
rc = Msg.cFormat.GetUInt32(pcbFormatRecv); AssertRC(rc);
- rc = Msg.cbData.GetUInt32(pcbDataTotal); AssertRC(rc);
+ rc = Msg.cbData.GetUInt32(pcbDataTotal); AssertRC(rc);
AssertReturn(cbFormat >= *pcbFormatRecv, VERR_TOO_MUCH_DATA);
- AssertReturn(cbData >= *pcbDataTotal, VERR_TOO_MUCH_DATA);
+ AssertReturn(cbData >= *pcbDataTotal, VERR_TOO_MUCH_DATA);
}
}
return rc;
}
-static int vbglR3DnDHGProcessMoreDataMessageInternal(uint32_t uClientId,
+static int vbglR3DnDHGProcessMoreDataMessageInternal(PVBGLR3GUESTDNDCMDCTX pCtx,
void *pvData,
uint32_t cbData,
- uint32_t *pcbDataRecv)
+ uint32_t *pcbDataTotal)
{
- AssertPtrReturn(pvData, VERR_INVALID_POINTER);
- AssertReturn(cbData, VERR_INVALID_PARAMETER);
- AssertPtrReturn(pcbDataRecv, VERR_INVALID_POINTER);
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(pvData, VERR_INVALID_POINTER);
+ AssertReturn(cbData, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pcbDataTotal, VERR_INVALID_POINTER);
DragAndDropSvc::VBOXDNDHGSENDMOREDATAMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_HG_SND_MORE_DATA;
Msg.hdr.cParms = 2;
@@ -528,14 +726,14 @@ static int vbglR3DnDHGProcessMoreDataMessageInternal(uint32_t uClientId,
if ( RT_SUCCESS(rc)
|| rc == VERR_BUFFER_OVERFLOW)
{
- rc = Msg.cbData.GetUInt32(pcbDataRecv); AssertRC(rc);
- AssertReturn(cbData >= *pcbDataRecv, VERR_TOO_MUCH_DATA);
+ rc = Msg.cbData.GetUInt32(pcbDataTotal); AssertRC(rc);
+ AssertReturn(cbData >= *pcbDataTotal, VERR_TOO_MUCH_DATA);
}
}
return rc;
}
-static int vbglR3DnDHGProcessSendDataMessageLoop(uint32_t uClientId,
+static int vbglR3DnDHGProcessSendDataMessageLoop(PVBGLR3GUESTDNDCMDCTX pCtx,
uint32_t *puScreenId,
char *pszFormat,
uint32_t cbFormat,
@@ -544,44 +742,59 @@ static int vbglR3DnDHGProcessSendDataMessageLoop(uint32_t uClientId,
uint32_t cbData,
size_t *pcbDataRecv)
{
- uint32_t cbDataRecv = 0;
- int rc = vbglR3DnDHGProcessDataMessageInternal(uClientId,
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(puScreenId, VERR_INVALID_POINTER);
+ AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
+ AssertPtrReturn(pcbFormatRecv, VERR_INVALID_POINTER);
+ AssertPtrReturn(ppvData, VERR_INVALID_POINTER);
+ /* pcbDataRecv is optional. */
+
+ uint32_t cbDataReq = 0;
+ int rc = vbglR3DnDHGProcessDataMessageInternal(pCtx,
puScreenId,
pszFormat,
cbFormat,
pcbFormatRecv,
*ppvData,
cbData,
- &cbDataRecv);
- uint32_t cbAllDataRecv = cbDataRecv;
+ &cbDataReq);
+ uint32_t cbDataTotal = cbDataReq;
+ void *pvData = *ppvData;
+
+ LogFlowFunc(("HOST_DND_HG_SND_DATA cbDataReq=%RU32, rc=%Rrc\n", cbDataTotal, rc));
+
while (rc == VERR_BUFFER_OVERFLOW)
{
uint32_t uNextMsg;
uint32_t cNextParms;
- rc = vbglR3DnDQueryNextHostMessageType(uClientId, &uNextMsg, &cNextParms, false);
+ rc = vbglR3DnDQueryNextHostMessageType(pCtx, &uNextMsg, &cNextParms, false);
if (RT_SUCCESS(rc))
{
switch(uNextMsg)
{
case DragAndDropSvc::HOST_DND_HG_SND_MORE_DATA:
{
- *ppvData = RTMemRealloc(*ppvData, cbAllDataRecv + cbData);
- if (!*ppvData)
+ /** @todo r=andy Don't use reallocate here; can go wrong with *really* big URI lists.
+ * Instead send as many URI entries as possible per chunk and add those entries
+ * to our to-process list for immediata processing. Repeat the step after processing then. */
+ LogFlowFunc(("HOST_DND_HG_SND_MORE_DATA cbDataTotal: %RU32 -> %RU32\n", cbDataReq, cbDataReq + cbData));
+ pvData = RTMemRealloc(*ppvData, cbDataTotal + cbData);
+ if (!pvData)
{
rc = VERR_NO_MEMORY;
break;
}
- rc = vbglR3DnDHGProcessMoreDataMessageInternal(uClientId,
- &((char*)*ppvData)[cbAllDataRecv],
+ rc = vbglR3DnDHGProcessMoreDataMessageInternal(pCtx,
+ &((char *)pvData)[cbDataTotal],
cbData,
- &cbDataRecv);
- cbAllDataRecv += cbDataRecv;
+ &cbDataReq);
+ cbDataTotal += cbDataReq;
break;
}
case DragAndDropSvc::HOST_DND_HG_EVT_CANCEL:
default:
{
- rc = vbglR3DnDHGProcessCancelMessage(uClientId);
+ rc = vbglR3DnDHGProcessCancelMessage(pCtx);
if (RT_SUCCESS(rc))
rc = VERR_CANCELLED;
break;
@@ -589,13 +802,18 @@ static int vbglR3DnDHGProcessSendDataMessageLoop(uint32_t uClientId,
}
}
}
+
if (RT_SUCCESS(rc))
- *pcbDataRecv = cbAllDataRecv;
+ {
+ *ppvData = pvData;
+ if (pcbDataRecv)
+ *pcbDataRecv = cbDataTotal;
+ }
return rc;
}
-static int vbglR3DnDHGProcessSendDataMessage(uint32_t uClientId,
+static int vbglR3DnDHGProcessSendDataMessage(PVBGLR3GUESTDNDCMDCTX pCtx,
uint32_t *puScreenId,
char *pszFormat,
uint32_t cbFormat,
@@ -604,7 +822,13 @@ static int vbglR3DnDHGProcessSendDataMessage(uint32_t uClientId,
uint32_t cbData,
size_t *pcbDataRecv)
{
- int rc = vbglR3DnDHGProcessSendDataMessageLoop(uClientId,
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(puScreenId, VERR_INVALID_POINTER);
+ AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
+ AssertPtrReturn(pcbFormatRecv, VERR_INVALID_POINTER);
+ AssertPtrReturn(ppvData, VERR_INVALID_POINTER);
+
+ int rc = vbglR3DnDHGProcessSendDataMessageLoop(pCtx,
puScreenId,
pszFormat,
cbFormat,
@@ -622,7 +846,8 @@ static int vbglR3DnDHGProcessSendDataMessage(uint32_t uClientId,
* VBoxTray) small by not having too much redundant code. */
AssertPtr(pcbFormatRecv);
if (DnDMIMEHasFileURLs(pszFormat, *pcbFormatRecv))
- rc = vbglR3DnDHGProcessURIMessages(uClientId,
+ {
+ rc = vbglR3DnDHGProcessURIMessages(pCtx,
puScreenId,
pszFormat,
cbFormat,
@@ -630,19 +855,32 @@ static int vbglR3DnDHGProcessSendDataMessage(uint32_t uClientId,
ppvData,
cbData,
pcbDataRecv);
+ }
+ else
+ rc = VERR_NOT_SUPPORTED;
+
+ if (RT_FAILURE(rc))
+ {
+ if (RT_FAILURE(rc))
+ {
+ int rc2 = VbglR3DnDHGSetProgress(pCtx, DragAndDropSvc::DND_PROGRESS_ERROR, 100 /* Percent */, rc);
+ AssertRC(rc2);
+ }
+ }
}
return rc;
}
-static int vbglR3DnDGHProcessRequestPendingMessage(uint32_t uClientId,
+static int vbglR3DnDGHProcessRequestPendingMessage(PVBGLR3GUESTDNDCMDCTX pCtx,
uint32_t *puScreenId)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(puScreenId, VERR_INVALID_POINTER);
DragAndDropSvc::VBOXDNDGHREQPENDINGMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_GH_REQ_PENDING;
Msg.hdr.cParms = 1;
@@ -661,12 +899,13 @@ static int vbglR3DnDGHProcessRequestPendingMessage(uint32_t uClientId,
return rc;
}
-static int vbglR3DnDGHProcessDroppedMessage(uint32_t uClientId,
+static int vbglR3DnDGHProcessDroppedMessage(PVBGLR3GUESTDNDCMDCTX pCtx,
char *pszFormat,
uint32_t cbFormat,
uint32_t *pcbFormatRecv,
uint32_t *puAction)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
AssertReturn(cbFormat, VERR_INVALID_PARAMETER);
AssertPtrReturn(pcbFormatRecv, VERR_INVALID_POINTER);
@@ -674,7 +913,7 @@ static int vbglR3DnDGHProcessDroppedMessage(uint32_t uClientId,
DragAndDropSvc::VBOXDNDGHDROPPEDMSG Msg;
RT_ZERO(Msg);
- Msg.hdr.u32ClientID = uClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::HOST_DND_GH_EVT_DROPPED;
Msg.hdr.cParms = 3;
@@ -702,39 +941,71 @@ static int vbglR3DnDGHProcessDroppedMessage(uint32_t uClientId,
* Public functions *
******************************************************************************/
-VBGLR3DECL(int) VbglR3DnDConnect(uint32_t *pu32ClientId)
+VBGLR3DECL(int) VbglR3DnDConnect(PVBGLR3GUESTDNDCMDCTX pCtx)
{
- AssertPtrReturn(pu32ClientId, VERR_INVALID_POINTER);
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
/* Initialize header */
VBoxGuestHGCMConnectInfo Info;
RT_ZERO(Info.Loc.u);
Info.result = VERR_WRONG_ORDER;
Info.u32ClientID = UINT32_MAX; /* try make valgrind shut up. */
- /* Initialize parameter */
Info.Loc.type = VMMDevHGCMLoc_LocalHost_Existing;
+
int rc = RTStrCopy(Info.Loc.u.host.achName, sizeof(Info.Loc.u.host.achName), "VBoxDragAndDropSvc");
- if (RT_FAILURE(rc)) return rc;
- /* Do request */
+ if (RT_FAILURE(rc))
+ return rc;
+
rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CONNECT, &Info, sizeof(Info));
if (RT_SUCCESS(rc))
{
rc = Info.result;
- if (RT_SUCCESS(rc))
- *pu32ClientId = Info.u32ClientID;
+ if (rc == VERR_HGCM_SERVICE_NOT_FOUND)
+ rc = VINF_PERMISSION_DENIED;
+
+ /* Set the protocol version to use. */
+ pCtx->uProtocol = 2;
+
+ Assert(Info.u32ClientID);
+ pCtx->uClientID = Info.u32ClientID;
}
- if (rc == VERR_HGCM_SERVICE_NOT_FOUND)
- rc = VINF_PERMISSION_DENIED;
+
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Try sending the connect message to tell the protocol version to use.
+ * Note: This might fail when the Guest Additions run on an older VBox host (< VBox 5.0) which
+ * does not implement this command.
+ */
+ DragAndDropSvc::VBOXDNDCONNECTPMSG Msg;
+ RT_ZERO(Msg);
+ Msg.hdr.result = VERR_WRONG_ORDER;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
+ Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_CONNECT;
+ Msg.hdr.cParms = 2;
+
+ Msg.uProtocol.SetUInt32(pCtx->uProtocol);
+ Msg.uFlags.SetUInt32(0); /* Unused at the moment. */
+
+ int rc2 = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
+ if (RT_SUCCESS(rc2))
+ rc2 = Msg.hdr.result; /* Not fatal. */
+
+ LogFlowFunc(("Connection request ended with rc=%Rrc\n", rc2));
+ }
+
+ LogFlowFunc(("uClient=%RU32, uProtocol=%RU32, rc=%Rrc\n", pCtx->uClientID, pCtx->uProtocol, rc));
return rc;
}
-VBGLR3DECL(int) VbglR3DnDDisconnect(uint32_t u32ClientId)
+VBGLR3DECL(int) VbglR3DnDDisconnect(PVBGLR3GUESTDNDCMDCTX pCtx)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
VBoxGuestHGCMDisconnectInfo Info;
Info.result = VERR_WRONG_ORDER;
- Info.u32ClientID = u32ClientId;
+ Info.u32ClientID = pCtx->uClientID;
- /* Do request */
int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_DISCONNECT, &Info, sizeof(Info));
if (RT_SUCCESS(rc))
rc = Info.result;
@@ -742,31 +1013,33 @@ VBGLR3DECL(int) VbglR3DnDDisconnect(uint32_t u32ClientId)
return rc;
}
-VBGLR3DECL(int) VbglR3DnDProcessNextMessage(uint32_t u32ClientId, CPVBGLR3DNDHGCMEVENT pEvent)
+VBGLR3DECL(int) VbglR3DnDProcessNextMessage(PVBGLR3GUESTDNDCMDCTX pCtx, CPVBGLR3DNDHGCMEVENT pEvent)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pEvent, VERR_INVALID_POINTER);
uint32_t uMsg = 0;
uint32_t uNumParms = 0;
const uint32_t ccbFormats = _64K;
const uint32_t ccbData = _64K;
- int rc = vbglR3DnDQueryNextHostMessageType(u32ClientId, &uMsg, &uNumParms,
+ int rc = vbglR3DnDQueryNextHostMessageType(pCtx, &uMsg, &uNumParms,
true /* fWait */);
if (RT_SUCCESS(rc))
{
+ pEvent->uType = uMsg;
+
switch(uMsg)
{
case DragAndDropSvc::HOST_DND_HG_EVT_ENTER:
case DragAndDropSvc::HOST_DND_HG_EVT_MOVE:
case DragAndDropSvc::HOST_DND_HG_EVT_DROPPED:
{
- pEvent->uType = uMsg;
pEvent->pszFormats = static_cast<char*>(RTMemAlloc(ccbFormats));
if (!pEvent->pszFormats)
rc = VERR_NO_MEMORY;
if (RT_SUCCESS(rc))
- rc = vbglR3DnDHGProcessActionMessage(u32ClientId,
+ rc = vbglR3DnDHGProcessActionMessage(pCtx,
uMsg,
&pEvent->uScreenId,
&pEvent->u.a.uXpos,
@@ -780,13 +1053,11 @@ VBGLR3DECL(int) VbglR3DnDProcessNextMessage(uint32_t u32ClientId, CPVBGLR3DNDHGC
}
case DragAndDropSvc::HOST_DND_HG_EVT_LEAVE:
{
- pEvent->uType = uMsg;
- rc = vbglR3DnDHGProcessLeaveMessage(u32ClientId);
+ rc = vbglR3DnDHGProcessLeaveMessage(pCtx);
break;
}
case DragAndDropSvc::HOST_DND_HG_SND_DATA:
{
- pEvent->uType = uMsg;
pEvent->pszFormats = static_cast<char*>(RTMemAlloc(ccbFormats));
if (!pEvent->pszFormats)
rc = VERR_NO_MEMORY;
@@ -798,12 +1069,13 @@ VBGLR3DECL(int) VbglR3DnDProcessNextMessage(uint32_t u32ClientId, CPVBGLR3DNDHGC
{
RTMemFree(pEvent->pszFormats);
pEvent->pszFormats = NULL;
+
rc = VERR_NO_MEMORY;
}
}
if (RT_SUCCESS(rc))
- rc = vbglR3DnDHGProcessSendDataMessage(u32ClientId,
+ rc = vbglR3DnDHGProcessSendDataMessage(pCtx,
&pEvent->uScreenId,
pEvent->pszFormats,
ccbFormats,
@@ -815,39 +1087,35 @@ VBGLR3DECL(int) VbglR3DnDProcessNextMessage(uint32_t u32ClientId, CPVBGLR3DNDHGC
}
case DragAndDropSvc::HOST_DND_HG_SND_MORE_DATA:
case DragAndDropSvc::HOST_DND_HG_SND_DIR:
- case DragAndDropSvc::HOST_DND_HG_SND_FILE:
+ case DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA:
{
- pEvent->uType = uMsg;
-
- /* All messages in this case are handled internally
+ /*
+ * All messages in this case are handled internally
* by vbglR3DnDHGProcessSendDataMessage() and must
- * be specified by a preceding HOST_DND_HG_SND_DATA call. */
+ * be specified by a preceding HOST_DND_HG_SND_DATA call.
+ */
rc = VERR_WRONG_ORDER;
break;
}
case DragAndDropSvc::HOST_DND_HG_EVT_CANCEL:
{
- pEvent->uType = uMsg;
- rc = vbglR3DnDHGProcessCancelMessage(u32ClientId);
+ rc = vbglR3DnDHGProcessCancelMessage(pCtx);
break;
}
#ifdef VBOX_WITH_DRAG_AND_DROP_GH
case DragAndDropSvc::HOST_DND_GH_REQ_PENDING:
{
- pEvent->uType = uMsg;
- rc = vbglR3DnDGHProcessRequestPendingMessage(u32ClientId,
- &pEvent->uScreenId);
+ rc = vbglR3DnDGHProcessRequestPendingMessage(pCtx, &pEvent->uScreenId);
break;
}
case DragAndDropSvc::HOST_DND_GH_EVT_DROPPED:
{
- pEvent->uType = uMsg;
pEvent->pszFormats = static_cast<char*>(RTMemAlloc(ccbFormats));
if (!pEvent->pszFormats)
rc = VERR_NO_MEMORY;
if (RT_SUCCESS(rc))
- rc = vbglR3DnDGHProcessDroppedMessage(u32ClientId,
+ rc = vbglR3DnDGHProcessDroppedMessage(pCtx,
pEvent->pszFormats,
ccbFormats,
&pEvent->cbFormats,
@@ -857,8 +1125,6 @@ VBGLR3DECL(int) VbglR3DnDProcessNextMessage(uint32_t u32ClientId, CPVBGLR3DNDHGC
#endif
default:
{
- pEvent->uType = uMsg;
-
rc = VERR_NOT_SUPPORTED;
break;
}
@@ -868,12 +1134,14 @@ VBGLR3DECL(int) VbglR3DnDProcessNextMessage(uint32_t u32ClientId, CPVBGLR3DNDHGC
return rc;
}
-VBGLR3DECL(int) VbglR3DnDHGAcknowledgeOperation(uint32_t u32ClientId, uint32_t uAction)
+VBGLR3DECL(int) VbglR3DnDHGAcknowledgeOperation(PVBGLR3GUESTDNDCMDCTX pCtx, uint32_t uAction)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
DragAndDropSvc::VBOXDNDHGACKOPMSG Msg;
RT_ZERO(Msg);
Msg.hdr.result = VERR_WRONG_ORDER;
- Msg.hdr.u32ClientID = u32ClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_HG_ACK_OP;
Msg.hdr.cParms = 1;
@@ -886,14 +1154,15 @@ VBGLR3DECL(int) VbglR3DnDHGAcknowledgeOperation(uint32_t u32ClientId, uint32_t u
return rc;
}
-VBGLR3DECL(int) VbglR3DnDHGRequestData(uint32_t u32ClientId, const char* pcszFormat)
+VBGLR3DECL(int) VbglR3DnDHGRequestData(PVBGLR3GUESTDNDCMDCTX pCtx, const char* pcszFormat)
{
- AssertPtrReturn(pcszFormat, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(pcszFormat, VERR_INVALID_POINTER);
DragAndDropSvc::VBOXDNDHGREQDATAMSG Msg;
RT_ZERO(Msg);
Msg.hdr.result = VERR_WRONG_ORDER;
- Msg.hdr.u32ClientID = u32ClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_HG_REQ_DATA;
Msg.hdr.cParms = 1;
@@ -906,17 +1175,39 @@ VBGLR3DECL(int) VbglR3DnDHGRequestData(uint32_t u32ClientId, const char* pcszFor
return rc;
}
+VBGLR3DECL(int) VbglR3DnDHGSetProgress(PVBGLR3GUESTDNDCMDCTX pCtx, uint32_t uStatus, uint8_t uPercent, int rcErr)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ DragAndDropSvc::VBOXDNDHGEVTPROGRESSMSG Msg;
+ RT_ZERO(Msg);
+ Msg.hdr.result = VERR_WRONG_ORDER;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
+ Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_HG_EVT_PROGRESS;
+ Msg.hdr.cParms = 3;
+
+ Msg.uStatus.SetUInt32(uStatus);
+ Msg.uPercent.SetUInt32(uPercent);
+ Msg.rc.SetUInt32((uint32_t)rcErr); /* uint32_t vs. int. */
+
+ int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
+ if (RT_SUCCESS(rc))
+ rc = Msg.hdr.result;
+
+ return rc;
+}
+
#ifdef VBOX_WITH_DRAG_AND_DROP_GH
-VBGLR3DECL(int) VbglR3DnDGHAcknowledgePending(uint32_t u32ClientId,
- uint32_t uDefAction, uint32_t uAllActions,
- const char* pcszFormats)
+VBGLR3DECL(int) VbglR3DnDGHAcknowledgePending(PVBGLR3GUESTDNDCMDCTX pCtx,
+ uint32_t uDefAction, uint32_t uAllActions, const char* pcszFormats)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pcszFormats, VERR_INVALID_POINTER);
DragAndDropSvc::VBOXDNDGHACKPENDINGMSG Msg;
RT_ZERO(Msg);
Msg.hdr.result = VERR_WRONG_ORDER;
- Msg.hdr.u32ClientID = u32ClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_ACK_PENDING;
Msg.hdr.cParms = 3;
@@ -931,32 +1222,34 @@ VBGLR3DECL(int) VbglR3DnDGHAcknowledgePending(uint32_t u32ClientId,
return rc;
}
-static int vbglR3DnDGHSendDataInternal(uint32_t u32ClientId,
- void *pvData, uint32_t cbData,
- uint32_t cbAdditionalData)
+static int vbglR3DnDGHSendDataInternal(PVBGLR3GUESTDNDCMDCTX pCtx,
+ void *pvData, uint32_t cbData, uint32_t cbAdditionalData)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pvData, VERR_INVALID_POINTER);
- AssertReturn(cbData, VERR_INVALID_PARAMETER);
+ AssertReturn(cbData, VERR_INVALID_PARAMETER);
+ /* cbAdditionalData is optional. */
DragAndDropSvc::VBOXDNDGHSENDDATAMSG Msg;
RT_ZERO(Msg);
Msg.hdr.result = VERR_WRONG_ORDER;
- Msg.hdr.u32ClientID = u32ClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_SND_DATA;
Msg.hdr.cParms = 2;
/* Total amount of bytes to send (including this data block). */
Msg.cbTotalBytes.SetUInt32(cbData + cbAdditionalData);
- int rc;
+ int rc = VINF_SUCCESS;
+ uint32_t cbCurChunk;
uint32_t cbMaxChunk = _64K; /** @todo Transfer max. 64K chunks per message. Configurable? */
uint32_t cbSent = 0;
while (cbSent < cbData)
{
- uint32_t cbCurChunk = RT_MIN(cbData - cbSent, cbMaxChunk);
- Msg.pvData.SetPtr(static_cast<uint8_t*>(pvData) + cbSent, cbCurChunk);
+ cbCurChunk = RT_MIN(cbData - cbSent, cbMaxChunk);
+ Msg.pvData.SetPtr(static_cast<uint8_t *>(pvData) + cbSent, cbCurChunk);
rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
if (RT_SUCCESS(rc))
@@ -976,14 +1269,15 @@ static int vbglR3DnDGHSendDataInternal(uint32_t u32ClientId,
return rc;
}
-static int vbglR3DnDGHSendDir(uint32_t u32ClientId, DnDURIObject &obj)
+static int vbglR3DnDGHSendDir(PVBGLR3GUESTDNDCMDCTX pCtx, DnDURIObject &obj)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertReturn(obj.GetType() == DnDURIObject::Directory, VERR_INVALID_PARAMETER);
DragAndDropSvc::VBOXDNDGHSENDDIRMSG Msg;
RT_ZERO(Msg);
Msg.hdr.result = VERR_WRONG_ORDER;
- Msg.hdr.u32ClientID = u32ClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_SND_DIR;
Msg.hdr.cParms = 3;
@@ -1003,56 +1297,126 @@ static int vbglR3DnDGHSendDir(uint32_t u32ClientId, DnDURIObject &obj)
return rc;
}
-static int vbglR3DnDGHSendFile(uint32_t u32ClientId, DnDURIObject &obj)
+static int vbglR3DnDGHSendFile(PVBGLR3GUESTDNDCMDCTX pCtx, DnDURIObject &obj)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertReturn(obj.GetType() == DnDURIObject::File, VERR_INVALID_PARAMETER);
uint32_t cbBuf = _64K; /** @todo Make this configurable? */
- void *pvBuf = RTMemAlloc(cbBuf);
+ void *pvBuf = RTMemAlloc(cbBuf); /** @todo Make this buffer part of PVBGLR3GUESTDNDCMDCTX? */
if (!pvBuf)
return VERR_NO_MEMORY;
- DragAndDropSvc::VBOXDNDGHSENDFILEMSG Msg;
- RT_ZERO(Msg);
- Msg.hdr.result = VERR_WRONG_ORDER;
- Msg.hdr.u32ClientID = u32ClientId;
- Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_SND_FILE;
- Msg.hdr.cParms = 5;
-
RTCString strPath = obj.GetDestPath();
- LogFlowFunc(("strFile=%s (%zu), fMode=0x%x\n",
- strPath.c_str(), strPath.length(), obj.GetMode()));
- Msg.pvName.SetPtr((void *)strPath.c_str(), (uint32_t)(strPath.length() + 1));
- Msg.cbName.SetUInt32((uint32_t)(strPath.length() + 1));
- Msg.fMode.SetUInt32(obj.GetMode());
+ int rc = obj.Open(DnDURIObject::Source, RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE);
+ if (RT_FAILURE(rc))
+ {
+ LogFunc(("Opening file \"%s\" failed with rc=%Rrc\n", obj.GetSourcePath().c_str(), rc));
+ return rc;
+ }
- int rc = VINF_SUCCESS;
- uint32_t cbData = obj.GetSize();
+ LogFlowFunc(("strFile=%s (%zu), cbSize=%RU64, fMode=0x%x\n", strPath.c_str(), strPath.length(), obj.GetSize(), obj.GetMode()));
+ LogFlowFunc(("uProtocol=%RU32, uClientID=%RU32\n", pCtx->uProtocol, pCtx->uClientID));
- do
+ if (pCtx->uProtocol >= 2) /* Protocol version 2 and up sends a file header first. */
{
- uint32_t cbToRead = RT_MIN(cbData, cbBuf);
- uint32_t cbRead = 0;
- if (cbToRead)
- rc = obj.Read(pvBuf, cbToRead, &cbRead);
+ DragAndDropSvc::VBOXDNDGHSENDFILEHDRMSG MsgHdr;
+ RT_ZERO(MsgHdr);
+ MsgHdr.hdr.result = VERR_WRONG_ORDER;
+ MsgHdr.hdr.u32ClientID = pCtx->uClientID;
+ MsgHdr.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_SND_FILE_HDR;
+ MsgHdr.hdr.cParms = 6;
+
+ MsgHdr.uContext.SetUInt32(0); /* Context ID; unused at the moment. */
+ MsgHdr.pvName.SetPtr((void *)strPath.c_str(), (uint32_t)(strPath.length() + 1));
+ MsgHdr.cbName.SetUInt32((uint32_t)(strPath.length() + 1));
+ MsgHdr.uFlags.SetUInt32(0); /* Flags; unused at the moment. */
+ MsgHdr.fMode.SetUInt32(obj.GetMode());
+ MsgHdr.cbTotal.SetUInt64(obj.GetSize());
+
+ rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(MsgHdr)), &MsgHdr, sizeof(MsgHdr));
if (RT_SUCCESS(rc))
+ rc = MsgHdr.hdr.result;
+
+ LogFlowFunc(("Sending file header resulted in %Rrc\n", rc));
+ }
+ else
+ rc = VINF_SUCCESS;
+
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Send the actual file data, chunk by chunk.
+ */
+ DragAndDropSvc::VBOXDNDGHSENDFILEDATAMSG Msg;
+ RT_ZERO(Msg);
+ Msg.hdr.result = VERR_WRONG_ORDER;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
+ Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_SND_FILE_DATA;
+
+ if (pCtx->uProtocol <= 1)
{
- Msg.cbData.SetUInt32(cbRead);
- Msg.pvData.SetPtr(pvBuf, cbRead);
+ Msg.hdr.cParms = 5;
- rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
- if (RT_SUCCESS(rc))
- rc = Msg.hdr.result;
+ Msg.u.v1.pvName.SetPtr((void *)strPath.c_str(), (uint32_t)(strPath.length() + 1));
+ Msg.u.v1.cbName.SetUInt32((uint32_t)(strPath.length() + 1));
+ Msg.u.v1.fMode.SetUInt32(obj.GetMode());
}
+ else
+ {
+ /* Only send context ID, file chunk + chunk size. */
+ Msg.hdr.cParms = 3;
- if (RT_FAILURE(rc))
- break;
+ Msg.u.v2.uContext.SetUInt32(0); /** @todo Set context ID. */
+ }
+
+ uint64_t cbToReadTotal = obj.GetSize();
+ uint64_t cbWrittenTotal = 0;
+ while (cbToReadTotal)
+ {
+ uint32_t cbToRead = RT_MIN(cbToReadTotal, cbBuf);
+ uint32_t cbRead = 0;
+ if (cbToRead)
+ rc = obj.Read(pvBuf, cbToRead, &cbRead);
+
+ LogFlowFunc(("cbToReadTotal=%RU64, cbToRead=%RU32, cbRead=%RU32, rc=%Rrc\n",
+ cbToReadTotal, cbToRead, cbRead, rc));
+
+ if ( RT_SUCCESS(rc)
+ && cbRead)
+ {
+ if (pCtx->uProtocol <= 1)
+ {
+ Msg.u.v1.pvData.SetPtr(pvBuf, cbRead);
+ Msg.u.v1.cbData.SetUInt32(cbRead);
+ }
+ else
+ {
+ Msg.u.v2.pvData.SetPtr(pvBuf, cbRead);
+ Msg.u.v2.cbData.SetUInt32(cbRead);
+ }
+
+ rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
+ if (RT_SUCCESS(rc))
+ rc = Msg.hdr.result;
+ }
- Assert(cbRead <= cbData);
- cbData -= cbRead;
+ if (RT_FAILURE(rc))
+ {
+ LogFlowFunc(("Reading failed with rc=%Rrc\n", rc));
+ break;
+ }
- } while (cbData);
+ Assert(cbRead <= cbToReadTotal);
+ cbToReadTotal -= cbRead;
+ cbWrittenTotal += cbRead;
+
+ LogFlowFunc(("%RU64/%RU64 -- %RU8%%\n", cbWrittenTotal, obj.GetSize(), cbWrittenTotal * 100 / obj.GetSize()));
+ };
+ }
+
+ obj.Close();
RTMemFree(pvBuf);
@@ -1060,23 +1424,24 @@ static int vbglR3DnDGHSendFile(uint32_t u32ClientId, DnDURIObject &obj)
return rc;
}
-static int vbglR3DnDGHSendURIObject(uint32_t u32ClientId, DnDURIObject &obj)
+static int vbglR3DnDGHSendURIObject(PVBGLR3GUESTDNDCMDCTX pCtx, DnDURIObject &obj)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
int rc;
switch (obj.GetType())
{
case DnDURIObject::Directory:
- rc = vbglR3DnDGHSendDir(u32ClientId, obj);
+ rc = vbglR3DnDGHSendDir(pCtx, obj);
break;
case DnDURIObject::File:
- rc = vbglR3DnDGHSendFile(u32ClientId, obj);
+ rc = vbglR3DnDGHSendFile(pCtx, obj);
break;
default:
- AssertMsgFailed(("Type %ld not implemented\n",
- obj.GetType()));
+ AssertMsgFailed(("URI type %ld not implemented\n", obj.GetType()));
rc = VERR_NOT_IMPLEMENTED;
break;
}
@@ -1084,11 +1449,12 @@ static int vbglR3DnDGHSendURIObject(uint32_t u32ClientId, DnDURIObject &obj)
return rc;
}
-static int vbglR3DnDGHProcessURIMessages(uint32_t u32ClientId,
+static int vbglR3DnDGHProcessURIMessages(PVBGLR3GUESTDNDCMDCTX pCtx,
const void *pvData, uint32_t cbData)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pvData, VERR_INVALID_POINTER);
- AssertReturn(cbData, VERR_INVALID_PARAMETER);
+ AssertReturn(cbData, VERR_INVALID_PARAMETER);
RTCList<RTCString> lstPaths =
RTCString((const char *)pvData, cbData).split("\r\n");
@@ -1105,7 +1471,7 @@ static int vbglR3DnDGHProcessURIMessages(uint32_t u32ClientId,
void *pvToSend = (void *)strRootDest.c_str();
uint32_t cbToSend = (uint32_t)strRootDest.length() + 1;
- rc = vbglR3DnDGHSendDataInternal(u32ClientId, pvToSend, cbToSend,
+ rc = vbglR3DnDGHSendDataInternal(pCtx, pvToSend, cbToSend,
/* Include total bytes of all file paths,
* file sizes etc. */
lstURI.TotalBytes());
@@ -1117,7 +1483,7 @@ static int vbglR3DnDGHProcessURIMessages(uint32_t u32ClientId,
{
DnDURIObject &nextObj = lstURI.First();
- rc = vbglR3DnDGHSendURIObject(u32ClientId, nextObj);
+ rc = vbglR3DnDGHSendURIObject(pCtx, nextObj);
if (RT_FAILURE(rc))
break;
@@ -1128,41 +1494,47 @@ static int vbglR3DnDGHProcessURIMessages(uint32_t u32ClientId,
return rc;
}
-VBGLR3DECL(int) VbglR3DnDGHSendData(uint32_t u32ClientId,
- const char *pszFormat,
- void *pvData, uint32_t cbData)
+VBGLR3DECL(int) VbglR3DnDGHSendData(PVBGLR3GUESTDNDCMDCTX pCtx, const char *pszFormat, void *pvData, uint32_t cbData)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
- AssertPtrReturn(pvData, VERR_INVALID_POINTER);
- AssertReturn(cbData, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pvData, VERR_INVALID_POINTER);
+ AssertReturn(cbData, VERR_INVALID_PARAMETER);
+
+ LogFlowFunc(("pszFormat=%s, pvData=%p, cbData=%RU32\n", pszFormat, pvData, cbData));
int rc;
if (DnDMIMEHasFileURLs(pszFormat, strlen(pszFormat)))
{
- rc = vbglR3DnDGHProcessURIMessages(u32ClientId, pvData, cbData);
+ rc = vbglR3DnDGHProcessURIMessages(pCtx, pvData, cbData);
}
else
- rc = vbglR3DnDGHSendDataInternal(u32ClientId, pvData, cbData,
- 0 /* cbAdditionalData */);
+ {
+ rc = vbglR3DnDGHSendDataInternal(pCtx, pvData, cbData, 0 /* cbAdditionalData */);
+ }
+
if (RT_FAILURE(rc))
{
- int rc2 = VbglR3DnDGHSendError(u32ClientId, rc);
- AssertRC(rc2);
+ int rc2 = VbglR3DnDGHSendError(pCtx, rc);
+ if (RT_FAILURE(rc2))
+ LogFlowFunc(("Unable to send error (%Rrc) to host, rc=%Rrc\n", rc, rc2));
}
return rc;
}
-VBGLR3DECL(int) VbglR3DnDGHSendError(uint32_t u32ClientId, int rcErr)
+VBGLR3DECL(int) VbglR3DnDGHSendError(PVBGLR3GUESTDNDCMDCTX pCtx, int rcErr)
{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
DragAndDropSvc::VBOXDNDGHEVTERRORMSG Msg;
RT_ZERO(Msg);
Msg.hdr.result = VERR_WRONG_ORDER;
- Msg.hdr.u32ClientID = u32ClientId;
+ Msg.hdr.u32ClientID = pCtx->uClientID;
Msg.hdr.u32Function = DragAndDropSvc::GUEST_DND_GH_EVT_ERROR;
Msg.hdr.cParms = 1;
- Msg.uRC.SetUInt32((uint32_t)rcErr); /* uint32_t vs. int. */
+ Msg.rc.SetUInt32((uint32_t)rcErr); /* uint32_t vs. int. */
int rc = vbglR3DoIOCtl(VBOXGUEST_IOCTL_HGCM_CALL(sizeof(Msg)), &Msg, sizeof(Msg));
if (RT_SUCCESS(rc))
@@ -1172,3 +1544,4 @@ VBGLR3DECL(int) VbglR3DnDGHSendError(uint32_t u32ClientId, int rcErr)
return rc;
}
#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
+
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp b/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp
index beda4bb..ad629dd 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/VMMDev.cpp
@@ -1,3 +1,4 @@
+/* $Id: VMMDev.cpp $ */
/** @file
* VBoxGuestLibR0 - VMMDev device related functions.
*/
diff --git a/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp b/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp
index e8ecf07..4e93f6a 100644
--- a/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp
+++ b/src/VBox/Additions/common/VBoxGuestLib/VbglR0CanUsePhysPageList.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 83618 $ */
+/* $Id: VbglR0CanUsePhysPageList.cpp $ */
/** @file
* VBoxGuestLibR0 - Physical memory heap.
*/
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp
index 315eef8..2c00c3a 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControlProcess.cpp
@@ -1064,17 +1064,17 @@ static int gstcntlProcessResolveExecutable(const char *pszFileName,
* @return IPRT status code.
* @param pszArgv0 First argument (argv0), either original or modified version. Optional.
* @param papszArgs Original argv command line from the host, starting at argv[1].
+ * @param fFlags The process creation flags pass to us from the host.
* @param ppapszArgv Pointer to a pointer with the new argv command line.
* Needs to be freed with RTGetOptArgvFree.
*/
-static int gstcntlProcessAllocateArgv(const char *pszArgv0,
- const char * const *papszArgs,
- bool fExpandArgs, char ***ppapszArgv)
+static int gstcntlProcessAllocateArgv(const char *pszArgv0, const char * const *papszArgs, uint32_t fFlags,
+ char ***ppapszArgv)
{
AssertPtrReturn(ppapszArgv, VERR_INVALID_POINTER);
- VBoxServiceVerbose(3, "GstCntlProcessPrepareArgv: pszArgv0=%p, papszArgs=%p, fExpandArgs=%RTbool, ppapszArgv=%p\n",
- pszArgv0, papszArgs, fExpandArgs, ppapszArgv);
+ VBoxServiceVerbose(3, "GstCntlProcessPrepareArgv: pszArgv0=%p, papszArgs=%p, fFlags=%#x, ppapszArgv=%p\n",
+ pszArgv0, papszArgs, fFlags, ppapszArgv);
int rc = VINF_SUCCESS;
uint32_t cArgs;
@@ -1095,17 +1095,41 @@ static int gstcntlProcessAllocateArgv(const char *pszArgv0,
cbSize, cArgs);
#endif
- size_t i = 0; /* Keep the argument counter in scope for cleaning up on failure. */
- rc = RTStrDupEx(&papszNewArgv[0], pszArgv0);
+ /* HACK ALERT! Since we still don't allow the user to really specify the first
+ argument separately from the executable image, we have to fudge
+ a little in the unquoted argument case to deal with executables
+ containing spaces. */
+ /** @todo Fix the stupid host/guest protocol so the user can do this for us! */
+ if ( !(fFlags & EXECUTEPROCESSFLAG_UNQUOTED_ARGS)
+ || !strpbrk(pszArgv0, " \t\n\r")
+ || pszArgv0[0] == '"')
+ rc = RTStrDupEx(&papszNewArgv[0], pszArgv0);
+ else
+ {
+ size_t cchArgv0 = strlen(pszArgv0);
+ rc = RTStrAllocEx(&papszNewArgv[0], 1 + cchArgv0 + 1 + 1);
+ if (RT_SUCCESS(rc))
+ {
+ char *pszDst = papszNewArgv[0];
+ *pszDst++ = '"';
+ memcpy(pszDst, pszArgv0, cchArgv0);
+ pszDst += cchArgv0;
+ *pszDst++ = '"';
+ *pszDst = '\0';
+ }
+ }
if (RT_SUCCESS(rc))
{
- for (; i < cArgs; i++)
+ size_t i;
+ for (i = 0; i < cArgs; i++)
{
char *pszArg;
#if 0 /* Arguments expansion -- untested. */
- if (fExpandArgs)
+ if (fFlags & EXECUTEPROCESSFLAG_EXPAND_ARGUMENTS)
{
+/** @todo r=bird: If you want this, we need a generic implementation, preferably in RTEnv or somewhere like that. The marking
+ * up of the variables must be the same on all platforms. */
/* According to MSDN the limit on older Windows version is 32K, whereas
* Vista+ there are no limits anymore. We still stick to 4K. */
char szExpanded[_4K];
@@ -1135,16 +1159,14 @@ static int gstcntlProcessAllocateArgv(const char *pszArgv0,
papszNewArgv[cArgs + 1] = NULL;
*ppapszArgv = papszNewArgv;
+ return VINF_SUCCESS;
}
- }
- if (RT_FAILURE(rc))
- {
- for (i; i > 0; i--)
+ /* Failed, bail out. */
+ for (; i > 0; i--)
RTStrFree(papszNewArgv[i]);
- RTMemFree(papszNewArgv);
}
-
+ RTMemFree(papszNewArgv);
return rc;
}
@@ -1238,9 +1260,6 @@ static int gstcntlProcessCreateProcess(const char *pszExec, const char * const *
int rc = VINF_SUCCESS;
char szExecExp[RTPATH_MAX];
- /* Do we need to expand environment variables in arguments? */
- bool fExpandArgs = (fFlags & EXECUTEPROCESSFLAG_EXPAND_ARGUMENTS) ? true : false;
-
#ifdef RT_OS_WINDOWS
/*
* If sysprep should be executed do this in the context of VBoxService, which
@@ -1294,8 +1313,7 @@ static int gstcntlProcessCreateProcess(const char *pszExec, const char * const *
if (RT_SUCCESS(rc))
{
char **papszArgsExp;
- rc = gstcntlProcessAllocateArgv(szSysprepCmd /* argv0 */, papszArgs,
- fExpandArgs, &papszArgsExp);
+ rc = gstcntlProcessAllocateArgv(szSysprepCmd /* argv0 */, papszArgs, fFlags, &papszArgsExp);
if (RT_SUCCESS(rc))
{
/* As we don't specify credentials for the sysprep process, it will
@@ -1335,9 +1353,11 @@ static int gstcntlProcessCreateProcess(const char *pszExec, const char * const *
if (RT_SUCCESS(rc))
{
char **papszArgsExp;
+ /** @todo r-bird: pszExec != argv[0]! When are you going to get that?!? How many
+ * times does this need to be pointed out? HOST/GUEST INTERFACE IS MISDESIGNED! */
rc = gstcntlProcessAllocateArgv(pszExec /* Always use the unmodified executable name as argv0. */,
papszArgs /* Append the rest of the argument vector (if any). */,
- fExpandArgs, &papszArgsExp);
+ fFlags, &papszArgsExp);
if (RT_FAILURE(rc))
{
/* Don't print any arguments -- may contain passwords or other sensible data! */
@@ -1352,6 +1372,8 @@ static int gstcntlProcessCreateProcess(const char *pszExec, const char * const *
uProcFlags |= RTPROC_FLAGS_HIDDEN;
if (fFlags & EXECUTEPROCESSFLAG_NO_PROFILE)
uProcFlags |= RTPROC_FLAGS_NO_PROFILE;
+ if (fFlags & EXECUTEPROCESSFLAG_UNQUOTED_ARGS)
+ uProcFlags |= RTPROC_FLAGS_UNQUOTED_ARGS;
}
/* If no user name specified run with current credentials (e.g.
@@ -1470,13 +1492,16 @@ static int gstcntlProcessProcessWorker(PVBOXSERVICECTRLPROCESS pProcess)
char **papszArgs;
uint32_t uNumArgs = 0; /* Initialize in case of RTGetOptArgvFromString() is failing ... */
rc = RTGetOptArgvFromString(&papszArgs, (int*)&uNumArgs,
- (pProcess->StartupInfo.uNumArgs > 0) ? pProcess->StartupInfo.szArgs : "", NULL);
+ (pProcess->StartupInfo.uNumArgs > 0) ? pProcess->StartupInfo.szArgs : "",
+ RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, NULL);
/* Did we get the same result? */
Assert(pProcess->StartupInfo.uNumArgs == uNumArgs);
/*
* Prepare environment variables list.
*/
+/** @todo r=bird: you don't need to prepare this, do you? Why don't you replace
+ * the brilliant RTStrAPrintf call with RTEnvPutEx and drop the papszEnv related code? */
char **papszEnv = NULL;
uint32_t uNumEnvVars = 0; /* Initialize in case of failing ... */
if (RT_SUCCESS(rc))
@@ -1590,7 +1615,8 @@ static int gstcntlProcessProcessWorker(PVBOXSERVICECTRLPROCESS pProcess)
AssertPtr(pProcess->pSession);
bool fNeedsImpersonation = !(pProcess->pSession->uFlags & VBOXSERVICECTRLSESSION_FLAG_FORK);
- rc = gstcntlProcessCreateProcess(pProcess->StartupInfo.szCmd, papszArgs, hEnv, pProcess->StartupInfo.uFlags,
+ rc = gstcntlProcessCreateProcess(pProcess->StartupInfo.szCmd, papszArgs, hEnv,
+ pProcess->StartupInfo.uFlags,
phStdIn, phStdOut, phStdErr,
fNeedsImpersonation ? pProcess->StartupInfo.szUser : NULL,
fNeedsImpersonation ? pProcess->StartupInfo.szPassword : NULL,
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp
index 1b6ddd2..384c103 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControlSession.cpp
@@ -141,6 +141,9 @@ static int gstcntlSessionHandleDirRemove(PVBOXSERVICECTRLSESSION pSession,
{
uint32_t uFlagsRemRec = 0;
bool fRecursive = false;
+/** @todo r=bird: Unnecessary variable fRecursive. You can check for
+ * DIRREMOVE_FLAG_RECURSIVE directly in the flags when deciding which API to
+ * call. */
if (!(uFlags & ~DIRREMOVE_FLAG_VALID_MASK))
{
@@ -150,7 +153,11 @@ static int gstcntlSessionHandleDirRemove(PVBOXSERVICECTRLSESSION pSession,
* Play safe here. */
fRecursive = true;
}
-
+/** @todo r=bird: Understand how APIs you use work (read docs, check constant,
+ * check code). If you check the actual values of RTDIRRMREC_F_CONTENT_AND_DIR
+ * and RTDIRRMREC_F_CONTENT_ONLY, you'd notice that the first one is 0 and the
+ * second is 1. This code is a little confused about how it all works, though
+ * it ends up doing the right thing as if by accident almost. */
if (uFlags & DIRREMOVE_FLAG_CONTENT_AND_DIR)
{
/* Setting direct value is intentional. */
@@ -169,6 +176,8 @@ static int gstcntlSessionHandleDirRemove(PVBOXSERVICECTRLSESSION pSession,
VBoxServiceVerbose(4, "[Dir %s]: Removing with uFlags=0x%x, fRecursive=%RTbool\n",
szDir, uFlags, fRecursive);
+/** @todo r=bird: Convoluted code flow. It would be shorter and easier to
+ * read if you moved this code up and into the flags-are-valid if body. */
if (RT_SUCCESS(rc))
{
/** @todo Add own recursive function (or a new IPRT function w/ callback?) to
@@ -1770,9 +1779,11 @@ int GstCntlSessionProcessStartAllowed(const PVBOXSERVICECTRLSESSION pSession,
/**
- * Creates a guest session. This will spawn a new VBoxService.exe instance under
- * behalf of the given user which then will act as a session host. On successful
- * open, the session will be added to the given session thread list.
+ * Creates a guest session.
+ *
+ * This will spawn a new VBoxService.exe instance under behalf of the given user
+ * which then will act as a session host. On successful open, the session will
+ * be added to the given session thread list.
*
* @return IPRT status code.
* @param pList Which list to use to store the session thread in.
@@ -1823,7 +1834,7 @@ int GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
/* Is this an anonymous session? */
/* Anonymous sessions run with the same privileges as the main VBoxService executable. */
- bool fAnonymous = !RT_BOOL(strlen(pSessionThread->StartupInfo.szUser));
+ bool const fAnonymous = pSessionThread->StartupInfo.szUser[0] == '\0';
if (fAnonymous)
{
Assert(!strlen(pSessionThread->StartupInfo.szPassword));
@@ -1852,11 +1863,43 @@ int GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
rc = RTCritSectInit(&pSessionThread->CritSect);
AssertRC(rc);
- /* Fork child doing the actual session handling. */
+ /*
+ * Spawn a child process for doing the actual session handling.
+ */
char szExeName[RTPATH_MAX];
char *pszExeName = RTProcGetExecutablePath(szExeName, sizeof(szExeName));
if (pszExeName)
{
+/** @todo r=bird: A while back we had this variant in the guest props code:
+ * @code
+ * int rc = RTStrPrintf(....);
+ * if (RT_SUCCESS(rc))
+ * @endcode
+ *
+ * Here we've got a new variant:
+ * @code
+ * if (!RTStrPrintf(szBuf, sizeof(szBuf),...))
+ * return VERR_BUFFER_OVERFLOW;
+ * @endcode
+ * ... which is just as pointless.
+ *
+ * According to the doxygen docs in iprt/string.h, RTStrPrintf returns "The
+ * length of the returned string (in pszBuffer) excluding the terminator".
+ *
+ * Which admittedly makes it a real bitch to check for buffer overflows, but is
+ * a great help preventing memory corruption by careless use of the returned
+ * value if it was outside the buffer range (negative error codes or required
+ * buffer size). We should probably add a new string formatter which API which
+ * returns VERR_BUFFER_OVERFLOW on overflow and optionally a required buffer
+ * size that you can use here...
+ *
+ * However in most cases you don't need to because you make things way to
+ * complicated (see the log file name mangling for instance).
+ *
+ * Here, you just need to format two or three (#ifdef DEBUG) 32-bit numbers
+ * which are no brainers, while the szUser can be used as is. The trick is to
+ * pass the and option and the option value separately.
+ */
char szParmUserName[GUESTPROCESS_MAX_USER_LEN + 32];
if (!fAnonymous)
{
@@ -1882,7 +1925,7 @@ int GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
{
rc = VERR_BUFFER_OVERFLOW;
}
-#endif /* DEBUG */
+#endif
if (RT_SUCCESS(rc))
{
int iOptIdx = 0; /* Current index in argument vector. */
@@ -1894,7 +1937,7 @@ int GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
papszArgs[iOptIdx++] = szParmSessionProto;
#ifdef DEBUG
papszArgs[iOptIdx++] = szParmThreadId;
-#endif /* DEBUG */
+#endif
if (!fAnonymous)
papszArgs[iOptIdx++] = szParmUserName;
@@ -1933,7 +1976,7 @@ int GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
{
rc2 = VERR_NO_MEMORY;
}
-#else
+#else /* DEBUG */
/* Include the session thread ID in the log file name. */
if (RTStrAPrintf(&pszLogNewSuffix, "-%RU32-%RU32-%s",
pSessionStartupInfo->uSessionID,
@@ -1979,6 +2022,12 @@ int GstCntlSessionThreadCreate(PRTLISTANCHOR pList,
if ( RT_SUCCESS(rc)
&& g_Session.uFlags & VBOXSERVICECTRLSESSION_FLAG_DUMPSTDOUT)
{
+/** @todo r=bird: This amazing code can be replaced by
+ * @code
+ * papszArgs[iOptIdx++] = "--dump-stdout";
+ * @endcode
+ * which doesn't even need braces.
+ */
if (!RTStrPrintf(szParmDumpStdOut, sizeof(szParmDumpStdOut), "--dump-stdout"))
rc = VERR_BUFFER_OVERFLOW;
if (RT_SUCCESS(rc))
@@ -2226,8 +2275,9 @@ int GstCntlSessionThreadDestroy(PVBOXSERVICECTRLSESSIONTHREAD pThread, uint32_t
}
/**
- * Close all formerly opened guest session threads.
- * Note: Caller is responsible for locking!
+ * Close all open guest session threads.
+ *
+ * @note Caller is responsible for locking!
*
* @return IPRT status code.
* @param pList Which list to close the session threads for.
@@ -2243,13 +2293,13 @@ int GstCntlSessionThreadDestroyAll(PRTLISTANCHOR pList, uint32_t uFlags)
if (RT_FAILURE(rc))
VBoxServiceError("Cancelling pending waits failed; rc=%Rrc\n", rc);*/
- PVBOXSERVICECTRLSESSIONTHREAD pSessionThread
- = RTListGetFirst(pList, VBOXSERVICECTRLSESSIONTHREAD, Node);
+/** @todo r=bird: Why don't you use RTListForEachSafe here?? */
+ PVBOXSERVICECTRLSESSIONTHREAD pSessionThread = RTListGetFirst(pList, VBOXSERVICECTRLSESSIONTHREAD, Node);
while (pSessionThread)
{
PVBOXSERVICECTRLSESSIONTHREAD pSessionThreadNext =
RTListGetNext(pList, pSessionThread, VBOXSERVICECTRLSESSIONTHREAD, Node);
- bool fLast = RTListNodeIsLast(pList, &pSessionThread->Node);
+ bool fLast = RTListNodeIsLast(pList, &pSessionThread->Node); /** @todo r=bird: This isn't necessary, pSessionThreadNext will be NULL! */
int rc2 = GstCntlSessionThreadDestroy(pSessionThread, uFlags);
if (RT_FAILURE(rc2))
@@ -2269,6 +2319,9 @@ int GstCntlSessionThreadDestroyAll(PRTLISTANCHOR pList, uint32_t uFlags)
return rc;
}
+/** @todo r=bird: This isn't a fork in the tranditional unix sense, so please
+ * don't confuse any unix guys by using the term.
+ * GstCntlSessionChildMain would be a good name. */
RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
{
static const RTGETOPTDEF s_aOptions[] =
@@ -2300,19 +2353,18 @@ RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
g_Session.StartupInfo.uProtocol = UINT32_MAX;
g_Session.StartupInfo.uSessionID = UINT32_MAX;
- int rc = VINF_SUCCESS;
-
- while ( (ch = RTGetOpt(&GetState, &ValueUnion))
- && RT_SUCCESS(rc))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
case VBOXSERVICESESSIONOPT_LOG_FILE:
- if (!RTStrPrintf(g_szLogFile, sizeof(g_szLogFile), "%s", ValueUnion.psz))
- return RTMsgErrorExit(RTEXITCODE_FAILURE, "Unable to set logfile name to '%s'",
- ValueUnion.psz);
+ {
+ int rc = RTStrCopy(g_szLogFile, sizeof(g_szLogFile), ValueUnion.psz);
+ if (RT_FAILURE(rc))
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error copying log file name: %Rrc", rc);
break;
+ }
#ifdef DEBUG
case VBOXSERVICESESSIONOPT_DUMP_STDOUT:
uSessionFlags |= VBOXSERVICECTRLSESSION_FLAG_DUMPSTDOUT;
@@ -2323,7 +2375,7 @@ RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
break;
#endif
case VBOXSERVICESESSIONOPT_USERNAME:
- /** @todo Information not needed right now, skip. */
+ /* Information not needed right now, skip. */
break;
case VBOXSERVICESESSIONOPT_SESSION_ID:
@@ -2336,7 +2388,7 @@ RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
#ifdef DEBUG
case VBOXSERVICESESSIONOPT_THREAD_ID:
- /* Not handled. */
+ /* Not handled. Mainly for processs listing. */
break;
#endif
/** @todo Implement help? */
@@ -2347,17 +2399,15 @@ RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
case VINF_GETOPT_NOT_OPTION:
/* Ignore; might be "guestsession" main command. */
+ /** @todo r=bird: We DO NOT ignore stuff on the command line! */
break;
default:
return RTMsgErrorExit(RTEXITCODE_SYNTAX, "Unknown command '%s'", ValueUnion.psz);
- break; /* Never reached. */
}
}
- if (RT_FAILURE(rc))
- return RTMsgErrorExit(RTEXITCODE_FAILURE, "Initialization failed with rc=%Rrc", rc);
-
+ /* Check that we've got all the required options. */
if (g_Session.StartupInfo.uProtocol == UINT32_MAX)
return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No protocol version specified");
@@ -2365,14 +2415,14 @@ RTEXITCODE VBoxServiceControlSessionForkInit(int argc, char **argv)
return RTMsgErrorExit(RTEXITCODE_SYNTAX, "No session ID specified");
/* Init the session object. */
- rc = GstCntlSessionInit(&g_Session, uSessionFlags);
+ int rc = GstCntlSessionInit(&g_Session, uSessionFlags);
if (RT_FAILURE(rc))
return RTMsgErrorExit(RTEXITCODE_INIT, "Failed to initialize session object, rc=%Rrc\n", rc);
- rc = VBoxServiceLogCreate(strlen(g_szLogFile) ? g_szLogFile : NULL);
+ rc = VBoxServiceLogCreate(g_szLogFile[0] ? g_szLogFile : NULL);
if (RT_FAILURE(rc))
return RTMsgErrorExit(RTEXITCODE_INIT, "Failed to create log file \"%s\", rc=%Rrc\n",
- strlen(g_szLogFile) ? g_szLogFile : "<None>", rc);
+ g_szLogFile[0] ? g_szLogFile : "<None>", rc);
RTEXITCODE rcExit = gstcntlSessionForkWorker(&g_Session);
diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp
index 6dbb74b..b8506f5 100644
--- a/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp
+++ b/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp
@@ -1090,37 +1090,44 @@ static RTEXITCODE VBoxServiceToolboxRm(int argc, char **argv)
{
for (int i = argc - cNonOptions; i < argc; ++i)
{
- /* I'm sure this isn't the most effective way, but I hope it will
- * be readable and reliable code. */
- if (RTDirExists(argv[i]) && !RTSymlinkExists(argv[i]))
+ RTFSOBJINFO Info;
+ int rc2 = RTPathQueryInfoEx(argv[i], &Info, RTFSOBJATTRADD_NOTHING, RTPATH_F_ON_LINK);
+ if (RT_SUCCESS(rc))
{
- if (!(fFlags & VBOXSERVICETOOLBOXRMFLAG_RECURSIVE))
- toolboxRmReport("Cannot remove directory '%s' as the '-R' option was not specified.\n",
- argv[i], true, VERR_INVALID_PARAMETER,
- fOutputFlags, &rc);
+ if (RTFS_IS_SYMLINK(Info.Attr.fMode))
+ {
+ rc2 = RTSymlinkDelete(argv[i], 0 /*fFlags*/);
+ toolboxRmReport("", argv[i], RT_SUCCESS(rc2), rc2, fOutputFlags, NULL);
+ toolboxRmReport("The following error occurred while removing symlink '%s': %Rrc.\n",
+ argv[i], RT_FAILURE(rc2), rc2, fOutputFlags, &rc);
+ }
+ else if (RTFS_IS_DIRECTORY(Info.Attr.fMode))
+ {
+ if (!(fFlags & VBOXSERVICETOOLBOXRMFLAG_RECURSIVE))
+ toolboxRmReport("Cannot remove directory '%s' as the '-R' option was not specified.\n",
+ argv[i], true, VERR_INVALID_PARAMETER, fOutputFlags, &rc);
+ else
+ {
+ rc2 = RTDirRemoveRecursive(argv[i], RTDIRRMREC_F_CONTENT_AND_DIR);
+ toolboxRmReport("", argv[i], RT_SUCCESS(rc2), rc2, fOutputFlags, NULL);
+ toolboxRmReport("The following error occurred while removing directory '%s': %Rrc.\n",
+ argv[i], RT_FAILURE(rc2), rc2, fOutputFlags, &rc);
+ }
+ }
else
{
- int rc2 = RTDirRemoveRecursive(argv[i],
- RTDIRRMREC_F_CONTENT_AND_DIR);
- toolboxRmReport("", argv[i], RT_SUCCESS(rc2), rc2,
- fOutputFlags, NULL);
- toolboxRmReport("The following error occurred while removing directory '%s': %Rrc.\n",
- argv[i], RT_FAILURE(rc2), rc2,
- fOutputFlags, &rc);
+ rc2 = RTFileDelete(argv[i]);
+ toolboxRmReport("", argv[i], RT_SUCCESS(rc2), rc2, fOutputFlags, NULL);
+ toolboxRmReport("The following error occurred while removing file '%s': %Rrc.\n",
+ argv[i], RT_FAILURE(rc2), rc2, fOutputFlags, &rc);
}
}
- else if (RTPathExists(argv[i]) || RTSymlinkExists(argv[i]))
- {
- int rc2 = RTFileDelete(argv[i]);
- toolboxRmReport("", argv[i], RT_SUCCESS(rc2), rc2,
- fOutputFlags, NULL);
- toolboxRmReport("The following error occurred while removing file '%s': %Rrc.\n",
- argv[i], RT_FAILURE(rc2), rc2, fOutputFlags,
- &rc);
- }
+ else if ( rc2 == VERR_FILE_NOT_FOUND
+ || rc2 == VERR_PATH_NOT_FOUND)
+ toolboxRmReport("File '%s' does not exist (%Rrc).\n", argv[i], true, rc2, fOutputFlags, &rc);
else
- toolboxRmReport("File '%s' does not exist.\n", argv[i],
- true, VERR_FILE_NOT_FOUND, fOutputFlags, &rc);
+ toolboxRmReport("The following error occurred while checkin '%s' before removal: %Rrc.\n",
+ argv[i], true, rc2, fOutputFlags, &rc);
}
if (fOutputFlags & VBOXSERVICETOOLBOXOUTPUTFLAG_PARSEABLE) /* Output termination. */
@@ -1519,6 +1526,7 @@ static RTEXITCODE VBoxServiceToolboxStat(int argc, char **argv)
int rc = VINF_SUCCESS;
bool fVerbose = false;
uint32_t fOutputFlags = VBOXSERVICETOOLBOXOUTPUTFLAG_LONG; /* Use long mode by default. */
+ uint32_t fQueryInfoFlags = RTPATH_F_ON_LINK;
/* Init file list. */
RTLISTANCHOR fileList;
@@ -1531,11 +1539,15 @@ static RTEXITCODE VBoxServiceToolboxStat(int argc, char **argv)
switch (ch)
{
case 'f':
- case 'L':
RTMsgError("Sorry, option '%s' is not implemented yet!\n", ValueUnion.pDef->pszLong);
rc = VERR_INVALID_PARAMETER;
break;
+ case 'L':
+ fQueryInfoFlags &= ~RTPATH_F_ON_LINK;
+ fQueryInfoFlags |= RTPATH_F_FOLLOW_LINK;
+ break;
+
case VBOXSERVICETOOLBOXOPT_MACHINE_READABLE:
fOutputFlags |= VBOXSERVICETOOLBOXOUTPUTFLAG_PARSEABLE;
break;
@@ -1555,6 +1567,11 @@ static RTEXITCODE VBoxServiceToolboxStat(int argc, char **argv)
case VINF_GETOPT_NOT_OPTION:
{
+/** @todo r=bird: The whole fileList is unecessary because you're using
+ * RTGETOPTINIT_FLAGS_OPTS_FIRST. You can obviously do the processing right
+ * here, but you could also just drop down and rewind GetState.iNext by one and
+ * continue there. */
+
/* Add file(s) to buffer. This enables processing multiple files
* at once.
*
@@ -1584,13 +1601,13 @@ static RTEXITCODE VBoxServiceToolboxStat(int argc, char **argv)
RTListForEach(&fileList, pNodeIt, VBOXSERVICETOOLBOXPATHENTRY, Node)
{
RTFSOBJINFO objInfo;
- int rc2 = RTPathQueryInfoEx(pNodeIt->pszName, &objInfo,
- RTFSOBJATTRADD_UNIX, RTPATH_F_ON_LINK /* @todo Follow link? */);
+ int rc2 = RTPathQueryInfoEx(pNodeIt->pszName, &objInfo, RTFSOBJATTRADD_UNIX, fQueryInfoFlags);
if (RT_FAILURE(rc2))
{
+/** @todo r=bird: You can get a number of other errors here, like access denied. */
if (!(fOutputFlags & VBOXSERVICETOOLBOXOUTPUTFLAG_PARSEABLE))
- RTMsgError("Cannot stat for '%s': No such file or directory\n",
- pNodeIt->pszName);
+ RTMsgError("Cannot stat for '%s': No such file or directory (%Rrc)\n",
+ pNodeIt->pszName, rc);
rc = VERR_FILE_NOT_FOUND;
/* Do not break here -- process every element in the list
* and keep failing rc. */
diff --git a/src/VBox/Additions/common/VBoxVideo/HGSMIBase.cpp b/src/VBox/Additions/common/VBoxVideo/HGSMIBase.cpp
index 1dbf49f..c44e0da 100644
--- a/src/VBox/Additions/common/VBoxVideo/HGSMIBase.cpp
+++ b/src/VBox/Additions/common/VBoxVideo/HGSMIBase.cpp
@@ -340,10 +340,10 @@ RTDECL(int) VBoxHGSMISetupGuestContext(PHGSMIGUESTCOMMANDCONTEXT pCtx,
/** @todo should we be using a fixed ISA port value here? */
pCtx->port = (RTIOPORT)VGA_PORT_HGSMI_GUEST;
#ifdef VBOX_WDDM_MINIPORT
- return VBoxSHGSMIInit(&pCtx->heapCtx, HGSMI_HEAP_TYPE_MA, pvGuestHeapMemory,
+ return VBoxSHGSMIInit(&pCtx->heapCtx, pvGuestHeapMemory,
cbGuestHeapMemory, offVRAMGuestHeapMemory, pEnv);
#else
- return HGSMIHeapSetup(&pCtx->heapCtx, HGSMI_HEAP_TYPE_MA, pvGuestHeapMemory,
+ return HGSMIHeapSetup(&pCtx->heapCtx, pvGuestHeapMemory,
cbGuestHeapMemory, offVRAMGuestHeapMemory, pEnv);
#endif
}
diff --git a/src/VBox/Additions/common/crOpenGL/DD_glc.py b/src/VBox/Additions/common/crOpenGL/DD_glc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/DD_glh.py b/src/VBox/Additions/common/crOpenGL/DD_glh.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/NULLfuncs.py b/src/VBox/Additions/common/crOpenGL/NULLfuncs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/context.c b/src/VBox/Additions/common/crOpenGL/context.c
index fc8962c..ef46107 100644
--- a/src/VBox/Additions/common/crOpenGL/context.c
+++ b/src/VBox/Additions/common/crOpenGL/context.c
@@ -476,8 +476,7 @@ static DECLCALLBACK(void) stubContextDtor(void*pvContext)
* CreateContext() function too.
*/
ContextInfo *
-stubNewContext( const char *dpyName, GLint visBits, ContextType type,
- unsigned long shareCtx
+stubNewContext(char *dpyName, GLint visBits, ContextType type, unsigned long shareCtx
#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
, struct VBOXUHGSMI *pHgsmi
#endif
@@ -691,7 +690,7 @@ InstantiateNativeContext( WindowInfo *window, ContextInfo *context )
#ifdef WINDOWS
void
-stubGetWindowGeometry(const WindowInfo *window, int *x, int *y,
+stubGetWindowGeometry(WindowInfo *window, int *x, int *y,
unsigned int *w, unsigned int *h )
{
RECT rect;
@@ -1130,7 +1129,7 @@ GLboolean stubCtxCreate(ContextInfo *context)
spuConnection = stub.spu->dispatch_table.VBoxConCreate(context->pHgsmi);
if (!spuConnection)
{
- crWarning("VBoxConCreate failed");
+ crError("VBoxConCreate failed");
return GL_FALSE;
}
context->spuConnection = spuConnection;
@@ -1392,10 +1391,10 @@ stubDestroyContext( unsigned long contextId )
crHashtableLock(stub.contextTable);
context = (ContextInfo *) crHashtableSearch(stub.contextTable, contextId);
-
- CRASSERT(context);
-
- stubDestroyContextLocked(context);
+ if (context)
+ stubDestroyContextLocked(context);
+ else
+ crError("No context.");
#ifdef CHROMIUM_THREADSAFE
if (stubGetCurrentContext() == context) {
diff --git a/src/VBox/Additions/common/crOpenGL/cr_gl.py b/src/VBox/Additions/common/crOpenGL/cr_gl.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/entrypoints.py b/src/VBox/Additions/common/crOpenGL/entrypoints.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/feedback/feedback.py b/src/VBox/Additions/common/crOpenGL/feedback/feedback.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/feedback/feedback_funcs.py b/src/VBox/Additions/common/crOpenGL/feedback/feedback_funcs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/feedback/feedback_state.py b/src/VBox/Additions/common/crOpenGL/feedback/feedback_state.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/feedback/feedbackspu_proto.py b/src/VBox/Additions/common/crOpenGL/feedback/feedbackspu_proto.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/getprocaddress.py b/src/VBox/Additions/common/crOpenGL/getprocaddress.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/icd_drv.c b/src/VBox/Additions/common/crOpenGL/icd_drv.c
index d1a23f9..0696c56 100644
--- a/src/VBox/Additions/common/crOpenGL/icd_drv.c
+++ b/src/VBox/Additions/common/crOpenGL/icd_drv.c
@@ -109,27 +109,33 @@ BOOL APIENTRY DrvValidateVersion(DWORD version)
//we're not going to change icdTable at runtime, so callback is unused
PICDTABLE APIENTRY DrvSetContext(HDC hdc, HGLRC hglrc, void *callback)
{
- ContextInfo *context;
- WindowInfo *window;
- BOOL ret;
+ ContextInfo *pContext;
+ WindowInfo *pWindowInfo;
+ BOOL ret = false;
CR_DDI_PROLOGUE();
- /*crDebug( "DrvSetContext called(0x%x, 0x%x)", hdc, hglrc );*/
(void) (callback);
crHashtableLock(stub.windowTable);
crHashtableLock(stub.contextTable);
- context = (ContextInfo *) crHashtableSearch(stub.contextTable, (unsigned long) hglrc);
- window = stubGetWindowInfo(hdc);
-
- ret = stubMakeCurrent(window, context);
+ pContext = (ContextInfo *) crHashtableSearch(stub.contextTable, (unsigned long) hglrc);
+ if (pContext)
+ {
+ pWindowInfo = stubGetWindowInfo(hdc);
+ if (pWindowInfo)
+ ret = stubMakeCurrent(pWindowInfo, pContext);
+ else
+ crError("no window info available.");
+ }
+ else
+ crError("No context found.");
crHashtableUnlock(stub.contextTable);
crHashtableUnlock(stub.windowTable);
- return ret ? &icdTable:NULL;
+ return ret ? &icdTable : NULL;
}
BOOL APIENTRY DrvSetPixelFormat(HDC hdc, int iPixelFormat)
diff --git a/src/VBox/Additions/common/crOpenGL/pack/pack.py b/src/VBox/Additions/common/crOpenGL/pack/pack.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_beginend.py b/src/VBox/Additions/common/crOpenGL/pack/packspu_beginend.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c b/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c
index fe95ddf..9c4926d 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_context.c
@@ -453,29 +453,34 @@ void PACKSPU_APIENTRY packspu_DestroyContext( GLint ctx )
CRASSERT(slot >= 0);
CRASSERT(slot < pack_spu.numContexts);
- context = &(pack_spu.context[slot]);
+ context = (slot >= 0 && slot < pack_spu.numContexts) ? &(pack_spu.context[slot]) : NULL;
+ curContext = curThread ? curThread->currentContext : NULL;
- if (CRPACKSPU_IS_WDDM_CRHGSMI())
+ if (context)
{
- thread = context->currentThread;
- crPackSetContext(thread->packer);
- CRASSERT(!(thread->packer == curPacker) == !(thread == curThread));
- }
- CRASSERT(thread);
- curContext = curThread ? curThread->currentContext : NULL;
+ if (CRPACKSPU_IS_WDDM_CRHGSMI())
+ {
+ thread = context->currentThread;
+ if (thread)
+ {
+ crPackSetContext(thread->packer);
+ CRASSERT(!(thread->packer == curPacker) == !(thread == curThread));
+ }
+ }
- if (pack_spu.swap)
- crPackDestroyContextSWAP( context->serverCtx );
- else
- crPackDestroyContext( context->serverCtx );
+ if (pack_spu.swap)
+ crPackDestroyContextSWAP( context->serverCtx );
+ else
+ crPackDestroyContext( context->serverCtx );
- crStateDestroyContext( context->clientState );
+ crStateDestroyContext( context->clientState );
- context->clientState = NULL;
- context->serverCtx = 0;
- context->currentThread = NULL;
+ context->clientState = NULL;
+ context->serverCtx = 0;
+ context->currentThread = NULL;
- crMemset (&context->zvaBufferInfo, 0, sizeof (context->zvaBufferInfo));
+ crMemset (&context->zvaBufferInfo, 0, sizeof (context->zvaBufferInfo));
+ }
if (curContext == context)
{
@@ -502,9 +507,9 @@ void PACKSPU_APIENTRY packspu_DestroyContext( GLint ctx )
void PACKSPU_APIENTRY packspu_MakeCurrent( GLint window, GLint nativeWindow, GLint ctx )
{
- ThreadInfo *thread;
+ ThreadInfo *thread = NULL;
GLint serverCtx;
- ContextInfo *newCtx;
+ ContextInfo *newCtx = NULL;
if (!CRPACKSPU_IS_WDDM_CRHGSMI())
{
@@ -527,6 +532,7 @@ void PACKSPU_APIENTRY packspu_MakeCurrent( GLint window, GLint nativeWindow, GLi
CRASSERT(slot < pack_spu.numContexts);
newCtx = &pack_spu.context[slot];
+ CRASSERT(newCtx);
CRASSERT(newCtx->clientState); /* verify valid */
if (CRPACKSPU_IS_WDDM_CRHGSMI())
@@ -538,6 +544,7 @@ void PACKSPU_APIENTRY packspu_MakeCurrent( GLint window, GLint nativeWindow, GLi
}
else
{
+ CRASSERT(thread);
if (newCtx->fAutoFlush)
{
if (newCtx->currentThread && newCtx->currentThread != thread)
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_flush.py b/src/VBox/Additions/common/crOpenGL/pack/packspu_flush.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py b/src/VBox/Additions/common/crOpenGL/pack/packspu_get.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c b/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c
index 51c0f91..158157a 100644
--- a/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_init.c
@@ -42,6 +42,11 @@ packSPUInit( int id, SPU *child, SPU *self,
crInitMutex(&_PackMutex);
#endif
+#ifdef CHROMIUM_THREADSAFE
+ crInitTSD(&_PackerTSD);
+ crInitTSD(&_PackTSD);
+#endif
+
pack_spu.id = id;
packspuSetVBoxConfiguration( child );
@@ -98,15 +103,14 @@ packSPUCleanup(void)
}
}
+#ifdef CHROMIUM_THREADSAFE
crFreeTSD(&_PackerTSD);
crFreeTSD(&_PackTSD);
-
-#ifdef CHROMIUM_THREADSAFE
crUnlockMutex(&_PackMutex);
# ifndef WINDOWS
crFreeMutex(&_PackMutex);
# endif
-#endif
+#endif /* CHROMIUM_THREADSAFE */
return 1;
}
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_proto.py b/src/VBox/Additions/common/crOpenGL/pack/packspu_proto.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/passthrough/passthrough.py b/src/VBox/Additions/common/crOpenGL/passthrough/passthrough.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/stub.c b/src/VBox/Additions/common/crOpenGL/stub.c
index 5f0f374..9c2707b 100644
--- a/src/VBox/Additions/common/crOpenGL/stub.c
+++ b/src/VBox/Additions/common/crOpenGL/stub.c
@@ -42,7 +42,7 @@ Display* stubGetWindowDisplay(WindowInfo *pWindow)
/**
* Returns -1 on error
*/
-GLint APIENTRY crCreateContext( const char *dpyName, GLint visBits )
+GLint APIENTRY crCreateContext(char *dpyName, GLint visBits)
{
ContextInfo *context;
stubInit();
diff --git a/src/VBox/Additions/common/crOpenGL/stub.h b/src/VBox/Additions/common/crOpenGL/stub.h
index 56c0b35..f26061d 100644
--- a/src/VBox/Additions/common/crOpenGL/stub.h
+++ b/src/VBox/Additions/common/crOpenGL/stub.h
@@ -336,7 +336,7 @@ extern void stubCheckXExtensions(WindowInfo *pWindow);
#endif
-extern ContextInfo *stubNewContext( const char *dpyName, GLint visBits, ContextType type, unsigned long shareCtx
+extern ContextInfo *stubNewContext(char *dpyName, GLint visBits, ContextType type, unsigned long shareCtx
#if defined(VBOX_WITH_CRHGSMI) && defined(IN_GUEST)
, struct VBOXUHGSMI *pHgsmi
#endif
diff --git a/src/VBox/Additions/common/crOpenGL/stub_common.py b/src/VBox/Additions/common/crOpenGL/stub_common.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/tsfuncs.py b/src/VBox/Additions/common/crOpenGL/tsfuncs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/common/crOpenGL/wgl.c b/src/VBox/Additions/common/crOpenGL/wgl.c
index 83fcf5b..a015ced 100644
--- a/src/VBox/Additions/common/crOpenGL/wgl.c
+++ b/src/VBox/Additions/common/crOpenGL/wgl.c
@@ -7,6 +7,7 @@
#include "cr_error.h"
#include "cr_spu.h"
#include "cr_environment.h"
+#include "cr_mem.h"
#include "stub.h"
/* I *know* most of the parameters are unused, dammit. */
@@ -353,7 +354,7 @@ DECLEXPORT(BOOL) WINAPI wglShareLists_prox( HGLRC hglrc1, HGLRC hglrc2 )
DECLEXPORT(HGLRC) WINAPI VBoxCreateContext( HDC hdc, struct VBOXUHGSMI *pHgsmi )
{
- char dpyName[MAX_DPY_NAME];
+ char *dpyName;
ContextInfo *context;
CR_DDI_PROLOGUE();
@@ -362,7 +363,12 @@ DECLEXPORT(HGLRC) WINAPI VBoxCreateContext( HDC hdc, struct VBOXUHGSMI *pHgsmi )
CRASSERT(stub.contextTable);
- sprintf(dpyName, "%d", hdc);
+ dpyName = crCalloc(MAX_DPY_NAME);
+ if (dpyName)
+ {
+ crMemset(dpyName, 0, MAX_DPY_NAME);
+ sprintf(dpyName, "%d", hdc);
+ }
#ifndef VBOX_CROGL_USE_VBITS_SUPERSET
if (stub.haveNativeOpenGL)
desiredVisual |= ComputeVisBits( hdc );
@@ -375,6 +381,9 @@ DECLEXPORT(HGLRC) WINAPI VBoxCreateContext( HDC hdc, struct VBOXUHGSMI *pHgsmi )
, NULL
#endif
);
+ /* Not needed any more. */
+ crFree(dpyName);
+
if (!context)
return 0;
diff --git a/src/VBox/Additions/common/crOpenGL/windows_getprocaddress.py b/src/VBox/Additions/common/crOpenGL/windows_getprocaddress.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Additions/freebsd/Makefile.kmk b/src/VBox/Additions/freebsd/Makefile.kmk
index 13de93d..76fb49e 100644
--- a/src/VBox/Additions/freebsd/Makefile.kmk
+++ b/src/VBox/Additions/freebsd/Makefile.kmk
@@ -182,7 +182,7 @@ $(PATH_STAGE_BIN)/additions/VBoxFreeBSDAdditions.tbz: \
$(wildcard $(PATH_STAGE_BIN)/additions/src/*/*) \
$(wildcard $(PATH_STAGE_BIN)/additions/src/*/*/*) \
$(wildcard $(PATH_STAGE_BIN)/additions/src/*/*/*/*) \
- $(VBOX_VERSION_STAMP)
+ $(VBOX_VERSION_STAMP) $(VBOX_SVN_REV_HEADER)
pkg_create \
-I $(VBOX_PATH_FREEBSD_ADDITION_INSTALLER)/install.sh \
-c $(VBOX_PATH_FREEBSD_ADDITION_INSTALLER)/pkg-comment \
diff --git a/src/VBox/Additions/linux/Makefile.kmk b/src/VBox/Additions/linux/Makefile.kmk
index 5839e7e..ab642cf 100644
--- a/src/VBox/Additions/linux/Makefile.kmk
+++ b/src/VBox/Additions/linux/Makefile.kmk
@@ -293,7 +293,7 @@ $(addprefix $(VBOX_LNX_ADD_INST_KMOD_DIR),$(VBOX_LNX_ADD_KMOD_DIRS)): \
$(wildcard $(PATH_STAGE_BIN)/additions/src/%*/*/*) \
$(wildcard $(PATH_STAGE_BIN)/additions/src/%*/*/*/*) \
$(wildcard $(PATH_STAGE_BIN)/additions/src/%*/*/*/*/*) \
- $(VBOX_VERSION_STAMP) \
+ $(VBOX_VERSION_STAMP) $(VBOX_SVN_REV_HEADER) \
| $$(dir $$(patsubst $$(PERCENT)/,$$(PERCENT),$$@))
$(call MSG_INST_DIR,$<,$@)
$(QUIET)$(RM) -Rf $(filter-out $(VBOX_LNX_ADD_INST_KMOD_DIR_MOD),$(wildcard $(VBOX_LNX_ADD_INST_KMOD_DIR)*/))
diff --git a/src/VBox/Additions/x11/VBoxClient/VBoxClient.h b/src/VBox/Additions/x11/VBoxClient/VBoxClient.h
index 2ca8f1d..646d698 100644
--- a/src/VBox/Additions/x11/VBoxClient/VBoxClient.h
+++ b/src/VBox/Additions/x11/VBoxClient/VBoxClient.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxClient.h $ */
/** @file
*
* VirtualBox additions user session daemon.
diff --git a/src/VBox/Additions/x11/VBoxClient/draganddrop.cpp b/src/VBox/Additions/x11/VBoxClient/draganddrop.cpp
index 5150f38..7cfe2b9 100644
--- a/src/VBox/Additions/x11/VBoxClient/draganddrop.cpp
+++ b/src/VBox/Additions/x11/VBoxClient/draganddrop.cpp
@@ -1,9 +1,10 @@
+/* $Id: draganddrop.cpp $ */
/** @file
* X11 guest client - Drag and Drop.
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -191,7 +192,7 @@ public:
return format;
}
- RTCString xErrorToString(int xrc) const;
+ RTCString xErrorToString(int xRc) const;
Window applicationWindowBelowCursor(Window parentWin) const;
private:
@@ -259,30 +260,30 @@ const char *xHelpers::m_xAtomNames[] =
"dndstop"
};
-RTCString xHelpers::xErrorToString(int xrc) const
+RTCString xHelpers::xErrorToString(int xRc) const
{
- switch (xrc)
+ switch (xRc)
{
- case Success: return RTCStringFmt("%d (Success)", xrc); break;
- case BadRequest: return RTCStringFmt("%d (BadRequest)", xrc); break;
- case BadValue: return RTCStringFmt("%d (BadValue)", xrc); break;
- case BadWindow: return RTCStringFmt("%d (BadWindow)", xrc); break;
- case BadPixmap: return RTCStringFmt("%d (BadPixmap)", xrc); break;
- case BadAtom: return RTCStringFmt("%d (BadAtom)", xrc); break;
- case BadCursor: return RTCStringFmt("%d (BadCursor)", xrc); break;
- case BadFont: return RTCStringFmt("%d (BadFont)", xrc); break;
- case BadMatch: return RTCStringFmt("%d (BadMatch)", xrc); break;
- case BadDrawable: return RTCStringFmt("%d (BadDrawable)", xrc); break;
- case BadAccess: return RTCStringFmt("%d (BadAccess)", xrc); break;
- case BadAlloc: return RTCStringFmt("%d (BadAlloc)", xrc); break;
- case BadColor: return RTCStringFmt("%d (BadColor)", xrc); break;
- case BadGC: return RTCStringFmt("%d (BadGC)", xrc); break;
- case BadIDChoice: return RTCStringFmt("%d (BadIDChoice)", xrc); break;
- case BadName: return RTCStringFmt("%d (BadName)", xrc); break;
- case BadLength: return RTCStringFmt("%d (BadLength)", xrc); break;
- case BadImplementation: return RTCStringFmt("%d (BadImplementation)", xrc); break;
+ case Success: return RTCStringFmt("%d (Success)", xRc); break;
+ case BadRequest: return RTCStringFmt("%d (BadRequest)", xRc); break;
+ case BadValue: return RTCStringFmt("%d (BadValue)", xRc); break;
+ case BadWindow: return RTCStringFmt("%d (BadWindow)", xRc); break;
+ case BadPixmap: return RTCStringFmt("%d (BadPixmap)", xRc); break;
+ case BadAtom: return RTCStringFmt("%d (BadAtom)", xRc); break;
+ case BadCursor: return RTCStringFmt("%d (BadCursor)", xRc); break;
+ case BadFont: return RTCStringFmt("%d (BadFont)", xRc); break;
+ case BadMatch: return RTCStringFmt("%d (BadMatch)", xRc); break;
+ case BadDrawable: return RTCStringFmt("%d (BadDrawable)", xRc); break;
+ case BadAccess: return RTCStringFmt("%d (BadAccess)", xRc); break;
+ case BadAlloc: return RTCStringFmt("%d (BadAlloc)", xRc); break;
+ case BadColor: return RTCStringFmt("%d (BadColor)", xRc); break;
+ case BadGC: return RTCStringFmt("%d (BadGC)", xRc); break;
+ case BadIDChoice: return RTCStringFmt("%d (BadIDChoice)", xRc); break;
+ case BadName: return RTCStringFmt("%d (BadName)", xRc); break;
+ case BadLength: return RTCStringFmt("%d (BadLength)", xRc); break;
+ case BadImplementation: return RTCStringFmt("%d (BadImplementation)", xRc); break;
}
- return RTCStringFmt("%d (unknown)", xrc);
+ return RTCStringFmt("%d (unknown)", xRc);
}
/* Todo: make this iterative */
@@ -333,8 +334,14 @@ Window xHelpers::applicationWindowBelowCursor(Window wndParent) const
*
******************************************************************************/
+#ifdef DEBUG
+# define VBOX_DND_FN_DECL_LOG(x) inline x
+#else
+# define VBOX_DND_FN_DECL_LOG(x) x
+#endif
+
/* For now only one DragInstance will exits when the app is running. In the
- * future the support for having more than one D&D operation supported at the
+ * future the support for having more than one drag and drop operation supported at the
* time will be necessary. */
class DragInstance
{
@@ -363,6 +370,9 @@ public:
void uninit(void);
void reset(void);
+ /* Logging. */
+ VBOX_DND_FN_DECL_LOG(void) logError(const char *pszFormat, ...);
+
/* X11 message processing. */
int onX11ClientMessage(const XEvent &e);
int onX11SelectionNotify(const XEvent &e);
@@ -404,34 +414,35 @@ public:
protected:
- uint32_t m_uClientID;
- DragAndDropService *m_pParent;
- Display *m_pDisplay;
- int m_screenId;
- Screen *m_pScreen;
- Window m_wndRoot;
- Window m_wndProxy;
- Window m_wndCur;
- long m_curVer;
- RTCList<Atom> m_formats;
- RTCList<Atom> m_actions;
+ /** The instance's own DnD context. */
+ VBGLR3GUESTDNDCMDCTX m_dndCtx;
+ DragAndDropService *m_pParent;
+ Display *m_pDisplay;
+ int m_screenId;
+ Screen *m_pScreen;
+ Window m_wndRoot;
+ Window m_wndProxy;
+ Window m_wndCur;
+ long m_curVer;
+ RTCList<Atom> m_formats;
+ RTCList<Atom> m_actions;
/** Deferred host to guest selection event for sending to the
* target window as soon as data from the host arrived. */
- XEvent m_eventHgSelection;
+ XEvent m_eventHgSelection;
/** Current operation mode. */
- Mode m_mode;
+ Mode m_mode;
/** Current state of operation mode. */
- State m_state;
+ State m_state;
/** The instance's own X event queue. */
- RTCMTList<XEvent> m_eventQueue;
+ RTCMTList<XEvent> m_eventQueue;
/** Critical section for providing serialized access to list
* event queue's contents. */
- RTCRITSECT m_eventQueueCS;
+ RTCRITSECT m_eventQueueCS;
/** Event for notifying this instance in case of a new
* event. */
- RTSEMEVENT m_hEventSem;
+ RTSEMEVENT m_hEventSem;
/** List of allowed formats. */
- RTCList<RTCString> m_lstAllowedFormats;
+ RTCList<RTCString> m_lstAllowedFormats;
};
/*******************************************************************************
@@ -505,16 +516,15 @@ private:
******************************************************************************/
DragInstance::DragInstance(Display *pDisplay, DragAndDropService *pParent)
- : m_uClientID(0)
- , m_pParent(pParent)
- , m_pDisplay(pDisplay)
- , m_pScreen(0)
- , m_wndRoot(0)
- , m_wndProxy(0)
- , m_wndCur(0)
- , m_curVer(-1)
- , m_mode(Unknown)
- , m_state(Uninitialized)
+ : m_pParent(pParent)
+ , m_pDisplay(pDisplay)
+ , m_pScreen(0)
+ , m_wndRoot(0)
+ , m_wndProxy(0)
+ , m_wndCur(0)
+ , m_curVer(-1)
+ , m_mode(Unknown)
+ , m_state(Uninitialized)
{
uninit();
}
@@ -525,11 +535,7 @@ void DragInstance::uninit(void)
if (m_wndProxy != 0)
XDestroyWindow(m_pDisplay, m_wndProxy);
- if (m_uClientID)
- {
- VbglR3DnDDisconnect(m_uClientID);
- m_uClientID = 0;
- }
+ VbglR3DnDDisconnect(&m_dndCtx);
m_state = Uninitialized;
m_screenId = -1;
@@ -540,6 +546,8 @@ void DragInstance::uninit(void)
void DragInstance::reset(void)
{
+ LogFlowFuncEnter();
+
/* Hide the proxy win. */
proxyWinHide();
@@ -558,6 +566,7 @@ void DragInstance::reset(void)
m_wndCur = 0;
m_curVer = -1;
m_state = Initialized;
+ m_mode = Unknown;
m_eventQueue.clear();
}
@@ -569,7 +578,7 @@ int DragInstance::init(uint32_t u32ScreenId)
{
uninit();
- rc = VbglR3DnDConnect(&m_uClientID);
+ rc = VbglR3DnDConnect(&m_dndCtx);
if (RT_FAILURE(rc))
break;
@@ -630,6 +639,7 @@ int DragInstance::init(uint32_t u32ScreenId)
&attr /* Attributes for value mask */);
if (!m_wndProxy)
{
+ LogRel(("DnD: Error creating proxy window\n"));
rc = VERR_GENERAL_FAILURE;
break;
}
@@ -658,6 +668,21 @@ int DragInstance::init(uint32_t u32ScreenId)
return rc;
}
+VBOX_DND_FN_DECL_LOG(void) DragInstance::logError(const char *pszFormat, ...)
+{
+ va_list args;
+ va_start(args, pszFormat);
+ char *psz = NULL;
+ RTStrAPrintfV(&psz, pszFormat, args);
+ va_end(args);
+
+ AssertPtr(psz);
+ LogFlowFunc(("%s", psz));
+ LogRel2(("DnD: %s", psz));
+
+ RTStrFree(psz);
+}
+
int DragInstance::onX11ClientMessage(const XEvent &e)
{
AssertReturn(e.type == ClientMessage, VERR_INVALID_PARAMETER);
@@ -690,7 +715,7 @@ int DragInstance::onX11ClientMessage(const XEvent &e)
if (ASMBitTest(&e.xclient.data.l[1], 0))
uAction = toHGCMAction(static_cast<Atom>(e.xclient.data.l[4]));
- rc = VbglR3DnDHGAcknowledgeOperation(m_uClientID, uAction);
+ rc = VbglR3DnDHGAcknowledgeOperation(&m_dndCtx, uAction);
}
else if (e.xclient.message_type == xAtom(XA_XdndFinished))
{
@@ -818,8 +843,8 @@ int DragInstance::onX11SelectionRequest(const XEvent &e)
s.xselection.target = e.xselectionrequest.target;
s.xselection.property = e.xselectionrequest.property;
- int xrc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
- if (RT_UNLIKELY(xrc == 0))
+ int xRc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
+ if (RT_UNLIKELY(xRc == 0))
LogFlowThisFunc(("Error sending SelectionNotify event to wnd=%#x\n", e.xselectionrequest.requestor));
}
/* Is the requestor asking for a specific MIME type (we support)? */
@@ -845,8 +870,8 @@ int DragInstance::onX11SelectionRequest(const XEvent &e)
s.xselection.target = None;
s.xselection.property = e.xselectionrequest.property;
- int xrc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
- if (RT_UNLIKELY(xrc == 0))
+ int xRc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
+ if (RT_UNLIKELY(xRc == 0))
LogFlowThisFunc(("Error sending SelectionNotify event to wnd=%#x\n", e.xselectionrequest.requestor));
}
else
@@ -857,7 +882,7 @@ int DragInstance::onX11SelectionRequest(const XEvent &e)
RTCString strFormat = xAtomToString(e.xselectionrequest.target);
Assert(strFormat.isNotEmpty());
- rc = VbglR3DnDHGRequestData(m_uClientID, strFormat.c_str());
+ rc = VbglR3DnDHGRequestData(&m_dndCtx, strFormat.c_str());
LogFlowThisFunc(("Requesting data from host as \"%s\", rc=%Rrc\n",
strFormat.c_str(), rc));
}
@@ -878,8 +903,8 @@ int DragInstance::onX11SelectionRequest(const XEvent &e)
s.xselection.requestor = e.xselectionrequest.requestor;
s.xselection.target = None; /* default is refusing */
s.xselection.property = None; /* default is refusing */
- int xrc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
- if (RT_UNLIKELY(xrc == 0))
+ int xRc = XSendEvent(e.xselection.display, e.xselectionrequest.requestor, False, 0, &s);
+ if (RT_UNLIKELY(xRc == 0))
LogFlowThisFunc(("Error sending SelectionNotify event to wnd=%#x\n", e.xselectionrequest.requestor));
}
@@ -951,11 +976,11 @@ int DragInstance::onX11Event(const XEvent &e)
bool DragInstance::waitForX11Msg(XEvent &evX, int iType,
RTMSINTERVAL uTimeoutMS /* = 100 */)
{
- LogFlowThisFunc(("iType=%d, uTimeoutMS=%RU32, cEventQueue=%zu\n",
- iType, uTimeoutMS, m_eventQueue.size()));
+ LogFlowThisFunc(("iType=%d, uTimeoutMS=%RU32, cEventQueue=%zu\n", iType, uTimeoutMS, m_eventQueue.size()));
bool fFound = false;
const uint64_t uiStart = RTTimeMilliTS();
+
do
{
/* Check if there is a client message in the queue. */
@@ -994,8 +1019,7 @@ bool DragInstance::waitForX11Msg(XEvent &evX, int iType,
}
while (RTTimeMilliTS() - uiStart < uTimeoutMS);
- LogFlowThisFunc(("Returning fFound=%RTbool, msRuntime=%RU64\n",
- fFound, RTTimeMilliTS() - uiStart));
+ LogFlowThisFunc(("Returning fFound=%RTbool, msRuntime=%RU64\n", fFound, RTTimeMilliTS() - uiStart));
return fFound;
}
@@ -1057,6 +1081,9 @@ bool DragInstance::waitForX11ClientMsg(XClientMessageEvent &evMsg, Atom aType,
int DragInstance::hgEnter(const RTCList<RTCString> &formats, uint32_t uActions)
{
+ if (m_mode != Unknown)
+ return VERR_INVALID_STATE;
+
reset();
#ifdef DEBUG
@@ -1091,10 +1118,12 @@ int DragInstance::hgMove(uint32_t u32xPos, uint32_t u32yPos, uint32_t uAction)
if ( m_mode != HG
|| m_state != Dragging)
+ {
return VERR_INVALID_STATE;
+ }
int rc = VINF_SUCCESS;
- int xrc = Success;
+ int xRc = Success;
/* Move the mouse cursor within the guest. */
mouseCursorMove(u32xPos, u32yPos);
@@ -1113,20 +1142,20 @@ int DragInstance::hgMove(uint32_t u32xPos, uint32_t u32yPos, uint32_t uAction)
/* Query the XdndAware property from the window. We are interested in
* the version and if it is XdndAware at all. */
- xrc = XGetWindowProperty(m_pDisplay, wndCursor, xAtom(XA_XdndAware),
+ xRc = XGetWindowProperty(m_pDisplay, wndCursor, xAtom(XA_XdndAware),
0, 2, False, AnyPropertyType,
&atmp, &fmt, &cItems, &cbRemaining, &pcData);
- if (RT_UNLIKELY(xrc != Success))
- LogFlowThisFunc(("Error in getting the window property: %s\n", gX11->xErrorToString(xrc).c_str()));
+ if (RT_UNLIKELY(xRc != Success))
+ logError("Error getting properties of cursor window=%#x: %s\n", wndCursor, gX11->xErrorToString(xRc).c_str());
else
{
if (RT_UNLIKELY(pcData == NULL || fmt != 32 || cItems != 1))
- LogFlowThisFunc(("Wrong properties pcData=%#x, iFmt=%u, cItems=%u\n", pcData, fmt, cItems));
+ LogFlowThisFunc(("Wrong properties: pcData=%#x, iFmt=%d, cItems=%ul\n", pcData, fmt, cItems));
else
{
newVer = reinterpret_cast<long*>(pcData)[0];
- LogFlowThisFunc(("wndCursor=%#x, XdndAware=%u\n", newVer));
+ LogFlowThisFunc(("wndCursor=%#x, XdndAware=%ld\n", wndCursor, newVer));
}
XFree(pcData);
@@ -1137,7 +1166,7 @@ int DragInstance::hgMove(uint32_t u32xPos, uint32_t u32yPos, uint32_t uAction)
* Is the window under the cursor another one than our current one?
*/
if ( wndCursor != m_wndCur
- && m_curVer != -1)
+ && m_curVer != -1)
{
LogFlowThisFunc(("Leaving window=%#x\n", m_wndCur));
@@ -1151,15 +1180,16 @@ int DragInstance::hgMove(uint32_t u32xPos, uint32_t u32yPos, uint32_t uAction)
m.format = 32;
m.data.l[0] = m_wndProxy;
- xrc = XSendEvent(m_pDisplay, m_wndCur, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending XA_XdndLeave to old window=%#x\n", m_wndCur));
+ xRc = XSendEvent(m_pDisplay, m_wndCur, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
+ if (RT_UNLIKELY(xRc == 0))
+ logError("DnD: Error sending XA_XdndLeave event to old window=%#x: %s\n", m_wndCur, gX11->xErrorToString(xRc).c_str());
}
/*
* Do we have a new window which now is under the cursor?
*/
- if (wndCursor != m_wndCur && newVer != -1)
+ if ( wndCursor != m_wndCur
+ && newVer != -1)
{
LogFlowThisFunc(("Entering window=%#x\n", wndCursor));
@@ -1182,15 +1212,14 @@ int DragInstance::hgMove(uint32_t u32xPos, uint32_t u32yPos, uint32_t uAction)
m.data.l[3] = m_formats.value(1, None);
m.data.l[4] = m_formats.value(2, None);
- xrc = XSendEvent(m_pDisplay, wndCursor, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending XA_XdndEnter to new window=%#x\n", wndCursor));
+ xRc = XSendEvent(m_pDisplay, wndCursor, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
+ if (RT_UNLIKELY(xRc == 0))
+ logError("Error sending XA_XdndEnter event to new window=%#x: %s\n", wndCursor, gX11->xErrorToString(xRc).c_str());
}
if (newVer != -1)
{
- LogFlowThisFunc(("Moving window=%#x, xPos=%RU32, yPos=%RU32\n",
- wndCursor, u32xPos, u32yPos));
+ LogFlowThisFunc(("Moving window=%#x, xPos=%RU32, yPos=%RU32\n", wndCursor, u32xPos, u32yPos));
/*
* Send a XdndPosition event with the proposed action to the guest.
@@ -1210,16 +1239,16 @@ int DragInstance::hgMove(uint32_t u32xPos, uint32_t u32yPos, uint32_t uAction)
m.data.l[3] = CurrentTime;
m.data.l[4] = pa;
- xrc = XSendEvent(m_pDisplay, wndCursor, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending XA_XdndPosition to window=%#x\n", wndCursor));
+ xRc = XSendEvent(m_pDisplay, wndCursor, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
+ if (RT_UNLIKELY(xRc == 0))
+ logError(("Error sending XA_XdndPosition event to current window=%#x: %s\n", wndCursor, gX11->xErrorToString(xRc).c_str()));
}
if ( wndCursor == None
&& newVer == -1)
{
/* No window to process, so send a ignore ack event to the host. */
- rc = VbglR3DnDHGAcknowledgeOperation(m_uClientID, DND_IGNORE_ACTION);
+ rc = VbglR3DnDHGAcknowledgeOperation(&m_dndCtx, DND_IGNORE_ACTION);
}
m_wndCur = wndCursor;
@@ -1236,7 +1265,9 @@ int DragInstance::hgDrop(void)
if ( m_mode != HG
|| m_state != Dragging)
+ {
return VERR_INVALID_STATE;
+ }
int rc = VINF_SUCCESS;
@@ -1251,9 +1282,9 @@ int DragInstance::hgDrop(void)
m.data.l[0] = m_wndProxy;
m.data.l[2] = CurrentTime;
- int xrc = XSendEvent(m_pDisplay, m_wndCur, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending XA_XdndDrop to window=%#x\n", m_wndCur));
+ int xRc = XSendEvent(m_pDisplay, m_wndCur, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
+ if (RT_UNLIKELY(xRc == 0))
+ logError(("Error sending XA_XdndDrop event to current window=%#x: %s\n", m_wndCur, gX11->xErrorToString(xRc).c_str()));
m_wndCur = None;
m_curVer = -1;
@@ -1264,24 +1295,29 @@ int DragInstance::hgDrop(void)
return rc;
}
-int DragInstance::hgDataReceived(void *pvData, uint32_t cData)
+int DragInstance::hgDataReceived(void *pvData, uint32_t cbData)
{
if ( m_mode != HG
|| m_state != Dropped)
+ {
return VERR_INVALID_STATE;
+ }
if (RT_UNLIKELY( pvData == NULL
- || cData == 0))
+ || cbData == 0))
+ {
return VERR_INVALID_PARAMETER;
+ }
if (RT_UNLIKELY(m_state != Dropped))
return VERR_INVALID_STATE;
/* Make a copy of the data. The xserver will become the new owner. */
- void *pvNewData = RTMemAlloc(cData);
+ void *pvNewData = RTMemAlloc(cbData);
if (RT_UNLIKELY(!pvNewData))
return VERR_NO_MEMORY;
- memcpy(pvNewData, pvData, cData);
+
+ memcpy(pvNewData, pvData, cbData);
/*
* The host send us the DnD data in the requested mime type. This allows us
@@ -1309,10 +1345,13 @@ int DragInstance::hgDataReceived(void *pvData, uint32_t cData)
/* Fill up the property with the data. */
XChangeProperty(s.xselection.display, s.xselection.requestor, s.xselection.property, s.xselection.target, 8, PropModeReplace,
- reinterpret_cast<const unsigned char*>(pvNewData), cData);
- int xrc = XSendEvent(s.xselection.display, s.xselection.requestor, True, 0, &s);
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending SelectionNotify event to wnd=%#x\n", s.xselection.requestor));
+ reinterpret_cast<const unsigned char*>(pvNewData), cbData);
+ int xRc = XSendEvent(s.xselection.display, s.xselection.requestor, True, 0, &s);
+ if (RT_UNLIKELY(xRc == 0))
+ {
+ logError(("Error sending SelectionNotify event to window=%#x: %s\n",
+ s.xselection.requestor, gX11->xErrorToString(xRc).c_str()));
+ }
return VINF_SUCCESS;
}
@@ -1320,6 +1359,11 @@ int DragInstance::hgDataReceived(void *pvData, uint32_t cData)
#ifdef VBOX_WITH_DRAG_AND_DROP_GH
int DragInstance::ghIsDnDPending(void)
{
+ LogFlowFuncEnter();
+
+ if (m_mode == HG)
+ return VERR_INVALID_STATE;
+
int rc = VINF_SUCCESS;
Window wndSelection = XGetSelectionOwner(m_pDisplay, xAtom(XA_XdndSelection));
LogFlowThisFunc(("Checking pending wndSelection=%#x, wndProxy=%#x\n", wndSelection, m_wndProxy));
@@ -1420,8 +1464,9 @@ int DragInstance::ghIsDnDPending(void)
XFree(ret);
}
- /* Acknowledge the event by sending a Status msg back to the
- * window. */
+ /*
+ * Acknowledge the event by sending a status message back to the window.
+ */
XClientMessageEvent m;
RT_ZERO(m);
m.type = ClientMessage;
@@ -1436,7 +1481,10 @@ int DragInstance::ghIsDnDPending(void)
xRc = XSendEvent(m_pDisplay, m_wndCur,
False, 0, reinterpret_cast<XEvent*>(&m));
if (RT_UNLIKELY(xRc == 0))
- LogFlowThisFunc(("Error sending xEvent\n"));
+ {
+ logError(("Error sending enter XA_XdndStatus event to current window=%#x: %s\n",
+ m_wndCur, gX11->xErrorToString(xRc).c_str()));
+ }
}
/* Did the source tell us where the cursor currently is? */
else if (pEventClient->message_type == xAtom(XA_XdndPosition))
@@ -1459,7 +1507,10 @@ int DragInstance::ghIsDnDPending(void)
xRc = XSendEvent(m_pDisplay, m_wndCur,
False, 0, reinterpret_cast<XEvent*>(&m));
if (RT_UNLIKELY(xRc == 0))
- LogFlowThisFunc(("Error sending xEvent\n"));
+ {
+ logError(("Error sending position XA_XdndStatus event to current window=%#x: %s\n",
+ m_wndCur, gX11->xErrorToString(xRc).c_str()));
+ }
}
else if (pEventClient->message_type == xAtom(XA_XdndLeave))
{
@@ -1474,9 +1525,9 @@ int DragInstance::ghIsDnDPending(void)
uint32_t uDefAction = DND_COPY_ACTION; /** @todo Handle default action! */
uint32_t uAllActions = toHGCMActions(m_actions);
- rc = VbglR3DnDGHAcknowledgePending(m_uClientID, uDefAction, uAllActions, strFormats.c_str());
+ rc = VbglR3DnDGHAcknowledgePending(&m_dndCtx, uDefAction, uAllActions, strFormats.c_str());
LogFlowThisFunc(("Acknowledging m_uClientID=%RU32, allActions=0x%x, strFormats=%s, rc=%Rrc\n",
- m_uClientID, uAllActions, strFormats.c_str(), rc));
+ m_dndCtx.uClientID, uAllActions, strFormats.c_str(), rc));
}
}
@@ -1486,8 +1537,13 @@ int DragInstance::ghIsDnDPending(void)
int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
{
- LogFlowThisFunc(("strFormat=%s, uAction=%RU32\n",
- strFormat.c_str(), uAction));
+ LogFlowThisFunc(("strFormat=%s, uAction=%RU32\n", strFormat.c_str(), uAction));
+
+ if ( m_mode != GH
+ || m_state != Dragging)
+ {
+ return VERR_INVALID_STATE;
+ }
int rc = VINF_SUCCESS;
@@ -1513,24 +1569,24 @@ int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
mouseButtonSet(m_wndCur /* Source window */, iRootX, iRootY,
1 /* Button */, false /* Release button */);
- /* The fake button release event should lead to a XdndDrop event from the
+ /**
+ * The fake button release event above should lead to a XdndDrop event from the
* source. Because of showing our proxy window, other Xdnd events can
* occur before, e.g. a XdndPosition event. We are not interested
- * in those, so just try to get the right one. */
+ * in those, so just try to get the right one.
+ */
XClientMessageEvent evDnDDrop;
- bool fDrop = waitForX11ClientMsg(evDnDDrop, xAtom(XA_XdndDrop),
- 5 * 1000 /* Timeout in ms */);
+ bool fDrop = waitForX11ClientMsg(evDnDDrop, xAtom(XA_XdndDrop), 5 * 1000 /* Timeout in ms */);
if (fDrop)
{
/* Request to convert the selection in the specific format and
* place it to our proxy window as property. */
- Window wndSource = evDnDDrop.data.l[0]; /* Source window which sent the message. */
+ Window wndSource = evDnDDrop.data.l[0]; /* Source window which has sent the message. */
Assert(wndSource == m_wndCur);
Atom aFormat = gX11->stringToxAtom(strFormat.c_str());
- XConvertSelection(m_pDisplay, xAtom(XA_XdndSelection),
- aFormat, xAtom(XA_XdndSelection),
+ XConvertSelection(m_pDisplay, xAtom(XA_XdndSelection), aFormat, xAtom(XA_XdndSelection),
m_wndProxy, evDnDDrop.data.l[2]);
/* Wait for the selection notify event. */
@@ -1553,13 +1609,16 @@ int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
int iPropFormat;
unsigned long cItems, cbRemaining;
unsigned char *pcData = NULL;
- XGetWindowProperty(m_pDisplay, m_wndProxy,
- xAtom(XA_XdndSelection) /* Property */,
- 0 /* Offset */,
- VBOX_MAX_XPROPERTIES /* Length of 32-bit multiples */,
- True /* Delete property? */,
- AnyPropertyType, /* Property type */
- &aPropType, &iPropFormat, &cItems, &cbRemaining, &pcData);
+ int xRc = XGetWindowProperty(m_pDisplay, m_wndProxy,
+ xAtom(XA_XdndSelection) /* Property */,
+ 0 /* Offset */,
+ VBOX_MAX_XPROPERTIES /* Length of 32-bit multiples */,
+ True /* Delete property? */,
+ AnyPropertyType, /* Property type */
+ &aPropType, &iPropFormat, &cItems, &cbRemaining, &pcData);
+ if (RT_UNLIKELY(xRc == 0))
+ LogFlowThisFunc(("Error getting XA_XdndSelection property of proxy window=%#x: %s\n",
+ m_wndProxy, gX11->xErrorToString(xRc).c_str()));
LogFlowThisFunc(("strType=%s, iPropFormat=%d, cItems=%RU32, cbRemaining=%RU32\n",
gX11->xAtomToString(aPropType).c_str(), iPropFormat, cItems, cbRemaining));
@@ -1585,8 +1644,7 @@ int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
memcpy(pvDataTmp, pcData, cbData);
pvDataTmp[cbData++] = '\0';
- rc = VbglR3DnDGHSendData(m_uClientID, strFormat.c_str(),
- pvDataTmp, cbData);
+ rc = VbglR3DnDGHSendData(&m_dndCtx, strFormat.c_str(), pvDataTmp, cbData);
RTMemFree(pvDataTmp);
}
else
@@ -1595,12 +1653,10 @@ int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
else
{
/* Send the raw data to the host. */
- rc = VbglR3DnDGHSendData(m_uClientID, strFormat.c_str(),
- pcData, cbData);
+ rc = VbglR3DnDGHSendData(&m_dndCtx, strFormat.c_str(), pcData, cbData);
}
- LogFlowThisFunc(("Sent strFormat=%s with rc=%Rrc\n",
- strFormat.c_str(), rc));
+ LogFlowThisFunc(("Sent strFormat=%s, rc=%Rrc\n", strFormat.c_str(), rc));
if (RT_SUCCESS(rc))
{
@@ -1616,9 +1672,10 @@ int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
m.data.l[1] = 0; /* Don't accept the drop to not make the guest stuck. */
m.data.l[2] = RT_SUCCESS(rc) ? toX11Action(uAction) : None; /* Action used on success */
- int xrc = XSendEvent(m_pDisplay, wndSource, True, NoEventMask, reinterpret_cast<XEvent*>(&m));
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending xEvent\n"));
+ xRc = XSendEvent(m_pDisplay, wndSource, True, NoEventMask, reinterpret_cast<XEvent*>(&m));
+ if (RT_UNLIKELY(xRc == 0))
+ LogFlowThisFunc(("Error sending XA_XdndFinished event to proxy window=%#x: %s\n",
+ m_wndProxy, gX11->xErrorToString(xRc).c_str()));
}
else
fCancel = true;
@@ -1633,9 +1690,8 @@ int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
}
else
{
- AssertMsgFailed(("Not supported data type (%s)\n",
- gX11->xAtomToString(aPropType).c_str()));
- rc = VERR_INVALID_PARAMETER;
+ LogFlowFunc(("Not supported data type: %s\n", gX11->xAtomToString(aPropType).c_str()));
+ rc = VERR_NOT_SUPPORTED;
}
fCancel = true;
@@ -1656,9 +1712,12 @@ int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
m.data.l[0] = m_wndProxy; /* Target window. */
m.data.l[1] = 0; /* Don't accept the drop to not make the guest stuck. */
- int xrc = XSendEvent(m_pDisplay, wndSource, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending cancel event\n"));
+ xRc = XSendEvent(m_pDisplay, wndSource, False, NoEventMask, reinterpret_cast<XEvent*>(&m));
+ if (RT_UNLIKELY(xRc == 0))
+ {
+ logError(("Error sending XA_XdndFinished event to proxy window=%#x: %s\n",
+ m_wndProxy, gX11->xErrorToString(xRc).c_str()));
+ }
}
/* Cleanup. */
@@ -1677,7 +1736,7 @@ int DragInstance::ghDropped(const RTCString &strFormat, uint32_t uAction)
/* Inform the host on error. */
if (RT_FAILURE(rc))
{
- int rc2 = VbglR3DnDGHSendError(m_uClientID, rc);
+ int rc2 = VbglR3DnDGHSendError(&m_dndCtx, rc);
AssertRC(rc2);
}
@@ -1700,7 +1759,7 @@ int DragInstance::mouseCursorMove(int iPosX, int iPosY) const
/* Move the guest pointer to the DnD position, so we can find the window
* below that position. */
- XWarpPointer(m_pDisplay, None, m_wndRoot, 0, 0, 0, 0, iPosX, iPosY);
+ XWarpPointer(m_pDisplay, None, m_wndRoot, 0, 0, 0, 0, RT_MAX(0, iPosX), RT_MAX(0, iPosY));
return VINF_SUCCESS;
}
@@ -1745,9 +1804,9 @@ void DragInstance::mouseButtonSet(Window wndDest, int rx, int ry, int iButton, b
{
LogFlowThisFunc(("XText extension available\n"));
- int xrc = XTestFakeButtonEvent(m_pDisplay, 1, fPress ? True : False, CurrentTime);
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending XTestFakeButtonEvent event\n"));
+ int xRc = XTestFakeButtonEvent(m_pDisplay, 1, fPress ? True : False, CurrentTime);
+ if (RT_UNLIKELY(xRc == 0))
+ LogFlowThisFunc(("Error sending XTestFakeButtonEvent event: %s\n", gX11->xErrorToString(xRc).c_str()));
XFlush(m_pDisplay);
}
else
@@ -1777,17 +1836,16 @@ void DragInstance::mouseButtonSet(Window wndDest, int rx, int ry, int iButton, b
//XTranslateCoordinates(m_pDisplay, eBtn.root, eBtn.window, eBtn.x_root, eBtn.y_root, &eBtn.x, &eBtn.y, &eBtn.subwindow);
#if 0
- int xrc = XSendEvent(m_pDisplay, eBtn.window, True /* fPropagate */,
+ int xRc = XSendEvent(m_pDisplay, eBtn.window, True /* fPropagate */,
fPress
? ButtonPressMask : ButtonReleaseMask,
reinterpret_cast<XEvent*>(&eBtn));
#else
- int xrc = XSendEvent(m_pDisplay, eBtn.window, False /* fPropagate */,
- 0 /* Mask */,
- reinterpret_cast<XEvent*>(&eBtn));
+ int xRc = XSendEvent(m_pDisplay, eBtn.window, False /* fPropagate */,
+ 0 /* Mask */, reinterpret_cast<XEvent*>(&eBtn));
#endif
- if (RT_UNLIKELY(xrc == 0))
- LogFlowThisFunc(("Error sending XSendEvent\n"));
+ if (RT_UNLIKELY(xRc == 0))
+ LogFlowThisFunc(("Error sending XButtonEvent event to window=%#x: %s\n", wndDest, gX11->xErrorToString(xRc).c_str()));
#ifdef DEBUG
Window wndTemp, wndChild;
@@ -1817,13 +1875,15 @@ int DragInstance::proxyWinShow(int *piRootX /*= NULL*/,
Window wndRoot, wndChild;
// XTestGrabControl(m_pDisplay, False);
+
+ /* Get the mouse pointer position and determine if we're on the same screen as the root window
+ * and returns the current child window beneath our mouse pointer, if any. */
Bool fInRootWnd = XQueryPointer(m_pDisplay, m_wndRoot, &wndRoot, &wndChild,
&iRootX, &iRootY,
&iChildX, &iChildY, &iMask);
-#ifdef DEBUG_andy
+
LogFlowThisFunc(("fInRootWnd=%RTbool, wndRoot=0x%x, wndChild=0x%x, iRootX=%d, iRootY=%d\n",
RT_BOOL(fInRootWnd), wndRoot, wndChild, iRootX, iRootY));
-#endif
if (piRootX)
*piRootX = iRootX;
@@ -1832,9 +1892,15 @@ int DragInstance::proxyWinShow(int *piRootX /*= NULL*/,
XSynchronize(m_pDisplay, True /* Enable sync */);
+ /* Bring our proxy window into foreground. */
XMapWindow(m_pDisplay, m_wndProxy);
XRaiseWindow(m_pDisplay, m_wndProxy);
- XMoveResizeWindow(m_pDisplay, m_wndProxy, iRootX, iRootY, 100, 100);
+
+ /* Resize our proxy window so that it gets displayed right in center of our mouse cursor. */
+ const int iProxyX = RT_MAX(0, iRootX - 50);
+ const int iProxyY = RT_MAX(0, iRootY - 50);
+ LogFlowThisFunc(("iProxyX=%d, iProxyY=%d\n", iProxyX, iProxyY));
+ XMoveResizeWindow(m_pDisplay, m_wndProxy, iProxyX, iProxyY, 100, 100);
if (fMouseMove)
XWarpPointer(m_pDisplay, None, m_wndRoot, 0, 0, 0, 0, iRootX, iRootY);
@@ -1877,8 +1943,7 @@ void DragInstance::registerForEvents(Window wndThis) const
}
}
-void DragInstance::setActionsWindowProperty(Window wndThis,
- const RTCList<Atom> &lstActions) const
+void DragInstance::setActionsWindowProperty(Window wndThis, const RTCList<Atom> &lstActions) const
{
if (lstActions.isEmpty())
return;
@@ -1895,8 +1960,7 @@ void DragInstance::clearActionsWindowProperty(Window wndThis) const
XDeleteProperty(m_pDisplay, wndThis, xAtom(XA_XdndActionList));
}
-void DragInstance::setFormatsWindowProperty(Window wndThis,
- Atom property) const
+void DragInstance::setFormatsWindowProperty(Window wndThis, Atom property) const
{
if (m_formats.isEmpty())
return;
@@ -2109,8 +2173,7 @@ int DragAndDropService::run(bool fDaemonised /* = false */)
}
case DragAndDropSvc::HOST_DND_HG_EVT_MOVE:
{
- m_pCurDnD->hgMove(e.hgcm.u.a.uXpos, e.hgcm.u.a.uYpos,
- e.hgcm.u.a.uDefAction);
+ rc = m_pCurDnD->hgMove(e.hgcm.u.a.uXpos, e.hgcm.u.a.uYpos, e.hgcm.u.a.uDefAction);
break;
}
case DragAndDropSvc::HOST_DND_HG_EVT_LEAVE:
@@ -2120,35 +2183,37 @@ int DragAndDropService::run(bool fDaemonised /* = false */)
}
case DragAndDropSvc::HOST_DND_HG_EVT_DROPPED:
{
- m_pCurDnD->hgDrop();
+ rc = m_pCurDnD->hgDrop();
break;
}
case DragAndDropSvc::HOST_DND_HG_SND_DATA:
{
- m_pCurDnD->hgDataReceived(e.hgcm.u.b.pvData, e.hgcm.u.b.cbData);
+ rc = m_pCurDnD->hgDataReceived(e.hgcm.u.b.pvData, e.hgcm.u.b.cbData);
break;
}
case DragAndDropSvc::HOST_DND_GH_REQ_PENDING:
{
#ifdef VBOX_WITH_DRAG_AND_DROP_GH
- m_pCurDnD->ghIsDnDPending();
+ rc = m_pCurDnD->ghIsDnDPending();
#endif
break;
}
case DragAndDropSvc::HOST_DND_GH_EVT_DROPPED:
{
#ifdef VBOX_WITH_DRAG_AND_DROP_GH
- m_pCurDnD->ghDropped(e.hgcm.pszFormats,
- e.hgcm.u.a.uDefAction);
+ rc = m_pCurDnD->ghDropped(e.hgcm.pszFormats, e.hgcm.u.a.uDefAction);
#endif
break;
}
default:
- LogFlowThisFunc(("Unknown message: %RU32\n", e.hgcm.uType));
+ LogFlowThisFunc(("Unsupported message: %RU32\n", e.hgcm.uType));
+ rc = VERR_NOT_SUPPORTED;
break;
}
+ LogFlowFunc(("Returning %Rrc\n", rc));
+
/* Some messages require cleanup. */
switch (e.hgcm.uType)
{
@@ -2251,8 +2316,10 @@ int DragAndDropService::hgcmEventThread(RTTHREAD hThread, void *pvUser)
DragAndDropService *pThis = static_cast<DragAndDropService*>(pvUser);
AssertPtr(pThis);
- uint32_t uClientID;
- int rc = VbglR3DnDConnect(&uClientID);
+ /* This thread has an own DnD context, e.g. an own client ID. */
+ VBGLR3GUESTDNDCMDCTX dndCtx;
+
+ int rc = VbglR3DnDConnect(&dndCtx);
if (RT_FAILURE(rc))
LogRel(("DnD: Unable to connect to drag and drop service, rc=%Rrc\n", rc));
/* Not RT_FAILURE: VINF_PERMISSION_DENIED is host service not present. */
@@ -2269,8 +2336,9 @@ int DragAndDropService::hgcmEventThread(RTTHREAD hThread, void *pvUser)
e.type = DnDEvent::HGCM_Type;
/* Wait for new events. */
- rc = VbglR3DnDProcessNextMessage(uClientID, &e.hgcm);
- if (RT_SUCCESS(rc))
+ rc = VbglR3DnDProcessNextMessage(&dndCtx, &e.hgcm);
+ if ( RT_SUCCESS(rc)
+ || rc == VERR_CANCELLED)
{
cMsgSkippedInvalid = 0; /* Reset skipped messages count. */
@@ -2283,12 +2351,14 @@ int DragAndDropService::hgcmEventThread(RTTHREAD hThread, void *pvUser)
}
else
{
+ LogFlowFunc(("Processing next message failed with rc=%Rrc\n", rc));
+
/* Old(er) hosts either are broken regarding DnD support or otherwise
* don't support the stuff we do on the guest side, so make sure we
* don't process invalid messages forever. */
if (rc == VERR_INVALID_PARAMETER)
cMsgSkippedInvalid++;
- if (cMsgSkippedInvalid > 3)
+ if (cMsgSkippedInvalid > 32)
{
LogRel(("DnD: Too many invalid/skipped messages from host, exiting ...\n"));
break;
@@ -2297,7 +2367,7 @@ int DragAndDropService::hgcmEventThread(RTTHREAD hThread, void *pvUser)
} while (!ASMAtomicReadBool(&pThis->m_fSrvStopping));
- VbglR3DnDDisconnect(uClientID);
+ VbglR3DnDDisconnect(&dndCtx);
LogFlowFuncLeaveRC(rc);
return rc;
diff --git a/src/VBox/Additions/x11/VBoxClient/hostversion.cpp b/src/VBox/Additions/x11/VBoxClient/hostversion.cpp
index 33cb344..8b25a0a 100644
--- a/src/VBox/Additions/x11/VBoxClient/hostversion.cpp
+++ b/src/VBox/Additions/x11/VBoxClient/hostversion.cpp
@@ -1,3 +1,4 @@
+/* $Id: hostversion.cpp $ */
/** @file
* X11 guest client - host version check.
*/
@@ -43,7 +44,7 @@ static int showNotify(const char *pcHeader, const char *pcBody)
# ifdef VBOX_WITH_DBUS
DBusConnection *conn;
DBusMessage* msg = NULL;
- conn = dbus_bus_get (DBUS_BUS_SESSON, NULL);
+ conn = dbus_bus_get (DBUS_BUS_SESSION, NULL);
if (conn == NULL)
{
LogRelFlowFunc(("Could not retrieve D-BUS session bus!\n"));
diff --git a/src/VBox/Additions/x11/VBoxClient/main.cpp b/src/VBox/Additions/x11/VBoxClient/main.cpp
index 36ef8a1..554da55 100644
--- a/src/VBox/Additions/x11/VBoxClient/main.cpp
+++ b/src/VBox/Additions/x11/VBoxClient/main.cpp
@@ -1,3 +1,4 @@
+/* $Id: main.cpp $ */
/** @file
*
* VirtualBox Guest Service:
@@ -5,7 +6,7 @@
*/
/*
- * Copyright (C) 2006-2011 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -28,6 +29,7 @@
#include <X11/Xlib.h>
#include <X11/Xatom.h>
+#include <iprt/buildconfig.h>
#include <iprt/critsect.h>
#include <iprt/env.h>
#include <iprt/file.h>
@@ -248,18 +250,20 @@ void vboxClientUsage(const char *pcszFileName)
"--checkhostversion|"
#endif
"--seamless [-d|--nodaemon]\n", pcszFileName);
- RTPrintf("Start the VirtualBox X Window System guest services.\n\n");
+ RTPrintf("Starts the VirtualBox X Window System guest services.\n\n");
RTPrintf("Options:\n");
- RTPrintf(" --clipboard start the shared clipboard service\n");
+ RTPrintf(" --clipboard starts the shared clipboard service\n");
#ifdef VBOX_WITH_DRAG_AND_DROP
- RTPrintf(" --draganddrop start the drag and drop service\n");
+ RTPrintf(" --draganddrop starts the drag and drop service\n");
#endif
- RTPrintf(" --display start the display management service\n");
+ RTPrintf(" --display starts the display management service\n");
#ifdef VBOX_WITH_GUEST_PROPS
- RTPrintf(" --checkhostversion start the host version notifier service\n");
+ RTPrintf(" --checkhostversion starts the host version notifier service\n");
#endif
- RTPrintf(" --seamless start the seamless windows service\n");
- RTPrintf(" -d, --nodaemon continue running as a system service\n");
+ RTPrintf(" --seamless starts the seamless windows service\n");
+ RTPrintf(" -d, --nodaemon continues running as a system service\n");
+ RTPrintf(" -h, --help shows this help text\n");
+ RTPrintf(" -V, --version shows version information\n");
RTPrintf("\n");
exit(0);
}
@@ -346,6 +350,11 @@ int main(int argc, char *argv[])
vboxClientUsage(pcszFileName);
return 0;
}
+ else if (!strcmp(argv[i], "-V") || !strcmp(argv[i], "--version"))
+ {
+ RTPrintf("%sr%s\n", RTBldCfgVersion(), RTBldCfgRevisionStr());
+ return 0;
+ }
else
{
RTPrintf("%s: unrecognized option `%s'\n", pcszFileName, argv[i]);
diff --git a/src/VBox/Additions/x11/VBoxClient/seamless-x11.cpp b/src/VBox/Additions/x11/VBoxClient/seamless-x11.cpp
index 8bf275c..e396fa3 100644
--- a/src/VBox/Additions/x11/VBoxClient/seamless-x11.cpp
+++ b/src/VBox/Additions/x11/VBoxClient/seamless-x11.cpp
@@ -1,3 +1,4 @@
+/* $Id: seamless-x11.cpp $ */
/** @file
* X11 Seamless mode.
*/
diff --git a/src/VBox/Additions/x11/VBoxClient/seamless-x11.h b/src/VBox/Additions/x11/VBoxClient/seamless-x11.h
index 46a5d41..98e7549 100644
--- a/src/VBox/Additions/x11/VBoxClient/seamless-x11.h
+++ b/src/VBox/Additions/x11/VBoxClient/seamless-x11.h
@@ -1,3 +1,4 @@
+/* $Id: seamless-x11.h $ */
/** @file
*
* Seamless mode:
diff --git a/src/VBox/Additions/x11/VBoxClient/seamless.cpp b/src/VBox/Additions/x11/VBoxClient/seamless.cpp
index 27c9f9f..b55a560 100644
--- a/src/VBox/Additions/x11/VBoxClient/seamless.cpp
+++ b/src/VBox/Additions/x11/VBoxClient/seamless.cpp
@@ -1,3 +1,4 @@
+/* $Id: seamless.cpp $ */
/** @file
* X11 Guest client - seamless mode: main logic, communication with the host and
* wrapper interface for the main code of the VBoxClient deamon. The
diff --git a/src/VBox/Additions/x11/VBoxClient/seamless.h b/src/VBox/Additions/x11/VBoxClient/seamless.h
index df56d42..fe4e6b1 100644
--- a/src/VBox/Additions/x11/VBoxClient/seamless.h
+++ b/src/VBox/Additions/x11/VBoxClient/seamless.h
@@ -1,3 +1,4 @@
+/* $Id: seamless.h $ */
/** @file
* X11 Guest client - seamless mode, missing proper description while using the
* potentially confusing word 'host'.
diff --git a/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11-auto.cpp b/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11-auto.cpp
index d877ffb..e53f8b3 100644
--- a/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11-auto.cpp
+++ b/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11-auto.cpp
@@ -1,3 +1,4 @@
+/* $Id: tstSeamlessX11-auto.cpp $ */
/** @file
* Automated test of the X11 seamless Additions code.
* @todo Better separate test data from implementation details!
diff --git a/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11.cpp b/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11.cpp
index d9782dd..b9c995e 100644
--- a/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11.cpp
+++ b/src/VBox/Additions/x11/VBoxClient/testcase/tstSeamlessX11.cpp
@@ -1,3 +1,4 @@
+/* $Id: tstSeamlessX11.cpp $ */
/** @file
* Linux seamless guest additions simulator in host.
*/
diff --git a/src/VBox/Additions/x11/undefined_xorg b/src/VBox/Additions/x11/undefined_xorg
index 1da429e..4949a71 100644
--- a/src/VBox/Additions/x11/undefined_xorg
+++ b/src/VBox/Additions/x11/undefined_xorg
@@ -107,7 +107,7 @@ __register_frame_info_bases
rename
RRCrtcNotify
RRGetInfo
-RRScreenSizeNotify
+RRScreenSizeSet
RRTellChanged
setenv
ShadowFBInit2
@@ -169,6 +169,7 @@ xf86ModesAdd
xf86OutputCreate
xf86OutputSetEDID
xf86OutputUseScreenMonitor
+xf86RandR12GetOriginalVirtualSize
xf86RemoveGeneralHandler
xf86SaveScreen
xf86ScreenToScrn
diff --git a/src/VBox/Additions/x11/vboxmouse/vboxmouse.c b/src/VBox/Additions/x11/vboxmouse/vboxmouse.c
index 7b32aea..242234c 100644
--- a/src/VBox/Additions/x11/vboxmouse/vboxmouse.c
+++ b/src/VBox/Additions/x11/vboxmouse/vboxmouse.c
@@ -1,3 +1,4 @@
+/* $Id: vboxmouse.c $ */
/** @file
* VirtualBox X11 Guest Additions, mouse driver for X.Org server 1.5
*/
diff --git a/src/VBox/Additions/x11/vboxvideo/Makefile.kmk b/src/VBox/Additions/x11/vboxvideo/Makefile.kmk
index eeda60c..fcf60b2 100644
--- a/src/VBox/Additions/x11/vboxvideo/Makefile.kmk
+++ b/src/VBox/Additions/x11/vboxvideo/Makefile.kmk
@@ -47,6 +47,8 @@ vboxvideo_xorg_INCS = \
$(VBOX_PATH_X11_ROOT)/xf86driproto-2.1.0 \
$(VBOX_PATH_X11_ROOT)/xproto-7.0.18
+vboxvideo.c_DEPS = $(VBOX_SVN_REV_HEADER)
+
#
# vboxvideo_drv
#
@@ -381,7 +383,6 @@ vboxvideo_drv_117_INCS = \
vboxvideo_drv_117_INCS += $(PATH_ROOT)/src/VBox/Runtime/include
vboxvideo_drv_117_SOURCES := $(vboxvideo_drv_17_SOURCES)
-
ifdef VBOX_USE_SYSTEM_XORG_HEADERS
# Build using local X.Org headers. We assume X.Org Server 1.7 or later.
DLLS := $(filter-out vboxvideo_drv_%,$(DLLS)) vboxvideo_drv_system
diff --git a/src/VBox/Additions/x11/vboxvideo/getmode.c b/src/VBox/Additions/x11/vboxvideo/getmode.c
index a37f64a..6cd16df 100644
--- a/src/VBox/Additions/x11/vboxvideo/getmode.c
+++ b/src/VBox/Additions/x11/vboxvideo/getmode.c
@@ -22,13 +22,6 @@
#include <iprt/string.h>
#include "xf86.h"
-#include "dixstruct.h"
-#ifdef VBOX_GUESTR3XF86MOD
-# define EXTENSION_PROC_ARGS char *name, GCPtr pGC
-#endif
-#include "extnsionst.h"
-#include "windowstr.h"
-#include <X11/extensions/randrproto.h>
#ifdef XORG_7X
# include <stdio.h>
@@ -384,4 +377,3 @@ void vbvxCleanUpLinuxACPI(ScreenPtr pScreen)
}
# endif /* RT_OS_LINUX */
#endif /* VBOXVIDEO_13 */
-
diff --git a/src/VBox/Additions/x11/vboxvideo/pointer.c b/src/VBox/Additions/x11/vboxvideo/pointer.c
index 8fe6a53..59905f6 100644
--- a/src/VBox/Additions/x11/vboxvideo/pointer.c
+++ b/src/VBox/Additions/x11/vboxvideo/pointer.c
@@ -1,3 +1,4 @@
+/* $Id: pointer.c $ */
/** @file
* VirtualBox X11 Additions graphics driver utility functions
*/
@@ -113,8 +114,7 @@ vbox_show_shape(unsigned short w, unsigned short h, CARD32 bg, unsigned char *im
* Main functions *
**************************************************************************/
-void
-vbox_close(ScrnInfoPtr pScrn, VBOXPtr pVBox)
+void vbvxCursorTerm(VBOXPtr pVBox)
{
TRACE_ENTRY();
@@ -437,8 +437,7 @@ vbox_load_cursor_argb(ScrnInfoPtr pScrn, CursorPtr pCurs)
}
#endif
-Bool
-vbox_cursor_init(ScreenPtr pScreen)
+Bool vbvxCursorInit(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
VBOXPtr pVBox = pScrn->driverPrivate;
diff --git a/src/VBox/Additions/x11/vboxvideo/vboxvideo.c b/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
index 11c584c..17f37e7 100644
--- a/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
+++ b/src/VBox/Additions/x11/vboxvideo/vboxvideo.c
@@ -54,72 +54,55 @@
* Dave Airlie <airlied at redhat.com>
*/
-#ifdef XORG_7X
-# include <stdlib.h>
-# include <string.h>
-#endif
+#include "vboxvideo.h"
+#include <VBox/VBoxGuest.h>
+#include <VBox/Hardware/VBoxVideoVBE.h>
+#include "version-generated.h"
+#include "product-generated.h"
+#include "revision-generated.h"
+/* Basic definitions and functions needed by all drivers. */
#include "xf86.h"
+/* For video memory mapping. */
#include "xf86_OSproc.h"
#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6
+/* PCI resources. */
# include "xf86Resources.h"
#endif
-
-/* This was accepted upstream in X.Org Server 1.16 which bumped the video
- * driver ABI to 17. */
-#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 17
-# define SET_HAVE_VT_PROPERTY
-#endif
-
-#ifndef PCIACCESS
-/* Drivers for PCI hardware need this */
-# include "xf86PciInfo.h"
-/* Drivers that need to access the PCI config space directly need this */
-# include "xf86Pci.h"
-#endif
-
+/* Generic server linear frame-buffer APIs. */
#include "fb.h"
-#include "os.h"
-
-#include "vboxvideo.h"
-#include <VBox/VBoxGuest.h>
-#include <VBox/Hardware/VBoxVideoVBE.h>
-#include "version-generated.h"
-#include "product-generated.h"
-#include <xf86.h>
-#include <misc.h>
-
-/* All drivers initialising the SW cursor need this */
-#include "mipointer.h"
-
-/* Colormap handling */
+/* Colormap and visual handling. */
#include "micmap.h"
#include "xf86cmap.h"
-
-/* DPMS */
-/* #define DPMS_SERVER
-#include "extensions/dpms.h" */
-
/* ShadowFB support */
#include "shadowfb.h"
-
/* VGA hardware functions for setting and restoring text mode */
#include "vgaHW.h"
-
+#ifdef VBOX_DRI
+# include "xf86drm.h"
+# include "xf86drmMode.h"
+#endif
#ifdef VBOXVIDEO_13
/* X.org 1.3+ mode setting */
# define _HAVE_STRING_ARCH_strsep /* bits/string2.h, __strsep_1c. */
# include "xf86Crtc.h"
# include "xf86Modes.h"
+/* For xf86RandR12GetOriginalVirtualSize(). */
+# include "xf86RandR12.h"
#endif
-
/* For setting the root window property. */
-#include <X11/Xatom.h>
#include "property.h"
+#include "X11/Xatom.h"
-#ifdef VBOX_DRI
-# include "xf86drm.h"
-# include "xf86drmMode.h"
+#ifdef XORG_7X
+# include <stdlib.h>
+# include <string.h>
+#endif
+
+/* This was accepted upstream in X.Org Server 1.16 which bumped the video
+ * driver ABI to 17. */
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 17
+# define SET_HAVE_VT_PROPERTY
#endif
/* Mandatory functions */
@@ -302,8 +285,8 @@ static Bool adjustScreenPixmap(ScrnInfoPtr pScrn, int width, int height)
adjustedWidth, height, (unsigned) pVBox->cbFBMax / 1024);
return FALSE;
}
- vbvxClearVRAM(pScrn, pScrn->virtualX * pScrn->virtualY * pScrn->bitsPerPixel / 8,
- adjustedWidth * height * pScrn->bitsPerPixel / 8);
+ vbvxClearVRAM(pScrn, ((size_t)pScrn->virtualX) * pScrn->virtualY * (pScrn->bitsPerPixel / 8),
+ ((size_t)adjustedWidth) * height * (pScrn->bitsPerPixel / 8));
pScreen->ModifyPixmapHeader(pPixmap, adjustedWidth, height, pScrn->depth, pScrn->bitsPerPixel, cbLine, pVBox->base);
}
pScrn->displayWidth = pScrn->virtualX = adjustedWidth;
@@ -352,7 +335,13 @@ static void setModeRandR12(ScrnInfoPtr pScrn, unsigned cScreen)
pScrn->virtualY, pScrn->bitsPerPixel };
unsigned cFirst = cScreen;
unsigned cLast = cScreen != 0 ? cScreen + 1 : pVBox->cScreens;
+ int originalX, originalY;
+ /* Check that this code cannot trigger the resizing bug in X.Org Server 1.3.
+ * See the work-around in PreInit. */
+ xf86RandR12GetOriginalVirtualSize(pScrn, &originalX, &originalY);
+ VBVXASSERT(originalX == VBOX_VIDEO_MAX_VIRTUAL && originalY == VBOX_VIDEO_MAX_VIRTUAL, ("OriginalSize=%dx%d",
+ originalX, originalY));
for (i = cFirst; i < cLast; ++i)
if (pVBox->pScreens[i].paCrtcs->mode.HDisplay != 0 && pVBox->pScreens[i].paCrtcs->mode.VDisplay != 0)
vbvxSetMode(pScrn, i, pVBox->pScreens[i].paCrtcs->mode.HDisplay, pVBox->pScreens[i].paCrtcs->mode.VDisplay,
@@ -576,7 +565,6 @@ vbox_output_get_modes (xf86OutputPtr output)
RT_CLAMP(pVBox->pScreens[iScreen].aPreferredSize.cx, VBOX_VIDEO_MIN_SIZE, VBOX_VIDEO_MAX_VIRTUAL),
RT_CLAMP(pVBox->pScreens[iScreen].aPreferredSize.cy, VBOX_VIDEO_MIN_SIZE, VBOX_VIDEO_MAX_VIRTUAL),
TRUE, FALSE);
- // VBOXEDIDSet(output, pMode);
TRACE_EXIT();
return pModes;
}
@@ -837,9 +825,8 @@ VBOXPreInit(ScrnInfoPtr pScrn, int flags)
if (flags & PROBE_DETECT)
return (FALSE);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "VirtualBox guest additions video driver version "
- VBOX_VERSION_STRING "\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VirtualBox guest additions video driver version " VBOX_VERSION_STRING "r%d\n",
+ VBOX_SVN_REV);
/* Get our private data from the ScrnInfoRec structure. */
VBOXSetRec(pScrn);
@@ -934,9 +921,10 @@ VBOXPreInit(ScrnInfoPtr pScrn, int flags)
vboxAddModes(pScrn);
#ifdef VBOXVIDEO_13
- /* Work around a bug in the original X server modesetting code, which
- * took the first valid values set to these two as maxima over the
- * server lifetime. */
+ /* Work around a bug in the original X server modesetting code, which took
+ * the first valid values set to these two as maxima over the server
+ * lifetime. This bug was introduced on Feb 15 2007 and was fixed in commit
+ * fa877d7f three months later, so it was present in X.Org Server 1.3. */
pScrn->virtualX = VBOX_VIDEO_MAX_VIRTUAL;
pScrn->virtualY = VBOX_VIDEO_MAX_VIRTUAL;
#else
@@ -1074,23 +1062,16 @@ static void setVirtualSizeRandR12(ScrnInfoPtr pScrn, bool fLimitedContext)
}
if (cx != 0 && cy != 0)
{
- if (fLimitedContext)
- {
- pScrn->virtualX = cx;
- pScrn->virtualY = cy;
- }
- else
+ /* Do not set the virtual resolution in limited context as that can
+ * cause problems setting up RandR 1.2 which needs it set to the
+ * maximum size at this point. */
+ if (!fLimitedContext)
{
TRACE_LOG("cx=%u, cy=%u\n", cx, cy);
xf86ScrnToScreen(pScrn)->width = cx;
xf86ScrnToScreen(pScrn)->height = cy;
-#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 14
- xf86UpdateDesktopDimensions();
-#elif GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 12
- screenInfo.width = cx;
- screenInfo.height = cy;
-#endif
adjustScreenPixmap(pScrn, cx, cy);
+ vbvxSetSolarisMouseRange(cx, cy);
}
}
}
@@ -1124,16 +1105,25 @@ static void setSizesRandR12(ScrnInfoPtr pScrn, bool fLimitedContext)
{
VBOXPtr pVBox = VBOXGetRec(pScrn);
+ if (!fLimitedContext)
+ {
# if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 5
- RRGetInfo(xf86ScrnToScreen(pScrn), TRUE);
+ RRGetInfo(xf86ScrnToScreen(pScrn), TRUE);
# else
- RRGetInfo(xf86ScrnToScreen(pScrn));
+ RRGetInfo(xf86ScrnToScreen(pScrn));
# endif
+ }
setVirtualSizeRandR12(pScrn, fLimitedContext);
setScreenSizesRandR12(pScrn, fLimitedContext);
if (!fLimitedContext)
{
- RRScreenSizeNotify(xf86ScrnToScreen(pScrn));
+ /* We use RRScreenSizeSet() here and not RRScreenSizeNotify() because
+ * the first also pushes the virtual screen size to the input driver.
+ * We were doing this manually by setting screenInfo.width and height
+ * and calling xf86UpdateDesktopDimensions() where appropriate, but this
+ * failed on Ubuntu 12.04.0 due to a problematic X server back-port. */
+ RRScreenSizeSet(xf86ScrnToScreen(pScrn), xf86ScrnToScreen(pScrn)->width, xf86ScrnToScreen(pScrn)->height,
+ xf86ScrnToScreen(pScrn)->mmWidth, xf86ScrnToScreen(pScrn)->mmHeight);
RRTellChanged(xf86ScrnToScreen(pScrn));
}
}
@@ -1156,7 +1146,7 @@ static void setSizesRandR11(ScrnInfoPtr pScrn, bool fLimitedContext)
static void setSizesAndCursorIntegration(ScrnInfoPtr pScrn, bool fScreenInitTime)
{
VBOXPtr pVBox = VBOXGetRec(pScrn);
-
+
TRACE_LOG("fScreenInitTime=%d\n", (int)fScreenInitTime);
#ifdef VBOXVIDEO_13
setSizesRandR12(pScrn, fScreenInitTime);
@@ -1369,7 +1359,7 @@ static Bool VBOXScreenInit(ScreenPtr pScreen, int argc, char **argv)
if (serverGeneration == 1)
xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options);
- if (vbox_cursor_init(pScreen) != TRUE)
+ if (vbvxCursorInit(pScreen) != TRUE)
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Unable to start the VirtualBox mouse pointer integration with the host system.\n");
@@ -1430,7 +1420,7 @@ static void VBOXLeaveVT(ScrnInfoPtr pScrn)
vbox_crtc_dpms(pVBox->pScreens[i].paCrtcs, DPMSModeOff);
#endif
vboxDisableVbva(pScrn);
- vbvxClearVRAM(pScrn, pScrn->virtualX * pScrn->virtualY * pScrn->bitsPerPixel / 8, 0);
+ vbvxClearVRAM(pScrn, ((size_t)pScrn->virtualX) * pScrn->virtualY * (pScrn->bitsPerPixel / 8), 0);
#ifdef VBOX_DRI_OLD
if (pVBox->useDRI)
DRILock(xf86ScrnToScreen(pScrn), 0);
@@ -1461,7 +1451,7 @@ static Bool VBOXCloseScreen(ScreenPtr pScreen)
vbox_crtc_dpms(pVBox->pScreens[i].paCrtcs, DPMSModeOff);
#endif
vboxDisableVbva(pScrn);
- vbvxClearVRAM(pScrn, pScrn->virtualX * pScrn->virtualY * pScrn->bitsPerPixel / 8, 0);
+ vbvxClearVRAM(pScrn, ((size_t)pScrn->virtualX) * pScrn->virtualY * (pScrn->bitsPerPixel / 8), 0);
}
#ifdef VBOX_DRI
# ifndef VBOX_DRI_OLD /* DRI2 */
@@ -1483,8 +1473,7 @@ static Bool VBOXCloseScreen(ScreenPtr pScreen)
VBOXUnmapVidMem(pScrn);
pScrn->vtSema = FALSE;
- /* Do additional bits which are separate for historical reasons */
- vbox_close(pScrn, pVBox);
+ vbvxCursorTerm(pVBox);
pScreen->CloseScreen = pVBox->CloseScreen;
#if defined(VBOXVIDEO_13) && defined(RT_OS_LINUX)
diff --git a/src/VBox/Additions/x11/vboxvideo/vboxvideo.h b/src/VBox/Additions/x11/vboxvideo/vboxvideo.h
index e0f331b..9f265e4 100644
--- a/src/VBox/Additions/x11/vboxvideo/vboxvideo.h
+++ b/src/VBox/Additions/x11/vboxvideo/vboxvideo.h
@@ -1,3 +1,4 @@
+/* $Id: vboxvideo.h $ */
/** @file
*
* VirtualBox X11 Additions graphics driver
@@ -54,6 +55,7 @@
#include <VBox/VBoxVideoGuest.h>
#include <VBox/VBoxVideo.h>
+#include "version-generated.h"
#ifndef VBVA_SCREEN_F_BLANK
# define VBVA_SCREEN_F_BLANK 0x0004
@@ -106,7 +108,7 @@ if (!(expr)) \
#include "xf86str.h"
#include "xf86Cursor.h"
-#define VBOX_VERSION 4000 /* Why? */
+#define VBOX_VERSION VBOX_VERSION_MAJOR * 10000 + VBOX_VERSION_MINOR * 100 + VBOX_VERSION_BUILD
#define VBOX_NAME "VBoxVideo"
#define VBOX_DRIVER_NAME "vboxvideo"
@@ -127,8 +129,8 @@ extern void GlxSetVisualConfigs(int nconfigs, __GLXvisualConfig *configs,
void **configprivs);
#endif
-#define VBOX_VIDEO_MAJOR 1
-#define VBOX_VIDEO_MINOR 0
+#define VBOX_VIDEO_MAJOR VBOX_VERSION_MAJOR
+#define VBOX_VIDEO_MINOR VBOX_VERSION_MINOR
#define VBOX_DRM_DRIVER_NAME "vboxvideo" /* For now, as this driver is basically a stub. */
#define VBOX_DRI_DRIVER_NAME "vboxvideo" /* For starters. */
#define VBOX_MAX_DRAWABLES 256 /* At random. */
@@ -267,9 +269,9 @@ extern void vbvxSetMode(ScrnInfoPtr pScrn, unsigned cDisplay, unsigned cWidth, u
bool fConnected, struct vbvxFrameBuffer *pFrameBuffer);
extern void vbvxSetSolarisMouseRange(int width, int height);
-/* pointer.c */
-extern Bool vbox_cursor_init (ScreenPtr pScreen);
-extern void vbox_close (ScrnInfoPtr pScrn, VBOXPtr pVBox);
+/* pointer.h */
+extern Bool vbvxCursorInit(ScreenPtr pScreen);
+extern void vbvxCursorTerm(VBOXPtr pVBox);
/* vbva.c */
extern void vbvxHandleDirtyRect(ScrnInfoPtr pScrn, int iRects, BoxPtr aRects);
diff --git a/src/VBox/Additions/x11/vboxvideo/vbva.c b/src/VBox/Additions/x11/vboxvideo/vbva.c
index 1e5b326..5ed517f 100644
--- a/src/VBox/Additions/x11/vboxvideo/vbva.c
+++ b/src/VBox/Additions/x11/vboxvideo/vbva.c
@@ -1,3 +1,4 @@
+/* $Id: vbva.c $ */
/** @file
* VirtualBox X11 Additions graphics driver 2D acceleration functions
*/
diff --git a/src/VBox/Devices/Audio/AudioMixBuffer.cpp b/src/VBox/Devices/Audio/AudioMixBuffer.cpp
index 50e89bb..493b49d 100644
--- a/src/VBox/Devices/Audio/AudioMixBuffer.cpp
+++ b/src/VBox/Devices/Audio/AudioMixBuffer.cpp
@@ -57,6 +57,76 @@
# endif
#endif
+
+/*
+ * Soft Volume Control
+ *
+ * The external code supplies an 8-bit volume (attenuation) value in the
+ * 0 .. 255 range. This represents 0 to -96dB attenuation where an input
+ * value of 0 corresponds to -96dB and 255 corresponds to 0dB (unchanged).
+ *
+ * Each step thus correspons to 96 / 256 or 0.375dB. Every 6dB (16 steps)
+ * represents doubling the sample value.
+ *
+ * For internal use, the volume control needs to be converted to a 16-bit
+ * (sort of) exponential value between 1 and 65536. This is used with fixed
+ * point arithmetic such that 65536 means 1.0 and 1 means 1/65536.
+ *
+ * For actual volume calculation, 33.31 fixed point is used. Maximum (or
+ * unattenuated) volume is represented as 0x40000000; conveniently, this
+ * value fits into a uint32_t.
+ *
+ * To enable fast processing, the maximum volume must be a power of two
+ * and must not have a sign when converted to int32_t. While 0x80000000
+ * violates these constraints, 0x40000000 does not.
+ */
+
+
+/** Logarithmic/exponential volume conversion table. */
+uint32_t aVolumeConv[256] = {
+ 1, 1, 1, 1, 1, 1, 1, 1, /* 7 */
+ 1, 2, 2, 2, 2, 2, 2, 2, /* 15 */
+ 2, 2, 2, 2, 2, 3, 3, 3, /* 23 */
+ 3, 3, 3, 3, 4, 4, 4, 4, /* 31 */
+ 4, 4, 5, 5, 5, 5, 5, 6, /* 39 */
+ 6, 6, 6, 7, 7, 7, 8, 8, /* 47 */
+ 8, 9, 9, 10, 10, 10, 11, 11, /* 55 */
+ 12, 12, 13, 13, 14, 15, 15, 16, /* 63 */
+ 17, 17, 18, 19, 20, 21, 22, 23, /* 71 */
+ 24, 25, 26, 27, 28, 29, 31, 32, /* 79 */
+ 33, 35, 36, 38, 40, 41, 43, 45, /* 87 */
+ 47, 49, 52, 54, 56, 59, 61, 64, /* 95 */
+ 67, 70, 73, 76, 79, 83, 87, 91, /* 103 */
+ 95, 99, 103, 108, 112, 117, 123, 128, /* 111 */
+ 134, 140, 146, 152, 159, 166, 173, 181, /* 119 */
+ 189, 197, 206, 215, 225, 235, 245, 256, /* 127 */
+ 267, 279, 292, 304, 318, 332, 347, 362, /* 135 */
+ 378, 395, 412, 431, 450, 470, 490, 512, /* 143 */
+ 535, 558, 583, 609, 636, 664, 693, 724, /* 151 */
+ 756, 790, 825, 861, 899, 939, 981, 1024, /* 159 */
+ 1069, 1117, 1166, 1218, 1272, 1328, 1387, 1448, /* 167 */
+ 1512, 1579, 1649, 1722, 1798, 1878, 1961, 2048, /* 175 */
+ 2139, 2233, 2332, 2435, 2543, 2656, 2774, 2896, /* 183 */
+ 3025, 3158, 3298, 3444, 3597, 3756, 3922, 4096, /* 191 */
+ 4277, 4467, 4664, 4871, 5087, 5312, 5547, 5793, /* 199 */
+ 6049, 6317, 6597, 6889, 7194, 7512, 7845, 8192, /* 207 */
+ 8555, 8933, 9329, 9742, 10173, 10624, 11094, 11585, /* 215 */
+ 12098, 12634, 13193, 13777, 14387, 15024, 15689, 16384, /* 223 */
+ 17109, 17867, 18658, 19484, 20347, 21247, 22188, 23170, /* 231 */
+ 24196, 25268, 26386, 27554, 28774, 30048, 31379, 32768, /* 239 */
+ 34219, 35734, 37316, 38968, 40693, 42495, 44376, 46341, /* 247 */
+ 48393, 50535, 52773, 55109, 57549, 60097, 62757, 65536, /* 255 */
+};
+
+/* Bit shift for fixed point conversion. */
+#define VOL_SHIFT 30
+
+/* Internal representation of 0dB volume (1.0 in fixed point). */
+#define VOL_0DB (1 << VOL_SHIFT)
+
+AssertCompile(VOL_0DB <= 0x40000000); /* Must always hold. */
+AssertCompile(VOL_0DB == 0x40000000); /* For now -- when only attenuation is used. */
+
/**
* Structure for holding sample conversion parameters for
* the audioMixBufConvFromXXX / audioMixBufConvToXXX macros.
@@ -89,7 +159,7 @@ static uint64_t s_cSamplesMixedTotal = 0;
static void audioMixBufFreeBuf(PPDMAUDIOMIXBUF pMixBuf);
static inline void audioMixBufPrint(PPDMAUDIOMIXBUF pMixBuf);
-typedef uint32_t (AUDMIXBUF_FN_CONVFROM) (PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, const PAUDMIXBUF_CONVOPTS pOpts);
+typedef uint32_t (AUDMIXBUF_FN_CONVFROM) (PPDMAUDIOSAMPLE paDst, const void *pvSrc, uint32_t cbSrc, const PAUDMIXBUF_CONVOPTS pOpts);
typedef AUDMIXBUF_FN_CONVFROM *PAUDMIXBUF_FN_CONVFROM;
typedef void (AUDMIXBUF_FN_CONVTO) (void *pvDst, const PPDMAUDIOSAMPLE paSrc, const PAUDMIXBUF_CONVOPTS pOpts);
@@ -230,7 +300,7 @@ uint32_t audioMixBufFree(PPDMAUDIOMIXBUF pMixBuf)
return cFree;
}
-size_t audioMixBufFreeBytes(PPDMAUDIOMIXBUF pMixBuf)
+uint32_t audioMixBufFreeBytes(PPDMAUDIOMIXBUF pMixBuf)
{
return AUDIOMIXBUF_S2B(pMixBuf, audioMixBufFree(pMixBuf));
}
@@ -271,7 +341,7 @@ static int audioMixBufAllocBuf(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples)
* Be careful what to pass in/out, as most of the macros are optimized for speed and
* thus don't do any bounds checking!
*
- * Note: Currently does not handle any endianess conversion yet!
+ * Note: Currently does not handle any endianness conversion yet!
*/
#define AUDMIXBUF_CONVERT(_aName, _aType, _aMin, _aMax, _aSigned, _aShift) \
/* Clips a specific output value to a single sample value. */ \
@@ -279,23 +349,23 @@ static int audioMixBufAllocBuf(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples)
{ \
if (_aSigned) \
return ((int64_t) aVal) << (32 - _aShift); \
- return ((int64_t) aVal - (_aMax >> 1)) << (32 - _aShift); \
+ return ((int64_t) aVal - ((_aMax >> 1) + 1)) << (32 - _aShift); \
} \
\
/* Clips a single sample value to a specific output value. */ \
AUDMIXBUF_MACRO_FN _aType audioMixBufClipTo##_aName(int64_t iVal) \
{ \
- if (iVal >= 0x7f000000) \
+ if (iVal >= 0x7fffffff) \
return _aMax; \
- else if (iVal < -2147483648LL) \
+ else if (iVal < -INT64_C(0x80000000)) \
return _aMin; \
\
if (_aSigned) \
return (_aType) (iVal >> (32 - _aShift)); \
- return ((_aType) ((iVal >> (32 - _aShift)) + (_aMax >> 1))); \
+ return ((_aType) ((iVal >> (32 - _aShift)) + ((_aMax >> 1) + 1))); \
} \
\
- AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Stereo(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, \
+ AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Stereo(PPDMAUDIOSAMPLE paDst, const void *pvSrc, uint32_t cbSrc, \
const PAUDMIXBUF_CONVOPTS pOpts) \
{ \
_aType *pSrc = (_aType *)pvSrc; \
@@ -305,26 +375,28 @@ static int audioMixBufAllocBuf(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples)
for (uint32_t i = 0; i < cSamples; i++) \
{ \
AUDMIXBUF_MACRO_LOG(("%p: l=%RI16, r=%RI16\n", paDst, *pSrc, *(pSrc + 1))); \
- paDst->u64LSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uLeft ) >> 31); \
- paDst->u64RSample = (ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uRight) >> 31); \
- AUDMIXBUF_MACRO_LOG(("\t-> l=%RI64, r=%RI64\n", paDst->u64LSample, paDst->u64RSample)); \
+ paDst->i64LSample = ASMMult2xS32RetS64((int32_t)audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uLeft ) >> VOL_SHIFT; \
+ paDst->i64RSample = ASMMult2xS32RetS64((int32_t)audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uRight) >> VOL_SHIFT; \
+ AUDMIXBUF_MACRO_LOG(("\t-> l=%RI64, r=%RI64\n", paDst->i64LSample, paDst->i64RSample)); \
paDst++; \
} \
\
return cSamples; \
} \
\
- AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Mono(PPDMAUDIOSAMPLE paDst, const void *pvSrc, size_t cbSrc, \
+ AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFrom##_aName##Mono(PPDMAUDIOSAMPLE paDst, const void *pvSrc, uint32_t cbSrc, \
const PAUDMIXBUF_CONVOPTS pOpts) \
{ \
_aType *pSrc = (_aType *)pvSrc; \
uint32_t cSamples = (uint32_t)RT_MIN(pOpts->cSamples, cbSrc / sizeof(_aType)); \
- AUDMIXBUF_MACRO_LOG(("cSamples=%RU32, sizeof(%zu)\n", cSamples, sizeof(_aType))); \
+ AUDMIXBUF_MACRO_LOG(("cSamples=%RU32, sizeof(%zu), lVol=%RU32, rVol=%RU32\n", \
+ cSamples, sizeof(_aType), pOpts->Volume.uLeft, pOpts->Volume.uRight)); \
for (uint32_t i = 0; i < cSamples; i++) \
{ \
- paDst->u64LSample = ASMMult2xS32RetS64(audioMixBufClipFrom##_aName(pSrc[0]), pOpts->Volume.uLeft); \
- paDst->u64RSample = paDst->u64LSample; \
- pSrc++; \
+ AUDMIXBUF_MACRO_LOG(("%p: s=%RI16\n", paDst, *pSrc)); \
+ paDst->i64LSample = ASMMult2xS32RetS64((int32_t)audioMixBufClipFrom##_aName(*pSrc++), pOpts->Volume.uLeft) >> VOL_SHIFT; \
+ paDst->i64RSample = paDst->i64LSample; \
+ AUDMIXBUF_MACRO_LOG(("\t-> l=%RI64, r=%RI64\n", paDst->i64LSample, paDst->i64RSample)); \
paDst++; \
} \
\
@@ -340,9 +412,9 @@ static int audioMixBufAllocBuf(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples)
uint32_t cSamples = pOpts->cSamples; \
while (cSamples--) \
{ \
- AUDMIXBUF_MACRO_LOG(("%p: l=%RI64, r=%RI64\n", pSrc, pSrc->u64LSample, pSrc->u64RSample)); \
- l = audioMixBufClipTo##_aName(pSrc->u64LSample); \
- r = audioMixBufClipTo##_aName(pSrc->u64RSample); \
+ AUDMIXBUF_MACRO_LOG(("%p: l=%RI64, r=%RI64\n", pSrc, pSrc->i64LSample, pSrc->i64RSample)); \
+ l = audioMixBufClipTo##_aName(pSrc->i64LSample); \
+ r = audioMixBufClipTo##_aName(pSrc->i64RSample); \
AUDMIXBUF_MACRO_LOG(("\t-> l=%RI16, r=%RI16\n", l, r)); \
*pDst++ = l; \
*pDst++ = r; \
@@ -358,7 +430,7 @@ static int audioMixBufAllocBuf(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples)
uint32_t cSamples = pOpts->cSamples; \
while (cSamples--) \
{ \
- *pDst++ = audioMixBufClipTo##_aName(pSrc->u64LSample + pSrc->u64RSample); \
+ *pDst++ = audioMixBufClipTo##_aName((pSrc->i64LSample + pSrc->i64RSample) / 2); \
pSrc++; \
} \
}
@@ -385,8 +457,9 @@ AUDMIXBUF_CONVERT(U32 /* Name */, uint32_t, 0 /* Min */, UINT32_MAX /* M
uint32_t *pcDstWritten, uint32_t *pcSrcRead) \
{ \
AUDMIXBUF_MACRO_LOG(("cSrcSamples=%RU32, cDstSamples=%RU32\n", cSrcSamples, cDstSamples)); \
- AUDMIXBUF_MACRO_LOG(("pRate=%p: srcOffset=0x%x (%RU32), dstOffset=0x%x (%RU32), dstInc=0x%x (%RU64)\n", \
- pRate, pRate->srcOffset, pRate->srcOffset, pRate->dstOffset >> 32, pRate->dstOffset >> 32, \
+ AUDMIXBUF_MACRO_LOG(("pRate=%p: srcOffset=0x%RX32 (%RU32), dstOffset=0x%RX32 (%RU32), dstInc=0x%RX64 (%RU64)\n", \
+ pRate, pRate->srcOffset, pRate->srcOffset, \
+ (uint32_t)(pRate->dstOffset >> 32), (uint32_t)(pRate->dstOffset >> 32), \
pRate->dstInc, pRate->dstInc)); \
\
if (pRate->dstInc == (UINT64_C(1) + UINT32_MAX)) /* No conversion needed? */ \
@@ -395,8 +468,8 @@ AUDMIXBUF_CONVERT(U32 /* Name */, uint32_t, 0 /* Min */, UINT32_MAX /* M
AUDMIXBUF_MACRO_LOG(("cSamples=%RU32\n", cSamples)); \
for (uint32_t i = 0; i < cSamples; i++) \
{ \
- paDst[i].u64LSample _aOp paSrc[i].u64LSample; \
- paDst[i].u64RSample _aOp paSrc[i].u64RSample; \
+ paDst[i].i64LSample _aOp paSrc[i].i64LSample; \
+ paDst[i].i64RSample _aOp paSrc[i].i64RSample; \
} \
\
if (pcDstWritten) \
@@ -445,21 +518,21 @@ AUDMIXBUF_CONVERT(U32 /* Name */, uint32_t, 0 /* Min */, UINT32_MAX /* M
/* Interpolate. */ \
int64_t iDstOffInt = pRate->dstOffset & UINT32_MAX; \
\
- samOut.u64LSample = (samLast.u64LSample * ((int64_t) UINT32_MAX - iDstOffInt) + samCur.u64LSample * iDstOffInt) >> 32; \
- samOut.u64RSample = (samLast.u64RSample * ((int64_t) UINT32_MAX - iDstOffInt) + samCur.u64RSample * iDstOffInt) >> 32; \
+ samOut.i64LSample = (samLast.i64LSample * ((int64_t) (INT64_C(1) << 32) - iDstOffInt) + samCur.i64LSample * iDstOffInt) >> 32; \
+ samOut.i64RSample = (samLast.i64RSample * ((int64_t) (INT64_C(1) << 32) - iDstOffInt) + samCur.i64RSample * iDstOffInt) >> 32; \
\
- paDst->u64LSample _aOp samOut.u64LSample; \
- paDst->u64RSample _aOp samOut.u64RSample; \
- paDst++; \
+ paDst->i64LSample _aOp samOut.i64LSample; \
+ paDst->i64RSample _aOp samOut.i64RSample; \
\
- AUDMIXBUF_MACRO_LOG(("\tlDelta=0x%x (%RU64), iDstOffInt=0x%x (%RI64), l=%RI64, r=%RI64 (cur l=%RI64, r=%RI64)\n", \
+ AUDMIXBUF_MACRO_LOG(("\tlDelta=0x%RX64 (%RU64), iDstOffInt=0x%RX64 (%RI64), l=%RI64, r=%RI64 (cur l=%RI64, r=%RI64)\n", \
lDelta, lDelta, iDstOffInt, iDstOffInt, \
- paDst->u64LSample, paDst->u64RSample, \
- samCur.u64LSample, samCur.u64RSample)); \
+ paDst->i64LSample, paDst->i64RSample, \
+ samCur.i64LSample, samCur.i64RSample)); \
\
+ paDst++; \
pRate->dstOffset += pRate->dstInc; \
\
- AUDMIXBUF_MACRO_LOG(("\t\tpRate->dstOffset=0x%x (%RU32)\n", pRate->dstOffset, pRate->dstOffset >> 32)); \
+ AUDMIXBUF_MACRO_LOG(("\t\tpRate->dstOffset=0x%RX32 (%RU32)\n", pRate->dstOffset, pRate->dstOffset >> 32)); \
\
} \
\
@@ -468,8 +541,8 @@ AUDMIXBUF_CONVERT(U32 /* Name */, uint32_t, 0 /* Min */, UINT32_MAX /* M
\
pRate->srcSampleLast = samLast; \
\
- AUDMIXBUF_MACRO_LOG(("pRate->srcSampleLast l=%RI64, r=%RI64, lDelta=0x%x (%RU64)\n", \
- pRate->srcSampleLast.u64LSample, pRate->srcSampleLast.u64RSample, lDelta, lDelta)); \
+ AUDMIXBUF_MACRO_LOG(("pRate->srcSampleLast l=%RI64, r=%RI64, lDelta=0x%RX64 (%RU64)\n", \
+ pRate->srcSampleLast.i64LSample, pRate->srcSampleLast.i64RSample, lDelta, lDelta)); \
\
if (pcDstWritten) \
*pcDstWritten = paDst - paDstStart; \
@@ -485,16 +558,28 @@ AUDMIXBUF_MIXOP(Blend /* Name */, += /* Operation */)
#undef AUDMIXBUF_MIXOP
#undef AUDMIXBUF_MACRO_LOG
+/** Dummy conversion used when the source is muted. */
+AUDMIXBUF_MACRO_FN uint32_t audioMixBufConvFromSilence(PPDMAUDIOSAMPLE paDst, const void *pvSrc,
+ uint32_t cbSrc, const PAUDMIXBUF_CONVOPTS pOpts)
+{
+ /* Internally zero always corresponds to silence. */
+ memset(paDst, 0, pOpts->cSamples * sizeof(paDst[0]));
+ return pOpts->cSamples;
+}
+
/**
*
** @todo Speed up the lookup by binding it to the actual stream state.
*
- * @return IPRT status code.
* @return PAUDMIXBUF_FN_CONVFROM
- * @param enmFmt
+ * @param enmFmt The source audio stream format
+ * @param fMuted Flag determining whether the source is muted
*/
-static inline PAUDMIXBUF_FN_CONVFROM audioMixBufConvFromLookup(PDMAUDIOMIXBUFFMT enmFmt)
+static inline PAUDMIXBUF_FN_CONVFROM audioMixBufConvFromLookup(PDMAUDIOMIXBUFFMT enmFmt, bool fMuted)
{
+ if (fMuted)
+ return audioMixBufConvFromSilence;
+
if (AUDMIXBUF_FMT_SIGNED(enmFmt))
{
if (AUDMIXBUF_FMT_CHANNELS(enmFmt) == 2)
@@ -636,8 +721,8 @@ int audioMixBufInit(PPDMAUDIOMIXBUF pMixBuf, const char *pszName, PPDMPCMPROPS p
/* Set initial volume to max. */
pMixBuf->Volume.fMuted = false;
- pMixBuf->Volume.uLeft = 0x7F;
- pMixBuf->Volume.uRight = 0x7F;
+ pMixBuf->Volume.uLeft = VOL_0DB;
+ pMixBuf->Volume.uRight = VOL_0DB;
/* Prevent division by zero.
* Do a 1:1 conversion according to AUDIOMIXBUF_S2B_RATIO. */
@@ -702,8 +787,8 @@ int audioMixBufLinkTo(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOMIXBUF pParent)
if (pMixBuf->iFreqRatio == 0) /* Catch division by zero. */
pMixBuf->iFreqRatio = 1 << 20; /* Do a 1:1 conversion instead. */
- uint32_t cSamples = RT_MIN( ((uint64_t)pParent->cSamples << 32)
- / pMixBuf->iFreqRatio, _64K /* 64K samples max. */);
+ uint32_t cSamples = (uint32_t)RT_MIN( ((uint64_t)pParent->cSamples << 32)
+ / pMixBuf->iFreqRatio, _64K /* 64K samples max. */);
if (!cSamples)
cSamples = pParent->cSamples;
@@ -745,7 +830,7 @@ int audioMixBufLinkTo(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOMIXBUF pParent)
pMixBuf->pRate->dstInc = ((uint64_t)AUDMIXBUF_FMT_SAMPLE_FREQ(pMixBuf->AudioFmt) << 32)
/ AUDMIXBUF_FMT_SAMPLE_FREQ(pParent->AudioFmt);
- AUDMIXBUF_LOG(("uThisHz=%RU32, uParentHz=%RU32, iFreqRatio=0x%x (%RI64), uRateInc=0x%x (%RU64), cSamples=%RU32 (%RU32 parent)\n",
+ AUDMIXBUF_LOG(("uThisHz=%RU32, uParentHz=%RU32, iFreqRatio=0x%RX64 (%RI64), uRateInc=0x%RX64 (%RU64), cSamples=%RU32 (%RU32 parent)\n",
AUDMIXBUF_FMT_SAMPLE_FREQ(pMixBuf->AudioFmt),
AUDMIXBUF_FMT_SAMPLE_FREQ(pParent->AudioFmt),
pMixBuf->iFreqRatio, pMixBuf->iFreqRatio,
@@ -790,7 +875,7 @@ static int audioMixBufMixTo(PPDMAUDIOMIXBUF pDst, PPDMAUDIOMIXBUF pSrc, uint32_t
* samples of the source buffer. */
uint32_t cDead = pDst->cSamples - cLive;
- uint32_t cToReadTotal = RT_MIN(cSamples, AUDIOMIXBUF_S2S_RATIO(pSrc, cDead));
+ uint32_t cToReadTotal = (uint32_t)RT_MIN(cSamples, AUDIOMIXBUF_S2S_RATIO(pSrc, cDead));
uint32_t offRead = 0;
uint32_t cReadTotal = 0;
@@ -931,7 +1016,7 @@ uint32_t audioMixBufProcessed(PPDMAUDIOMIXBUF pMixBuf)
int audioMixBufReadAt(PPDMAUDIOMIXBUF pMixBuf,
uint32_t offSamples,
- void *pvBuf, size_t cbBuf,
+ void *pvBuf, uint32_t cbBuf,
uint32_t *pcbRead)
{
return audioMixBufReadAtEx(pMixBuf, pMixBuf->AudioFmt,
@@ -940,7 +1025,7 @@ int audioMixBufReadAt(PPDMAUDIOMIXBUF pMixBuf,
int audioMixBufReadAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
uint32_t offSamples,
- void *pvBuf, size_t cbBuf,
+ void *pvBuf, uint32_t cbBuf,
uint32_t *pcbRead)
{
AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER);
@@ -951,7 +1036,7 @@ int audioMixBufReadAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
uint32_t cLive = pMixBuf->cProcessed;
uint32_t cDead = cDstSamples - cLive;
- uint32_t cToProcess = AUDIOMIXBUF_S2S_RATIO(pMixBuf, cDead);
+ uint32_t cToProcess = (uint32_t)AUDIOMIXBUF_S2S_RATIO(pMixBuf, cDead);
cToProcess = RT_MIN(cToProcess, AUDIOMIXBUF_B2S(pMixBuf, cbBuf));
AUDMIXBUF_LOG(("%s: offSamples=%RU32, cLive=%RU32, cDead=%RU32, cToProcess=%RU32\n",
@@ -987,14 +1072,14 @@ int audioMixBufReadAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
}
int audioMixBufReadCirc(PPDMAUDIOMIXBUF pMixBuf,
- void *pvBuf, size_t cbBuf, uint32_t *pcRead)
+ void *pvBuf, uint32_t cbBuf, uint32_t *pcRead)
{
return audioMixBufReadCircEx(pMixBuf, pMixBuf->AudioFmt,
pvBuf, cbBuf, pcRead);
}
int audioMixBufReadCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
- void *pvBuf, size_t cbBuf, uint32_t *pcRead)
+ void *pvBuf, uint32_t cbBuf, uint32_t *pcRead)
{
AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER);
AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
@@ -1023,10 +1108,10 @@ int audioMixBufReadCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
return VERR_NOT_SUPPORTED;
PPDMAUDIOSAMPLE pSamplesSrc1 = pMixBuf->pSamples + pMixBuf->offReadWrite;
- size_t cLenSrc1 = cToRead;
+ uint32_t cLenSrc1 = cToRead;
PPDMAUDIOSAMPLE pSamplesSrc2 = NULL;
- size_t cLenSrc2 = 0;
+ uint32_t cLenSrc2 = 0;
uint32_t offRead = pMixBuf->offReadWrite + cToRead;
@@ -1123,10 +1208,11 @@ void audioMixBufSetVolume(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOVOLUME pVol)
LogFlowFunc(("%s: lVol=%RU32, rVol=%RU32\n", pMixBuf->pszName, pVol->uLeft, pVol->uRight));
pMixBuf->Volume.fMuted = pVol->fMuted;
- pMixBuf->Volume.uLeft = (UINT64_C(0x100000000) * pVol->uLeft) / 255;
- pMixBuf->Volume.uRight = (UINT64_C(0x100000000) * pVol->uRight) / 255;
+ //@todo: Ensure that the input is in the correct range/initialized!
+ pMixBuf->Volume.uLeft = aVolumeConv[pVol->uLeft & 0xFF] * (VOL_0DB >> 16);
+ pMixBuf->Volume.uRight = aVolumeConv[pVol->uRight & 0xFF] * (VOL_0DB >> 16);
- LogFlowFunc(("\t-> lVol=%RU32, rVol=%RU32\n", pMixBuf->Volume.uLeft, pMixBuf->Volume.uRight));
+ LogFlowFunc(("\t-> lVol=%#RX32, rVol=%#RX32\n", pMixBuf->Volume.uLeft, pMixBuf->Volume.uRight));
}
uint32_t audioMixBufSize(PPDMAUDIOMIXBUF pMixBuf)
@@ -1140,7 +1226,7 @@ uint32_t audioMixBufSize(PPDMAUDIOMIXBUF pMixBuf)
* @return uint32_t
* @param pMixBuf
*/
-size_t audioMixBufSizeBytes(PPDMAUDIOMIXBUF pMixBuf)
+uint32_t audioMixBufSizeBytes(PPDMAUDIOMIXBUF pMixBuf)
{
return AUDIOMIXBUF_S2B(pMixBuf, pMixBuf->cSamples);
}
@@ -1189,7 +1275,7 @@ void audioMixBufUnlink(PPDMAUDIOMIXBUF pMixBuf)
int audioMixBufWriteAt(PPDMAUDIOMIXBUF pMixBuf,
uint32_t offSamples,
- const void *pvBuf, size_t cbBuf,
+ const void *pvBuf, uint32_t cbBuf,
uint32_t *pcWritten)
{
return audioMixBufWriteAtEx(pMixBuf, pMixBuf->AudioFmt,
@@ -1210,7 +1296,7 @@ int audioMixBufWriteAt(PPDMAUDIOMIXBUF pMixBuf,
*/
int audioMixBufWriteAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
uint32_t offSamples,
- const void *pvBuf, size_t cbBuf,
+ const void *pvBuf, uint32_t cbBuf,
uint32_t *pcWritten)
{
AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER);
@@ -1222,7 +1308,7 @@ int audioMixBufWriteAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
uint32_t cLive = pMixBuf->cProcessed;
uint32_t cDead = cDstSamples - cLive;
- uint32_t cToProcess = AUDIOMIXBUF_S2S_RATIO(pMixBuf, cDead);
+ uint32_t cToProcess = (uint32_t)AUDIOMIXBUF_S2S_RATIO(pMixBuf, cDead);
cToProcess = RT_MIN(cToProcess, AUDIOMIXBUF_B2S(pMixBuf, cbBuf));
AUDMIXBUF_LOG(("%s: offSamples=%RU32, cLive=%RU32, cDead=%RU32, cToProcess=%RU32\n",
@@ -1231,7 +1317,7 @@ int audioMixBufWriteAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
if (offSamples + cToProcess > pMixBuf->cSamples)
return VERR_BUFFER_OVERFLOW;
- PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt);
+ PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt, pMixBuf->Volume.fMuted);
if (!pConv)
return VERR_NOT_SUPPORTED;
@@ -1275,14 +1361,14 @@ int audioMixBufWriteAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
}
int audioMixBufWriteCirc(PPDMAUDIOMIXBUF pMixBuf,
- const void *pvBuf, size_t cbBuf,
+ const void *pvBuf, uint32_t cbBuf,
uint32_t *pcWritten)
{
return audioMixBufWriteCircEx(pMixBuf, pMixBuf->AudioFmt, pvBuf, cbBuf, pcWritten);
}
int audioMixBufWriteCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
- const void *pvBuf, size_t cbBuf,
+ const void *pvBuf, uint32_t cbBuf,
uint32_t *pcWritten)
{
AssertPtrReturn(pMixBuf, VERR_INVALID_POINTER);
@@ -1313,7 +1399,7 @@ int audioMixBufWriteCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
return VINF_SUCCESS;
}
- PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt);
+ PAUDMIXBUF_FN_CONVFROM pConv = audioMixBufConvFromLookup(enmFmt, pMixBuf->Volume.fMuted);
if (!pConv)
return VERR_NOT_SUPPORTED;
@@ -1323,10 +1409,10 @@ int audioMixBufWriteCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt,
AssertMsg(cToWrite, ("cToWrite is 0 (cbBuf=%zu)\n", cbBuf));
PPDMAUDIOSAMPLE pSamplesDst1 = pMixBuf->pSamples + pMixBuf->offReadWrite;
- size_t cLenDst1 = cToWrite;
+ uint32_t cLenDst1 = cToWrite;
PPDMAUDIOSAMPLE pSamplesDst2 = NULL;
- size_t cLenDst2 = 0;
+ uint32_t cLenDst2 = 0;
uint32_t offWrite = pMixBuf->offReadWrite + cToWrite;
diff --git a/src/VBox/Devices/Audio/AudioMixBuffer.h b/src/VBox/Devices/Audio/AudioMixBuffer.h
index 791344c..a2e3207 100644
--- a/src/VBox/Devices/Audio/AudioMixBuffer.h
+++ b/src/VBox/Devices/Audio/AudioMixBuffer.h
@@ -53,7 +53,7 @@ inline uint32_t audioMixBufBytesToSamples(PPDMAUDIOMIXBUF pMixBuf);
void audioMixBufDestroy(PPDMAUDIOMIXBUF pMixBuf);
void audioMixBufFinish(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamplesToClear);
uint32_t audioMixBufFree(PPDMAUDIOMIXBUF pMixBuf);
-size_t audioMixBufFreeBytes(PPDMAUDIOMIXBUF pMixBuf);
+uint32_t audioMixBufFreeBytes(PPDMAUDIOMIXBUF pMixBuf);
int audioMixBufInit(PPDMAUDIOMIXBUF pMixBuf, const char *pszName, PPDMPCMPROPS pProps, uint32_t cSamples);
bool audioMixBufIsEmpty(PPDMAUDIOMIXBUF pMixBuf);
int audioMixBufLinkTo(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOMIXBUF pParent);
@@ -61,19 +61,19 @@ uint32_t audioMixBufMixed(PPDMAUDIOMIXBUF pMixBuf);
int audioMixBufMixToChildren(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples, uint32_t *pcProcessed);
int audioMixBufMixToParent(PPDMAUDIOMIXBUF pMixBuf, uint32_t cSamples, uint32_t *pcProcessed);
uint32_t audioMixBufProcessed(PPDMAUDIOMIXBUF pMixBuf);
-int audioMixBufReadAt(PPDMAUDIOMIXBUF pMixBuf, uint32_t offSamples, void *pvBuf, size_t cbBuf, uint32_t *pcbRead);
-int audioMixBufReadAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, uint32_t offSamples, void *pvBuf, size_t cbBuf, uint32_t *pcbRead);
-int audioMixBufReadCirc(PPDMAUDIOMIXBUF pMixBuf, void *pvBuf, size_t cbBuf, uint32_t *pcRead);
-int audioMixBufReadCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, void *pvBuf, size_t cbBuf, uint32_t *pcRead);
+int audioMixBufReadAt(PPDMAUDIOMIXBUF pMixBuf, uint32_t offSamples, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead);
+int audioMixBufReadAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, uint32_t offSamples, void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead);
+int audioMixBufReadCirc(PPDMAUDIOMIXBUF pMixBuf, void *pvBuf, uint32_t cbBuf, uint32_t *pcRead);
+int audioMixBufReadCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, void *pvBuf, uint32_t cbBuf, uint32_t *pcRead);
void audioMixBufReset(PPDMAUDIOMIXBUF pMixBuf);
void audioMixBufSetVolume(PPDMAUDIOMIXBUF pMixBuf, PPDMAUDIOVOLUME pVol);
uint32_t audioMixBufSize(PPDMAUDIOMIXBUF pMixBuf);
-size_t audioMixBufSizeBytes(PPDMAUDIOMIXBUF pMixBuf);
+uint32_t audioMixBufSizeBytes(PPDMAUDIOMIXBUF pMixBuf);
void audioMixBufUnlink(PPDMAUDIOMIXBUF pMixBuf);
-int audioMixBufWriteAt(PPDMAUDIOMIXBUF pMixBuf, uint32_t offSamples, const void *pvBuf, size_t cbBuf, uint32_t *pcWritten);
-int audioMixBufWriteAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, uint32_t offSamples, const void *pvBuf, size_t cbBuf, uint32_t *pcWritten);
-int audioMixBufWriteCirc(PPDMAUDIOMIXBUF pMixBuf, const void *pvBuf, size_t cbBuf, uint32_t *pcWritten);
-int audioMixBufWriteCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, const void *pvBuf, size_t cbBuf, uint32_t *pcWritten);
+int audioMixBufWriteAt(PPDMAUDIOMIXBUF pMixBuf, uint32_t offSamples, const void *pvBuf, uint32_t cbBuf, uint32_t *pcWritten);
+int audioMixBufWriteAtEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, uint32_t offSamples, const void *pvBuf, uint32_t cbBuf, uint32_t *pcWritten);
+int audioMixBufWriteCirc(PPDMAUDIOMIXBUF pMixBuf, const void *pvBuf, uint32_t cbBuf, uint32_t *pcWritten);
+int audioMixBufWriteCircEx(PPDMAUDIOMIXBUF pMixBuf, PDMAUDIOMIXBUFFMT enmFmt, const void *pvBuf, uint32_t cbBuf, uint32_t *pcWritten);
#endif /* AUDIO_MIXBUF_H */
diff --git a/src/VBox/Devices/Audio/AudioMixer.cpp b/src/VBox/Devices/Audio/AudioMixer.cpp
index 455cd38..336ac0c 100644
--- a/src/VBox/Devices/Audio/AudioMixer.cpp
+++ b/src/VBox/Devices/Audio/AudioMixer.cpp
@@ -37,7 +37,7 @@
#include <VBox/log.h>
-int audioMixerUpdateSinkVolume(PAUDMIXSINK pSink, const PPDMAUDIOVOLUME pVolMaster, const PPDMAUDIOVOLUME pVolSink);
+static int audioMixerUpdateSinkVolume(PAUDMIXSINK pSink, const PPDMAUDIOVOLUME pVolMaster);
int audioMixerAddSink(PAUDIOMIXER pMixer, const char *pszName, AUDMIXSINKDIR enmDir, PAUDMIXSINK *ppSink)
@@ -275,12 +275,12 @@ void audioMixerInvalidate(PAUDIOMIXER pMixer)
PAUDMIXSINK pSink;
RTListForEach(&pMixer->lstSinks, pSink, AUDMIXSINK, Node)
{
- int rc2 = audioMixerUpdateSinkVolume(pSink, &pMixer->VolMaster, &pSink->Volume);
+ int rc2 = audioMixerUpdateSinkVolume(pSink, &pMixer->VolMaster);
AssertRC(rc2);
}
}
-int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed)
+int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, uint32_t cbBuf, uint32_t *pcbProcessed)
{
AssertPtrReturn(pSink, VERR_INVALID_POINTER);
AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
@@ -306,7 +306,7 @@ int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, size
continue;
uint32_t cbTotalRead = 0;
- size_t cbToRead = cbBuf;
+ uint32_t cbToRead = cbBuf;
while (cbToRead)
{
@@ -343,7 +343,7 @@ int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, size
return rc;
}
-int audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed)
+int audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, uint32_t cbBuf, uint32_t *pcbProcessed)
{
return VERR_NOT_IMPLEMENTED;
}
@@ -410,44 +410,10 @@ int audioMixerSetDeviceFormat(PAUDIOMIXER pMixer, PPDMAUDIOSTREAMCFG pCfg)
return VINF_SUCCESS;
}
-static inline PDMAUDIOVOLUME audioMixerVolCalc(PPDMAUDIOVOLUME pVol)
-{
- uint32_t u32VolumeLeft = pVol->uLeft;
- uint32_t u32VolumeRight = pVol->uRight;
- /* 0x00..0xff => 0x01..0x100 */
- if (u32VolumeLeft)
- u32VolumeLeft++;
- if (u32VolumeRight)
- u32VolumeRight++;
-
- PDMAUDIOVOLUME volOut;
- volOut.fMuted = pVol->fMuted;
- volOut.uLeft = u32VolumeLeft * 0x80000000; /* Maximum is 0x80000000 */
- volOut.uRight = u32VolumeRight * 0x80000000; /* Maximum is 0x80000000 */
-
- return volOut;
-}
-
-static inline PDMAUDIOVOLUME audioMixerVolMix(const PPDMAUDIOVOLUME pVolMaster, PPDMAUDIOVOLUME pVol)
-{
- PDMAUDIOVOLUME volOut;
- volOut.fMuted = pVolMaster->fMuted || pVol->fMuted;
- volOut.uLeft = ASMMultU64ByU32DivByU32(pVolMaster->uLeft, pVol->uLeft, 0x80000000U); /* Maximum is 0x80000000U */
- volOut.uRight = ASMMultU64ByU32DivByU32(pVolMaster->uRight, pVol->uRight, 0x80000000U); /* Maximum is 0x80000000U */
-
- LogFlowFunc(("pMaster=%p, fMuted=%RTbool, lVol=%RU32, rVol=%RU32\n",
- pVolMaster, pVolMaster->fMuted, pVolMaster->uLeft, pVolMaster->uRight));
- LogFlowFunc(("pVol=%p, fMuted=%RTbool, lVol=%RU32, rVol=%RU32 => fMuted=%RTbool, lVol=%RU32, rVol=%RU32\n",
- pVol, pVol->fMuted, pVol->uLeft, pVol->uRight, volOut.fMuted, volOut.uLeft, volOut.uRight));
-
- return volOut;
-}
-
-int audioMixerUpdateSinkVolume(PAUDMIXSINK pSink, const PPDMAUDIOVOLUME pVolMaster, const PPDMAUDIOVOLUME pVolSink)
+static int audioMixerUpdateSinkVolume(PAUDMIXSINK pSink, const PPDMAUDIOVOLUME pVolMaster)
{
AssertPtrReturn(pSink, VERR_INVALID_POINTER);
AssertPtrReturn(pVolMaster, VERR_INVALID_POINTER);
- AssertPtrReturn(pVolSink, VERR_INVALID_POINTER);
LogFlowFunc(("Master fMuted=%RTbool, lVol=%RU32, rVol=%RU32\n",
pVolMaster->fMuted, pVolMaster->uLeft, pVolMaster->uRight));
@@ -457,9 +423,9 @@ int audioMixerUpdateSinkVolume(PAUDMIXSINK pSink, const PPDMAUDIOVOLUME pVolMast
/** @todo Very crude implementation for now -- needs more work! */
PDMAUDIOVOLUME volSink;
- volSink.fMuted = pVolMaster->fMuted || pVolSink->fMuted;
- volSink.uLeft = (pVolSink->uLeft * pVolMaster->uLeft) / UINT8_MAX;
- volSink.uRight = (pVolSink->uRight * pVolMaster->uRight) / UINT8_MAX;
+ volSink.fMuted = pVolMaster->fMuted || pSink->Volume.fMuted;
+ volSink.uLeft = (pSink->Volume.uLeft * pVolMaster->uLeft) / UINT8_MAX;
+ volSink.uRight = (pSink->Volume.uRight * pVolMaster->uRight) / UINT8_MAX;
LogFlowFunc(("\t-> fMuted=%RTbool, lVol=%RU32, rVol=%RU32\n",
volSink.fMuted, volSink.uLeft, volSink.uRight));
@@ -479,12 +445,13 @@ int audioMixerUpdateSinkVolume(PAUDMIXSINK pSink, const PPDMAUDIOVOLUME pVolMast
return VINF_SUCCESS;
}
+/** Set the master volume of the mixer. */
int audioMixerSetMasterVolume(PAUDIOMIXER pMixer, PPDMAUDIOVOLUME pVol)
{
AssertPtrReturn(pMixer, VERR_INVALID_POINTER);
AssertPtrReturn(pVol, VERR_INVALID_POINTER);
- pMixer->VolMaster = *pVol; //= audioMixerVolCalc(pVol);
+ pMixer->VolMaster = *pVol;
LogFlowFunc(("%s: lVol=%RU32, rVol=%RU32 => fMuted=%RTbool, lVol=%RU32, rVol=%RU32\n",
pMixer->pszName, pVol->uLeft, pVol->uRight,
@@ -494,14 +461,16 @@ int audioMixerSetMasterVolume(PAUDIOMIXER pMixer, PPDMAUDIOVOLUME pVol)
return VINF_SUCCESS;
}
+/** Set the volume of an individual sink. */
int audioMixerSetSinkVolume(PAUDMIXSINK pSink, PPDMAUDIOVOLUME pVol)
{
AssertPtrReturn(pSink, VERR_INVALID_POINTER);
AssertPtrReturn(pVol, VERR_INVALID_POINTER);
+ AssertPtr(pSink->pParent);
LogFlowFunc(("%s: fMuted=%RTbool, lVol=%RU32, rVol=%RU32\n", pSink->pszName, pVol->fMuted, pVol->uLeft, pVol->uRight));
- AssertPtr(pSink->pParent);
- return audioMixerUpdateSinkVolume(pSink, &pSink->pParent->VolMaster, pVol);
-}
+ pSink->Volume = *pVol;
+ return audioMixerUpdateSinkVolume(pSink, &pSink->pParent->VolMaster);
+}
diff --git a/src/VBox/Devices/Audio/AudioMixer.h b/src/VBox/Devices/Audio/AudioMixer.h
index 7248bd2..0b029f3 100644
--- a/src/VBox/Devices/Audio/AudioMixer.h
+++ b/src/VBox/Devices/Audio/AudioMixer.h
@@ -99,8 +99,8 @@ int audioMixerCreate(const char *pszName, uint32_t uFlags, PAUDIOMIXER *ppMixer)
void audioMixerDestroy(PAUDIOMIXER pMixer);
uint32_t audioMixerGetStreamCount(PAUDIOMIXER pMixer);
void audioMixerInvalidate(PAUDIOMIXER pMixer);
-int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed);
-int audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, size_t cbBuf, uint32_t *pcbProcessed);
+int audioMixerProcessSinkIn(PAUDMIXSINK pSink, AUDMIXOP enmOp, void *pvBuf, uint32_t cbBuf, uint32_t *pcbProcessed);
+int audioMixerProcessSinkOut(PAUDMIXSINK pSink, AUDMIXOP enmOp, const void *pvBuf, uint32_t cbBuf, uint32_t *pcbProcessed);
void audioMixerRemoveSink(PAUDIOMIXER pMixer, PAUDMIXSINK pSink);
void audioMixerRemoveStream(PAUDMIXSINK pMixer, PAUDMIXSTREAM pStream);
int audioMixerSetDeviceFormat(PAUDIOMIXER pMixer, PPDMAUDIOSTREAMCFG pCfg);
diff --git a/src/VBox/Devices/Audio/DevIchAc97.cpp b/src/VBox/Devices/Audio/DevIchAc97.cpp
index cd9a524..c2daf62 100644
--- a/src/VBox/Devices/Audio/DevIchAc97.cpp
+++ b/src/VBox/Devices/Audio/DevIchAc97.cpp
@@ -48,11 +48,6 @@
* Defined Constants And Macros *
*******************************************************************************/
#undef LOG_VOICES
-#ifndef VBOX
-//#define USE_MIXER
-#else
-# define USE_MIXER
-#endif
#ifdef DEBUG
//#define DEBUG_LUN
@@ -565,7 +560,7 @@ static void ichac97OpenStream(PAC97STATE pThis, int index, uint16_t freq)
streamCfg.uHz = freq;
streamCfg.cChannels = 2;
streamCfg.enmFormat = AUD_FMT_S16;
- streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
char *pszDesc;
@@ -834,8 +829,6 @@ static void ichac97ResetStreams(PAC97STATE pThis, uint8_t active[LAST_INDEX])
#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
}
-#ifdef USE_MIXER
-
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
static void ichac97SetVolume(PAC97STATE pThis, int index, PDMAUDIOMIXERCTL mt, uint32_t val)
#else
@@ -843,19 +836,29 @@ static void ichac97SetVolume(PAC97STATE pThis, int index, audmixerctl_t mt, uint
#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
{
int mute = (val >> MUTE_SHIFT) & 1;
- uint8_t rvol = VOL_MASK - (val & VOL_MASK);
- uint8_t lvol = VOL_MASK - ((val >> 8) & VOL_MASK);
- rvol = 255 * rvol / VOL_MASK;
- lvol = 255 * lvol / VOL_MASK;
+ uint8_t rvol = val & VOL_MASK;
+ uint8_t lvol = (val >> 8) & VOL_MASK;
+
+ /* For the master volume, 0 corresponds to 0dB gain. But for the other
+ * volume controls, 0 corresponds to +12dB and 8 to 0dB. */
+ if (mt != PDMAUDIOMIXERCTL_VOLUME)
+ {
+ /* NB: Currently there is no gain support, only attenuation. */
+ lvol = lvol < 8 ? 0 : lvol - 8;
+ rvol = rvol < 8 ? 0 : rvol - 8;
+ }
- LogFunc(("mt=%ld, val=%RU32, mute=%RTbool\n", mt, val, RT_BOOL(mute)));
+ /* AC'97 has 1.5dB steps; we use 0.375dB steps. */
+ rvol = 255 - rvol * 4;
+ lvol = 255 - lvol * 4;
+
+ LogFunc(("mt=%ld, val=%RX32, mute=%RTbool\n", mt, val, RT_BOOL(mute)));
#ifdef SOFT_VOLUME
# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
if (pThis->pMixer) /* Device can be in reset state, so no mixer available. */
{
PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol };
- PAC97DRIVER pDrv;
switch (mt)
{
case PDMAUDIOMIXERCTL_VOLUME:
@@ -956,8 +959,6 @@ static void ichac97RecordSelect(PAC97STATE pThis, uint32_t val)
ichac97MixerStore(pThis, AC97_Record_Select, rs | (ls << 8));
}
-#endif /* USE_MIXER */
-
static void ichac97MixerReset(PAC97STATE pThis)
{
LogFlowFuncEnter();
@@ -992,7 +993,7 @@ static void ichac97MixerReset(PAC97STATE pThis)
streamCfg.uHz = 41000;
streamCfg.cChannels = 2;
streamCfg.enmFormat = AUD_FMT_S16;
- streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
rc2 = audioMixerSetDeviceFormat(pThis->pMixer, &streamCfg);
AssertRC(rc2);
@@ -1025,12 +1026,6 @@ static void ichac97MixerReset(PAC97STATE pThis)
ichac97MixerStore(pThis, AC97_3D_Control , 0x0000);
ichac97MixerStore(pThis, AC97_Powerdown_Ctrl_Stat , 0x000f);
- /*
- * Sigmatel 9700 (STAC9700)
- */
- ichac97MixerStore(pThis, AC97_Vendor_ID1 , 0x8384);
- ichac97MixerStore(pThis, AC97_Vendor_ID2 , 0x7600); /* 7608 */
-
ichac97MixerStore(pThis, AC97_Extended_Audio_ID , 0x0809);
ichac97MixerStore(pThis, AC97_Extended_Audio_Ctrl_Stat, 0x0009);
ichac97MixerStore(pThis, AC97_PCM_Front_DAC_Rate , 0xbb80);
@@ -1039,7 +1034,18 @@ static void ichac97MixerReset(PAC97STATE pThis)
ichac97MixerStore(pThis, AC97_PCM_LR_ADC_Rate , 0xbb80);
ichac97MixerStore(pThis, AC97_MIC_ADC_Rate , 0xbb80);
-#ifdef USE_MIXER
+ if (PCIDevGetSubSystemVendorId(&pThis->PciDev) == 0x1028)
+ {
+ /* Analog Devices 1980 (AD1980) */
+ ichac97MixerStore(pThis, AC97_Vendor_ID1 , 0x4144);
+ ichac97MixerStore(pThis, AC97_Vendor_ID2 , 0x5370);
+ }
+ else
+ {
+ /* Sigmatel 9700 (STAC9700) */
+ ichac97MixerStore(pThis, AC97_Vendor_ID1 , 0x8384);
+ ichac97MixerStore(pThis, AC97_Vendor_ID2 , 0x7600); /* 7608 */
+ }
ichac97RecordSelect(pThis, 0);
# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
ichac97SetVolume(pThis, AC97_Master_Volume_Mute, PDMAUDIOMIXERCTL_VOLUME, 0x8000);
@@ -1050,12 +1056,6 @@ static void ichac97MixerReset(PAC97STATE pThis)
ichac97SetVolume(pThis, AC97_PCM_Out_Volume_Mute, AUD_MIXER_PCM, 0x8808);
ichac97SetVolume(pThis, AC97_Line_In_Volume_Mute, AUD_MIXER_LINE_IN, 0x8808);
# endif
-#else
- ichac97MixerStore(pThis, AC97_Record_Select, 0);
- ichac97MixerStore(pThis, AC97_Master_Volume_Mute, 0x8000);
- ichac97MixerStore(pThis, AC97_PCM_Out_Volume_Mute, 0x8808);
- ichac97MixerStore(pThis, AC97_Line_In_Volume_Mute, 0x8808);
-#endif
/* Reset all streams. */
uint8_t active[LAST_INDEX] = { 0 };
@@ -1230,7 +1230,7 @@ static int ichac97ReadAudio(PAC97STATE pThis, PAC97BMREG pReg, uint32_t cbMax, u
uint32_t cbRead = 0;
- size_t cbMixBuf = cbMax;
+ uint32_t cbMixBuf = cbMax;
uint32_t cbToRead = RT_MIN((uint32_t)(pReg->picb << 1), cbMixBuf);
if (!cbToRead)
@@ -1909,7 +1909,6 @@ static DECLCALLBACK(int) ichac97IOPortNAMWrite(PPDMDEVINS pDevIns,
u32 |= ichac97MixerLoad(pThis, index) & 0xf;
ichac97MixerStore(pThis, index, u32);
break;
-#ifdef USE_MIXER
case AC97_Master_Volume_Mute:
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
ichac97SetVolume(pThis, index, PDMAUDIOMIXERCTL_VOLUME, u32);
@@ -1934,14 +1933,6 @@ static DECLCALLBACK(int) ichac97IOPortNAMWrite(PPDMDEVINS pDevIns,
case AC97_Record_Select:
ichac97RecordSelect(pThis, u32);
break;
-#else /* !USE_MIXER */
- case AC97_Master_Volume_Mute:
- case AC97_PCM_Out_Volume_Mute:
- case AC97_Line_In_Volume_Mute:
- case AC97_Record_Select:
- ichac97MixerStore(pThis, index, u32);
- break;
-#endif /* !USE_MIXER */
case AC97_Vendor_ID1:
case AC97_Vendor_ID2:
LogFlowFunc(("Attempt to write vendor ID to %#x\n", u32));
@@ -2133,7 +2124,6 @@ static DECLCALLBACK(int) ichac97LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, ui
uint8_t active[LAST_INDEX];
SSMR3GetMem(pSSM, active, sizeof(active));
-#ifdef USE_MIXER
ichac97RecordSelect(pThis, ichac97MixerLoad(pThis, AC97_Record_Select));
# define V_(a, b) ichac97SetVolume(pThis, a, b, ichac97MixerLoad(pThis, a))
# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
@@ -2146,7 +2136,6 @@ static DECLCALLBACK(int) ichac97LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, ui
V_(AC97_Line_In_Volume_Mute, AUD_MIXER_LINE_IN);
# endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
# undef V_
-#endif /* USE_MIXER */
ichac97ResetStreams(pThis, active);
pThis->bup_flag = 0;
@@ -2315,15 +2304,46 @@ static DECLCALLBACK(int) ichac97Construct(PPDMDEVINS pDevIns, int iInstance, PCF
{
PAC97STATE pThis = PDMINS_2_DATA(pDevIns, PAC97STATE);
+#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
+ /* NB: This must be done *before* any possible failure (and running the destructor). */
+ RTListInit(&pThis->lstDrv);
+#endif
+
Assert(iInstance == 0);
PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
/*
* Validations.
*/
- if (!CFGMR3AreValuesValid(pCfg, "\0"))
+ if (!CFGMR3AreValuesValid(pCfg, "Type\0"))
+ return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
+ N_("Invalid configuration for the AC'97 device"));
+
+ /*
+ * Determine the chip type.
+ */
+ char szType[20];
+ int rc = CFGMR3QueryStringDef(pCfg, "Type", &szType[0], sizeof(szType), "STAC9700");
+ if (RT_FAILURE(rc))
return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
- N_("Invalid configuration for the AC97 device"));
+ N_("AC'97 configuration error: Querying \"Type\" as string failed"));
+
+ /*
+ * The AD1980 codec (with corresponding PCI subsystem vendor ID) is whitelisted
+ * in the Linux kernel; Linux makes no attempt to measure the data rate and assumes
+ * 48 kHz rate, which is exactly what we need.
+ */
+ bool fChipAD1980 = false;
+ if (!strcmp(szType, "STAC9700"))
+ fChipAD1980 = false;
+ else if (!strcmp(szType, "AD1980"))
+ fChipAD1980 = true;
+ else
+ {
+ return PDMDevHlpVMSetError(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES, RT_SRC_POS,
+ N_("AC'97 configuration error: The \"Type\" value \"%s\" is unsupported"),
+ szType);
+ }
/*
* Initialize data (most of it anyway).
@@ -2346,16 +2366,25 @@ static DECLCALLBACK(int) ichac97Construct(PPDMDEVINS pDevIns, int iInstance, PCF
true /* fIoSpace */, false /* fPrefetchable */, false /* f64Bit */, 0x00000000); Assert(pThis->PciDev.config[0x10] == 0x01); Assert(pThis->PciDev.config[0x11] == 0x00); Assert(pThis->PciDev.config[0x12] == 0x00); Assert(pThis->PciDev.config[0x13] == 0x00);
PCIDevSetBaseAddress (&pThis->PciDev, 1, /* 14 rw - nabmbar - native audio bus mastering. */
true /* fIoSpace */, false /* fPrefetchable */, false /* f64Bit */, 0x00000000); Assert(pThis->PciDev.config[0x14] == 0x01); Assert(pThis->PciDev.config[0x15] == 0x00); Assert(pThis->PciDev.config[0x16] == 0x00); Assert(pThis->PciDev.config[0x17] == 0x00);
- PCIDevSetSubSystemVendorId(&pThis->PciDev, 0x8086); /* 2c ro - intel.) */ Assert(pThis->PciDev.config[0x2c] == 0x86); Assert(pThis->PciDev.config[0x2d] == 0x80);
- PCIDevSetSubSystemId (&pThis->PciDev, 0x0000); /* 2e ro. */ Assert(pThis->PciDev.config[0x2e] == 0x00); Assert(pThis->PciDev.config[0x2f] == 0x00);
PCIDevSetInterruptLine (&pThis->PciDev, 0x00); /* 3c rw. */ Assert(pThis->PciDev.config[0x3c] == 0x00);
PCIDevSetInterruptPin (&pThis->PciDev, 0x01); /* 3d ro - INTA#. */ Assert(pThis->PciDev.config[0x3d] == 0x01);
+ if (fChipAD1980)
+ {
+ PCIDevSetSubSystemVendorId(&pThis->PciDev, 0x1028); /* 2c ro - Dell.) */
+ PCIDevSetSubSystemId (&pThis->PciDev, 0x0177); /* 2e ro. */
+ }
+ else
+ {
+ PCIDevSetSubSystemVendorId(&pThis->PciDev, 0x8086); /* 2c ro - Intel.) */
+ PCIDevSetSubSystemId (&pThis->PciDev, 0x0000); /* 2e ro. */
+ }
+
/*
* Register the PCI device, it's I/O regions, the timer and the
* saved state item.
*/
- int rc = PDMDevHlpPCIRegister(pDevIns, &pThis->PciDev);
+ rc = PDMDevHlpPCIRegister(pDevIns, &pThis->PciDev);
if (RT_FAILURE (rc))
return rc;
@@ -2375,8 +2404,6 @@ static DECLCALLBACK(int) ichac97Construct(PPDMDEVINS pDevIns, int iInstance, PCF
* Attach driver.
*/
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
- RTListInit(&pThis->lstDrv);
-
uint8_t uLUN;
for (uLUN = 0; uLUN < UINT8_MAX; uLUN)
{
diff --git a/src/VBox/Devices/Audio/DevIchHda.cpp b/src/VBox/Devices/Audio/DevIchHda.cpp
index 49b97f2..8d886de 100644
--- a/src/VBox/Devices/Audio/DevIchHda.cpp
+++ b/src/VBox/Devices/Audio/DevIchHda.cpp
@@ -1777,7 +1777,7 @@ static int hdaSdFmtToAudSettings(uint32_t u32SdFmt, audsettings_t *pCfg)
pCfg->uHz = u32Hz * u32HzMult / u32HzDiv;
pCfg->cChannels = (u32SdFmt & 0xf) + 1;
pCfg->enmFormat = enmFmt;
- pCfg->enmEndianness = PDMAUDIOHOSTENDIANESS;
+ pCfg->enmEndianness = PDMAUDIOHOSTENDIANNESS;
#else
pCfg->nchannels = (u32SdFmt & 0xf) + 1;
pCfg->fmt = enmFmt;
@@ -2519,13 +2519,30 @@ static DECLCALLBACK(int) hdaOpenOut(PHDASTATE pThis,
return rc;
}
-static DECLCALLBACK(int) hdaSetVolume(PHDASTATE pThis,
+static DECLCALLBACK(int) hdaSetVolume(PHDASTATE pThis, ENMSOUNDSOURCE enmSource,
bool fMute, uint8_t uVolLeft, uint8_t uVolRight)
{
- int rc = VINF_SUCCESS;
+ int rc = VINF_SUCCESS;
+ PDMAUDIOVOLUME vol = { fMute, uVolLeft, uVolRight };
+ PAUDMIXSINK pSink;
+
+ /* Convert the audio source to corresponding sink. */
+ switch (enmSource) {
+ case PO_INDEX:
+ pSink = pThis->pSinkOutput;
+ break;
+ case PI_INDEX:
+ pSink = pThis->pSinkLineIn;
+ break;
+ case MC_INDEX:
+ pSink = pThis->pSinkMicIn;
+ break;
+ default:
+ AssertFailedReturn(VERR_INVALID_PARAMETER);
+ }
- PDMAUDIOVOLUME vol = { fMute, uVolLeft, uVolRight };
- audioMixerSetMasterVolume(pThis->pMixer, &vol);
+ /* Set the volume. Codec already converted it to the correct range. */
+ audioMixerSetSinkVolume(pSink, &vol);
LogFlowFuncLeaveRC(rc);
return rc;
@@ -2618,7 +2635,6 @@ static DECLCALLBACK(int) hdaTransfer(PHDACODEC pCodec, ENMSOUNDSOURCE enmSrc, ui
PHDASTATE pThis = pCodec->pHDAState;
AssertPtrReturn(pThis, VERR_INVALID_POINTER);
#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
- int rc;
uint8_t u8Strm;
PHDABDLEDESC pBdle;
@@ -2655,6 +2671,7 @@ static DECLCALLBACK(int) hdaTransfer(PHDACODEC pCodec, ENMSOUNDSOURCE enmSrc, ui
HDASTREAMTRANSFERDESC StreamDesc;
hdaInitTransferDescriptor(pThis, pBdle, u8Strm, &StreamDesc);
+ int rc = VINF_EOF;
while (cbAvail)
{
Assert( (StreamDesc.u32Ctl & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN))
@@ -3848,7 +3865,7 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
streamCfg.uHz = 41000;
streamCfg.cChannels = 2;
streamCfg.enmFormat = AUD_FMT_S16;
- streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
rc = audioMixerSetDeviceFormat(pThis->pMixer, &streamCfg);
AssertRC(rc);
@@ -3865,6 +3882,11 @@ static DECLCALLBACK(int) hdaConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMNO
rc = audioMixerAddSink(pThis->pMixer, "[Recording] Microphone In",
AUDMIXSINKDIR_INPUT, &pThis->pSinkMicIn);
AssertRC(rc);
+
+ /* There is no master volume control. Set the master to max. */
+ PDMAUDIOVOLUME vol = { false, 255, 255 };
+ rc = audioMixerSetMasterVolume(pThis->pMixer, &vol);
+ AssertRC(rc);
}
}
diff --git a/src/VBox/Devices/Audio/DevIchHdaCodec.cpp b/src/VBox/Devices/Audio/DevIchHdaCodec.cpp
index 168512c..ebb14d5 100644
--- a/src/VBox/Devices/Audio/DevIchHdaCodec.cpp
+++ b/src/VBox/Devices/Audio/DevIchHdaCodec.cpp
@@ -1173,11 +1173,12 @@ static int hdaCodecToAudVolume(AMPLIFIER *pAmp, audmixerctl_t mt)
#endif
{
uint32_t dir = AMPLIFIER_OUT;
+ ENMSOUNDSOURCE enmSrc;
switch (mt)
{
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
- case PDMAUDIOMIXERCTL_VOLUME:
case PDMAUDIOMIXERCTL_PCM:
+ enmSrc = PO_INDEX;
#else
case AUD_MIXER_VOLUME:
case AUD_MIXER_PCM:
@@ -1186,13 +1187,14 @@ static int hdaCodecToAudVolume(AMPLIFIER *pAmp, audmixerctl_t mt)
break;
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
case PDMAUDIOMIXERCTL_LINE_IN:
+ enmSrc = PI_INDEX;
#else
case AUD_MIXER_LINE_IN:
#endif
dir = AMPLIFIER_IN;
break;
default:
- AssertMsgFailed(("Invalid mixer control %ld\n", mt));
+ AssertMsgFailedReturn(("Invalid mixer control %ld\n", mt), VERR_INVALID_PARAMETER);
break;
}
@@ -1203,9 +1205,17 @@ static int hdaCodecToAudVolume(AMPLIFIER *pAmp, audmixerctl_t mt)
uint8_t lVol = AMPLIFIER_REGISTER(*pAmp, dir, AMPLIFIER_LEFT, 0) & 0x7f;
uint8_t rVol = AMPLIFIER_REGISTER(*pAmp, dir, AMPLIFIER_RIGHT, 0) & 0x7f;
+ /* The STAC9220 volume controls have 0 to -96dB attenuation range in 128 steps.
+ * We have 0 to -96dB range in 256 steps. HDA volume setting of 127 must map
+ * to 255 internally (0dB), while HDA volume setting of 0 (-96dB) should map
+ * to 1 (rather than zero) internally.
+ */
+ lVol = (lVol + 1) * (2 * 255) / 256;
+ rVol = (rVol + 1) * (2 * 255) / 256;
+
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
/** @todo In SetVolume no passing audmixerctl_in as its not used in DrvAudio.cpp. */
- pThis->pfnSetVolume(pThis->pHDAState, RT_BOOL(mute), lVol, rVol);
+ pThis->pfnSetVolume(pThis->pHDAState, enmSrc, RT_BOOL(mute), lVol, rVol);
#else
AUD_set_volume(mt, &mute, &lVol, &rVol);
#endif
@@ -1364,7 +1374,7 @@ static DECLCALLBACK(int) vrbProcSetAmplifier(PHDACODEC pThis, uint32_t cmd, uint
/** @todo Fix ID of u8DacLineOut! */
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
- hdaCodecToAudVolume(pThis, pAmplifier, PDMAUDIOMIXERCTL_VOLUME);
+ hdaCodecToAudVolume(pThis, pAmplifier, PDMAUDIOMIXERCTL_PCM);
#else
hdaCodecToAudVolume(pAmplifier, AUD_MIXER_VOLUME);
#endif
@@ -2406,13 +2416,13 @@ int hdaCodecLoadState(PHDACODEC pThis, PSSMHANDLE pSSM, uint32_t uVersion)
*/
if (hdaCodecIsDacNode(pThis, pThis->u8DacLineOut))
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
- hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].dac.B_params, PDMAUDIOMIXERCTL_VOLUME);
+ hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].dac.B_params, PDMAUDIOMIXERCTL_PCM);
#else
hdaCodecToAudVolume(&pThis->paNodes[pThis->u8DacLineOut].dac.B_params, AUD_MIXER_VOLUME);
#endif
else if (hdaCodecIsSpdifOutNode(pThis, pThis->u8DacLineOut))
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
- hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].spdifout.B_params, PDMAUDIOMIXERCTL_VOLUME);
+ hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].spdifout.B_params, PDMAUDIOMIXERCTL_PCM);
hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8AdcVolsLineIn].adcvol.B_params, PDMAUDIOMIXERCTL_LINE_IN);
#else
hdaCodecToAudVolume(&pThis->paNodes[pThis->u8DacLineOut].spdifout.B_params, AUD_MIXER_VOLUME);
@@ -2463,7 +2473,7 @@ int hdaCodecConstruct(PPDMDEVINS pDevIns, PHDACODEC pThis,
as.uHz = 44100;
as.cChannels = 2;
as.enmFormat = AUD_FMT_S16;
- as.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ as.enmEndianness = PDMAUDIOHOSTENDIANNESS;
#else
AUD_register_card("ICH0", &pThis->card);
@@ -2495,7 +2505,7 @@ int hdaCodecConstruct(PPDMDEVINS pDevIns, PHDACODEC pThis,
pThis->pfnCodecNodeReset(pThis, i, &pThis->paNodes[i]);
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
- hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].dac.B_params, PDMAUDIOMIXERCTL_VOLUME);
+ hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8DacLineOut].dac.B_params, PDMAUDIOMIXERCTL_PCM);
hdaCodecToAudVolume(pThis, &pThis->paNodes[pThis->u8AdcVolsLineIn].adcvol.B_params, PDMAUDIOMIXERCTL_LINE_IN);
diff --git a/src/VBox/Devices/Audio/DevIchHdaCodec.h b/src/VBox/Devices/Audio/DevIchHdaCodec.h
index 744a2aa..d5d62a9 100644
--- a/src/VBox/Devices/Audio/DevIchHdaCodec.h
+++ b/src/VBox/Devices/Audio/DevIchHdaCodec.h
@@ -115,7 +115,7 @@ typedef struct HDACODEC
DECLR3CALLBACKMEMBER(void, pfnCloseOut, (PHDASTATE pThis));
DECLR3CALLBACKMEMBER(int, pfnOpenIn, (PHDASTATE pThis, const char *pszName, PDMAUDIORECSOURCE enmRecSource, PPDMAUDIOSTREAMCFG pCfg));
DECLR3CALLBACKMEMBER(int, pfnOpenOut, (PHDASTATE pThis, const char *pszName, PPDMAUDIOSTREAMCFG pCfg));
- DECLR3CALLBACKMEMBER(int, pfnSetVolume, (PHDASTATE pThis, bool fMute, uint8_t uVolLeft, uint8_t uVolRight));
+ DECLR3CALLBACKMEMBER(int, pfnSetVolume, (PHDASTATE pThis, ENMSOUNDSOURCE enmSource, bool fMute, uint8_t uVolLeft, uint8_t uVolRight));
#else
QEMUSoundCard card;
/** PCM in */
diff --git a/src/VBox/Devices/Audio/DevSB16.cpp b/src/VBox/Devices/Audio/DevSB16.cpp
index 504e765..321dcf5 100644
--- a/src/VBox/Devices/Audio/DevSB16.cpp
+++ b/src/VBox/Devices/Audio/DevSB16.cpp
@@ -51,7 +51,7 @@
#include <VBox/vmm/pdmdev.h>
#include <VBox/vmm/pdmaudioifs.h>
-#include "vl_vbox.h"
+#include "VBoxDD.h"
#ifdef LOG_GROUP
#undef LOG_GROUP
@@ -67,21 +67,11 @@
}
#endif
-#ifndef VBOX
-#define LENOFA(a) ((int) (sizeof(a)/sizeof(a[0])))
-#else /* VBOX */
/** Current saved state version. */
#define SB16_SAVE_STATE_VERSION 2
/** The version used in VirtualBox version 3.0 and earlier. This didn't include the config dump. */
#define SB16_SAVE_STATE_VERSION_VBOX_30 1
-#endif /* VBOX */
-
-#ifndef VBOX
-#define IO_READ_PROTO(name) \
- uint32_t name (void *opaque, uint32_t nport)
-#define IO_WRITE_PROTO(name) \
- void name (void *opaque, uint32_t nport, uint32_t val)
-#else /* VBOX */
+
#define IO_READ_PROTO(name) \
DECLCALLBACK(int) name (PPDMDEVINS pDevIns, void *opaque, \
RTIOPORT nport, uint32_t *pu32, unsigned cb)
@@ -89,22 +79,9 @@
#define IO_WRITE_PROTO(name) \
DECLCALLBACK(int) name (PPDMDEVINS pDevIns, void *opaque, \
RTIOPORT nport, uint32_t val, unsigned cb)
-#endif /* VBOX */
static const char e3[] = "COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.";
-#ifndef VBOX
-static struct
-{
- int ver_lo;
- int ver_hi;
- int irq;
- int dma;
- int hdma;
- int port;
-} conf = {5, 4, 5, 1, 5, 0x220};
-#endif /* !VBOX */
-
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
typedef struct SB16OUTPUTSTREAM
{
@@ -390,18 +367,6 @@ static void sb16Control(PSB16STATE pThis, int hold)
LogFlowFunc(("hold %d high %d dma %d\n", hold, pThis->use_hdma, dma));
-#ifndef VBOX
- if (hold)
- {
- DMA_hold_DREQ(dma);
- AUD_set_active_out(pThis->voice, 1);
- }
- else
- {
- DMA_release_DREQ(dma);
- AUD_set_active_out(pThis->voice, 0);
- }
-#else /* VBOX */
# ifdef VBOX_WITH_PDM_AUDIO_DRIVER
PSB16DRIVER pDrv;
# endif
@@ -428,24 +393,14 @@ static void sb16Control(PSB16STATE pThis, int hold)
AUD_set_active_out (pThis->voice, 0);
# endif
}
-#endif /* VBOX */
}
-#ifndef VBOX
-static void aux_timer (void *opaque)
-{
- PSB16STATE pThis = opaque;
- pThis->can_write = 1;
- qemu_irq_raise (pThis->pic[pThis->irq]);
-}
-#else /* VBOX */
static DECLCALLBACK(void) sb16TimerIRQ(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvThis)
{
PSB16STATE pThis = (PSB16STATE)pvThis;
pThis->can_write = 1;
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
}
-#endif /* VBOX */
#define DMA8_AUTO 1
#define DMA8_HIGH 2
@@ -459,7 +414,7 @@ static void continue_dma8(PSB16STATE pThis)
streamCfg.uHz = pThis->freq;
streamCfg.cChannels = 1 << pThis->fmt_stereo;
streamCfg.enmFormat = pThis->fmt;
- streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
int rc = sb16OpenOut(pThis, &streamCfg);
AssertRC(rc);
@@ -612,7 +567,7 @@ static void dma_cmd(PSB16STATE pThis, uint8_t cmd, uint8_t d0, int dma_len)
streamCfg.uHz = pThis->freq;
streamCfg.cChannels = 1 << pThis->fmt_stereo;
streamCfg.enmFormat = pThis->fmt;
- streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
int rc = sb16OpenOut(pThis, &streamCfg);
AssertRC(rc);
@@ -872,13 +827,14 @@ static void sb16HandleCommand(PSB16STATE pThis, uint8_t cmd)
case 0xf3:
dsp_out_data(pThis, 0xaa);
pThis->mixer_regs[0x82] |= (cmd == 0xf2) ? 1 : 2;
-#ifndef VBOX
- qemu_irq_raise (pThis->pic[pThis->irq]);
-#else
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
-#endif
break;
+ case 0xf8:
+ /* Undocumented, used by old Creative diagnostic programs. */
+ dsp_out_data (pThis, 0);
+ goto warn;
+
case 0xf9:
pThis->needed_bytes = 1;
goto warn;
@@ -1042,29 +998,12 @@ static void complete(PSB16STATE pThis)
freq = pThis->freq > 0 ? pThis->freq : 11025;
samples = dsp_get_lohi (pThis) + 1;
bytes = samples << pThis->fmt_stereo << ((pThis->fmt_bits == 16) ? 1 : 0);
-#ifndef VBOX
- ticks = (bytes * ticks_per_sec) / freq;
- if (ticks < ticks_per_sec / 1024) {
- qemu_irq_raise (pThis->pic[pThis->irq]);
- }
- else {
- if (pThis->aux_ts) {
- qemu_mod_timer (
- pThis->aux_ts,
- qemu_get_clock (vm_clock) + ticks
- );
- }
- }
- LogFlowFunc(("mix silence %d %d %" PRId64 "\n", samples, bytes, ticks));
-#else /* VBOX */
ticks = (bytes * TMTimerGetFreq(pThis->pTimerIRQ)) / freq;
if (ticks < TMTimerGetFreq(pThis->pTimerIRQ) / 1024)
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
else
TMTimerSet(pThis->pTimerIRQ, TMTimerGet(pThis->pTimerIRQ) + ticks);
LogFlowFunc(("mix silence %d %d % %RU64\n", samples, bytes, ticks));
-#endif /* VBOX */
-
break;
}
@@ -1117,6 +1056,51 @@ static void complete(PSB16STATE pThis)
return;
}
+static uint8_t sb16MixRegToVol(PSB16STATE pThis, int reg)
+{
+ /* The SB16 mixer has a 0 to -62dB range in 32 levels (2dB each step).
+ * We use a 0 to -96dB range in 256 levels (0.375dB each step).
+ * Only the top 5 bits of a mixer register are used.
+ */
+ uint8_t steps = 31 - (pThis->mixer_regs[reg] >> 3);
+ uint8_t vol = 255 - steps * 16 / 3; /* (2dB*8) / (0.375dB*8) */
+ return vol;
+}
+
+static void sb16SetMasterVolume(PSB16STATE pThis)
+{
+#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
+ /* There's no mute switch, only volume controls. */
+ uint8_t lvol = sb16MixRegToVol(pThis, 0x30);
+ uint8_t rvol = sb16MixRegToVol(pThis, 0x31);
+ PDMAUDIOVOLUME vol = { false, lvol, rvol };
+ audioMixerSetMasterVolume(pThis->pMixer, &vol);
+#else
+ int mute = 0;
+ uint8_t lvol = pThis->mixer_regs[0x30];
+ uint8_t rvol = pThis->mixer_regs[0x31];
+
+ AUD_set_volume(AUD_MIXER_VOLUME, &mute, &lvol, &rvol);
+#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
+}
+
+static void sb16SetPcmOutVolume(PSB16STATE pThis)
+{
+#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
+ /* There's no mute switch, only volume controls. */
+ uint8_t lvol = sb16MixRegToVol(pThis, 0x32);
+ uint8_t rvol = sb16MixRegToVol(pThis, 0x33);
+ PDMAUDIOVOLUME vol = { false, lvol, rvol };
+ audioMixerSetSinkVolume(pThis->pSinkOutput, &vol);
+#else
+ int mute = 0;
+ uint8_t lvol = pThis->mixer_regs[0x32];
+ uint8_t rvol = pThis->mixer_regs[0x33];
+
+ AUD_set_volume(AUD_MIXER_PCM, &mute, &lvol, &rvol);
+#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
+}
+
static void sb16ResetLegacy(PSB16STATE pThis)
{
pThis->freq = 11025;
@@ -1129,7 +1113,7 @@ static void sb16ResetLegacy(PSB16STATE pThis)
streamCfg.uHz = pThis->freq;
streamCfg.cChannels = 1; /* Mono */
streamCfg.enmFormat = AUD_FMT_U8;
- streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
int rc = sb16OpenOut(pThis, &streamCfg);
AssertRC(rc);
@@ -1155,20 +1139,12 @@ static void sb16ResetLegacy(PSB16STATE pThis)
static void sb16Reset(PSB16STATE pThis)
{
-#ifndef VBOX
- qemu_irq_lower (pThis->pic[pThis->irq]);
- if (pThis->dma_auto) {
- qemu_irq_raise (pThis->pic[pThis->irq]);
- qemu_irq_lower (pThis->pic[pThis->irq]);
- }
-#else /* VBOX */
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
if (pThis->dma_auto)
{
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
}
-#endif /* VBOX */
pThis->mixer_regs[0x82] = 0;
pThis->dma_auto = 0;
@@ -1206,11 +1182,7 @@ static IO_WRITE_PROTO(dsp_write)
if (0 && pThis->highspeed)
{
pThis->highspeed = 0;
-#ifndef VBOX
- qemu_irq_lower (pThis->pic[pThis->irq]);
-#else
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
-#endif
sb16Control(pThis, 0);
}
else
@@ -1285,9 +1257,7 @@ static IO_WRITE_PROTO(dsp_write)
break;
}
-#ifdef VBOX
return VINF_SUCCESS;
-#endif
}
static IO_READ_PROTO(dsp_read)
@@ -1296,10 +1266,9 @@ static IO_READ_PROTO(dsp_read)
int iport, retval, ack = 0;
iport = nport - pThis->port;
-#ifdef VBOX
+
/** @todo reject non-byte access?
* The spec does not mention a non-byte access so we should check how real hardware behaves. */
-#endif
switch (iport)
{
@@ -1337,11 +1306,7 @@ static IO_READ_PROTO(dsp_read)
{
ack = 1;
pThis->mixer_regs[0x82] &= ~1;
-#ifndef VBOX
- qemu_irq_lower (pThis->pic[pThis->irq]);
-#else
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
-#endif
}
break;
@@ -1351,11 +1316,7 @@ static IO_READ_PROTO(dsp_read)
{
ack = 1;
pThis->mixer_regs[0x82] &= ~2;
-#ifndef VBOX
- qemu_irq_lower (pThis->pic[pThis->irq]);
-#else
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
-#endif
}
break;
@@ -1366,20 +1327,12 @@ static IO_READ_PROTO(dsp_read)
if (!ack)
LogFlowFunc(("read %#x -> %#x\n", nport, retval));
-#ifndef VBOX
- return retval;
-#else
*pu32 = retval;
return VINF_SUCCESS;
-#endif
error:
LogFlowFunc(("warning: dsp_read %#x error\n", nport));
-#ifndef VBOX
- return 0xff;
-#else
return VERR_IOM_IOPORT_UNUSED;
-#endif
}
static void sb16MixerReset(PSB16STATE pThis)
@@ -1414,14 +1367,19 @@ static void sb16MixerReset(PSB16STATE pThis)
pThis->mixer_regs[0x0e] = 0;
/* voice volume L d5,d7, R d1,d3 */
- pThis->mixer_regs[0x04] = (4 << 5) | (4 << 1);
+ pThis->mixer_regs[0x04] = (12 << 4) | 12;
/* master ... */
- pThis->mixer_regs[0x22] = (4 << 5) | (4 << 1);
+ pThis->mixer_regs[0x22] = (12 << 4) | 12;
/* MIDI ... */
- pThis->mixer_regs[0x26] = (4 << 5) | (4 << 1);
+ pThis->mixer_regs[0x26] = (12 << 4) | 12;
- for (int i = 0x30; i < 0x48; i++)
- pThis->mixer_regs[i] = 0x20;
+ /* master/voice/MIDI L/R volume */
+ for (int i = 0x30; i < 0x36; i++)
+ pThis->mixer_regs[i] = 24 << 3; /* -14 dB */
+
+ /* treble/bass */
+ for (int i = 0x44; i < 0x48; i++)
+ pThis->mixer_regs[i] = 0x80;
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
int rc2 = audioMixerCreate("SB16 Mixer", 0 /* uFlags */, &pThis->pMixer);
@@ -1432,7 +1390,7 @@ static void sb16MixerReset(PSB16STATE pThis)
streamCfg.uHz = 41000;
streamCfg.cChannels = 2;
streamCfg.enmFormat = AUD_FMT_S16;
- streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
rc2 = audioMixerSetDeviceFormat(pThis->pMixer, &streamCfg);
AssertRC(rc2);
@@ -1443,6 +1401,10 @@ static void sb16MixerReset(PSB16STATE pThis)
AssertRC(rc2);
}
#endif
+
+ /* Update the master (mixer) and PCM out volumes. */
+ sb16SetMasterVolume(pThis);
+ sb16SetPcmOutVolume(pThis);
}
static IO_WRITE_PROTO(mixer_write_indexb)
@@ -1451,9 +1413,7 @@ static IO_WRITE_PROTO(mixer_write_indexb)
(void) nport;
pThis->mixer_nreg = val;
-#ifdef VBOX
return VINF_SUCCESS;
-#endif
}
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
@@ -1469,7 +1429,7 @@ uint32_t popcount (uint32_t u) /** @todo r=andy WTF? */
uint32_t lsbindex (uint32_t u)
{
- return popcount ((u&-u)-1); /** @todo r=andy Un/signed mismatch? */
+ return popcount ((u & -(int32_t)u) - 1);
}
#endif
@@ -1556,9 +1516,7 @@ static IO_WRITE_PROTO(mixer_write_datab)
case 0x82:
LogFlowFunc(("attempt to write into IRQ status register (val=%#x)\n", val));
-#ifdef VBOX
return VINF_SUCCESS;
-#endif
default:
if (pThis->mixer_nreg >= 0x80)
@@ -1568,49 +1526,19 @@ static IO_WRITE_PROTO(mixer_write_datab)
pThis->mixer_regs[pThis->mixer_nreg] = val;
-#ifdef VBOX
/* Update the master (mixer) volume. */
if (fUpdateMaster)
- {
- int mute = 0; /** @todo Handle (un)muting. */
- uint8_t lvol = pThis->mixer_regs[0x30];
- uint8_t rvol = pThis->mixer_regs[0x31];
-
-#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
- PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol };
- audioMixerSetMasterVolume(pThis->pMixer, &vol);
-#else
- AUD_set_volume(AUD_MIXER_VOLUME, &mute, &lvol, &rvol);
-#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
- }
+ sb16SetMasterVolume(pThis);
/* Update the stream (PCM) volume. */
if (fUpdateStream)
- {
- int mute = 0; /** @todo Handle (un)muting. */
- uint8_t lvol = pThis->mixer_regs[0x32];
- uint8_t rvol = pThis->mixer_regs[0x33];
-
-#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
- PDMAUDIOVOLUME vol = { RT_BOOL(mute), lvol, rvol };
- audioMixerSetSinkVolume(pThis->pSinkOutput, &vol);
-#else
- AUD_set_volume(AUD_MIXER_PCM, &mute, &lvol, &rvol);
-#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
- }
-#endif /* VBOX */
+ sb16SetPcmOutVolume(pThis);
-#ifdef VBOX
return VINF_SUCCESS;
-#endif
}
static IO_WRITE_PROTO(mixer_write)
{
-#ifndef VBOX
- mixer_write_indexb (opaque, nport, val & 0xff);
- mixer_write_datab (opaque, nport, (val >> 8) & 0xff);
-#else /* VBOX */
PSB16STATE pThis = (PSB16STATE)opaque;
int iport = nport - pThis->port;
switch (cb)
@@ -1635,7 +1563,6 @@ static IO_WRITE_PROTO(mixer_write)
break;
}
return VINF_SUCCESS;
-#endif /* VBOX */
}
static IO_READ_PROTO(mixer_read)
@@ -1652,42 +1579,29 @@ static IO_READ_PROTO(mixer_read)
LogFlowFunc(("mixer_read[%#x] -> %#x\n",
pThis->mixer_nreg, pThis->mixer_regs[pThis->mixer_nreg]));
#endif
-#ifndef VBOX
- return pThis->mixer_regs[pThis->mixer_nreg];
-#else
*pu32 = pThis->mixer_regs[pThis->mixer_nreg];
return VINF_SUCCESS;
-#endif
}
-static int sb16WriteAudio(PSB16STATE pThis, int nchan, int dma_pos,
- int dma_len, int len)
+static int sb16WriteAudio(PSB16STATE pThis, int nchan, uint32_t dma_pos,
+ uint32_t dma_len, int len)
{
- uint8_t tmpbuf[_4K]; /** @todo Have a buffer on the heap. */
-
- int cbToWrite = len;
- int cbWrittenTotal = 0;
+ uint8_t tmpbuf[_4K]; /** @todo Have a buffer on the heap. */
+ uint32_t cbToWrite = len;
+ uint32_t cbWrittenTotal = 0;
while (cbToWrite)
{
-#ifndef VBOX
- size_t cbToRead;
- int cbRead;
-#else
uint32_t cbWrittenMin = UINT32_MAX;
- size_t cbToRead;
+ uint32_t cbToRead;
uint32_t cbRead;
-#endif
+
cbToRead = RT_MIN(dma_len - dma_pos, cbToWrite);
if (cbToRead > sizeof(tmpbuf))
cbToRead = sizeof(tmpbuf);
-#ifndef VBOX
- cbRead = DMA_read_memory (nchan, tmpbuf, dma_pos, cbToRead);
-#else
int rc = PDMDevHlpDMAReadMemory(pThis->pDevIns, nchan, tmpbuf, dma_pos, cbToRead, &cbRead);
AssertMsgRC(rc, ("DMAReadMemory -> %Rrc\n", rc));
-#endif
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
uint32_t cbWritten;
@@ -1722,11 +1636,7 @@ static int sb16WriteAudio(PSB16STATE pThis, int nchan, int dma_pos,
return cbWrittenTotal;
}
-#ifndef VBOX
-static int sb16DMARead(void *opaque, int nchan, int dma_pos, int dma_len)
-#else
static DECLCALLBACK(uint32_t) sb16DMARead(PPDMDEVINS pDevIns, void *opaque, unsigned nchan, uint32_t dma_pos, uint32_t dma_len)
-#endif
{
PSB16STATE pThis = (PSB16STATE)opaque;
int till, copy, written, free;
@@ -1803,11 +1713,7 @@ static DECLCALLBACK(uint32_t) sb16DMARead(PPDMDEVINS pDevIns, void *opaque, unsi
if (pThis->left_till_irq <= 0)
{
pThis->mixer_regs[0x82] |= (nchan & 4) ? 2 : 1;
-#ifndef VBOX
- qemu_irq_raise (pThis->pic[pThis->irq]);
-#else
PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 1);
-#endif
if (0 == pThis->dma_auto)
{
sb16Control(pThis, 0);
@@ -1833,10 +1739,8 @@ static void sb16AudioCallback(void *pvContext, int cbFree)
PSB16STATE pState = (PSB16STATE)pvContext;
AssertPtrReturnVoid(pState);
pState->audio_free = cbFree;
-#ifdef VBOX
/* New space available, see if we can transfer more. There is no cyclic DMA timer in VBox. */
PDMDevHlpDMASchedule(pState->pDevIns);
-#endif
}
#else
static DECLCALLBACK(void) sb16TimerIO(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
@@ -1907,122 +1811,111 @@ static DECLCALLBACK(void) sb16TimerIO(PPDMDEVINS pDevIns, PTMTIMER pTimer, void
}
#endif /* !VBOX_WITH_PDM_AUDIO_DRIVER */
-static void SB_save (QEMUFile *f, void *opaque)
+static void sb16Save(PSSMHANDLE pSSM, PSB16STATE pThis)
{
-#ifndef VBOX
- PSB16STATE pThis = opaque;
-#else
- PSB16STATE pThis = (PSB16STATE)opaque;
-#endif
+ SSMR3PutS32(pSSM, pThis->irq);
+ SSMR3PutS32(pSSM, pThis->dma);
+ SSMR3PutS32(pSSM, pThis->hdma);
+ SSMR3PutS32(pSSM, pThis->port);
+ SSMR3PutS32(pSSM, pThis->ver);
+ SSMR3PutS32(pSSM, pThis->in_index);
+ SSMR3PutS32(pSSM, pThis->out_data_len);
+ SSMR3PutS32(pSSM, pThis->fmt_stereo);
+ SSMR3PutS32(pSSM, pThis->fmt_signed);
+ SSMR3PutS32(pSSM, pThis->fmt_bits);
+
+ SSMR3PutU32(pSSM, pThis->fmt);
+
+ SSMR3PutS32(pSSM, pThis->dma_auto);
+ SSMR3PutS32(pSSM, pThis->block_size);
+ SSMR3PutS32(pSSM, pThis->fifo);
+ SSMR3PutS32(pSSM, pThis->freq);
+ SSMR3PutS32(pSSM, pThis->time_const);
+ SSMR3PutS32(pSSM, pThis->speaker);
+ SSMR3PutS32(pSSM, pThis->needed_bytes);
+ SSMR3PutS32(pSSM, pThis->cmd);
+ SSMR3PutS32(pSSM, pThis->use_hdma);
+ SSMR3PutS32(pSSM, pThis->highspeed);
+ SSMR3PutS32(pSSM, pThis->can_write);
+ SSMR3PutS32(pSSM, pThis->v2x6);
+
+ SSMR3PutU8 (pSSM, pThis->csp_param);
+ SSMR3PutU8 (pSSM, pThis->csp_value);
+ SSMR3PutU8 (pSSM, pThis->csp_mode);
+ SSMR3PutU8 (pSSM, pThis->csp_param); /* Bug compatible! */
+ SSMR3PutMem(pSSM, pThis->csp_regs, 256);
+ SSMR3PutU8 (pSSM, pThis->csp_index);
+ SSMR3PutMem(pSSM, pThis->csp_reg83, 4);
+ SSMR3PutS32(pSSM, pThis->csp_reg83r);
+ SSMR3PutS32(pSSM, pThis->csp_reg83w);
+
+ SSMR3PutMem(pSSM, pThis->in2_data, sizeof (pThis->in2_data));
+ SSMR3PutMem(pSSM, pThis->out_data, sizeof (pThis->out_data));
+ SSMR3PutU8 (pSSM, pThis->test_reg);
+ SSMR3PutU8 (pSSM, pThis->last_read_byte);
+
+ SSMR3PutS32(pSSM, pThis->nzero);
+ SSMR3PutS32(pSSM, pThis->left_till_irq);
+ SSMR3PutS32(pSSM, pThis->dma_running);
+ SSMR3PutS32(pSSM, pThis->bytes_per_second);
+ SSMR3PutS32(pSSM, pThis->align);
+
+ SSMR3PutS32(pSSM, pThis->mixer_nreg);
+ SSMR3PutMem(pSSM, pThis->mixer_regs, 256);
- qemu_put_be32 (f, pThis->irq);
- qemu_put_be32 (f, pThis->dma);
- qemu_put_be32 (f, pThis->hdma);
- qemu_put_be32 (f, pThis->port);
- qemu_put_be32 (f, pThis->ver);
- qemu_put_be32 (f, pThis->in_index);
- qemu_put_be32 (f, pThis->out_data_len);
- qemu_put_be32 (f, pThis->fmt_stereo);
- qemu_put_be32 (f, pThis->fmt_signed);
- qemu_put_be32 (f, pThis->fmt_bits);
- qemu_put_be32s (f, &pThis->fmt);
- qemu_put_be32 (f, pThis->dma_auto);
- qemu_put_be32 (f, pThis->block_size);
- qemu_put_be32 (f, pThis->fifo);
- qemu_put_be32 (f, pThis->freq);
- qemu_put_be32 (f, pThis->time_const);
- qemu_put_be32 (f, pThis->speaker);
- qemu_put_be32 (f, pThis->needed_bytes);
- qemu_put_be32 (f, pThis->cmd);
- qemu_put_be32 (f, pThis->use_hdma);
- qemu_put_be32 (f, pThis->highspeed);
- qemu_put_be32 (f, pThis->can_write);
- qemu_put_be32 (f, pThis->v2x6);
-
- qemu_put_8s (f, &pThis->csp_param);
- qemu_put_8s (f, &pThis->csp_value);
- qemu_put_8s (f, &pThis->csp_mode);
- qemu_put_8s (f, &pThis->csp_param);
- qemu_put_buffer (f, pThis->csp_regs, 256);
- qemu_put_8s (f, &pThis->csp_index);
- qemu_put_buffer (f, pThis->csp_reg83, 4);
- qemu_put_be32 (f, pThis->csp_reg83r);
- qemu_put_be32 (f, pThis->csp_reg83w);
-
- qemu_put_buffer (f, pThis->in2_data, sizeof (pThis->in2_data));
- qemu_put_buffer (f, pThis->out_data, sizeof (pThis->out_data));
- qemu_put_8s (f, &pThis->test_reg);
- qemu_put_8s (f, &pThis->last_read_byte);
-
- qemu_put_be32 (f, pThis->nzero);
- qemu_put_be32 (f, pThis->left_till_irq);
- qemu_put_be32 (f, pThis->dma_running);
- qemu_put_be32 (f, pThis->bytes_per_second);
- qemu_put_be32 (f, pThis->align);
-
- qemu_put_be32 (f, pThis->mixer_nreg);
- qemu_put_buffer (f, pThis->mixer_regs, 256);
}
-static int SB_load (QEMUFile *f, void *opaque, int version_id)
+static int sb16Load(PSSMHANDLE pSSM, PSB16STATE pThis, int version_id)
{
-#ifndef VBOX
- PSB16STATE pThis = opaque;
-
- if (version_id != 1) {
- return -EINVAL;
- }
-#else
- PSB16STATE pThis = (PSB16STATE)opaque;
-#endif
-
- pThis->irq=qemu_get_be32 (f);
- pThis->dma=qemu_get_be32 (f);
- pThis->hdma=qemu_get_be32 (f);
- pThis->port=qemu_get_be32 (f);
- pThis->ver=qemu_get_be32 (f);
- pThis->in_index=qemu_get_be32 (f);
- pThis->out_data_len=qemu_get_be32 (f);
- pThis->fmt_stereo=qemu_get_be32 (f);
- pThis->fmt_signed=qemu_get_be32 (f);
- pThis->fmt_bits=qemu_get_be32 (f);
- qemu_get_be32s (f, (uint32_t*)&pThis->fmt);
- pThis->dma_auto=qemu_get_be32 (f);
- pThis->block_size=qemu_get_be32 (f);
- pThis->fifo=qemu_get_be32 (f);
- pThis->freq=qemu_get_be32 (f);
- pThis->time_const=qemu_get_be32 (f);
- pThis->speaker=qemu_get_be32 (f);
- pThis->needed_bytes=qemu_get_be32 (f);
- pThis->cmd=qemu_get_be32 (f);
- pThis->use_hdma=qemu_get_be32 (f);
- pThis->highspeed=qemu_get_be32 (f);
- pThis->can_write=qemu_get_be32 (f);
- pThis->v2x6=qemu_get_be32 (f);
-
- qemu_get_8s (f, &pThis->csp_param);
- qemu_get_8s (f, &pThis->csp_value);
- qemu_get_8s (f, &pThis->csp_mode);
- qemu_get_8s (f, &pThis->csp_param);
- qemu_get_buffer (f, pThis->csp_regs, 256);
- qemu_get_8s (f, &pThis->csp_index);
- qemu_get_buffer (f, pThis->csp_reg83, 4);
- pThis->csp_reg83r=qemu_get_be32 (f);
- pThis->csp_reg83w=qemu_get_be32 (f);
-
- qemu_get_buffer (f, pThis->in2_data, sizeof (pThis->in2_data));
- qemu_get_buffer (f, pThis->out_data, sizeof (pThis->out_data));
- qemu_get_8s (f, &pThis->test_reg);
- qemu_get_8s (f, &pThis->last_read_byte);
-
- pThis->nzero=qemu_get_be32 (f);
- pThis->left_till_irq=qemu_get_be32 (f);
- pThis->dma_running=qemu_get_be32 (f);
- pThis->bytes_per_second=qemu_get_be32 (f);
- pThis->align=qemu_get_be32 (f);
-
- pThis->mixer_nreg=qemu_get_be32 (f);
- qemu_get_buffer (f, pThis->mixer_regs, 256);
+ SSMR3GetS32(pSSM, &pThis->irq);
+ SSMR3GetS32(pSSM, &pThis->dma);
+ SSMR3GetS32(pSSM, &pThis->hdma);
+ SSMR3GetS32(pSSM, &pThis->port);
+ SSMR3GetS32(pSSM, &pThis->ver);
+ SSMR3GetS32(pSSM, &pThis->in_index);
+ SSMR3GetS32(pSSM, &pThis->out_data_len);
+ SSMR3GetS32(pSSM, &pThis->fmt_stereo);
+ SSMR3GetS32(pSSM, &pThis->fmt_signed);
+ SSMR3GetS32(pSSM, &pThis->fmt_bits);
+
+ SSMR3GetU32(pSSM, (uint32_t *)&pThis->fmt);
+
+ SSMR3GetS32(pSSM, &pThis->dma_auto);
+ SSMR3GetS32(pSSM, &pThis->block_size);
+ SSMR3GetS32(pSSM, &pThis->fifo);
+ SSMR3GetS32(pSSM, &pThis->freq);
+ SSMR3GetS32(pSSM, &pThis->time_const);
+ SSMR3GetS32(pSSM, &pThis->speaker);
+ SSMR3GetS32(pSSM, &pThis->needed_bytes);
+ SSMR3GetS32(pSSM, &pThis->cmd);
+ SSMR3GetS32(pSSM, &pThis->use_hdma);
+ SSMR3GetS32(pSSM, &pThis->highspeed);
+ SSMR3GetS32(pSSM, &pThis->can_write);
+ SSMR3GetS32(pSSM, &pThis->v2x6);
+
+ SSMR3GetU8 (pSSM, &pThis->csp_param);
+ SSMR3GetU8 (pSSM, &pThis->csp_value);
+ SSMR3GetU8 (pSSM, &pThis->csp_mode);
+ SSMR3GetU8 (pSSM, &pThis->csp_param); /* Bug compatible! */
+ SSMR3GetMem(pSSM, pThis->csp_regs, 256);
+ SSMR3GetU8 (pSSM, &pThis->csp_index);
+ SSMR3GetMem(pSSM, pThis->csp_reg83, 4);
+ SSMR3GetS32(pSSM, &pThis->csp_reg83r);
+ SSMR3GetS32(pSSM, &pThis->csp_reg83w);
+
+ SSMR3GetMem(pSSM, pThis->in2_data, sizeof (pThis->in2_data));
+ SSMR3GetMem(pSSM, pThis->out_data, sizeof (pThis->out_data));
+ SSMR3GetU8 (pSSM, &pThis->test_reg);
+ SSMR3GetU8 (pSSM, &pThis->last_read_byte);
+
+ SSMR3GetS32(pSSM, &pThis->nzero);
+ SSMR3GetS32(pSSM, &pThis->left_till_irq);
+ SSMR3GetS32(pSSM, &pThis->dma_running);
+ SSMR3GetS32(pSSM, &pThis->bytes_per_second);
+ SSMR3GetS32(pSSM, &pThis->align);
+
+ SSMR3GetS32(pSSM, &pThis->mixer_nreg);
+ SSMR3GetMem(pSSM, pThis->mixer_regs, 256);
#ifdef VBOX_WITH_PDM_AUDIO_DRIVER
PSB16DRIVER pDrv;
@@ -2048,7 +1941,7 @@ static int SB_load (QEMUFile *f, void *opaque, int version_id)
streamCfg.uHz = pThis->freq;
streamCfg.cChannels = 1 << pThis->fmt_stereo;
streamCfg.enmFormat = pThis->fmt;
- streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
int rc = sb16OpenOut(pThis, &streamCfg);
AssertRC(rc);
@@ -2075,76 +1968,9 @@ static int SB_load (QEMUFile *f, void *opaque, int version_id)
sb16SpeakerControl(pThis, pThis->speaker);
}
-#ifdef VBOX
return VINF_SUCCESS;
-#endif
-}
-
-#ifndef VBOX
-int SB16_init (AudioState *audio, qemu_irq *pic)
-{
- PSB16STATE pThis;
- int i;
- static const uint8_t dsp_write_ports[] = {0x6, 0xc};
- static const uint8_t dsp_read_ports[] = {0x6, 0xa, 0xc, 0xd, 0xe, 0xf};
-
- if (!audio) {
- LogFlowFunc(("No audio state\n"));
- return -1;
- }
-
- s = qemu_mallocz (sizeof (*s));
- if (!s) {
- LogFlowFunc(("Could not allocate memory for SB16 (%zu bytes)\n",
- sizeof (*s));
- return -1;
- }
-
- pThis->cmd = -1;
- pThis->pic = pic;
- pThis->irq = conf.irq;
- pThis->dma = conf.dma;
- pThis->hdma = conf.hdma;
- pThis->port = conf.port;
- pThis->ver = conf.ver_lo | (conf.ver_hi << 8);
-
- pThis->mixer_regs[0x80] = magic_of_irq (pThis->irq);
- pThis->mixer_regs[0x81] = (1 << pThis->dma) | (1 << pThis->hdma);
- pThis->mixer_regs[0x82] = 2 << 5;
-
- pThis->csp_regs[5] = 1;
- pThis->csp_regs[9] = 0xf8;
-
- sb16MixerReset(pThis);
- pThis->aux_ts = qemu_new_timer (vm_clock, aux_timer, s);
- if (!pThis->aux_ts) {
- LogFlowFunc(("warning: Could not create auxiliary timer\n"));
- }
-
- for (i = 0; i < LENOFA (dsp_write_ports); i++) {
- register_ioport_write (pThis->port + dsp_write_ports[i], 1, 1, dsp_write, s);
- }
-
- for (i = 0; i < LENOFA (dsp_read_ports); i++) {
- register_ioport_read (pThis->port + dsp_read_ports[i], 1, 1, dsp_read, s);
- }
-
- register_ioport_write (pThis->port + 0x4, 1, 1, mixer_write_indexb, s);
- register_ioport_write (pThis->port + 0x4, 1, 2, mixer_write_indexw, s);
- register_ioport_read (pThis->port + 0x5, 1, 1, mixer_read, s);
- register_ioport_write (pThis->port + 0x5, 1, 1, mixer_write_datab, s);
-
- DMA_register_channel (pThis->hdma, sb16DMARead, s);
- DMA_register_channel (pThis->dma, sb16DMARead, s);
- pThis->can_write = 1;
-
- register_savevm ("sb16", 0, 1, SB_save, SB_load, s);
- AUD_register_card (audio, "sb16", &pThis->card);
- return 0;
}
-#else /* VBOX */
-
static DECLCALLBACK(int) sb16LiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass)
{
PSB16STATE pThis = PDMINS_2_DATA(pDevIns, PSB16STATE);
@@ -2161,8 +1987,8 @@ static DECLCALLBACK(int) sb16SaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
{
PSB16STATE pThis = PDMINS_2_DATA(pDevIns, PSB16STATE);
- sb16LiveExec (pDevIns, pSSM, 0);
- SB_save (pSSM, pThis);
+ sb16LiveExec(pDevIns, pSSM, 0);
+ sb16Save(pSSM, pThis);
return VINF_SUCCESS;
}
@@ -2207,7 +2033,7 @@ static DECLCALLBACK(int) sb16LoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint3
if (uPass != SSM_PASS_FINAL)
return VINF_SUCCESS;
- SB_load(pSSM, pThis, uVersion);
+ sb16Load(pSSM, pThis, uVersion);
return VINF_SUCCESS;
}
@@ -2252,12 +2078,47 @@ static int sb16OpenOut(PSB16STATE pThis, PPDMAUDIOSTREAMCFG pCfg)
uLUN++;
}
+ /* Ensure volume gets propagated. */
+ audioMixerInvalidate(pThis->pMixer);
return rc;
}
#endif /* VBOX_WITH_PDM_AUDIO_DRIVER */
/**
+ * @interface_method_impl{PDMDEVREG,pfnReset}
+ */
+static DECLCALLBACK(void) sb16DevReset(PPDMDEVINS pDevIns)
+{
+ PSB16STATE pThis = PDMINS_2_DATA(pDevIns, PSB16STATE);
+
+ /* Bring back the device to initial state, and especially make
+ * sure there's no interrupt or DMA activity.
+ */
+ PDMDevHlpISASetIrq(pThis->pDevIns, pThis->irq, 0);
+
+ pThis->mixer_regs[0x82] = 0;
+ pThis->csp_regs[5] = 1;
+ pThis->csp_regs[9] = 0xf8;
+
+ pThis->dma_auto = 0;
+ pThis->in_index = 0;
+ pThis->out_data_len = 0;
+ pThis->left_till_irq = 0;
+ pThis->needed_bytes = 0;
+ pThis->block_size = -1;
+ pThis->nzero = 0;
+ pThis->highspeed = 0;
+ pThis->v2x6 = 0;
+ pThis->cmd = -1;
+
+ sb16MixerReset(pThis);
+ sb16SpeakerControl(pThis, 0);
+ sb16Control(pThis, 0);
+ sb16ResetLegacy(pThis);
+}
+
+/**
* @interface_method_impl{PDMIBASE,pfnQueryInterface}
*/
static DECLCALLBACK(void *) sb16QueryInterface(struct PDMIBASE *pInterface, const char *pszIID)
@@ -2541,7 +2402,7 @@ const PDMDEVREG g_DeviceSB16 =
/* pfnPowerOn */
NULL,
/* pfnReset */
- NULL,
+ sb16DevReset,
/* pfnSuspend */
NULL,
/* pfnResume */
@@ -2561,5 +2422,3 @@ const PDMDEVREG g_DeviceSB16 =
/* u32VersionEnd */
PDM_DEVREG_VERSION
};
-#endif /* VBOX */
-
diff --git a/src/VBox/Devices/Audio/DrvAudio.cpp b/src/VBox/Devices/Audio/DrvAudio.cpp
index 87bed81..463ac22 100644
--- a/src/VBox/Devices/Audio/DrvAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvAudio.cpp
@@ -62,7 +62,6 @@
#include <VBox/log.h>
#include "VBoxDD.h"
-#include "vl_vbox.h"
#include <ctype.h>
#include <stdlib.h>
@@ -284,8 +283,8 @@ static bool drvAudioStreamCfgIsValid(PPDMAUDIOSTREAMCFG pCfg)
bool fValid = ( pCfg->cChannels == 1
|| pCfg->cChannels == 2); /* Either stereo (2) or mono (1), per stream. */
- fValid |= ( pCfg->enmEndianness == PDMAUDIOENDIANESS_LITTLE
- || pCfg->enmEndianness == PDMAUDIOENDIANESS_BIG);
+ fValid |= ( pCfg->enmEndianness == PDMAUDIOENDIANNESS_LITTLE
+ || pCfg->enmEndianness == PDMAUDIOENDIANNESS_BIG);
if (fValid)
{
@@ -341,7 +340,7 @@ void audio_pcm_info_clear_buf(PPDMPCMPROPS pPCMInfo, void *pvBuf, int len)
short s = INT16_MAX;
if (pPCMInfo->fSwapEndian)
- s = bswap16(s);
+ s = RT_BSWAP_U16(s);
for (i = 0; i < len << shift; i++)
p[i] = s;
@@ -356,7 +355,7 @@ void audio_pcm_info_clear_buf(PPDMPCMPROPS pPCMInfo, void *pvBuf, int len)
int32_t s = INT32_MAX;
if (pPCMInfo->fSwapEndian)
- s = bswap32(s);
+ s = RT_BSWAP_U32(s);
for (i = 0; i < len << shift; i++)
p[i] = s;
@@ -395,8 +394,8 @@ int drvAudioDestroyHstOut(PDRVAUDIO pThis, PPDMAUDIOHSTSTRMOUT pHstStrmOut)
}
else
{
- LogFlowFunc(("[%s] Still is being used, rc=%Rrc\n", pHstStrmOut->MixBuf.pszName, rc));
rc = VERR_ACCESS_DENIED;
+ LogFlowFunc(("[%s] Still is being used, rc=%Rrc\n", pHstStrmOut->MixBuf.pszName, rc));
}
return rc;
@@ -860,7 +859,7 @@ static int drvAudioAllocHstIn(PDRVAUDIO pThis, const char *pszName, PPDMAUDIOSTR
* @param pcbWritten
*/
int drvAudioWrite(PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMOUT pGstStrmOut,
- const void *pvBuf, size_t cbBuf, uint32_t *pcbWritten)
+ const void *pvBuf, uint32_t cbBuf, uint32_t *pcbWritten)
{
PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
AssertPtrReturn(pThis, VERR_INVALID_POINTER);
@@ -975,8 +974,8 @@ int drvAudioDestroyHstIn(PDRVAUDIO pThis, PPDMAUDIOHSTSTRMIN pHstStrmIn)
}
else
{
- LogFlowFunc(("[%s] Still is being used, rc=%Rrc\n", pHstStrmIn->MixBuf.pszName, rc));
rc = VERR_ACCESS_DENIED;
+ LogFlowFunc(("[%s] Still is being used, rc=%Rrc\n", pHstStrmIn->MixBuf.pszName, rc));
}
return rc;
@@ -1400,7 +1399,7 @@ static DECLCALLBACK(int) drvAudioInitNull(PPDMIAUDIOCONNECTOR pInterface)
}
static DECLCALLBACK(int) drvAudioRead(PPDMIAUDIOCONNECTOR pInterface, PPDMAUDIOGSTSTRMIN pGstStrmIn,
- void *pvBuf, size_t cbBuf, uint32_t *pcbRead)
+ void *pvBuf, uint32_t cbBuf, uint32_t *pcbRead)
{
PDRVAUDIO pThis = PDMIAUDIOCONNECTOR_2_DRVAUDIO(pInterface);
AssertPtrReturn(pThis, VERR_INVALID_POINTER);
diff --git a/src/VBox/Devices/Audio/DrvAudio.h b/src/VBox/Devices/Audio/DrvAudio.h
index 69de7f3..fa30217 100644
--- a/src/VBox/Devices/Audio/DrvAudio.h
+++ b/src/VBox/Devices/Audio/DrvAudio.h
@@ -176,7 +176,7 @@ static struct {
44100, /* freq */
2, /* nchannels */
AUD_FMT_S16, /* fmt */
- PDMAUDIOHOSTENDIANESS
+ PDMAUDIOHOSTENDIANNESS
}
},
@@ -189,7 +189,7 @@ static struct {
44100, /* freq */
2, /* nchannels */
AUD_FMT_S16, /* fmt */
- PDMAUDIOHOSTENDIANESS
+ PDMAUDIOHOSTENDIANNESS
}
},
diff --git a/src/VBox/Devices/Audio/DrvAudioCommon.cpp b/src/VBox/Devices/Audio/DrvAudioCommon.cpp
index bd4b0bf..2be7151 100644
--- a/src/VBox/Devices/Audio/DrvAudioCommon.cpp
+++ b/src/VBox/Devices/Audio/DrvAudioCommon.cpp
@@ -307,7 +307,7 @@ bool drvAudioPCMPropsAreEqual(PPDMPCMPROPS pProps, PPDMAUDIOSTREAMCFG pCfg)
&& pProps->cChannels == pCfg->cChannels
&& pProps->fSigned == fSigned
&& pProps->cBits == cBits
- && pProps->fSwapEndian == !(pCfg->enmEndianness == PDMAUDIOHOSTENDIANESS);
+ && pProps->fSwapEndian == !(pCfg->enmEndianness == PDMAUDIOHOSTENDIANNESS);
LogFlowFunc(("fEqual=%RTbool\n", fEqual));
return fEqual;
@@ -356,7 +356,7 @@ int drvAudioStreamCfgToProps(PPDMAUDIOSTREAMCFG pCfg, PPDMPCMPROPS pProps)
pProps->cShift = (pCfg->cChannels == 2) + cShift;
pProps->uAlign = (1 << pProps->cShift) - 1;
pProps->cbPerSec = pProps->uHz << pProps->cShift;
- pProps->fSwapEndian = pCfg->enmEndianness != PDMAUDIOHOSTENDIANESS;
+ pProps->fSwapEndian = pCfg->enmEndianness != PDMAUDIOHOSTENDIANNESS;
}
#ifdef DEBUG
@@ -400,10 +400,10 @@ void drvAudioStreamCfgPrint(PPDMAUDIOSTREAMCFG pCfg)
LogFlow((", endianness="));
switch (pCfg->enmEndianness)
{
- case PDMAUDIOENDIANESS_LITTLE:
+ case PDMAUDIOENDIANNESS_LITTLE:
LogFlow(("little\n"));
break;
- case PDMAUDIOENDIANESS_BIG:
+ case PDMAUDIOENDIANNESS_BIG:
LogFlow(("big\n"));
break;
default:
diff --git a/src/VBox/Devices/Audio/DrvHostALSAAudio.cpp b/src/VBox/Devices/Audio/DrvHostALSAAudio.cpp
index 76c44f0..19455bd 100644
--- a/src/VBox/Devices/Audio/DrvHostALSAAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvHostALSAAudio.cpp
@@ -218,7 +218,7 @@ static snd_pcm_format_t drvHostALSAAudioFmtToALSA(PDMAUDIOFMT fmt)
}
static int drvHostALSAAudioALSAToFmt(snd_pcm_format_t fmt,
- PDMAUDIOFMT *pFmt, PDMAUDIOENDIANESS *pEndianness)
+ PDMAUDIOFMT *pFmt, PDMAUDIOENDIANNESS *pEndianness)
{
AssertPtrReturn(pFmt, VERR_INVALID_POINTER);
/* pEndianness is optional. */
@@ -228,61 +228,61 @@ static int drvHostALSAAudioALSAToFmt(snd_pcm_format_t fmt,
case SND_PCM_FORMAT_S8:
*pFmt = AUD_FMT_S8;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
case SND_PCM_FORMAT_U8:
*pFmt = AUD_FMT_U8;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
case SND_PCM_FORMAT_S16_LE:
*pFmt = AUD_FMT_S16;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
case SND_PCM_FORMAT_U16_LE:
*pFmt = AUD_FMT_U16;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
case SND_PCM_FORMAT_S16_BE:
*pFmt = AUD_FMT_S16;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_BIG;
+ *pEndianness = PDMAUDIOENDIANNESS_BIG;
break;
case SND_PCM_FORMAT_U16_BE:
*pFmt = AUD_FMT_U16;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_BIG;
+ *pEndianness = PDMAUDIOENDIANNESS_BIG;
break;
case SND_PCM_FORMAT_S32_LE:
*pFmt = AUD_FMT_S32;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
case SND_PCM_FORMAT_U32_LE:
*pFmt = AUD_FMT_U32;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
case SND_PCM_FORMAT_S32_BE:
*pFmt = AUD_FMT_S32;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_BIG;
+ *pEndianness = PDMAUDIOENDIANNESS_BIG;
break;
case SND_PCM_FORMAT_U32_BE:
*pFmt = AUD_FMT_U32;
if (pEndianness)
- *pEndianness = PDMAUDIOENDIANESS_BIG;
+ *pEndianness = PDMAUDIOENDIANNESS_BIG;
break;
default:
@@ -1087,7 +1087,7 @@ static DECLCALLBACK(int) drvHostALSAAudioInitOut(PPDMIHOSTAUDIO pInterface,
break;
PDMAUDIOFMT enmFormat;
- PDMAUDIOENDIANESS enmEnd;
+ PDMAUDIOENDIANNESS enmEnd;
rc = drvHostALSAAudioALSAToFmt(obt.fmt, &enmFormat, &enmEnd);
if (RT_FAILURE(rc))
break;
@@ -1158,7 +1158,7 @@ static DECLCALLBACK(int) drvHostALSAAudioInitIn(PPDMIHOSTAUDIO pInterface,
break;
PDMAUDIOFMT enmFormat;
- PDMAUDIOENDIANESS enmEnd;
+ PDMAUDIOENDIANNESS enmEnd;
rc = drvHostALSAAudioALSAToFmt(obt.fmt, &enmFormat, &enmEnd);
if (RT_FAILURE(rc))
break;
diff --git a/src/VBox/Devices/Audio/DrvHostDSound.cpp b/src/VBox/Devices/Audio/DrvHostDSound.cpp
index d9fc226..dc654a1 100644
--- a/src/VBox/Devices/Audio/DrvHostDSound.cpp
+++ b/src/VBox/Devices/Audio/DrvHostDSound.cpp
@@ -988,7 +988,7 @@ static DECLCALLBACK(int) drvHostDSoundInitOut(PPDMIHOSTAUDIO pInterface,
PDSOUNDSTREAMOUT pDSoundStrmOut = (PDSOUNDSTREAMOUT)pHstStrmOut;
pDSoundStrmOut->streamCfg = *pCfg;
- pDSoundStrmOut->streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ pDSoundStrmOut->streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
int rc = drvAudioStreamCfgToProps(&pDSoundStrmOut->streamCfg, &pDSoundStrmOut->hw.Props);
if (RT_SUCCESS(rc))
@@ -1228,7 +1228,7 @@ static DECLCALLBACK(int) drvHostDSoundInitIn(PPDMIHOSTAUDIO pInterface,
pHstStrmIn, pCfg, enmRecSource));
pDSoundStrmIn->streamCfg = *pCfg;
- pDSoundStrmIn->streamCfg.enmEndianness = PDMAUDIOHOSTENDIANESS;
+ pDSoundStrmIn->streamCfg.enmEndianness = PDMAUDIOHOSTENDIANNESS;
/** @todo caller should already init Props? */
int rc = drvAudioStreamCfgToProps(&pDSoundStrmIn->streamCfg, &pHstStrmIn->Props);
diff --git a/src/VBox/Devices/Audio/DrvHostNullAudio.cpp b/src/VBox/Devices/Audio/DrvHostNullAudio.cpp
index a3918bc..fa1107a 100644
--- a/src/VBox/Devices/Audio/DrvHostNullAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvHostNullAudio.cpp
@@ -60,6 +60,7 @@ typedef struct NULLAUDIOSTREAMOUT
{
/** Note: Always must come first! */
PDMAUDIOHSTSTRMOUT hw;
+ uint64_t u64TicksLast;
} NULLAUDIOSTREAMOUT;
typedef struct NULLAUDIOSTREAMIN
@@ -133,6 +134,8 @@ static DECLCALLBACK(int) drvHostNullAudioInitOut(PPDMIHOSTAUDIO pInterface,
int rc = drvAudioStreamCfgToProps(pCfg, &pHstStrmOut->Props);
if (RT_SUCCESS(rc))
{
+ NULLAUDIOSTREAMOUT *pNullStrmOut = (NULLAUDIOSTREAMOUT *)pHstStrmOut;
+ pNullStrmOut->u64TicksLast = 0;
if (pcSamples)
*pcSamples = _1K;
}
@@ -150,8 +153,27 @@ static DECLCALLBACK(bool) drvHostNullAudioIsEnabled(PPDMIHOSTAUDIO pInterface, P
static DECLCALLBACK(int) drvHostNullAudioPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUDIOHSTSTRMOUT pHstStrmOut,
uint32_t *pcSamplesPlayed)
{
- /* Always pretend consuming all samples available at this time. */
- const uint32_t cSamplesPlayed = audioMixBufSize(&pHstStrmOut->MixBuf);
+ PDRVHOSTNULLAUDIO pDrv = RT_FROM_MEMBER(pInterface, DRVHOSTNULLAUDIO, IHostAudio);
+ NULLAUDIOSTREAMOUT *pNullStrmOut = (NULLAUDIOSTREAMOUT *)pHstStrmOut;
+
+ /* Consume as many samples as would be played at the current frequency since last call. */
+ uint32_t csLive = drvAudioHstOutSamplesLive(pHstStrmOut, NULL /* pcStreamsLive */);
+ uint64_t u64TicksNow = PDMDrvHlpTMGetVirtualTime(pDrv->pDrvIns);
+ uint64_t u64TicksElapsed = u64TicksNow - pNullStrmOut->u64TicksLast;
+ uint64_t u64TicksFreq = PDMDrvHlpTMGetVirtualFreq(pDrv->pDrvIns);
+
+ /* Remember when samples were consumed. */
+ pNullStrmOut->u64TicksLast = u64TicksNow;
+
+ /* Minimize the rounding error by adding 0.5: samples = int((u64TicksElapsed * samplesFreq) / u64TicksFreq + 0.5).
+ * If rounding is not taken into account then the playback rate will be consistently lower that expected.
+ */
+ uint64_t cSamplesPlayed = (2 * u64TicksElapsed * pHstStrmOut->Props.uHz + u64TicksFreq) / u64TicksFreq / 2;
+
+ /* Don't play more than available. */
+ if (cSamplesPlayed > csLive)
+ cSamplesPlayed = csLive;
+
audioMixBufFinish(&pHstStrmOut->MixBuf, cSamplesPlayed);
if (pcSamplesPlayed)
diff --git a/src/VBox/Devices/Audio/DrvHostOSSAudio.cpp b/src/VBox/Devices/Audio/DrvHostOSSAudio.cpp
index 4994f8a..853fea7 100644
--- a/src/VBox/Devices/Audio/DrvHostOSSAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvHostOSSAudio.cpp
@@ -57,7 +57,7 @@ typedef struct DRVHOSTOSSAUDIO
typedef struct OSSAUDIOSTREAMCFG
{
PDMAUDIOFMT enmFormat;
- PDMAUDIOENDIANESS enmEndianess;
+ PDMAUDIOENDIANNESS enmENDIANNESS;
uint16_t uFreq;
uint8_t cChannels;
uint16_t cFragments;
@@ -156,44 +156,44 @@ static int drvHostOSSAudioFmtToOSS(PDMAUDIOFMT fmt)
}
static int drvHostOSSAudioOSSToFmt(int fmt,
- PDMAUDIOFMT *pFmt, PDMAUDIOENDIANESS *pEndianess)
+ PDMAUDIOFMT *pFmt, PDMAUDIOENDIANNESS *pENDIANNESS)
{
switch (fmt)
{
case AFMT_S8:
*pFmt = AUD_FMT_S8;
- if (pEndianess)
- *pEndianess = PDMAUDIOENDIANESS_LITTLE;
+ if (pENDIANNESS)
+ *pENDIANNESS = PDMAUDIOENDIANNESS_LITTLE;
break;
case AFMT_U8:
*pFmt = AUD_FMT_U8;
- if (pEndianess)
- *pEndianess = PDMAUDIOENDIANESS_LITTLE;
+ if (pENDIANNESS)
+ *pENDIANNESS = PDMAUDIOENDIANNESS_LITTLE;
break;
case AFMT_S16_LE:
*pFmt = AUD_FMT_S16;
- if (pEndianess)
- *pEndianess = PDMAUDIOENDIANESS_LITTLE;
+ if (pENDIANNESS)
+ *pENDIANNESS = PDMAUDIOENDIANNESS_LITTLE;
break;
case AFMT_U16_LE:
*pFmt = AUD_FMT_U16;
- if (pEndianess)
- *pEndianess = PDMAUDIOENDIANESS_LITTLE;
+ if (pENDIANNESS)
+ *pENDIANNESS = PDMAUDIOENDIANNESS_LITTLE;
break;
case AFMT_S16_BE:
*pFmt = AUD_FMT_S16;
- if (pEndianess)
- *pEndianess = PDMAUDIOENDIANESS_BIG;
+ if (pENDIANNESS)
+ *pENDIANNESS = PDMAUDIOENDIANNESS_BIG;
break;
case AFMT_U16_BE:
*pFmt = AUD_FMT_U16;
- if (pEndianess)
- *pEndianess = PDMAUDIOENDIANESS_BIG;
+ if (pENDIANNESS)
+ *pENDIANNESS = PDMAUDIOENDIANNESS_BIG;
break;
default:
@@ -311,7 +311,7 @@ static int drvHostOSSAudioOpen(bool fIn,
}
rc = drvHostOSSAudioOSSToFmt(iFormat,
- &pObt->enmFormat, &pObt->enmEndianess);
+ &pObt->enmFormat, &pObt->enmENDIANNESS);
if (RT_SUCCESS(rc))
{
pObt->cChannels = cChannels;
@@ -596,7 +596,7 @@ static DECLCALLBACK(int) drvHostOSSAudioInitIn(PPDMIHOSTAUDIO pInterface,
streamCfg.enmFormat = obtStream.enmFormat;
streamCfg.uHz = obtStream.uFreq;
streamCfg.cChannels = pCfg->cChannels;
- streamCfg.enmEndianness = obtStream.enmEndianess;
+ streamCfg.enmEndianness = obtStream.enmENDIANNESS;
rc = drvAudioStreamCfgToProps(&streamCfg, &pHstStrmIn->Props);
if (RT_SUCCESS(rc))
@@ -673,7 +673,7 @@ static DECLCALLBACK(int) drvHostOSSAudioInitOut(PPDMIHOSTAUDIO pInterface,
streamCfg.enmFormat = obtStream.enmFormat;
streamCfg.uHz = obtStream.uFreq;
streamCfg.cChannels = pCfg->cChannels;
- streamCfg.enmEndianness = obtStream.enmEndianess;
+ streamCfg.enmEndianness = obtStream.enmENDIANNESS;
rc = drvAudioStreamCfgToProps(&streamCfg, &pHstStrmOut->Props);
if (RT_SUCCESS(rc))
diff --git a/src/VBox/Devices/Audio/DrvHostPulseAudio.cpp b/src/VBox/Devices/Audio/DrvHostPulseAudio.cpp
index 0a6117e..e6a4807 100644
--- a/src/VBox/Devices/Audio/DrvHostPulseAudio.cpp
+++ b/src/VBox/Devices/Audio/DrvHostPulseAudio.cpp
@@ -153,36 +153,36 @@ static pa_sample_format_t drvHostPulseAudioFmtToPulse(PDMAUDIOFMT fmt)
}
static int drvHostPulseAudioPulseToFmt(pa_sample_format_t pulsefmt,
- PDMAUDIOFMT *pFmt, PDMAUDIOENDIANESS *pEndianess)
+ PDMAUDIOFMT *pFmt, PDMAUDIOENDIANNESS *pEndianness)
{
switch (pulsefmt)
{
case PA_SAMPLE_U8:
*pFmt = AUD_FMT_U8;
- *pEndianess = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
case PA_SAMPLE_S16LE:
*pFmt = AUD_FMT_S16;
- *pEndianess = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
case PA_SAMPLE_S16BE:
*pFmt = AUD_FMT_S16;
- *pEndianess = PDMAUDIOENDIANESS_BIG;
+ *pEndianness = PDMAUDIOENDIANNESS_BIG;
break;
#ifdef PA_SAMPLE_S32LE
case PA_SAMPLE_S32LE:
*pFmt = AUD_FMT_S32;
- *pEndianess = PDMAUDIOENDIANESS_LITTLE;
+ *pEndianness = PDMAUDIOENDIANNESS_LITTLE;
break;
#endif
#ifdef PA_SAMPLE_S32BE
case PA_SAMPLE_S32BE:
*pFmt = AUD_FMT_S32;
- *pEndianess = PDMAUDIOENDIANESS_BIG;
+ *pEndianness = PDMAUDIOENDIANNESS_BIG;
break;
#endif
@@ -601,7 +601,7 @@ static DECLCALLBACK(int) drvHostPulseAudioInitOut(PPDMIHOSTAUDIO pInterface,
{
uint32_t cbBuf = RT_MIN(pThisStrmOut->BufAttr.tlength * 2,
pThisStrmOut->BufAttr.maxlength); /** @todo Make this configurable! */
- if (cbBuf)
+ if (cbBuf)
{
pThisStrmOut->pvPCMBuf = RTMemAllocZ(cbBuf);
if (pThisStrmOut->pvPCMBuf)
@@ -851,16 +851,16 @@ static DECLCALLBACK(int) drvHostPulseAudioPlayOut(PPDMIHOSTAUDIO pInterface, PPD
uint32_t cRead, cbRead;
while (cbToRead)
{
- rc = audioMixBufReadCirc(&pHstStrmOut->MixBuf, pThisStrmOut->pvPCMBuf,
+ rc = audioMixBufReadCirc(&pHstStrmOut->MixBuf, pThisStrmOut->pvPCMBuf,
RT_MIN(cbToRead, pThisStrmOut->cbPCMBuf), &cRead);
- if ( !cRead
+ if ( !cRead
|| RT_FAILURE(rc))
{
break;
}
cbRead = AUDIOMIXBUF_S2B(&pHstStrmOut->MixBuf, cRead);
- if (pa_stream_write(pThisStrmOut->pStream, pThisStrmOut->pvPCMBuf, cbRead, NULL /* Cleanup callback */,
+ if (pa_stream_write(pThisStrmOut->pStream, pThisStrmOut->pvPCMBuf, cbRead, NULL /* Cleanup callback */,
0, PA_SEEK_RELATIVE) < 0)
{
rc = drvHostPulseAudioError(pThisStrmOut->pDrv, "Failed to write to output stream");
@@ -871,7 +871,7 @@ static DECLCALLBACK(int) drvHostPulseAudioPlayOut(PPDMIHOSTAUDIO pInterface, PPD
cbToRead -= cbRead;
cbReadTotal += cbRead;
- LogFlowFunc(("\tcRead=%RU32 (%zu bytes) cbReadTotal=%RU32, cbToRead=%RU32\n",
+ LogFlowFunc(("\tcRead=%RU32 (%zu bytes) cbReadTotal=%RU32, cbToRead=%RU32\n",
cRead, AUDIOMIXBUF_S2B(&pHstStrmOut->MixBuf, cRead), cbReadTotal, cbToRead));
}
diff --git a/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp b/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp
index 4ac7367..a47e9cb 100644
--- a/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp
+++ b/src/VBox/Devices/Audio/testcase/tstAudioMixBuffer.cpp
@@ -45,7 +45,7 @@ static int tstSingle(RTTEST hTest)
44100, /* Hz */
2 /* Channels */,
AUD_FMT_S16 /* Format */,
- PDMAUDIOENDIANESS_LITTLE /* Endianess */
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
};
PDMPCMPROPS props;
@@ -60,7 +60,7 @@ static int tstSingle(RTTEST hTest)
PDMAUDIOMIXBUF mb;
RTTESTI_CHECK_RC_OK(audioMixBufInit(&mb, "Single", &props, cBufSize));
RTTESTI_CHECK(audioMixBufSize(&mb) == cBufSize);
- RTTESTI_CHECK(AUDIOMIXBUF_B2S(&mb, audioMixBufSizeBytes(&mb)) == cBufSize);
+ RTTESTI_CHECK(AUDIOMIXBUF_B2S(&mb, audioMixBufSizeBytes(&mb)) == cBufSize);
RTTESTI_CHECK(AUDIOMIXBUF_S2B(&mb, audioMixBufSize(&mb)) == audioMixBufSizeBytes(&mb));
RTTESTI_CHECK(audioMixBufFree(&mb) == cBufSize);
RTTESTI_CHECK(AUDIOMIXBUF_S2B(&mb, audioMixBufFree(&mb)) == audioMixBufFreeBytes(&mb));
@@ -91,15 +91,15 @@ static int tstSingle(RTTEST hTest)
/*
* Circular writes.
*/
- size_t cToWrite = audioMixBufSize(&mb) - written_abs - 1; /* -1 as padding plus -2 samples for above. */
- for (size_t i = 0; i < cToWrite; i++)
+ uint32_t cToWrite = audioMixBufSize(&mb) - written_abs - 1; /* -1 as padding plus -2 samples for above. */
+ for (uint32_t i = 0; i < cToWrite; i++)
{
RTTESTI_CHECK_RC_OK(audioMixBufWriteCirc(&mb, &samples16, sizeof(samples16), &written));
RTTESTI_CHECK(written == 1);
}
RTTESTI_CHECK(!audioMixBufIsEmpty(&mb));
RTTESTI_CHECK(audioMixBufFree(&mb) == 1);
- RTTESTI_CHECK(audioMixBufFreeBytes(&mb) == AUDIOMIXBUF_S2B(&mb, 1));
+ RTTESTI_CHECK(audioMixBufFreeBytes(&mb) == AUDIOMIXBUF_S2B(&mb, 1U));
RTTESTI_CHECK(audioMixBufProcessed(&mb) == cToWrite + written_abs /* + last absolute write */);
RTTESTI_CHECK_RC_OK(audioMixBufWriteCirc(&mb, &samples16, sizeof(samples16), &written));
@@ -109,8 +109,8 @@ static int tstSingle(RTTEST hTest)
RTTESTI_CHECK(audioMixBufProcessed(&mb) == cBufSize);
/* Circular reads. */
- size_t cToRead = audioMixBufSize(&mb) - written_abs - 1;
- for (size_t i = 0; i < cToWrite; i++)
+ uint32_t cToRead = audioMixBufSize(&mb) - written_abs - 1;
+ for (uint32_t i = 0; i < cToWrite; i++)
{
RTTESTI_CHECK_RC_OK(audioMixBufReadCirc(&mb, &samples16, sizeof(samples16), &read));
RTTESTI_CHECK(read == 1);
@@ -128,6 +128,8 @@ static int tstSingle(RTTEST hTest)
RTTESTI_CHECK(audioMixBufFreeBytes(&mb) == AUDIOMIXBUF_S2B(&mb, cBufSize - written_abs));
RTTESTI_CHECK(audioMixBufProcessed(&mb) == written_abs);
+ audioMixBufDestroy(&mb);
+
return RTTestSubErrorCount(hTest) ? VERR_GENERAL_FAILURE : VINF_SUCCESS;
}
@@ -142,7 +144,7 @@ static int tstParentChild(RTTEST hTest)
44100, /* Hz */
2 /* Channels */,
AUD_FMT_S16 /* Format */,
- PDMAUDIOENDIANESS_LITTLE /* Endianess */
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
};
PDMPCMPROPS props;
@@ -157,7 +159,7 @@ static int tstParentChild(RTTEST hTest)
22100, /* Hz */
2 /* Channels */,
AUD_FMT_S16 /* Format */,
- PDMAUDIOENDIANESS_LITTLE /* Endianess */
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
};
rc = drvAudioStreamCfgToProps(&cfg_c1, &props);
@@ -172,7 +174,7 @@ static int tstParentChild(RTTEST hTest)
48000, /* Hz */
2 /* Channels */,
AUD_FMT_S16 /* Format */,
- PDMAUDIOENDIANESS_LITTLE /* Endianess */
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
};
rc = drvAudioStreamCfgToProps(&cfg_c2, &props);
@@ -185,10 +187,10 @@ static int tstParentChild(RTTEST hTest)
/*
* Writing + mixing from child/children -> parent, sequential.
*/
- size_t cbBuf = _1K;
+ uint32_t cbBuf = _1K;
char pvBuf[_1K];
int16_t samples[32] = { 0xAA, 0xBB };
- uint32_t free, read , written, proc, mixed, temp;
+ uint32_t read , written, mixed, temp;
uint32_t cChild1Free = cBufSize;
uint32_t cChild1Mixed = 0;
@@ -232,6 +234,331 @@ static int tstParentChild(RTTEST hTest)
RTTESTI_CHECK(audioMixBufMixed(&child1) == 0);
RTTESTI_CHECK(audioMixBufMixed(&child2) == 0);
+ audioMixBufDestroy(&parent);
+ audioMixBufDestroy(&child1);
+ audioMixBufDestroy(&child2);
+
+ return RTTestSubErrorCount(hTest) ? VERR_GENERAL_FAILURE : VINF_SUCCESS;
+}
+
+/* Test 8-bit sample conversion (8-bit -> internal -> 8-bit). */
+static int tstConversion8(RTTEST hTest)
+{
+ unsigned i;
+ uint32_t cBufSize = 256;
+ PDMPCMPROPS props;
+
+
+ RTTestSubF(hTest, "Sample conversion");
+
+ PDMAUDIOSTREAMCFG cfg_p =
+ {
+ 44100, /* Hz */
+ 1 /* Channels */,
+ AUD_FMT_U8 /* Format */,
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
+ };
+
+ int rc = drvAudioStreamCfgToProps(&cfg_p, &props);
+ AssertRC(rc);
+
+ PDMAUDIOMIXBUF parent;
+ RTTESTI_CHECK_RC_OK(audioMixBufInit(&parent, "Parent", &props, cBufSize));
+
+ /* Child uses half the sample rate; that ensures the mixing engine can't
+ * take shortcuts and performs conversion. Because conversion to double
+ * the sample rate effectively inserts one additional sample between every
+ * two source samples, N source samples will be converted to N * 2 - 1
+ * samples. However, the last source sample will be saved for later
+ * interpolation and not immediately output.
+ */
+ PDMAUDIOSTREAMCFG cfg_c = /* Upmixing to parent */
+ {
+ 22050, /* Hz */
+ 1 /* Channels */,
+ AUD_FMT_U8 /* Format */,
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
+ };
+
+ rc = drvAudioStreamCfgToProps(&cfg_c, &props);
+ AssertRC(rc);
+
+ PDMAUDIOMIXBUF child;
+ RTTESTI_CHECK_RC_OK(audioMixBufInit(&child, "Child", &props, cBufSize));
+ RTTESTI_CHECK_RC_OK(audioMixBufLinkTo(&child, &parent));
+
+ /* 8-bit unsigned samples. Often used with SB16 device. */
+ uint8_t samples[16] = { 0xAA, 0xBB, 0, 1, 43, 125, 126, 127,
+ 128, 129, 130, 131, 132, UINT8_MAX - 1, UINT8_MAX, 0 };
+
+ /*
+ * Writing + mixing from child -> parent, sequential.
+ */
+ uint32_t cbBuf = 256;
+ char achBuf[256];
+ uint32_t read, written, mixed, temp;
+
+ uint32_t cChildFree = cBufSize;
+ uint32_t cChildMixed = 0;
+ uint32_t cSamplesChild = 16;
+ uint32_t cSamplesParent = cSamplesChild * 2 - 2;
+ uint32_t cSamplesRead = 0;
+
+ /**** 8-bit unsigned samples ****/
+ RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Conversion test %uHz %uch 8-bit\n", cfg_c.uHz, cfg_c.cChannels);
+ RTTESTI_CHECK_RC_OK(audioMixBufWriteAt(&child, 0, &samples, sizeof(samples), &written));
+ RTTESTI_CHECK_MSG(written == cSamplesChild, ("Child: Expected %RU32 written samples, got %RU32\n", cSamplesChild, written));
+ RTTESTI_CHECK_RC_OK(audioMixBufMixToParent(&child, written, &mixed));
+ temp = audioMixBufProcessed(&parent);
+ RTTESTI_CHECK_MSG(audioMixBufMixed(&child) == temp, ("Child: Expected %RU32 mixed samples, got %RU32\n", audioMixBufMixed(&child), temp));
+
+ RTTESTI_CHECK(audioMixBufProcessed(&parent) == audioMixBufMixed(&child));
+
+ for (;;)
+ {
+ RTTESTI_CHECK_RC_OK_BREAK(audioMixBufReadCirc(&parent, achBuf, cbBuf, &read));
+ if (!read)
+ break;
+ cSamplesRead += read;
+ audioMixBufFinish(&parent, read);
+ }
+ RTTESTI_CHECK_MSG(cSamplesRead == cSamplesParent, ("Parent: Expected %RU32 mixed samples, got %RU32\n", cSamplesParent, cSamplesRead));
+
+ /* Check that the samples came out unharmed. Every other sample is interpolated and we ignore it. */
+ /* NB: This also checks that the default volume setting is 0dB attenuation. */
+ uint8_t *pSrc8 = &samples[0];
+ uint8_t *pDst8 = (uint8_t *)achBuf;
+
+ for (i = 0; i < cSamplesChild - 1; ++i)
+ {
+ RTTESTI_CHECK_MSG(*pSrc8 == *pDst8, ("index %u: Dst=%d, Src=%d\n", i, *pDst8, *pSrc8));
+ pSrc8 += 1;
+ pDst8 += 2;
+ }
+
+ RTTESTI_CHECK(audioMixBufProcessed(&parent) == 0);
+ RTTESTI_CHECK(audioMixBufMixed(&child) == 0);
+
+ audioMixBufDestroy(&parent);
+ audioMixBufDestroy(&child);
+
+ return RTTestSubErrorCount(hTest) ? VERR_GENERAL_FAILURE : VINF_SUCCESS;
+}
+
+/* Test 16-bit sample conversion (16-bit -> internal -> 16-bit). */
+static int tstConversion16(RTTEST hTest)
+{
+ unsigned i;
+ uint32_t cBufSize = 256;
+ PDMPCMPROPS props;
+
+
+ RTTestSubF(hTest, "Sample conversion 16-bit");
+
+ PDMAUDIOSTREAMCFG cfg_p =
+ {
+ 44100, /* Hz */
+ 1 /* Channels */,
+ AUD_FMT_S16 /* Format */,
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
+ };
+
+ int rc = drvAudioStreamCfgToProps(&cfg_p, &props);
+ AssertRC(rc);
+
+ PDMAUDIOMIXBUF parent;
+ RTTESTI_CHECK_RC_OK(audioMixBufInit(&parent, "Parent", &props, cBufSize));
+
+ PDMAUDIOSTREAMCFG cfg_c = /* Upmixing to parent */
+ {
+ 22050, /* Hz */
+ 1 /* Channels */,
+ AUD_FMT_S16 /* Format */,
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
+ };
+
+ rc = drvAudioStreamCfgToProps(&cfg_c, &props);
+ AssertRC(rc);
+
+ PDMAUDIOMIXBUF child;
+ RTTESTI_CHECK_RC_OK(audioMixBufInit(&child, "Child", &props, cBufSize));
+ RTTESTI_CHECK_RC_OK(audioMixBufLinkTo(&child, &parent));
+
+ /* 16-bit signed. More or less exclusively used as output, and usually as input, too. */
+ int16_t samples[16] = { 0xAA, 0xBB, INT16_MIN, INT16_MIN + 1, INT16_MIN / 2, -3, -2, -1,
+ 0, 1, 2, 3, INT16_MAX / 2, INT16_MAX - 1, INT16_MAX, 0 };
+
+ /*
+ * Writing + mixing from child -> parent, sequential.
+ */
+ uint32_t cbBuf = 256;
+ char achBuf[256];
+ uint32_t read, written, mixed, temp;
+
+ uint32_t cChildFree = cBufSize;
+ uint32_t cChildMixed = 0;
+ uint32_t cSamplesChild = 16;
+ uint32_t cSamplesParent = cSamplesChild * 2 - 2;
+ uint32_t cSamplesRead = 0;
+
+ /**** 16-bit signed samples ****/
+ RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Conversion test %uHz %uch 16-bit\n", cfg_c.uHz, cfg_c.cChannels);
+ RTTESTI_CHECK_RC_OK(audioMixBufWriteAt(&child, 0, &samples, sizeof(samples), &written));
+ RTTESTI_CHECK_MSG(written == cSamplesChild, ("Child: Expected %RU32 written samples, got %RU32\n", cSamplesChild, written));
+ RTTESTI_CHECK_RC_OK(audioMixBufMixToParent(&child, written, &mixed));
+ temp = audioMixBufProcessed(&parent);
+ RTTESTI_CHECK_MSG(audioMixBufMixed(&child) == temp, ("Child: Expected %RU32 mixed samples, got %RU32\n", audioMixBufMixed(&child), temp));
+
+ RTTESTI_CHECK(audioMixBufProcessed(&parent) == audioMixBufMixed(&child));
+
+ for (;;)
+ {
+ RTTESTI_CHECK_RC_OK_BREAK(audioMixBufReadCirc(&parent, achBuf, cbBuf, &read));
+ if (!read)
+ break;
+ cSamplesRead += read;
+ audioMixBufFinish(&parent, read);
+ }
+ RTTESTI_CHECK_MSG(cSamplesRead == cSamplesParent, ("Parent: Expected %RU32 mixed samples, got %RU32\n", cSamplesParent, cSamplesRead));
+
+ /* Check that the samples came out unharmed. Every other sample is interpolated and we ignore it. */
+ /* NB: This also checks that the default volume setting is 0dB attenuation. */
+ int16_t *pSrc16 = &samples[0];
+ int16_t *pDst16 = (int16_t *)achBuf;
+
+ for (i = 0; i < cSamplesChild - 1; ++i)
+ {
+ RTTESTI_CHECK_MSG(*pSrc16 == *pDst16, ("index %u: Dst=%d, Src=%d\n", i, *pDst16, *pSrc16));
+ pSrc16 += 1;
+ pDst16 += 2;
+ }
+
+ RTTESTI_CHECK(audioMixBufProcessed(&parent) == 0);
+ RTTESTI_CHECK(audioMixBufMixed(&child) == 0);
+
+ audioMixBufDestroy(&parent);
+ audioMixBufDestroy(&child);
+
+ return RTTestSubErrorCount(hTest) ? VERR_GENERAL_FAILURE : VINF_SUCCESS;
+}
+
+/* Test volume control. */
+static int tstVolume(RTTEST hTest)
+{
+ unsigned i;
+ uint32_t cBufSize = 256;
+ PDMPCMPROPS props;
+
+
+ RTTestSubF(hTest, "Volume control");
+
+ /* Same for parent/child. */
+ PDMAUDIOSTREAMCFG cfg =
+ {
+ 44100, /* Hz */
+ 2 /* Channels */,
+ AUD_FMT_S16 /* Format */,
+ PDMAUDIOENDIANNESS_LITTLE /* ENDIANNESS */
+ };
+
+ int rc = drvAudioStreamCfgToProps(&cfg, &props);
+ AssertRC(rc);
+
+ PDMAUDIOVOLUME vol = { false, 0, 0 }; /* Not muted. */
+ PDMAUDIOMIXBUF parent;
+ RTTESTI_CHECK_RC_OK(audioMixBufInit(&parent, "Parent", &props, cBufSize));
+
+ PDMAUDIOMIXBUF child;
+ RTTESTI_CHECK_RC_OK(audioMixBufInit(&child, "Child", &props, cBufSize));
+ RTTESTI_CHECK_RC_OK(audioMixBufLinkTo(&child, &parent));
+
+ /* A few 16-bit signed samples. */
+ int16_t samples[16] = { INT16_MIN, INT16_MIN + 1, -128, -64, -4, -1, 0, 1,
+ 2, 255, 256, INT16_MAX / 2, INT16_MAX - 2, INT16_MAX - 1, INT16_MAX, 0 };
+
+ /*
+ * Writing + mixing from child -> parent.
+ */
+ uint32_t cbBuf = 256;
+ char achBuf[256];
+ uint32_t read, written, mixed;
+
+ uint32_t cChildFree = cBufSize;
+ uint32_t cChildMixed = 0;
+ uint32_t cSamplesChild = 8;
+ uint32_t cSamplesParent = cSamplesChild;
+ uint32_t cSamplesRead;
+ int16_t *pSrc16;
+ int16_t *pDst16;
+
+ /**** Volume control test ****/
+ RTTestPrintf(hTest, RTTESTLVL_DEBUG, "Volume control test %uHz %uch \n", cfg.uHz, cfg.cChannels);
+
+ /* 1) Full volume/0dB attenuation (255). */
+ vol.uLeft = vol.uRight = 255;
+ audioMixBufSetVolume(&child, &vol);
+
+ RTTESTI_CHECK_RC_OK(audioMixBufWriteAt(&child, 0, &samples, sizeof(samples), &written));
+ RTTESTI_CHECK_MSG(written == cSamplesChild, ("Child: Expected %RU32 written samples, got %RU32\n", cSamplesChild, written));
+ RTTESTI_CHECK_RC_OK(audioMixBufMixToParent(&child, written, &mixed));
+
+ cSamplesRead = 0;
+ for (;;)
+ {
+ RTTESTI_CHECK_RC_OK_BREAK(audioMixBufReadCirc(&parent, achBuf, cbBuf, &read));
+ if (!read)
+ break;
+ cSamplesRead += read;
+ audioMixBufFinish(&parent, read);
+ }
+ RTTESTI_CHECK_MSG(cSamplesRead == cSamplesParent, ("Parent: Expected %RU32 mixed samples, got %RU32\n", cSamplesParent, cSamplesRead));
+
+ /* Check that at 0dB the samples came out unharmed. */
+ pSrc16 = &samples[0];
+ pDst16 = (int16_t *)achBuf;
+
+ for (i = 0; i < cSamplesParent * 2 /* stereo */; ++i)
+ {
+ RTTESTI_CHECK_MSG(*pSrc16 == *pDst16, ("index %u: Dst=%d, Src=%d\n", i, *pDst16, *pSrc16));
+ ++pSrc16;
+ ++pDst16;
+ }
+ audioMixBufReset(&child);
+
+ /* 2) Half volume/-6dB attenuation (16 steps down). */
+ vol.uLeft = vol.uRight = 255 - 16;
+ audioMixBufSetVolume(&child, &vol);
+
+ RTTESTI_CHECK_RC_OK(audioMixBufWriteAt(&child, 0, &samples, sizeof(samples), &written));
+ RTTESTI_CHECK_MSG(written == cSamplesChild, ("Child: Expected %RU32 written samples, got %RU32\n", cSamplesChild, written));
+ RTTESTI_CHECK_RC_OK(audioMixBufMixToParent(&child, written, &mixed));
+
+ cSamplesRead = 0;
+ for (;;)
+ {
+ RTTESTI_CHECK_RC_OK_BREAK(audioMixBufReadCirc(&parent, achBuf, cbBuf, &read));
+ if (!read)
+ break;
+ cSamplesRead += read;
+ audioMixBufFinish(&parent, read);
+ }
+ RTTESTI_CHECK_MSG(cSamplesRead == cSamplesParent, ("Parent: Expected %RU32 mixed samples, got %RU32\n", cSamplesParent, cSamplesRead));
+
+ /* Check that at -6dB the sample values are halved. */
+ pSrc16 = &samples[0];
+ pDst16 = (int16_t *)achBuf;
+
+ for (i = 0; i < cSamplesParent * 2 /* stereo */; ++i)
+ {
+ /* Watch out! For negative values, x >> 1 is not the same as x / 2. */
+ RTTESTI_CHECK_MSG(*pSrc16 >> 1 == *pDst16, ("index %u: Dst=%d, Src=%d\n", i, *pDst16, *pSrc16));
+ ++pSrc16;
+ ++pDst16;
+ }
+
+ audioMixBufDestroy(&parent);
+ audioMixBufDestroy(&child);
+
return RTTestSubErrorCount(hTest) ? VERR_GENERAL_FAILURE : VINF_SUCCESS;
}
@@ -251,10 +578,15 @@ int main(int argc, char **argv)
rc = tstSingle(hTest);
if (RT_SUCCESS(rc))
rc = tstParentChild(hTest);
+ if (RT_SUCCESS(rc))
+ rc = tstConversion8(hTest);
+ if (RT_SUCCESS(rc))
+ rc = tstConversion16(hTest);
+ if (RT_SUCCESS(rc))
+ rc = tstVolume(hTest);
/*
* Summary
*/
return RTTestSummaryAndDestroy(hTest);
}
-
diff --git a/src/VBox/Devices/EFI/DevSmc.cpp b/src/VBox/Devices/EFI/DevSmc.cpp
index a315a66..fb29ec4 100644
--- a/src/VBox/Devices/EFI/DevSmc.cpp
+++ b/src/VBox/Devices/EFI/DevSmc.cpp
@@ -35,6 +35,9 @@
# include <iprt/asm-amd64-x86.h>
# include <iprt/once.h>
#endif
+#if defined(RT_OS_DARWIN) && defined(IN_RING3)
+# include "IOKit/IOKitLib.h"
+#endif
#include "VBoxDD.h"
@@ -501,6 +504,77 @@ PDMBOTHCBDECL(int) devR0SmcReqHandler(PPDMDEVINS pDevIns, uint32_t uOperation, u
#endif /* IN_RING0 */
+#if defined(IN_RING3) && defined(RT_OS_DARWIN)
+
+/**
+ * Preferred method to retrieve the SMC key.
+ *
+ * @param pabKey where to store the key.
+ * @param cbKey size of the buffer.
+ */
+static int getSmcKeyOs(char *pabKey, uint32_t cbKey)
+{
+ /*
+ * Method as described in Amit Singh's article:
+ * http://osxbook.com/book/bonus/chapter7/tpmdrmmyth/
+ */
+ typedef struct
+ {
+ uint32_t key;
+ uint8_t pad0[22];
+ uint32_t datasize;
+ uint8_t pad1[10];
+ uint8_t cmd;
+ uint32_t pad2;
+ uint8_t data[32];
+ } AppleSMCBuffer;
+
+ AssertReturn(cbKey >= 65, VERR_INTERNAL_ERROR);
+
+ io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
+ IOServiceMatching("AppleSMC"));
+ if (!service)
+ return VERR_NOT_FOUND;
+
+ io_connect_t port = (io_connect_t)0;
+ kern_return_t kr = IOServiceOpen(service, mach_task_self(), 0, &port);
+ IOObjectRelease(service);
+
+ if (kr != kIOReturnSuccess)
+ return RTErrConvertFromDarwin(kr);
+
+ AppleSMCBuffer inputStruct = { 0, {0}, 32, {0}, 5, };
+ AppleSMCBuffer outputStruct;
+ size_t cbOutputStruct = sizeof(outputStruct);
+
+ for (int i = 0; i < 2; i++)
+ {
+ inputStruct.key = (uint32_t)(i == 0 ? 'OSK0' : 'OSK1');
+ kr = IOConnectCallStructMethod((mach_port_t)port,
+ (uint32_t)2,
+ (const void *)&inputStruct,
+ sizeof(inputStruct),
+ (void *)&outputStruct,
+ &cbOutputStruct);
+ if (kr != kIOReturnSuccess)
+ {
+ IOServiceClose(port);
+ return RTErrConvertFromDarwin(kr);
+ }
+
+ for (int j = 0; j < 32; j++)
+ pabKey[j + i*32] = outputStruct.data[j];
+ }
+
+ IOServiceClose(port);
+
+ pabKey[64] = 0;
+
+ return VINF_SUCCESS;
+}
+
+#endif /* IN_RING3 && RT_OS_DARWIN */
+
#ifdef IN_RING3 /* For now. */
/** @callback_method_impl{DEVSMCKEYGETTER, OSK0 and OSK1} */
@@ -1337,7 +1411,7 @@ static DECLCALLBACK(int) smcConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMN
return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
N_("Configuration error: Querying \"DeviceKey\" as a string failed"));
- /* Query the key from the real hardware if asked to do so. */
+ /* Query the key from the OS / real hardware if asked to do so. */
bool fGetKeyFromRealSMC;
rc = CFGMR3QueryBoolDef(pCfg, "GetKeyFromRealSMC", &fGetKeyFromRealSMC, false);
if (RT_FAILURE(rc))
@@ -1345,7 +1419,22 @@ static DECLCALLBACK(int) smcConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGMN
N_("Configuration error: Querying \"GetKeyFromRealSMC\" as a boolean failed"));
if (fGetKeyFromRealSMC)
{
- rc = PDMDevHlpCallR0(pDevIns, SMC_CALLR0_READ_OSK, 0 /*u64Arg*/);
+#ifdef RT_OS_DARWIN
+ rc = getSmcKeyOs(pThis->szOsk0And1, sizeof(pThis->szOsk0And1));
+ if (RT_FAILURE(rc))
+ {
+ LogRel(("SMC: Retrieving the SMC key from the OS failed (%Rrc), trying to read it from hardware\n", rc));
+#endif
+ rc = PDMDevHlpCallR0(pDevIns, SMC_CALLR0_READ_OSK, 0 /*u64Arg*/);
+ if (RT_SUCCESS(rc))
+ LogRel(("SMC: Successfully retrieved the SMC key from hardware\n"));
+ else
+ LogRel(("SMC: Retrieving the SMC key from hardware failed(%Rrc)\n", rc));
+#ifdef RT_OS_DARWIN
+ }
+ else
+ LogRel(("SMC: Successfully retrieved the SMC key from the OS\n"));
+#endif
if (RT_FAILURE(rc))
return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
N_("Failed to query SMC value from the host"));
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/setup.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyEfiCompressor/setup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyUtility/setup.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/C/PyUtility/setup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/AutoGen.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/AutoGen.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/BuildEngine.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/BuildEngine.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenC.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenC.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenDepex.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenDepex.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenMake.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/GenMake.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/StrGather.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/StrGather.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/UniClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/AutoGen/UniClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/BPDG.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/BPDG.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/GenVpd.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/GenVpd.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/StringTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/BPDG/StringTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Database.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Database.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/DecClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/DecClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Dictionary.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Dictionary.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/DscClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/DscClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkIIWorkspace.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkIIWorkspace.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkIIWorkspaceBuild.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkIIWorkspaceBuild.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkLogger.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/EdkLogger.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Expression.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Expression.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/FdfClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/FdfClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/InfClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/InfClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/MigrationUtilities.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/MigrationUtilities.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Misc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Misc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Parsing.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/Parsing.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/String.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/String.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/TargetTxtClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/TargetTxtClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/ToolDefClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Common/ToolDefClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/ModuleClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/ModuleClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/PackageClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/PackageClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/PlatformClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/CommonDataClass/PlatformClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CLexer.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CLexer.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Check.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Check.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/CodeFragmentCollector.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Configuration.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Configuration.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Database.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Database.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Ecc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Ecc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Exception.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Exception.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/FileProfile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/FileProfile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaDataParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaDataParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Xml/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/Xml/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/c.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Ecc/c.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CLexer.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CLexer.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CodeFragmentCollector.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/CodeFragmentCollector.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Database.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Database.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Eot.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Eot.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/EotGlobalData.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/EotGlobalData.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/FileProfile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/FileProfile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/FvImage.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/FvImage.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/InfParserLite.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/InfParserLite.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Parser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/Parser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/c.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Eot/c.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/AprioriSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/AprioriSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Capsule.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Capsule.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/CapsuleData.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/CapsuleData.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/ComponentStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/ComponentStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/CompressSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/CompressSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/DataSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/DataSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/DepexSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/DepexSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/EfiSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/EfiSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Fd.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Fd.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FdfParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FdfParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Ffs.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Ffs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FfsFileStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FfsFileStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FfsInfStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FfsInfStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Fv.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Fv.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FvImageSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/FvImageSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GenFds.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GenFds.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GenFdsGlobalVariable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GuidSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/GuidSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptRomFileStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptRomFileStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptRomInfStatement.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptRomInfStatement.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptionRom.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/OptionRom.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Region.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Region.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Rule.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Rule.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/RuleComplexFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/RuleComplexFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/RuleSimpleFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/RuleSimpleFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Section.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Section.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/UiSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/UiSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/VerSection.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/VerSection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Vtf.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenFds/Vtf.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/GenPatchPcdTable/GenPatchPcdTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/PatchPcdValue/PatchPcdValue.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDataModel.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDataModel.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDec.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDec.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDsc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableDsc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableEotReport.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableEotReport.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFdf.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFdf.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFunction.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableFunction.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableIdentifier.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableIdentifier.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableInf.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableInf.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TablePcd.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TablePcd.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableQuery.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableQuery.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableReport.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Table/TableReport.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/TargetTool/TargetTool.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/TargetTool/TargetTool.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Trim/Trim.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Trim/Trim.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/BuildVersion.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/BuildVersion.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/DependencyRules.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/DependencyRules.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/DistributionPackageClass.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/DistributionPackageClass.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/IpiDb.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/IpiDb.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/PackageFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/PackageFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Core/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenDecFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenInfFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenInfFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenMetaFileMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenMetaFileMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenXmlFile.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/GenXmlFile.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/GenMetaFile/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/InstallPkg.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/InstallPkg.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/CommentGenerating.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/CommentGenerating.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/CommentParsing.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/CommentParsing.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/DataType.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/DataType.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/ExpressionValidate.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/GlobalData.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/GlobalData.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Misc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Misc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/ParserValidate.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/ParserValidate.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Parsing.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Parsing.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/String.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/String.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Xml/XmlRoutines.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Xml/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/Xml/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Library/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Logger/Log.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Logger/Log.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Logger/StringTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Logger/StringTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Logger/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Logger/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/MkPkg.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/MkPkg.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/CommonObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/CommonObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/ModuleObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/ModuleObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/PackageObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/PackageObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/POM/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/DecObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/DecObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfBinaryObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfBinaryObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfBuildOptionObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfBuildOptionObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDefineCommonObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDefineCommonObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDefineObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDepexObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfDepexObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfGuidObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfGuidObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfLibraryClassesObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfLibraryClassesObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPackagesObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPackagesObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPcdObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPcdObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPpiObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfPpiObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfProtocolObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfProtocolObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfSoucesObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfSoucesObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfUserExtensionObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/InfUserExtensionObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/Parser/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Object/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/DecParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/DecParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/DecParserMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/DecParserMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfAsBuiltProcess.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBinarySectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBinarySectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfBuildOptionSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfDefineSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfDefineSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfDepexSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfDepexSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfGuidPpiProtocolSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfLibrarySectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfLibrarySectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfPackageSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfPackageSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfParserMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfPcdSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfPcdSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfSourceSectionParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/InfSourceSectionParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Parser/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/DecPomAlignment.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignment.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignmentMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/InfPomAlignmentMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/PomAdapter/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/RmPkg.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/RmPkg.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UPT.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UPT.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/CommentGeneratingUnitTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/CommentGeneratingUnitTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/CommentParsingUnitTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/CommentParsingUnitTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/DecParserTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/DecParserUnitTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/InfBinarySectionTest.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/UnitTest/InfBinarySectionTest.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/CommonXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/CommonXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/GuidProtocolPpiXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/GuidProtocolPpiXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/IniToXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/IniToXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/ModuleSurfaceAreaXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/PackageSurfaceAreaXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/PackageSurfaceAreaXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/PcdXml.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/PcdXml.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/XmlParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/XmlParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/XmlParserMisc.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/XmlParserMisc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/__init__.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/UPT/Xml/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/BuildClassObject.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/BuildClassObject.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaDataTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaDataTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaFileParser.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaFileParser.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaFileTable.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/MetaFileTable.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/build/BuildReport.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/build/BuildReport.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/build/build.py b/src/VBox/Devices/EFI/Firmware/BaseTools/Source/Python/build/build.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd
index 6fdf3b1..e88b994 100644
Binary files a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd and b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI32.fd differ
diff --git a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd
index a0686f4..eec6f61 100644
Binary files a/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd and b/src/VBox/Devices/EFI/FirmwareBin/VBoxEFI64.fd differ
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
index 3f9ae24..c1ffbfc 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.asm
@@ -164,7 +164,7 @@
-section VGAROM progbits vstart=0x0 align=1 ; size=0x994 class=CODE group=AUTO
+section VGAROM progbits vstart=0x0 align=1 ; size=0x992 class=CODE group=AUTO
db 055h, 0aah, 040h, 0e9h, 062h, 00ah, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 049h, 042h
db 04dh, 000h
@@ -1500,22 +1500,20 @@ vbe_biosfn_set_get_palette_data: ; 0xc0917 LB 0x64
retn ; c3
mov ax, 0024fh ; b8 4f 02
retn ; c3
-vbe_biosfn_return_protected_mode_interface: ; 0xc097b LB 0x19
+vbe_biosfn_return_protected_mode_interface: ; 0xc097b LB 0x17
test bl, bl ; 84 db
- jne short 00990h ; 75 11
+ jne short 0098eh ; 75 0f
mov di, 0c000h ; bf 00 c0
mov es, di ; 8e c7
mov di, 04400h ; bf 00 44
mov cx, 00115h ; b9 15 01
- db 02bh, 0cfh
- ; sub cx, di ; 2b cf
mov ax, strict word 0004fh ; b8 4f 00
retn ; c3
mov ax, 0014fh ; b8 4f 01
retn ; c3
- ; Padding 0x6c bytes at 0xc0994
- times 108 db 0
+ ; Padding 0x6e bytes at 0xc0992
+ times 110 db 0
section _TEXT progbits vstart=0xa00 align=1 ; size=0x2f57 class=CODE group=AUTO
set_int_vector_: ; 0xc0a00 LB 0x1a
@@ -6771,7 +6769,7 @@ vesa_pm_end: ; 0xc4514 LB 0x1
section _DATA progbits vstart=0x4600 align=1 ; size=0x372a class=DATA group=DGROUP
_msg_vga_init: ; 0xc4600 LB 0x34
- db 'Oracle VM VirtualBox Version 5.0.0_BETA2 VGA BIOS', 00dh, 00ah, 000h
+ db 'Oracle VM VirtualBox Version 5.0.0_BETA3 VGA BIOS', 00dh, 00ah, 000h
_vga_modes: ; 0xc4634 LB 0x80
db 000h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 001h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h
db 002h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h, 003h, 000h, 000h, 004h, 000h, 0b8h, 0ffh, 002h
@@ -7666,7 +7664,7 @@ _vbebios_vendor_name: ; 0xc7c79 LB 0x13
_vbebios_product_name: ; 0xc7c8c LB 0x21
db 'Oracle VM VirtualBox VBE Adapter', 000h
_vbebios_product_revision: ; 0xc7cad LB 0x29
- db 'Oracle VM VirtualBox Version 5.0.0_BETA2', 000h
+ db 'Oracle VM VirtualBox Version 5.0.0_BETA3', 000h
_vbebios_info_string: ; 0xc7cd6 LB 0x2b
db 'VirtualBox VBE Display Adapter enabled', 00dh, 00ah, 00dh, 00ah, 000h
_no_vbebios_info_string: ; 0xc7d01 LB 0x29
@@ -7722,4 +7720,4 @@ section CONST2 progbits vstart=0x7d2a align=1 ; size=0x0 class=DATA group=DGROUP
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
db 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h, 000h
- db 000h, 000h, 000h, 000h, 000h, 0e0h
+ db 000h, 000h, 000h, 000h, 000h, 0dah
diff --git a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
index d9bc6e8..9a2b48a 100644
--- a/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
+++ b/src/VBox/Devices/Graphics/BIOS/VBoxVgaBiosAlternative.md5sum
@@ -1 +1 @@
-7e4d004d15d19ad5f6d812e04876154c *VBoxVgaBios.rom
+49f9c54e1d84c9818fa230acc4bd4025 *VBoxVgaBios.rom
diff --git a/src/VBox/Devices/Graphics/BIOS/vberom.asm b/src/VBox/Devices/Graphics/BIOS/vberom.asm
index e1ba7ce..5d58364 100644
--- a/src/VBox/Devices/Graphics/BIOS/vberom.asm
+++ b/src/VBox/Devices/Graphics/BIOS/vberom.asm
@@ -836,7 +836,6 @@ vbe_biosfn_return_protected_mode_interface:
mov es, di
mov di, offset vesa_pm_start
mov cx, vesa_pm_end - vesa_pm_start
- sub cx, di
mov ax, 004Fh
ret
_fail:
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp b/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
index b943ef1..6a25cae 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
@@ -1239,7 +1239,7 @@ PDMBOTHCBDECL(int) vmsvgaWritePort(PVGASTATE pThis, uint32_t u32)
pThis->svga.u32IrqMask = u32;
/* Irq pending after the above change? */
- if (pThis->svga.u32IrqMask & pThis->svga.u32IrqStatus)
+ if (pThis->svga.u32IrqStatus & u32)
{
Log(("SVGA_REG_IRQMASK: Trigger interrupt with status %x\n", pThis->svga.u32IrqStatus));
PDMDevHlpPCISetIrqNoWait(pThis->CTX_SUFF(pDevIns), 0, 1);
@@ -1497,7 +1497,10 @@ PDMBOTHCBDECL(int) vmsvgaIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port
ASMAtomicAndU32(&pThis->svga.u32IrqStatus, ~u32);
/* Clear the irq in case all events have been cleared. */
if (!(pThis->svga.u32IrqStatus & pThis->svga.u32IrqMask))
+ {
+ Log(("vmsvgaIOWrite SVGA_IRQSTATUS_PORT: clearing IRQ\n"));
PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 0);
+ }
break;
}
return rc;
@@ -1935,20 +1938,16 @@ static DECLCALLBACK(int) vmsvgaRegisterGMR(PPDMDEVINS pDevIns, uint32_t gmrId)
for (uint32_t i = 0; i < pGMR->numDescriptors; i++)
{
- rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pThis->pDevInsR3),
- PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
- pGMR->paDesc[i].GCPhys, pGMR->paDesc[i].GCPhys + pGMR->paDesc[i].numPages * PAGE_SIZE - 1,
- vmsvgaR3GMRAccessHandler, pThis,
- NULL, NULL, NULL,
- NULL, NULL, NULL,
- "VMSVGA GMR");
+ rc = PGMHandlerPhysicalRegister(PDMDevHlpGetVM(pThis->pDevInsR3),
+ pGMR->paDesc[i].GCPhys, pGMR->paDesc[i].GCPhys + pGMR->paDesc[i].numPages * PAGE_SIZE - 1,
+ pThis->svga.hGmrAccessHandlerType, pThis, NIL_RTR0PTR, NIL_RTRCPTR, "VMSVGA GMR");
AssertRC(rc);
}
return VINF_SUCCESS;
}
/* Callback handler for VMR3ReqCallWait */
-static DECLCALLBACK(int) vmsvgaUnregisterGMR(PPDMDEVINS pDevIns, uint32_t gmrId)
+static DECLCALLBACK(int) vmsvgaDeregisterGMR(PPDMDEVINS pDevIns, uint32_t gmrId)
{
PVGASTATE pThis = PDMINS_2_DATA(pDevIns, PVGASTATE);
PVMSVGASTATE pSVGAState = (PVMSVGASTATE)pThis->svga.pSVGAState;
@@ -3197,19 +3196,32 @@ static DECLCALLBACK(int) vmsvgaFIFOLoop(PPDMDEVINS pDevIns, PPDMTHREAD pThread)
ASMAtomicWriteU32(&pFIFO[SVGA_FIFO_STOP], offCurrentCmd);
STAM_REL_COUNTER_INC(&pSVGAState->StatFifoCommands);
- /* FIFO progress might trigger an interrupt. */
- if (pThis->svga.u32IrqMask & SVGA_IRQFLAG_FIFO_PROGRESS)
+ /*
+ * Raise IRQ if required. Must enter the critical section here
+ * before making final decisions here, otherwise cubebench and
+ * others may end up waiting forever.
+ */
+ if ( u32IrqStatus
+ || (pThis->svga.u32IrqMask & SVGA_IRQFLAG_FIFO_PROGRESS))
{
- Log(("vmsvgaFIFOLoop: fifo progress irq\n"));
- u32IrqStatus |= SVGA_IRQFLAG_FIFO_PROGRESS;
- }
+ PDMCritSectEnter(&pThis->CritSect, VERR_IGNORED);
- /* Irq pending? */
- if (pThis->svga.u32IrqMask & u32IrqStatus)
- {
- Log(("vmsvgaFIFOLoop: Trigger interrupt with status %x\n", u32IrqStatus));
- ASMAtomicOrU32(&pThis->svga.u32IrqStatus, u32IrqStatus);
- PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 1);
+ /* FIFO progress might trigger an interrupt. */
+ if (pThis->svga.u32IrqMask & SVGA_IRQFLAG_FIFO_PROGRESS)
+ {
+ Log(("vmsvgaFIFOLoop: fifo progress irq\n"));
+ u32IrqStatus |= SVGA_IRQFLAG_FIFO_PROGRESS;
+ }
+
+ /* Unmasked IRQ pending? */
+ if (pThis->svga.u32IrqMask & u32IrqStatus)
+ {
+ Log(("vmsvgaFIFOLoop: Trigger interrupt with status %x\n", u32IrqStatus));
+ ASMAtomicOrU32(&pThis->svga.u32IrqStatus, u32IrqStatus);
+ PDMDevHlpPCISetIrq(pDevIns, 0, 1);
+ }
+
+ PDMCritSectLeave(&pThis->CritSect);
}
}
@@ -3244,7 +3256,7 @@ void vmsvgaGMRFree(PVGASTATE pThis, uint32_t idGMR)
{
PGMR pGMR = &pSVGAState->aGMR[idGMR];
# ifdef DEBUG_GMR_ACCESS
- VMR3ReqCallWait(PDMDevHlpGetVM(pThis->pDevInsR3), VMCPUID_ANY, (PFNRT)vmsvgaUnregisterGMR, 2, pThis->pDevInsR3, idGMR);
+ VMR3ReqCallWait(PDMDevHlpGetVM(pThis->pDevInsR3), VMCPUID_ANY, (PFNRT)vmsvgaDeregisterGMR, 2, pThis->pDevInsR3, idGMR);
# endif
Assert(pGMR->paDesc);
@@ -3522,13 +3534,9 @@ DECLCALLBACK(int) vmsvgaR3IORegionMap(PPCIDEVICE pPciDev, int iRegion, RTGCPHYS
# ifdef DEBUG_FIFO_ACCESS
if (RT_SUCCESS(rc))
{
- rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
- PGMPHYSHANDLERTYPE_PHYSICAL_ALL,
- GCPhysAddress, GCPhysAddress + (VMSVGA_FIFO_SIZE - 1),
- vmsvgaR3FIFOAccessHandler, pThis,
- NULL, NULL, NULL,
- NULL, NULL, NULL,
- "VMSVGA FIFO");
+ rc = PGMHandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns), GCPhysAddress, GCPhysAddress + (VMSVGA_FIFO_SIZE - 1),
+ pThis->svga.hFifoAccessHandlerType, pThis, NIL_RTR0PTR, NIL_RTRCPTR,
+ "VMSVGA FIFO");
AssertRC(rc);
}
# endif
@@ -3930,6 +3938,20 @@ int vmsvgaInit(PPDMDEVINS pDevIns)
}
Log(("VMSVGA: Maximum size (%d,%d)\n", pThis->svga.u32MaxWidth, pThis->svga.u32MaxHeight));
+# ifdef DEBUG_GMR_ACCESS
+ /* Register the GMR access handler type. */
+ rc = PGMR3HandlerPhysicalTypeRegister(PDMDevHlpGetVM(pThis->pDevInsR3), PGMPHYSHANDLERKIND_WRITE,
+ vmsvgaR3GMRAccessHandler, NULL, NULL, NULL, NULL, "VMSVGA GMR",
+ &pThis->svga.hGmrAccessHandlerType);
+ AssertRCReturn(rc, rc);
+# endif
+# ifdef DEBUG_FIFO_ACCESS
+ rc = PGMR3HandlerPhysicalTypeRegister(PDMDevHlpGetVM(pThis->pDevInsR3), PGMPHYSHANDLERKIND_ALL,
+ vmsvgaR3FIFOAccessHandler, NULL, NULL, NULL, NULL, "VMSVGA FIFO",
+ &pThis->svga.hFifoAccessHandlerType);
+ AssertRCReturn(rc, rc);
+#endif
+
/* Create the async IO thread. */
rc = PDMDevHlpThreadCreate(pDevIns, &pThis->svga.pFIFOIOThread, pThis, vmsvgaFIFOLoop, vmsvgaFIFOLoopWakeUp, 0,
RTTHREADTYPE_IO, "VMSVGA FIFO");
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
index 109004b..112459c 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp
@@ -3094,50 +3094,39 @@ static int vmsvga3dCreateTexture(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContex
VMSVGAPACKPARAMS SavedParams;
vmsvga3dSetUnpackParams(pState, pContext, pSurface, &SavedParams);
+ /* Set the mipmap base and max level paramters. */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
+ VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, pSurface->faces[0].numMipLevels);
+ VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
+
if (pSurface->fDirty)
- {
Log(("vmsvga3dCreateTexture: sync dirty texture\n"));
- for (uint32_t i = 0; i < pSurface->faces[0].numMipLevels; i++)
- {
- /* Paranoia: Always do level 0 here to mirror the non-dirty case. */
- if (pSurface->pMipmapLevels[i].fDirty || i == 0)
- {
- if (pSurface->pMipmapLevels[i].fDirty)
- Log(("vmsvga3dCreateTexture: sync dirty texture mipmap level %d (pitch %x)\n", i, pSurface->pMipmapLevels[i].cbSurfacePitch));
-
- glTexImage2D(GL_TEXTURE_2D,
- i,
- pSurface->internalFormatGL,
- pSurface->pMipmapLevels[i].size.width,
- pSurface->pMipmapLevels[i].size.height,
- 0,
- pSurface->formatGL,
- pSurface->typeGL,
- pSurface->pMipmapLevels[i].pSurfaceData);
-
- VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
- pSurface->pMipmapLevels[i].fDirty = false;
- }
- }
- pSurface->fDirty = false;
- }
- else
+ /* Always allocate and initialize all mipmap levels; non-initialized mipmap levels used as render targets cause failures. */
+ for (uint32_t i = 0; i < pSurface->faces[0].numMipLevels; i++)
{
/* Allocate and initialize texture memory. Passing the zero filled pSurfaceData avoids
- exposing random host memory to the guest and helps a with the fedora 21 surface
- corruption issues (launchpad, background, search field, login). */
+ exposing random host memory to the guest and helps a with the fedora 21 surface
+ corruption issues (launchpad, background, search field, login). */
+ if (pSurface->pMipmapLevels[i].fDirty)
+ Log(("vmsvga3dCreateTexture: sync dirty texture mipmap level %d (pitch %x)\n", i, pSurface->pMipmapLevels[i].cbSurfacePitch));
+
glTexImage2D(GL_TEXTURE_2D,
- 0,
- pSurface->internalFormatGL,
- pSurface->pMipmapLevels[0].size.width,
- pSurface->pMipmapLevels[0].size.height,
- 0,
- pSurface->formatGL,
- pSurface->typeGL,
- pSurface->pMipmapLevels[0].pSurfaceData);
- VMSVGA3D_CHECK_LAST_ERROR_WARN(pState, pContext);
+ i,
+ pSurface->internalFormatGL,
+ pSurface->pMipmapLevels[i].size.width,
+ pSurface->pMipmapLevels[i].size.height,
+ 0,
+ pSurface->formatGL,
+ pSurface->typeGL,
+ pSurface->pMipmapLevels[i].pSurfaceData);
+
+ VMSVGA3D_CHECK_LAST_ERROR(pState, pContext);
+
+ pSurface->pMipmapLevels[i].fDirty = false;
}
+ pSurface->fDirty = false;
/* Restore unpacking parameters. */
vmsvga3dRestoreUnpackParams(pState, pContext, pSurface, &SavedParams);
@@ -3155,7 +3144,9 @@ static int vmsvga3dCreateTexture(PVMSVGA3DSTATE pState, PVMSVGA3DCONTEXT pContex
#ifdef VMSVGA3D_OGL_WITH_SHARED_CTX
if (idPrevCtx < pState->cContexts && pState->papContexts[idPrevCtx]->id == idPrevCtx)
+ {
VMSVGA3D_SET_CURRENT_CONTEXT(pState, pState->papContexts[idPrevCtx]);
+ }
#endif
return VINF_SUCCESS;
}
@@ -5770,7 +5761,6 @@ int vmsvga3dSetRenderTarget(PVGASTATE pThis, uint32_t cid, SVGA3dRenderTargetTyp
AssertReturn(pState, VERR_NO_MEMORY);
AssertReturn(type < SVGA3D_RT_MAX, VERR_INVALID_PARAMETER);
AssertReturn(target.face == 0, VERR_INVALID_PARAMETER);
- AssertReturn(target.mipmap == 0, VERR_INVALID_PARAMETER);
Log(("vmsvga3dSetRenderTarget cid=%x type=%x surface id=%x\n", cid, type, target.sid));
@@ -5824,6 +5814,7 @@ int vmsvga3dSetRenderTarget(PVGASTATE pThis, uint32_t cid, SVGA3dRenderTargetTyp
{
case SVGA3D_RT_DEPTH:
case SVGA3D_RT_STENCIL:
+ AssertReturn(target.mipmap == 0, VERR_INVALID_PARAMETER);
if (pRenderTarget->oglId.texture == OPENGL_INVALID_ID)
{
Log(("vmsvga3dSetRenderTarget: create renderbuffer to be used as render target; surface id=%x type=%d format=%d\n", target.sid, pRenderTarget->flags, pRenderTarget->internalFormatGL));
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.cpp b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.cpp
index 0bc70ac..902f4b2 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.cpp
@@ -1,3 +1,4 @@
+/* $Id: DevVGA-SVGA3d-shared.cpp $ */
/** @file
* DevVMWare - VMWare SVGA device
*/
@@ -340,8 +341,10 @@ uint32_t vmsvga3dSurfaceFormatSize(SVGA3dSurfaceFormat format)
return 32;
case SVGA3D_A16B16G16R16:
return 8;
+
+ default:
+ AssertFailedReturn(4);
}
- AssertFailedReturn(4);
}
#ifdef LOG_ENABLED
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h
index 77c3461..ac1c3b4 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-shared.h
@@ -1,3 +1,4 @@
+/* $Id: DevVGA-SVGA3d-shared.h $ */
/** @file
* VMware SVGA device -- 3D part
*/
diff --git a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
index af61456..d71efa1 100644
--- a/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp
@@ -1,3 +1,4 @@
+/* $Id: DevVGA-SVGA3d-win.cpp $ */
/** @file
* DevVMWare - VMWare SVGA device
*/
@@ -4269,7 +4270,6 @@ int vmsvga3dSetRenderTarget(PVGASTATE pThis, uint32_t cid, SVGA3dRenderTargetTyp
AssertReturn(pState, VERR_NO_MEMORY);
AssertReturn(type < SVGA3D_RT_MAX, VERR_INVALID_PARAMETER);
AssertReturn(target.face == 0, VERR_INVALID_PARAMETER);
- AssertReturn(target.mipmap == 0, VERR_INVALID_PARAMETER);
Log(("vmsvga3dSetRenderTarget cid=%x type=%x surface id=%x\n", cid, type, target.sid));
@@ -4348,6 +4348,7 @@ int vmsvga3dSetRenderTarget(PVGASTATE pThis, uint32_t cid, SVGA3dRenderTargetTyp
{
case SVGA3D_RT_DEPTH:
case SVGA3D_RT_STENCIL:
+ AssertReturn(target.mipmap == 0, VERR_INVALID_PARAMETER);
if (!pRenderTarget->u.pSurface)
{
DWORD cQualityLevels = 0;
@@ -4493,20 +4494,21 @@ int vmsvga3dSetRenderTarget(PVGASTATE pThis, uint32_t cid, SVGA3dRenderTargetTyp
PVMSVGA3DSHAREDSURFACE pSharedSurface = vmsvga3dSurfaceGetSharedCopy(pThis, pContext, pRenderTarget);
AssertReturn(pSharedSurface, VERR_INTERNAL_ERROR);
- hr = pSharedSurface->u.pTexture->GetSurfaceLevel(0 /* Texture level 0 */,
+ hr = pSharedSurface->u.pTexture->GetSurfaceLevel(target.mipmap,
&pSurface);
fShared = true;
}
else
#endif
- hr = pRenderTarget->u.pTexture->GetSurfaceLevel(0 /* Texture level 0 */,
+ hr = pRenderTarget->u.pTexture->GetSurfaceLevel(target.mipmap,
&pSurface);
AssertMsgReturn(hr == D3D_OK, ("vmsvga3dSetRenderTarget: GetSurfaceLevel failed with %x\n", hr), VERR_INTERNAL_ERROR);
}
else
{
+ AssertReturn(target.mipmap == 0, VERR_INVALID_PARAMETER);
if (!pRenderTarget->u.pSurface)
{
DWORD cQualityLevels = 0;
diff --git a/src/VBox/Devices/Graphics/DevVGA.cpp b/src/VBox/Devices/Graphics/DevVGA.cpp
index f7ba221..c2b337b 100644
--- a/src/VBox/Devices/Graphics/DevVGA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA.cpp
@@ -5285,16 +5285,13 @@ static DECLCALLBACK(void) vgaTimerRefresh(PPDMDEVINS pDevIns, PTMTIMER pTimer, v
int vgaR3RegisterVRAMHandler(PVGASTATE pVGAState, uint64_t cbFrameBuffer)
{
PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
-
Assert(pVGAState->GCPhysVRAM);
- int rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
- PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
- pVGAState->GCPhysVRAM, pVGAState->GCPhysVRAM + (cbFrameBuffer - 1),
- vgaR3LFBAccessHandler, pVGAState,
- g_DeviceVga.szR0Mod, "vgaR0LFBAccessHandler", pDevIns->pvInstanceDataR0,
- g_DeviceVga.szRCMod, "vgaGCLFBAccessHandler", pDevIns->pvInstanceDataRC,
- "VGA LFB");
+ int rc = PGMHandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
+ pVGAState->GCPhysVRAM, pVGAState->GCPhysVRAM + (cbFrameBuffer - 1),
+ pVGAState->hLfbAccessHandlerType, pVGAState, pDevIns->pvInstanceDataR0,
+ pDevIns->pvInstanceDataRC, "VGA LFB");
+
AssertRC(rc);
return rc;
}
@@ -5347,13 +5344,9 @@ static DECLCALLBACK(int) vgaR3IORegionMap(PPCIDEVICE pPciDev, /*unsigned*/ int i
AssertRC(rc);
if (RT_SUCCESS(rc))
{
- rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
- PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
- GCPhysAddress, GCPhysAddress + (pThis->vram_size - 1),
- vgaR3LFBAccessHandler, pThis,
- g_DeviceVga.szR0Mod, "vgaR0LFBAccessHandler", pDevIns->pvInstanceDataR0,
- g_DeviceVga.szRCMod, "vgaRCLFBAccessHandler", pDevIns->pvInstanceDataRC,
- "VGA LFB");
+ rc = PGMHandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns), GCPhysAddress, GCPhysAddress + (pThis->vram_size - 1),
+ pThis->hLfbAccessHandlerType, pThis, pDevIns->pvInstanceDataR0,
+ pDevIns->pvInstanceDataRC, "VGA LFB");
AssertRC(rc);
if (RT_SUCCESS(rc))
{
@@ -6088,7 +6081,7 @@ static DECLCALLBACK(int) vgaR3Construct(PPDMDEVINS pDevIns, int iInstance, PCF
/*
* We use our own critical section to avoid unncessary pointer indirections
- * in interface methods (as we all as for historical reasons).
+ * in interface methods (as well as for historical reasons).
*/
rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CritSect, RT_SRC_POS, "VGA#%u", iInstance);
AssertRCReturn(rc, rc);
@@ -6151,6 +6144,17 @@ static DECLCALLBACK(int) vgaR3Construct(PPDMDEVINS pDevIns, int iInstance, PCF
#endif
/*
+ * Register access handler types.
+ */
+ rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_WRITE,
+ vgaR3LFBAccessHandler,
+ g_DeviceVga.szR0Mod, "vgaR0LFBAccessHandler",
+ g_DeviceVga.szRCMod, "vgaRCLFBAccessHandler",
+ "VGA LFB", &pThis->hLfbAccessHandlerType);
+ AssertRCReturn(rc, rc);
+
+
+ /*
* Register I/O ports.
*/
rc = PDMDevHlpIOPortRegister(pDevIns, 0x3c0, 16, NULL, vgaIOPortWrite, vgaIOPortRead, NULL, NULL, "VGA - 3c0");
@@ -6567,7 +6571,7 @@ static DECLCALLBACK(int) vgaR3Construct(PPDMDEVINS pDevIns, int iInstance, PCF
cParams = sscanf(pszExtraData, "%ux%ux%u", &cx, &cy, &cBits);
if ( cParams != 3
- || (cBits != 16 && cBits != 24 && cBits != 32))
+ || (cBits != 8 && cBits != 16 && cBits != 24 && cBits != 32))
{
AssertMsgFailed(("Configuration error: Invalid mode data '%s' for '%s'! cBits=%d\n", pszExtraData, szExtraDataKey, cBits));
return VERR_VGA_INVALID_CUSTOM_MODE;
@@ -6586,6 +6590,10 @@ static DECLCALLBACK(int) vgaR3Construct(PPDMDEVINS pDevIns, int iInstance, PCF
/* Use defaults from max at bpp mode. */
switch (cBits)
{
+ case 8:
+ u16DefMode = VBE_VESA_MODE_1024X768X8;
+ break;
+
case 16:
u16DefMode = VBE_VESA_MODE_1024X768X565;
break;
diff --git a/src/VBox/Devices/Graphics/DevVGA.h b/src/VBox/Devices/Graphics/DevVGA.h
index f4bf70c..b2a2cf5 100644
--- a/src/VBox/Devices/Graphics/DevVGA.h
+++ b/src/VBox/Devices/Graphics/DevVGA.h
@@ -314,6 +314,12 @@ typedef struct
/** External command to be executed in the FIFO thread. */
uint8_t u8FIFOExtCommand;
bool Padding6;
+# if defined(DEBUG_GMR_ACCESS) || defined(DEBUG_FIFO_ACCESS)
+ /** GMR debug access handler type handle. */
+ PGMPHYSHANDLERTYPE hGmrAccessHandlerType;
+ /** FIFO debug access handler type handle. */
+ PGMPHYSHANDLERTYPE hFifoAccessHandlerType;
+# endif
} VMSVGAState;
#endif /* VBOX_WITH_VMSVGA */
@@ -399,6 +405,8 @@ typedef struct VGAState {
# if defined(VBOX_WITH_HGSMI) && (defined(VBOX_WITH_VIDEOHWACCEL) || defined(VBOX_WITH_CRHGSMI))
/** LUN\#0: VBVA callbacks interface */
PDMIDISPLAYVBVACALLBACKS IVBVACallbacks;
+# else
+ RTR3PTR Padding2;
# endif
/** Status LUN\#0: Leds interface. */
PDMILEDPORTS ILeds;
@@ -450,11 +458,14 @@ typedef struct VGAState {
#ifdef VBOX_WITH_VMSVGA
/* Whether the SVGA emulation is enabled or not. */
bool fVMSVGAEnabled;
- bool Padding1[1];
+ bool Padding1[1+4];
#else
- bool Padding1[2];
+ bool Padding1[2+4];
#endif
+ /** Physical access type for the linear frame buffer dirty page tracking. */
+ PGMPHYSHANDLERTYPE hLfbAccessHandlerType;
+
/** The physical address the VRAM was assigned. */
RTGCPHYS GCPhysVRAM;
/** The critical section protect the instance data. */
diff --git a/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp b/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
index e28c20a..e32f4bb 100644
--- a/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2013 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -1315,7 +1315,7 @@ int vbvaVHWACommandCompleteAsync(PPDMIDISPLAYVBVACALLBACKS pInterface, PVBOXVHWA
if(RT_SUCCESS(rc))
{
- rc = HGSMIHostCommandProcessAndFreeAsynch(pIns, pHostCmd, (pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ) != 0);
+ rc = HGSMIHostCommandSubmitAndFreeAsynch(pIns, pHostCmd, RT_BOOL(pCmd->Flags & VBOXVHWACMD_FLAG_GH_ASYNCH_IRQ));
AssertRC(rc);
if(RT_SUCCESS(rc))
{
@@ -2272,7 +2272,7 @@ static DECLCALLBACK(int) vbvaChannelHandler (void *pvHandler, uint16_t u16Channe
LogFlowFunc(("VBVA_INFO_HEAP: offset 0x%x, size 0x%x\n",
pHeap->u32HeapOffset, pHeap->u32HeapSize));
- rc = HGSMISetupHostHeap (pIns, pHeap->u32HeapOffset, pHeap->u32HeapSize);
+ rc = HGSMIHostHeapSetup(pIns, pHeap->u32HeapOffset, pHeap->u32HeapSize);
} break;
case VBVA_FLUSH:
@@ -2690,8 +2690,6 @@ DECLCALLBACK(void) vbvaPortReportHostCursorPosition
PDMCritSectLeave(&pThis->CritSect);
}
-static HGSMICHANNELHANDLER sOldChannelHandler;
-
int VBVAInit (PVGASTATE pVGAState)
{
PPDMDEVINS pDevIns = pVGAState->pDevInsR3;
@@ -2713,8 +2711,7 @@ int VBVAInit (PVGASTATE pVGAState)
rc = HGSMIHostChannelRegister (pVGAState->pHGSMI,
HGSMI_CH_VBVA,
vbvaChannelHandler,
- pVGAState,
- &sOldChannelHandler);
+ pVGAState);
if (RT_SUCCESS (rc))
{
VBVACONTEXT *pCtx = (VBVACONTEXT *)HGSMIContext (pVGAState->pHGSMI);
diff --git a/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp b/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
index 6225fbd..08ee970 100644
--- a/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
+++ b/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
@@ -1,3 +1,4 @@
+/* $Id: DevVGA_VDMA.cpp $ */
/** @file
* Video DMA (VDMA) support.
*/
@@ -15,6 +16,7 @@
*/
#include <VBox/VMMDev.h>
#include <VBox/vmm/pdmdev.h>
+#include <VBox/vmm/pgm.h>
#include <VBox/VBoxVideo.h>
#include <iprt/semaphore.h>
#include <iprt/thread.h>
diff --git a/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp b/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
index 1b5bdd1..9b7d6d2 100644
--- a/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
+++ b/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.cpp
@@ -1,3 +1,4 @@
+/* $Id: HGSMIHost.cpp $ */
/** @file
*
* VBox Host Guest Shared Memory Interface (HGSMI).
@@ -8,7 +9,7 @@
*/
/*
- * Copyright (C) 2006-2012 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -65,7 +66,7 @@
#include <iprt/string.h>
#include <VBox/err.h>
-#define LOG_GROUP LOG_GROUP_DEV_VGA
+#define LOG_GROUP LOG_GROUP_HGSMI
#include <VBox/log.h>
#include <VBox/vmm/ssm.h>
@@ -131,6 +132,31 @@
#endif /* !HGSMI_STRICT */
+/* Host heap types. */
+#define HGSMI_HEAP_TYPE_NULL 0 /* Heap not initialized. */
+#define HGSMI_HEAP_TYPE_POINTER 1 /* Deprecated, used only for old saved states. RTHEAPSIMPLE. */
+#define HGSMI_HEAP_TYPE_OFFSET 2 /* Deprecated, used only for old saved states. RTHEAPOFFSET. */
+#define HGSMI_HEAP_TYPE_MA 3 /* Memory allocator. */
+
+typedef struct HGSMIHOSTHEAP
+{
+ uint32_t u32HeapType; /* HGSMI_HEAP_TYPE_* */
+ int32_t volatile cRefs; /* How many blocks allocated. */
+ HGSMIAREA area; /* Host heap location. */
+ union
+ {
+ HGSMIMADATA ma; /* Memory allocator for the default host heap implementation. */
+ struct /* Legacy heap implementations. For old saved states. */
+ {
+ union
+ {
+ RTHEAPSIMPLE hPtr; /* Pointer based heap. */
+ RTHEAPOFFSET hOff; /* Offset based heap. */
+ } u;
+ } legacy;
+ } u;
+} HGSMIHOSTHEAP;
+
typedef struct HGSMIINSTANCE
{
PVM pVM; /* The VM. */
@@ -140,7 +166,7 @@ typedef struct HGSMIINSTANCE
RTCRITSECT instanceCritSect; /* For updating the instance data: FIFO's, channels. */
HGSMIAREA area; /* The shared memory description. */
- HGSMIHEAP hostHeap; /* Host heap instance. */
+ HGSMIHOSTHEAP hostHeap; /* Host heap instance. */
RTCRITSECT hostHeapCritSect; /* Heap serialization lock. */
RTLISTANCHOR hostFIFO; /* Pending host buffers. */
@@ -172,23 +198,10 @@ typedef struct HGSMIHOSTFIFOENTRY
HGSMIINSTANCE *pIns; /* Backlink to the HGSMI instance. */
-#if 0
- /* removed to allow saved state handling */
- /* The event which is signalled when the command has been processed by the host. */
- RTSEMEVENTMULTI hEvent;
-#endif
-
volatile uint32_t fl; /* Status flags of the entry. */
- HGSMIOFFSET offBuffer; /* Offset in the memory region of the entry data. */
-
-#if 0
- /* removed to allow saved state handling */
- /* The command completion callback. */
- PFNHGSMIHOSTFIFOCALLBACK pfnCallback;
- void *pvCallback;
-#endif
-
+ HGSMIOFFSET offBuffer; /* Offset of the HGSMI buffer header in the HGSMI host heap:
+ * [pIns->hostHeap.area.offBase .. offLast]. */
} HGSMIHOSTFIFOENTRY;
@@ -260,88 +273,6 @@ static void hgsmiFIFOUnlock (HGSMIINSTANCE *pIns)
AssertRC (rc);
}
-//static HGSMICHANNEL *hgsmiChannelFindById (PHGSMIINSTANCE pIns,
-// uint8_t u8Channel)
-//{
-// HGSMICHANNEL *pChannel = &pIns->Channels[u8Channel];
-//
-// if (pChannel->u8Flags & HGSMI_CH_F_REGISTERED)
-// {
-// return pChannel;
-// }
-//
-// return NULL;
-//}
-
-#if 0
-/* Verify that the given offBuffer points to a valid buffer, which is within the area.
- */
-static const HGSMIBUFFERHEADER *hgsmiVerifyBuffer (const HGSMIAREA *pArea,
- HGSMIOFFSET offBuffer)
-{
- AssertPtr(pArea);
-
- LogFlowFunc(("buffer 0x%x, area %p %x [0x%x;0x%x]\n", offBuffer, pArea->pu8Base, pArea->cbArea, pArea->offBase, pArea->offLast));
-
- if ( offBuffer < pArea->offBase
- || offBuffer > pArea->offLast)
- {
- LogFunc(("offset 0x%x is outside the area [0x%x;0x%x]!!!\n", offBuffer, pArea->offBase, pArea->offLast));
- HGSMI_STRICT_ASSERT_FAILED();
- return NULL;
- }
-
- const HGSMIBUFFERHEADER *pHeader = HGSMIOffsetToPointer (pArea, offBuffer);
-
- /* Quick check of the data size, it should be less than the maximum
- * data size for the buffer at this offset.
- */
- LogFlowFunc(("datasize check: pHeader->u32DataSize = 0x%x pArea->offLast - offBuffer = 0x%x\n", pHeader->u32DataSize, pArea->offLast - offBuffer));
- if (pHeader->u32DataSize <= pArea->offLast - offBuffer)
- {
- HGSMIBUFFERTAIL *pTail = HGSMIBufferTail (pHeader);
-
- /* At least both pHeader and pTail structures are in the area. Check the checksum. */
- uint32_t u32Checksum = HGSMIChecksum (offBuffer, pHeader, pTail);
-
- LogFlowFunc(("checksum check: u32Checksum = 0x%x pTail->u32Checksum = 0x%x\n", u32Checksum, pTail->u32Checksum));
- if (u32Checksum == pTail->u32Checksum)
- {
- LogFlowFunc(("returning %p\n", pHeader));
- return pHeader;
- }
- else
- {
- LogFunc(("invalid checksum 0x%x, expected 0x%x!!!\n", u32Checksum, pTail->u32Checksum));
- }
- }
- else
- {
- LogFunc(("invalid data size 0x%x, maximum is 0x%x!!!\n", pHeader->u32DataSize, pArea->offLast - offBuffer));
- }
-
- LogFlowFunc(("returning NULL\n"));
- HGSMI_STRICT_ASSERT_FAILED();
- return NULL;
-}
-
-/*
- * Process a guest buffer.
- * @thread EMT
- */
-static int hgsmiGuestBufferProcess (HGSMIINSTANCE *pIns,
- const HGSMICHANNEL *pChannel,
- const HGSMIBUFFERHEADER *pHeader)
-{
- LogFlowFunc(("pIns %p, pChannel %p, pHeader %p\n", pIns, pChannel, pHeader));
-
- int rc = HGSMIChannelHandlerCall (pIns,
- &pChannel->handler,
- pHeader);
-
- return rc;
-}
-#endif
/*
* Virtual hardware IO handlers.
*/
@@ -453,15 +384,9 @@ static bool hgsmiProcessHostCmdCompletion(HGSMIINSTANCE *pIns,
RTListAppend(&pIns->hostFIFOProcessed, &pEntry->nodeEntry);
hgsmiFIFOUnlock(pIns);
-#if 0
- /* Inform the submitter. */
- if (pEntry->pfnCallback)
- {
- pEntry->pfnCallback (pEntry->pvCallback);
- }
-#else
+
hgsmiHostCommandFreeCallback(pEntry);
-#endif
+
return true;
}
@@ -556,29 +481,6 @@ void HGSMIClearHostGuestFlags(HGSMIINSTANCE *pIns, uint32_t flags)
ASMAtomicAndU32(&pIns->pHGFlags->u32HostFlags, (~flags));
}
-#if 0
-static void hgsmiRaiseEvent (const HGSMIHOSTFIFOENTRY *pEntry)
-{
- int rc = RTSemEventMultiSignal (pEntry->hEvent);
- AssertRC(rc);
-}
-
-static int hgsmiWaitEvent (const HGSMIHOSTFIFOENTRY *pEntry)
-{
- int rc = RTSemEventMultiWait (pEntry->hEvent, RT_INDEFINITE_WAIT);
- AssertRC(rc);
- return rc;
-}
-#endif
-
-#if 0
-DECLINLINE(HGSMIOFFSET) hgsmiMemoryOffset (const HGSMIINSTANCE *pIns, const void *pv)
-{
- Assert((uint8_t *)pv >= pIns->area.pu8Base);
- Assert((uint8_t *)pv < pIns->area.pu8Base + pIns->area.cbArea);
- return (HGSMIOFFSET)((uint8_t *)pv - pIns->area.pu8Base);
-}
-#endif
/*
* The host heap.
*
@@ -598,96 +500,181 @@ static void hgsmiHostHeapUnlock (HGSMIINSTANCE *pIns)
AssertRC (rc);
}
-#if 0
-static int hgsmiHostHeapAlloc (HGSMIINSTANCE *pIns, void **ppvMem, uint32_t cb)
+static HGSMIOFFSET hgsmiHostHeapOffset(HGSMIHOSTHEAP *pHeap)
{
- int rc = hgsmiHostHeapLock (pIns);
+ return pHeap->area.offBase;
+}
- if (RT_SUCCESS (rc))
- {
- if (pIns->hostHeap == NIL_RTHEAPSIMPLE)
- {
- rc = VERR_NOT_SUPPORTED;
- }
- else
- {
- /* A block structure: [header][data][tail].
- * 'header' and 'tail' is used to verify memory blocks.
- */
- uint32_t cbAlloc = HGSMIBufferRequiredSize (cb);
+static HGSMISIZE hgsmiHostHeapSize(HGSMIHOSTHEAP *pHeap)
+{
+ return pHeap->area.cbArea;
+}
- void *pv = RTHeapSimpleAlloc (pIns->hostHeap, cbAlloc, 0);
+static void *hgsmiHostHeapBufferAlloc(HGSMIHOSTHEAP *pHeap,
+ HGSMISIZE cbBuffer)
+{
+ void *pvBuf = NULL;
- if (pv)
- {
- HGSMIBUFFERHEADER *pHdr = (HGSMIBUFFERHEADER *)pv;
+ if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_MA)
+ {
+ pvBuf = HGSMIMAAlloc(&pHeap->u.ma, cbBuffer);
+ }
+ else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_POINTER)
+ {
+ pvBuf = RTHeapSimpleAlloc(pHeap->u.legacy.u.hPtr, cbBuffer, 0);
+ }
+ else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
+ {
+ pvBuf = RTHeapOffsetAlloc(pHeap->u.legacy.u.hOff, cbBuffer, 0);
+ }
- /* Store some information which will help to verify memory pointers. */
- pHdr->u32Signature = HGSMI_MEM_SIGNATURE;
- pHdr->cb = cb;
- pHdr->off = hgsmiMemoryOffset (pIns, pv);
- pHdr->u32HdrVerifyer = HGSMI_MEM_VERIFYER_HDR (pHdr);
+ if (pvBuf)
+ {
+ ++pHeap->cRefs;
+ }
- /* Setup the tail. */
- HGSMIBUFFERTAIL *pTail = HGSMIBufferTail (pHdr);
+ return pvBuf;
+}
- pTail->u32TailVerifyer = HGSMI_MEM_VERIFYER_TAIL (pHdr);
+static void hgsmiHostHeapBufferFree(HGSMIHOSTHEAP *pHeap,
+ void *pvBuf)
+{
+ if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_MA)
+ {
+ HGSMIMAFree(&pHeap->u.ma, pvBuf);
+ }
+ else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_POINTER)
+ {
+ RTHeapSimpleFree(pHeap->u.legacy.u.hPtr, pvBuf);
+ }
+ else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
+ {
+ RTHeapOffsetFree(pHeap->u.legacy.u.hOff, pvBuf);
+ }
+ --pHeap->cRefs;
+}
- *ppvMem = pv;
- }
- else
- {
- rc = VERR_NO_MEMORY;
- }
- }
+static void *hgsmiHostHeapDataAlloc(HGSMIHOSTHEAP *pHeap,
+ HGSMISIZE cbData,
+ uint8_t u8Channel,
+ uint16_t u16ChannelInfo)
+{
+ HGSMISIZE cbAlloc = HGSMIBufferRequiredSize(cbData);
+ HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)hgsmiHostHeapBufferAlloc(pHeap, cbAlloc);
+ if (!pHeader)
+ return NULL;
- hgsmiHostHeapUnlock (pIns);
- }
+ HGSMIBufferInitializeSingle(&pHeap->area, pHeader, cbAlloc, u8Channel, u16ChannelInfo);
- return rc;
+ return HGSMIBufferDataFromPtr(pHeader);
}
+static void hgsmiHostHeapDataFree(HGSMIHOSTHEAP *pHeap,
+ void *pvData)
+{
+ if ( pvData
+ && pHeap->u32HeapType != HGSMI_HEAP_TYPE_NULL)
+ {
+ HGSMIBUFFERHEADER *pHeader = HGSMIBufferHeaderFromData(pvData);
+ hgsmiHostHeapBufferFree(pHeap, pHeader);
+ }
+}
-static int hgsmiHostHeapCheckBlock (HGSMIINSTANCE *pIns, void *pvMem)
+/* Needed for heap relocation: offset of the heap handle relative to the start of heap area. */
+static HGSMIOFFSET hgsmiHostHeapHandleLocationOffset(HGSMIHOSTHEAP *pHeap)
{
- int rc = hgsmiHostHeapLock (pIns);
+ HGSMIOFFSET offHeapHandle;
+ if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_POINTER)
+ {
+ offHeapHandle = (HGSMIOFFSET)((uintptr_t)pHeap->u.legacy.u.hPtr - (uintptr_t)pHeap->area.pu8Base);
+ }
+ else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
+ {
+ offHeapHandle = (HGSMIOFFSET)((uintptr_t)pHeap->u.legacy.u.hOff - (uintptr_t)pHeap->area.pu8Base);
+ }
+ else
+ {
+ offHeapHandle = HGSMIOFFSET_VOID;
+ }
+ return offHeapHandle;
+}
- if (RT_SUCCESS (rc))
+static int hgsmiHostHeapRelocate(HGSMIHOSTHEAP *pHeap,
+ uint32_t u32HeapType,
+ void *pvBase,
+ uint32_t offHeapHandle,
+ uintptr_t offDelta,
+ HGSMISIZE cbArea,
+ HGSMIOFFSET offBase)
+{
+ int rc = HGSMIAreaInitialize(&pHeap->area, pvBase, cbArea, offBase);
+ if (RT_SUCCESS(rc))
{
- rc = hgsmiVerifyBuffer (pIns, pvMem);
+ if (u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
+ {
+ pHeap->u.legacy.u.hOff = (RTHEAPOFFSET)((uint8_t *)pvBase + offHeapHandle);
+ }
+ else if (u32HeapType == HGSMI_HEAP_TYPE_POINTER)
+ {
+ pHeap->u.legacy.u.hPtr = (RTHEAPSIMPLE)((uint8_t *)pvBase + offHeapHandle);
+ rc = RTHeapSimpleRelocate(pHeap->u.legacy.u.hPtr, offDelta); AssertRC(rc);
+ }
+ else
+ {
+ /* HGSMI_HEAP_TYPE_MA does not need the relocation. */
+ rc = VERR_NOT_SUPPORTED;
+ }
- hgsmiHostHeapUnlock (pIns);
+ if (RT_SUCCESS(rc))
+ {
+ pHeap->u32HeapType = u32HeapType;
+ }
+ else
+ {
+ HGSMIAreaClear(&pHeap->area);
+ }
}
return rc;
}
-static int hgsmiHostHeapFree (HGSMIINSTANCE *pIns, void *pvMem)
+static int hgsmiHostHeapRestoreMA(HGSMIHOSTHEAP *pHeap,
+ void *pvBase,
+ HGSMISIZE cbArea,
+ HGSMIOFFSET offBase,
+ uint32_t cBlocks,
+ HGSMIOFFSET *paDescriptors,
+ HGSMISIZE cbMaxBlock,
+ HGSMIENV *pEnv)
{
- int rc = hgsmiHostHeapLock (pIns);
-
- if (RT_SUCCESS (rc))
+ int rc = HGSMIAreaInitialize(&pHeap->area, pvBase, cbArea, offBase);
+ if (RT_SUCCESS(rc))
{
- RTHeapSimpleFree (pIns->hostHeap, pvMem);
+ rc = HGSMIMAInit(&pHeap->u.ma, &pHeap->area, paDescriptors, cBlocks, cbMaxBlock, pEnv);
- hgsmiHostHeapUnlock (pIns);
+ if (RT_FAILURE(rc))
+ {
+ HGSMIAreaClear(&pHeap->area);
+ }
}
return rc;
}
-static int hgsmiCheckMemPtr (HGSMIINSTANCE *pIns, void *pvMem, HGSMIOFFSET *poffMem)
+static void hgsmiHostHeapSetupUninitialized(HGSMIHOSTHEAP *pHeap)
{
- int rc = hgsmiHostHeapCheckBlock (pIns, pvMem);
+ RT_ZERO(*pHeap);
+ pHeap->u32HeapType = HGSMI_HEAP_TYPE_NULL;
+}
- if (RT_SUCCESS (rc))
+static void hgsmiHostHeapDestroy(HGSMIHOSTHEAP *pHeap)
+{
+ if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_MA)
{
- *poffMem = hgsmiMemoryOffset (pIns, pvMem);
+ HGSMIMAUninit(&pHeap->u.ma);
}
-
- return rc;
+ hgsmiHostHeapSetupUninitialized(pHeap);
}
-#endif
static int hgsmiHostFIFOAlloc (HGSMIINSTANCE *pIns, HGSMIHOSTFIFOENTRY **ppEntry)
{
@@ -700,14 +687,6 @@ static int hgsmiHostFIFOAlloc (HGSMIINSTANCE *pIns, HGSMIHOSTFIFOENTRY **ppEntry
if (pEntry)
{
pEntry->fl = HGSMI_F_HOST_FIFO_ALLOCATED;
-#if 0
- rc = RTSemEventMultiCreate (&pEntry->hEvent);
-
- if (RT_FAILURE (rc))
- {
- RTMemFree (pEntry);
- }
-#endif
}
else
{
@@ -725,17 +704,13 @@ static int hgsmiHostFIFOAlloc (HGSMIINSTANCE *pIns, HGSMIHOSTFIFOENTRY **ppEntry
static void hgsmiHostFIFOFree (HGSMIINSTANCE *pIns, HGSMIHOSTFIFOENTRY *pEntry)
{
NOREF (pIns);
-#if 0
- if (pEntry->hEvent)
- {
- RTSemEventMultiDestroy (pEntry->hEvent);
- }
-#endif
RTMemFree (pEntry);
}
static int hgsmiHostCommandFreeByEntry (HGSMIHOSTFIFOENTRY *pEntry)
{
+ LogFlowFunc(("offBuffer 0x%08X\n", pEntry->offBuffer));
+
HGSMIINSTANCE *pIns = pEntry->pIns;
int rc = hgsmiFIFOLock (pIns);
if(RT_SUCCESS(rc))
@@ -743,97 +718,76 @@ static int hgsmiHostCommandFreeByEntry (HGSMIHOSTFIFOENTRY *pEntry)
RTListNodeRemove(&pEntry->nodeEntry);
hgsmiFIFOUnlock (pIns);
- void *pvMem = HGSMIBufferDataFromOffset(&pIns->area, pEntry->offBuffer);
+ void *pvData = HGSMIBufferDataFromOffset(&pIns->hostHeap.area, pEntry->offBuffer);
rc = hgsmiHostHeapLock (pIns);
if(RT_SUCCESS(rc))
{
/* Deallocate the host heap memory. */
- HGSMIHeapFree (&pIns->hostHeap, pvMem);
+ hgsmiHostHeapDataFree(&pIns->hostHeap, pvData);
hgsmiHostHeapUnlock(pIns);
}
hgsmiHostFIFOFree (pIns, pEntry);
}
+
+ LogFlowFunc(("%Rrc\n", rc));
return rc;
}
-static int hgsmiHostCommandFree (HGSMIINSTANCE *pIns,
- void *pvMem)
+static int hgsmiHostCommandFree(HGSMIINSTANCE *pIns,
+ void *pvData)
{
- HGSMIOFFSET offMem = HGSMIHeapBufferOffset (&pIns->hostHeap, pvMem);
- int rc = VINF_SUCCESS;
- if (offMem != HGSMIOFFSET_VOID)
+ HGSMIOFFSET offBuffer = HGSMIBufferOffsetFromData(&pIns->hostHeap.area, pvData);
+ HGSMIHOSTFIFOENTRY *pEntry = NULL;
+
+ int rc = hgsmiFIFOLock(pIns);
+ if (RT_SUCCESS(rc))
{
- rc = hgsmiFIFOLock (pIns);
- if(RT_SUCCESS(rc))
+ /* Search the Processed list for the given offBuffer. */
+ HGSMIHOSTFIFOENTRY *pIter;
+ RTListForEach(&pIns->hostFIFOProcessed, pIter, HGSMIHOSTFIFOENTRY, nodeEntry)
{
- /* Search the Processed list for the given offMem. */
- HGSMIHOSTFIFOENTRY *pEntry = NULL;
-
- HGSMIHOSTFIFOENTRY *pIter;
- RTListForEach(&pIns->hostFIFOProcessed, pIter, HGSMIHOSTFIFOENTRY, nodeEntry)
- {
- Assert(pIter->fl == (HGSMI_F_HOST_FIFO_ALLOCATED | HGSMI_F_HOST_FIFO_PROCESSED));
-
- if (pIter->offBuffer == offMem)
- {
- pEntry = pIter;
- break;
- }
- }
+ Assert(pIter->fl == (HGSMI_F_HOST_FIFO_ALLOCATED | HGSMI_F_HOST_FIFO_PROCESSED));
- if (pEntry)
+ if (pIter->offBuffer == offBuffer)
{
- RTListNodeRemove(&pEntry->nodeEntry);
- }
- else
- {
- LogRel(("HGSMI[%s]: the host frees unprocessed FIFO entry: 0x%08X\n", pIns->pszName, offMem));
- AssertFailed ();
+ pEntry = pIter;
+ break;
}
+ }
- hgsmiFIFOUnlock (pIns);
+ if (pEntry)
+ {
+ RTListNodeRemove(&pEntry->nodeEntry);
+ }
+ else
+ {
+ AssertLogRelMsgFailed(("HGSMI[%s]: the host frees unprocessed FIFO entry: 0x%08X\n",
+ pIns->pszName, offBuffer));
+ }
- rc = hgsmiHostHeapLock (pIns);
- if(RT_SUCCESS(rc))
- {
- /* Deallocate the host heap memory. */
- HGSMIHeapFree (&pIns->hostHeap, pvMem);
+ hgsmiFIFOUnlock (pIns);
- hgsmiHostHeapUnlock(pIns);
- }
+ rc = hgsmiHostHeapLock (pIns);
+ if (RT_SUCCESS(rc))
+ {
+ /* Deallocate the host heap memory. */
+ hgsmiHostHeapDataFree(&pIns->hostHeap, pvData);
- if(pEntry)
- {
- /* Deallocate the entry. */
- hgsmiHostFIFOFree (pIns, pEntry);
- }
+ hgsmiHostHeapUnlock(pIns);
}
+ if (pEntry)
+ {
+ /* Deallocate the entry. */
+ hgsmiHostFIFOFree(pIns, pEntry);
+ }
}
- else
- {
- rc = VERR_INVALID_POINTER;
- LogRel(("HGSMI[%s]: the host frees invalid FIFO entry: %p\n", pIns->pszName, pvMem));
- AssertFailed ();
- }
- return rc;
-}
-#if 0
-static DECLCALLBACK(void) hgsmiHostCommandRaiseEventCallback (void *pvCallback)
-{
- /* Guest has processed the command. */
- HGSMIHOSTFIFOENTRY *pEntry = (HGSMIHOSTFIFOENTRY *)pvCallback;
-
- Assert(pEntry->fl == (HGSMI_F_HOST_FIFO_ALLOCATED | HGSMI_F_HOST_FIFO_PROCESSED));
-
- /* This is a simple callback, just signal the event. */
- hgsmiRaiseEvent (pEntry);
+ return rc;
}
-#endif
static DECLCALLBACK(void) hgsmiHostCommandFreeCallback (void *pvCallback)
{
@@ -846,39 +800,29 @@ static DECLCALLBACK(void) hgsmiHostCommandFreeCallback (void *pvCallback)
hgsmiHostCommandFreeByEntry (pEntry);
}
-static int hgsmiHostCommandWrite (HGSMIINSTANCE *pIns, HGSMIOFFSET offMem
-#if 0
- , PFNHGSMIHOSTFIFOCALLBACK pfnCallback, void **ppvContext
-#endif
- )
+static int hgsmiHostCommandWrite(HGSMIINSTANCE *pIns,
+ HGSMIOFFSET offBuffer)
{
- HGSMIHOSTFIFOENTRY *pEntry;
-
AssertPtrReturn(pIns->pHGFlags, VERR_WRONG_ORDER);
- int rc = hgsmiHostFIFOAlloc (pIns, &pEntry);
- if (RT_SUCCESS (rc))
+ HGSMIHOSTFIFOENTRY *pEntry;
+ int rc = hgsmiHostFIFOAlloc(pIns, &pEntry);
+
+ if (RT_SUCCESS(rc))
{
/* Initialize the new entry and add it to the FIFO. */
pEntry->fl |= HGSMI_F_HOST_FIFO_QUEUED;
pEntry->pIns = pIns;
- pEntry->offBuffer = offMem;
-#if 0
- pEntry->pfnCallback = pfnCallback;
- pEntry->pvCallback = pEntry;
-#endif
+ pEntry->offBuffer = offBuffer;
rc = hgsmiFIFOLock(pIns);
- if (RT_SUCCESS (rc))
+ if (RT_SUCCESS(rc))
{
- RTListAppend(&pIns->hostFIFO, &pEntry->nodeEntry);
ASMAtomicOrU32(&pIns->pHGFlags->u32HostFlags, HGSMIHOSTFLAGS_COMMANDS_PENDING);
+ RTListAppend(&pIns->hostFIFO, &pEntry->nodeEntry);
hgsmiFIFOUnlock(pIns);
-#if 0
- *ppvContext = pEntry;
-#endif
}
else
{
@@ -893,104 +837,74 @@ static int hgsmiHostCommandWrite (HGSMIINSTANCE *pIns, HGSMIOFFSET offMem
/**
* Append the shared memory block to the FIFO, inform the guest.
*
- * @param pIns Pointer to HGSMI instance,
- * @param pv The HC memory pointer to the information.
- * @param ppvContext Where to store a pointer, which will allow the caller
- * to wait for the command completion.
- * @param bDoIrq specifies whether the guest interrupt should be generated,
- * i.e. in case the command is not urgent(e.g. some guest command completion notification that does not require post-processing)
- * the command could be posted without raising an irq.
- *
+ * @param pIns Pointer to HGSMI instance.
+ * @param pvData The shared memory block data pointer.
+ * @param fDoIrq Whether the guest interrupt should be generated, i.e. if the command is not
+ * urgent (e.g. some guest command completion notification that does not require
+ * post-processing) the command could be submitted without raising an irq.
* @thread EMT
*/
-static int hgsmiHostCommandProcess (HGSMIINSTANCE *pIns, HGSMIOFFSET offBuffer,
-#if 0
- PFNHGSMIHOSTFIFOCALLBACK pfnCallback, void **ppvContext,
-#endif
- bool bDoIrq)
+static int hgsmiHostCommandSubmit(HGSMIINSTANCE *pIns,
+ void *pvData,
+ bool fDoIrq)
{
-// HGSMIOFFSET offMem;
-//
-// int rc = hgsmiCheckMemPtr (pIns, pvMem, &offMem);
-//
-// if (RT_SUCCESS (rc))
-// {
- /* Append the command to FIFO. */
- int rc = hgsmiHostCommandWrite (pIns, offBuffer
-#if 0
- , pfnCallback, ppvContext
-#endif
- );
-
- if (RT_SUCCESS (rc))
+ /* Append the command to FIFO. */
+ HGSMIOFFSET offBuffer = HGSMIBufferOffsetFromData(&pIns->hostHeap.area, pvData);
+ int rc = hgsmiHostCommandWrite(pIns, offBuffer);
+ if (RT_SUCCESS(rc))
+ {
+ if (fDoIrq)
{
- if(bDoIrq)
- {
- /* Now guest can read the FIFO, the notification is informational. */
- hgsmiNotifyGuest (pIns);
- }
+ /* Now guest can read the FIFO, the notification is informational. */
+ hgsmiNotifyGuest(pIns);
}
-// }
-// else
-// {
-// AssertFailed ();
-// }
+ }
return rc;
}
-#if 0
-static void hgsmiWait (void *pvContext)
-{
- HGSMIHOSTFIFOENTRY *pEntry = (HGSMIHOSTFIFOENTRY *)pvContext;
-
- for (;;)
- {
- hgsmiWaitEvent (pEntry);
- if (pEntry->fl & (HGSMI_F_HOST_FIFO_PROCESSED | HGSMI_F_HOST_FIFO_CANCELED))
- {
- return;
- }
- }
-}
-#endif
/**
- * Allocate a shared memory block. The host can write command/data to the memory.
+ * Allocate a shared memory buffer. The host can write command/data to the memory.
+ * The allocated buffer contains the 'header', 'data' and the 'tail', but *ppvData
+ * will point to the 'data'.
*
- * @param pIns Pointer to HGSMI instance,
- * @param ppvMem Where to store the allocated memory pointer to data.
- * @param cbMem How many bytes of data to allocate.
+ * @return VBox status code. Pointer to the payload data in *ppvData.
+ * @param pIns HGSMI instance,
+ * @param ppvData Where to store the allocated memory pointer to data.
+ * @param cbData How many bytes of data to allocate.
+ * @param u8Channel HGSMI channel.
+ * @param u16ChannelInfo Command parameter.
*/
-int HGSMIHostCommandAlloc (HGSMIINSTANCE *pIns,
- void **ppvMem,
- HGSMISIZE cbMem,
- uint8_t u8Channel,
- uint16_t u16ChannelInfo)
+int HGSMIHostCommandAlloc(HGSMIINSTANCE *pIns,
+ void **ppvData,
+ HGSMISIZE cbData,
+ uint8_t u8Channel,
+ uint16_t u16ChannelInfo)
{
- LogFlowFunc (("pIns = %p, cbMem = 0x%08X(%d)\n", pIns, cbMem, cbMem));
+ LogFlowFunc(("pIns = %p, cbData = %d, u8Channel %d, u16ChannelInfo 0x%04X\n",
+ pIns, cbData, u8Channel, u16ChannelInfo));
- int rc = hgsmiHostHeapLock (pIns);
- if(RT_SUCCESS(rc))
+ int rc = hgsmiHostHeapLock(pIns);
+ if (RT_SUCCESS(rc))
{
- void *pvMem = HGSMIHeapAlloc (&pIns->hostHeap,
- cbMem,
- u8Channel,
- u16ChannelInfo);
+ void *pvData = hgsmiHostHeapDataAlloc(&pIns->hostHeap,
+ cbData,
+ u8Channel,
+ u16ChannelInfo);
hgsmiHostHeapUnlock(pIns);
- if (pvMem)
+ if (pvData)
{
- *ppvMem = pvMem;
+ *ppvData = pvData;
}
else
{
- LogRel((0, "HGSMIHeapAlloc: HGSMIHeapAlloc failed\n"));
- rc = VERR_GENERAL_FAILURE;
+ LogRel(("HGSMI[%s]: host heap allocation failed %d bytes\n", pIns->pszName, cbData));
+ rc = VERR_NO_MEMORY;
}
}
- LogFlowFunc (("rc = %Rrc, pvMem = %p\n", rc, *ppvMem));
-
+ LogFlowFunc(("%Rrc, pvData = %p\n", rc, *ppvData));
return rc;
}
@@ -998,92 +912,63 @@ int HGSMIHostCommandAlloc (HGSMIINSTANCE *pIns,
* Convenience function that allows posting the host command asynchronously
* and make it freed on completion.
* The caller does not get notified in any way on command completion,
- * on success return the pvMem buffer can not be used after being passed to this function
+ * on successful return the pvData buffer can not be used after being passed to this function.
*
- * @param pIns Pointer to HGSMI instance,
- * @param pvMem The pointer returned by 'HGSMIHostCommandAlloc'.
- * @param bDoIrq specifies whether the guest interrupt should be generated,
- * i.e. in case the command is not urgent(e.g. some guest command completion notification that does not require post-processing)
- * the command could be posted without raising an irq.
+ * @param pIns HGSMI instance,
+ * @param pvData The pointer returned by 'HGSMIHostCommandAlloc'.
+ * @param fDoIrq Specifies whether the guest interrupt should be generated.
+ * In case the command is not urgent (e.g. some guest command
+ * completion notification that does not require post-processing)
+ * the command could be posted without raising an irq.
*/
-int HGSMIHostCommandProcessAndFreeAsynch (PHGSMIINSTANCE pIns,
- void *pvMem,
- bool bDoIrq)
+int HGSMIHostCommandSubmitAndFreeAsynch(PHGSMIINSTANCE pIns,
+ void *pvData,
+ bool fDoIrq)
{
- LogFlowFunc(("pIns = %p, pvMem = %p\n", pIns, pvMem));
+ LogFlowFunc(("pIns = %p, pvData = %p, fDoIrq = %d\n", pIns, pvData, fDoIrq));
-#if 0
- void *pvContext = NULL;
-#endif
-
- HGSMIOFFSET offBuffer = HGSMIHeapBufferOffset (&pIns->hostHeap, pvMem);
-
- int rc = hgsmiHostCommandProcess (pIns, offBuffer,
-#if 0
- hgsmiHostCommandFreeCallback, &pvContext,
-#endif
- bDoIrq);
- AssertRC (rc);
+ int rc;
+ if (HGSMIAreaContainsPointer(&pIns->hostHeap.area, pvData))
+ {
+ rc = hgsmiHostCommandSubmit(pIns, pvData, fDoIrq);
+ }
+ else
+ {
+ AssertLogRelMsgFailed(("HGSMI[%s]: host submits invalid command %p/%p\n",
+ pIns->pszName, pvData, pIns->hostHeap.area.pu8Base));
+ rc = VERR_INVALID_POINTER;
+ }
LogFlowFunc(("rc = %Rrc\n", rc));
-
return rc;
}
-#if 0
+
/**
- * Submit the shared memory block to the guest.
+ * Free the shared memory block.
*
- * @param pIns Pointer to HGSMI instance,
- * @param pvMem The pointer returned by 'HGSMIHostCommandAlloc'.
+ * @param pIns Pointer to HGSMI instance,
+ * @param pvData The pointer returned by 'HGSMIHostCommandAlloc'.
*/
-int HGSMIHostCommandProcess (HGSMIINSTANCE *pIns,
- void *pvMem)
+int HGSMIHostCommandFree(HGSMIINSTANCE *pIns,
+ void *pvData)
{
- LogFlowFunc(("pIns = %p, pvMem = %p\n", pIns, pvMem));
-
- VM_ASSERT_OTHER_THREAD(pIns->pVM);
-
- void *pvContext = NULL;
-
- HGSMIOFFSET offBuffer = HGSMIHeapBufferOffset (&pIns->hostHeap, pvMem);
+ LogFlowFunc(("pIns = %p, pvData = %p\n", pIns, pvData));
-// /* Have to forward to EMT because FIFO processing is there. */
-// int rc = VMR3ReqCallVoid (pIns->pVM, &pReq, RT_INDEFINITE_WAIT,
-// (PFNRT) hgsmiHostCommandProcess,
-// 3, pIns, offBuffer, &pvContext);
-
- int rc = hgsmiHostCommandProcess (pIns, offBuffer,
-#if 0
- hgsmiHostCommandRaiseEventCallback, &pvContext,
-#endif
- true);
- AssertReleaseRC (rc);
-
- if (RT_SUCCESS (rc))
+ int rc;
+ if (HGSMIAreaContainsPointer(&pIns->hostHeap.area, pvData))
{
- /* Wait for completion. */
- hgsmiWait (pvContext);
+ rc = hgsmiHostCommandFree(pIns, pvData);
+ }
+ else
+ {
+ AssertLogRelMsgFailed(("HGSMI[%s]: the host frees invalid FIFO entry %p/%p\n",
+ pIns->pszName, pvData, pIns->hostHeap.area.pu8Base));
+ rc = VERR_INVALID_POINTER;
}
LogFlowFunc(("rc = %Rrc\n", rc));
-
return rc;
}
-#endif
-
-/**
- * Free the shared memory block.
- *
- * @param pIns Pointer to HGSMI instance,
- * @param pvMem The pointer returned by 'HGSMIHostCommandAlloc'.
- */
-int HGSMIHostCommandFree (HGSMIINSTANCE *pIns,
- void *pvMem)
-{
- LogFlowFunc(("pIns = %p, pvMem = %p\n", pIns, pvMem));
-
- return hgsmiHostCommandFree (pIns, pvMem);
-}
static DECLCALLBACK(void *) hgsmiEnvAlloc(void *pvEnv, HGSMISIZE cb)
{
@@ -1104,23 +989,25 @@ static HGSMIENV g_hgsmiEnv =
hgsmiEnvFree
};
-int HGSMISetupHostHeap (PHGSMIINSTANCE pIns,
- HGSMIOFFSET offHeap,
- HGSMISIZE cbHeap)
+int HGSMIHostHeapSetup(PHGSMIINSTANCE pIns,
+ HGSMIOFFSET offHeap,
+ HGSMISIZE cbHeap)
{
LogFlowFunc(("pIns %p, offHeap 0x%08X, cbHeap = 0x%08X\n", pIns, offHeap, cbHeap));
int rc = VINF_SUCCESS;
- Assert (pIns);
+ AssertPtrReturn(pIns, VERR_INVALID_PARAMETER);
-// if ( offHeap >= pIns->cbMem
-// || cbHeap > pIns->cbMem
-// || offHeap + cbHeap > pIns->cbMem)
-// {
-// rc = VERR_INVALID_PARAMETER;
-// }
-// else
+ if ( offHeap >= pIns->area.cbArea
+ || cbHeap > pIns->area.cbArea
+ || offHeap > pIns->area.cbArea - cbHeap)
+ {
+ AssertLogRelMsgFailed(("offHeap 0x%08X, cbHeap = 0x%08X, pIns->area.cbArea 0x%08X\n",
+ offHeap, cbHeap, pIns->area.cbArea));
+ rc = VERR_INVALID_PARAMETER;
+ }
+ else
{
rc = hgsmiHostHeapLock (pIns);
@@ -1128,18 +1015,27 @@ int HGSMISetupHostHeap (PHGSMIINSTANCE pIns,
{
if (pIns->hostHeap.cRefs)
{
- AssertFailed();
+ AssertLogRelMsgFailed(("HGSMI[%s]: host heap setup ignored. %d allocated.\n",
+ pIns->pszName, pIns->hostHeap.cRefs));
/* It is possible to change the heap only if there is no pending allocations. */
rc = VERR_ACCESS_DENIED;
}
else
{
- rc = HGSMIHeapSetup (&pIns->hostHeap,
- HGSMI_HEAP_TYPE_MA,
- pIns->area.pu8Base+offHeap,
- cbHeap,
- offHeap,
- &g_hgsmiEnv);
+ rc = HGSMIAreaInitialize(&pIns->hostHeap.area, pIns->area.pu8Base + offHeap, cbHeap, offHeap);
+ if (RT_SUCCESS(rc))
+ {
+ rc = HGSMIMAInit(&pIns->hostHeap.u.ma, &pIns->hostHeap.area, NULL, 0, 0, &g_hgsmiEnv);
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ pIns->hostHeap.u32HeapType = HGSMI_HEAP_TYPE_MA;
+ }
+ else
+ {
+ HGSMIAreaClear(&pIns->hostHeap.area);
+ }
}
hgsmiHostHeapUnlock (pIns);
@@ -1384,12 +1280,12 @@ int HGSMIHostSaveStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM)
off = pIns->hostHeap.u32HeapType == HGSMI_HEAP_TYPE_MA?
0:
- HGSMIHeapHandleLocationOffset(&pIns->hostHeap);
+ hgsmiHostHeapHandleLocationOffset(&pIns->hostHeap);
rc = SSMR3PutU32 (pSSM, off);
if(off != HGSMIOFFSET_VOID)
{
- SSMR3PutU32 (pSSM, HGSMIHeapOffset(&pIns->hostHeap));
- SSMR3PutU32 (pSSM, HGSMIHeapSize(&pIns->hostHeap));
+ SSMR3PutU32 (pSSM, hgsmiHostHeapOffset(&pIns->hostHeap));
+ SSMR3PutU32 (pSSM, hgsmiHostHeapSize(&pIns->hostHeap));
/* need save mem pointer to calculate offset on restore */
SSMR3PutU64 (pSSM, (uint64_t)(uintptr_t)pIns->area.pu8Base);
rc = hgsmiFIFOLock (pIns);
@@ -1440,7 +1336,7 @@ int HGSMIHostLoadStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM, uint32_t u32Ve
AssertRCReturn(rc, rc);
pIns->pHGFlags = (off != HGSMIOFFSET_VOID) ? (HGSMIHOSTFLAGS*)HGSMIOffsetToPointer (&pIns->area, off) : NULL;
- HGSMIHEAP hHeap = pIns->hostHeap;
+ HGSMIHOSTHEAP hHeap = pIns->hostHeap;
rc = SSMR3GetU32(pSSM, &off);
AssertRCReturn(rc, rc);
if(off != HGSMIOFFSET_VOID)
@@ -1490,14 +1386,14 @@ int HGSMIHostLoadStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM, uint32_t u32Ve
rc = hgsmiHostLoadMA(pSSM, &cBlocks, &paDescriptors, &cbMaxBlock);
if (RT_SUCCESS(rc))
{
- rc = HGSMIHeapRestoreMA(&pIns->hostHeap,
- pIns->area.pu8Base+offHeap,
- cbHeap,
- offHeap,
- cBlocks,
- paDescriptors,
- cbMaxBlock,
- &g_hgsmiEnv);
+ rc = hgsmiHostHeapRestoreMA(&pIns->hostHeap,
+ pIns->area.pu8Base+offHeap,
+ cbHeap,
+ offHeap,
+ cBlocks,
+ paDescriptors,
+ cbMaxBlock,
+ &g_hgsmiEnv);
RTMemFree(paDescriptors);
}
@@ -1511,13 +1407,13 @@ int HGSMIHostLoadStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM, uint32_t u32Ve
Assert(!pIns->hostHeap.cRefs);
pIns->hostHeap.cRefs = 0;
- rc = HGSMIHeapRelocate(&pIns->hostHeap,
- u32HeapType,
- pIns->area.pu8Base+offHeap,
- off,
- uintptr_t(pIns->area.pu8Base) - uintptr_t(oldMem),
- cbHeap,
- offHeap);
+ rc = hgsmiHostHeapRelocate(&pIns->hostHeap,
+ u32HeapType,
+ pIns->area.pu8Base+offHeap,
+ off,
+ uintptr_t(pIns->area.pu8Base) - uintptr_t(oldMem),
+ cbHeap,
+ offHeap);
hgsmiHostHeapUnlock (pIns);
}
@@ -1544,14 +1440,13 @@ static int hgsmiChannelMapCreate (PHGSMIINSTANCE pIns,
/* Register a new HGSMI channel by a predefined index.
*/
-int HGSMIHostChannelRegister (PHGSMIINSTANCE pIns,
- uint8_t u8Channel,
- PFNHGSMICHANNELHANDLER pfnChannelHandler,
- void *pvChannelHandler,
- HGSMICHANNELHANDLER *pOldHandler)
+int HGSMIHostChannelRegister(PHGSMIINSTANCE pIns,
+ uint8_t u8Channel,
+ PFNHGSMICHANNELHANDLER pfnChannelHandler,
+ void *pvChannelHandler)
{
- LogFlowFunc(("pIns %p, u8Channel %x, pfnChannelHandler %p, pvChannelHandler %p, pOldHandler %p\n",
- pIns, u8Channel, pfnChannelHandler, pvChannelHandler, pOldHandler));
+ LogFlowFunc(("pIns %p, u8Channel %x, pfnChannelHandler %p, pvChannelHandler %p\n",
+ pIns, u8Channel, pfnChannelHandler, pvChannelHandler));
AssertReturn(!HGSMI_IS_DYNAMIC_CHANNEL(u8Channel), VERR_INVALID_PARAMETER);
AssertPtrReturn(pIns, VERR_INVALID_PARAMETER);
@@ -1561,7 +1456,7 @@ int HGSMIHostChannelRegister (PHGSMIINSTANCE pIns,
if (RT_SUCCESS (rc))
{
- rc = HGSMIChannelRegister (&pIns->channelInfo, u8Channel, NULL, pfnChannelHandler, pvChannelHandler, pOldHandler);
+ rc = HGSMIChannelRegister (&pIns->channelInfo, u8Channel, NULL, pfnChannelHandler, pvChannelHandler);
hgsmiUnlock (pIns);
}
@@ -1577,11 +1472,10 @@ int HGSMIChannelRegisterName (PHGSMIINSTANCE pIns,
const char *pszChannel,
PFNHGSMICHANNELHANDLER pfnChannelHandler,
void *pvChannelHandler,
- uint8_t *pu8Channel,
- HGSMICHANNELHANDLER *pOldHandler)
+ uint8_t *pu8Channel)
{
- LogFlowFunc(("pIns %p, pszChannel %s, pfnChannelHandler %p, pvChannelHandler %p, pu8Channel %p, pOldHandler %p\n",
- pIns, pszChannel, pfnChannelHandler, pvChannelHandler, pu8Channel, pOldHandler));
+ LogFlowFunc(("pIns %p, pszChannel %s, pfnChannelHandler %p, pvChannelHandler %p, pu8Channel %p\n",
+ pIns, pszChannel, pfnChannelHandler, pvChannelHandler, pu8Channel));
AssertPtrReturn(pIns, VERR_INVALID_PARAMETER);
AssertPtrReturn(pszChannel, VERR_INVALID_PARAMETER);
@@ -1603,7 +1497,7 @@ int HGSMIChannelRegisterName (PHGSMIINSTANCE pIns,
if (RT_SUCCESS (rc))
{
- rc = HGSMIChannelRegister (&pIns->channelInfo, *pu8Channel, pszName, pfnChannelHandler, pvChannelHandler, pOldHandler);
+ rc = HGSMIChannelRegister (&pIns->channelInfo, *pu8Channel, pszName, pfnChannelHandler, pvChannelHandler);
}
hgsmiUnlock (pIns);
@@ -1624,38 +1518,6 @@ int HGSMIChannelRegisterName (PHGSMIINSTANCE pIns,
return rc;
}
-#if 0
-/* A wrapper to safely call the handler.
- */
-int HGSMIChannelHandlerCall (PHGSMIINSTANCE pIns,
- const HGSMICHANNELHANDLER *pHandler,
- const HGSMIBUFFERHEADER *pHeader)
-{
- LogFlowFunc(("pHandler %p, pIns %p, pHeader %p\n", pHandler, pIns, pHeader));
-
- int rc;
-
- if ( pHandler
- && pHandler->pfnHandler)
- {
- void *pvBuffer = HGSMIBufferData (pHeader);
- HGSMISIZE cbBuffer = pHeader->u32DataSize;
-
- rc = pHandler->pfnHandler (pIns, pHandler->pvHandler, pHeader->u16ChannelInfo, pvBuffer, cbBuffer);
- }
- else
- {
- /* It is a NOOP case here. */
- rc = VINF_SUCCESS;
- }
-
- LogFlowFunc(("leave rc = %Rrc\n", rc));
-
- return rc;
-}
-
-#endif
-
void *HGSMIOffsetToPointerHost (PHGSMIINSTANCE pIns,
HGSMIOFFSET offBuffer)
{
@@ -1737,8 +1599,6 @@ static DECLCALLBACK(int) hgsmiChannelHandler (void *pvHandler, uint16_t u16Chann
return rc;
}
-static HGSMICHANNELHANDLER sOldChannelHandler;
-
int HGSMICreate (PHGSMIINSTANCE *ppIns,
PVM pVM,
const char *pszName,
@@ -1749,11 +1609,12 @@ int HGSMICreate (PHGSMIINSTANCE *ppIns,
void *pvNotifyGuest,
size_t cbContext)
{
- LogFlowFunc(("ppIns = %p, pVM = %p, pszName = [%s], pu8MemBase = %p, cbMem = 0x%08X, offMemBase = 0x%08X, "
+ LogFlowFunc(("ppIns = %p, pVM = %p, pszName = [%s], offBase = 0x%08X, pu8MemBase = %p, cbMem = 0x%08X, "
"pfnNotifyGuest = %p, pvNotifyGuest = %p, cbContext = %d\n",
ppIns,
pVM,
pszName,
+ offBase,
pu8MemBase,
cbMem,
pfnNotifyGuest,
@@ -1800,7 +1661,7 @@ int HGSMICreate (PHGSMIINSTANCE *ppIns,
pIns->pszName = VALID_PTR(pszName)? pszName: "";
- HGSMIHeapSetupUninitialized(&pIns->hostHeap);
+ hgsmiHostHeapSetupUninitialized(&pIns->hostHeap);
pIns->pfnNotifyGuest = pfnNotifyGuest;
pIns->pvNotifyGuest = pvNotifyGuest;
@@ -1815,8 +1676,7 @@ int HGSMICreate (PHGSMIINSTANCE *ppIns,
rc = HGSMIHostChannelRegister (pIns,
HGSMI_CH_HGSMI,
hgsmiChannelHandler,
- pIns,
- &sOldChannelHandler);
+ pIns);
if (RT_SUCCESS (rc))
{
@@ -1850,9 +1710,7 @@ uint32_t HGSMIReset (PHGSMIINSTANCE pIns)
while(hgsmiProcessGuestCmdCompletion(pIns) != HGSMIOFFSET_VOID) {}
#endif
- HGSMIHeapDestroy(&pIns->hostHeap);
-
- HGSMIHeapSetupUninitialized(&pIns->hostHeap);
+ hgsmiHostHeapDestroy(&pIns->hostHeap);
return flags;
}
@@ -1863,7 +1721,7 @@ void HGSMIDestroy (PHGSMIINSTANCE pIns)
if (pIns)
{
- HGSMIHeapDestroy(&pIns->hostHeap);
+ hgsmiHostHeapDestroy(&pIns->hostHeap);
if (RTCritSectIsInitialized (&pIns->hostHeapCritSect))
{
diff --git a/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.h b/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.h
index 25d8b64..bc6525f 100644
--- a/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.h
+++ b/src/VBox/Devices/Graphics/HGSMI/HGSMIHost.h
@@ -1,3 +1,4 @@
+/* $Id: HGSMIHost.h $ */
/** @file
*
* VBox Host Guest Shared Memory Interface (HGSMI).
@@ -5,7 +6,7 @@
*/
/*
- * Copyright (C) 2006-2010 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -59,27 +60,17 @@ HGSMIOFFSET HGSMIPointerToOffsetHost (PHGSMIINSTANCE pIns,
int HGSMIHostChannelRegister (PHGSMIINSTANCE pIns,
uint8_t u8Channel,
PFNHGSMICHANNELHANDLER pfnChannelHandler,
- void *pvChannelHandler,
- HGSMICHANNELHANDLER *pOldHandler);
+ void *pvChannelHandler);
int HGSMIChannelRegisterName (PHGSMIINSTANCE pIns,
const char *pszChannel,
PFNHGSMICHANNELHANDLER pfnChannelHandler,
void *pvChannelHandler,
- uint8_t *pu8Channel,
- HGSMICHANNELHANDLER *pOldHandler);
+ uint8_t *pu8Channel);
-int HGSMIChannelHandlerCall (PHGSMIINSTANCE pIns,
- const HGSMICHANNELHANDLER *pHandler,
- const HGSMIBUFFERHEADER *pHeader);
-
-
-int HGSMISetupHostHeap (PHGSMIINSTANCE pIns,
- HGSMIOFFSET offHeap,
- HGSMISIZE cbHeap);
-
-int HGSMISaveStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM);
-int HGSMILoadStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM);
+int HGSMIHostHeapSetup(PHGSMIINSTANCE pIns,
+ HGSMIOFFSET offHeap,
+ HGSMISIZE cbHeap);
/*
* Virtual hardware IO handlers.
@@ -111,21 +102,18 @@ void HGSMIClearHostGuestFlags(PHGSMIINSTANCE pIns, uint32_t flags);
*/
/* Allocate a buffer in the host heap. */
-int HGSMIHostCommandAlloc (PHGSMIINSTANCE pIns,
- void **ppvMem,
- HGSMISIZE cbMem,
- uint8_t u8Channel,
- uint16_t u16ChannelInfo);
-
-int HGSMIHostCommandProcess (PHGSMIINSTANCE pIns,
- void *pvMem);
+int HGSMIHostCommandAlloc(PHGSMIINSTANCE pIns,
+ void **ppvData,
+ HGSMISIZE cbData,
+ uint8_t u8Channel,
+ uint16_t u16ChannelInfo);
-int HGSMIHostCommandProcessAndFreeAsynch (PHGSMIINSTANCE pIns,
- void *pvMem,
- bool bDoIrq);
+int HGSMIHostCommandSubmitAndFreeAsynch(PHGSMIINSTANCE pIns,
+ void *pvData,
+ bool fDoIrq);
-int HGSMIHostCommandFree (PHGSMIINSTANCE pIns,
- void *pvMem);
+int HGSMIHostCommandFree(PHGSMIINSTANCE pIns,
+ void *pvData);
int HGSMIHostLoadStateExec (PHGSMIINSTANCE pIns, PSSMHANDLE pSSM, uint32_t u32Version);
diff --git a/src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.cpp b/src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.cpp
index 606772d..a7cfe82 100644
--- a/src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.cpp
+++ b/src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.cpp
@@ -1,3 +1,4 @@
+/* $Id: SHGSMIHost.cpp $ */
/*
* Copyright (C) 2010 Oracle Corporation
*
diff --git a/src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.h b/src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.h
index 8f7879c..492d897 100644
--- a/src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.h
+++ b/src/VBox/Devices/Graphics/HGSMI/SHGSMIHost.h
@@ -1,3 +1,4 @@
+/* $Id: SHGSMIHost.h $ */
/*
* Copyright (C) 2010 Oracle Corporation
*
diff --git a/src/VBox/Devices/Input/PS2Dev.h b/src/VBox/Devices/Input/PS2Dev.h
index 7aeeaff..09a960c 100644
--- a/src/VBox/Devices/Input/PS2Dev.h
+++ b/src/VBox/Devices/Input/PS2Dev.h
@@ -1,3 +1,4 @@
+/* $Id: PS2Dev.h $ */
/** @file
* PS/2 devices - Internal header file.
*/
diff --git a/src/VBox/Devices/Input/PS2K.cpp b/src/VBox/Devices/Input/PS2K.cpp
index 9f29f0f..8d1902c 100644
--- a/src/VBox/Devices/Input/PS2K.cpp
+++ b/src/VBox/Devices/Input/PS2K.cpp
@@ -1,3 +1,4 @@
+/* $Id: PS2K.cpp $ */
/** @file
* PS2K - PS/2 keyboard emulation.
*/
diff --git a/src/VBox/Devices/Input/UsbMouse.cpp b/src/VBox/Devices/Input/UsbMouse.cpp
index be3e4e7..f8ff79a 100644
--- a/src/VBox/Devices/Input/UsbMouse.cpp
+++ b/src/VBox/Devices/Input/UsbMouse.cpp
@@ -1,3 +1,4 @@
+/* $Id: UsbMouse.cpp $ */
/** @file
* UsbMouse - USB Human Interface Device Emulation (Mouse).
*/
diff --git a/src/VBox/Devices/Makefile.kmk b/src/VBox/Devices/Makefile.kmk
index 7659474..8de32fa 100644
--- a/src/VBox/Devices/Makefile.kmk
+++ b/src/VBox/Devices/Makefile.kmk
@@ -400,22 +400,15 @@ if !defined(VBOX_ONLY_EXTPACKS) # Goes on almost to the end of the file.
VBoxDD_DEFS += VBOX_WITH_INIP
VBoxDD_SOURCES += \
Network/DevINIP.cpp
- ifndef VBOX_WITH_NEW_LWIP
- include $(PATH_SUB_CURRENT)/Network/lwip/Makefile.kmk
- VBoxDD_INCS += $(LWIP_INCS)
- VBoxDD_SOURCES += $(LWIP_SOURCES)
- else
- # XXX: do not depend on order
- ifndef LWIP_SOURCES
- include $(PATH_SUB_CURRENT)/Network/lwip-new/Makefile.kmk
- endif
- Network/DevINIP.cpp_DEFS += VBOX_WITH_NEW_LWIP
- VBoxDD_LWIP_INCS += Network # for lwipopts.h
- $(eval $(call def_vbox_lwip_private, \
- VBoxDD, Network/lwip-new))
- $(eval $(call def_vbox_lwip_flags, \
- VBoxDD, Network/DevINIP.cpp, Network/lwip-new))
+ # XXX: do not depend on order
+ ifndef LWIP_SOURCES
+ include $(PATH_SUB_CURRENT)/Network/lwip-new/Makefile.kmk
endif
+ VBoxDD_LWIP_INCS += Network # for lwipopts.h
+ $(eval $(call def_vbox_lwip_private, \
+ VBoxDD, Network/lwip-new))
+ $(eval $(call def_vbox_lwip_flags, \
+ VBoxDD, Network/DevINIP.cpp, Network/lwip-new))
endif # VBOX_WITH_INIP
ifdef VBOX_WITH_E1000
@@ -486,13 +479,8 @@ if !defined(VBOX_ONLY_EXTPACKS) # Goes on almost to the end of the file.
endif
ifdef VBOX_WITH_ISCSI
- ifdef VBOX_WITH_NEW_LWIP
- Storage/DrvVD.cpp_DEFS += VBOX_WITH_NEW_LWIP
- $(eval $(call def_vbox_lwip_flags, \
- VBoxDD, Storage/DrvVD.cpp, Network/lwip-new))
- else
- Storage/DrvVD.cpp_INCS = $(LWIP_INCS)
- endif
+ $(eval $(call def_vbox_lwip_flags, \
+ VBoxDD, Storage/DrvVD.cpp, Network/lwip-new))
endif
ifdef VBOX_WITH_DRV_DISK_INTEGRITY
@@ -791,6 +779,12 @@ if !defined(VBOX_ONLY_EXTPACKS) # Goes on almost to the end of the file.
Serial/DrvHostSerial.cpp \
Parallel/DrvHostParallel.cpp
+ ifdef VBOX_WITH_VIRTUALKD
+ VBoxDD_DEFS.win += VBOX_WITH_VIRTUALKD
+ VBoxDD_SOURCES.win += \
+ Misc/VirtualKD.cpp
+ endif
+
if defined(VBOX_WITH_NETFLT)
VBoxDD_DEFS += VBOX_WITH_NETFLT
if defined(VBOX_NETFLT_ONDEMAND_BIND)
diff --git a/src/VBox/Devices/Network/DevE1000.cpp b/src/VBox/Devices/Network/DevE1000.cpp
index 8717f6c..a877b5c 100644
--- a/src/VBox/Devices/Network/DevE1000.cpp
+++ b/src/VBox/Devices/Network/DevE1000.cpp
@@ -5805,7 +5805,8 @@ static int e1kRegReadAlignedU32(PE1KSTATE pThis, uint32_t offReg, uint32_t *pu32
STAM_COUNTER_INC(&pThis->aStatRegReads[idxReg]);
}
else
- E1kLog(("%s At %08X read (%s) attempt from non-existing register\n", pThis->szPrf, offReg));
+ E1kLog(("%s At %08X read attempt from non-readable register %s (%s)\n",
+ pThis->szPrf, offReg, g_aE1kRegMap[idxReg].abbrev, g_aE1kRegMap[idxReg].name));
}
else
E1kLog(("%s At %08X read attempt from non-existing register\n", pThis->szPrf, offReg));
diff --git a/src/VBox/Devices/Network/DevINIP.cpp b/src/VBox/Devices/Network/DevINIP.cpp
index 8234c5b..1604015 100644
--- a/src/VBox/Devices/Network/DevINIP.cpp
+++ b/src/VBox/Devices/Network/DevINIP.cpp
@@ -33,13 +33,11 @@ RT_C_DECLS_BEGIN
#include "lwip/memp.h"
#include "lwip/pbuf.h"
#include "lwip/netif.h"
-#ifndef VBOX_WITH_NEW_LWIP
-# include "ipv4/lwip/ip.h"
-#else
-# include "lwip/api.h"
-# include "lwip/tcp_impl.h"
-# include "ipv6/lwip/ethip6.h"
-#endif
+#include "lwip/api.h"
+#include "lwip/tcp_impl.h"
+# if LWIP_IPV6
+# include "ipv6/lwip/ethip6.h"
+# endif
#include "lwip/udp.h"
#include "lwip/tcp.h"
#include "lwip/tcpip.h"
@@ -54,10 +52,7 @@ RT_C_DECLS_END
#include <iprt/uuid.h>
#include "VBoxDD.h"
-
-#ifdef VBOX_WITH_NEW_LWIP
-# include "VBoxLwipCore.h"
-#endif
+#include "VBoxLwipCore.h"
/*******************************************************************************
* Macros and Defines *
@@ -114,15 +109,6 @@ typedef struct DEVINTNETIP
const void *pLinkHack;
/** Flag whether the link is up. */
bool fLnkUp;
-#ifndef VBOX_WITH_NEW_LWIP
- /**
- * This hack-flag for spliting initialization logic in devINIPTcpipInitDone,
- * this is the only place when during initialization we can be called from TCPIP
- * thread.
- * This callback used for Initialization and Finalization with old lwip.
- */
- bool fTermination;
-#endif
/**
* In callback we're getting status of interface adding operation (TCPIP thread),
* but we need inform constructing routine whether it was success or not(EMT thread).
@@ -158,63 +144,11 @@ static const PFNRT g_pDevINILinkHack[] =
/*******************************************************************************
* Internal Functions *
*******************************************************************************/
-#ifndef VBOX_WITH_NEW_LWIP
-static DECLCALLBACK(void) devINIPARPTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer);
-static DECLCALLBACK(void) devINIPTCPFastTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer);
-static DECLCALLBACK(void) devINIPTCPSlowTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer);
-#endif
static DECLCALLBACK(err_t) devINIPOutput(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr);
static DECLCALLBACK(err_t) devINIPOutputRaw(struct netif *netif, struct pbuf *p);
static DECLCALLBACK(err_t) devINIPInterface(struct netif *netif);
-#ifndef VBOX_WITH_NEW_LWIP
-/**
- * ARP cache timeout handling for lwIP.
- *
- * @param pDevIns Device instance.
- * @param pTimer Pointer to timer.
- */
-static DECLCALLBACK(void) devINIPARPTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
- PDEVINTNETIP pThis = (PDEVINTNETIP)pvUser;
- LogFlow(("%s: pDevIns=%p pTimer=%p\n", __FUNCTION__, pDevIns, pTimer));
- lwip_etharp_tmr();
- TMTimerSetMillies(pThis->ARPTimer, ARP_TMR_INTERVAL);
- LogFlow(("%s: return\n", __FUNCTION__));
-}
-
-/**
- * TCP fast timer handling for lwIP.
- *
- * @param pDevIns Device instance.
- * @param pTimer Pointer to timer.
- */
-static DECLCALLBACK(void) devINIPTCPFastTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
- PDEVINTNETIP pThis = (PDEVINTNETIP)pvUser;
- LogFlow(("%s: pDevIns=%p pTimer=%p\n", __FUNCTION__, pDevIns, pTimer));
- lwip_tcp_fasttmr();
- TMTimerSetMillies(pThis->TCPFastTimer, TCP_FAST_INTERVAL);
- LogFlow(("%s: return\n", __FUNCTION__));
-}
-
-/**
- * TCP slow timer handling for lwIP.
- *
- * @param pDevIns Device instance.
- * @param pTimer Pointer to timer.
- */
-static DECLCALLBACK(void) devINIPTCPSlowTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
-{
- PDEVINTNETIP pThis = (PDEVINTNETIP)pvUser;
- LogFlow(("%s: pDevIns=%p pTimer=%p\n", __FUNCTION__, pDevIns, pTimer));
- lwip_tcp_slowtmr();
- TMTimerSetMillies(pThis->TCPSlowTimer, TCP_SLOW_INTERVAL);
- LogFlow(("%s: return\n", __FUNCTION__));
-}
-#endif /* VBOX_WITH_NEW_LWIP */
-
/**
* Output a TCP/IP packet on the interface. Uses the generic lwIP ARP
* code to resolve the address and call the link-level packet function.
@@ -229,11 +163,9 @@ static DECLCALLBACK(err_t) devINIPOutput(struct netif *netif, struct pbuf *p, st
err_t lrc;
LogFlow(("%s: netif=%p p=%p ipaddr=%#04x\n", __FUNCTION__, netif, p,
ipaddr->addr));
-#ifndef VBOX_WITH_NEW_LWIP
- lrc = lwip_etharp_output(netif, ipaddr, p);
-#else
+
lrc = lwip_etharp_output(netif, p, ipaddr);
-#endif
+
LogFlow(("%s: return %d\n", __FUNCTION__, lrc));
return lrc;
}
@@ -326,25 +258,18 @@ static DECLCALLBACK(err_t) devINIPInterface(struct netif *netif)
memcpy(netif->hwaddr, &g_pDevINIPData->MAC, sizeof(g_pDevINIPData->MAC));
netif->mtu = DEVINIP_MAX_FRAME;
netif->flags = NETIF_FLAG_BROADCAST;
-#ifdef VBOX_WITH_NEW_LWIP
- /** @todo why explicit ARP routing required for 1.2.0 case? */
netif->flags |= NETIF_FLAG_ETHARP;
netif->flags |= NETIF_FLAG_ETHERNET;
- /* Note! We always assign link-local IPv6 address */
+
+#if LWIP_IPV6
netif_create_ip6_linklocal_address(netif, 0);
netif_ip6_addr_set_state(netif, 0, IP6_ADDR_VALID);
netif->output_ip6 = ethip6_output;
netif->ip6_autoconfig_enabled=1;
LogFunc(("netif: ipv6:%RTnaipv6\n", &netif->ip6_addr[0].addr[0]));
- netif->output = lwip_etharp_output;
-
- lwip_etharp_init();
-#else
- netif->output = devINIPOutput;
+#endif
- lwip_etharp_init();
- TMTimerSetMillies(g_pDevINIPData->ARPTimer, ARP_TMR_INTERVAL);
- #endif
+ netif->output = lwip_etharp_output;
netif->linkoutput = devINIPOutputRaw;
LogFlow(("%s: success\n", __FUNCTION__));
@@ -451,27 +376,10 @@ static DECLCALLBACK(int) devINIPNetworkDown_Input(PPDMINETWORKDOWN pInterface, c
ethhdr = (const struct eth_hdr *)p->payload;
struct netif *iface = &g_pDevINIPData->IntNetIF;
-#ifndef VBOX_WITH_NEW_LWIP
- err_t lrc;
- switch (htons(ethhdr->type))
- {
- case ETHTYPE_IP: /* IP packet */
- lwip_pbuf_header(p, -(ssize_t)sizeof(struct eth_hdr));
- lrc = iface->input(p, iface);
- if (lrc)
- rc = VERR_NET_IO_ERROR;
- break;
- case ETHTYPE_ARP: /* ARP packet */
- lwip_etharp_arp_input(iface, (struct eth_addr *)iface->hwaddr, p);
- break;
- default:
- lwip_pbuf_free(p);
- }
-#else
+
/* We've setup flags NETIF_FLAG_ETHARP and NETIF_FLAG_ETHERNET
so this should be thread-safe. */
tcpip_input(p,iface);
-#endif
}
LogFlow(("%s: return %Rrc\n", __FUNCTION__, rc));
@@ -499,11 +407,7 @@ static DECLCALLBACK(void) devINIPTcpipInitDone(void *arg)
AssertPtrReturnVoid(arg);
pThis->rcInitialization = VINF_SUCCESS;
-#ifndef VBOX_WITH_NEW_LWIP
- /* see PDEVINTNETIP::fTermination */
- if (!pThis->fTermination)
{
-#endif
struct netif *ret;
struct ip_addr ipaddr, netmask, gw;
struct in_addr ip;
@@ -564,18 +468,12 @@ static DECLCALLBACK(void) devINIPTcpipInitDone(void *arg)
lwip_netif_set_default(&pThis->IntNetIF);
lwip_netif_set_up(&pThis->IntNetIF);
-
-#ifndef VBOX_WITH_NEW_LWIP
}
done:
- lwip_sys_sem_signal(pThis->LWIPTcpInitSem);
-#else
- done:
return;
-#endif
}
-#ifdef VBOX_WITH_NEW_LWIP
+
/**
* This callback is for finitializing our activity on TCPIP thread.
* XXX: We do it only for new LWIP, old LWIP will stay broken for now.
@@ -589,7 +487,6 @@ static DECLCALLBACK(void) devINIPTcpipFiniDone(void *arg)
netif_set_down(&pThis->IntNetIF);
netif_remove(&pThis->IntNetIF);
}
-#endif
/**
@@ -687,18 +584,7 @@ static DECLCALLBACK(int) devINIPDestruct(PPDMDEVINS pDevIns)
PDMDEV_CHECK_VERSIONS_RETURN_QUIET(pDevIns);
if (g_pDevINIPData != NULL)
- {
-#ifndef VBOX_WITH_NEW_LWIP
- netif_set_down(&pThis->IntNetIF);
- netif_remove(&pThis->IntNetIF);
- pThis->fTermination = true;
- tcpip_terminate();
- lwip_sys_sem_wait(pThis->LWIPTcpInitSem);
- lwip_sys_sem_free(pThis->LWIPTcpInitSem);
-#else
vboxLwipCoreFinalize(devINIPTcpipFiniDone, pThis);
-#endif
- }
MMR3HeapFree(pThis->pszIP);
pThis->pszIP = NULL;
@@ -719,9 +605,8 @@ static DECLCALLBACK(int) devINIPConstruct(PPDMDEVINS pDevIns, int iInstance, PCF
{
PDEVINTNETIP pThis = PDMINS_2_DATA(pDevIns, PDEVINTNETIP);
int rc = VINF_SUCCESS;
-#ifdef VBOX_WITH_NEW_LWIP
err_t errRc = ERR_OK;
-#endif
+
LogFlow(("%s: pDevIns=%p iInstance=%d pCfg=%p\n", __FUNCTION__,
pDevIns, iInstance, pCfg));
@@ -732,9 +617,7 @@ static DECLCALLBACK(int) devINIPConstruct(PPDMDEVINS pDevIns, int iInstance, PCF
* Validate the config.
*/
if (!CFGMR3AreValuesValid(pCfg, "MAC\0IP\0"
-#ifdef VBOX_WITH_NEW_LWIP
"IPv6\0"
-#endif
"Netmask\0Gateway\0"))
return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
N_("Unknown Internal Networking IP configuration option"));
@@ -821,35 +704,7 @@ static DECLCALLBACK(int) devINIPConstruct(PPDMDEVINS pDevIns, int iInstance, PCF
/*
* Initialize lwIP.
*/
-#ifndef VBOX_WITH_NEW_LWIP
- lwip_stats_init();
- lwip_sys_init();
-# if MEM_LIBC_MALLOC == 0
- lwip_mem_init();
-# endif
- lwip_memp_init();
- lwip_pbuf_init();
- lwip_netif_init();
- rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, devINIPARPTimer, pThis,
- TMTIMER_FLAGS_NO_CRIT_SECT, "lwIP ARP", &pThis->ARPTimer);
- AssertRCReturn(rc, rc);
- rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, devINIPTCPFastTimer, pThis,
- TMTIMER_FLAGS_NO_CRIT_SECT, "lwIP fast TCP", &pThis->TCPFastTimer);
- AssertRCReturn(rc, rc);
- TMTimerSetMillies(pThis->TCPFastTimer, TCP_FAST_INTERVAL);
- rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, devINIPTCPSlowTimer, pThis,
- TMTIMER_FLAGS_NO_CRIT_SECT, "lwIP slow TCP", &pThis->TCPSlowTimer);
- AssertRCReturn(rc, rc);
- TMTimerSetMillies(pThis->TCPFastTimer, TCP_SLOW_INTERVAL);
-
- pThis->LWIPTcpInitSem = lwip_sys_sem_new(0);
-
- lwip_tcpip_init(devINIPTcpipInitDone, pThis);
- lwip_sys_sem_wait(pThis->LWIPTcpInitSem);
-
-#else /* VBOX_WITH_NEW_LWIP */
vboxLwipCoreInitialize(devINIPTcpipInitDone, pThis);
-#endif
/* this rc could be updated in devINIPTcpInitDone thread */
AssertRCReturn(pThis->rcInitialization, pThis->rcInitialization);
diff --git a/src/VBox/Devices/Network/DevPCNet.cpp b/src/VBox/Devices/Network/DevPCNet.cpp
index 6bb0cac..5955ab9 100644
--- a/src/VBox/Devices/Network/DevPCNet.cpp
+++ b/src/VBox/Devices/Network/DevPCNet.cpp
@@ -1356,16 +1356,13 @@ static void pcnetUpdateRingHandlers(PPCNETSTATE pThis)
PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns),
pThis->RDRAPhysOld & ~PAGE_OFFSET_MASK);
- rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
- PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
- pThis->GCRDRA & ~PAGE_OFFSET_MASK,
- RT_ALIGN(pcnetRdraAddr(pThis, 0), PAGE_SIZE) - 1,
- pcnetHandleRingWrite, pDevIns,
- g_DevicePCNet.szR0Mod, "pcnetHandleRingWrite",
- pThis->pDevInsHC->pvInstanceDataHC,
- g_DevicePCNet.szRCMod, "pcnetHandleRingWrite",
- pThis->pDevInsHC->pvInstanceDataRC,
- "PCNet receive ring write access handler");
+ rc = PGMHandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
+ pThis->GCRDRA & ~PAGE_OFFSET_MASK,
+ RT_ALIGN(pcnetRdraAddr(pThis, 0), PAGE_SIZE) - 1,
+ pThis->hNoPollingHandlerType, pDevIns,
+ pThis->pDevInsHC->pvInstanceDataHC,
+ pThis->pDevInsHC->pvInstanceDataRC,
+ "PCNet receive ring write access handler");
AssertRC(rc);
pThis->RDRAPhysOld = pThis->GCRDRA;
@@ -1395,16 +1392,14 @@ static void pcnetUpdateRingHandlers(PPCNETSTATE pThis)
PGMHandlerPhysicalDeregister(PDMDevHlpGetVM(pDevIns),
pThis->TDRAPhysOld & ~PAGE_OFFSET_MASK);
- rc = PGMR3HandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
- PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
- pThis->GCTDRA & ~PAGE_OFFSET_MASK,
- RT_ALIGN(pcnetTdraAddr(pThis, 0), PAGE_SIZE) - 1,
- pcnetHandleRingWrite, pDevIns,
- g_DevicePCNet.szR0Mod, "pcnetHandleRingWrite",
- pThis->pDevInsHC->pvInstanceDataHC,
- g_DevicePCNet.szRCMod, "pcnetHandleRingWrite",
- pThis->pDevInsHC->pvInstanceDataRC,
- "PCNet transmit ring write access handler");
+ rc = PGMHandlerPhysicalRegister(PDMDevHlpGetVM(pDevIns),
+ pThis->GCTDRA & ~PAGE_OFFSET_MASK,
+ RT_ALIGN(pcnetTdraAddr(pThis, 0), PAGE_SIZE) - 1,
+ pThis->hNoPollingHandlerType,
+ pDevIns,
+ pThis->pDevInsHC->pvInstanceDataHC,
+ pThis->pDevInsHC->pvInstanceDataRC,
+ "PCNet transmit ring write access handler");
AssertRC(rc);
pThis->TDRAPhysOld = pThis->GCTDRA;
@@ -4947,7 +4942,7 @@ static DECLCALLBACK(int) pcnetConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGM
pThis->PciDev.config[0x3f] = 0xff;
/*
- * We use own critical section (historical reasons).
+ * We use our own critical section (historical reasons).
*/
rc = PDMDevHlpCritSectInit(pDevIns, &pThis->CritSect, RT_SRC_POS, "PCNet#%u", iInstance);
AssertRCReturn(rc, rc);
@@ -4978,6 +4973,15 @@ static DECLCALLBACK(int) pcnetConstruct(PPDMDEVINS pDevIns, int iInstance, PCFGM
if (RT_SUCCESS(rc))
rc = PDMR3LdrGetSymbolRCLazy(PDMDevHlpGetVM(pDevIns), NULL, NULL, "EMInterpretInstruction", (RTGCPTR *)&pThis->pfnEMInterpretInstructionRC);
AssertLogRelMsgRCReturn(rc, ("PDMR3LdrGetSymbolRCLazy(EMInterpretInstruction) -> %Rrc\n", rc), rc);
+
+ rc = PGMR3HandlerPhysicalTypeRegister(PDMDevHlpGetVM(pDevIns), PGMPHYSHANDLERKIND_WRITE,
+ pcnetHandleRingWrite,
+ g_DevicePCNet.szR0Mod, "pcnetHandleRingWrite",
+ g_DevicePCNet.szRCMod, "pcnetHandleRingWrite",
+ "PCNet ring write access handler",
+ &pThis->hNoPollingHandlerType);
+ AssertRCReturn(rc, rc);
+
#else
rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, pcnetTimer, pThis,
TMTIMER_FLAGS_NO_CRIT_SECT, "PCNet Poll Timer", &pThis->pTimerPollR3);
diff --git a/src/VBox/Devices/Network/DrvNAT.cpp b/src/VBox/Devices/Network/DrvNAT.cpp
index 4418699..46a9f81 100644
--- a/src/VBox/Devices/Network/DrvNAT.cpp
+++ b/src/VBox/Devices/Network/DrvNAT.cpp
@@ -637,13 +637,13 @@ static void drvNATNotifyLinkChangedWorker(PDRVNAT pThis, PDMNETWORKLINKSTATE enm
switch (enmLinkState)
{
case PDMNETWORKLINKSTATE_UP:
- LogRel(("NAT: link up\n"));
+ LogRel(("NAT: Link up\n"));
slirp_link_up(pThis->pNATState);
break;
case PDMNETWORKLINKSTATE_DOWN:
case PDMNETWORKLINKSTATE_DOWN_RESUME:
- LogRel(("NAT: link down\n"));
+ LogRel(("NAT: Link down\n"));
slirp_link_down(pThis->pNATState);
break;
@@ -801,7 +801,7 @@ static DECLCALLBACK(int) drvNATAsyncIoThread(PPDMDRVINS pDrvIns, PPDMTHREAD pThr
}
else if (cPollNegRet++ > 128)
{
- LogRel(("NAT:Poll returns (%s) suppressed %d\n", strerror(errno), cPollNegRet));
+ LogRel(("NAT: Poll returns (%s) suppressed %d\n", strerror(errno), cPollNegRet));
cPollNegRet = 0;
}
}
@@ -1527,7 +1527,7 @@ static DECLCALLBACK(int) drvNATConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uin
GET_STRING_ALLOC(rc, pThis, pCfg, "BindIP", pszBindIP);
rc = slirp_set_binding_address(pThis->pNATState, pszBindIP);
if (rc != 0 && pszBindIP && *pszBindIP)
- LogRel(("NAT: value of BindIP has been ignored\n"));
+ LogRel(("NAT: Value of BindIP has been ignored\n"));
if(pszBindIP != NULL)
MMR3HeapFree(pszBindIP);
diff --git a/src/VBox/Devices/Network/DrvNetShaper.cpp b/src/VBox/Devices/Network/DrvNetShaper.cpp
index e6ade66..edff4c1 100644
--- a/src/VBox/Devices/Network/DrvNetShaper.cpp
+++ b/src/VBox/Devices/Network/DrvNetShaper.cpp
@@ -296,7 +296,13 @@ static DECLCALLBACK(int) drvR3NetShaperDownCfg_SetLinkState(PPDMINETWORKCONFIG p
static DECLCALLBACK(RTR0PTR) drvR3NetShaperIBaseR0_QueryInterface(PPDMIBASER0 pInterface, const char *pszIID)
{
PDRVNETSHAPER pThis = RT_FROM_MEMBER(pInterface, DRVNETSHAPER, IBaseR0);
- PDMIBASER0_RETURN_INTERFACE(pThis->pDrvInsR3, pszIID, PDMINETWORKUP, &pThis->INetworkUpR0);
+ /*
+ * We need to check if the underlying driver supports R0. If it does not,
+ * then it is useless and even harmful to support R0 here, as we will end up
+ * returning errors when a network adapter tries to allocate a buffer in R0.
+ */
+ if (pThis->pIBelowNetR0)
+ PDMIBASER0_RETURN_INTERFACE(pThis->pDrvInsR3, pszIID, PDMINETWORKUP, &pThis->INetworkUpR0);
return NIL_RTR0PTR;
}
diff --git a/src/VBox/Devices/Network/SrvIntNetR0.cpp b/src/VBox/Devices/Network/SrvIntNetR0.cpp
index c961c84..6180797 100644
--- a/src/VBox/Devices/Network/SrvIntNetR0.cpp
+++ b/src/VBox/Devices/Network/SrvIntNetR0.cpp
@@ -162,27 +162,6 @@ typedef INTNETDSTTAB *PINTNETDSTTAB;
/** Pointer to a const destination table. */
typedef INTNETDSTTAB const *PCINTNETDSTTAB;
-
-/** Network layer address type. */
-typedef enum INTNETADDRTYPE
-{
- /** The invalid 0 entry. */
- kIntNetAddrType_Invalid = 0,
- /** IP version 4. */
- kIntNetAddrType_IPv4,
- /** IP version 6. */
- kIntNetAddrType_IPv6,
- /** IPX. */
- kIntNetAddrType_IPX,
- /** The end of the valid values. */
- kIntNetAddrType_End,
- /** The usual 32-bit hack. */
- kIntNetAddrType_32BitHack = 0x7fffffff
-} INTNETADDRTYPE;
-/** Pointer to a network layer address type. */
-typedef INTNETADDRTYPE *PINTNETADDRTYPE;
-
-
/**
* Address and type.
*/
@@ -355,13 +334,17 @@ typedef struct INTNETNETWORK
* This is protected by the INTNET::hMtxCreateOpenDestroy. */
struct INTNETNETWORK *pNext;
- /** The spinlock protecting MacTab and INTNETTRUNKIF::aAddrCache.
+ /** The spinlock protecting MacTab, aAddrBlacklist and INTNETIF::aAddrCache.
* Interrupt safe. */
RTSPINLOCK hAddrSpinlock;
/** MAC address table.
* This doubles as interface collection. */
INTNETMACTAB MacTab;
+ /** The network layer address cache. (Indexed by type, 0 entry isn't used.
+ * Contains host addresses. We don't let guests spoof them. */
+ INTNETADDRCACHE aAddrBlacklist[kIntNetAddrType_End];
+
/** Wait for an interface to stop being busy so it can be removed or have its
* destination table replaced. We have to wait upon this while owning the
* network mutex. Will only ever have one waiter because of the big mutex. */
@@ -1167,19 +1150,41 @@ DECLINLINE(void) intnetR0IfAddrCacheDelete(PINTNETIF pIf, PINTNETADDRCACHE pCach
* @param cbAddr The address size (optimization).
* @param pszMsg Log message.
*/
-DECLINLINE(void) intnetR0NetworkAddrCacheDelete(PINTNETNETWORK pNetwork, PCRTNETADDRU pAddr, INTNETADDRTYPE const enmType,
- uint8_t const cbAddr, const char *pszMsg)
+DECLINLINE(void) intnetR0NetworkAddrCacheDeleteUnlocked(PINTNETNETWORK pNetwork,
+ PCRTNETADDRU pAddr, INTNETADDRTYPE enmType,
+ uint8_t const cbAddr,
+ const char *pszMsg)
{
- RTSpinlockAcquire(pNetwork->hAddrSpinlock);
-
uint32_t iIf = pNetwork->MacTab.cEntries;
while (iIf--)
{
PINTNETIF pIf = pNetwork->MacTab.paEntries[iIf].pIf;
+
int i = intnetR0IfAddrCacheLookup(&pIf->aAddrCache[enmType], pAddr, cbAddr);
if (RT_UNLIKELY(i >= 0))
intnetR0IfAddrCacheDeleteIt(pIf, &pIf->aAddrCache[enmType], i, pszMsg);
}
+}
+
+
+/**
+ * Deletes the address from all the interface caches.
+ *
+ * This is used to remove stale entries that has been reassigned to
+ * other machines on the network.
+ *
+ * @param pNetwork The network.
+ * @param pAddr The address.
+ * @param enmType The address type.
+ * @param cbAddr The address size (optimization).
+ * @param pszMsg Log message.
+ */
+DECLINLINE(void) intnetR0NetworkAddrCacheDelete(PINTNETNETWORK pNetwork, PCRTNETADDRU pAddr, INTNETADDRTYPE const enmType,
+ uint8_t const cbAddr, const char *pszMsg)
+{
+ RTSpinlockAcquire(pNetwork->hAddrSpinlock);
+
+ intnetR0NetworkAddrCacheDeleteUnlocked(pNetwork, pAddr, enmType, cbAddr, pszMsg);
RTSpinlockRelease(pNetwork->hAddrSpinlock);
}
@@ -1252,6 +1257,114 @@ DECLINLINE(PINTNETIF) intnetR0NetworkAddrCacheLookupIf(PINTNETNETWORK pNetwork,
/**
+ * Look up specified address in the network's blacklist.
+ *
+ * @param pNetwork The network.
+ * @param enmType The address type.
+ * @param pAddr The address.
+ */
+static bool intnetR0NetworkBlacklistLookup(PINTNETNETWORK pNetwork,
+ PCRTNETADDRU pAddr, INTNETADDRTYPE enmType)
+{
+ PINTNETADDRCACHE pCache = &pNetwork->aAddrBlacklist[enmType];
+
+ if (RT_UNLIKELY(pCache->cEntriesAlloc == 0))
+ return false;
+
+ const uint8_t cbAddr = pCache->cbAddress;
+ Assert(cbAddr == intnetR0AddrSize(enmType));
+
+ for (unsigned i = 0; i < pCache->cEntries; ++i)
+ {
+ uint8_t *pbEntry = pCache->pbEntries + pCache->cbEntry * i;
+ if (intnetR0AddrUIsEqualEx((PCRTNETADDRU)pbEntry, pAddr, cbAddr))
+ return true;
+ }
+
+ return false;
+}
+
+
+/**
+ * Deletes specified address from network's blacklist.
+ *
+ * @param pNetwork The network.
+ * @param enmType The address type.
+ * @param pAddr The address.
+ */
+static void intnetR0NetworkBlacklistDelete(PINTNETNETWORK pNetwork,
+ PCRTNETADDRU pAddr, INTNETADDRTYPE enmType)
+{
+ PINTNETADDRCACHE pCache = &pNetwork->aAddrBlacklist[enmType];
+
+ if (RT_UNLIKELY(pCache->cEntriesAlloc == 0))
+ return;
+
+ const uint8_t cbAddr = pCache->cbAddress;
+ Assert(cbAddr == intnetR0AddrSize(enmType));
+
+ for (unsigned i = 0; i < pCache->cEntries; ++i)
+ {
+ uint8_t *pbEntry = pCache->pbEntries + pCache->cbEntry * i;
+ if (!intnetR0AddrUIsEqualEx((PCRTNETADDRU)pbEntry, pAddr, cbAddr))
+ continue;
+
+ --pCache->cEntries;
+ memmove(pCache->pbEntries + i * pCache->cbEntry,
+ pCache->pbEntries + (i + 1) * pCache->cbEntry,
+ (pCache->cEntries - i) * pCache->cbEntry);
+ return;
+ }
+}
+
+
+/**
+ * Adds specified address from network's blacklist.
+ *
+ * @param pNetwork The network.
+ * @param enmType The address type.
+ * @param pAddr The address.
+ */
+static void intnetR0NetworkBlacklistAdd(PINTNETNETWORK pNetwork,
+ PCRTNETADDRU pAddr, INTNETADDRTYPE enmType)
+{
+ PINTNETADDRCACHE pCache = &pNetwork->aAddrBlacklist[enmType];
+
+ if (RT_UNLIKELY(pCache->cEntriesAlloc == 0))
+ return;
+
+ const uint8_t cbAddr = pCache->cbAddress;
+ Assert(cbAddr == intnetR0AddrSize(enmType));
+
+ /* lookup */
+ for (unsigned i = 0; i < pCache->cEntries; ++i)
+ {
+ uint8_t *pbEntry = pCache->pbEntries + pCache->cbEntry * i;
+ if (RT_UNLIKELY(intnetR0AddrUIsEqualEx((PCRTNETADDRU)pbEntry, pAddr, cbAddr)))
+ return; /* already exists */
+ }
+
+ if (pCache->cEntries >= pCache->cEntriesAlloc)
+ {
+ /* shift */
+ memmove(pCache->pbEntries, pCache->pbEntries + pCache->cbEntry,
+ pCache->cbEntry * (pCache->cEntries - 1));
+ --pCache->cEntries;
+ }
+
+ Assert(pCache->cEntries < pCache->cEntriesAlloc);
+
+ /* push */
+ uint8_t *pbEntry = pCache->pbEntries + pCache->cEntries * pCache->cbEntry;
+ memcpy(pbEntry, pAddr, cbAddr);
+ memset(pbEntry + pCache->cbAddress, '\0', pCache->cbEntry - cbAddr);
+ ++pCache->cEntries;
+
+ Assert(pCache->cEntries <= pCache->cEntriesAlloc);
+}
+
+
+/**
* Adds an address to the cache, the caller is responsible for making sure it's
* not already in the cache.
*
@@ -1262,12 +1375,44 @@ DECLINLINE(PINTNETIF) intnetR0NetworkAddrCacheLookupIf(PINTNETNETWORK pNetwork,
* @param pAddr The address.
* @param pszMsg log message.
*/
-static void intnetR0IfAddrCacheAddIt(PINTNETIF pIf, PINTNETADDRCACHE pCache, PCRTNETADDRU pAddr, const char *pszMsg)
+static void intnetR0IfAddrCacheAddIt(PINTNETIF pIf, INTNETADDRTYPE enmAddrType, PCRTNETADDRU pAddr,
+ const char *pszMsg)
{
PINTNETNETWORK pNetwork = pIf->pNetwork;
AssertReturnVoid(pNetwork);
+
+ PINTNETADDRCACHE pCache = &pIf->aAddrCache[enmAddrType];
+
+ const uint8_t cbAddr = pCache->cbAddress;
+ Assert(cbAddr == intnetR0AddrSize(enmAddrType));
+
RTSpinlockAcquire(pNetwork->hAddrSpinlock);
+ bool fBlacklisted = intnetR0NetworkBlacklistLookup(pNetwork, pAddr, enmAddrType);
+ if (fBlacklisted)
+ {
+ RTSpinlockRelease(pNetwork->hAddrSpinlock);
+
+#ifdef LOG_ENABLED
+ switch (enmAddrType)
+ {
+ case kIntNetAddrType_IPv4:
+ Log(("%s: spoofing attempt for %RTnaipv4\n",
+ __FUNCTION__, pAddr->IPv4));
+ break;
+ case kIntNetAddrType_IPv6:
+ Log(("%s: spoofing attempt for %RTnaipv6\n",
+ __FUNCTION__, &pAddr->IPv6));
+ break;
+ default:
+ Log(("%s: spoofing attempt for %.*Rhxs (type %d)\n",
+ __FUNCTION__, cbAddr, pAddr, enmAddrType));
+ break;
+ }
+#endif
+ return;
+ }
+
if (RT_UNLIKELY(!pCache->cEntriesAlloc))
{
/* This shouldn't happen*/
@@ -1291,8 +1436,8 @@ static void intnetR0IfAddrCacheAddIt(PINTNETIF pIf, PINTNETADDRCACHE pCache, PCR
uint8_t *pbEntry = pCache->pbEntries + pCache->cEntries * pCache->cbEntry;
memcpy(pbEntry, pAddr, pCache->cbAddress);
memset(pbEntry + pCache->cbAddress, '\0', pCache->cbEntry - pCache->cbAddress);
+
#ifdef LOG_ENABLED
- INTNETADDRTYPE enmAddrType = (INTNETADDRTYPE)(uintptr_t)(pCache - &pIf->aAddrCache[0]);
switch (enmAddrType)
{
case kIntNetAddrType_IPv4:
@@ -1325,8 +1470,14 @@ static void intnetR0IfAddrCacheAddIt(PINTNETIF pIf, PINTNETADDRCACHE pCache, PCR
* @param cbAddr The size of the address (optimization).
* @param pszMsg Log message.
*/
-static void intnetR0IfAddrCacheAddSlow(PINTNETIF pIf, PINTNETADDRCACHE pCache, PCRTNETADDRU pAddr, uint8_t const cbAddr, const char *pszMsg)
+static void intnetR0IfAddrCacheAddSlow(PINTNETIF pIf, INTNETADDRTYPE enmAddrType, PCRTNETADDRU pAddr,
+ const char *pszMsg)
{
+ PINTNETADDRCACHE pCache = &pIf->aAddrCache[enmAddrType];
+
+ const uint8_t cbAddr = pCache->cbAddress;
+ Assert(cbAddr == intnetR0AddrSize(enmAddrType));
+
/*
* Check all but the first and last entries, the caller
* has already checked those.
@@ -1344,7 +1495,7 @@ static void intnetR0IfAddrCacheAddSlow(PINTNETIF pIf, PINTNETADDRCACHE pCache, P
/*
* Not found, add it.
*/
- intnetR0IfAddrCacheAddIt(pIf, pCache, pAddr, pszMsg);
+ intnetR0IfAddrCacheAddIt(pIf, enmAddrType, pAddr, pszMsg);
}
@@ -1359,10 +1510,13 @@ static void intnetR0IfAddrCacheAddSlow(PINTNETIF pIf, PINTNETADDRCACHE pCache, P
* @param cbAddr The size of the address (optimization).
* @param pszMsg Log message.
*/
-DECLINLINE(void) intnetR0IfAddrCacheAdd(PINTNETIF pIf, PINTNETADDRCACHE pCache, PCRTNETADDRU pAddr,
- uint8_t const cbAddr, const char *pszMsg)
+DECLINLINE(void) intnetR0IfAddrCacheAdd(PINTNETIF pIf, INTNETADDRTYPE enmAddrType, PCRTNETADDRU pAddr,
+ const char *pszMsg)
{
- Assert(pCache->cbAddress == cbAddr);
+ PINTNETADDRCACHE pCache = &pIf->aAddrCache[enmAddrType];
+
+ const uint8_t cbAddr = pCache->cbAddress;
+ Assert(cbAddr == intnetR0AddrSize(enmAddrType));
/*
* The optimized case is when the address the first or last cache entry.
@@ -1373,7 +1527,8 @@ DECLINLINE(void) intnetR0IfAddrCacheAdd(PINTNETIF pIf, PINTNETADDRCACHE pCache,
|| (i > 1
&& intnetR0AddrUIsEqualEx((PCRTNETADDRU)(pCache->pbEntries + pCache->cbEntry * i), pAddr, cbAddr))) ))
return;
- intnetR0IfAddrCacheAddSlow(pIf, pCache, pAddr, cbAddr, pszMsg);
+
+ intnetR0IfAddrCacheAddSlow(pIf, enmAddrType, pAddr, pszMsg);
}
@@ -2149,8 +2304,8 @@ static void intnetR0NetworkSnoopDhcp(PINTNETNETWORK pNetwork, PCRTNETIPV4 pIpHdr
if (pMatchingIf)
{
- intnetR0IfAddrCacheAdd(pMatchingIf, &pMatchingIf->aAddrCache[kIntNetAddrType_IPv4],
- (PCRTNETADDRU)&pDhcp->bp_yiaddr, sizeof(RTNETADDRIPV4), "DHCP_MT_ACK");
+ intnetR0IfAddrCacheAdd(pMatchingIf, kIntNetAddrType_IPv4,
+ (PCRTNETADDRU)&pDhcp->bp_yiaddr, "DHCP_MT_ACK");
intnetR0BusyDecIf(pMatchingIf);
}
}
@@ -2422,7 +2577,7 @@ static void intnetR0IfSnoopIPv6SourceAddr(PINTNETIF pIf, PCRTNETIPV6 pIpHdr, uin
if ( intnetR0IPv6AddrIsGood(Addr.IPv6) && (pIpHdr->ip6_hlim == 0xff)
&& intnetR0IfAddrCacheLookupLikely(&pIf->aAddrCache[kIntNetAddrType_IPv6], &Addr, sizeof(Addr.IPv6)) < 0)
{
- intnetR0IfAddrCacheAddIt(pIf, &pIf->aAddrCache[kIntNetAddrType_IPv6], &Addr, "if/ipv6");
+ intnetR0IfAddrCacheAdd(pIf, kIntNetAddrType_IPv6, &Addr, "if/ipv6");
}
}
@@ -2468,7 +2623,8 @@ static void intnetR0IfSnoopIPv4SourceAddr(PINTNETIF pIf, PCRTNETIPV4 pIpHdr, uin
Log(("intnetR0IfSnoopIPv4SourceAddr: bad ip header\n"));
return;
}
- intnetR0IfAddrCacheAddIt(pIf, &pIf->aAddrCache[kIntNetAddrType_IPv4], &Addr, "if/ipv4");
+
+ intnetR0IfAddrCacheAddIt(pIf, kIntNetAddrType_IPv4, &Addr, "if/ipv4");
fValidatedIpHdr = true;
}
@@ -2544,8 +2700,9 @@ static void intnetR0IfSnoopArpAddr(PINTNETIF pIf, PCRTNETARPIPV4 pArpIPv4, uint3
if ( !memcmp(&pArpIPv4->ar_sha, &pIf->MacAddr, sizeof(RTMAC))
&& intnetR0IPv4AddrIsGood(pArpIPv4->ar_spa))
- intnetR0IfAddrCacheAdd(pIf, &pIf->aAddrCache[kIntNetAddrType_IPv4],
- (PCRTNETADDRU)&pArpIPv4->ar_spa, sizeof(RTNETADDRIPV4), "if/arp");
+ {
+ intnetR0IfAddrCacheAdd(pIf, kIntNetAddrType_IPv4, (PCRTNETADDRU)&pArpIPv4->ar_spa, "if/arp");
+ }
}
@@ -5356,6 +5513,54 @@ static DECLCALLBACK(void) intnetR0TrunkIfPortSGRelease(PINTNETTRUNKSWPORT pSwitc
}
+/** @copydoc INTNETTRUNKSWPORT::pfnNotifyHostAddress */
+static DECLCALLBACK(void) intnetR0NetworkNotifyHostAddress(PINTNETTRUNKSWPORT pSwitchPort,
+ bool fAdded,
+ INTNETADDRTYPE enmType, const void *pvAddr)
+{
+ PINTNETTRUNKIF pTrunkIf = INTNET_SWITCHPORT_2_TRUNKIF(pSwitchPort);
+ PINTNETNETWORK pNetwork = pTrunkIf->pNetwork;
+ PCRTNETADDRU pAddr = (PCRTNETADDRU)pvAddr;
+ uint8_t cbAddr;
+
+ if (enmType == kIntNetAddrType_IPv4)
+ {
+ Log(("%s: %s %RTnaipv4\n",
+ __FUNCTION__, (fAdded ? "add" : "del"),
+ pAddr->IPv4));
+ cbAddr = 4;
+ }
+ else if (enmType == kIntNetAddrType_IPv6)
+ {
+ Log(("%s: %s %RTnaipv6\n",
+ __FUNCTION__, (fAdded ? "add" : "del"),
+ pAddr));
+ cbAddr = 16;
+ }
+ else
+ {
+ Log(("%s: unexpected address type %d\n", __FUNCTION__, enmType));
+ return;
+ }
+
+ RTSpinlockAcquire(pNetwork->hAddrSpinlock);
+ if (fAdded) /* one of host interfaces got a new address */
+ {
+ /* blacklist it to prevent spoofing by guests */
+ intnetR0NetworkBlacklistAdd(pNetwork, pAddr, enmType);
+
+ /* kick out any guest that uses it */
+ intnetR0NetworkAddrCacheDeleteUnlocked(pNetwork, pAddr, enmType, cbAddr, "tif/host");
+ }
+ else /* address deleted from one of host interfaces */
+ {
+ /* stop blacklisting it, guests may use it now */
+ intnetR0NetworkBlacklistDelete(pNetwork, pAddr, enmType);
+ }
+ RTSpinlockRelease(pNetwork->hAddrSpinlock);
+}
+
+
/**
* Shutdown the trunk interface.
*
@@ -5519,6 +5724,8 @@ static int intnetR0NetworkCreateTrunkIf(PINTNETNETWORK pNetwork, PSUPDRVSESSION
pTrunk->SwitchPort.pfnReportPromiscuousMode = intnetR0TrunkIfPortReportPromiscuousMode;
pTrunk->SwitchPort.pfnReportGsoCapabilities = intnetR0TrunkIfPortReportGsoCapabilities;
pTrunk->SwitchPort.pfnReportNoPreemptDsts = intnetR0TrunkIfPortReportNoPreemptDsts;
+ if (pNetwork->fFlags & INTNET_OPEN_FLAGS_SHARED_MAC_ON_WIRE)
+ pTrunk->SwitchPort.pfnNotifyHostAddress = intnetR0NetworkNotifyHostAddress;
pTrunk->SwitchPort.pfnDisconnect = intnetR0TrunkIfPortDisconnect;
pTrunk->SwitchPort.u32VersionEnd = INTNETTRUNKSWPORT_VERSION;
//pTrunk->pIfPort = NULL;
@@ -5650,6 +5857,9 @@ static DECLCALLBACK(void) intnetR0NetworkDestruct(void *pvObj, void *pvUser1, vo
*/
RTSpinlockAcquire(pNetwork->hAddrSpinlock);
+ for (int i = kIntNetAddrType_Invalid + 1; i < kIntNetAddrType_End; i++)
+ intnetR0IfAddrCacheDestroy(&pNetwork->aAddrBlacklist[i]);
+
uint32_t iIf = pNetwork->MacTab.cEntries;
while (iIf-- > 0)
{
@@ -6111,6 +6321,12 @@ static int intnetR0CreateNetwork(PINTNET pIntNet, PSUPDRVSESSION pSession, const
}
if (RT_SUCCESS(rc))
{
+ for (int i = kIntNetAddrType_Invalid + 1; i < kIntNetAddrType_End && RT_SUCCESS(rc); i++)
+ rc = intnetR0IfAddrCacheInit(&pNetwork->aAddrBlacklist[i], (INTNETADDRTYPE)i,
+ !!(pNetwork->fFlags & INTNET_OPEN_FLAGS_SHARED_MAC_ON_WIRE));
+ }
+ if (RT_SUCCESS(rc))
+ {
/*
* Register the object in the current session and link it into the network list.
*/
diff --git a/src/VBox/Devices/Network/lwip/CHANGELOG b/src/VBox/Devices/Network/lwip/CHANGELOG
deleted file mode 100644
index 8ad980e..0000000
--- a/src/VBox/Devices/Network/lwip/CHANGELOG
+++ /dev/null
@@ -1,680 +0,0 @@
-FUTURE
-
- * TODO: The lwIP source code makes some invalid assumptions on processor
- word-length, storage sizes and alignment. See the mailing lists for
- problems with exoteric (/DSP) architectures showing these problems.
- We still have to fix some of these issues neatly.
-
- * TODO: the ARP layer is not protected against concurrent access. If
- you run from a multitasking OS, serialize access to ARP (called from
- your network device driver and from a timeout thread.)
-
- * TODO: the PPP code is broken in a few ways. There are namespace
- collisions on BSD systems and many assumptions on word-length
- (sizeof(int)). In ppp.c an assumption is made on the availability of
- a thread subsystem. Either PPP needs to be moved to contrib/ports/???
- or rearranged to be more generic.
-
- * TODO: review the the sequential netconn and socket API (lwip/src/api)
- for bugs and performance issues. Frequent system calls (e.g. sys_mbox_fetch)
- slooow things down considerably.
-
-HISTORY
-
-(CVS HEAD)
-
- * [Enter new changes just after this line - do not remove this line]
-
- ++ New features:
-
- 2006-12-01 Christiaan Simons
- * mem.h, opt.h: Added MEM_LIBC_MALLOC option.
- Note this is a workaround. Currently I have no other options left.
-
- 2006-10-26 Christiaan Simons (accepted patch by Jonathan Larmour)
- * ipv4/ip_frag.c: rename MAX_MTU to IP_FRAG_MAX_MTU and move define
- to include/lwip/opt.h.
- * ipv4/lwip/ip_frag.h: Remove unused IP_REASS_INTERVAL.
- Move IP_REASS_MAXAGE and IP_REASS_BUFSIZE to include/lwip/opt.h.
- * opt.h: Add above new options.
-
- 2006-08-18 Christiaan Simons
- * tcp_{in,out}.c: added SNMP counters.
- * ipv4/ip.c: added SNMP counters.
- * ipv4/ip_frag.c: added SNMP counters.
-
- 2006-08-08 Christiaan Simons
- * etharp.{c,h}: added etharp_find_addr() to read
- (stable) ethernet/IP address pair from ARP table
-
- 2006-07-14 Christiaan Simons
- * mib_structs.c: added
- * include/lwip/snmp_structs.h: added
- * netif.{c,h}, netif/ethernetif.c: added SNMP statistics to netif struct
-
- 2006-07-06 Christiaan Simons
- * snmp/asn1_{enc,dec}.c added
- * snmp/mib2.c added
- * snmp/msg_{in,out}.c added
- * include/lwip/snmp_asn1.h added
- * include/lwip/snmp_msg.h added
- * doc/snmp_agent.txt added
-
- 2006-03-29 Christiaan Simons
- * inet.c, inet.h: Added platform byteswap support.
- Added LWIP_PLATFORM_BYTESWAP define (defaults to 0) and
- optional LWIP_PLATFORM_HTONS(), LWIP_PLATFORM_HTONL() macros.
-
- ++ Bug fixes:
-
- 2006-11-30 Christiaan Simons
- * dhcp.c: Fixed false triggers of request_timeout.
-
- 2006-11-28 Christiaan Simons
- * netif.c: In netif_add() fixed missing clear of ip_addr, netmask, gw and flags.
-
- 2006-10-11 Christiaan Simons
- * api_lib.c etharp.c, ip.c, memp.c, stats.c, sys.{c,h} tcp.h:
- Partially accepted patch #5449 for ANSI C compatibility / build fixes.
- * ipv4/lwip/ip.h ipv6/lwip/ip.h: Corrected UDP-Lite protocol
- identifier from 170 to 136 (bug #17574).
-
- 2006-10-10 Christiaan Simons
- * api_msg.c: Fixed Nagle algorithm as reported by Bob Grice.
-
- 2006-08-17 Christiaan Simons
- * udp.c: Fixed bug #17200, added check for broadcast
- destinations for PCBs bound to a unicast address.
-
- 2006-08-07 Christiaan Simons
- * api_msg.c: Flushing TCP output in do_close() (bug #15926).
-
- 2006-06-27 Christiaan Simons
- * api_msg.c: Applied patch for cold case (bug #11135).
- In accept_function() ensure newconn->callback is always initialized.
-
- 2006-06-15 Christiaan Simons
- * mem.h: added MEM_SIZE_F alias to fix an ancient cold case (bug #1748),
- facilitate printing of mem_size_t and u16_t statistics.
-
- 2006-06-14 Christiaan Simons
- * api_msg.c: Applied patch #5146 to handle allocation failures
- in accept() by Kevin Lawson.
-
- 2006-05-26 Christiaan Simons
- * api_lib.c: Removed conn->sem creation and destruction
- from netconn_write() and added sys_sem_new to netconn_new_*.
-
-(STABLE-1_1_1)
-
- 2006-03-03 Christiaan Simons
- * ipv4/ip_frag.c: Added bound-checking assertions on ip_reassbitmap
- access and added pbuf_alloc() return value checks.
-
- 2006-01-01 Leon Woestenberg <leon.woestenberg at gmx.net>
- * tcp_{in,out}.c, tcp_out.c: Removed 'even sndbuf' fix in TCP, which is
- now handled by the checksum routine properly.
-
- 2006-02-27 Leon Woestenberg <leon.woestenberg at gmx.net>
- * pbuf.c: Fix alignment; pbuf_init() would not work unless
- pbuf_pool_memory[] was properly aligned. (Patch by Curt McDowell.)
-
- 2005-12-20 Leon Woestenberg <leon.woestenberg at gmx.net>
- * tcp.c: Remove PCBs which stay in LAST_ACK state too long. Patch
- submitted by Mitrani Hiroshi.
-
- 2005-12-15 Christiaan Simons
- * inet.c: Disabled the added summing routine to preserve code space.
-
- 2005-12-14 Leon Woestenberg <leon.woestenberg at gmx.net>
- * tcp_in.c: Duplicate FIN ACK race condition fix by Kelvin Lawson.
- Added Curt McDowell's optimized checksumming routine for future
- inclusion. Need to create test case for unaliged, aligned, odd,
- even length combination of cases on various endianess machines.
-
- 2005-12-09 Christiaan Simons
- * inet.c: Rewrote standard checksum routine in proper portable C.
-
- 2005-11-25 Christiaan Simons
- * udp.c tcp.c: Removed SO_REUSE hack. Should reside in socket code only.
- * *.c: introduced cc.h LWIP_DEBUG formatters matching the u16_t, s16_t,
- u32_t, s32_t typedefs. This solves most debug word-length assumes.
-
- 2005-07-17 Leon Woestenberg <leon.woestenberg at gmx.net>
- * inet.c: Fixed unaligned 16-bit access in the standard checksum
- routine by Peter Jolasson.
- * slipif.c: Fixed implementation assumption of single-pbuf datagrams.
-
- 2005-02-04 Leon Woestenberg <leon.woestenberg at gmx.net>
- * tcp_out.c: Fixed uninitialized 'queue' referenced in memerr branch.
- * tcp_{out|in}.c: Applied patch fixing unaligned access.
-
- 2005-01-04 Leon Woestenberg <leon.woestenberg at gmx.net>
- * pbuf.c: Fixed missing semicolon after LWIP_DEBUG statement.
-
- 2005-01-03 Leon Woestenberg <leon.woestenberg at gmx.net>
- * udp.c: UDP pcb->recv() was called even when it was NULL.
-
-(STABLE-1_1_0)
-
- 2004-12-28 Leon Woestenberg <leon.woestenberg at gmx.net>
- * etharp.*: Disabled multiple packets on the ARP queue.
- This clashes with TCP queueing.
-
- 2004-11-28 Leon Woestenberg <leon.woestenberg at gmx.net>
- * etharp.*: Fixed race condition from ARP request to ARP timeout.
- Halved the ARP period, doubled the period counts.
- ETHARP_MAX_PENDING now should be at least 2. This prevents
- the counter from reaching 0 right away (which would allow
- too little time for ARP responses to be received).
-
- 2004-11-25 Leon Woestenberg <leon.woestenberg at gmx.net>
- * dhcp.c: Decline messages were not multicast but unicast.
- * etharp.c: ETHARP_CREATE is renamed to ETHARP_TRY_HARD.
- Do not try hard to insert arbitrary packet's source address,
- etharp_ip_input() now calls etharp_update() without ETHARP_TRY_HARD.
- etharp_query() now always DOES call ETHARP_TRY_HARD so that users
- querying an address will see it appear in the cache (DHCP could
- suffer from this when a server invalidly gave an in-use address.)
- * ipv4/ip_addr.h: Renamed ip_addr_maskcmp() to _netcmp() as we are
- comparing network addresses (identifiers), not the network masks
- themselves.
- * ipv4/ip_addr.c: ip_addr_isbroadcast() now checks that the given
- IP address actually belongs to the network of the given interface.
-
- 2004-11-24 Kieran Mansley <kjm25 at cam.ac.uk>
- * tcp.c: Increment pcb->snd_buf when ACK is received in SYN_SENT state.
-
-(STABLE-1_1_0-RC1)
-
- 2004-10-16 Kieran Mansley <kjm25 at cam.ac.uk>
- * tcp.c: Add code to tcp_recved() to send an ACK (window update) immediately,
- even if one is already pending, if the rcv_wnd is above a threshold
- (currently TCP_WND/2). This avoids waiting for a timer to expire to send a
- delayed ACK in order to open the window if the stack is only receiving data.
-
- 2004-09-12 Kieran Mansley <kjm25 at cam.ac.uk>
- * tcp*.*: Retransmit time-out handling improvement by Sam Jansen.
-
- 2004-08-20 Tony Mountifield <tony at softins.co.uk>
- * etharp.c: Make sure the first pbuf queued on an ARP entry
- is properly ref counted.
-
- 2004-07-27 Tony Mountifield <tony at softins.co.uk>
- * debug.h: Added (int) cast in LWIP_DEBUGF() to avoid compiler
- warnings about comparison.
- * pbuf.c: Stopped compiler complaining of empty if statement
- when LWIP_DEBUGF() empty. Closed an unclosed comment.
- * tcp.c: Stopped compiler complaining of empty if statement
- when LWIP_DEBUGF() empty.
- * ip.h Corrected IPH_TOS() macro: returns a byte, so doesn't need htons().
- * inet.c: Added a couple of casts to quiet the compiler.
- No need to test isascii(c) before isdigit(c) or isxdigit(c).
-
- 2004-07-22 Tony Mountifield <tony at softins.co.uk>
- * inet.c: Made data types consistent in inet_ntoa().
- Added casts for return values of checksum routines, to pacify compiler.
- * ip_frag.c, tcp_out.c, sockets.c, pbuf.c
- Small corrections to some debugging statements, to pacify compiler.
-
- 2004-07-21 Tony Mountifield <tony at softins.co.uk>
- * etharp.c: Removed spurious semicolon and added missing end-of-comment.
- * ethernetif.c Updated low_level_output() to match prototype for
- netif->linkoutput and changed low_level_input() similarly for consistency.
- * api_msg.c: Changed recv_raw() from int to u8_t, to match prototype
- of raw_recv() in raw.h and so avoid compiler error.
- * sockets.c: Added trivial (int) cast to keep compiler happier.
- * ip.c, netif.c Changed debug statements to use the tidier ip4_addrN() macros.
-
-(STABLE-1_0_0)
-
- ++ Changes:
-
- 2004-07-05 Leon Woestenberg <leon.woestenberg at gmx.net>
- * sockets.*: Restructured LWIP_PRIVATE_TIMEVAL. Make sure
- your cc.h file defines this either 1 or 0. If non-defined,
- defaults to 1.
- * .c: Added <string.h> and <errno.h> includes where used.
- * etharp.c: Made some array indices unsigned.
-
- 2004-06-27 Leon Woestenberg <leon.woestenberg at gmx.net>
- * netif.*: Added netif_set_up()/down().
- * dhcp.c: Changes to restart program flow.
-
- 2004-05-07 Leon Woestenberg <leon.woestenberg at gmx.net>
- * etharp.c: In find_entry(), instead of a list traversal per candidate, do a
- single-pass lookup for different candidates. Should exploit locality.
-
- 2004-04-29 Leon Woestenberg <leon.woestenberg at gmx.net>
- * tcp*.c: Cleaned up source comment documentation for Doxygen processing.
- * opt.h: ETHARP_ALWAYS_INSERT option removed to comply with ARP RFC.
- * etharp.c: update_arp_entry() only adds new ARP entries when adviced to by
- the caller. This deprecates the ETHARP_ALWAYS_INSERT overrule option.
-
- ++ Bug fixes:
-
- 2004-04-27 Leon Woestenberg <leon.woestenberg at gmx.net>
- * etharp.c: Applied patch of bug #8708 by Toni Mountifield with a solution
- suggested by Timmy Brolin. Fix for 32-bit processors that cannot access
- non-aligned 32-bit words, such as soms 32-bit TCP/IP header fields. Fix
- is to prefix the 14-bit Ethernet headers with two padding bytes.
-
- 2004-04-23 Leon Woestenberg <leon.woestenberg at gmx.net>
- * ip_addr.c: Fix in the ip_addr_isbroadcast() check.
- * etharp.c: Fixed the case where the packet that initiates the ARP request
- is not queued, and gets lost. Fixed the case where the packets destination
- address is already known; we now always queue the packet and perform an ARP
- request.
-
-(STABLE-0_7_0)
-
- ++ Bug fixes:
-
- * Fixed TCP bug for SYN_SENT to ESTABLISHED state transition.
- * Fixed TCP bug in dequeueing of FIN from out of order segment queue.
- * Fixed two possible NULL references in rare cases.
-
-(STABLE-0_6_6)
-
- ++ Bug fixes:
-
- * Fixed DHCP which did not include the IP address in DECLINE messages.
-
- ++ Changes:
-
- * etharp.c has been hauled over a bit.
-
-(STABLE-0_6_5)
-
- ++ Bug fixes:
-
- * Fixed TCP bug induced by bad window resizing with unidirectional TCP traffic.
- * Packets sent from ARP queue had invalid source hardware address.
-
- ++ Changes:
-
- * Pass-by ARP requests do now update the cache.
-
- ++ New features:
-
- * No longer dependent on ctype.h.
- * New socket options.
- * Raw IP pcb support.
-
-(STABLE-0_6_4)
-
- ++ Bug fixes:
-
- * Some debug formatters and casts fixed.
- * Numereous fixes in PPP.
-
- ++ Changes:
-
- * DEBUGF now is LWIP_DEBUGF
- * pbuf_dechain() has been re-enabled.
- * Mentioned the changed use of CVS branches in README.
-
-(STABLE-0_6_3)
-
- ++ Bug fixes:
-
- * Fixed pool pbuf memory leak in pbuf_alloc().
- Occured if not enough PBUF_POOL pbufs for a packet pbuf chain.
- Reported by Savin Zlobec.
-
- * PBUF_POOL chains had their tot_len field not set for non-first
- pbufs. Fixed in pbuf_alloc().
-
- ++ New features:
-
- * Added PPP stack contributed by Marc Boucher
-
- ++ Changes:
-
- * Now drops short packets for ICMP/UDP/TCP protocols. More robust.
-
- * ARP queueuing now queues the latest packet instead of the first.
- This is the RFC recommended behaviour, but can be overridden in
- lwipopts.h.
-
-(0.6.2)
-
- ++ Bugfixes:
-
- * TCP has been fixed to deal with the new use of the pbuf->ref
- counter.
-
- * DHCP dhcp_inform() crash bug fixed.
-
- ++ Changes:
-
- * Removed pbuf_pool_free_cache and pbuf_pool_alloc_cache. Also removed
- pbuf_refresh(). This has sped up pbuf pool operations considerably.
- Implemented by David Haas.
-
-(0.6.1)
-
- ++ New features:
-
- * The packet buffer implementation has been enhanced to support
- zero-copy and copy-on-demand for packet buffers which have their
- payloads in application-managed memory.
- Implemented by David Haas.
-
- Use PBUF_REF to make a pbuf refer to RAM. lwIP will use zero-copy
- if an outgoing packet can be directly sent on the link, or perform
- a copy-on-demand when necessary.
-
- The application can safely assume the packet is sent, and the RAM
- is available to the application directly after calling udp_send()
- or similar function.
-
- ++ Bugfixes:
-
- * ARP_QUEUEING should now correctly work for all cases, including
- PBUF_REF.
- Implemented by Leon Woestenberg.
-
- ++ Changes:
-
- * IP_ADDR_ANY is no longer a NULL pointer. Instead, it is a pointer
- to a '0.0.0.0' IP address.
-
- * The packet buffer implementation is changed. The pbuf->ref counter
- meaning has changed, and several pbuf functions have been
- adapted accordingly.
-
- * netif drivers have to be changed to set the hardware address length field
- that must be initialized correctly by the driver (hint: 6 for Ethernet MAC).
- See the contrib/ports/c16x cs8900 driver as a driver example.
-
- * netif's have a dhcp field that must be initialized to NULL by the driver.
- See the contrib/ports/c16x cs8900 driver as a driver example.
-
-(0.5.x) This file has been unmaintained up to 0.6.1. All changes are
- logged in CVS but have not been explained here.
-
-(0.5.3) Changes since version 0.5.2
-
- ++ Bugfixes:
-
- * memp_malloc(MEMP_API_MSG) could fail with multiple application
- threads because it wasn't protected by semaphores.
-
- ++ Other changes:
-
- * struct ip_addr now packed.
-
- * The name of the time variable in arp.c has been changed to ctime
- to avoid conflicts with the time() function.
-
-(0.5.2) Changes since version 0.5.1
-
- ++ New features:
-
- * A new TCP function, tcp_tmr(), now handles both TCP timers.
-
- ++ Bugfixes:
-
- * A bug in tcp_parseopt() could cause the stack to hang because of a
- malformed TCP option.
-
- * The address of new connections in the accept() function in the BSD
- socket library was not handled correctly.
-
- * pbuf_dechain() did not update the ->tot_len field of the tail.
-
- * Aborted TCP connections were not handled correctly in all
- situations.
-
- ++ Other changes:
-
- * All protocol header structs are now packed.
-
- * The ->len field in the tcp_seg structure now counts the actual
- amount of data, and does not add one for SYN and FIN segments.
-
-(0.5.1) Changes since version 0.5.0
-
- ++ New features:
-
- * Possible to run as a user process under Linux.
-
- * Preliminary support for cross platform packed structs.
-
- * ARP timer now implemented.
-
- ++ Bugfixes:
-
- * TCP output queue length was badly initialized when opening
- connections.
-
- * TCP delayed ACKs were not sent correctly.
-
- * Explicit initialization of BSS segment variables.
-
- * read() in BSD socket library could drop data.
-
- * Problems with memory alignment.
-
- * Situations when all TCP buffers were used could lead to
- starvation.
-
- * TCP MSS option wasn't parsed correctly.
-
- * Problems with UDP checksum calculation.
-
- * IP multicast address tests had endianess problems.
-
- * ARP requests had wrong destination hardware address.
-
- ++ Other changes:
-
- * struct eth_addr changed from u16_t[3] array to u8_t[6].
-
- * A ->linkoutput() member was added to struct netif.
-
- * TCP and UDP ->dest_* struct members where changed to ->remote_*.
-
- * ntoh* macros are now null definitions for big endian CPUs.
-
-(0.5.0) Changes since version 0.4.2
-
- ++ New features:
-
- * Redesigned operating system emulation layer to make porting easier.
-
- * Better control over TCP output buffers.
-
- * Documenation added.
-
- ++ Bugfixes:
-
- * Locking issues in buffer management.
-
- * Bugfixes in the sequential API.
-
- * IP forwarding could cause memory leakage. This has been fixed.
-
- ++ Other changes:
-
- * Directory structure somewhat changed; the core/ tree has been
- collapsed.
-
-(0.4.2) Changes since version 0.4.1
-
- ++ New features:
-
- * Experimental ARP implementation added.
-
- * Skeleton Ethernet driver added.
-
- * Experimental BSD socket API library added.
-
- ++ Bugfixes:
-
- * In very intense situations, memory leakage could occur. This has
- been fixed.
-
- ++ Other changes:
-
- * Variables named "data" and "code" have been renamed in order to
- avoid name conflicts in certain compilers.
-
- * Variable++ have in appliciable cases been translated to ++variable
- since some compilers generate better code in the latter case.
-
-(0.4.1) Changes since version 0.4
-
- ++ New features:
-
- * TCP: Connection attempts time out earlier than data
- transmissions. Nagle algorithm implemented. Push flag set on the
- last segment in a burst.
-
- * UDP: experimental support for UDP-Lite extensions.
-
- ++ Bugfixes:
-
- * TCP: out of order segments were in some cases handled incorrectly,
- and this has now been fixed. Delayed acknowledgements was broken
- in 0.4, has now been fixed. Binding to an address that is in use
- now results in an error. Reset connections sometimes hung an
- application; this has been fixed.
-
- * Checksum calculation sometimes failed for chained pbufs with odd
- lengths. This has been fixed.
-
- * API: a lot of bug fixes in the API. The UDP API has been improved
- and tested. Error reporting and handling has been
- improved. Logical flaws and race conditions for incoming TCP
- connections has been found and removed.
-
- * Memory manager: alignment issues. Reallocating memory sometimes
- failed, this has been fixed.
-
- * Generic library: bcopy was flawed and has been fixed.
-
- ++ Other changes:
-
- * API: all datatypes has been changed from generic ones such as
- ints, to specified ones such as u16_t. Functions that return
- errors now have the correct type (err_t).
-
- * General: A lot of code cleaned up and debugging code removed. Many
- portability issues have been fixed.
-
- * The license was changed; the advertising clause was removed.
-
- * C64 port added.
-
- * Thanks: Huge thanks go to Dagan Galarneau, Horst Garnetzke, Petri
- Kosunen, Mikael Caleres, and Frits Wilmink for reporting and
- fixing bugs!
-
-(0.4) Changes since version 0.3.1
-
- * Memory management has been radically changed; instead of
- allocating memory from a shared heap, memory for objects that are
- rapidly allocated and deallocated is now kept in pools. Allocation
- and deallocation from those memory pools is very fast. The shared
- heap is still present but is used less frequently.
-
- * The memory, memory pool, and packet buffer subsystems now support
- 4-, 2-, or 1-byte alignment.
-
- * "Out of memory" situations are handled in a more robust way.
-
- * Stack usage has been reduced.
-
- * Easier configuration of lwIP parameters such as memory usage,
- TTLs, statistics gathering, etc. All configuration parameters are
- now kept in a single header file "lwipopts.h".
-
- * The directory structure has been changed slightly so that all
- architecture specific files are kept under the src/arch
- hierarchy.
-
- * Error propagation has been improved, both in the protocol modules
- and in the API.
-
- * The code for the RTXC architecture has been implemented, tested
- and put to use.
-
- * Bugs have been found and corrected in the TCP, UDP, IP, API, and
- the Internet checksum modules.
-
- * Bugs related to porting between a 32-bit and a 16-bit architecture
- have been found and corrected.
-
- * The license has been changed slightly to conform more with the
- original BSD license, including the advertisement clause.
-
-(0.3.1) Changes since version 0.3
-
- * Fix of a fatal bug in the buffer management. Pbufs with allocated
- RAM never returned the RAM when the pbuf was deallocated.
-
- * TCP congestion control, window updates and retransmissions did not
- work correctly. This has now been fixed.
-
- * Bugfixes in the API.
-
-(0.3) Changes since version 0.2
-
- * New and improved directory structure. All include files are now
- kept in a dedicated include/ directory.
-
- * The API now has proper error handling. A new function,
- netconn_err(), now returns an error code for the connection in
- case of errors.
-
- * Improvements in the memory management subsystem. The system now
- keeps a pointer to the lowest free memory block. A new function,
- mem_malloc2() tries to allocate memory once, and if it fails tries
- to free some memory and retry the allocation.
-
- * Much testing has been done with limited memory
- configurations. lwIP now does a better job when overloaded.
-
- * Some bugfixes and improvements to the buffer (pbuf) subsystem.
-
- * Many bugfixes in the TCP code:
-
- - Fixed a bug in tcp_close().
-
- - The TCP receive window was incorrectly closed when out of
- sequence segments was received. This has been fixed.
-
- - Connections are now timed-out of the FIN-WAIT-2 state.
-
- - The initial congestion window could in some cases be too
- large. This has been fixed.
-
- - The retransmission queue could in some cases be screwed up. This
- has been fixed.
-
- - TCP RST flag now handled correctly.
-
- - Out of sequence data was in some cases never delivered to the
- application. This has been fixed.
-
- - Retransmitted segments now contain the correct acknowledgment
- number and advertised window.
-
- - TCP retransmission timeout backoffs are not correctly computed
- (ala BSD). After a number of retransmissions, TCP now gives up
- the connection.
-
- * TCP connections now are kept on three lists, one for active
- connections, one for listening connections, and one for
- connections that are in TIME-WAIT. This greatly speeds up the fast
- timeout processing for sending delayed ACKs.
-
- * TCP now provides proper feedback to the application when a
- connection has been successfully set up.
-
- * More comments have been added to the code. The code has also been
- somewhat cleaned up.
-
-(0.2) Initial public release.
diff --git a/src/VBox/Devices/Network/lwip/COPYING b/src/VBox/Devices/Network/lwip/COPYING
deleted file mode 100644
index e23898b..0000000
--- a/src/VBox/Devices/Network/lwip/COPYING
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-
diff --git a/src/VBox/Devices/Network/lwip/FILES b/src/VBox/Devices/Network/lwip/FILES
deleted file mode 100644
index 6625319..0000000
--- a/src/VBox/Devices/Network/lwip/FILES
+++ /dev/null
@@ -1,4 +0,0 @@
-src/ - The source code for the lwIP TCP/IP stack.
-doc/ - The documentation for lwIP.
-
-See also the FILES file in each subdirectory.
diff --git a/src/VBox/Devices/Network/lwip/Makefile.kmk b/src/VBox/Devices/Network/lwip/Makefile.kmk
deleted file mode 100644
index 357d869..0000000
--- a/src/VBox/Devices/Network/lwip/Makefile.kmk
+++ /dev/null
@@ -1,49 +0,0 @@
-# $Id: Makefile.kmk $
-## @file
-# Adds sources list and defines required to LWIP 1.2.0 compilation
-#
-
-#
-# Copyright (C) 2006-2012 Oracle Corporation
-#
-# This file is part of VirtualBox Open Source Edition (OSE), as
-# available from http://www.virtualbox.org. This file is free software;
-# you can redistribute it and/or modify it under the terms of the GNU
-# General Public License (GPL) as published by the Free Software
-# Foundation, in version 2 as it comes in the "COPYING" file of the
-# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
-# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
-#
-
- LWIP_INCS += \
- Network/lwip/src/include \
- Network/lwip/src/include/ipv4 \
- Network/lwip/vbox/include
- LWIP_SOURCES += \
- Network/lwip/src/api/api_lib.c \
- Network/lwip/src/api/api_msg.c \
- Network/lwip/src/api/err.c \
- Network/lwip/src/api/sockets.c \
- Network/lwip/src/api/tcpip.c \
- Network/lwip/src/core/tcp_in.c \
- Network/lwip/src/core/dhcp.c \
- Network/lwip/src/core/inet.c \
- Network/lwip/src/core/mem.c \
- Network/lwip/src/core/memp.c \
- Network/lwip/src/core/netif.c \
- Network/lwip/src/core/pbuf.c \
- Network/lwip/src/core/raw.c \
- Network/lwip/src/core/stats.c \
- Network/lwip/src/core/sys.c \
- Network/lwip/src/core/tcp.c \
- Network/lwip/src/core/ipv4/ip_addr.c \
- Network/lwip/src/core/ipv4/icmp.c \
- Network/lwip/src/core/ipv4/ip.c \
- Network/lwip/src/core/ipv4/ip_frag.c \
- Network/lwip/src/core/tcp_out.c \
- Network/lwip/src/core/udp.c \
- Network/lwip/src/netif/etharp.c \
- Network/lwip/vbox/sys_arch.c
- ifneq ($(KBUILD_TARGET),win)
- Network/lwip/src/api/sockets.c_CFLAGS = $(VBOX_GCC_Wno-address)
- endif
diff --git a/src/VBox/Devices/Network/lwip/Makefile.kup b/src/VBox/Devices/Network/lwip/Makefile.kup
deleted file mode 100644
index e69de29..0000000
diff --git a/src/VBox/Devices/Network/lwip/README b/src/VBox/Devices/Network/lwip/README
deleted file mode 100644
index d910282..0000000
--- a/src/VBox/Devices/Network/lwip/README
+++ /dev/null
@@ -1,74 +0,0 @@
-INTRODUCTION
-
-lwIP is a small independent implementation of the TCP/IP protocol
-suite that has been developed by Adam Dunkels at the Computer and
-Networks Architectures (CNA) lab at the Swedish Institute of Computer
-Science (SICS).
-
-The focus of the lwIP TCP/IP implementation is to reduce the RAM usage
-while still having a full scale TCP. This making lwIP suitable for use
-in embedded systems with tens of kilobytes of free RAM and room for
-around 40 kilobytes of code ROM.
-
-FEATURES
-
- * IP (Internet Protocol) including packet forwarding over multiple
- network interfaces
- * ICMP (Internet Control Message Protocol) for network maintenance
- and debugging
- * UDP (User Datagram Protocol) including experimental UDP-lite
- extensions
- * TCP (Transmission Control Protocol) with congestion control, RTT
- estimation and fast recovery/fast retransmit
- * Specialized API for enhanced performance
- * Optional Berkeley socket API
-
-LICENSE
-
-lwIP is freely available under a BSD license.
-
-DEVELOPMENT
-
-lwIP has grown into an excellent TCP/IP stack for embedded devices,
-and developers using the stack often submit bug fixes, improvements,
-and additions to the stack to further increase its usefulness.
-
-Development of lwIP is hosted on Savannah, a central point for
-software development, maintenance and distribution. Everyone can
-help improve lwIP by use of Savannah's interface, CVS and the
-mailing list. A core team of developers will commit changes to the
-CVS source tree.
-
-The lwIP TCP/IP stack is maintained in the 'lwip' CVS module and
-contributions (such as platform ports) are in the 'contrib' module.
-
-See doc/savannah.txt for details on CVS server access for users and
-developers.
-
-Last night's CVS tar ball can be downloaded from:
- http://savannah.gnu.org/cvs.backups/lwip.tar.gz [CHANGED - NEEDS FIXING]
-
-The current CVS trees are web-browsable:
- http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/lwip/
- http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/contrib/
-
-Submit patches and bugs via the lwIP project page:
- http://savannah.nongnu.org/projects/lwip/
-
-
-DOCUMENTATION
-
-The original out-dated homepage of lwIP and Adam Dunkels' papers on
-lwIP are at the official lwIP home page:
- http://www.sics.se/~adam/lwip/
-
-Self documentation of the source code is regularly extracted from the
-current CVS sources and is available from this web page:
- http://www.nongnu.org/lwip/
-
-Reading Adam's papers, the files in docs/, browsing the source code
-documentation and browsing the mailing list archives is a good way to
-become familiar with the design of lwIP.
-
-Adam Dunkels <adam at sics.se>
-Leon Woestenberg <leon.woestenberg at gmx.net>
diff --git a/src/VBox/Devices/Network/lwip/README.vbox b/src/VBox/Devices/Network/lwip/README.vbox
deleted file mode 100644
index 39d6a2a..0000000
--- a/src/VBox/Devices/Network/lwip/README.vbox
+++ /dev/null
@@ -1 +0,0 @@
-This is based on lwIP 1.2.0.
diff --git a/src/VBox/Devices/Network/lwip/doc/FILES b/src/VBox/Devices/Network/lwip/doc/FILES
deleted file mode 100644
index 49806d7..0000000
--- a/src/VBox/Devices/Network/lwip/doc/FILES
+++ /dev/null
@@ -1,5 +0,0 @@
-savannah.txt - How to obtain the current development source code.
-contrib.txt - How to contribute to lwIP as a developer.
-rawapi.txt - The documentation for the core API of lwIP.
-snmp_agent.txt - The documentation for the lwIP SNMP agent.
-sys_arch.txt - The documentation for a system abstraction layer of lwIP.
diff --git a/src/VBox/Devices/Network/lwip/doc/contrib.txt b/src/VBox/Devices/Network/lwip/doc/contrib.txt
deleted file mode 100644
index 7c99b9b..0000000
--- a/src/VBox/Devices/Network/lwip/doc/contrib.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-1 Introduction
-
-This document describes some guidelines for people participating
-in lwIP development.
-
-2 How to contribute to lwIP
-
-Here is a short list of suggestions to anybody working with lwIP and
-trying to contribute bug reports, fixes, enhancements, platform ports etc.
-First of all as you may already know lwIP is a volunteer project so feedback
-to fixes or questions might often come late. Hopefully the bug and patch tracking
-features of Savannah help us not lose users' input.
-
-2.1 Source code style:
-
-1. do not use tabs.
-2. indentation is two spaces per level (i.e. per tab).
-3. end debug messages with a trailing newline (\n).
-4. one space between keyword and opening bracket.
-5. no space between function and opening bracket.
-6. one space and no newline before opening curly braces of a block.
-7. closing curly brace on a single line.
-8. spaces surrounding assignment and comparisons.
-9. use current source code style as further reference.
-
-2.2 Source code documentation style:
-
-1. JavaDoc compliant and Doxygen compatible.
-2. Function documentation above functions in .c files, not .h files.
- (This forces you to synchronize documentation and implementation.)
-3. Use current documentation style as further reference.
-
-2.3 Bug reports and patches:
-
-1. Make sure you are reporting bugs or send patches against the latest
- sources. (From the latest release and/or the current CVS sources.)
-2. If you think you found a bug make sure it's not already filed in the
- bugtracker at Savannah.
-3. If you have a fix put the patch on Savannah. If it is a patch that affects
- both core and arch specific stuff please separate them so that the core can
- be applied separately while leaving the other patch 'open'. The prefered way
- is to NOT touch archs you can't test and let maintainers take care of them.
- This is a good way to see if they are used at all - the same goes for unix
- netifs except tapif.
-4. Do not file a bug and post a fix to it to the patch area. Either a bug report
- or a patch will be enough.
- If you correct an existing bug then attach the patch to the bug rather than creating a new entry in the patch area.
-5. Trivial patches (compiler warning, indentation and spelling fixes or anything obvious which takes a line or two)
- can go to the lwip-users list. This is still the fastest way of interaction and the list is not so crowded
- as to allow for loss of fixes. Putting bugs on Savannah and subsequently closing them is too much an overhead
- for reporting a compiler warning fix.
-6. Patches should be specific to a single change or to related changes.Do not mix bugfixes with spelling and other
- trivial fixes unless the bugfix is trivial too.Do not reorganize code and rename identifiers in the same patch you
- change behaviour if not necessary.A patch is easier to read and understand if it's to the point and short than
- if it's not to the point and long :) so the chances for it to be applied are greater.
-
-2.4 Platform porters:
-
-1. If you have ported lwIP to a platform (an OS, a uC/processor or a combination of these) and
- you think it could benefit others[1] you might want discuss this on the mailing list. You
- can also ask for CVS access to submit and maintain your port in the contrib CVS module.
-
\ No newline at end of file
diff --git a/src/VBox/Devices/Network/lwip/doc/rawapi.txt b/src/VBox/Devices/Network/lwip/doc/rawapi.txt
deleted file mode 100644
index 916a670..0000000
--- a/src/VBox/Devices/Network/lwip/doc/rawapi.txt
+++ /dev/null
@@ -1,419 +0,0 @@
-Raw TCP/IP interface for lwIP
-
-Authors: Adam Dunkels, Leon Woestenberg, Christiaan Simons
-
-lwIP provides two Application Program's Interfaces (APIs) for programs
-to use for communication with the TCP/IP code:
-* low-level "core" / "callback" or "raw" API.
-* higher-level "sequential" API.
-
-The sequential API provides a way for ordinary, sequential, programs
-to use the lwIP stack. It is quite similar to the BSD socket API. The
-model of execution is based on the blocking open-read-write-close
-paradigm. Since the TCP/IP stack is event based by nature, the TCP/IP
-code and the application program must reside in different execution
-contexts (threads).
-
-** The remainder of this document discusses the "raw" API. **
-
-The raw TCP/IP interface allows the application program to integrate
-better with the TCP/IP code. Program execution is event based by
-having callback functions being called from within the TCP/IP
-code. The TCP/IP code and the application program both run in the same
-thread. The sequential API has a much higher overhead and is not very
-well suited for small systems since it forces a multithreaded paradigm
-on the application.
-
-The raw TCP/IP interface is not only faster in terms of code execution
-time but is also less memory intensive. The drawback is that program
-development is somewhat harder and application programs written for
-the raw TCP/IP interface are more difficult to understand. Still, this
-is the preferred way of writing applications that should be small in
-code size and memory usage.
-
-Both APIs can be used simultaneously by different application
-programs. In fact, the sequential API is implemented as an application
-program using the raw TCP/IP interface.
-
---- Callbacks
-
-Program execution is driven by callbacks. Each callback is an ordinary
-C function that is called from within the TCP/IP code. Every callback
-function is passed the current TCP or UDP connection state as an
-argument. Also, in order to be able to keep program specific state,
-the callback functions are called with a program specified argument
-that is independent of the TCP/IP state.
-
-The function for setting the application connection state is:
-
-- void tcp_arg(struct tcp_pcb *pcb, void *arg)
-
- Specifies the program specific state that should be passed to all
- other callback functions. The "pcb" argument is the current TCP
- connection control block, and the "arg" argument is the argument
- that will be passed to the callbacks.
-
-
---- TCP connection setup
-
-The functions used for setting up connections is similar to that of
-the sequential API and of the BSD socket API. A new TCP connection
-identifier (i.e., a protocol control block - PCB) is created with the
-tcp_new() function. This PCB can then be either set to listen for new
-incoming connections or be explicitly connected to another host.
-
-- struct tcp_pcb *tcp_new(void)
-
- Creates a new connection identifier (PCB). If memory is not
- available for creating the new pcb, NULL is returned.
-
-- err_t tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr,
- u16_t port)
-
- Binds the pcb to a local IP address and port number. The IP address
- can be specified as IP_ADDR_ANY in order to bind the connection to
- all local IP addresses.
-
- If another connection is bound to the same port, the function will
- return ERR_USE, otherwise ERR_OK is returned.
-
-- struct tcp_pcb *tcp_listen(struct tcp_pcb *pcb)
-
- Commands a pcb to start listening for incoming connections. When an
- incoming connection is accepted, the function specified with the
- tcp_accept() function will be called. The pcb will have to be bound
- to a local port with the tcp_bind() function.
-
- The tcp_listen() function returns a new connection identifier, and
- the one passed as an argument to the function will be
- deallocated. The reason for this behavior is that less memory is
- needed for a connection that is listening, so tcp_listen() will
- reclaim the memory needed for the original connection and allocate a
- new smaller memory block for the listening connection.
-
- tcp_listen() may return NULL if no memory was available for the
- listening connection. If so, the memory associated with the pcb
- passed as an argument to tcp_listen() will not be deallocated.
-
-- void tcp_accept(struct tcp_pcb *pcb,
- err_t (* accept)(void *arg, struct tcp_pcb *newpcb,
- err_t err))
-
- Specified the callback function that should be called when a new
- connection arrives on a listening connection.
-
-- err_t tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr,
- u16_t port, err_t (* connected)(void *arg,
- struct tcp_pcb *tpcb,
- err_t err));
-
- Sets up the pcb to connect to the remote host and sends the
- initial SYN segment which opens the connection.
-
- The tcp_connect() function returns immediately; it does not wait for
- the connection to be properly setup. Instead, it will call the
- function specified as the fourth argument (the "connected" argument)
- when the connection is established. If the connection could not be
- properly established, either because the other host refused the
- connection or because the other host didn't answer, the "connected"
- function will be called with an the "err" argument set accordingly.
-
- The tcp_connect() function can return ERR_MEM if no memory is
- available for enqueueing the SYN segment. If the SYN indeed was
- enqueued successfully, the tcp_connect() function returns ERR_OK.
-
-
---- Sending TCP data
-
-TCP data is sent by enqueueing the data with a call to
-tcp_write(). When the data is successfully transmitted to the remote
-host, the application will be notified with a call to a specified
-callback function.
-
-- err_t tcp_write(struct tcp_pcb *pcb, void *dataptr, u16_t len,
- u8_t copy)
-
- Enqueues the data pointed to by the argument dataptr. The length of
- the data is passed as the len parameter. The copy argument is either
- 0 or 1 and indicates whether the new memory should be allocated for
- the data to be copied into. If the argument is 0, no new memory
- should be allocated and the data should only be referenced by
- pointer.
-
- The tcp_write() function will fail and return ERR_MEM if the length
- of the data exceeds the current send buffer size or if the length of
- the queue of outgoing segment is larger than the upper limit defined
- in lwipopts.h. The number of bytes available in the output queue can
- be retrieved with the tcp_sndbuf() function.
-
- The proper way to use this function is to call the function with at
- most tcp_sndbuf() bytes of data. If the function returns ERR_MEM,
- the application should wait until some of the currently enqueued
- data has been successfully received by the other host and try again.
-
-- void tcp_sent(struct tcp_pcb *pcb,
- err_t (* sent)(void *arg, struct tcp_pcb *tpcb,
- u16_t len))
-
- Specifies the callback function that should be called when data has
- successfully been received (i.e., acknowledged) by the remote
- host. The len argument passed to the callback function gives the
- amount bytes that was acknowledged by the last acknowledgment.
-
-
---- Receiving TCP data
-
-TCP data reception is callback based - an application specified
-callback function is called when new data arrives. When the
-application has taken the data, it has to call the tcp_recved()
-function to indicate that TCP can advertise increase the receive
-window.
-
-- void tcp_recv(struct tcp_pcb *pcb,
- err_t (* recv)(void *arg, struct tcp_pcb *tpcb,
- struct pbuf *p, err_t err))
-
- Sets the callback function that will be called when new data
- arrives. The callback function will be passed a NULL pbuf to
- indicate that the remote host has closed the connection.
-
-- void tcp_recved(struct tcp_pcb *pcb, u16_t len)
-
- Must be called when the application has received the data. The len
- argument indicates the length of the received data.
-
-
---- Application polling
-
-When a connection is idle (i.e., no data is either transmitted or
-received), lwIP will repeatedly poll the application by calling a
-specified callback function. This can be used either as a watchdog
-timer for killing connections that have stayed idle for too long, or
-as a method of waiting for memory to become available. For instance,
-if a call to tcp_write() has failed because memory wasn't available,
-the application may use the polling functionality to call tcp_write()
-again when the connection has been idle for a while.
-
-- void tcp_poll(struct tcp_pcb *pcb, u8_t interval,
- err_t (* poll)(void *arg, struct tcp_pcb *tpcb))
-
- Specifies the polling interval and the callback function that should
- be called to poll the application. The interval is specified in
- number of TCP coarse grained timer shots, which typically occurs
- twice a second. An interval of 10 means that the application would
- be polled every 5 seconds.
-
-
---- Closing and aborting connections
-
-- err_t tcp_close(struct tcp_pcb *pcb)
-
- Closes the connection. The function may return ERR_MEM if no memory
- was available for closing the connection. If so, the application
- should wait and try again either by using the acknowledgment
- callback or the polling functionality. If the close succeeds, the
- function returns ERR_OK.
-
- The pcb is deallocated by the TCP code after a call to tcp_close().
-
-- void tcp_abort(struct tcp_pcb *pcb)
-
- Aborts the connection by sending a RST (reset) segment to the remote
- host. The pcb is deallocated. This function never fails.
-
-If a connection is aborted because of an error, the application is
-alerted of this event by the err callback. Errors that might abort a
-connection are when there is a shortage of memory. The callback
-function to be called is set using the tcp_err() function.
-
-- void tcp_err(struct tcp_pcb *pcb, void (* err)(void *arg,
- err_t err))
-
- The error callback function does not get the pcb passed to it as a
- parameter since the pcb may already have been deallocated.
-
-
---- Lower layer TCP interface
-
-TCP provides a simple interface to the lower layers of the
-system. During system initialization, the function tcp_init() has
-to be called before any other TCP function is called. When the system
-is running, the two timer functions tcp_fasttmr() and tcp_slowtmr()
-must be called with regular intervals. The tcp_fasttmr() should be
-called every TCP_FAST_INTERVAL milliseconds (defined in tcp.h) and
-tcp_slowtmr() should be called every TCP_SLOW_INTERVAL milliseconds.
-
-
---- UDP interface
-
-The UDP interface is similar to that of TCP, but due to the lower
-level of complexity of UDP, the interface is significantly simpler.
-
-- struct udp_pcb *udp_new(void)
-
- Creates a new UDP pcb which can be used for UDP communication. The
- pcb is not active until it has either been bound to a local address
- or connected to a remote address.
-
-- void udp_remove(struct udp_pcb *pcb)
-
- Removes and deallocates the pcb.
-
-- err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr,
- u16_t port)
-
- Binds the pcb to a local address. The IP-address argument "ipaddr"
- can be IP_ADDR_ANY to indicate that it should listen to any local IP
- address. The function currently always return ERR_OK.
-
-- err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr,
- u16_t port)
-
- Sets the remote end of the pcb. This function does not generate any
- network traffic, but only set the remote address of the pcb.
-
-- err_t udp_disconnect(struct udp_pcb *pcb)
-
- Remove the remote end of the pcb. This function does not generate
- any network traffic, but only removes the remote address of the pcb.
-
-- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)
-
- Sends the pbuf p. The pbuf is not deallocated.
-
-- void udp_recv(struct udp_pcb *pcb,
- void (* recv)(void *arg, struct udp_pcb *upcb,
- struct pbuf *p,
- struct ip_addr *addr,
- u16_t port),
- void *recv_arg)
-
- Specifies a callback function that should be called when a UDP
- datagram is received.
-
-
---- System initalization
-
-A truly complete and generic sequence for initializing the lwip stack
-cannot be given because it depends on the build configuration (lwipopts.h)
-and additional initializations for your runtime environment (e.g. timers).
-
-We can give you some idea on how to proceed when using the raw API.
-We assume a configuration using a single Ethernet netif and the
-UDP and TCP transport layers, IPv4 and the DHCP client.
-
-Call these functions in the order of appearance:
-
-- stats_init()
-
- Clears the structure where runtime statistics are gathered.
-
-- sys_init()
-
- Not of much use since we set the NO_SYS 1 option in lwipopts.h,
- to be called for easy configuration changes.
-
-- mem_init()
-
- Initializes the dynamic memory heap defined by MEM_SIZE.
-
-- memp_init()
-
- Initializes the memory pools defined by MEMP_NUM_x.
-
-- pbuf_init()
-
- Initializes the pbuf memory pool defined by PBUF_POOL_SIZE.
-
-- etharp_init()
-
- Initializes the ARP table and queue.
- Note: you must call etharp_tmr at a 10 second regular interval
- after this initialization.
-
-- ip_init()
-
- Doesn't do much, it should be called to handle future changes.
-
-- udp_init()
-
- Clears the UDP PCB list.
-
-- tcp_init()
-
- Clears the TCP PCB list and clears some internal TCP timers.
- Note: you must call tcp_fasttmr() and tcp_slowtmr() at the
- predefined regular intervals after this initialization.
-
-- netif_add(struct netif *netif, struct ip_addr *ipaddr,
- struct ip_addr *netmask, struct ip_addr *gw,
- void *state, err_t (* init)(struct netif *netif),
- err_t (* input)(struct pbuf *p, struct netif *netif))
-
- Adds your network interface to the netif_list. Allocate a struct
- netif and pass a pointer to this structure as the first argument.
- Give pointers to cleared ip_addr structures when using DHCP,
- or fill them with sane numbers otherwise. The state pointer may be NULL.
-
- The init function pointer must point to a initialization function for
- your ethernet netif interface. The following code illustrates it's use.
-
- err_t netif_if_init(struct netif *netif)
- {
- u8_t i;
-
- for(i = 0; i < 6; i++) netif->hwaddr[i] = some_eth_addr[i];
- init_my_eth_device();
- return ERR_OK;
- }
-
- The input function pointer must point to the lwip ip_input().
-
-- netif_set_default(struct netif *netif)
-
- Registers the default network interface.
-
-- netif_set_up(struct netif *netif)
-
- When the netif is fully configured this function must be called.
-
-- dhcp_start(struct netif *netif)
-
- Creates a new DHCP client for this interface on the first call.
- Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at
- the predefined regular intervals after starting the client.
-
- You can peek in the netif->dhcp struct for the actual DHCP status.
-
-
---- Optimalization hints
-
-The first thing you want to optimize is the lwip_standard_checksum()
-routine from src/core/inet.c. You can override this standard
-function with the #define LWIP_CHKSUM <your_checksum_routine>.
-
-There are C examples given in inet.c or you might want to
-craft an assembly function for this. RFC1071 is a good
-introduction to this subject.
-
-Other significant improvements can be made by supplying
-assembly or inline replacements for htons() and htonl()
-if you're using a little-endian architecture.
-#define LWIP_PLATFORM_BYTESWAP 1
-#define LWIP_PLATFORM_HTONS(x) <your_htons>
-#define LWIP_PLATFORM_HTONL(x) <your_htonl>
-
-Check your network interface driver if it reads at
-a higher speed than the maximum wire-speed. If the
-hardware isn't serviced frequently and fast enough
-buffer overflows are likely to occur.
-
-E.g. when using the cs8900 driver, call cs8900if_service(ethif)
-as frequently as possible. When using an RTOS let the cs8900 interrupt
-wake a high priority task that services your driver using a binary
-semaphore or event flag. Some drivers might allow additional tuning
-to match your application and network.
-
-For a production release it is recommended to set LWIP_STATS to 0.
-Note that speed performance isn't influenced much by simply setting
-high values to the memory options.
\ No newline at end of file
diff --git a/src/VBox/Devices/Network/lwip/doc/savannah.txt b/src/VBox/Devices/Network/lwip/doc/savannah.txt
deleted file mode 100644
index 409905b..0000000
--- a/src/VBox/Devices/Network/lwip/doc/savannah.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-Daily Use Guide for using Savannah for lwIP
-
-Table of Contents:
-
-1 - Obtaining lwIP from the CVS repository
-2 - Committers/developers CVS access using SSH (to be written)
-3 - Merging from DEVEL branch to main trunk (stable branch)
-4 - How to release lwIP
-
-
-
-1 Obtaining lwIP from the CVS repository
-----------------------------------------
-
-To perform an anonymous CVS checkout of the main trunk (this is where
-bug fixes and incremental enhancements occur), do this:
-
-cvs -z3 -d:pserver:anonymous at cvs.sv.gnu.org:/sources/lwip checkout lwip
-
-Or, obtain a stable branch (updated with bug fixes only) as follows:
-cvs -z3 -d:pserver:anonymous at cvs.sv.gnu.org:/sources/lwip checkout \
- -r STABLE-0_7 -d lwip-0.7 lwip
-
-Or, obtain a specific (fixed) release as follows:
-cvs -z3 -d:pserver:anonymous at cvs.sv.gnu.org:/sources/lwip checkout \
- -r STABLE-0_7_0 -d lwip-0.7.0 lwip
-
-3 Committers/developers CVS access using SSH
---------------------------------------------
-
-The Savannah server uses SSH (Secure Shell) protocol 2 authentication and encryption.
-As such, CVS commits to the server occur through a SSH tunnel for project members.
-To create a SSH2 key pair in UNIX-like environments, do this:
-
-ssh-keygen -t dsa
-
-Under Windows, a recommended SSH client is "PuTTY", freely available with good
-documentation and a graphic user interface. Use its key generator.
-
-Now paste the id_dsa.pub contents into your Savannah account public key list. Wait
-a while so that Savannah can update its configuration (This can take minutes).
-
-Try to login using SSH:
-
-ssh -v your_login at cvs.sv.gnu.org
-
-If it tells you:
-
-Authenticating with public key "your_key_name"...
-Server refused to allocate pty
-
-then you could login; Savannah refuses to give you a shell - which is OK, as we
-are allowed to use SSH for CVS only. Now, you should be able to do this:
-
-export CVS_RSH=ssh
-cvs -z3 -d:ext:your_login at cvs.sv.gnu.org:/sources/lwip co lwip
-
-after which you can edit your local files with bug fixes or new features and
-commit them. Make sure you know what you are doing when using CVS to make
-changes on the repository. If in doubt, ask on the lwip-members mailing list.
-
-(If SSH asks about authenticity of the host, you can check the key
- fingerprint against http://savannah.nongnu.org/cvs/?group=lwip)
-
-
-3 Merging from DEVEL branch to main trunk (stable)
---------------------------------------------------
-
-Merging is a delicate process in CVS and requires the
-following disciplined steps in order to prevent conflicts
-in the future. Conflicts can be hard to solve!
-
-Merging from branch A to branch B requires that the A branch
-has a tag indicating the previous merger. This tag is called
-'merged_from_A_to_B'. After merging, the tag is moved in the
-A branch to remember this merger for future merge actions.
-
-IMPORTANT: AFTER COMMITTING A SUCCESFUL MERGE IN THE
-REPOSITORY, THE TAG MUST BE SET ON THE SOURCE BRANCH OF THE
-MERGE ACTION (REPLACING EXISTING TAGS WITH THE SAME NAME).
-
-Merge all changes in DEVEL since our last merge to main:
-
-In the working copy of the main trunk:
-cvs update -P -jmerged_from_DEVEL_to_main -jDEVEL
-
-(This will apply the changes between 'merged_from_DEVEL_to_main'
-and 'DEVEL' to your work set of files)
-
-We can now commit the merge result.
-cvs commit -R -m "Merged from DEVEL to main."
-
-If this worked out OK, we now move the tag in the DEVEL branch
-to this merge point, so we can use this point for future merges:
-
-cvs rtag -F -r DEVEL merged_from_DEVEL_to_main lwip
-
-4 How to release lwIP
----------------------
-
-First, checkout a clean copy of the branch to be released. Tag this set with
-tag name "STABLE-0_6_3". (I use release number 0.6.3 throughout this example).
-
-Login CVS using pserver authentication, then export a clean copy of the
-tagged tree. Export is similar to a checkout, except that the CVS metadata
-is not created locally.
-
-export CVS_RSH=ssh
-cvs -z3 -d:pserver:anonymous at cvs.sv.gnu.org:/sources/lwip checkout \
- -r STABLE-0_6_3 -d lwip-0.6.3 lwip
-
-Archive this directory using tar, gzip'd, bzip2'd and zip'd.
-
-tar czvf lwip-0.6.3.tar.gz lwip-0.6.3
-tar cjvf lwip-0.6.3.tar.bz2 lwip-0.6.3
-zip -r lwip-0.6.3.zip lwip-0.6.3
-
-Now, sign the archives with a detached GPG binary signature as follows:
-
-gpg -b lwip-0.6.3.tar.gz
-gpg -b lwip-0.6.3.tar.bz2
-gpg -b lwip-0.6.3.zip
-
-Upload these files using anonymous FTP:
-ncftp ftp://savannah.gnu.org/incoming/savannah/lwip
-
-ncftp>mput *0.6.3.*
-
-Additionally, you may post a news item on Savannah, like this:
-
-A new 0.6.3 release is now available here:
-http://savannah.nongnu.org/files/?group=lwip&highlight=0.6.3
-
-You will have to submit this via the user News interface, then approve
-this via the Administrator News interface.
\ No newline at end of file
diff --git a/src/VBox/Devices/Network/lwip/doc/snmp_agent.txt b/src/VBox/Devices/Network/lwip/doc/snmp_agent.txt
deleted file mode 100644
index 8b08f11..0000000
--- a/src/VBox/Devices/Network/lwip/doc/snmp_agent.txt
+++ /dev/null
@@ -1,172 +0,0 @@
-SNMPv1 agent for lwIP
-
-Author: Christiaan Simons
-
-This is a brief introduction how to use and configure the SNMP agent.
-Note the agent uses the raw-API UDP interface so you may also want to
-read rawapi.txt to gain a better understanding of the SNMP message handling.
-
-0 Agent Capabilities
-====================
-
-SNMPv1 per RFC1157
- This is an old(er) standard but is still widely supported.
- For SNMPv2c and v3 have a greater complexity and need many
- more lines of code. IMHO this breaks the idea of "lightweight IP".
-
- Note the S in SNMP stands for "Simple". Note that "Simple" is
- relative. SNMP is simple compared to the complex ISO network
- management protocols CMIP (Common Management Information Protocol)
- and CMOT (CMip Over Tcp).
-
-MIB II per RFC1213
- The standard lwIP stack management information base.
- This is a required MIB, so this is always enabled.
- When builing lwIP without TCP, the mib-2.tcp group is omitted.
- The groups EGP, CMOT and transmission are disabled by default.
-
- Most mib-2 objects are not writable except:
- sysName, sysLocation, sysContact, snmpEnableAuthenTraps.
- Writing to or changing the ARP and IP address and route
- tables is not possible.
-
- Note lwIP has a very limited notion of IP routing. It currently
- doen't have a route table and doesn't have a notion of the U,G,H flags.
- Instead lwIP uses the interface list with only one default interface
- acting as a single gateway interface (G) for the default route.
-
- The agent returns a "virtual table" with the default route 0.0.0.0
- for the default interface and network routes (no H) for each
- network interface in the netif_list.
- All routes are considered to be up (U).
-
-Loading additional MIBs
- MIBs can only be added in compile-time, not in run-time.
- There is no MIB compiler thus additional MIBs must be hand coded.
-
-Large SNMP message support
- The packet decoding and encoding routines are designed
- to use pbuf-chains. Larger payloads then the minimum
- SNMP requirement of 484 octets are supported if the
- PBUF_POOL_SIZE and IP_REASS_BUFSIZE are set to match your
- local requirement.
-
-1 Building the Agent
-====================
-
-First of all you'll need to add the following define
-to your local lwipopts.h:
-
-#define LWIP_SNMP 1
-
-and add the source files in lwip/src/core/snmp
-and some snmp headers in lwip/src/include/lwip to your makefile.
-
-Note you'll might need to adapt you network driver to update
-the mib2 variables for your interface.
-
-2 Running the Agent
-===================
-
-The following function calls must be made in your program to
-actually get the SNMP agent running.
-
-Before starting the agent you should supply pointers
-to non-volatile memory for sysContact, sysLocation,
-and snmpEnableAuthenTraps. You can do this by calling
-
-snmp_set_syscontact()
-snmp_set_syslocation()
-snmp_set_snmpenableauthentraps()
-
-Additionally you may want to set
-
-snmp_set_sysdescr()
-snmp_set_sysobjid() (if you have a private MIB)
-snmp_set_sysname()
-
-Also before starting the agent you need to setup
-one or more trap destinations using these calls:
-
-snmp_trap_dst_enable();
-snmp_trap_dst_ip_set();
-
-In the lwIP initialisation sequence call snmp_init() just after
-the call to udp_init().
-
-Exactly every 10 msec the SNMP uptime timestamp must be updated with
-snmp_inc_sysuptime(). You should call this from a timer interrupt
-or a timer signal handler depending on your runtime environment.
-
-
-3 Private MIBs
-==============
-
-If want to extend the agent with your own private MIB you'll need to
-add the following define to your local lwipopts.h:
-
-#define SNMP_PRIVATE_MIB 1
-
-You must provide the private_mib.h and associated files yourself.
-Note we don't have a "MIB compiler" that generates C source from a MIB,
-so you're required to do some serious coding if you enable this!
-
-Note the lwIP enterprise ID (26381) is assigned to the lwIP project,
-ALL OBJECT IDENTIFIERS LIVING UNDER THIS ID ARE ASSIGNED BY THE lwIP
-MAINTAINERS!
-
-If you need to create your own private MIB you'll need
-to apply for your own enterprise ID with IANA: http://www.iana.org/numbers.html
-
-You can set it by passing a struct snmp_obj_id to the agent
-using snmp_set_sysobjid(&my_object_id), just before snmp_init().
-
-Note the object identifiers for thes MIB-2 and your private MIB
-tree must be kept in sorted ascending (lexicographical) order.
-This to ensure correct getnext operation.
-
-An example for a private MIB is part of the "minimal Unix" project:
-contrib/ports/unix/proj/minimal/lwip_prvmib.c
-
-The next chapter gives a more detailed description of the
-MIB-2 tree and the optional private MIB.
-
-4 The Gory Details
-==================
-
-4.0 Object identifiers and the MIB tree.
-
-We have three distinct parts for all object identifiers:
-
-The prefix
- .iso.org.dod.internet
-
-the middle part
- .mgmt.mib-2.ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaPhysAddress
-
-and the index part
- .1.192.168.0.1
-
-Objects located above the .internet hierarchy aren't supported.
-Currently only the .mgmt sub-tree is available and
-when the SNMP_PRIVATE_MIB is enabled the .private tree
-becomes available too.
-
-Object identifiers from incoming requests are checked
-for a matching prefix, middle part and index part
-or are expanded(*) for GetNext requests with short
-or inexisting names in the request.
-(* we call this "expansion" but this also
-resembles the "auto-completion" operation)
-
-The middle part is usually located in ROM (const)
-to preserve precious RAM on small microcontrollers.
-However RAM location is possible for an dynamically
-changing private tree.
-
-The index part is handled by functions which in
-turn use dynamically allocated index trees from RAM.
-These trees are updated by e.g. the etharp code
-when new entries are made or removed form the ARP cache.
-
-/** @todo more gory details */
diff --git a/src/VBox/Devices/Network/lwip/doc/sys_arch.txt b/src/VBox/Devices/Network/lwip/doc/sys_arch.txt
deleted file mode 100644
index b2c45e0..0000000
--- a/src/VBox/Devices/Network/lwip/doc/sys_arch.txt
+++ /dev/null
@@ -1,201 +0,0 @@
-sys_arch interface for lwIP 0.6++
-
-Author: Adam Dunkels
-
-The operating system emulation layer provides a common interface
-between the lwIP code and the underlying operating system kernel. The
-general idea is that porting lwIP to new architectures requires only
-small changes to a few header files and a new sys_arch
-implementation. It is also possible to do a sys_arch implementation
-that does not rely on any underlying operating system.
-
-The sys_arch provides semaphores and mailboxes to lwIP. For the full
-lwIP functionality, multiple threads support can be implemented in the
-sys_arch, but this is not required for the basic lwIP
-functionality. Previous versions of lwIP required the sys_arch to
-implement timer scheduling as well but as of lwIP 0.5 this is
-implemented in a higher layer.
-
-In addition to the source file providing the functionality of sys_arch,
-the OS emulation layer must provide several header files defining
-macros used throughout lwip. The files required and the macros they
-must define are listed below the sys_arch description.
-
-Semaphores can be either counting or binary - lwIP works with both
-kinds. Mailboxes are used for message passing and can be implemented
-either as a queue which allows multiple messages to be posted to a
-mailbox, or as a rendez-vous point where only one message can be
-posted at a time. lwIP works with both kinds, but the former type will
-be more efficient. A message in a mailbox is just a pointer, nothing
-more.
-
-Semaphores are represented by the type "sys_sem_t" which is typedef'd
-in the sys_arch.h file. Mailboxes are equivalently represented by the
-type "sys_mbox_t". lwIP does not place any restrictions on how
-sys_sem_t or sys_mbox_t are represented internally.
-
-The following functions must be implemented by the sys_arch:
-
-- void sys_init(void)
-
- Is called to initialize the sys_arch layer.
-
-- sys_sem_t sys_sem_new(u8_t count)
-
- Creates and returns a new semaphore. The "count" argument specifies
- the initial state of the semaphore.
-
-- void sys_sem_free(sys_sem_t sem)
-
- Deallocates a semaphore.
-
-- void sys_sem_signal(sys_sem_t sem)
-
- Signals a semaphore.
-
-- u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
-
- Blocks the thread while waiting for the semaphore to be
- signaled. If the "timeout" argument is non-zero, the thread should
- only be blocked for the specified time (measured in
- milliseconds).
-
- If the timeout argument is non-zero, the return value is the number of
- milliseconds spent waiting for the semaphore to be signaled. If the
- semaphore wasn't signaled within the specified time, the return value is
- SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore
- (i.e., it was already signaled), the function may return zero.
-
- Notice that lwIP implements a function with a similar name,
- sys_sem_wait(), that uses the sys_arch_sem_wait() function.
-
-- sys_mbox_t sys_mbox_new(void)
-
- Creates an empty mailbox.
-
-- void sys_mbox_free(sys_mbox_t mbox)
-
- Deallocates a mailbox. If there are messages still present in the
- mailbox when the mailbox is deallocated, it is an indication of a
- programming error in lwIP and the developer should be notified.
-
-- void sys_mbox_post(sys_mbox_t mbox, void *msg)
-
- Posts the "msg" to the mailbox.
-
-- u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
-
- Blocks the thread until a message arrives in the mailbox, but does
- not block the thread longer than "timeout" milliseconds (similar to
- the sys_arch_sem_wait() function). The "msg" argument is a result
- parameter that is set by the function (i.e., by doing "*msg =
- ptr"). The "msg" parameter maybe NULL to indicate that the message
- should be dropped.
-
- The return values are the same as for the sys_arch_sem_wait() function:
- Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a
- timeout.
-
- Note that a function with a similar name, sys_mbox_fetch(), is
- implemented by lwIP.
-
-- struct sys_timeouts *sys_arch_timeouts(void)
-
- Returns a pointer to the per-thread sys_timeouts structure. In lwIP,
- each thread has a list of timeouts which is repressented as a linked
- list of sys_timeout structures. The sys_timeouts structure holds a
- pointer to a linked list of timeouts. This function is called by
- the lwIP timeout scheduler and must not return a NULL value.
-
- In a single threadd sys_arch implementation, this function will
- simply return a pointer to a global sys_timeouts variable stored in
- the sys_arch module.
-
-If threads are supported by the underlying operating system and if
-such functionality is needed in lwIP, the following function will have
-to be implemented as well:
-
-- sys_thread_t sys_thread_new(void (* thread)(void *arg), void *arg, int prio)
-
- Starts a new thread with priority "prio" that will begin its execution in the
- function "thread()". The "arg" argument will be passed as an argument to the
- thread() function. The id of the new thread is returned. Both the id and
- the priority are system dependent.
-
-- sys_prot_t sys_arch_protect(void)
-
- This optional function does a "fast" critical region protection and returns
- the previous protection level. This function is only called during very short
- critical regions. An embedded system which supports ISR-based drivers might
- want to implement this function by disabling interrupts. Task-based systems
- might want to implement this by using a mutex or disabling tasking. This
- function should support recursive calls from the same task or interrupt. In
- other words, sys_arch_protect() could be called while already protected. In
- that case the return value indicates that it is already protected.
-
- sys_arch_protect() is only required if your port is supporting an operating
- system.
-
-- void sys_arch_unprotect(sys_prot_t pval)
-
- This optional function does a "fast" set of critical region protection to the
- value specified by pval. See the documentation for sys_arch_protect() for
- more information. This function is only required if your port is supporting
- an operating system.
-
-Note:
-
-Be carefull with using mem_malloc() in sys_arch. When malloc() refers to
-mem_malloc() you can run into a circular function call problem. In mem.c
-mem_init() tries to allcate a semaphore using mem_malloc, which of course
-can't be performed when sys_arch uses mem_malloc.
-
--------------------------------------------------------------------------------
-Additional files required for the "OS support" emulation layer:
--------------------------------------------------------------------------------
-
-cc.h - Architecture environment, some compiler specific, some
- environment specific (probably should move env stuff
- to sys_arch.h.)
-
- Typedefs for the types used by lwip -
- u8_t, s8_t, u16_t, s16_t, u32_t, s32_t, mem_ptr_t
-
- Compiler hints for packing lwip's structures -
- PACK_STRUCT_FIELD(x)
- PACK_STRUCT_STRUCT
- PACK_STRUCT_BEGIN
- PACK_STRUCT_END
-
- Platform specific diagnostic output -
- LWIP_PLATFORM_DIAG(x) - non-fatal, print a message.
- LWIP_PLATFORM_ASSERT(x) - fatal, print message and abandon execution.
-
- "lightweight" synchronization mechanisms -
- SYS_ARCH_DECL_PROTECT(x) - declare a protection state variable.
- SYS_ARCH_PROTECT(x) - enter protection mode.
- SYS_ARCH_UNPROTECT(x) - leave protection mode.
-
- If the compiler does not provide memset() this file must include a
- definition of it, or include a file which defines it.
-
- This file must either include a system-local <errno.h> which defines
- the standard *nix error codes, or it should #define LWIP_PROVIDE_ERRNO
- to make lwip/arch.h define the codes which are used throughout.
-
-
-perf.h - Architecture specific performance measurement.
- Measurement calls made throughout lwip, these can be defined to nothing.
- PERF_START - start measuring something.
- PERF_STOP(x) - stop measuring something, and record the result.
-
-sys_arch.h - Tied to sys_arch.c
-
- Arch dependent types for the following objects:
- sys_sem_t, sys_mbox_t, sys_thread_t,
- And, optionally:
- sys_prot_t
-
- Defines to set vars of sys_mbox_t and sys_sem_t to NULL.
- SYS_MBOX_NULL NULL
- SYS_SEM_NULL NULL
diff --git a/src/VBox/Devices/Network/lwip/src/FILES b/src/VBox/Devices/Network/lwip/src/FILES
deleted file mode 100644
index 2b65731..0000000
--- a/src/VBox/Devices/Network/lwip/src/FILES
+++ /dev/null
@@ -1,13 +0,0 @@
-api/ - The code for the high-level wrapper API. Not needed if
- you use the lowel-level call-back/raw API.
-
-core/ - The core of the TPC/IP stack; protocol implementations,
- memory and buffer management, and the low-level raw API.
-
-include/ - lwIP include files.
-
-netif/ - Generic network interface device drivers are kept here,
- as well as the ARP module.
-
-For more information on the various subdirectories, check the FILES
-file in each directory.
diff --git a/src/VBox/Devices/Network/lwip/src/api/api_lib.c b/src/VBox/Devices/Network/lwip/src/api/api_lib.c
deleted file mode 100644
index 01683b0..0000000
--- a/src/VBox/Devices/Network/lwip/src/api/api_lib.c
+++ /dev/null
@@ -1,722 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-/* This is the part of the API that is linked with
- the application */
-
-#include "lwip/opt.h"
-#include "lwip/api.h"
-#include "lwip/api_msg.h"
-#include "lwip/memp.h"
-
-
-struct
-netbuf *netbuf_new(void)
-{
- struct netbuf *buf;
-
- buf = memp_malloc(MEMP_NETBUF);
- if (buf != NULL) {
- buf->p = NULL;
- buf->ptr = NULL;
- return buf;
- } else {
- return NULL;
- }
-}
-
-void
-netbuf_delete(struct netbuf *buf)
-{
- if (buf != NULL) {
- if (buf->p != NULL) {
- pbuf_free(buf->p);
- buf->p = buf->ptr = NULL;
- }
- memp_free(MEMP_NETBUF, buf);
- }
-}
-
-void *
-netbuf_alloc(struct netbuf *buf, u16_t size)
-{
- /* Deallocate any previously allocated memory. */
- if (buf->p != NULL) {
- pbuf_free(buf->p);
- }
- buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);
- if (buf->p == NULL) {
- return NULL;
- }
- buf->ptr = buf->p;
- return buf->p->payload;
-}
-
-void
-netbuf_free(struct netbuf *buf)
-{
- if (buf->p != NULL) {
- pbuf_free(buf->p);
- }
- buf->p = buf->ptr = NULL;
-}
-
-void
-netbuf_ref(struct netbuf *buf, void *dataptr, u16_t size)
-{
- if (buf->p != NULL) {
- pbuf_free(buf->p);
- }
- buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);
- buf->p->payload = dataptr;
- buf->p->len = buf->p->tot_len = size;
- buf->ptr = buf->p;
-}
-
-void
-netbuf_chain(struct netbuf *head, struct netbuf *tail)
-{
- pbuf_chain(head->p, tail->p);
- head->ptr = head->p;
- memp_free(MEMP_NETBUF, tail);
-}
-
-u16_t
-netbuf_len(struct netbuf *buf)
-{
- return buf->p->tot_len;
-}
-
-err_t
-netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len)
-{
- if (buf->ptr == NULL) {
- return ERR_BUF;
- }
- *dataptr = buf->ptr->payload;
- *len = buf->ptr->len;
- return ERR_OK;
-}
-
-s8_t
-netbuf_next(struct netbuf *buf)
-{
- if (buf->ptr->next == NULL) {
- return -1;
- }
- buf->ptr = buf->ptr->next;
- if (buf->ptr->next == NULL) {
- return 1;
- }
- return 0;
-}
-
-void
-netbuf_first(struct netbuf *buf)
-{
- buf->ptr = buf->p;
-}
-
-void
-netbuf_copy_partial(struct netbuf *buf, void *dataptr, u16_t len, u16_t offset)
-{
- struct pbuf *p;
- u16_t i, left;
-
- left = 0;
-
- if(buf == NULL || dataptr == NULL) {
- return;
- }
-
- /* This implementation is bad. It should use bcopy
- instead. */
- for(p = buf->p; left < len && p != NULL; p = p->next) {
- if (offset != 0 && offset >= p->len) {
- offset -= p->len;
- } else {
- for(i = offset; i < p->len; ++i) {
- ((u8_t *)dataptr)[left] = ((u8_t *)p->payload)[i];
- if (++left >= len) {
- return;
- }
- }
- offset = 0;
- }
- }
-}
-
-void
-netbuf_copy(struct netbuf *buf, void *dataptr, u16_t len)
-{
- netbuf_copy_partial(buf, dataptr, len, 0);
-}
-
-struct ip_addr *
-netbuf_fromaddr(struct netbuf *buf)
-{
- return buf->fromaddr;
-}
-
-u16_t
-netbuf_fromport(struct netbuf *buf)
-{
- return buf->fromport;
-}
-
-struct
-netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u16_t proto,
- void (*callback)(struct netconn *, enum netconn_evt, u16_t len))
-{
- struct netconn *conn;
- struct api_msg *msg;
-
- conn = memp_malloc(MEMP_NETCONN);
- if (conn == NULL) {
- return NULL;
- }
-
- conn->err = ERR_OK;
- conn->type = t;
- conn->pcb.tcp = NULL;
-
- if ((conn->mbox = sys_mbox_new()) == SYS_MBOX_NULL) {
- memp_free(MEMP_NETCONN, conn);
- return NULL;
- }
- conn->recvmbox = SYS_MBOX_NULL;
- conn->acceptmbox = SYS_MBOX_NULL;
- conn->sem = sys_sem_new(0);
- if (conn->sem == SYS_SEM_NULL) {
- memp_free(MEMP_NETCONN, conn);
- return NULL;
- }
- conn->state = NETCONN_NONE;
- conn->socket = 0;
- conn->callback = callback;
- conn->recv_avail = 0;
-
- if((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- memp_free(MEMP_NETCONN, conn);
- return NULL;
- }
-
- msg->type = API_MSG_NEWCONN;
- msg->msg.msg.bc.port = proto; /* misusing the port field */
- msg->msg.conn = conn;
- api_msg_post(msg);
- sys_mbox_fetch(conn->mbox, NULL);
- memp_free(MEMP_API_MSG, msg);
-
- if ( conn->err != ERR_OK ) {
- memp_free(MEMP_NETCONN, conn);
- return NULL;
- }
-
- return conn;
-}
-
-
-struct
-netconn *netconn_new(enum netconn_type t)
-{
- return netconn_new_with_proto_and_callback(t,0,NULL);
-}
-
-struct
-netconn *netconn_new_with_callback(enum netconn_type t,
- void (*callback)(struct netconn *, enum netconn_evt, u16_t len))
-{
- return netconn_new_with_proto_and_callback(t,0,callback);
-}
-
-
-err_t
-netconn_delete(struct netconn *conn)
-{
- struct api_msg *msg;
- void *mem;
-
- if (conn == NULL) {
- return ERR_OK;
- }
-
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- return ERR_MEM;
- }
-
- msg->type = API_MSG_DELCONN;
- msg->msg.conn = conn;
- api_msg_post(msg);
- sys_mbox_fetch(conn->mbox, NULL);
- memp_free(MEMP_API_MSG, msg);
-
- /* Drain the recvmbox. */
- if (conn->recvmbox != SYS_MBOX_NULL) {
- while (sys_arch_mbox_fetch(conn->recvmbox, &mem, 1) != SYS_ARCH_TIMEOUT) {
- if (conn->type == NETCONN_TCP) {
- if(mem != NULL)
- pbuf_free((struct pbuf *)mem);
- } else {
- netbuf_delete((struct netbuf *)mem);
- }
- }
- sys_mbox_free(conn->recvmbox);
- conn->recvmbox = SYS_MBOX_NULL;
- }
-
-
- /* Drain the acceptmbox. */
- if (conn->acceptmbox != SYS_MBOX_NULL) {
- while (sys_arch_mbox_fetch(conn->acceptmbox, &mem, 1) != SYS_ARCH_TIMEOUT) {
- netconn_delete((struct netconn *)mem);
- }
-
- sys_mbox_free(conn->acceptmbox);
- conn->acceptmbox = SYS_MBOX_NULL;
- }
-
- sys_mbox_free(conn->mbox);
- conn->mbox = SYS_MBOX_NULL;
- if (conn->sem != SYS_SEM_NULL) {
- sys_sem_free(conn->sem);
- }
- /* conn->sem = SYS_SEM_NULL;*/
- memp_free(MEMP_NETCONN, conn);
- return ERR_OK;
-}
-
-enum netconn_type
-netconn_type(struct netconn *conn)
-{
- return conn->type;
-}
-
-err_t
-netconn_peer(struct netconn *conn, struct ip_addr *addr,
- u16_t *port)
-{
- switch (conn->type) {
- case NETCONN_RAW:
- /* return an error as connecting is only a helper for upper layers */
- return ERR_CONN;
- case NETCONN_UDPLITE:
- case NETCONN_UDPNOCHKSUM:
- case NETCONN_UDP:
- if (conn->pcb.udp == NULL ||
- ((conn->pcb.udp->flags & UDP_FLAGS_CONNECTED) == 0))
- return ERR_CONN;
- *addr = (conn->pcb.udp->remote_ip);
- *port = conn->pcb.udp->remote_port;
- break;
- case NETCONN_TCP:
- if (conn->pcb.tcp == NULL)
- return ERR_CONN;
- *addr = (conn->pcb.tcp->remote_ip);
- *port = conn->pcb.tcp->remote_port;
- break;
- }
- return (conn->err = ERR_OK);
-}
-
-err_t
-netconn_addr(struct netconn *conn, struct ip_addr **addr,
- u16_t *port)
-{
- switch (conn->type) {
- case NETCONN_RAW:
- *addr = &(conn->pcb.raw->local_ip);
- *port = conn->pcb.raw->protocol;
- break;
- case NETCONN_UDPLITE:
- case NETCONN_UDPNOCHKSUM:
- case NETCONN_UDP:
- *addr = &(conn->pcb.udp->local_ip);
- *port = conn->pcb.udp->local_port;
- break;
- case NETCONN_TCP:
- *addr = &(conn->pcb.tcp->local_ip);
- *port = conn->pcb.tcp->local_port;
- break;
- }
- return (conn->err = ERR_OK);
-}
-
-err_t
-netconn_bind(struct netconn *conn, struct ip_addr *addr,
- u16_t port)
-{
- struct api_msg *msg;
-
- if (conn == NULL) {
- return ERR_VAL;
- }
-
- if (conn->type != NETCONN_TCP &&
- conn->recvmbox == SYS_MBOX_NULL) {
- if ((conn->recvmbox = sys_mbox_new()) == SYS_MBOX_NULL) {
- return ERR_MEM;
- }
- }
-
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- return (conn->err = ERR_MEM);
- }
- msg->type = API_MSG_BIND;
- msg->msg.conn = conn;
- msg->msg.msg.bc.ipaddr = addr;
- msg->msg.msg.bc.port = port;
- api_msg_post(msg);
- sys_mbox_fetch(conn->mbox, NULL);
- memp_free(MEMP_API_MSG, msg);
- return conn->err;
-}
-
-
-err_t
-netconn_connect(struct netconn *conn, struct ip_addr *addr,
- u16_t port)
-{
- struct api_msg *msg;
-
- if (conn == NULL) {
- return ERR_VAL;
- }
-
-
- if (conn->recvmbox == SYS_MBOX_NULL) {
- if ((conn->recvmbox = sys_mbox_new()) == SYS_MBOX_NULL) {
- return ERR_MEM;
- }
- }
-
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- return ERR_MEM;
- }
- msg->type = API_MSG_CONNECT;
- msg->msg.conn = conn;
- msg->msg.msg.bc.ipaddr = addr;
- msg->msg.msg.bc.port = port;
- api_msg_post(msg);
- sys_mbox_fetch(conn->mbox, NULL);
- memp_free(MEMP_API_MSG, msg);
- return conn->err;
-}
-
-err_t
-netconn_disconnect(struct netconn *conn)
-{
- struct api_msg *msg;
-
- if (conn == NULL) {
- return ERR_VAL;
- }
-
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- return ERR_MEM;
- }
- msg->type = API_MSG_DISCONNECT;
- msg->msg.conn = conn;
- api_msg_post(msg);
- sys_mbox_fetch(conn->mbox, NULL);
- memp_free(MEMP_API_MSG, msg);
- return conn->err;
-
-}
-
-err_t
-netconn_listen(struct netconn *conn)
-{
- struct api_msg *msg;
-
- if (conn == NULL) {
- return ERR_VAL;
- }
-
- if (conn->acceptmbox == SYS_MBOX_NULL) {
- conn->acceptmbox = sys_mbox_new();
- if (conn->acceptmbox == SYS_MBOX_NULL) {
- return ERR_MEM;
- }
- }
-
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- return (conn->err = ERR_MEM);
- }
- msg->type = API_MSG_LISTEN;
- msg->msg.conn = conn;
- api_msg_post(msg);
- sys_mbox_fetch(conn->mbox, NULL);
- memp_free(MEMP_API_MSG, msg);
- return conn->err;
-}
-
-struct netconn *
-netconn_accept(struct netconn *conn)
-{
- struct netconn *newconn;
-
- if (conn == NULL) {
- return NULL;
- }
-
- sys_mbox_fetch(conn->acceptmbox, (void *)&newconn);
- /* Register event with callback */
- if (conn->callback)
- (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, 0);
-
- return newconn;
-}
-
-struct netbuf *
-netconn_recv(struct netconn *conn)
-{
- struct api_msg *msg;
- struct netbuf *buf;
- struct pbuf *p;
- u16_t len;
-
- if (conn == NULL) {
- return NULL;
- }
-
- if (conn->recvmbox == SYS_MBOX_NULL) {
- conn->err = ERR_CONN;
- return NULL;
- }
-
- if (conn->err != ERR_OK) {
- return NULL;
- }
-
- if (conn->type == NETCONN_TCP) {
- if (conn->pcb.tcp->state == LISTEN) {
- conn->err = ERR_CONN;
- return NULL;
- }
-
-
- buf = memp_malloc(MEMP_NETBUF);
-
- if (buf == NULL) {
- conn->err = ERR_MEM;
- return NULL;
- }
-
- sys_mbox_fetch(conn->recvmbox, (void *)&p);
-
- if (p != NULL)
- {
- len = p->tot_len;
- conn->recv_avail -= len;
- }
- else
- len = 0;
-
- /* Register event with callback */
- if (conn->callback)
- (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, len);
-
- /* If we are closed, we indicate that we no longer wish to receive
- data by setting conn->recvmbox to SYS_MBOX_NULL. */
- if (p == NULL) {
- memp_free(MEMP_NETBUF, buf);
- sys_mbox_free(conn->recvmbox);
- conn->recvmbox = SYS_MBOX_NULL;
- return NULL;
- }
-
- buf->p = p;
- buf->ptr = p;
- buf->fromport = 0;
- buf->fromaddr = NULL;
-
- /* Let the stack know that we have taken the data. */
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- conn->err = ERR_MEM;
- return buf;
- }
- msg->type = API_MSG_RECV;
- msg->msg.conn = conn;
- if (buf != NULL) {
- msg->msg.msg.len = buf->p->tot_len;
- } else {
- msg->msg.msg.len = 1;
- }
- api_msg_post(msg);
-
- sys_mbox_fetch(conn->mbox, NULL);
- memp_free(MEMP_API_MSG, msg);
- } else {
- sys_mbox_fetch(conn->recvmbox, (void *)&buf);
- conn->recv_avail -= buf->p->tot_len;
- /* Register event with callback */
- if (conn->callback)
- (*conn->callback)(conn, NETCONN_EVT_RCVMINUS, buf->p->tot_len);
- }
-
-
-
-
- LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_recv: received %p (err %d)\n", (void *)buf, conn->err));
-
-
- return buf;
-}
-
-err_t
-netconn_send(struct netconn *conn, struct netbuf *buf)
-{
- struct api_msg *msg;
-
- if (conn == NULL) {
- return ERR_VAL;
- }
-
- if (conn->err != ERR_OK) {
- return conn->err;
- }
-
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- return (conn->err = ERR_MEM);
- }
-
- LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_send: sending %d bytes\n", buf->p->tot_len));
- msg->type = API_MSG_SEND;
- msg->msg.conn = conn;
- msg->msg.msg.p = buf->p;
- api_msg_post(msg);
-
- sys_mbox_fetch(conn->mbox, NULL);
- memp_free(MEMP_API_MSG, msg);
- return conn->err;
-}
-
-err_t
-netconn_write(struct netconn *conn, void *dataptr, u16_t size, u8_t copy)
-{
- struct api_msg *msg;
- u16_t len;
-
- if (conn == NULL) {
- return ERR_VAL;
- }
-
- if (conn->err != ERR_OK) {
- return conn->err;
- }
-
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- return (conn->err = ERR_MEM);
- }
- msg->type = API_MSG_WRITE;
- msg->msg.conn = conn;
-
-
- conn->state = NETCONN_WRITE;
- while (conn->err == ERR_OK && size > 0) {
- msg->msg.msg.w.dataptr = dataptr;
- msg->msg.msg.w.copy = copy;
-
- if (conn->type == NETCONN_TCP) {
- if (tcp_sndbuf(conn->pcb.tcp) == 0) {
- sys_sem_wait(conn->sem);
- if (conn->err != ERR_OK) {
- goto ret;
- }
- }
- if (size > tcp_sndbuf(conn->pcb.tcp)) {
- /* We cannot send more than one send buffer's worth of data at a
- time. */
- len = tcp_sndbuf(conn->pcb.tcp);
- } else {
- len = size;
- }
- } else {
- len = size;
- }
-
- LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_write: writing %d bytes (%d)\n", len, copy));
- msg->msg.msg.w.len = len;
- api_msg_post(msg);
- sys_mbox_fetch(conn->mbox, NULL);
- if (conn->err == ERR_OK) {
- dataptr = (void *)((u8_t *)dataptr + len);
- size -= len;
- } else if (conn->err == ERR_MEM) {
- conn->err = ERR_OK;
- sys_sem_wait(conn->sem);
- } else {
- goto ret;
- }
- }
- ret:
- memp_free(MEMP_API_MSG, msg);
- conn->state = NETCONN_NONE;
-
- return conn->err;
-}
-
-err_t
-netconn_close(struct netconn *conn)
-{
- struct api_msg *msg;
-
- if (conn == NULL) {
- return ERR_VAL;
- }
- if ((msg = memp_malloc(MEMP_API_MSG)) == NULL) {
- return (conn->err = ERR_MEM);
- }
-
- conn->state = NETCONN_CLOSE;
- again:
- msg->type = API_MSG_CLOSE;
- msg->msg.conn = conn;
- api_msg_post(msg);
- sys_mbox_fetch(conn->mbox, NULL);
- if (conn->err == ERR_MEM &&
- conn->sem != SYS_SEM_NULL) {
- sys_sem_wait(conn->sem);
- goto again;
- }
- conn->state = NETCONN_NONE;
- memp_free(MEMP_API_MSG, msg);
- return conn->err;
-}
-
-err_t
-netconn_err(struct netconn *conn)
-{
- return conn->err;
-}
-
diff --git a/src/VBox/Devices/Network/lwip/src/api/api_msg.c b/src/VBox/Devices/Network/lwip/src/api/api_msg.c
deleted file mode 100644
index b7cf03b..0000000
--- a/src/VBox/Devices/Network/lwip/src/api/api_msg.c
+++ /dev/null
@@ -1,807 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/opt.h"
-#include "lwip/arch.h"
-#include "lwip/api_msg.h"
-#include "lwip/memp.h"
-#include "lwip/sys.h"
-#include "lwip/tcpip.h"
-
-#if LWIP_RAW
-static u8_t
-recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p,
- struct ip_addr *addr)
-{
- struct netbuf *buf;
- struct netconn *conn;
-
- conn = arg;
- if (!conn) return 0;
-
- if (conn->recvmbox != SYS_MBOX_NULL) {
- if (!(buf = memp_malloc(MEMP_NETBUF))) {
- return 0;
- }
- pbuf_ref(p);
- buf->p = p;
- buf->ptr = p;
- buf->fromaddr = addr;
- buf->fromport = pcb->protocol;
-
- conn->recv_avail += p->tot_len;
- /* Register event with callback */
- if (conn->callback)
- (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, p->tot_len);
- sys_mbox_post(conn->recvmbox, buf);
- }
-
- return 0; /* do not eat the packet */
-}
-#endif
-#if LWIP_UDP
-static void
-recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p,
- struct ip_addr *addr, u16_t port)
-{
- struct netbuf *buf;
- struct netconn *conn;
-
- conn = arg;
-
- if (conn == NULL) {
- pbuf_free(p);
- return;
- }
- if (conn->recvmbox != SYS_MBOX_NULL) {
- buf = memp_malloc(MEMP_NETBUF);
- if (buf == NULL) {
- pbuf_free(p);
- return;
- } else {
- buf->p = p;
- buf->ptr = p;
- buf->fromaddr = addr;
- buf->fromport = port;
- }
-
- conn->recv_avail += p->tot_len;
- /* Register event with callback */
- if (conn->callback)
- (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, p->tot_len);
- sys_mbox_post(conn->recvmbox, buf);
- }
-}
-#endif /* LWIP_UDP */
-#if LWIP_TCP
-
-static err_t
-recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
-{
- struct netconn *conn;
- u16_t len;
-
- conn = arg;
-
- if (conn == NULL) {
- pbuf_free(p);
- return ERR_VAL;
- }
-
- if (conn->recvmbox != SYS_MBOX_NULL) {
-
- conn->err = err;
- if (p != NULL) {
- len = p->tot_len;
- conn->recv_avail += len;
- }
- else
- len = 0;
- /* Register event with callback */
- if (conn->callback)
- (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, len);
- sys_mbox_post(conn->recvmbox, p);
- }
- return ERR_OK;
-}
-
-
-static err_t
-poll_tcp(void *arg, struct tcp_pcb *pcb)
-{
- struct netconn *conn;
-
- conn = arg;
- if (conn != NULL &&
- (conn->state == NETCONN_WRITE || conn->state == NETCONN_CLOSE) &&
- conn->sem != SYS_SEM_NULL) {
- sys_sem_signal(conn->sem);
- }
- return ERR_OK;
-}
-
-static err_t
-sent_tcp(void *arg, struct tcp_pcb *pcb, u16_t len)
-{
- struct netconn *conn;
-
- conn = arg;
- if (conn != NULL && conn->sem != SYS_SEM_NULL) {
- sys_sem_signal(conn->sem);
- }
-
- if (conn && conn->callback)
- if (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT)
- (*conn->callback)(conn, NETCONN_EVT_SENDPLUS, len);
-
- return ERR_OK;
-}
-
-static void
-err_tcp(void *arg, err_t err)
-{
- struct netconn *conn;
-
- conn = arg;
-
- conn->pcb.tcp = NULL;
-
-
- conn->err = err;
- if (conn->recvmbox != SYS_MBOX_NULL) {
- /* Register event with callback */
- if (conn->callback)
- (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, 0);
- sys_mbox_post(conn->recvmbox, NULL);
- }
- if (conn->mbox != SYS_MBOX_NULL) {
- sys_mbox_post(conn->mbox, NULL);
- }
- if (conn->acceptmbox != SYS_MBOX_NULL) {
- /* Register event with callback */
- if (conn->callback)
- (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, 0);
- sys_mbox_post(conn->acceptmbox, NULL);
- }
- if (conn->sem != SYS_SEM_NULL) {
- sys_sem_signal(conn->sem);
- }
-}
-
-static void
-setup_tcp(struct netconn *conn)
-{
- struct tcp_pcb *pcb;
-
- pcb = conn->pcb.tcp;
- tcp_arg(pcb, conn);
- tcp_recv(pcb, recv_tcp);
- tcp_sent(pcb, sent_tcp);
- tcp_poll(pcb, poll_tcp, 4);
- tcp_err(pcb, err_tcp);
-}
-
-static err_t
-accept_function(void *arg, struct tcp_pcb *newpcb, err_t err)
-{
- sys_mbox_t mbox;
- struct netconn *newconn;
- struct netconn *conn;
-
-#if API_MSG_DEBUG
-#if TCP_DEBUG
- tcp_debug_print_state(newpcb->state);
-#endif /* TCP_DEBUG */
-#endif /* API_MSG_DEBUG */
- conn = (struct netconn *)arg;
- mbox = conn->acceptmbox;
- newconn = memp_malloc(MEMP_NETCONN);
- if (newconn == NULL) {
- return ERR_MEM;
- }
- newconn->recvmbox = sys_mbox_new();
- if (newconn->recvmbox == SYS_MBOX_NULL) {
- memp_free(MEMP_NETCONN, newconn);
- return ERR_MEM;
- }
- newconn->mbox = sys_mbox_new();
- if (newconn->mbox == SYS_MBOX_NULL) {
- sys_mbox_free(newconn->recvmbox);
- memp_free(MEMP_NETCONN, newconn);
- return ERR_MEM;
- }
- newconn->sem = sys_sem_new(0);
- if (newconn->sem == SYS_SEM_NULL) {
- sys_mbox_free(newconn->recvmbox);
- sys_mbox_free(newconn->mbox);
- memp_free(MEMP_NETCONN, newconn);
- return ERR_MEM;
- }
- /* Allocations were OK, setup the PCB etc */
- newconn->type = NETCONN_TCP;
- newconn->pcb.tcp = newpcb;
- setup_tcp(newconn);
- newconn->acceptmbox = SYS_MBOX_NULL;
- newconn->err = err;
- /* Register event with callback */
- if (conn->callback)
- {
- (*conn->callback)(conn, NETCONN_EVT_RCVPLUS, 0);
- }
- /* We have to set the callback here even though
- * the new socket is unknown. Mark the socket as -1. */
- newconn->callback = conn->callback;
- newconn->socket = -1;
- newconn->recv_avail = 0;
-
- sys_mbox_post(mbox, newconn);
- return ERR_OK;
-}
-#endif /* LWIP_TCP */
-
-static void
-do_newconn(struct api_msg_msg *msg)
-{
- if(msg->conn->pcb.tcp != NULL) {
- /* This "new" connection already has a PCB allocated. */
- /* Is this an error condition? Should it be deleted?
- We currently just are happy and return. */
- sys_mbox_post(msg->conn->mbox, NULL);
- return;
- }
-
- msg->conn->err = ERR_OK;
-
- /* Allocate a PCB for this connection */
- switch(msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- msg->conn->pcb.raw = raw_new(msg->msg.bc.port); /* misusing the port field */
- raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn);
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- msg->conn->pcb.udp = udp_new();
- if(msg->conn->pcb.udp == NULL) {
- msg->conn->err = ERR_MEM;
- break;
- }
- udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
- case NETCONN_UDPNOCHKSUM:
- msg->conn->pcb.udp = udp_new();
- if(msg->conn->pcb.udp == NULL) {
- msg->conn->err = ERR_MEM;
- break;
- }
- udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
- case NETCONN_UDP:
- msg->conn->pcb.udp = udp_new();
- if(msg->conn->pcb.udp == NULL) {
- msg->conn->err = ERR_MEM;
- break;
- }
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case NETCONN_TCP:
- msg->conn->pcb.tcp = tcp_new();
- if(msg->conn->pcb.tcp == NULL) {
- msg->conn->err = ERR_MEM;
- break;
- }
- setup_tcp(msg->conn);
- break;
-#endif
- }
-
-
- sys_mbox_post(msg->conn->mbox, NULL);
-}
-
-
-static void
-do_delconn(struct api_msg_msg *msg)
-{
- if (msg->conn->pcb.tcp != NULL) {
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- raw_remove(msg->conn->pcb.raw);
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- msg->conn->pcb.udp->recv_arg = NULL;
- udp_remove(msg->conn->pcb.udp);
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case NETCONN_TCP:
- if (msg->conn->pcb.tcp->state == LISTEN) {
- tcp_arg(msg->conn->pcb.tcp, NULL);
- tcp_accept(msg->conn->pcb.tcp, NULL);
- tcp_close(msg->conn->pcb.tcp);
- } else {
- tcp_arg(msg->conn->pcb.tcp, NULL);
- tcp_sent(msg->conn->pcb.tcp, NULL);
- tcp_recv(msg->conn->pcb.tcp, NULL);
- tcp_poll(msg->conn->pcb.tcp, NULL, 0);
- tcp_err(msg->conn->pcb.tcp, NULL);
- if (tcp_close(msg->conn->pcb.tcp) != ERR_OK) {
- tcp_abort(msg->conn->pcb.tcp);
- }
- }
-#endif
- default:
- break;
- }
- }
- /* Trigger select() in socket layer */
- if (msg->conn->callback)
- {
- (*msg->conn->callback)(msg->conn, NETCONN_EVT_RCVPLUS, 0);
- (*msg->conn->callback)(msg->conn, NETCONN_EVT_SENDPLUS, 0);
- }
-
- if (msg->conn->mbox != SYS_MBOX_NULL) {
- sys_mbox_post(msg->conn->mbox, NULL);
- }
-}
-
-static void
-do_bind(struct api_msg_msg *msg)
-{
- if (msg->conn->pcb.tcp == NULL) {
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- msg->conn->pcb.raw = raw_new(msg->msg.bc.port); /* misusing the port field as protocol */
- raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn);
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- msg->conn->pcb.udp = udp_new();
- udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
- case NETCONN_UDPNOCHKSUM:
- msg->conn->pcb.udp = udp_new();
- udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
- case NETCONN_UDP:
- msg->conn->pcb.udp = udp_new();
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case NETCONN_TCP:
- msg->conn->pcb.tcp = tcp_new();
- setup_tcp(msg->conn);
-#endif /* LWIP_TCP */
- default:
- break;
- }
- }
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- msg->conn->err = raw_bind(msg->conn->pcb.raw,msg->msg.bc.ipaddr);
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- msg->conn->err = udp_bind(msg->conn->pcb.udp, msg->msg.bc.ipaddr, msg->msg.bc.port);
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case NETCONN_TCP:
- msg->conn->err = tcp_bind(msg->conn->pcb.tcp,
- msg->msg.bc.ipaddr, msg->msg.bc.port);
-#endif /* LWIP_TCP */
- default:
- break;
- }
- sys_mbox_post(msg->conn->mbox, NULL);
-}
-#if LWIP_TCP
-
-static err_t
-do_connected(void *arg, struct tcp_pcb *pcb, err_t err)
-{
- struct netconn *conn;
-
- conn = arg;
-
- if (conn == NULL) {
- return ERR_VAL;
- }
-
- conn->err = err;
- if (conn->type == NETCONN_TCP && err == ERR_OK) {
- setup_tcp(conn);
- }
- sys_mbox_post(conn->mbox, NULL);
- return ERR_OK;
-}
-#endif
-
-static void
-do_connect(struct api_msg_msg *msg)
-{
- if (msg->conn->pcb.tcp == NULL) {
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- msg->conn->pcb.raw = raw_new(msg->msg.bc.port); /* misusing the port field as protocol */
- raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn);
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- msg->conn->pcb.udp = udp_new();
- if (msg->conn->pcb.udp == NULL) {
- msg->conn->err = ERR_MEM;
- sys_mbox_post(msg->conn->mbox, NULL);
- return;
- }
- udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
- case NETCONN_UDPNOCHKSUM:
- msg->conn->pcb.udp = udp_new();
- if (msg->conn->pcb.udp == NULL) {
- msg->conn->err = ERR_MEM;
- sys_mbox_post(msg->conn->mbox, NULL);
- return;
- }
- udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
- case NETCONN_UDP:
- msg->conn->pcb.udp = udp_new();
- if (msg->conn->pcb.udp == NULL) {
- msg->conn->err = ERR_MEM;
- sys_mbox_post(msg->conn->mbox, NULL);
- return;
- }
- udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case NETCONN_TCP:
- msg->conn->pcb.tcp = tcp_new();
- if (msg->conn->pcb.tcp == NULL) {
- msg->conn->err = ERR_MEM;
- sys_mbox_post(msg->conn->mbox, NULL);
- return;
- }
-#endif
- default:
- break;
- }
- }
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- raw_connect(msg->conn->pcb.raw, msg->msg.bc.ipaddr);
- sys_mbox_post(msg->conn->mbox, NULL);
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- udp_connect(msg->conn->pcb.udp, msg->msg.bc.ipaddr, msg->msg.bc.port);
- sys_mbox_post(msg->conn->mbox, NULL);
- break;
-#endif
-#if LWIP_TCP
- case NETCONN_TCP:
- /* tcp_arg(msg->conn->pcb.tcp, msg->conn);*/
- setup_tcp(msg->conn);
- tcp_connect(msg->conn->pcb.tcp, msg->msg.bc.ipaddr, msg->msg.bc.port,
- do_connected);
- /*tcp_output(msg->conn->pcb.tcp);*/
-#endif
-
- default:
- break;
- }
-}
-
-static void
-do_disconnect(struct api_msg_msg *msg)
-{
-
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- /* Do nothing as connecting is only a helper for upper lwip layers */
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- udp_disconnect(msg->conn->pcb.udp);
- break;
-#endif
- case NETCONN_TCP:
- break;
- }
- sys_mbox_post(msg->conn->mbox, NULL);
-}
-
-
-static void
-do_listen(struct api_msg_msg *msg)
-{
- if (msg->conn->pcb.tcp != NULL) {
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: listen RAW: cannot listen for RAW.\n"));
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: listen UDP: cannot listen for UDP.\n"));
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case NETCONN_TCP:
- msg->conn->pcb.tcp = tcp_listen(msg->conn->pcb.tcp);
- if (msg->conn->pcb.tcp == NULL) {
- msg->conn->err = ERR_MEM;
- } else {
- if (msg->conn->acceptmbox == SYS_MBOX_NULL) {
- msg->conn->acceptmbox = sys_mbox_new();
- if (msg->conn->acceptmbox == SYS_MBOX_NULL) {
- msg->conn->err = ERR_MEM;
- break;
- }
- }
- tcp_arg(msg->conn->pcb.tcp, msg->conn);
- tcp_accept(msg->conn->pcb.tcp, accept_function);
- }
-#endif
- default:
- break;
- }
- }
- sys_mbox_post(msg->conn->mbox, NULL);
-}
-
-static void
-do_accept(struct api_msg_msg *msg)
-{
- if (msg->conn->pcb.tcp != NULL) {
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: accept RAW: cannot accept for RAW.\n"));
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- LWIP_DEBUGF(API_MSG_DEBUG, ("api_msg: accept UDP: cannot accept for UDP.\n"));
- break;
-#endif /* LWIP_UDP */
- case NETCONN_TCP:
- break;
- }
- }
-}
-
-static void
-do_send(struct api_msg_msg *msg)
-{
- if (msg->conn->pcb.tcp != NULL) {
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- raw_send(msg->conn->pcb.raw, msg->msg.p);
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- udp_send(msg->conn->pcb.udp, msg->msg.p);
- break;
-#endif /* LWIP_UDP */
- case NETCONN_TCP:
- break;
- }
- }
- sys_mbox_post(msg->conn->mbox, NULL);
-}
-
-static void
-do_recv(struct api_msg_msg *msg)
-{
-#if LWIP_TCP
- if (msg->conn->pcb.tcp != NULL) {
- if (msg->conn->type == NETCONN_TCP) {
- tcp_recved(msg->conn->pcb.tcp, msg->msg.len);
- }
- }
-#endif
- sys_mbox_post(msg->conn->mbox, NULL);
-}
-
-static void
-do_write(struct api_msg_msg *msg)
-{
-#if LWIP_TCP
- err_t err;
-#endif
- if (msg->conn->pcb.tcp != NULL) {
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- msg->conn->err = ERR_VAL;
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- msg->conn->err = ERR_VAL;
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case NETCONN_TCP:
- err = tcp_write(msg->conn->pcb.tcp, msg->msg.w.dataptr,
- msg->msg.w.len, msg->msg.w.copy);
- /* This is the Nagle algorithm: inhibit the sending of new TCP
- segments when new outgoing data arrives from the user if any
- previously transmitted data on the connection remains
- unacknowledged. */
- if(err == ERR_OK && (msg->conn->pcb.tcp->unacked == NULL ||
- (msg->conn->pcb.tcp->flags & TF_NODELAY) ||
- (msg->conn->pcb.tcp->snd_queuelen) > 1)) {
- tcp_output(msg->conn->pcb.tcp);
- }
- msg->conn->err = err;
- if (msg->conn->callback)
- if (err == ERR_OK)
- {
- if (tcp_sndbuf(msg->conn->pcb.tcp) <= TCP_SNDLOWAT)
- (*msg->conn->callback)(msg->conn, NETCONN_EVT_SENDMINUS, msg->msg.w.len);
- }
-#endif
- default:
- break;
- }
- }
- sys_mbox_post(msg->conn->mbox, NULL);
-}
-
-static void
-do_close(struct api_msg_msg *msg)
-{
- err_t err;
-
- err = ERR_OK;
-
- if (msg->conn->pcb.tcp != NULL) {
- switch (msg->conn->type) {
-#if LWIP_RAW
- case NETCONN_RAW:
- break;
-#endif
-#if LWIP_UDP
- case NETCONN_UDPLITE:
- /* FALLTHROUGH */
- case NETCONN_UDPNOCHKSUM:
- /* FALLTHROUGH */
- case NETCONN_UDP:
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case NETCONN_TCP:
- if (msg->conn->pcb.tcp->state == LISTEN) {
- err = tcp_close(msg->conn->pcb.tcp);
- }
- else if (msg->conn->pcb.tcp->state == CLOSE_WAIT) {
- err = tcp_output(msg->conn->pcb.tcp);
- }
- msg->conn->err = err;
-#endif
- default:
- break;
- }
- }
- sys_mbox_post(msg->conn->mbox, NULL);
-}
-
-typedef void (* api_msg_decode)(struct api_msg_msg *msg);
-static api_msg_decode decode[API_MSG_MAX] = {
- do_newconn,
- do_delconn,
- do_bind,
- do_connect,
- do_disconnect,
- do_listen,
- do_accept,
- do_send,
- do_recv,
- do_write,
- do_close
- };
-void
-api_msg_input(struct api_msg *msg)
-{
- decode[msg->type](&(msg->msg));
-}
-
-void
-api_msg_post(struct api_msg *msg)
-{
- tcpip_apimsg(msg);
-}
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/api/err.c b/src/VBox/Devices/Network/lwip/src/api/err.c
deleted file mode 100644
index b582d88..0000000
--- a/src/VBox/Devices/Network/lwip/src/api/err.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/err.h"
-
-#ifdef LWIP_DEBUG
-
-static char *err_strerr[] = {"Ok.",
- "Out of memory error.",
- "Buffer error.",
- "Connection aborted.",
- "Connection reset.",
- "Connection closed.",
- "Not connected.",
- "Illegal value.",
- "Illegal argument.",
- "Routing problem.",
- "Address in use."
-};
-
-
-char *
-lwip_strerr(err_t err)
-{
- return err_strerr[-err];
-
-}
-
-
-#endif /* LWIP_DEBUG */
diff --git a/src/VBox/Devices/Network/lwip/src/api/sockets.c b/src/VBox/Devices/Network/lwip/src/api/sockets.c
deleted file mode 100644
index dd8fc21..0000000
--- a/src/VBox/Devices/Network/lwip/src/api/sockets.c
+++ /dev/null
@@ -1,1367 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- * Improved by Marc Boucher <marc at mbsi.ca> and David Haas <dhaas at alum.rpi.edu>
- *
- */
-
-#include <string.h>
-#ifndef _MSC_VER /* Why is errno.h included here - see lwip/arch.h -> lwip/cc.h */
-# include <errno.h>
-#endif
-
-#include "lwip/opt.h"
-#include "lwip/api.h"
-#include "lwip/arch.h"
-#include "lwip/sys.h"
-
-#include "lwip/sockets.h"
-
-#define NUM_SOCKETS MEMP_NUM_NETCONN
-
-struct lwip_socket {
- struct netconn *conn;
- struct netbuf *lastdata;
- u16_t lastoffset;
- u16_t rcvevent;
- u16_t sendevent;
- u16_t flags;
- int err;
-};
-
-struct lwip_select_cb
-{
- struct lwip_select_cb *next;
- fd_set *readset;
- fd_set *writeset;
- fd_set *exceptset;
- int sem_signalled;
- sys_sem_t sem;
-};
-
-static struct lwip_socket sockets[NUM_SOCKETS];
-static struct lwip_select_cb *select_cb_list = 0;
-
-static sys_sem_t socksem = 0;
-static sys_sem_t selectsem = 0;
-
-static void
-event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len);
-
-static int err_to_errno_table[11] = {
- 0, /* ERR_OK 0 No error, everything OK. */
- ENOMEM, /* ERR_MEM -1 Out of memory error. */
- ENOBUFS, /* ERR_BUF -2 Buffer error. */
- ECONNABORTED, /* ERR_ABRT -3 Connection aborted. */
- ECONNRESET, /* ERR_RST -4 Connection reset. */
- ESHUTDOWN, /* ERR_CLSD -5 Connection closed. */
- ENOTCONN, /* ERR_CONN -6 Not connected. */
- EINVAL, /* ERR_VAL -7 Illegal value. */
- EIO, /* ERR_ARG -8 Illegal argument. */
- EHOSTUNREACH, /* ERR_RTE -9 Routing problem. */
- EADDRINUSE /* ERR_USE -10 Address in use. */
-};
-
-#define ERR_TO_ERRNO_TABLE_SIZE \
- (sizeof(err_to_errno_table)/sizeof(err_to_errno_table[0]))
-
-#define err_to_errno(err) \
- (-(err) >= 0 && (unsigned)-(err) < ERR_TO_ERRNO_TABLE_SIZE ? \
- err_to_errno_table[(unsigned)-(err)] : EIO)
-
-#ifdef ERRNO
-#define set_errno(err) errno = (err)
-# ifdef _MSC_VER
-# error "Curious bird: Where is ERRNO defined for MSC?"
-# endif
-#else
-#define set_errno(err)
-#endif
-
-#define sock_set_errno(sk, e) do { \
- sk->err = (e); \
- set_errno(sk->err); \
-} while (0)
-
-
-static struct lwip_socket *
-get_socket(int s)
-{
- struct lwip_socket *sock;
-
- if ((s < 0) || (s >= NUM_SOCKETS)) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", s));
- set_errno(EBADF);
- return NULL;
- }
-
- sock = &sockets[s];
-
- if (!sock->conn) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): not active\n", s));
- set_errno(EBADF);
- return NULL;
- }
-
- return sock;
-}
-
-static int
-alloc_socket(struct netconn *newconn)
-{
- int i;
-
- if (!socksem)
- socksem = sys_sem_new(1);
-
- /* Protect socket array */
- sys_sem_wait(socksem);
-
- /* allocate a new socket identifier */
- for(i = 0; i < NUM_SOCKETS; ++i) {
- if (!sockets[i].conn) {
- sockets[i].conn = newconn;
- sockets[i].lastdata = NULL;
- sockets[i].lastoffset = 0;
- sockets[i].rcvevent = 0;
- sockets[i].sendevent = 1; /* TCP send buf is empty */
- sockets[i].flags = 0;
- sockets[i].err = 0;
- sys_sem_signal(socksem);
- return i;
- }
- }
- sys_sem_signal(socksem);
- return -1;
-}
-
-int
-lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)
-{
- struct lwip_socket *sock;
- struct netconn *newconn;
- struct ip_addr naddr;
- u16_t port;
- int newsock;
- struct sockaddr_in sin;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s));
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- newconn = netconn_accept(sock->conn);
-
- /* get the IP address and port of the remote host */
- netconn_peer(newconn, &naddr, &port);
-
- memset(&sin, 0, sizeof(sin));
- sin.sin_len = sizeof(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(port);
- sin.sin_addr.s_addr = naddr.addr;
-
- if (*addrlen > (socklen_t)sizeof(sin))
- *addrlen = sizeof(sin);
-
- memcpy(addr, &sin, *addrlen);
-
- newsock = alloc_socket(newconn);
- if (newsock == -1) {
- netconn_delete(newconn);
- sock_set_errno(sock, ENOBUFS);
- return -1;
- }
- newconn->callback = event_callback;
- sock = get_socket(newsock);
-
- sys_sem_wait(socksem);
- sock->rcvevent += -1 - newconn->socket;
- newconn->socket = newsock;
- sys_sem_signal(socksem);
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock));
- ip_addr_debug_print(SOCKETS_DEBUG, &naddr);
- LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u\n", port));
-
- sock_set_errno(sock, 0);
- return newsock;
-}
-
-int
-lwip_bind(int s, struct sockaddr *name, socklen_t namelen)
-{
- struct lwip_socket *sock;
- struct ip_addr local_addr;
- u16_t local_port;
- err_t err;
-
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- local_addr.addr = ((struct sockaddr_in *)name)->sin_addr.s_addr;
- local_port = ((struct sockaddr_in *)name)->sin_port;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d, addr=", s));
- ip_addr_debug_print(SOCKETS_DEBUG, &local_addr);
- LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u)\n", ntohs(local_port)));
-
- err = netconn_bind(sock->conn, &local_addr, ntohs(local_port));
-
- if (err != ERR_OK) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) failed, err=%d\n", s, err));
- sock_set_errno(sock, err_to_errno(err));
- return -1;
- }
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s));
- sock_set_errno(sock, 0);
- return 0;
-}
-
-int
-lwip_close(int s)
-{
- struct lwip_socket *sock;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_close(%d)\n", s));
- if (!socksem)
- socksem = sys_sem_new(1);
-
- /* We cannot allow multiple closes of the same socket. */
- sys_sem_wait(socksem);
-
- sock = get_socket(s);
- if (!sock) {
- sys_sem_signal(socksem);
- set_errno(EBADF);
- return -1;
- }
-
- netconn_delete(sock->conn);
- if (sock->lastdata) {
- netbuf_delete(sock->lastdata);
- }
- sock->lastdata = NULL;
- sock->lastoffset = 0;
- sock->conn = NULL;
- sys_sem_signal(socksem);
- sock_set_errno(sock, 0);
- return 0;
-}
-
-int
-lwip_connect(int s, struct sockaddr *name, socklen_t namelen)
-{
- struct lwip_socket *sock;
- err_t err;
-
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- if (((struct sockaddr_in *)name)->sin_family == AF_UNSPEC) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, AF_UNSPEC)\n", s));
- err = netconn_disconnect(sock->conn);
- } else {
- struct ip_addr remote_addr;
- u16_t remote_port;
-
- remote_addr.addr = ((struct sockaddr_in *)name)->sin_addr.s_addr;
- remote_port = ((struct sockaddr_in *)name)->sin_port;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, addr=", s));
- ip_addr_debug_print(SOCKETS_DEBUG, &remote_addr);
- LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u)\n", ntohs(remote_port)));
-
- err = netconn_connect(sock->conn, &remote_addr, ntohs(remote_port));
- }
-
- if (err != ERR_OK) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) failed, err=%d\n", s, err));
- sock_set_errno(sock, err_to_errno(err));
- return -1;
- }
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s));
- sock_set_errno(sock, 0);
- return 0;
-}
-
-int
-lwip_listen(int s, int backlog)
-{
- struct lwip_socket *sock;
- err_t err;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog));
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- err = netconn_listen(sock->conn);
-
- if (err != ERR_OK) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d) failed, err=%d\n", s, err));
- sock_set_errno(sock, err_to_errno(err));
- return -1;
- }
-
- sock_set_errno(sock, 0);
- return 0;
-}
-
-int
-lwip_recvfrom(int s, void *mem, int len, unsigned int flags,
- struct sockaddr *from, socklen_t *fromlen)
-{
- struct lwip_socket *sock;
- struct netbuf *buf;
- u16_t buflen, copylen;
- struct ip_addr *addr;
- u16_t port;
-
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %d, 0x%x, ..)\n", s, mem, len, flags));
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- /* Check if there is data left from the last recv operation. */
- if (sock->lastdata) {
- buf = sock->lastdata;
- } else {
- /* If this is non-blocking call, then check first */
- if (((flags & MSG_DONTWAIT) || (sock->flags & O_NONBLOCK))
- && !sock->rcvevent)
- {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): returning EWOULDBLOCK\n", s));
- sock_set_errno(sock, EWOULDBLOCK);
- return -1;
- }
-
- /* No data was left from the previous operation, so we try to get
- some from the network. */
- buf = netconn_recv(sock->conn);
-
- if (!buf) {
- /* We should really do some error checking here. */
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): buf == NULL!\n", s));
- sock_set_errno(sock, 0);
- return 0;
- }
- }
-
- buflen = netbuf_len(buf);
-
- buflen -= sock->lastoffset;
-
- if (len > buflen) {
- copylen = buflen;
- } else {
- copylen = len;
- }
-
- /* copy the contents of the received buffer into
- the supplied memory pointer mem */
- netbuf_copy_partial(buf, mem, copylen, sock->lastoffset);
-
- /* Check to see from where the data was. */
- if (from && fromlen) {
- struct sockaddr_in sin;
-
- addr = netbuf_fromaddr(buf);
- port = netbuf_fromport(buf);
-
- memset(&sin, 0, sizeof(sin));
- sin.sin_len = sizeof(sin);
- sin.sin_family = AF_INET;
- sin.sin_port = htons(port);
- sin.sin_addr.s_addr = addr->addr;
-
- if (*fromlen > (socklen_t)sizeof(sin))
- *fromlen = sizeof(sin);
-
- memcpy(from, &sin, *fromlen);
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s));
- ip_addr_debug_print(SOCKETS_DEBUG, addr);
- LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, copylen));
- } else {
-#if SOCKETS_DEBUG
- addr = netbuf_fromaddr(buf);
- port = netbuf_fromport(buf);
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s));
- ip_addr_debug_print(SOCKETS_DEBUG, addr);
- LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u len=%u\n", port, copylen));
-#endif
-
- }
-
- /* If this is a TCP socket, check if there is data left in the
- buffer. If so, it should be saved in the sock structure for next
- time around. */
- if (netconn_type(sock->conn) == NETCONN_TCP && buflen - copylen > 0) {
- sock->lastdata = buf;
- sock->lastoffset += copylen;
- } else {
- sock->lastdata = NULL;
- sock->lastoffset = 0;
- netbuf_delete(buf);
- }
-
-
- sock_set_errno(sock, 0);
- return copylen;
-}
-
-int
-lwip_read(int s, void *mem, int len)
-{
- return lwip_recvfrom(s, mem, len, 0, NULL, NULL);
-}
-
-int
-lwip_recv(int s, void *mem, int len, unsigned int flags)
-{
- return lwip_recvfrom(s, mem, len, flags, NULL, NULL);
-}
-
-int
-lwip_send(int s, void *data, int size, unsigned int flags)
-{
- struct lwip_socket *sock;
- struct netbuf *buf;
- err_t err;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d, data=%p, size=%d, flags=0x%x)\n", s, data, size, flags));
-
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- switch (netconn_type(sock->conn)) {
- case NETCONN_RAW:
- case NETCONN_UDP:
- case NETCONN_UDPLITE:
- case NETCONN_UDPNOCHKSUM:
- /* create a buffer */
- buf = netbuf_new();
-
- if (!buf) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) ENOBUFS\n", s));
- sock_set_errno(sock, ENOBUFS);
- return -1;
- }
-
- /* make the buffer point to the data that should
- be sent */
- netbuf_ref(buf, data, size);
-
- /* send the data */
- err = netconn_send(sock->conn, buf);
-
- /* deallocated the buffer */
- netbuf_delete(buf);
- break;
- case NETCONN_TCP:
- err = netconn_write(sock->conn, data, size, NETCONN_COPY);
- break;
- default:
- err = ERR_ARG;
- break;
- }
- if (err != ERR_OK) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d\n", s, err));
- sock_set_errno(sock, err_to_errno(err));
- return -1;
- }
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) ok size=%d\n", s, size));
- sock_set_errno(sock, 0);
- return size;
-}
-
-int
-lwip_sendto(int s, void *data, int size, unsigned int flags,
- struct sockaddr *to, socklen_t tolen)
-{
- struct lwip_socket *sock;
- struct ip_addr remote_addr, addr;
- u16_t remote_port, port;
- int ret,connected;
-
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- /* get the peer if currently connected */
- connected = (netconn_peer(sock->conn, &addr, &port) == ERR_OK);
-
- remote_addr.addr = ((struct sockaddr_in *)to)->sin_addr.s_addr;
- remote_port = ((struct sockaddr_in *)to)->sin_port;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_sendto(%d, data=%p, size=%d, flags=0x%x to=", s, data, size, flags));
- ip_addr_debug_print(SOCKETS_DEBUG, &remote_addr);
- LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%u\n", ntohs(remote_port)));
-
- netconn_connect(sock->conn, &remote_addr, ntohs(remote_port));
-
- ret = lwip_send(s, data, size, flags);
-
- /* reset the remote address and port number
- of the connection */
- if (connected)
- netconn_connect(sock->conn, &addr, port);
- else
- netconn_disconnect(sock->conn);
- return ret;
-}
-
-int
-lwip_socket(int domain, int type, int protocol)
-{
- struct netconn *conn;
- int i;
-
- /* create a netconn */
- switch (type) {
- case SOCK_RAW:
- conn = netconn_new_with_proto_and_callback(NETCONN_RAW, protocol, event_callback);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ", domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
- break;
- case SOCK_DGRAM:
- conn = netconn_new_with_callback(NETCONN_UDP, event_callback);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ", domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
- break;
- case SOCK_STREAM:
- conn = netconn_new_with_callback(NETCONN_TCP, event_callback);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ", domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol));
- break;
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n", domain, type, protocol));
- set_errno(EINVAL);
- return -1;
- }
-
- if (!conn) {
- LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n"));
- set_errno(ENOBUFS);
- return -1;
- }
-
- i = alloc_socket(conn);
-
- if (i == -1) {
- netconn_delete(conn);
- set_errno(ENOBUFS);
- return -1;
- }
- conn->socket = i;
- LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i));
- set_errno(0);
- return i;
-}
-
-int
-lwip_write(int s, void *data, int size)
-{
- return lwip_send(s, data, size, 0);
-}
-
-
-static int
-lwip_selscan(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset)
-{
- int i, nready = 0;
- fd_set lreadset, lwriteset, lexceptset;
- struct lwip_socket *p_sock;
-
- FD_ZERO(&lreadset);
- FD_ZERO(&lwriteset);
- FD_ZERO(&lexceptset);
-
- /* Go through each socket in each list to count number of sockets which
- currently match */
- for(i = 0; i < maxfdp1; i++)
- {
- if (FD_ISSET(i, readset))
- {
- /* See if netconn of this socket is ready for read */
- p_sock = get_socket(i);
- if (p_sock && (p_sock->lastdata || p_sock->rcvevent))
- {
- FD_SET(i, &lreadset);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for reading\n", i));
- nready++;
- }
- }
- if (FD_ISSET(i, writeset))
- {
- /* See if netconn of this socket is ready for write */
- p_sock = get_socket(i);
- if (p_sock && p_sock->sendevent)
- {
- FD_SET(i, &lwriteset);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for writing\n", i));
- nready++;
- }
- }
- }
- *readset = lreadset;
- *writeset = lwriteset;
- FD_ZERO(exceptset);
-
- return nready;
-}
-
-
-
-int
-lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
- struct timeval *timeout)
-{
- int i;
- int nready;
- fd_set lreadset, lwriteset, lexceptset;
- u32_t msectimeout;
- struct lwip_select_cb select_cb;
- struct lwip_select_cb *p_selcb;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select(%d, %p, %p, %p, tvsec=%ld tvusec=%ld)\n", maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset, timeout ? timeout->tv_sec : -1L, timeout ? timeout->tv_usec : -1L));
-
- select_cb.next = 0;
- select_cb.readset = readset;
- select_cb.writeset = writeset;
- select_cb.exceptset = exceptset;
- select_cb.sem_signalled = 0;
-
- /* Protect ourselves searching through the list */
- if (!selectsem)
- selectsem = sys_sem_new(1);
- sys_sem_wait(selectsem);
-
- if (readset)
- lreadset = *readset;
- else
- FD_ZERO(&lreadset);
- if (writeset)
- lwriteset = *writeset;
- else
- FD_ZERO(&lwriteset);
- if (exceptset)
- lexceptset = *exceptset;
- else
- FD_ZERO(&lexceptset);
-
- /* Go through each socket in each list to count number of sockets which
- currently match */
- nready = lwip_selscan(maxfdp1, &lreadset, &lwriteset, &lexceptset);
-
- /* If we don't have any current events, then suspend if we are supposed to */
- if (!nready)
- {
- if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0)
- {
- sys_sem_signal(selectsem);
- if (readset)
- FD_ZERO(readset);
- if (writeset)
- FD_ZERO(writeset);
- if (exceptset)
- FD_ZERO(exceptset);
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: no timeout, returning 0\n"));
- set_errno(0);
-
- return 0;
- }
-
- /* add our semaphore to list */
- /* We don't actually need any dynamic memory. Our entry on the
- * list is only valid while we are in this function, so it's ok
- * to use local variables */
-
- select_cb.sem = sys_sem_new(0);
- /* Note that we are still protected */
- /* Put this select_cb on top of list */
- select_cb.next = select_cb_list;
- select_cb_list = &select_cb;
-
- /* Now we can safely unprotect */
- sys_sem_signal(selectsem);
-
- /* Now just wait to be woken */
- if (timeout == 0)
- /* Wait forever */
- msectimeout = 0;
- else
- msectimeout = ((timeout->tv_sec * 1000) + ((timeout->tv_usec + 500)/1000));
-
- i = sys_sem_wait_timeout(select_cb.sem, msectimeout);
-
- /* Take us off the list */
- sys_sem_wait(selectsem);
- if (select_cb_list == &select_cb)
- select_cb_list = select_cb.next;
- else
- for (p_selcb = select_cb_list; p_selcb; p_selcb = p_selcb->next)
- if (p_selcb->next == &select_cb)
- {
- p_selcb->next = select_cb.next;
- break;
- }
-
- sys_sem_signal(selectsem);
-
- sys_sem_free(select_cb.sem);
- if (i == 0) /* Timeout */
- {
- if (readset)
- FD_ZERO(readset);
- if (writeset)
- FD_ZERO(writeset);
- if (exceptset)
- FD_ZERO(exceptset);
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: timeout expired\n"));
- set_errno(0);
-
- return 0;
- }
-
- if (readset)
- lreadset = *readset;
- else
- FD_ZERO(&lreadset);
- if (writeset)
- lwriteset = *writeset;
- else
- FD_ZERO(&lwriteset);
- if (exceptset)
- lexceptset = *exceptset;
- else
- FD_ZERO(&lexceptset);
-
- /* See what's set */
- nready = lwip_selscan(maxfdp1, &lreadset, &lwriteset, &lexceptset);
- }
- else
- sys_sem_signal(selectsem);
-
- if (readset)
- *readset = lreadset;
- if (writeset)
- *writeset = lwriteset;
- if (exceptset)
- *exceptset = lexceptset;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready));
- set_errno(0);
-
- return nready;
-}
-
-
-static void
-event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)
-{
- int s;
- struct lwip_socket *sock;
- struct lwip_select_cb *scb;
-
- /* Get socket */
- if (conn)
- {
- s = conn->socket;
- if (s < 0)
- {
- /* Data comes in right away after an accept, even though
- * the server task might not have created a new socket yet.
- * Just count down (or up) if that's the case and we
- * will use the data later. Note that only receive events
- * can happen before the new socket is set up. */
- if (evt == NETCONN_EVT_RCVPLUS)
- conn->socket--;
- return;
- }
-
- sock = get_socket(s);
- if (!sock)
- return;
- }
- else
- return;
-
- if (!selectsem)
- selectsem = sys_sem_new(1);
-
- sys_sem_wait(selectsem);
- /* Set event as required */
- switch (evt)
- {
- case NETCONN_EVT_RCVPLUS:
- sock->rcvevent++;
- break;
- case NETCONN_EVT_RCVMINUS:
- sock->rcvevent--;
- break;
- case NETCONN_EVT_SENDPLUS:
- sock->sendevent = 1;
- break;
- case NETCONN_EVT_SENDMINUS:
- sock->sendevent = 0;
- break;
- }
- sys_sem_signal(selectsem);
-
- /* Now decide if anyone is waiting for this socket */
- /* NOTE: This code is written this way to protect the select link list
- but to avoid a deadlock situation by releasing socksem before
- signalling for the select. This means we need to go through the list
- multiple times ONLY IF a select was actually waiting. We go through
- the list the number of waiting select calls + 1. This list is
- expected to be small. */
- while (1)
- {
- sys_sem_wait(selectsem);
- for (scb = select_cb_list; scb; scb = scb->next)
- {
- if (scb->sem_signalled == 0)
- {
- /* Test this select call for our socket */
- if (scb->readset && FD_ISSET(s, scb->readset))
- if (sock->rcvevent)
- break;
- if (scb->writeset && FD_ISSET(s, scb->writeset))
- if (sock->sendevent)
- break;
- }
- }
- if (scb)
- {
- scb->sem_signalled = 1;
- sys_sem_signal(selectsem);
- sys_sem_signal(scb->sem);
- } else {
- sys_sem_signal(selectsem);
- break;
- }
- }
-
-}
-
-
-
-
-int lwip_shutdown(int s, int how)
-{
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_shutdown(%d, how=%d)\n", s, how));
- return lwip_close(s); /* XXX temporary hack until proper implementation */
-}
-
-int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen)
-{
- struct lwip_socket *sock;
- struct sockaddr_in sin;
- struct ip_addr naddr;
-
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- memset(&sin, 0, sizeof(sin));
- sin.sin_len = sizeof(sin);
- sin.sin_family = AF_INET;
-
- /* get the IP address and port of the remote host */
- netconn_peer(sock->conn, &naddr, &sin.sin_port);
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getpeername(%d, addr=", s));
- ip_addr_debug_print(SOCKETS_DEBUG, &naddr);
- LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%d)\n", sin.sin_port));
-
- sin.sin_port = htons(sin.sin_port);
- sin.sin_addr.s_addr = naddr.addr;
-
- if (*namelen > (socklen_t)sizeof(sin))
- *namelen = sizeof(sin);
-
- memcpy(name, &sin, *namelen);
- sock_set_errno(sock, 0);
- return 0;
-}
-
-int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen)
-{
- struct lwip_socket *sock;
- struct sockaddr_in sin;
- struct ip_addr *naddr;
-
- sock = get_socket(s);
- if (!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- memset(&sin, 0, sizeof(sin));
- sin.sin_len = sizeof(sin);
- sin.sin_family = AF_INET;
-
- /* get the IP address and port of the remote host */
- netconn_addr(sock->conn, &naddr, &sin.sin_port);
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockname(%d, addr=", s));
- ip_addr_debug_print(SOCKETS_DEBUG, naddr);
- LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%d)\n", sin.sin_port));
-
- sin.sin_port = htons(sin.sin_port);
- sin.sin_addr.s_addr = naddr->addr;
-
- if (*namelen > (socklen_t)sizeof(sin))
- *namelen = sizeof(sin);
-
- memcpy(name, &sin, *namelen);
- sock_set_errno(sock, 0);
- return 0;
-}
-
-int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen)
-{
- int err = 0;
- struct lwip_socket *sock = get_socket(s);
-
- if(!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- if( NULL == optval || NULL == optlen ) {
- sock_set_errno( sock, EFAULT );
- return -1;
- }
-
- /* Do length and type checks for the various options first, to keep it readable. */
- switch( level ) {
-
-/* Level: SOL_SOCKET */
- case SOL_SOCKET:
- switch(optname) {
-
- case SO_ACCEPTCONN:
- case SO_BROADCAST:
- /* UNIMPL case SO_DEBUG: */
- /* UNIMPL case SO_DONTROUTE: */
- case SO_ERROR:
- case SO_KEEPALIVE:
- /* UNIMPL case SO_OOBINLINE: */
- /* UNIMPL case SO_RCVBUF: */
- /* UNIMPL case SO_SNDBUF: */
- /* UNIMPL case SO_RCVLOWAT: */
- /* UNIMPL case SO_SNDLOWAT: */
-#if SO_REUSE
- case SO_REUSEADDR:
- case SO_REUSEPORT:
-#endif /* SO_REUSE */
- case SO_TYPE:
- /* UNIMPL case SO_USELOOPBACK: */
- if( *optlen < (socklen_t)sizeof(int) ) {
- err = EINVAL;
- }
- break;
-
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname));
- err = ENOPROTOOPT;
- } /* switch */
- break;
-
-/* Level: IPPROTO_IP */
- case IPPROTO_IP:
- switch(optname) {
- /* UNIMPL case IP_HDRINCL: */
- /* UNIMPL case IP_RCVDSTADDR: */
- /* UNIMPL case IP_RCVIF: */
- case IP_TTL:
- case IP_TOS:
- if( *optlen < (socklen_t)sizeof(int) ) {
- err = EINVAL;
- }
- break;
-
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", s, optname));
- err = ENOPROTOOPT;
- } /* switch */
- break;
-
-/* Level: IPPROTO_TCP */
- case IPPROTO_TCP:
- if( *optlen < (socklen_t)sizeof(int) ) {
- err = EINVAL;
- break;
- }
-
- /* If this is no TCP socket, ignore any options. */
- if ( sock->conn->type != NETCONN_TCP ) return 0;
-
- switch( optname ) {
- case TCP_NODELAY:
- case TCP_KEEPALIVE:
- break;
-
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", s, optname));
- err = ENOPROTOOPT;
- } /* switch */
- break;
-
-/* UNDEFINED LEVEL */
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname));
- err = ENOPROTOOPT;
- } /* switch */
-
-
- if( 0 != err ) {
- sock_set_errno(sock, err);
- return -1;
- }
-
-
-
- /* Now do the actual option processing */
-
- switch(level) {
-
-/* Level: SOL_SOCKET */
- case SOL_SOCKET:
- switch( optname ) {
-
- /* The option flags */
- case SO_ACCEPTCONN:
- case SO_BROADCAST:
- /* UNIMPL case SO_DEBUG: */
- /* UNIMPL case SO_DONTROUTE: */
- case SO_KEEPALIVE:
- /* UNIMPL case SO_OOBINCLUDE: */
-#if SO_REUSE
- case SO_REUSEADDR:
- case SO_REUSEPORT:
-#endif /* SO_REUSE */
- /*case SO_USELOOPBACK: UNIMPL */
- *(int*)optval = sock->conn->pcb.tcp->so_options & optname;
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n", s, optname, (*(int*)optval?"on":"off")));
- break;
-
- case SO_TYPE:
- switch (sock->conn->type) {
- case NETCONN_RAW:
- *(int*)optval = SOCK_RAW;
- break;
- case NETCONN_TCP:
- *(int*)optval = SOCK_STREAM;
- break;
- case NETCONN_UDP:
- case NETCONN_UDPLITE:
- case NETCONN_UDPNOCHKSUM:
- *(int*)optval = SOCK_DGRAM;
- break;
- default: /* unrecognized socket type */
- *(int*)optval = sock->conn->type;
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\n", s, *(int *)optval));
- } /* switch */
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE) = %d\n", s, *(int *)optval));
- break;
-
- case SO_ERROR:
- *(int *)optval = sock->err;
- sock->err = 0;
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n", s, *(int *)optval));
- break;
- } /* switch */
- break;
-
-/* Level: IPPROTO_IP */
- case IPPROTO_IP:
- switch( optname ) {
- case IP_TTL:
- *(int*)optval = sock->conn->pcb.tcp->ttl;
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TTL) = %d\n", s, *(int *)optval));
- break;
- case IP_TOS:
- *(int*)optval = sock->conn->pcb.tcp->tos;
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TOS) = %d\n", s, *(int *)optval));
- break;
- } /* switch */
- break;
-
-/* Level: IPPROTO_TCP */
- case IPPROTO_TCP:
- switch( optname ) {
- case TCP_NODELAY:
- *(int*)optval = (sock->conn->pcb.tcp->flags & TF_NODELAY);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\n", s, (*(int*)optval)?"on":"off") );
- break;
- case TCP_KEEPALIVE:
- *(int*)optval = (int)sock->conn->pcb.tcp->keepalive;
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, TCP_KEEPALIVE) = %d\n", s, *(int *)optval));
- break;
- } /* switch */
- break;
- }
-
-
- sock_set_errno(sock, err);
- return err ? -1 : 0;
-}
-
-int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen)
-{
- struct lwip_socket *sock = get_socket(s);
- int err = 0;
-
- if(!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- if( NULL == optval ) {
- sock_set_errno( sock, EFAULT );
- return -1;
- }
-
-
- /* Do length and type checks for the various options first, to keep it readable. */
- switch( level ) {
-
-/* Level: SOL_SOCKET */
- case SOL_SOCKET:
- switch(optname) {
-
- case SO_BROADCAST:
- /* UNIMPL case SO_DEBUG: */
- /* UNIMPL case SO_DONTROUTE: */
- case SO_KEEPALIVE:
- /* UNIMPL case SO_OOBINLINE: */
- /* UNIMPL case SO_RCVBUF: */
- /* UNIMPL case SO_SNDBUF: */
- /* UNIMPL case SO_RCVLOWAT: */
- /* UNIMPL case SO_SNDLOWAT: */
-#if SO_REUSE
- case SO_REUSEADDR:
- case SO_REUSEPORT:
-#endif /* SO_REUSE */
- /* UNIMPL case SO_USELOOPBACK: */
- if( optlen < (socklen_t)sizeof(int) ) {
- err = EINVAL;
- }
- break;
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", s, optname));
- err = ENOPROTOOPT;
- } /* switch */
- break;
-
-/* Level: IPPROTO_IP */
- case IPPROTO_IP:
- switch(optname) {
- /* UNIMPL case IP_HDRINCL: */
- /* UNIMPL case IP_RCVDSTADDR: */
- /* UNIMPL case IP_RCVIF: */
- case IP_TTL:
- case IP_TOS:
- if( optlen < (socklen_t)sizeof(int) ) {
- err = EINVAL;
- }
- break;
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", s, optname));
- err = ENOPROTOOPT;
- } /* switch */
- break;
-
-/* Level: IPPROTO_TCP */
- case IPPROTO_TCP:
- if( optlen < (socklen_t)sizeof(int) ) {
- err = EINVAL;
- break;
- }
-
- /* If this is no TCP socket, ignore any options. */
- if ( sock->conn->type != NETCONN_TCP ) return 0;
-
- switch( optname ) {
- case TCP_NODELAY:
- case TCP_KEEPALIVE:
- break;
-
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", s, optname));
- err = ENOPROTOOPT;
- } /* switch */
- break;
-
-/* UNDEFINED LEVEL */
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", s, level, optname));
- err = ENOPROTOOPT;
- } /* switch */
-
-
- if( 0 != err ) {
- sock_set_errno(sock, err);
- return -1;
- }
-
-
-
- /* Now do the actual option processing */
-
- switch(level) {
-
-/* Level: SOL_SOCKET */
- case SOL_SOCKET:
- switch(optname) {
-
- /* The option flags */
- case SO_BROADCAST:
- /* UNIMPL case SO_DEBUG: */
- /* UNIMPL case SO_DONTROUTE: */
- case SO_KEEPALIVE:
- /* UNIMPL case SO_OOBINCLUDE: */
-#if SO_REUSE
- case SO_REUSEADDR:
- case SO_REUSEPORT:
-#endif /* SO_REUSE */
- /* UNIMPL case SO_USELOOPBACK: */
- if ( *(int*)optval ) {
- sock->conn->pcb.tcp->so_options |= optname;
- } else {
- sock->conn->pcb.tcp->so_options &= ~optname;
- }
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, optname=0x%x, ..) -> %s\n", s, optname, (*(int*)optval?"on":"off")));
- break;
- } /* switch */
- break;
-
-/* Level: IPPROTO_IP */
- case IPPROTO_IP:
- switch( optname ) {
- case IP_TTL:
- sock->conn->pcb.tcp->ttl = (u8_t)(*(int*)optval);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TTL, ..) -> %u\n", s, sock->conn->pcb.tcp->ttl));
- break;
- case IP_TOS:
- sock->conn->pcb.tcp->tos = (u8_t)(*(int*)optval);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TOS, ..)-> %u\n", s, sock->conn->pcb.tcp->tos));
- break;
- } /* switch */
- break;
-
-/* Level: IPPROTO_TCP */
- case IPPROTO_TCP:
- switch( optname ) {
- case TCP_NODELAY:
- if ( *(int*)optval ) {
- sock->conn->pcb.tcp->flags |= TF_NODELAY;
- } else {
- sock->conn->pcb.tcp->flags &= ~TF_NODELAY;
- }
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\n", s, (*(int *)optval)?"on":"off") );
- break;
- case TCP_KEEPALIVE:
- sock->conn->pcb.tcp->keepalive = (u32_t)(*(int*)optval);
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %lu\n", s, sock->conn->pcb.tcp->keepalive));
- break;
- } /* switch */
- break;
- } /* switch */
-
- sock_set_errno(sock, err);
- return err ? -1 : 0;
-}
-
-int lwip_ioctl(int s, long cmd, void *argp)
-{
- struct lwip_socket *sock = get_socket(s);
-
- if(!sock) {
- set_errno(EBADF);
- return -1;
- }
-
- switch (cmd) {
- case FIONREAD:
- if (!argp) {
- sock_set_errno(sock, EINVAL);
- return -1;
- }
-
- *((u16_t*)argp) = sock->conn->recv_avail;
-
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %u\n", s, argp, *((u16_t*)argp)));
- sock_set_errno(sock, 0);
- return 0;
-
- case FIONBIO:
- if (argp && *(u32_t*)argp)
- sock->flags |= O_NONBLOCK;
- else
- sock->flags &= ~O_NONBLOCK;
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, !!(sock->flags & O_NONBLOCK)));
- sock_set_errno(sock, 0);
- return 0;
-
- default:
- LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp));
- sock_set_errno(sock, ENOSYS); /* not yet implemented */
- return -1;
- }
-}
-
diff --git a/src/VBox/Devices/Network/lwip/src/api/tcpip.c b/src/VBox/Devices/Network/lwip/src/api/tcpip.c
deleted file mode 100644
index 8dc2e10..0000000
--- a/src/VBox/Devices/Network/lwip/src/api/tcpip.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/sys.h"
-
-#include "lwip/memp.h"
-#include "lwip/pbuf.h"
-
-#include "lwip/ip.h"
-#include "lwip/ip_frag.h"
-#include "lwip/udp.h"
-#include "lwip/tcp.h"
-
-#include "lwip/tcpip.h"
-
-static void (* tcpip_init_done)(void *arg) = NULL;
-static void *tcpip_init_done_arg;
-static sys_mbox_t mbox;
-
-#if LWIP_TCP
-static int tcpip_tcp_timer_active = 0;
-
-static void
-tcpip_tcp_timer(void *arg)
-{
- (void)arg;
-
- /* call TCP timer handler */
- tcp_tmr();
- /* timer still needed? */
- if (tcp_active_pcbs || tcp_tw_pcbs) {
- /* restart timer */
- sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
- } else {
- /* disable timer */
- tcpip_tcp_timer_active = 0;
- }
-}
-
-#if !NO_SYS
-void
-tcp_timer_needed(void)
-{
- /* timer is off but needed again? */
- if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {
- /* enable and start timer */
- tcpip_tcp_timer_active = 1;
- sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);
- }
-}
-#endif /* !NO_SYS */
-#endif /* LWIP_TCP */
-
-#if IP_REASSEMBLY
-static void
-ip_timer(void *data)
-{
- LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip: ip_reass_tmr()\n"));
- ip_reass_tmr();
- sys_timeout(1000, ip_timer, NULL);
-}
-#endif
-
-static void
-tcpip_thread(void *arg)
-{
- struct tcpip_msg *msg;
-
- (void)arg;
-
- ip_init();
-#if LWIP_UDP
- udp_init();
-#endif
-#if LWIP_TCP
- tcp_init();
-#endif
-#if IP_REASSEMBLY
- sys_timeout(1000, ip_timer, NULL);
-#endif
- if (tcpip_init_done != NULL) {
- tcpip_init_done(tcpip_init_done_arg);
- }
-
- while (1) { /* MAIN Loop */
- sys_mbox_fetch(mbox, (void *)&msg);
- switch (msg->type) {
- case TCPIP_MSG_API:
- LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg));
- api_msg_input(msg->msg.apimsg);
- break;
- case TCPIP_MSG_INPUT:
- LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: IP packet %p\n", (void *)msg));
- ip_input(msg->msg.inp.p, msg->msg.inp.netif);
- break;
- case TCPIP_MSG_CALLBACK:
- LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg));
- msg->msg.cb.f(msg->msg.cb.ctx);
- break;
- default:
- break;
- }
-#ifdef VBOX
- if (msg->type == TCPIP_MSG_TERM)
- {
- memp_free(MEMP_TCPIP_MSG, msg);
- break;
- }
-#endif
- memp_free(MEMP_TCPIP_MSG, msg);
- }
-#ifdef VBOX
- if (tcpip_init_done != NULL) {
- tcpip_init_done(tcpip_init_done_arg);
- }
-#endif
-}
-
-err_t
-tcpip_input(struct pbuf *p, struct netif *inp)
-{
- struct tcpip_msg *msg;
-
- msg = memp_malloc(MEMP_TCPIP_MSG);
- if (msg == NULL) {
- pbuf_free(p);
- return ERR_MEM;
- }
-
- msg->type = TCPIP_MSG_INPUT;
- msg->msg.inp.p = p;
- msg->msg.inp.netif = inp;
- sys_mbox_post(mbox, msg);
- return ERR_OK;
-}
-
-err_t
-tcpip_callback(void (*f)(void *ctx), void *ctx)
-{
- struct tcpip_msg *msg;
-
- msg = memp_malloc(MEMP_TCPIP_MSG);
- if (msg == NULL) {
- return ERR_MEM;
- }
-
- msg->type = TCPIP_MSG_CALLBACK;
- msg->msg.cb.f = f;
- msg->msg.cb.ctx = ctx;
- sys_mbox_post(mbox, msg);
- return ERR_OK;
-}
-
-void
-tcpip_apimsg(struct api_msg *apimsg)
-{
- struct tcpip_msg *msg;
- msg = memp_malloc(MEMP_TCPIP_MSG);
- if (msg == NULL) {
- memp_free(MEMP_API_MSG, apimsg);
- return;
- }
- msg->type = TCPIP_MSG_API;
- msg->msg.apimsg = apimsg;
- sys_mbox_post(mbox, msg);
-}
-
-#ifdef VBOX
-void
-tcpip_terminate(void)
-{
- struct tcpip_msg *msg;
- msg = memp_malloc(MEMP_TCPIP_MSG);
- if (msg == NULL) {
- return;
- }
- msg->type = TCPIP_MSG_TERM;
- sys_mbox_post(mbox, msg);
-}
-#endif
-
-void
-tcpip_init(void (* initfunc)(void *), void *arg)
-{
- tcpip_init_done = initfunc;
- tcpip_init_done_arg = arg;
- mbox = sys_mbox_new();
- sys_thread_new(tcpip_thread, NULL, TCPIP_THREAD_PRIO);
-}
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/dhcp.c b/src/VBox/Devices/Network/lwip/src/core/dhcp.c
deleted file mode 100644
index 2dabd4f..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/dhcp.c
+++ /dev/null
@@ -1,1464 +0,0 @@
-/**
- * @file
- *
- * Dynamic Host Configuration Protocol client
- */
-
-/*
- *
- * Copyright (c) 2001-2004 Leon Woestenberg <leon.woestenberg at gmx.net>
- * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is a contribution to the lwIP TCP/IP stack.
- * The Swedish Institute of Computer Science and Adam Dunkels
- * are specifically granted permission to redistribute this
- * source code.
- *
- * Author: Leon Woestenberg <leon.woestenberg at gmx.net>
- *
- * This is a DHCP client for the lwIP TCP/IP stack. It aims to conform
- * with RFC 2131 and RFC 2132.
- *
- * TODO:
- * - Proper parsing of DHCP messages exploiting file/sname field overloading.
- * - Add JavaDoc style documentation (API, internals).
- * - Support for interfaces other than Ethernet (SLIP, PPP, ...)
- *
- * Please coordinate changes and requests with Leon Woestenberg
- * <leon.woestenberg at gmx.net>
- *
- * Integration with your code:
- *
- * In lwip/dhcp.h
- * #define DHCP_COARSE_TIMER_SECS (recommended 60 which is a minute)
- * #define DHCP_FINE_TIMER_MSECS (recommended 500 which equals TCP coarse timer)
- *
- * Then have your application call dhcp_coarse_tmr() and
- * dhcp_fine_tmr() on the defined intervals.
- *
- * dhcp_start(struct netif *netif);
- * starts a DHCP client instance which configures the interface by
- * obtaining an IP address lease and maintaining it.
- *
- * Use dhcp_release(netif) to end the lease and use dhcp_stop(netif)
- * to remove the DHCP client.
- *
- */
-
-#include <string.h>
-
-#include "lwip/stats.h"
-#include "lwip/mem.h"
-#include "lwip/udp.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/inet.h"
-#include "netif/etharp.h"
-
-#include "lwip/sys.h"
-#include "lwip/opt.h"
-#include "lwip/dhcp.h"
-
-#if LWIP_DHCP /* don't build if not configured for use in lwipopt.h */
-
-/** global transaction identifier, must be
- * unique for each DHCP request. We simply increment, starting
- * with this value (easy to match with a packet analyzer) */
-static u32_t xid = 0xABCD0000;
-
-/** DHCP client state machine functions */
-static void dhcp_handle_ack(struct netif *netif);
-static void dhcp_handle_nak(struct netif *netif);
-static void dhcp_handle_offer(struct netif *netif);
-
-static err_t dhcp_discover(struct netif *netif);
-static err_t dhcp_select(struct netif *netif);
-static void dhcp_check(struct netif *netif);
-static void dhcp_bind(struct netif *netif);
-static err_t dhcp_decline(struct netif *netif);
-static err_t dhcp_rebind(struct netif *netif);
-static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state);
-
-/** receive, unfold, parse and free incoming messages */
-static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port);
-static err_t dhcp_unfold_reply(struct dhcp *dhcp);
-static u8_t *dhcp_get_option_ptr(struct dhcp *dhcp, u8_t option_type);
-static u8_t dhcp_get_option_byte(u8_t *ptr);
-#if 0
-static u16_t dhcp_get_option_short(u8_t *ptr);
-#endif
-static u32_t dhcp_get_option_long(u8_t *ptr);
-static void dhcp_free_reply(struct dhcp *dhcp);
-
-/** set the DHCP timers */
-static void dhcp_timeout(struct netif *netif);
-static void dhcp_t1_timeout(struct netif *netif);
-static void dhcp_t2_timeout(struct netif *netif);
-
-/** build outgoing messages */
-/** create a DHCP request, fill in common headers */
-static err_t dhcp_create_request(struct netif *netif);
-/** free a DHCP request */
-static void dhcp_delete_request(struct netif *netif);
-/** add a DHCP option (type, then length in bytes) */
-static void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len);
-/** add option values */
-static void dhcp_option_byte(struct dhcp *dhcp, u8_t value);
-static void dhcp_option_short(struct dhcp *dhcp, u16_t value);
-static void dhcp_option_long(struct dhcp *dhcp, u32_t value);
-/** always add the DHCP options trailer to end and pad */
-static void dhcp_option_trailer(struct dhcp *dhcp);
-
-/**
- * Back-off the DHCP client (because of a received NAK response).
- *
- * Back-off the DHCP client because of a received NAK. Receiving a
- * NAK means the client asked for something non-sensible, for
- * example when it tries to renew a lease obtained on another network.
- *
- * We back-off and will end up restarting a fresh DHCP negotiation later.
- *
- * @param state pointer to DHCP state structure
- */
-static void dhcp_handle_nak(struct netif *netif) {
- struct dhcp *dhcp = netif->dhcp;
- u16_t msecs = 10 * 1000;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n",
- (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
- dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_handle_nak(): set request timeout %"U16_F" msecs\n", msecs));
- dhcp_set_state(dhcp, DHCP_BACKING_OFF);
-}
-
-/**
- * Checks if the offered IP address is already in use.
- *
- * It does so by sending an ARP request for the offered address and
- * entering CHECKING state. If no ARP reply is received within a small
- * interval, the address is assumed to be free for use by us.
- */
-static void dhcp_check(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- err_t result;
- u16_t msecs;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0],
- (s16_t)netif->name[1]));
- /* create an ARP query for the offered IP address, expecting that no host
- responds, as the IP address should not be in use. */
- result = etharp_query(netif, &dhcp->offered_ip_addr, NULL);
- if (result != ERR_OK) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_check: could not perform ARP query\n"));
- }
- dhcp->tries++;
- msecs = 500;
- dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_check(): set request timeout %"U16_F" msecs\n", msecs));
- dhcp_set_state(dhcp, DHCP_CHECKING);
-}
-
-/**
- * Remember the configuration offered by a DHCP server.
- *
- * @param state pointer to DHCP state structure
- */
-static void dhcp_handle_offer(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- /* obtain the server address */
- u8_t *option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_SERVER_ID);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n",
- (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
- if (option_ptr != NULL)
- {
- dhcp->server_ip_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2]));
- LWIP_DEBUGF(DHCP_DEBUG | DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n", dhcp->server_ip_addr.addr));
- /* remember offered address */
- ip_addr_set(&dhcp->offered_ip_addr, (struct ip_addr *)&dhcp->msg_in->yiaddr);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n", dhcp->offered_ip_addr.addr));
-
- dhcp_select(netif);
- }
-}
-
-/**
- * Select a DHCP server offer out of all offers.
- *
- * Simply select the first offer received.
- *
- * @param netif the netif under DHCP control
- * @return lwIP specific error (see error.h)
- */
-static err_t dhcp_select(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- err_t result;
- u32_t msecs;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
-
- /* create and initialize the DHCP message header */
- result = dhcp_create_request(netif);
- if (result == ERR_OK)
- {
- dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
- dhcp_option_byte(dhcp, DHCP_REQUEST);
-
- dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
- dhcp_option_short(dhcp, 576);
-
- /* MUST request the offered IP address */
- dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
- dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr));
-
- dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
- dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr));
-
- dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/);
- dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
- dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
- dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
- dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
-
- dhcp_option_trailer(dhcp);
- /* shrink the pbuf to the actual content length */
- pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
- /* TODO: we really should bind to a specific local interface here
- but we cannot specify an unconfigured netif as it is addressless */
- udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
- /* send broadcast to any DHCP server */
- udp_connect(dhcp->pcb, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
- udp_send(dhcp->pcb, dhcp->p_out);
- /* reconnect to any (or to server here?!) */
- udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
- dhcp_delete_request(netif);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_select: REQUESTING\n"));
- dhcp_set_state(dhcp, DHCP_REQUESTING);
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_select: could not allocate DHCP request\n"));
- }
- dhcp->tries++;
- msecs = dhcp->tries < 4 ? dhcp->tries * 1000 : 4 * 1000;
- dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_STATE, ("dhcp_select(): set request timeout %"U32_F" msecs\n", msecs));
- return result;
-}
-
-/**
- * The DHCP timer that checks for lease renewal/rebind timeouts.
- *
- */
-void dhcp_coarse_tmr()
-{
- struct netif *netif = netif_list;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_coarse_tmr()\n"));
- /* iterate through all network interfaces */
- while (netif != NULL) {
- /* only act on DHCP configured interfaces */
- if (netif->dhcp != NULL) {
- /* timer is active (non zero), and triggers (zeroes) now? */
- if (netif->dhcp->t2_timeout-- == 1) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n"));
- /* this clients' rebind timeout triggered */
- dhcp_t2_timeout(netif);
- /* timer is active (non zero), and triggers (zeroes) now */
- } else if (netif->dhcp->t1_timeout-- == 1) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_coarse_tmr(): t1 timeout\n"));
- /* this clients' renewal timeout triggered */
- dhcp_t1_timeout(netif);
- }
- }
- /* proceed to next netif */
- netif = netif->next;
- }
-}
-
-/**
- * DHCP transaction timeout handling
- *
- * A DHCP server is expected to respond within a short period of time.
- * This timer checks whether an outstanding DHCP request is timed out.
- *
- */
-void dhcp_fine_tmr()
-{
- struct netif *netif = netif_list;
- /* loop through netif's */
- while (netif != NULL) {
- /* only act on DHCP configured interfaces */
- if (netif->dhcp != NULL) {
- /* timer is active (non zero), and is about to trigger now */
- if (netif->dhcp->request_timeout > 1) {
- netif->dhcp->request_timeout--;
- }
- else if (netif->dhcp->request_timeout == 1) {
- netif->dhcp->request_timeout--;
- /* { netif->dhcp->request_timeout == 0 } */
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_fine_tmr(): request timeout\n"));
- /* this clients' request timeout triggered */
- dhcp_timeout(netif);
- }
- }
- /* proceed to next network interface */
- netif = netif->next;
- }
-}
-
-/**
- * A DHCP negotiation transaction, or ARP request, has timed out.
- *
- * The timer that was started with the DHCP or ARP request has
- * timed out, indicating no response was received in time.
- *
- * @param netif the netif under DHCP control
- *
- */
-static void dhcp_timeout(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_timeout()\n"));
- /* back-off period has passed, or server selection timed out */
- if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_timeout(): restarting discovery\n"));
- dhcp_discover(netif);
- /* receiving the requested lease timed out */
- } else if (dhcp->state == DHCP_REQUESTING) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n"));
- if (dhcp->tries <= 5) {
- dhcp_select(netif);
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_timeout(): REQUESTING, releasing, restarting\n"));
- dhcp_release(netif);
- dhcp_discover(netif);
- }
- /* received no ARP reply for the offered address (which is good) */
- } else if (dhcp->state == DHCP_CHECKING) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n"));
- if (dhcp->tries <= 1) {
- dhcp_check(netif);
- /* no ARP replies on the offered address,
- looks like the IP address is indeed free */
- } else {
- /* bind the interface to the offered address */
- dhcp_bind(netif);
- }
- }
- /* did not get response to renew request? */
- else if (dhcp->state == DHCP_RENEWING) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_timeout(): RENEWING, DHCP request timed out\n"));
- /* just retry renewal */
- /* note that the rebind timer will eventually time-out if renew does not work */
- dhcp_renew(netif);
- /* did not get response to rebind request? */
- } else if (dhcp->state == DHCP_REBINDING) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n"));
- if (dhcp->tries <= 8) {
- dhcp_rebind(netif);
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n"));
- dhcp_release(netif);
- dhcp_discover(netif);
- }
- }
-}
-
-/**
- * The renewal period has timed out.
- *
- * @param netif the netif under DHCP control
- */
-static void dhcp_t1_timeout(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_STATE, ("dhcp_t1_timeout()\n"));
- if ((dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_BOUND) || (dhcp->state == DHCP_RENEWING)) {
- /* just retry to renew - note that the rebind timer (t2) will
- * eventually time-out if renew tries fail. */
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_t1_timeout(): must renew\n"));
- dhcp_renew(netif);
- }
-}
-
-/**
- * The rebind period has timed out.
- *
- */
-static void dhcp_t2_timeout(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_t2_timeout()\n"));
- if ((dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_BOUND) || (dhcp->state == DHCP_RENEWING)) {
- /* just retry to rebind */
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_t2_timeout(): must rebind\n"));
- dhcp_rebind(netif);
- }
-}
-
-/**
- *
- * @param netif the netif under DHCP control
- */
-static void dhcp_handle_ack(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- u8_t *option_ptr;
- /* clear options we might not get from the ACK */
- dhcp->offered_sn_mask.addr = 0;
- dhcp->offered_gw_addr.addr = 0;
- dhcp->offered_bc_addr.addr = 0;
-
- /* lease time given? */
- option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_LEASE_TIME);
- if (option_ptr != NULL) {
- /* remember offered lease time */
- dhcp->offered_t0_lease = dhcp_get_option_long(option_ptr + 2);
- }
- /* renewal period given? */
- option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_T1);
- if (option_ptr != NULL) {
- /* remember given renewal period */
- dhcp->offered_t1_renew = dhcp_get_option_long(option_ptr + 2);
- } else {
- /* calculate safe periods for renewal */
- dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;
- }
-
- /* renewal period given? */
- option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_T2);
- if (option_ptr != NULL) {
- /* remember given rebind period */
- dhcp->offered_t2_rebind = dhcp_get_option_long(option_ptr + 2);
- } else {
- /* calculate safe periods for rebinding */
- dhcp->offered_t2_rebind = dhcp->offered_t0_lease;
- }
-
- /* (y)our internet address */
- ip_addr_set(&dhcp->offered_ip_addr, &dhcp->msg_in->yiaddr);
-
-/**
- * Patch #1308
- * TODO: we must check if the file field is not overloaded by DHCP options!
- */
-#if 0
- /* boot server address */
- ip_addr_set(&dhcp->offered_si_addr, &dhcp->msg_in->siaddr);
- /* boot file name */
- if (dhcp->msg_in->file[0]) {
- dhcp->boot_file_name = mem_malloc(strlen(dhcp->msg_in->file) + 1);
- strcpy(dhcp->boot_file_name, dhcp->msg_in->file);
- }
-#endif
-
- /* subnet mask */
- option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_SUBNET_MASK);
- /* subnet mask given? */
- if (option_ptr != NULL) {
- dhcp->offered_sn_mask.addr = htonl(dhcp_get_option_long(&option_ptr[2]));
- }
-
- /* gateway router */
- option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_ROUTER);
- if (option_ptr != NULL) {
- dhcp->offered_gw_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2]));
- }
-
- /* broadcast address */
- option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_BROADCAST);
- if (option_ptr != NULL) {
- dhcp->offered_bc_addr.addr = htonl(dhcp_get_option_long(&option_ptr[2]));
- }
-
- /* DNS servers */
- option_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_DNS_SERVER);
- if (option_ptr != NULL) {
- u8_t n;
- dhcp->dns_count = dhcp_get_option_byte(&option_ptr[1]) / (u32_t)sizeof(struct ip_addr);
- /* limit to at most DHCP_MAX_DNS DNS servers */
- if (dhcp->dns_count > DHCP_MAX_DNS)
- dhcp->dns_count = DHCP_MAX_DNS;
- for (n = 0; n < dhcp->dns_count; n++) {
- dhcp->offered_dns_addr[n].addr = htonl(dhcp_get_option_long(&option_ptr[2 + n * 4]));
- }
- }
-}
-
-/**
- * Start DHCP negotiation for a network interface.
- *
- * If no DHCP client instance was attached to this interface,
- * a new client is created first. If a DHCP client instance
- * was already present, it restarts negotiation.
- *
- * @param netif The lwIP network interface
- * @return lwIP error code
- * - ERR_OK - No error
- * - ERR_MEM - Out of memory
- *
- */
-err_t dhcp_start(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- err_t result = ERR_OK;
-
- LWIP_ASSERT("netif != NULL", netif != NULL);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
- netif->flags &= ~NETIF_FLAG_DHCP;
-
- /* no DHCP client attached yet? */
- if (dhcp == NULL) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_start(): starting new DHCP client\n"));
- dhcp = mem_malloc(sizeof(struct dhcp));
- if (dhcp == NULL) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n"));
- return ERR_MEM;
- }
- /* store this dhcp client in the netif */
- netif->dhcp = dhcp;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_start(): allocated dhcp"));
- /* already has DHCP client attached */
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE | 3, ("dhcp_start(): restarting DHCP configuration\n"));
- }
-
- /* clear data structure */
- memset(dhcp, 0, sizeof(struct dhcp));
- /* allocate UDP PCB */
- dhcp->pcb = udp_new();
- if (dhcp->pcb == NULL) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_start(): could not obtain pcb\n"));
- mem_free((void *)dhcp);
- netif->dhcp = dhcp = NULL;
- return ERR_MEM;
- }
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n"));
- /* (re)start the DHCP negotiation */
- result = dhcp_discover(netif);
- if (result != ERR_OK) {
- /* free resources allocated above */
- dhcp_stop(netif);
- return ERR_MEM;
- }
- netif->flags |= NETIF_FLAG_DHCP;
- return result;
-}
-
-/**
- * Inform a DHCP server of our manual configuration.
- *
- * This informs DHCP servers of our fixed IP address configuration
- * by sending an INFORM message. It does not involve DHCP address
- * configuration, it is just here to be nice to the network.
- *
- * @param netif The lwIP network interface
- *
- */
-void dhcp_inform(struct netif *netif)
-{
- struct dhcp *dhcp;
- err_t result = ERR_OK;
- dhcp = mem_malloc(sizeof(struct dhcp));
- if (dhcp == NULL) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_inform(): could not allocate dhcp\n"));
- return;
- }
- netif->dhcp = dhcp;
- memset(dhcp, 0, sizeof(struct dhcp));
-
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_inform(): allocated dhcp\n"));
- dhcp->pcb = udp_new();
- if (dhcp->pcb == NULL) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_inform(): could not obtain pcb"));
- mem_free((void *)dhcp);
- return;
- }
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_inform(): created new udp pcb\n"));
- /* create and initialize the DHCP message header */
- result = dhcp_create_request(netif);
- if (result == ERR_OK) {
-
- dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
- dhcp_option_byte(dhcp, DHCP_INFORM);
-
- dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
- /* TODO: use netif->mtu ?! */
- dhcp_option_short(dhcp, 576);
-
- dhcp_option_trailer(dhcp);
-
- pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
- udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
- udp_connect(dhcp->pcb, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_inform: INFORMING\n"));
- udp_send(dhcp->pcb, dhcp->p_out);
- udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
- dhcp_delete_request(netif);
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_inform: could not allocate DHCP request\n"));
- }
-
- if (dhcp != NULL)
- {
- if (dhcp->pcb != NULL) udp_remove(dhcp->pcb);
- dhcp->pcb = NULL;
- mem_free((void *)dhcp);
- netif->dhcp = NULL;
- }
-}
-
-#if DHCP_DOES_ARP_CHECK
-/**
- * Match an ARP reply with the offered IP address.
- *
- * @param addr The IP address we received a reply from
- *
- */
-void dhcp_arp_reply(struct netif *netif, struct ip_addr *addr)
-{
- LWIP_ASSERT("netif != NULL", netif != NULL);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_arp_reply()\n"));
- /* is a DHCP client doing an ARP check? */
- if ((netif->dhcp != NULL) && (netif->dhcp->state == DHCP_CHECKING)) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n", addr->addr));
- /* did a host respond with the address we
- were offered by the DHCP server? */
- if (ip_addr_cmp(addr, &netif->dhcp->offered_ip_addr)) {
- /* we will not accept the offered address */
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE | 1, ("dhcp_arp_reply(): arp reply matched with offered address, declining\n"));
- dhcp_decline(netif);
- }
- }
-}
-
-/**
- * Decline an offered lease.
- *
- * Tell the DHCP server we do not accept the offered address.
- * One reason to decline the lease is when we find out the address
- * is already in use by another host (through ARP).
- */
-static err_t dhcp_decline(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- err_t result = ERR_OK;
- u16_t msecs;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_decline()\n"));
- dhcp_set_state(dhcp, DHCP_BACKING_OFF);
- /* create and initialize the DHCP message header */
- result = dhcp_create_request(netif);
- if (result == ERR_OK)
- {
- dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
- dhcp_option_byte(dhcp, DHCP_DECLINE);
-
- dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
- dhcp_option_short(dhcp, 576);
-
- dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
- dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr));
-
- dhcp_option_trailer(dhcp);
- /* resize pbuf to reflect true size of options */
- pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
- udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
- /* @todo: should we really connect here? we are performing sendto() */
- udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
- /* per section 4.4.4, broadcast DECLINE messages */
- udp_sendto(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
- dhcp_delete_request(netif);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_decline: BACKING OFF\n"));
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_decline: could not allocate DHCP request\n"));
- }
- dhcp->tries++;
- msecs = 10*1000;
- dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs));
- return result;
-}
-#endif
-
-
-/**
- * Start the DHCP process, discover a DHCP server.
- *
- */
-static err_t dhcp_discover(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- err_t result = ERR_OK;
- u16_t msecs;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_discover()\n"));
- ip_addr_set(&dhcp->offered_ip_addr, IP_ADDR_ANY);
- /* create and initialize the DHCP message header */
- result = dhcp_create_request(netif);
- if (result == ERR_OK)
- {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: making request\n"));
- dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
- dhcp_option_byte(dhcp, DHCP_DISCOVER);
-
- dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
- dhcp_option_short(dhcp, 576);
-
- dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/);
- dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK);
- dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER);
- dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST);
- dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER);
-
- dhcp_option_trailer(dhcp);
-
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: realloc()ing\n"));
- pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
- /* set receive callback function with netif as user data */
- udp_recv(dhcp->pcb, dhcp_recv, netif);
- udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
- udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n"));
- udp_sendto(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_discover: deleting()ing\n"));
- dhcp_delete_request(netif);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_discover: SELECTING\n"));
- dhcp_set_state(dhcp, DHCP_SELECTING);
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_discover: could not allocate DHCP request\n"));
- }
- dhcp->tries++;
- msecs = dhcp->tries < 4 ? (dhcp->tries + 1) * 1000 : 10 * 1000;
- dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs));
- return result;
-}
-
-
-/**
- * Bind the interface to the offered IP address.
- *
- * @param netif network interface to bind to the offered address
- */
-static void dhcp_bind(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- struct ip_addr sn_mask, gw_addr;
- LWIP_ASSERT("dhcp_bind: netif != NULL", netif != NULL);
- LWIP_ASSERT("dhcp_bind: dhcp != NULL", dhcp != NULL);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));
-
- /* temporary DHCP lease? */
- if (dhcp->offered_t1_renew != 0xffffffffUL) {
- /* set renewal period timer */
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew));
- dhcp->t1_timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
- if (dhcp->t1_timeout == 0) dhcp->t1_timeout = 1;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000));
- }
- /* set renewal period timer */
- if (dhcp->offered_t2_rebind != 0xffffffffUL) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind));
- dhcp->t2_timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;
- if (dhcp->t2_timeout == 0) dhcp->t2_timeout = 1;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000));
- }
- /* copy offered network mask */
- ip_addr_set(&sn_mask, &dhcp->offered_sn_mask);
-
- /* subnet mask not given? */
- /* TODO: this is not a valid check. what if the network mask is 0? */
- if (sn_mask.addr == 0) {
- /* choose a safe subnet mask given the network class */
- u8_t first_octet = ip4_addr1(&sn_mask);
- if (first_octet <= 127) sn_mask.addr = htonl(0xff000000);
- else if (first_octet >= 192) sn_mask.addr = htonl(0xffffff00);
- else sn_mask.addr = htonl(0xffff0000);
- }
-
- ip_addr_set(&gw_addr, &dhcp->offered_gw_addr);
- /* gateway address not given? */
- if (gw_addr.addr == 0) {
- /* copy network address */
- gw_addr.addr = (dhcp->offered_ip_addr.addr & sn_mask.addr);
- /* use first host address on network as gateway */
- gw_addr.addr |= htonl(0x00000001);
- }
-
- LWIP_DEBUGF(DHCP_DEBUG | DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F"\n", dhcp->offered_ip_addr.addr));
- netif_set_ipaddr(netif, &dhcp->offered_ip_addr);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_STATE, ("dhcp_bind(): SN: 0x%08"X32_F"\n", sn_mask.addr));
- netif_set_netmask(netif, &sn_mask);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_STATE, ("dhcp_bind(): GW: 0x%08"X32_F"\n", gw_addr.addr));
- netif_set_gw(netif, &gw_addr);
- /* bring the interface up */
- netif_set_up(netif);
- /* netif is now bound to DHCP leased address */
- dhcp_set_state(dhcp, DHCP_BOUND);
-}
-
-/**
- * Renew an existing DHCP lease at the involved DHCP server.
- *
- * @param netif network interface which must renew its lease
- */
-err_t dhcp_renew(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- err_t result;
- u16_t msecs;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_renew()\n"));
- dhcp_set_state(dhcp, DHCP_RENEWING);
-
- /* create and initialize the DHCP message header */
- result = dhcp_create_request(netif);
- if (result == ERR_OK) {
-
- dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
- dhcp_option_byte(dhcp, DHCP_REQUEST);
-
- dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
- /* TODO: use netif->mtu in some way */
- dhcp_option_short(dhcp, 576);
-
-#if 0
- dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
- dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr));
-#endif
-
-#if 0
- dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
- dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr));
-#endif
- /* append DHCP message trailer */
- dhcp_option_trailer(dhcp);
-
- pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
- udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
- udp_connect(dhcp->pcb, &dhcp->server_ip_addr, DHCP_SERVER_PORT);
- udp_send(dhcp->pcb, dhcp->p_out);
- dhcp_delete_request(netif);
-
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_renew: RENEWING\n"));
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_renew: could not allocate DHCP request\n"));
- }
- dhcp->tries++;
- /* back-off on retries, but to a maximum of 20 seconds */
- msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;
- dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs));
- return result;
-}
-
-/**
- * Rebind with a DHCP server for an existing DHCP lease.
- *
- * @param netif network interface which must rebind with a DHCP server
- */
-static err_t dhcp_rebind(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- err_t result;
- u16_t msecs;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_rebind()\n"));
- dhcp_set_state(dhcp, DHCP_REBINDING);
-
- /* create and initialize the DHCP message header */
- result = dhcp_create_request(netif);
- if (result == ERR_OK)
- {
-
- dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
- dhcp_option_byte(dhcp, DHCP_REQUEST);
-
- dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);
- dhcp_option_short(dhcp, 576);
-
-#if 0
- dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);
- dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr));
-
- dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);
- dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr));
-#endif
-
- dhcp_option_trailer(dhcp);
-
- pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
- /* set remote IP association to any DHCP server */
- udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
- udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
- /* broadcast to server */
- udp_sendto(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT);
- dhcp_delete_request(netif);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_rebind: REBINDING\n"));
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_rebind: could not allocate DHCP request\n"));
- }
- dhcp->tries++;
- msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
- dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs));
- return result;
-}
-
-/**
- * Release a DHCP lease.
- *
- * @param netif network interface which must release its lease
- */
-err_t dhcp_release(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- err_t result;
- u16_t msecs;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_release()\n"));
-
- /* idle DHCP client */
- dhcp_set_state(dhcp, DHCP_OFF);
- /* clean old DHCP offer */
- dhcp->server_ip_addr.addr = 0;
- dhcp->offered_ip_addr.addr = dhcp->offered_sn_mask.addr = 0;
- dhcp->offered_gw_addr.addr = dhcp->offered_bc_addr.addr = 0;
- dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;
- dhcp->dns_count = 0;
-
- /* create and initialize the DHCP message header */
- result = dhcp_create_request(netif);
- if (result == ERR_OK) {
- dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);
- dhcp_option_byte(dhcp, DHCP_RELEASE);
-
- dhcp_option_trailer(dhcp);
-
- pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);
-
- udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
- udp_connect(dhcp->pcb, &dhcp->server_ip_addr, DHCP_SERVER_PORT);
- udp_send(dhcp->pcb, dhcp->p_out);
- dhcp_delete_request(netif);
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n"));
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_release: could not allocate DHCP request\n"));
- }
- dhcp->tries++;
- msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;
- dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | DBG_STATE, ("dhcp_release(): set request timeout %"U16_F" msecs\n", msecs));
- /* bring the interface down */
- netif_set_down(netif);
- /* remove IP address from interface */
- netif_set_ipaddr(netif, IP_ADDR_ANY);
- netif_set_gw(netif, IP_ADDR_ANY);
- netif_set_netmask(netif, IP_ADDR_ANY);
-
- /* TODO: netif_down(netif); */
- return result;
-}
-/**
- * Remove the DHCP client from the interface.
- *
- * @param netif The network interface to stop DHCP on
- */
-void dhcp_stop(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- LWIP_ASSERT("dhcp_stop: netif != NULL", netif != NULL);
-
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_stop()\n"));
- /* netif is DHCP configured? */
- if (dhcp != NULL)
- {
- if (dhcp->pcb != NULL)
- {
- udp_remove(dhcp->pcb);
- dhcp->pcb = NULL;
- }
- if (dhcp->p != NULL)
- {
- pbuf_free(dhcp->p);
- dhcp->p = NULL;
- }
- /* free unfolded reply */
- dhcp_free_reply(dhcp);
- mem_free((void *)dhcp);
- netif->dhcp = NULL;
- }
-}
-
-/*
- * Set the DHCP state of a DHCP client.
- *
- * If the state changed, reset the number of tries.
- *
- * TODO: we might also want to reset the timeout here?
- */
-static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state)
-{
- if (new_state != dhcp->state)
- {
- dhcp->state = new_state;
- dhcp->tries = 0;
- }
-}
-
-/*
- * Concatenate an option type and length field to the outgoing
- * DHCP message.
- *
- */
-static void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)
-{
- LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN);
- dhcp->msg_out->options[dhcp->options_out_len++] = option_type;
- dhcp->msg_out->options[dhcp->options_out_len++] = option_len;
-}
-/*
- * Concatenate a single byte to the outgoing DHCP message.
- *
- */
-static void dhcp_option_byte(struct dhcp *dhcp, u8_t value)
-{
- LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN);
- dhcp->msg_out->options[dhcp->options_out_len++] = value;
-}
-static void dhcp_option_short(struct dhcp *dhcp, u16_t value)
-{
- LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN);
- dhcp->msg_out->options[dhcp->options_out_len++] = (value & 0xff00U) >> 8;
- dhcp->msg_out->options[dhcp->options_out_len++] = value & 0x00ffU;
-}
-static void dhcp_option_long(struct dhcp *dhcp, u32_t value)
-{
- LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN);
- dhcp->msg_out->options[dhcp->options_out_len++] = (value & 0xff000000UL) >> 24;
- dhcp->msg_out->options[dhcp->options_out_len++] = (value & 0x00ff0000UL) >> 16;
- dhcp->msg_out->options[dhcp->options_out_len++] = (value & 0x0000ff00UL) >> 8;
- dhcp->msg_out->options[dhcp->options_out_len++] = (value & 0x000000ffUL);
-}
-
-/**
- * Extract the DHCP message and the DHCP options.
- *
- * Extract the DHCP message and the DHCP options, each into a contiguous
- * piece of memory. As a DHCP message is variable sized by its options,
- * and also allows overriding some fields for options, the easy approach
- * is to first unfold the options into a conitguous piece of memory, and
- * use that further on.
- *
- */
-static err_t dhcp_unfold_reply(struct dhcp *dhcp)
-{
- struct pbuf *p = dhcp->p;
- u8_t *ptr;
- u16_t i;
- u16_t j = 0;
- LWIP_ASSERT("dhcp->p != NULL", dhcp->p != NULL);
- /* free any left-overs from previous unfolds */
- dhcp_free_reply(dhcp);
- /* options present? */
- if (dhcp->p->tot_len > (sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN))
- {
- dhcp->options_in_len = dhcp->p->tot_len - (sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN);
- dhcp->options_in = mem_malloc(dhcp->options_in_len);
- if (dhcp->options_in == NULL)
- {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_unfold_reply(): could not allocate dhcp->options\n"));
- return ERR_MEM;
- }
- }
- dhcp->msg_in = mem_malloc(sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN);
- if (dhcp->msg_in == NULL)
- {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_unfold_reply(): could not allocate dhcp->msg_in\n"));
- mem_free((void *)dhcp->options_in);
- dhcp->options_in = NULL;
- return ERR_MEM;
- }
-
- ptr = (u8_t *)dhcp->msg_in;
- /* proceed through struct dhcp_msg */
- for (i = 0; i < sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN; i++)
- {
- *ptr++ = ((u8_t *)p->payload)[j++];
- /* reached end of pbuf? */
- if (j == p->len)
- {
- /* proceed to next pbuf in chain */
- p = p->next;
- j = 0;
- }
- }
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_unfold_reply(): copied %"U16_F" bytes into dhcp->msg_in[]\n", i));
- if (dhcp->options_in != NULL) {
- ptr = (u8_t *)dhcp->options_in;
- /* proceed through options */
- for (i = 0; i < dhcp->options_in_len; i++) {
- *ptr++ = ((u8_t *)p->payload)[j++];
- /* reached end of pbuf? */
- if (j == p->len) {
- /* proceed to next pbuf in chain */
- p = p->next;
- j = 0;
- }
- }
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("dhcp_unfold_reply(): copied %"U16_F" bytes to dhcp->options_in[]\n", i));
- }
- return ERR_OK;
-}
-
-/**
- * Free the incoming DHCP message including contiguous copy of
- * its DHCP options.
- *
- */
-static void dhcp_free_reply(struct dhcp *dhcp)
-{
- if (dhcp->msg_in != NULL) {
- mem_free((void *)dhcp->msg_in);
- dhcp->msg_in = NULL;
- }
- if (dhcp->options_in) {
- mem_free((void *)dhcp->options_in);
- dhcp->options_in = NULL;
- dhcp->options_in_len = 0;
- }
- LWIP_DEBUGF(DHCP_DEBUG, ("dhcp_free_reply(): free'd\n"));
-}
-
-
-/**
- * If an incoming DHCP message is in response to us, then trigger the state machine
- */
-static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
-{
- struct netif *netif = (struct netif *)arg;
- struct dhcp *dhcp = netif->dhcp;
- struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload;
- u8_t *options_ptr;
- u8_t msg_type;
- u8_t i;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 3, ("dhcp_recv(pbuf = %p) from DHCP server %"U16_F".%"U16_F".%"U16_F".%"U16_F" port %"U16_F"\n", (void*)p,
- (u16_t)(ntohl(addr->addr) >> 24 & 0xff), (u16_t)(ntohl(addr->addr) >> 16 & 0xff),
- (u16_t)(ntohl(addr->addr) >> 8 & 0xff), (u16_t)(ntohl(addr->addr) & 0xff), port));
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("pbuf->len = %"U16_F"\n", p->len));
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("pbuf->tot_len = %"U16_F"\n", p->tot_len));
- /* prevent warnings about unused arguments */
- (void)pcb; (void)addr; (void)port;
- dhcp->p = p;
- /* TODO: check packet length before reading them */
- if (reply_msg->op != DHCP_BOOTREPLY) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 1, ("not a DHCP reply message, but type %"U16_F"\n", (u16_t)reply_msg->op));
- pbuf_free(p);
- dhcp->p = NULL;
- return;
- }
- /* iterate through hardware address and match against DHCP message */
- for (i = 0; i < netif->hwaddr_len; i++) {
- if (netif->hwaddr[i] != reply_msg->chaddr[i]) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("netif->hwaddr[%"U16_F"]==%02"X16_F" != reply_msg->chaddr[%"U16_F"]==%02"X16_F"\n",
- (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));
- pbuf_free(p);
- dhcp->p = NULL;
- return;
- }
- }
- /* match transaction ID against what we expected */
- if (ntohl(reply_msg->xid) != dhcp->xid) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n",ntohl(reply_msg->xid),dhcp->xid));
- pbuf_free(p);
- dhcp->p = NULL;
- return;
- }
- /* option fields could be unfold? */
- if (dhcp_unfold_reply(dhcp) != ERR_OK) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("problem unfolding DHCP message - too short on memory?\n"));
- pbuf_free(p);
- dhcp->p = NULL;
- return;
- }
-
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n"));
- /* obtain pointer to DHCP message type */
- options_ptr = dhcp_get_option_ptr(dhcp, DHCP_OPTION_MESSAGE_TYPE);
- if (options_ptr == NULL) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 1, ("DHCP_OPTION_MESSAGE_TYPE option not found\n"));
- pbuf_free(p);
- dhcp->p = NULL;
- return;
- }
-
- /* read DHCP message type */
- msg_type = dhcp_get_option_byte(options_ptr + 2);
- /* message type is DHCP ACK? */
- if (msg_type == DHCP_ACK) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 1, ("DHCP_ACK received\n"));
- /* in requesting state? */
- if (dhcp->state == DHCP_REQUESTING) {
- dhcp_handle_ack(netif);
- dhcp->request_timeout = 0;
-#if DHCP_DOES_ARP_CHECK
- /* check if the acknowledged lease address is already in use */
- dhcp_check(netif);
-#else
- /* bind interface to the acknowledged lease address */
- dhcp_bind(netif);
-#endif
- }
- /* already bound to the given lease address? */
- else if ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING)) {
- dhcp->request_timeout = 0;
- dhcp_bind(netif);
- }
- }
- /* received a DHCP_NAK in appropriate state? */
- else if ((msg_type == DHCP_NAK) &&
- ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REQUESTING) ||
- (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING ))) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 1, ("DHCP_NAK received\n"));
- dhcp->request_timeout = 0;
- dhcp_handle_nak(netif);
- }
- /* received a DHCP_OFFER in DHCP_SELECTING state? */
- else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 1, ("DHCP_OFFER received in DHCP_SELECTING state\n"));
- dhcp->request_timeout = 0;
- /* remember offered lease */
- dhcp_handle_offer(netif);
- }
- pbuf_free(p);
- dhcp->p = NULL;
-}
-
-
-static err_t dhcp_create_request(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- u16_t i;
- LWIP_ASSERT("dhcp_create_request: dhcp->p_out == NULL", dhcp->p_out == NULL);
- LWIP_ASSERT("dhcp_create_request: dhcp->msg_out == NULL", dhcp->msg_out == NULL);
- dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);
- if (dhcp->p_out == NULL) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("dhcp_create_request(): could not allocate pbuf\n"));
- return ERR_MEM;
- }
- /* give unique transaction identifier to this request */
- dhcp->xid = xid++;
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("transaction id xid++(%"X32_F") dhcp->xid(%"U32_F")\n",xid,dhcp->xid));
-
- dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;
-
- dhcp->msg_out->op = DHCP_BOOTREQUEST;
- /* TODO: make link layer independent */
- dhcp->msg_out->htype = DHCP_HTYPE_ETH;
- /* TODO: make link layer independent */
- dhcp->msg_out->hlen = DHCP_HLEN_ETH;
- dhcp->msg_out->hops = 0;
- dhcp->msg_out->xid = htonl(dhcp->xid);
- dhcp->msg_out->secs = 0;
- dhcp->msg_out->flags = 0;
- dhcp->msg_out->ciaddr.addr = netif->ip_addr.addr;
- dhcp->msg_out->yiaddr.addr = 0;
- dhcp->msg_out->siaddr.addr = 0;
- dhcp->msg_out->giaddr.addr = 0;
- for (i = 0; i < DHCP_CHADDR_LEN; i++) {
- /* copy netif hardware address, pad with zeroes */
- dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/;
- }
- for (i = 0; i < DHCP_SNAME_LEN; i++) dhcp->msg_out->sname[i] = 0;
- for (i = 0; i < DHCP_FILE_LEN; i++) dhcp->msg_out->file[i] = 0;
- dhcp->msg_out->cookie = htonl(0x63825363UL);
- dhcp->options_out_len = 0;
- /* fill options field with an incrementing array (for debugging purposes) */
- for (i = 0; i < DHCP_OPTIONS_LEN; i++) dhcp->msg_out->options[i] = i;
- return ERR_OK;
-}
-
-static void dhcp_delete_request(struct netif *netif)
-{
- struct dhcp *dhcp = netif->dhcp;
- LWIP_ASSERT("dhcp_free_msg: dhcp->p_out != NULL", dhcp->p_out != NULL);
- LWIP_ASSERT("dhcp_free_msg: dhcp->msg_out != NULL", dhcp->msg_out != NULL);
- pbuf_free(dhcp->p_out);
- dhcp->p_out = NULL;
- dhcp->msg_out = NULL;
-}
-
-/**
- * Add a DHCP message trailer
- *
- * Adds the END option to the DHCP message, and if
- * necessary, up to three padding bytes.
- */
-
-static void dhcp_option_trailer(struct dhcp *dhcp)
-{
- LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL);
- LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
- dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;
- /* packet is too small, or not 4 byte aligned? */
- while ((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) {
- /* LWIP_DEBUGF(DHCP_DEBUG,("dhcp_option_trailer:dhcp->options_out_len=%"U16_F", DHCP_OPTIONS_LEN=%"U16_F, dhcp->options_out_len, DHCP_OPTIONS_LEN)); */
- LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN);
- /* add a fill/padding byte */
- dhcp->msg_out->options[dhcp->options_out_len++] = 0;
- }
-}
-
-/**
- * Find the offset of a DHCP option inside the DHCP message.
- *
- * @param client DHCP client
- * @param option_type
- *
- * @return a byte offset into the UDP message where the option was found, or
- * zero if the given option was not found.
- */
-static u8_t *dhcp_get_option_ptr(struct dhcp *dhcp, u8_t option_type)
-{
- u8_t overload = DHCP_OVERLOAD_NONE;
-
- /* options available? */
- if ((dhcp->options_in != NULL) && (dhcp->options_in_len > 0)) {
- /* start with options field */
- u8_t *options = (u8_t *)dhcp->options_in;
- u16_t offset = 0;
- /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */
- while ((offset < dhcp->options_in_len) && (options[offset] != DHCP_OPTION_END)) {
- /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */
- /* are the sname and/or file field overloaded with options? */
- if (options[offset] == DHCP_OPTION_OVERLOAD) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 2, ("overloaded message detected\n"));
- /* skip option type and length */
- offset += 2;
- overload = options[offset++];
- }
- /* requested option found */
- else if (options[offset] == option_type) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("option found at offset %"U16_F" in options\n", offset));
- return &options[offset];
- /* skip option */
- } else {
- LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", options[offset]));
- /* skip option type */
- offset++;
- /* skip option length, and then length bytes */
- offset += 1 + options[offset];
- }
- }
- /* is this an overloaded message? */
- if (overload != DHCP_OVERLOAD_NONE) {
- u16_t field_len;
- if (overload == DHCP_OVERLOAD_FILE) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 1, ("overloaded file field\n"));
- options = (u8_t *)&dhcp->msg_in->file;
- field_len = DHCP_FILE_LEN;
- } else if (overload == DHCP_OVERLOAD_SNAME) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 1, ("overloaded sname field\n"));
- options = (u8_t *)&dhcp->msg_in->sname;
- field_len = DHCP_SNAME_LEN;
- /* TODO: check if else if () is necessary */
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE | 1, ("overloaded sname and file field\n"));
- options = (u8_t *)&dhcp->msg_in->sname;
- field_len = DHCP_FILE_LEN + DHCP_SNAME_LEN;
- }
- offset = 0;
-
- /* at least 1 byte to read and no end marker */
- while ((offset < field_len) && (options[offset] != DHCP_OPTION_END)) {
- if (options[offset] == option_type) {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("option found at offset=%"U16_F"\n", offset));
- return &options[offset];
- /* skip option */
- } else {
- LWIP_DEBUGF(DHCP_DEBUG | DBG_TRACE, ("skipping option %"U16_F"\n", options[offset]));
- /* skip option type */
- offset++;
- offset += 1 + options[offset];
- }
- }
- }
- }
- return NULL;
-}
-
-/**
- * Return the byte of DHCP option data.
- *
- * @param client DHCP client.
- * @param ptr pointer obtained by dhcp_get_option_ptr().
- *
- * @return byte value at the given address.
- */
-static u8_t dhcp_get_option_byte(u8_t *ptr)
-{
- LWIP_DEBUGF(DHCP_DEBUG, ("option byte value=%"U16_F"\n", (u16_t)(*ptr)));
- return *ptr;
-}
-
-#if 0
-/**
- * Return the 16-bit value of DHCP option data.
- *
- * @param client DHCP client.
- * @param ptr pointer obtained by dhcp_get_option_ptr().
- *
- * @return byte value at the given address.
- */
-static u16_t dhcp_get_option_short(u8_t *ptr)
-{
- u16_t value;
- value = *ptr++ << 8;
- value |= *ptr;
- LWIP_DEBUGF(DHCP_DEBUG, ("option short value=%"U16_F"\n", value));
- return value;
-}
-#endif
-
-/**
- * Return the 32-bit value of DHCP option data.
- *
- * @param client DHCP client.
- * @param ptr pointer obtained by dhcp_get_option_ptr().
- *
- * @return byte value at the given address.
- */
-static u32_t dhcp_get_option_long(u8_t *ptr)
-{
- u32_t value;
- value = (u32_t)(*ptr++) << 24;
- value |= (u32_t)(*ptr++) << 16;
- value |= (u32_t)(*ptr++) << 8;
- value |= (u32_t)(*ptr++);
- LWIP_DEBUGF(DHCP_DEBUG, ("option long value=%"U32_F"\n", value));
- return value;
-}
-
-#endif /* LWIP_DHCP */
diff --git a/src/VBox/Devices/Network/lwip/src/core/inet.c b/src/VBox/Devices/Network/lwip/src/core/inet.c
deleted file mode 100644
index 2c54389..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/inet.c
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-
-/* inet.c
- *
- * Functions common to all TCP/IP modules, such as the Internet checksum and the
- * byte order functions.
- *
- */
-
-
-#include "lwip/opt.h"
-
-#include "lwip/arch.h"
-
-#include "lwip/def.h"
-#include "lwip/inet.h"
-
-#include "lwip/sys.h"
-
-/* These are some reference implementations of the checksum algorithm, with the
- * aim of being simple, correct and fully portable. Checksumming is the
- * first thing you would want to optimize for your platform. If you create
- * your own version, link it in and in your sys_arch.h put:
- *
- * #define LWIP_CHKSUM <your_checksum_routine>
-*/
-#ifndef LWIP_CHKSUM
-#define LWIP_CHKSUM lwip_standard_chksum
-
-#if 1 /* Version A */
-/**
- * lwip checksum
- *
- * @param dataptr points to start of data to be summed at any boundary
- * @param len length of data to be summed
- * @return host order (!) lwip checksum (non-inverted Internet sum)
- *
- * @note accumulator size limits summable length to 64k
- * @note host endianess is irrelevant (p3 RFC1071)
- */
-static u16_t
-lwip_standard_chksum(void *dataptr, u16_t len)
-{
- u32_t acc;
- u16_t src;
- u8_t *octetptr;
-
- acc = 0;
- /* dataptr may be at odd or even addresses */
- octetptr = (u8_t*)dataptr;
- while (len > 1)
- {
- /* declare first octet as most significant
- thus assume network order, ignoring host order */
- src = (*octetptr) << 8;
- octetptr++;
- /* declare second octet as least significant */
- src |= (*octetptr);
- octetptr++;
- acc += src;
- len -= 2;
- }
- if (len > 0)
- {
- /* accumulate remaining octet */
- src = (*octetptr) << 8;
- acc += src;
- }
- /* add deferred carry bits */
- acc = (acc >> 16) + (acc & 0x0000ffffUL);
- if ((acc & 0xffff0000) != 0) {
- acc = (acc >> 16) + (acc & 0x0000ffffUL);
- }
- /* This maybe a little confusing: reorder sum using htons()
- instead of ntohs() since it has a little less call overhead.
- The caller must invert bits for Internet sum ! */
- return htons((u16_t)acc);
-}
-#endif
-
-#if 0 /* Version B */
-/*
- * Curt McDowell
- * Broadcom Corp.
- * csm at broadcom.com
- *
- * IP checksum two bytes at a time with support for
- * unaligned buffer.
- * Works for len up to and including 0x20000.
- * by Curt McDowell, Broadcom Corp. 12/08/2005
- */
-
-static u16_t
-lwip_standard_chksum(void *dataptr, int len)
-{
- u8_t *pb = dataptr;
- u16_t *ps, t = 0;
- u32_t sum = 0;
- int odd = ((u32_t)pb & 1);
-
- /* Get aligned to u16_t */
- if (odd && len > 0) {
- ((u8_t *)&t)[1] = *pb++;
- len--;
- }
-
- /* Add the bulk of the data */
- ps = (u16_t *)pb;
- while (len > 1) {
- sum += *ps++;
- len -= 2;
- }
-
- /* Consume left-over byte, if any */
- if (len > 0)
- ((u8_t *)&t)[0] = *(u8_t *)ps;;
-
- /* Add end bytes */
- sum += t;
-
- /* Fold 32-bit sum to 16 bits */
- while (sum >> 16)
- sum = (sum & 0xffff) + (sum >> 16);
-
- /* Swap if alignment was odd */
- if (odd)
- sum = ((sum & 0xff) << 8) | ((sum & 0xff00) >> 8);
-
- return sum;
-}
-#endif
-
-#if 0 /* Version C */
-/**
- * An optimized checksum routine. Basically, it uses loop-unrolling on
- * the checksum loop, treating the head and tail bytes specially, whereas
- * the inner loop acts on 8 bytes at a time.
- *
- * @arg start of buffer to be checksummed. May be an odd byte address.
- * @len number of bytes in the buffer to be checksummed.
- *
- * by Curt McDowell, Broadcom Corp. December 8th, 2005
- */
-
-static u16_t
-lwip_standard_chksum(void *dataptr, int len)
-{
- u8_t *pb = dataptr;
- u16_t *ps, t = 0;
- u32_t *pl;
- u32_t sum = 0, tmp;
- /* starts at odd byte address? */
- int odd = ((u32_t)pb & 1);
-
- if (odd && len > 0) {
- ((u8_t *)&t)[1] = *pb++;
- len--;
- }
-
- ps = (u16_t *)pb;
-
- if (((u32_t)ps & 3) && len > 1) {
- sum += *ps++;
- len -= 2;
- }
-
- pl = (u32_t *)ps;
-
- while (len > 7) {
- tmp = sum + *pl++; /* ping */
- if (tmp < sum)
- tmp++; /* add back carry */
-
- sum = tmp + *pl++; /* pong */
- if (sum < tmp)
- sum++; /* add back carry */
-
- len -= 8;
- }
-
- /* make room in upper bits */
- sum = (sum >> 16) + (sum & 0xffff);
-
- ps = (u16_t *)pl;
-
- /* 16-bit aligned word remaining? */
- while (len > 1) {
- sum += *ps++;
- len -= 2;
- }
-
- /* dangling tail byte remaining? */
- if (len > 0) /* include odd byte */
- ((u8_t *)&t)[0] = *(u8_t *)ps;
-
- sum += t; /* add end bytes */
-
- while (sum >> 16) /* combine halves */
- sum = (sum >> 16) + (sum & 0xffff);
-
- if (odd)
- sum = ((sum & 0xff) << 8) | ((sum & 0xff00) >> 8);
-
- return sum;
-}
-#endif
-
-#endif /* LWIP_CHKSUM */
-
-/* inet_chksum_pseudo:
- *
- * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain.
- */
-
-u16_t
-inet_chksum_pseudo(struct pbuf *p,
- struct ip_addr *src, struct ip_addr *dest,
- u8_t proto, u16_t proto_len)
-{
- u32_t acc;
- struct pbuf *q;
- u8_t swapped;
-
- acc = 0;
- swapped = 0;
- /* iterate through all pbuf in chain */
- for(q = p; q != NULL; q = q->next) {
- LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n",
- (void *)q, (void *)q->next));
- acc += LWIP_CHKSUM(q->payload, q->len);
- /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/
- while (acc >> 16) {
- acc = (acc & 0xffffUL) + (acc >> 16);
- }
- if (q->len % 2 != 0) {
- swapped = 1 - swapped;
- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8);
- }
- /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/
- }
-
- if (swapped) {
- acc = ((acc & 0xff) << 8) | ((acc & 0xff00UL) >> 8);
- }
- acc += (src->addr & 0xffffUL);
- acc += ((src->addr >> 16) & 0xffffUL);
- acc += (dest->addr & 0xffffUL);
- acc += ((dest->addr >> 16) & 0xffffUL);
- acc += (u32_t)htons((u16_t)proto);
- acc += (u32_t)htons(proto_len);
-
- while (acc >> 16) {
- acc = (acc & 0xffffUL) + (acc >> 16);
- }
- LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc));
- return (u16_t)~(acc & 0xffffUL);
-}
-
-/* inet_chksum:
- *
- * Calculates the Internet checksum over a portion of memory. Used primarily for IP
- * and ICMP.
- */
-
-u16_t
-inet_chksum(void *dataptr, u16_t len)
-{
- u32_t acc;
-
- acc = LWIP_CHKSUM(dataptr, len);
- while (acc >> 16) {
- acc = (acc & 0xffff) + (acc >> 16);
- }
- return (u16_t)~(acc & 0xffff);
-}
-
-u16_t
-inet_chksum_pbuf(struct pbuf *p)
-{
- u32_t acc;
- struct pbuf *q;
- u8_t swapped;
-
- acc = 0;
- swapped = 0;
- for(q = p; q != NULL; q = q->next) {
- acc += LWIP_CHKSUM(q->payload, q->len);
- while (acc >> 16) {
- acc = (acc & 0xffffUL) + (acc >> 16);
- }
- if (q->len % 2 != 0) {
- swapped = 1 - swapped;
- acc = (acc & 0x00ffUL << 8) | (acc & 0xff00UL >> 8);
- }
- }
-
- if (swapped) {
- acc = ((acc & 0x00ffUL) << 8) | ((acc & 0xff00UL) >> 8);
- }
- return (u16_t)~(acc & 0xffffUL);
-}
-
-/* Here for now until needed in other places in lwIP */
-#ifndef isprint
-#define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up)
-#define isprint(c) in_range(c, 0x20, 0x7f)
-#define isdigit(c) in_range(c, '0', '9')
-#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))
-#define islower(c) in_range(c, 'a', 'z')
-#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v')
-#endif
-
-/*
- * Ascii internet address interpretation routine.
- * The value returned is in network order.
- */
-
-u32_t
-inet_addr(const char *cp)
-{
- struct in_addr val;
-
- if (inet_aton(cp, &val)) {
- return (val.s_addr);
- }
- return (INADDR_NONE);
-}
-
-/*
- * Check whether "cp" is a valid ascii representation
- * of an Internet address and convert to a binary address.
- * Returns 1 if the address is valid, 0 if not.
- * This replaces inet_addr, the return value from which
- * cannot distinguish between failure and a local broadcast address.
- */
-int
-inet_aton(const char *cp, struct in_addr *addr)
-{
- u32_t val;
- int base, n, c;
- u32_t parts[4];
- u32_t *pp = parts;
-
- c = *cp;
- for (;;) {
- /*
- * Collect number up to ``.''.
- * Values are specified as for C:
- * 0x=hex, 0=octal, 1-9=decimal.
- */
- if (!isdigit(c))
- return (0);
- val = 0;
- base = 10;
- if (c == '0') {
- c = *++cp;
- if (c == 'x' || c == 'X') {
- base = 16;
- c = *++cp;
- } else
- base = 8;
- }
- for (;;) {
- if (isdigit(c)) {
- val = (val * base) + (int)(c - '0');
- c = *++cp;
- } else if (base == 16 && isxdigit(c)) {
- val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A'));
- c = *++cp;
- } else
- break;
- }
- if (c == '.') {
- /*
- * Internet format:
- * a.b.c.d
- * a.b.c (with c treated as 16 bits)
- * a.b (with b treated as 24 bits)
- */
- if (pp >= parts + 3)
- return (0);
- *pp++ = val;
- c = *++cp;
- } else
- break;
- }
- /*
- * Check for trailing characters.
- */
- if (c != '\0' && (!isprint(c) || !isspace(c)))
- return (0);
- /*
- * Concoct the address according to
- * the number of parts specified.
- */
- n = pp - parts + 1;
- switch (n) {
-
- case 0:
- return (0); /* initial nondigit */
-
- case 1: /* a -- 32 bits */
- break;
-
- case 2: /* a.b -- 8.24 bits */
- if (val > 0xffffff)
- return (0);
- val |= parts[0] << 24;
- break;
-
- case 3: /* a.b.c -- 8.8.16 bits */
- if (val > 0xffff)
- return (0);
- val |= (parts[0] << 24) | (parts[1] << 16);
- break;
-
- case 4: /* a.b.c.d -- 8.8.8.8 bits */
- if (val > 0xff)
- return (0);
- val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
- break;
- }
- if (addr)
- addr->s_addr = htonl(val);
- return (1);
-}
-
-/* Convert numeric IP address into decimal dotted ASCII representation.
- * returns ptr to static buffer; not reentrant!
- */
-char *
-inet_ntoa(struct in_addr addr)
-{
- static char str[16];
- u32_t s_addr = addr.s_addr;
- char inv[3];
- char *rp;
- u8_t *ap;
- u8_t rem;
- u8_t n;
- u8_t i;
-
- rp = str;
- ap = (u8_t *)&s_addr;
- for(n = 0; n < 4; n++) {
- i = 0;
- do {
- rem = *ap % (u8_t)10;
- *ap /= (u8_t)10;
- inv[i++] = '0' + rem;
- } while(*ap);
- while(i--)
- *rp++ = inv[i];
- *rp++ = '.';
- ap++;
- }
- *--rp = 0;
- return str;
-}
-
-/*
- * These are reference implementations of the byte swapping functions.
- * Again with the aim of being simple, correct and fully portable.
- * Byte swapping is the second thing you would want to optimize. You will
- * need to port it to your architecture and in your cc.h:
- *
- * #define LWIP_PLATFORM_BYTESWAP 1
- * #define LWIP_PLATFORM_HTONS(x) <your_htons>
- * #define LWIP_PLATFORM_HTONL(x) <your_htonl>
- *
- * Note ntohs() and ntohl() are merely references to the htonx counterparts.
- */
-
-#ifndef BYTE_ORDER
-#error BYTE_ORDER is not defined
-#endif
-#if (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN)
-
-u16_t
-htons(u16_t n)
-{
- return ((n & 0xff) << 8) | ((n & 0xff00) >> 8);
-}
-
-u16_t
-ntohs(u16_t n)
-{
- return htons(n);
-}
-
-u32_t
-htonl(u32_t n)
-{
- return ((n & 0xff) << 24) |
- ((n & 0xff00) << 8) |
- ((n & 0xff0000) >> 8) |
- ((n & 0xff000000) >> 24);
-}
-
-u32_t
-ntohl(u32_t n)
-{
- return htonl(n);
-}
-
-#endif /* (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) */
diff --git a/src/VBox/Devices/Network/lwip/src/core/inet6.c b/src/VBox/Devices/Network/lwip/src/core/inet6.c
deleted file mode 100644
index c04915b..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/inet6.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-
-/* inet6.c
- *
- * Functions common to all TCP/IP modules, such as the Internet checksum and the
- * byte order functions.
- *
- */
-
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-#include "lwip/inet.h"
-
-
-
-/* chksum:
- *
- * Sums up all 16 bit words in a memory portion. Also includes any odd byte.
- * This function is used by the other checksum functions.
- *
- * For now, this is not optimized. Must be optimized for the particular processor
- * arcitecture on which it is to run. Preferebly coded in assembler.
- */
-
-static u32_t
-chksum(void *dataptr, u16_t len)
-{
- u16_t *sdataptr = dataptr;
- u32_t acc;
-
-
- for(acc = 0; len > 1; len -= 2) {
- acc += *sdataptr++;
- }
-
- /* add up any odd byte */
- if (len == 1) {
- acc += htons((u16_t)(*(u8_t *)dataptr) << 8);
- }
-
- return acc;
-
-}
-
-/* inet_chksum_pseudo:
- *
- * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain.
- */
-
-u16_t
-inet_chksum_pseudo(struct pbuf *p,
- struct ip_addr *src, struct ip_addr *dest,
- u8_t proto, u32_t proto_len)
-{
- u32_t acc;
- struct pbuf *q;
- u8_t swapped, i;
-
- acc = 0;
- swapped = 0;
- for(q = p; q != NULL; q = q->next) {
- acc += chksum(q->payload, q->len);
- while (acc >> 16) {
- acc = (acc & 0xffff) + (acc >> 16);
- }
- if (q->len % 2 != 0) {
- swapped = 1 - swapped;
- acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8);
- }
- }
-
- if (swapped) {
- acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8);
- }
-
- for(i = 0; i < 8; i++) {
- acc += ((u16_t *)src->addr)[i] & 0xffff;
- acc += ((u16_t *)dest->addr)[i] & 0xffff;
- while (acc >> 16) {
- acc = (acc & 0xffff) + (acc >> 16);
- }
- }
- acc += (u16_t)htons((u16_t)proto);
- acc += ((u16_t *)&proto_len)[0] & 0xffff;
- acc += ((u16_t *)&proto_len)[1] & 0xffff;
-
- while (acc >> 16) {
- acc = (acc & 0xffff) + (acc >> 16);
- }
- return ~(acc & 0xffff);
-}
-
-/* inet_chksum:
- *
- * Calculates the Internet checksum over a portion of memory. Used primarely for IP
- * and ICMP.
- */
-
-u16_t
-inet_chksum(void *dataptr, u16_t len)
-{
- u32_t acc, sum;
-
- acc = chksum(dataptr, len);
- sum = (acc & 0xffff) + (acc >> 16);
- sum += (sum >> 16);
- return ~(sum & 0xffff);
-}
-
-u16_t
-inet_chksum_pbuf(struct pbuf *p)
-{
- u32_t acc;
- struct pbuf *q;
- u8_t swapped;
-
- acc = 0;
- swapped = 0;
- for(q = p; q != NULL; q = q->next) {
- acc += chksum(q->payload, q->len);
- while (acc >> 16) {
- acc = (acc & 0xffff) + (acc >> 16);
- }
- if (q->len % 2 != 0) {
- swapped = 1 - swapped;
- acc = (acc & 0xff << 8) | (acc & 0xff00 >> 8);
- }
- }
-
- if (swapped) {
- acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8);
- }
- return ~(acc & 0xffff);
-}
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/ipv4/icmp.c b/src/VBox/Devices/Network/lwip/src/core/ipv4/icmp.c
deleted file mode 100644
index 248f2c6..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/ipv4/icmp.c
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-/* Some ICMP messages should be passed to the transport protocols. This
- is not implemented. */
-
-#include <string.h>
-
-#include "lwip/opt.h"
-#include "lwip/icmp.h"
-#include "lwip/inet.h"
-#include "lwip/ip.h"
-#include "lwip/def.h"
-#include "lwip/stats.h"
-#include "lwip/snmp.h"
-
-void
-icmp_input(struct pbuf *p, struct netif *inp)
-{
- u8_t type;
- u8_t code;
- struct icmp_echo_hdr *iecho;
- struct ip_hdr *iphdr;
- struct ip_addr tmpaddr;
- u16_t hlen;
-
- ICMP_STATS_INC(icmp.recv);
- snmp_inc_icmpinmsgs();
-
-
- iphdr = p->payload;
- hlen = IPH_HL(iphdr) * 4;
- if (pbuf_header(p, -((s16_t)hlen)) || (p->tot_len < sizeof(u16_t)*2)) {
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len));
- pbuf_free(p);
- ICMP_STATS_INC(icmp.lenerr);
- snmp_inc_icmpinerrors();
- return;
- }
-
- type = *((u8_t *)p->payload);
- code = *(((u8_t *)p->payload)+1);
- switch (type) {
- case ICMP_ECHO:
- /* broadcast or multicast destination address? */
- if (ip_addr_isbroadcast(&iphdr->dest, inp) || ip_addr_ismulticast(&iphdr->dest)) {
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast or broadcast pings\n"));
- ICMP_STATS_INC(icmp.err);
- pbuf_free(p);
- return;
- }
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
- if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
- pbuf_free(p);
- ICMP_STATS_INC(icmp.lenerr);
- snmp_inc_icmpinerrors();
-
- return;
- }
- iecho = p->payload;
- if (inet_chksum_pbuf(p) != 0) {
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n"));
- pbuf_free(p);
- ICMP_STATS_INC(icmp.chkerr);
- snmp_inc_icmpinerrors();
- return;
- }
- tmpaddr.addr = iphdr->src.addr;
- iphdr->src.addr = iphdr->dest.addr;
- iphdr->dest.addr = tmpaddr.addr;
- ICMPH_TYPE_SET(iecho, ICMP_ER);
- /* adjust the checksum */
- if (iecho->chksum >= htons(0xffff - (ICMP_ECHO << 8))) {
- iecho->chksum += htons(ICMP_ECHO << 8) + 1;
- } else {
- iecho->chksum += htons(ICMP_ECHO << 8);
- }
- ICMP_STATS_INC(icmp.xmit);
- /* increase number of messages attempted to send */
- snmp_inc_icmpoutmsgs();
- /* increase number of echo replies attempted to send */
- snmp_inc_icmpoutechoreps();
-
- pbuf_header(p, hlen);
- ip_output_if(p, &(iphdr->src), IP_HDRINCL,
- IPH_TTL(iphdr), 0, IP_PROTO_ICMP, inp);
- break;
- default:
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n", (s16_t)type, (s16_t)code));
- ICMP_STATS_INC(icmp.proterr);
- ICMP_STATS_INC(icmp.drop);
- }
- pbuf_free(p);
-}
-
-void
-icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
-{
- struct pbuf *q;
- struct ip_hdr *iphdr;
- struct icmp_dur_hdr *idur;
-
- q = pbuf_alloc(PBUF_IP, 8 + IP_HLEN + 8, PBUF_RAM);
- /* ICMP header + IP header + 8 bytes of data */
-
- iphdr = p->payload;
-
- idur = q->payload;
- ICMPH_TYPE_SET(idur, ICMP_DUR);
- ICMPH_CODE_SET(idur, t);
-
- memcpy((u8_t *)q->payload + 8, p->payload, IP_HLEN + 8);
-
- /* calculate checksum */
- idur->chksum = 0;
- idur->chksum = inet_chksum(idur, q->len);
- ICMP_STATS_INC(icmp.xmit);
- /* increase number of messages attempted to send */
- snmp_inc_icmpoutmsgs();
- /* increase number of destination unreachable messages attempted to send */
- snmp_inc_icmpoutdestunreachs();
-
- ip_output(q, NULL, &(iphdr->src),
- ICMP_TTL, 0, IP_PROTO_ICMP);
- pbuf_free(q);
-}
-
-#if IP_FORWARD
-void
-icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t)
-{
- struct pbuf *q;
- struct ip_hdr *iphdr;
- struct icmp_te_hdr *tehdr;
-
- q = pbuf_alloc(PBUF_IP, 8 + IP_HLEN + 8, PBUF_RAM);
-
- iphdr = p->payload;
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from "));
- ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src));
- LWIP_DEBUGF(ICMP_DEBUG, (" to "));
- ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest));
- LWIP_DEBUGF(ICMP_DEBUG, ("\n"));
-
- tehdr = q->payload;
- ICMPH_TYPE_SET(tehdr, ICMP_TE);
- ICMPH_CODE_SET(tehdr, t);
-
- /* copy fields from original packet */
- memcpy((u8_t *)q->payload + 8, (u8_t *)p->payload, IP_HLEN + 8);
-
- /* calculate checksum */
- tehdr->chksum = 0;
- tehdr->chksum = inet_chksum(tehdr, q->len);
- ICMP_STATS_INC(icmp.xmit);
- /* increase number of messages attempted to send */
- snmp_inc_icmpoutmsgs();
- /* increase number of destination unreachable messages attempted to send */
- snmp_inc_icmpouttimeexcds();
- ip_output(q, NULL, &(iphdr->src),
- ICMP_TTL, 0, IP_PROTO_ICMP);
- pbuf_free(q);
-}
-
-#endif /* IP_FORWARD */
-
-
-
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/ipv4/ip.c b/src/VBox/Devices/Network/lwip/src/core/ipv4/ip.c
deleted file mode 100644
index 9d655f8..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/ipv4/ip.c
+++ /dev/null
@@ -1,516 +0,0 @@
-/* @file
- *
- * This is the IP layer implementation for incoming and outgoing IP traffic.
- *
- * @see ip_frag.c
- *
- */
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/ip.h"
-#include "lwip/ip_frag.h"
-#include "lwip/inet.h"
-#include "lwip/netif.h"
-#include "lwip/icmp.h"
-#include "lwip/raw.h"
-#include "lwip/udp.h"
-#include "lwip/tcp.h"
-
-#include "lwip/stats.h"
-
-#include "arch/perf.h"
-
-#include "lwip/snmp.h"
-#if LWIP_DHCP
-# include "lwip/dhcp.h"
-#endif /* LWIP_DHCP */
-
-
-/**
- * Initializes the IP layer.
- */
-
-void
-ip_init(void)
-{
-#if IP_FRAG
- ip_frag_init();
-#endif
-}
-
-/**
- * Finds the appropriate network interface for a given IP address. It
- * searches the list of network interfaces linearly. A match is found
- * if the masked IP address of the network interface equals the masked
- * IP address given to the function.
- */
-
-struct netif *
-ip_route(struct ip_addr *dest)
-{
- struct netif *netif;
-
- /* iterate through netifs */
- for(netif = netif_list; netif != NULL; netif = netif->next) {
- /* network mask matches? */
- if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
- /* return netif on which to forward IP packet */
- return netif;
- }
- }
- /* no matching netif found, use default netif */
- return netif_default;
-}
-#if IP_FORWARD
-
-/**
- * Forwards an IP packet. It finds an appropriate route for the
- * packet, decrements the TTL value of the packet, adjusts the
- * checksum and outputs the packet on the appropriate interface.
- */
-
-static struct netif *
-ip_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp)
-{
- struct netif *netif;
-
- PERF_START;
- /* Find network interface where to forward this IP packet to. */
- netif = ip_route((struct ip_addr *)&(iphdr->dest));
- if (netif == NULL) {
- LWIP_DEBUGF(IP_DEBUG, ("ip_forward: no forwarding route for 0x%"X32_F" found\n",
- iphdr->dest.addr));
- snmp_inc_ipoutnoroutes();
- return (struct netif *)NULL;
- }
- /* Do not forward packets onto the same network interface on which
- * they arrived. */
- if (netif == inp) {
- LWIP_DEBUGF(IP_DEBUG, ("ip_forward: not bouncing packets back on incoming interface.\n"));
- snmp_inc_ipoutnoroutes();
- return (struct netif *)NULL;
- }
-
- /* decrement TTL */
- IPH_TTL_SET(iphdr, IPH_TTL(iphdr) - 1);
- /* send ICMP if TTL == 0 */
- if (IPH_TTL(iphdr) == 0) {
- snmp_inc_ipinhdrerrors();
- /* Don't send ICMP messages in response to ICMP messages */
- if (IPH_PROTO(iphdr) != IP_PROTO_ICMP) {
- icmp_time_exceeded(p, ICMP_TE_TTL);
- }
- return (struct netif *)NULL;
- }
-
- /* Incrementally update the IP checksum. */
- if (IPH_CHKSUM(iphdr) >= htons(0xffff - 0x100)) {
- IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + htons(0x100) + 1);
- } else {
- IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + htons(0x100));
- }
-
- LWIP_DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to 0x%"X32_F"\n",
- iphdr->dest.addr));
-
- IP_STATS_INC(ip.fw);
- IP_STATS_INC(ip.xmit);
- snmp_inc_ipforwdatagrams();
-
- PERF_STOP("ip_forward");
- /* transmit pbuf on chosen interface */
- netif->output(netif, p, (struct ip_addr *)&(iphdr->dest));
- return netif;
-}
-#endif /* IP_FORWARD */
-
-/**
- * This function is called by the network interface device driver when
- * an IP packet is received. The function does the basic checks of the
- * IP header such as packet size being at least larger than the header
- * size etc. If the packet was not destined for us, the packet is
- * forwarded (using ip_forward). The IP checksum is always checked.
- *
- * Finally, the packet is sent to the upper layer protocol input function.
- *
- *
- *
- */
-
-err_t
-ip_input(struct pbuf *p, struct netif *inp) {
- struct ip_hdr *iphdr;
- struct netif *netif;
- u16_t iphdrlen;
-
- IP_STATS_INC(ip.recv);
- snmp_inc_ipinreceives();
-
- /* identify the IP header */
- iphdr = p->payload;
- if (IPH_V(iphdr) != 4) {
- LWIP_DEBUGF(IP_DEBUG | 1, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr)));
- ip_debug_print(p);
- pbuf_free(p);
- IP_STATS_INC(ip.err);
- IP_STATS_INC(ip.drop);
- snmp_inc_ipinhdrerrors();
- return ERR_OK;
- }
- /* obtain IP header length in number of 32-bit words */
- iphdrlen = IPH_HL(iphdr);
- /* calculate IP header length in bytes */
- iphdrlen *= 4;
-
- /* header length exceeds first pbuf length? */
- if (iphdrlen > p->len) {
- LWIP_DEBUGF(IP_DEBUG | 2, ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet droppped.\n",
- iphdrlen, p->len));
- /* free (drop) packet pbufs */
- pbuf_free(p);
- IP_STATS_INC(ip.lenerr);
- IP_STATS_INC(ip.drop);
- snmp_inc_ipindiscards();
- return ERR_OK;
- }
-
- /* verify checksum */
-#if CHECKSUM_CHECK_IP
- if (inet_chksum(iphdr, iphdrlen) != 0) {
-
- LWIP_DEBUGF(IP_DEBUG | 2, ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdrlen)));
- ip_debug_print(p);
- pbuf_free(p);
- IP_STATS_INC(ip.chkerr);
- IP_STATS_INC(ip.drop);
- snmp_inc_ipinhdrerrors();
- return ERR_OK;
- }
-#endif
-
- /* Trim pbuf. This should have been done at the netif layer,
- * but we'll do it anyway just to be sure that its done. */
- pbuf_realloc(p, ntohs(IPH_LEN(iphdr)));
-
- /* match packet against an interface, i.e. is this packet for us? */
- for (netif = netif_list; netif != NULL; netif = netif->next) {
-
- LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n",
- iphdr->dest.addr, netif->ip_addr.addr,
- iphdr->dest.addr & netif->netmask.addr,
- netif->ip_addr.addr & netif->netmask.addr,
- iphdr->dest.addr & ~(netif->netmask.addr)));
-
- /* interface is up and configured? */
- if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr))))
- {
- /* unicast to this interface address? */
- if (ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr)) ||
- /* or broadcast on this interface network address? */
- ip_addr_isbroadcast(&(iphdr->dest), netif)) {
- LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface %c%c\n",
- netif->name[0], netif->name[1]));
- /* break out of for loop */
- break;
- }
- }
- }
-#if LWIP_DHCP
- /* Pass DHCP messages regardless of destination address. DHCP traffic is addressed
- * using link layer addressing (such as Ethernet MAC) so we must not filter on IP.
- * According to RFC 1542 section 3.1.1, referred by RFC 2131).
- */
- if (netif == NULL) {
- /* remote port is DHCP server? */
- if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {
- LWIP_DEBUGF(IP_DEBUG | DBG_TRACE | 1, ("ip_input: UDP packet to DHCP client port %"U16_F"\n",
- ntohs(((struct udp_hdr *)((u8_t *)iphdr + iphdrlen))->dest)));
- if (ntohs(((struct udp_hdr *)((u8_t *)iphdr + iphdrlen))->dest) == DHCP_CLIENT_PORT) {
- LWIP_DEBUGF(IP_DEBUG | DBG_TRACE | 1, ("ip_input: DHCP packet accepted.\n"));
- netif = inp;
- }
- }
- }
-#endif /* LWIP_DHCP */
- /* packet not for us? */
- if (netif == NULL) {
- /* packet not for us, route or discard */
- LWIP_DEBUGF(IP_DEBUG | DBG_TRACE | 1, ("ip_input: packet not for us.\n"));
-#if IP_FORWARD
- /* non-broadcast packet? */
- if (!ip_addr_isbroadcast(&(iphdr->dest), inp)) {
- /* try to forward IP packet on (other) interfaces */
- ip_forward(p, iphdr, inp);
- }
- else
-#endif /* IP_FORWARD */
- {
- snmp_inc_ipinaddrerrors();
- snmp_inc_ipindiscards();
- }
- pbuf_free(p);
- return ERR_OK;
- }
- /* packet consists of multiple fragments? */
- if ((IPH_OFFSET(iphdr) & htons(IP_OFFMASK | IP_MF)) != 0) {
-#if IP_REASSEMBLY /* packet fragment reassembly code present? */
- LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip_reass()\n",
- ntohs(IPH_ID(iphdr)), p->tot_len, ntohs(IPH_LEN(iphdr)), !!(IPH_OFFSET(iphdr) & htons(IP_MF)), (ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8));
- /* reassemble the packet*/
- p = ip_reass(p);
- /* packet not fully reassembled yet? */
- if (p == NULL) {
- return ERR_OK;
- }
- iphdr = p->payload;
-#else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */
- pbuf_free(p);
- LWIP_DEBUGF(IP_DEBUG | 2, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n",
- ntohs(IPH_OFFSET(iphdr))));
- IP_STATS_INC(ip.opterr);
- IP_STATS_INC(ip.drop);
- /* unsupported protocol feature */
- snmp_inc_ipinunknownprotos();
- return ERR_OK;
-#endif /* IP_REASSEMBLY */
- }
-
-#if IP_OPTIONS == 0 /* no support for IP options in the IP header? */
- if (iphdrlen > IP_HLEN) {
- LWIP_DEBUGF(IP_DEBUG | 2, ("IP packet dropped since there were IP options (while IP_OPTIONS == 0).\n"));
- pbuf_free(p);
- IP_STATS_INC(ip.opterr);
- IP_STATS_INC(ip.drop);
- /* unsupported protocol feature */
- snmp_inc_ipinunknownprotos();
- return ERR_OK;
- }
-#endif /* IP_OPTIONS == 0 */
-
- /* send to upper layers */
- LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n"));
- ip_debug_print(p);
- LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len));
-
-#if LWIP_RAW
- /* raw input did not eat the packet? */
- if (raw_input(p, inp) == 0) {
-#endif /* LWIP_RAW */
-
- switch (IPH_PROTO(iphdr)) {
-#if LWIP_UDP
- case IP_PROTO_UDP:
- case IP_PROTO_UDPLITE:
- snmp_inc_ipindelivers();
- udp_input(p, inp);
- break;
-#endif /* LWIP_UDP */
-#if LWIP_TCP
- case IP_PROTO_TCP:
- snmp_inc_ipindelivers();
- tcp_input(p, inp);
- break;
-#endif /* LWIP_TCP */
- case IP_PROTO_ICMP:
- snmp_inc_ipindelivers();
- icmp_input(p, inp);
- break;
- default:
- /* send ICMP destination protocol unreachable unless is was a broadcast */
- if (!ip_addr_isbroadcast(&(iphdr->dest), inp) &&
- !ip_addr_ismulticast(&(iphdr->dest))) {
- p->payload = iphdr;
- icmp_dest_unreach(p, ICMP_DUR_PROTO);
- }
- pbuf_free(p);
-
- LWIP_DEBUGF(IP_DEBUG | 2, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr)));
-
- IP_STATS_INC(ip.proterr);
- IP_STATS_INC(ip.drop);
- snmp_inc_ipinunknownprotos();
- }
-#if LWIP_RAW
- } /* LWIP_RAW */
-#endif
- return ERR_OK;
-}
-
-/**
- * Sends an IP packet on a network interface. This function constructs
- * the IP header and calculates the IP header checksum. If the source
- * IP address is NULL, the IP address of the outgoing network
- * interface is filled in as source address.
- *
- * @note ip_id: RFC791 "some host may be able to simply use
- * unique identifiers independent of destination"
- */
-
-err_t
-ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
- u8_t ttl, u8_t tos,
- u8_t proto, struct netif *netif)
-{
- struct ip_hdr *iphdr;
- static u16_t ip_id = 0;
-
- snmp_inc_ipoutrequests();
-
- if (dest != IP_HDRINCL) {
- if (pbuf_header(p, IP_HLEN)) {
- LWIP_DEBUGF(IP_DEBUG | 2, ("ip_output: not enough room for IP header in pbuf\n"));
-
- IP_STATS_INC(ip.err);
- snmp_inc_ipoutdiscards();
- return ERR_BUF;
- }
-
- iphdr = p->payload;
-
- IPH_TTL_SET(iphdr, ttl);
- IPH_PROTO_SET(iphdr, proto);
-
- ip_addr_set(&(iphdr->dest), dest);
-
- IPH_VHLTOS_SET(iphdr, 4, IP_HLEN / 4, tos);
- IPH_LEN_SET(iphdr, htons(p->tot_len));
- IPH_OFFSET_SET(iphdr, htons(IP_DF));
- IPH_ID_SET(iphdr, htons(ip_id));
- ++ip_id;
-
- if (ip_addr_isany(src)) {
- ip_addr_set(&(iphdr->src), &(netif->ip_addr));
- } else {
- ip_addr_set(&(iphdr->src), src);
- }
-
- IPH_CHKSUM_SET(iphdr, 0);
-#if CHECKSUM_GEN_IP
- IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));
-#endif
- } else {
- iphdr = p->payload;
- dest = &(iphdr->dest);
- }
-
-#if IP_FRAG
- /* don't fragment if interface has mtu set to 0 [loopif] */
- if (netif->mtu && (p->tot_len > netif->mtu))
- return ip_frag(p,netif,dest);
-#endif
-
- IP_STATS_INC(ip.xmit);
-
- LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num));
- ip_debug_print(p);
-
- LWIP_DEBUGF(IP_DEBUG, ("netif->output()"));
-
- return netif->output(netif, p, dest);
-}
-
-/**
- * Simple interface to ip_output_if. It finds the outgoing network
- * interface and calls upon ip_output_if to do the actual work.
- */
-
-err_t
-ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
- u8_t ttl, u8_t tos, u8_t proto)
-{
- struct netif *netif;
-
- if ((netif = ip_route(dest)) == NULL) {
- LWIP_DEBUGF(IP_DEBUG | 2, ("ip_output: No route to 0x%"X32_F"\n", dest->addr));
-
- IP_STATS_INC(ip.rterr);
- snmp_inc_ipoutnoroutes();
- return ERR_RTE;
- }
-
- return ip_output_if(p, src, dest, ttl, tos, proto, netif);
-}
-
-#if IP_DEBUG
-void
-ip_debug_print(struct pbuf *p)
-{
- struct ip_hdr *iphdr = p->payload;
- u8_t *payload;
-
- payload = (u8_t *)iphdr + IP_HLEN;
-
- LWIP_DEBUGF(IP_DEBUG, ("IP header:\n"));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" |%2"S16_F" | 0x%02"X16_F" | %5"U16_F" | (v, hl, tos, len)\n",
- IPH_V(iphdr),
- IPH_HL(iphdr),
- IPH_TOS(iphdr),
- ntohs(IPH_LEN(iphdr))));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" |%"U16_F"%"U16_F"%"U16_F"| %4"U16_F" | (id, flags, offset)\n",
- ntohs(IPH_ID(iphdr)),
- ntohs(IPH_OFFSET(iphdr)) >> 15 & 1,
- ntohs(IPH_OFFSET(iphdr)) >> 14 & 1,
- ntohs(IPH_OFFSET(iphdr)) >> 13 & 1,
- ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | 0x%04"X16_F" | (ttl, proto, chksum)\n",
- IPH_TTL(iphdr),
- IPH_PROTO(iphdr),
- ntohs(IPH_CHKSUM(iphdr))));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (src)\n",
- ip4_addr1(&iphdr->src),
- ip4_addr2(&iphdr->src),
- ip4_addr3(&iphdr->src),
- ip4_addr4(&iphdr->src)));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (dest)\n",
- ip4_addr1(&iphdr->dest),
- ip4_addr2(&iphdr->dest),
- ip4_addr3(&iphdr->dest),
- ip4_addr4(&iphdr->dest)));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
-}
-#endif /* IP_DEBUG */
-
-
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/ipv4/ip_addr.c b/src/VBox/Devices/Network/lwip/src/core/ipv4/ip_addr.c
deleted file mode 100644
index 6dd2c49..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/ipv4/ip_addr.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/inet.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-
-#define IP_ADDR_ANY_VALUE 0x00000000UL
-#define IP_ADDR_BROADCAST_VALUE 0xffffffffUL
-
-/* used by IP_ADDR_ANY and IP_ADDR_BROADCAST in ip_addr.h */
-const struct ip_addr ip_addr_any = { IP_ADDR_ANY_VALUE };
-const struct ip_addr ip_addr_broadcast = { IP_ADDR_BROADCAST_VALUE };
-
-/* Determine if an address is a broadcast address on a network interface
- *
- * @param addr address to be checked
- * @param netif the network interface against which the address is checked
- * @return returns non-zero if the address is a broadcast address
- *
- */
-
-u8_t ip_addr_isbroadcast(struct ip_addr *addr, struct netif *netif)
-{
- u32_t addr2test;
-
- addr2test = addr->addr;
- /* all ones (broadcast) or all zeroes (old skool broadcast) */
- if ((~addr2test == IP_ADDR_ANY_VALUE) ||
- (addr2test == IP_ADDR_ANY_VALUE))
- return 1;
- /* no broadcast support on this network interface? */
- else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0)
- /* the given address cannot be a broadcast address
- * nor can we check against any broadcast addresses */
- return 0;
- /* address matches network interface address exactly? => no broadcast */
- else if (addr2test == netif->ip_addr.addr)
- return 0;
- /* on the same (sub) network... */
- else if (ip_addr_netcmp(addr, &(netif->ip_addr), &(netif->netmask))
- /* ...and host identifier bits are all ones? =>... */
- && ((addr2test & ~netif->netmask.addr) ==
- (IP_ADDR_BROADCAST_VALUE & ~netif->netmask.addr)))
- /* => network broadcast address */
- return 1;
- else
- return 0;
-}
diff --git a/src/VBox/Devices/Network/lwip/src/core/ipv4/ip_frag.c b/src/VBox/Devices/Network/lwip/src/core/ipv4/ip_frag.c
deleted file mode 100644
index d552355..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/ipv4/ip_frag.c
+++ /dev/null
@@ -1,388 +0,0 @@
-/* @file
- *
- * This is the IP packet segmentation and reassembly implementation.
- *
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Jani Monoses <jani at iv.ro>
- * original reassembly code by Adam Dunkels <adam at sics.se>
- *
- */
-
-#include <string.h>
-
-#include "lwip/opt.h"
-#include "lwip/ip.h"
-#include "lwip/ip_frag.h"
-#include "lwip/netif.h"
-#include "lwip/snmp.h"
-#include "lwip/stats.h"
-
-static u8_t ip_reassbuf[IP_HLEN + IP_REASS_BUFSIZE];
-static u8_t ip_reassbitmap[IP_REASS_BUFSIZE / (8 * 8) + 1];
-static const u8_t bitmap_bits[8] = { 0xff, 0x7f, 0x3f, 0x1f,
- 0x0f, 0x07, 0x03, 0x01
-};
-static u16_t ip_reasslen;
-static u8_t ip_reassflags;
-#define IP_REASS_FLAG_LASTFRAG 0x01
-
-static u8_t ip_reasstmr;
-
-/*
- * Copy len bytes from offset in pbuf to buffer
- *
- * helper used by both ip_reass and ip_frag
- */
-static struct pbuf *
-copy_from_pbuf(struct pbuf *p, u16_t * offset,
- u8_t * buffer, u16_t len)
-{
- u16_t l;
-
- p->payload = (u8_t *)p->payload + *offset;
- p->len -= *offset;
- while (len) {
- l = len < p->len ? len : p->len;
- memcpy(buffer, p->payload, l);
- buffer += l;
- len -= l;
- if (len)
- p = p->next;
- else
- *offset = l;
- }
- return p;
-}
-
-
-/**
- * Initializes IP reassembly and fragmentation states.
- */
-void
-ip_frag_init(void)
-{
- ip_reasstmr = 0;
- ip_reassflags = 0;
- ip_reasslen = 0;
- memset(ip_reassbitmap, 0, sizeof(ip_reassbitmap));
-}
-
-/**
- * Reassembly timer base function
- * for both NO_SYS == 0 and 1 (!).
- *
- * Should be called every 1000 msec.
- */
-void
-ip_reass_tmr(void)
-{
- if (ip_reasstmr > 0) {
- ip_reasstmr--;
- LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n",(u16_t)ip_reasstmr));
- if (ip_reasstmr == 0) {
- /* reassembly timed out */
- snmp_inc_ipreasmfails();
- }
- }
-}
-
-/**
- * Reassembles incoming IP fragments into an IP datagram.
- *
- * @param p points to a pbuf chain of the fragment
- * @return NULL if reassembly is incomplete, ? otherwise
- */
-struct pbuf *
-ip_reass(struct pbuf *p)
-{
- struct pbuf *q;
- struct ip_hdr *fraghdr, *iphdr;
- u16_t offset, len;
- u16_t i;
-
- IPFRAG_STATS_INC(ip_frag.recv);
- snmp_inc_ipreasmreqds();
-
- iphdr = (struct ip_hdr *) ip_reassbuf;
- fraghdr = (struct ip_hdr *) p->payload;
- /* If ip_reasstmr is zero, no packet is present in the buffer, so we
- write the IP header of the fragment into the reassembly
- buffer. The timer is updated with the maximum age. */
- if (ip_reasstmr == 0) {
- LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: new packet\n"));
- memcpy(iphdr, fraghdr, IP_HLEN);
- ip_reasstmr = IP_REASS_MAXAGE;
- ip_reassflags = 0;
- /* Clear the bitmap. */
- memset(ip_reassbitmap, 0, sizeof(ip_reassbitmap));
- }
-
- /* Check if the incoming fragment matches the one currently present
- in the reasembly buffer. If so, we proceed with copying the
- fragment into the buffer. */
- if (ip_addr_cmp(&iphdr->src, &fraghdr->src) &&
- ip_addr_cmp(&iphdr->dest, &fraghdr->dest) &&
- IPH_ID(iphdr) == IPH_ID(fraghdr)) {
- LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: matching previous fragment ID=%"X16_F"\n",
- ntohs(IPH_ID(fraghdr))));
- IPFRAG_STATS_INC(ip_frag.cachehit);
- /* Find out the offset in the reassembly buffer where we should
- copy the fragment. */
- len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4;
- offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8;
-
- /* If the offset or the offset + fragment length overflows the
- reassembly buffer, we discard the entire packet. */
- if ((offset > IP_REASS_BUFSIZE) || ((offset + len) > IP_REASS_BUFSIZE)) {
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: fragment outside of buffer (%"S16_F":%"S16_F"/%"S16_F").\n", offset,
- offset + len, IP_REASS_BUFSIZE));
- ip_reasstmr = 0;
- snmp_inc_ipreasmfails();
- goto nullreturn;
- }
-
- /* Copy the fragment into the reassembly buffer, at the right
- offset. */
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: copying with offset %"S16_F" into %"S16_F":%"S16_F"\n", offset,
- IP_HLEN + offset, IP_HLEN + offset + len));
- i = IPH_HL(fraghdr) * 4;
- copy_from_pbuf(p, &i, &ip_reassbuf[IP_HLEN + offset], len);
-
- /* Update the bitmap. */
- if (offset / (8 * 8) == (offset + len) / (8 * 8)) {
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: updating single byte in bitmap.\n"));
- /* If the two endpoints are in the same byte, we only update that byte. */
- LWIP_ASSERT("offset / (8 * 8) < sizeof(ip_reassbitmap)",
- offset / (8 * 8) < sizeof(ip_reassbitmap));
- ip_reassbitmap[offset / (8 * 8)] |=
- bitmap_bits[(offset / 8) & 7] &
- ~bitmap_bits[((offset + len) / 8) & 7];
- } else {
- /* If the two endpoints are in different bytes, we update the
- bytes in the endpoints and fill the stuff inbetween with
- 0xff. */
- LWIP_ASSERT("offset / (8 * 8) < sizeof(ip_reassbitmap)",
- offset / (8 * 8) < sizeof(ip_reassbitmap));
- ip_reassbitmap[offset / (8 * 8)] |= bitmap_bits[(offset / 8) & 7];
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: updating many bytes in bitmap (%"S16_F":%"S16_F").\n",
- 1 + offset / (8 * 8), (offset + len) / (8 * 8)));
- for (i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i) {
- ip_reassbitmap[i] = 0xff;
- }
- LWIP_ASSERT("(offset + len) / (8 * 8) < sizeof(ip_reassbitmap)",
- (offset + len) / (8 * 8) < sizeof(ip_reassbitmap));
- ip_reassbitmap[(offset + len) / (8 * 8)] |=
- ~bitmap_bits[((offset + len) / 8) & 7];
- }
-
- /* If this fragment has the More Fragments flag set to zero, we
- know that this is the last fragment, so we can calculate the
- size of the entire packet. We also set the
- IP_REASS_FLAG_LASTFRAG flag to indicate that we have received
- the final fragment. */
-
- if ((ntohs(IPH_OFFSET(fraghdr)) & IP_MF) == 0) {
- ip_reassflags |= IP_REASS_FLAG_LASTFRAG;
- ip_reasslen = offset + len;
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: last fragment seen, total len %"S16_F"\n",
- ip_reasslen));
- }
-
- /* Finally, we check if we have a full packet in the buffer. We do
- this by checking if we have the last fragment and if all bits
- in the bitmap are set. */
- if (ip_reassflags & IP_REASS_FLAG_LASTFRAG) {
- /* Check all bytes up to and including all but the last byte in
- the bitmap. */
- LWIP_ASSERT("ip_reasslen / (8 * 8) - 1 < sizeof(ip_reassbitmap)",
- ip_reasslen / (8 * 8) - 1 < sizeof(ip_reassbitmap));
- for (i = 0; i < ip_reasslen / (8 * 8) - 1; ++i) {
- if (ip_reassbitmap[i] != 0xff) {
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: last fragment seen, bitmap %"S16_F"/%"S16_F" failed (%"X16_F")\n",
- i, ip_reasslen / (8 * 8) - 1, ip_reassbitmap[i]));
- goto nullreturn;
- }
- }
- /* Check the last byte in the bitmap. It should contain just the
- right amount of bits. */
- LWIP_ASSERT("ip_reasslen / (8 * 8) < sizeof(ip_reassbitmap)",
- ip_reasslen / (8 * 8) < sizeof(ip_reassbitmap));
- if (ip_reassbitmap[ip_reasslen / (8 * 8)] !=
- (u8_t) ~ bitmap_bits[ip_reasslen / 8 & 7]) {
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: last fragment seen, bitmap %"S16_F" didn't contain %"X16_F" (%"X16_F")\n",
- ip_reasslen / (8 * 8), ~bitmap_bits[ip_reasslen / 8 & 7],
- ip_reassbitmap[ip_reasslen / (8 * 8)]));
- goto nullreturn;
- }
-
- /* Pretend to be a "normal" (i.e., not fragmented) IP packet
- from now on. */
- ip_reasslen += IP_HLEN;
-
- IPH_LEN_SET(iphdr, htons(ip_reasslen));
- IPH_OFFSET_SET(iphdr, 0);
- IPH_CHKSUM_SET(iphdr, 0);
- IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));
-
- /* If we have come this far, we have a full packet in the
- buffer, so we allocate a pbuf and copy the packet into it. We
- also reset the timer. */
- ip_reasstmr = 0;
- pbuf_free(p);
- p = pbuf_alloc(PBUF_LINK, ip_reasslen, PBUF_POOL);
- if (p != NULL) {
- i = 0;
- for (q = p; q != NULL; q = q->next) {
- /* Copy enough bytes to fill this pbuf in the chain. The
- available data in the pbuf is given by the q->len variable. */
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: memcpy from %p (%"S16_F") to %p, %"S16_F" bytes\n",
- (void *)&ip_reassbuf[i], i, q->payload,
- q->len > ip_reasslen - i ? ip_reasslen - i : q->len));
- memcpy(q->payload, &ip_reassbuf[i],
- q->len > ip_reasslen - i ? ip_reasslen - i : q->len);
- i += q->len;
- }
- IPFRAG_STATS_INC(ip_frag.fw);
- snmp_inc_ipreasmoks();
- } else {
- LWIP_DEBUGF(IP_REASS_DEBUG,
- ("ip_reass: pbuf_alloc(PBUF_LINK, ip_reasslen=%"U16_F", PBUF_POOL) failed\n", ip_reasslen));
- IPFRAG_STATS_INC(ip_frag.memerr);
- snmp_inc_ipreasmfails();
- }
- LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: p %p\n", (void*)p));
- return p;
- }
- }
-
-nullreturn:
- IPFRAG_STATS_INC(ip_frag.drop);
- pbuf_free(p);
- return NULL;
-}
-
-static u8_t buf[MEM_ALIGN_SIZE(IP_FRAG_MAX_MTU)];
-
-/**
- * Fragment an IP datagram if too large for the netif.
- *
- * Chop the datagram in MTU sized chunks and send them in order
- * by using a fixed size static memory buffer (PBUF_ROM)
- */
-err_t
-ip_frag(struct pbuf *p, struct netif *netif, struct ip_addr *dest)
-{
- struct pbuf *rambuf;
- struct pbuf *header;
- struct ip_hdr *iphdr;
- u16_t nfb = 0;
- u16_t left, cop;
- u16_t mtu = netif->mtu;
- u16_t ofo, omf;
- u16_t last;
- u16_t poff = IP_HLEN;
- u16_t tmp;
-
- /* Get a RAM based MTU sized pbuf */
- rambuf = pbuf_alloc(PBUF_LINK, 0, PBUF_REF);
- if (rambuf == NULL) {
- LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc(PBUF_LINK, 0, PBUF_REF) failed\n"));
- return ERR_MEM;
- }
- rambuf->tot_len = rambuf->len = mtu;
- rambuf->payload = MEM_ALIGN((void *)buf);
-
- /* Copy the IP header in it */
- iphdr = rambuf->payload;
- memcpy(iphdr, p->payload, IP_HLEN);
-
- /* Save original offset */
- tmp = ntohs(IPH_OFFSET(iphdr));
- ofo = tmp & IP_OFFMASK;
- omf = tmp & IP_MF;
-
- left = p->tot_len - IP_HLEN;
-
- while (left) {
- last = (left <= mtu - IP_HLEN);
-
- /* Set new offset and MF flag */
- ofo += nfb;
- tmp = omf | (IP_OFFMASK & (ofo));
- if (!last)
- tmp = tmp | IP_MF;
- IPH_OFFSET_SET(iphdr, htons(tmp));
-
- /* Fill this fragment */
- nfb = (mtu - IP_HLEN) / 8;
- cop = last ? left : nfb * 8;
-
- p = copy_from_pbuf(p, &poff, (u8_t *) iphdr + IP_HLEN, cop);
-
- /* Correct header */
- IPH_LEN_SET(iphdr, htons(cop + IP_HLEN));
- IPH_CHKSUM_SET(iphdr, 0);
- IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));
-
- if (last)
- pbuf_realloc(rambuf, left + IP_HLEN);
- /* This part is ugly: we alloc a RAM based pbuf for
- * the link level header for each chunk and then
- * free it.A PBUF_ROM style pbuf for which pbuf_header
- * worked would make things simpler.
- */
- header = pbuf_alloc(PBUF_LINK, 0, PBUF_RAM);
- if (header != NULL) {
- pbuf_chain(header, rambuf);
- netif->output(netif, header, dest);
- IPFRAG_STATS_INC(ip_frag.xmit);
- snmp_inc_ipfragcreates();
- pbuf_free(header);
- } else {
- LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc() for header failed\n"));
- pbuf_free(rambuf);
- return ERR_MEM;
- }
- left -= cop;
- }
- pbuf_free(rambuf);
- snmp_inc_ipfragoks();
- return ERR_OK;
-}
diff --git a/src/VBox/Devices/Network/lwip/src/core/ipv6/README b/src/VBox/Devices/Network/lwip/src/core/ipv6/README
deleted file mode 100644
index 3620004..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/ipv6/README
+++ /dev/null
@@ -1 +0,0 @@
-IPv6 support in lwIP is very experimental.
diff --git a/src/VBox/Devices/Network/lwip/src/core/ipv6/icmp6.c b/src/VBox/Devices/Network/lwip/src/core/ipv6/icmp6.c
deleted file mode 100644
index 10b6903..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/ipv6/icmp6.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-/* Some ICMP messages should be passed to the transport protocols. This
- is not implemented. */
-
-#include "lwip/opt.h"
-
-#include "lwip/icmp.h"
-#include "lwip/inet.h"
-#include "lwip/ip.h"
-#include "lwip/def.h"
-
-#include "lwip/stats.h"
-
-
-void
-icmp_input(struct pbuf *p, struct netif *inp)
-{
- u8_t type;
- struct icmp_echo_hdr *iecho;
- struct ip_hdr *iphdr;
- struct ip_addr tmpaddr;
-
-#ifdef ICMP_STATS
- ++lwip_stats.icmp.recv;
-#endif /* ICMP_STATS */
-
- /* TODO: check length before accessing payload! */
-
- type = ((u8_t *)p->payload)[0];
-
- switch (type) {
- case ICMP6_ECHO:
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n"));
-
- if (p->tot_len < sizeof(struct icmp_echo_hdr)) {
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n"));
-
- pbuf_free(p);
-#ifdef ICMP_STATS
- ++lwip_stats.icmp.lenerr;
-#endif /* ICMP_STATS */
-
- return;
- }
- iecho = p->payload;
- iphdr = (struct ip_hdr *)((u8_t *)p->payload - IP_HLEN);
- if (inet_chksum_pbuf(p) != 0) {
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo (%"X16_F")\n", inet_chksum_pseudo(p, &(iphdr->src), &(iphdr->dest), IP_PROTO_ICMP, p->tot_len)));
-
-#ifdef ICMP_STATS
- ++lwip_stats.icmp.chkerr;
-#endif /* ICMP_STATS */
- /* return;*/
- }
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp: p->len %"S16_F" p->tot_len %"S16_F"\n", p->len, p->tot_len));
- ip_addr_set(&tmpaddr, &(iphdr->src));
- ip_addr_set(&(iphdr->src), &(iphdr->dest));
- ip_addr_set(&(iphdr->dest), &tmpaddr);
- iecho->type = ICMP6_ER;
- /* adjust the checksum */
- if (iecho->chksum >= htons(0xffff - (ICMP6_ECHO << 8))) {
- iecho->chksum += htons(ICMP6_ECHO << 8) + 1;
- } else {
- iecho->chksum += htons(ICMP6_ECHO << 8);
- }
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo (%"X16_F")\n", inet_chksum_pseudo(p, &(iphdr->src), &(iphdr->dest), IP_PROTO_ICMP, p->tot_len)));
-#ifdef ICMP_STATS
- ++lwip_stats.icmp.xmit;
-#endif /* ICMP_STATS */
-
- /* LWIP_DEBUGF("icmp: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len);*/
- ip_output_if (p, &(iphdr->src), IP_HDRINCL,
- iphdr->hoplim, IP_PROTO_ICMP, inp);
- break;
- default:
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" not supported.\n", (s16_t)type));
-#ifdef ICMP_STATS
- ++lwip_stats.icmp.proterr;
- ++lwip_stats.icmp.drop;
-#endif /* ICMP_STATS */
- }
-
- pbuf_free(p);
-}
-
-void
-icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)
-{
- struct pbuf *q;
- struct ip_hdr *iphdr;
- struct icmp_dur_hdr *idur;
-
- q = pbuf_alloc(PBUF_IP, 8 + IP_HLEN + 8, PBUF_RAM);
- /* ICMP header + IP header + 8 bytes of data */
-
- iphdr = p->payload;
-
- idur = q->payload;
- idur->type = (u8_t)ICMP6_DUR;
- idur->icode = (u8_t)t;
-
- memcpy((u8_t *)q->payload + 8, p->payload, IP_HLEN + 8);
-
- /* calculate checksum */
- idur->chksum = 0;
- idur->chksum = inet_chksum(idur, q->len);
-#ifdef ICMP_STATS
- ++lwip_stats.icmp.xmit;
-#endif /* ICMP_STATS */
-
- ip_output(q, NULL,
- (struct ip_addr *)&(iphdr->src), ICMP_TTL, IP_PROTO_ICMP);
- pbuf_free(q);
-}
-
-void
-icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t)
-{
- struct pbuf *q;
- struct ip_hdr *iphdr;
- struct icmp_te_hdr *tehdr;
-
- LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded\n"));
-
- q = pbuf_alloc(PBUF_IP, 8 + IP_HLEN + 8, PBUF_RAM);
-
- iphdr = p->payload;
-
- tehdr = q->payload;
- tehdr->type = (u8_t)ICMP6_TE;
- tehdr->icode = (u8_t)t;
-
- /* copy fields from original packet */
- memcpy((u8_t *)q->payload + 8, (u8_t *)p->payload, IP_HLEN + 8);
-
- /* calculate checksum */
- tehdr->chksum = 0;
- tehdr->chksum = inet_chksum(tehdr, q->len);
-#ifdef ICMP_STATS
- ++lwip_stats.icmp.xmit;
-#endif /* ICMP_STATS */
- ip_output(q, NULL,
- (struct ip_addr *)&(iphdr->src), ICMP_TTL, IP_PROTO_ICMP);
- pbuf_free(q);
-}
-
-
-
-
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/ipv6/ip6.c b/src/VBox/Devices/Network/lwip/src/core/ipv6/ip6.c
deleted file mode 100644
index 03037c8..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/ipv6/ip6.c
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-
-
-/* ip.c
- *
- * This is the code for the IP layer for IPv6.
- *
- */
-
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/ip.h"
-#include "lwip/inet.h"
-#include "lwip/netif.h"
-#include "lwip/icmp.h"
-#include "lwip/udp.h"
-#include "lwip/tcp.h"
-
-#include "lwip/stats.h"
-
-#include "arch/perf.h"
-
-/* ip_init:
- *
- * Initializes the IP layer.
- */
-
-void
-ip_init(void)
-{
-}
-
-/* ip_route:
- *
- * Finds the appropriate network interface for a given IP address. It searches the
- * list of network interfaces linearly. A match is found if the masked IP address of
- * the network interface equals the masked IP address given to the function.
- */
-
-struct netif *
-ip_route(struct ip_addr *dest)
-{
- struct netif *netif;
-
- for(netif = netif_list; netif != NULL; netif = netif->next) {
- if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) {
- return netif;
- }
- }
-
- return netif_default;
-}
-
-/* ip_forward:
- *
- * Forwards an IP packet. It finds an appropriate route for the packet, decrements
- * the TTL value of the packet, adjusts the checksum and outputs the packet on the
- * appropriate interface.
- */
-
-static void
-ip_forward(struct pbuf *p, struct ip_hdr *iphdr)
-{
- struct netif *netif;
-
- PERF_START;
-
- if ((netif = ip_route((struct ip_addr *)&(iphdr->dest))) == NULL) {
-
- LWIP_DEBUGF(IP_DEBUG, ("ip_input: no forwarding route found for "));
-#if IP_DEBUG
- ip_addr_debug_print(IP_DEBUG, &(iphdr->dest));
-#endif /* IP_DEBUG */
- LWIP_DEBUGF(IP_DEBUG, ("\n"));
- pbuf_free(p);
- return;
- }
- /* Decrement TTL and send ICMP if ttl == 0. */
- if (--iphdr->hoplim == 0) {
- /* Don't send ICMP messages in response to ICMP messages */
- if (iphdr->nexthdr != IP_PROTO_ICMP) {
- icmp_time_exceeded(p, ICMP_TE_TTL);
- }
- pbuf_free(p);
- return;
- }
-
- /* Incremental update of the IP checksum. */
- /* if (iphdr->chksum >= htons(0xffff - 0x100)) {
- iphdr->chksum += htons(0x100) + 1;
- } else {
- iphdr->chksum += htons(0x100);
- }*/
-
-
- LWIP_DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to "));
-#if IP_DEBUG
- ip_addr_debug_print(IP_DEBUG, &(iphdr->dest));
-#endif /* IP_DEBUG */
- LWIP_DEBUGF(IP_DEBUG, ("\n"));
-
-#ifdef IP_STATS
- ++lwip_stats.ip.fw;
- ++lwip_stats.ip.xmit;
-#endif /* IP_STATS */
-
- PERF_STOP("ip_forward");
-
- netif->output(netif, p, (struct ip_addr *)&(iphdr->dest));
-}
-
-/* ip_input:
- *
- * This function is called by the network interface device driver when an IP packet is
- * received. The function does the basic checks of the IP header such as packet size
- * being at least larger than the header size etc. If the packet was not destined for
- * us, the packet is forwarded (using ip_forward). The IP checksum is always checked.
- *
- * Finally, the packet is sent to the upper layer protocol input function.
- */
-
-void
-ip_input(struct pbuf *p, struct netif *inp) {
- struct ip_hdr *iphdr;
- struct netif *netif;
-
-
- PERF_START;
-
-#if IP_DEBUG
- ip_debug_print(p);
-#endif /* IP_DEBUG */
-
-
-#ifdef IP_STATS
- ++lwip_stats.ip.recv;
-#endif /* IP_STATS */
-
- /* identify the IP header */
- iphdr = p->payload;
-
-
- if (iphdr->v != 6) {
- LWIP_DEBUGF(IP_DEBUG, ("IP packet dropped due to bad version number\n"));
-#if IP_DEBUG
- ip_debug_print(p);
-#endif /* IP_DEBUG */
- pbuf_free(p);
-#ifdef IP_STATS
- ++lwip_stats.ip.err;
- ++lwip_stats.ip.drop;
-#endif /* IP_STATS */
- return;
- }
-
- /* is this packet for us? */
- for(netif = netif_list; netif != NULL; netif = netif->next) {
-#if IP_DEBUG
- LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest "));
- ip_addr_debug_print(IP_DEBUG, &(iphdr->dest));
- LWIP_DEBUGF(IP_DEBUG, ("netif->ip_addr "));
- ip_addr_debug_print(IP_DEBUG, &(netif->ip_addr));
- LWIP_DEBUGF(IP_DEBUG, ("\n"));
-#endif /* IP_DEBUG */
- if (ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr))) {
- break;
- }
- }
-
-
- if (netif == NULL) {
- /* packet not for us, route or discard */
-#ifdef IP_FORWARD
- ip_forward(p, iphdr);
-#endif
- pbuf_free(p);
- return;
- }
-
- pbuf_realloc(p, IP_HLEN + ntohs(iphdr->len));
-
- /* send to upper layers */
-#if IP_DEBUG
- /* LWIP_DEBUGF("ip_input: \n");
- ip_debug_print(p);
- LWIP_DEBUGF("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len);*/
-#endif /* IP_DEBUG */
-
-
- pbuf_header(p, -IP_HLEN);
-
- switch (iphdr->nexthdr) {
- case IP_PROTO_UDP:
- udp_input(p);
- break;
- case IP_PROTO_TCP:
- tcp_input(p);
- break;
- case IP_PROTO_ICMP:
- icmp_input(p, inp);
- break;
- default:
- /* send ICMP destination protocol unreachable */
- icmp_dest_unreach(p, ICMP_DUR_PROTO);
- pbuf_free(p);
- LWIP_DEBUGF(IP_DEBUG, ("Unsupported transport protocol %"U16_F"\n",
- iphdr->nexthdr));
-
-#ifdef IP_STATS
- ++lwip_stats.ip.proterr;
- ++lwip_stats.ip.drop;
-#endif /* IP_STATS */
-
- }
- PERF_STOP("ip_input");
-}
-
-
-/* ip_output_if:
- *
- * Sends an IP packet on a network interface. This function constructs the IP header
- * and calculates the IP header checksum. If the source IP address is NULL,
- * the IP address of the outgoing network interface is filled in as source address.
- */
-
-err_t
-ip_output_if (struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
- u8_t ttl,
- u8_t proto, struct netif *netif)
-{
- struct ip_hdr *iphdr;
-
- PERF_START;
-
- printf("len %"U16_F" tot_len %"U16_F"\n", p->len, p->tot_len);
- if (pbuf_header(p, IP_HLEN)) {
- LWIP_DEBUGF(IP_DEBUG, ("ip_output: not enough room for IP header in pbuf\n"));
-#ifdef IP_STATS
- ++lwip_stats.ip.err;
-#endif /* IP_STATS */
-
- return ERR_BUF;
- }
- printf("len %"U16_F" tot_len %"U16_F"\n", p->len, p->tot_len);
-
- iphdr = p->payload;
-
-
- if (dest != IP_HDRINCL) {
- printf("!IP_HDRLINCL\n");
- iphdr->hoplim = ttl;
- iphdr->nexthdr = proto;
- iphdr->len = htons(p->tot_len - IP_HLEN);
- ip_addr_set(&(iphdr->dest), dest);
-
- iphdr->v = 6;
-
- if (ip_addr_isany(src)) {
- ip_addr_set(&(iphdr->src), &(netif->ip_addr));
- } else {
- ip_addr_set(&(iphdr->src), src);
- }
-
- } else {
- dest = &(iphdr->dest);
- }
-
-#ifdef IP_STATS
- ++lwip_stats.ip.xmit;
-#endif /* IP_STATS */
-
- LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c (len %"U16_F")\n", netif->name[0], netif->name[1], p->tot_len));
-#if IP_DEBUG
- ip_debug_print(p);
-#endif /* IP_DEBUG */
-
- PERF_STOP("ip_output_if");
- return netif->output(netif, p, dest);
-}
-
-/* ip_output:
- *
- * Simple interface to ip_output_if. It finds the outgoing network interface and
- * calls upon ip_output_if to do the actual work.
- */
-
-err_t
-ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
- u8_t ttl, u8_t proto)
-{
- struct netif *netif;
- if ((netif = ip_route(dest)) == NULL) {
- LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr));
-#ifdef IP_STATS
- ++lwip_stats.ip.rterr;
-#endif /* IP_STATS */
- return ERR_RTE;
- }
-
- return ip_output_if (p, src, dest, ttl, proto, netif);
-}
-
-#if IP_DEBUG
-void
-ip_debug_print(struct pbuf *p)
-{
- struct ip_hdr *iphdr = p->payload;
- u8_t *payload;
-
- payload = (u8_t *)iphdr + IP_HLEN;
-
- LWIP_DEBUGF(IP_DEBUG, ("IP header:\n"));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" | %"X16_F"%"X16_F" | %"X16_F"%"X16_F" | (v, traffic class, flow label)\n",
- iphdr->v,
- iphdr->tclass1, iphdr->tclass2,
- iphdr->flow1, iphdr->flow2));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" | %2"U16_F" | %2"U16_F" | (len, nexthdr, hoplim)\n",
- ntohs(iphdr->len),
- iphdr->nexthdr,
- iphdr->hoplim));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (src)\n",
- ntohl(iphdr->src.addr[0]) >> 16 & 0xffff,
- ntohl(iphdr->src.addr[0]) & 0xffff));
- LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (src)\n",
- ntohl(iphdr->src.addr[1]) >> 16 & 0xffff,
- ntohl(iphdr->src.addr[1]) & 0xffff));
- LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (src)\n",
- ntohl(iphdr->src.addr[2]) >> 16 & 0xffff,
- ntohl(iphdr->src.addr[2]) & 0xffff));
- LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (src)\n",
- ntohl(iphdr->src.addr[3]) >> 16 & 0xffff,
- ntohl(iphdr->src.addr[3]) & 0xffff));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (dest)\n",
- ntohl(iphdr->dest.addr[0]) >> 16 & 0xffff,
- ntohl(iphdr->dest.addr[0]) & 0xffff));
- LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (dest)\n",
- ntohl(iphdr->dest.addr[1]) >> 16 & 0xffff,
- ntohl(iphdr->dest.addr[1]) & 0xffff));
- LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (dest)\n",
- ntohl(iphdr->dest.addr[2]) >> 16 & 0xffff,
- ntohl(iphdr->dest.addr[2]) & 0xffff));
- LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (dest)\n",
- ntohl(iphdr->dest.addr[3]) >> 16 & 0xffff,
- ntohl(iphdr->dest.addr[3]) & 0xffff));
- LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n"));
-}
-#endif /* IP_DEBUG */
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/ipv6/ip6_addr.c b/src/VBox/Devices/Network/lwip/src/core/ipv6/ip6_addr.c
deleted file mode 100644
index dcb5078..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/ipv6/ip6_addr.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/ip_addr.h"
-#include "lwip/inet.h"
-
-
-u8_t
-ip_addr_netcmp(struct ip_addr *addr1, struct ip_addr *addr2,
- struct ip_addr *mask)
-{
- return((addr1->addr[0] & mask->addr[0]) == (addr2->addr[0] & mask->addr[0]) &&
- (addr1->addr[1] & mask->addr[1]) == (addr2->addr[1] & mask->addr[1]) &&
- (addr1->addr[2] & mask->addr[2]) == (addr2->addr[2] & mask->addr[2]) &&
- (addr1->addr[3] & mask->addr[3]) == (addr2->addr[3] & mask->addr[3]));
-
-}
-
-u8_t
-ip_addr_cmp(struct ip_addr *addr1, struct ip_addr *addr2)
-{
- return(addr1->addr[0] == addr2->addr[0] &&
- addr1->addr[1] == addr2->addr[1] &&
- addr1->addr[2] == addr2->addr[2] &&
- addr1->addr[3] == addr2->addr[3]);
-}
-
-void
-ip_addr_set(struct ip_addr *dest, struct ip_addr *src)
-{
- memcpy(dest, src, sizeof(struct ip_addr));
- /* dest->addr[0] = src->addr[0];
- dest->addr[1] = src->addr[1];
- dest->addr[2] = src->addr[2];
- dest->addr[3] = src->addr[3];*/
-}
-
-u8_t
-ip_addr_isany(struct ip_addr *addr)
-{
- if (addr == NULL) return 1;
- return((addr->addr[0] | addr->addr[1] | addr->addr[2] | addr->addr[3]) == 0);
-}
-
-
-/*#if IP_DEBUG*/
-void
-ip_addr_debug_print(struct ip_addr *addr)
-{
- printf("%"X32_F":%"X32_F":%"X32_F":%"X32_F":%"X32_F":%"X32_F":%"X32_F":%"X32_F",
- ntohl(addr->addr[0]) >> 16 & 0xffff,
- ntohl(addr->addr[0]) & 0xffff,
- ntohl(addr->addr[1]) >> 16 & 0xffff,
- ntohl(addr->addr[1]) & 0xffff,
- ntohl(addr->addr[2]) >> 16 & 0xffff,
- ntohl(addr->addr[2]) & 0xffff,
- ntohl(addr->addr[3]) >> 16 & 0xffff,
- ntohl(addr->addr[3]) & 0xffff);
-}
-/*#endif*/ /* IP_DEBUG */
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/mem.c b/src/VBox/Devices/Network/lwip/src/core/mem.c
deleted file mode 100644
index 6ef311d..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/mem.c
+++ /dev/null
@@ -1,414 +0,0 @@
-/** @file
- *
- * Dynamic memory manager
- *
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include <string.h>
-
-#include "lwip/arch.h"
-#include "lwip/opt.h"
-#include "lwip/def.h"
-#include "lwip/mem.h"
-
-#include "lwip/sys.h"
-
-#include "lwip/stats.h"
-
-#if (MEM_LIBC_MALLOC == 0)
-/* lwIP replacement for your libc malloc() */
-
-struct mem {
- mem_size_t next, prev;
-#if MEM_ALIGNMENT == 1
- u8_t used;
-#elif MEM_ALIGNMENT == 2
- u16_t used;
-#elif MEM_ALIGNMENT == 4
- u32_t used;
-#elif MEM_ALIGNMENT == 8
- u64_t used;
-#else
-#error "unhandled MEM_ALIGNMENT size"
-#endif /* MEM_ALIGNMENT */
-};
-
-static struct mem *ram_end;
-#if 1
-/* Adam original */
-static u8_t ram[MEM_SIZE + sizeof(struct mem) + MEM_ALIGNMENT];
-#else
-/* Christiaan alignment fix */
-static u8_t *ram;
-static struct mem ram_heap[1 + ( (MEM_SIZE + sizeof(struct mem) - 1) / sizeof(struct mem))];
-#endif
-
-#define MIN_SIZE 12
-#if 0 /* this one does not align correctly for some, resulting in crashes */
-#define SIZEOF_STRUCT_MEM (unsigned int)MEM_ALIGN_SIZE(sizeof(struct mem))
-#else
-#define SIZEOF_STRUCT_MEM (sizeof(struct mem) + \
- (((sizeof(struct mem) % MEM_ALIGNMENT) == 0)? 0 : \
- (4 - (sizeof(struct mem) % MEM_ALIGNMENT))))
-#endif
-
-static struct mem *lfree; /* pointer to the lowest free block */
-
-static sys_sem_t mem_sem;
-
-static void
-plug_holes(struct mem *mem)
-{
- struct mem *nmem;
- struct mem *pmem;
-
- LWIP_ASSERT("plug_holes: mem >= ram", (u8_t *)mem >= ram);
- LWIP_ASSERT("plug_holes: mem < ram_end", (u8_t *)mem < (u8_t *)ram_end);
- LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0);
-
- /* plug hole forward */
- LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE", mem->next <= MEM_SIZE);
-
- nmem = (struct mem *)&ram[mem->next];
- if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {
- if (lfree == nmem) {
- lfree = mem;
- }
- mem->next = nmem->next;
- ((struct mem *)&ram[nmem->next])->prev = (u8_t *)mem - ram;
- }
-
- /* plug hole backward */
- pmem = (struct mem *)&ram[mem->prev];
- if (pmem != mem && pmem->used == 0) {
- if (lfree == mem) {
- lfree = pmem;
- }
- pmem->next = mem->next;
- ((struct mem *)&ram[mem->next])->prev = (u8_t *)pmem - ram;
- }
-}
-
-void
-mem_init(void)
-{
- struct mem *mem;
-
-#if 1
- /* Adam original */
-#else
- /* Christiaan alignment fix */
- ram = (u8_t*)ram_heap;
-#endif
- memset(ram, 0, MEM_SIZE);
- mem = (struct mem *)ram;
- mem->next = MEM_SIZE;
- mem->prev = 0;
- mem->used = 0;
- ram_end = (struct mem *)&ram[MEM_SIZE];
- ram_end->used = 1;
- ram_end->next = MEM_SIZE;
- ram_end->prev = MEM_SIZE;
-
- mem_sem = sys_sem_new(1);
-
- lfree = (struct mem *)ram;
-
-#if MEM_STATS
- lwip_stats.mem.avail = MEM_SIZE;
-#endif /* MEM_STATS */
-}
-
-void
-mem_free(void *rmem)
-{
- struct mem *mem;
-
- if (rmem == NULL) {
- LWIP_DEBUGF(MEM_DEBUG | DBG_TRACE | 2, ("mem_free(p == NULL) was called.\n"));
- return;
- }
-
- sys_sem_wait(mem_sem);
-
- LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
- (u8_t *)rmem < (u8_t *)ram_end);
-
- if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
- LWIP_DEBUGF(MEM_DEBUG | 3, ("mem_free: illegal memory\n"));
-#if MEM_STATS
- ++lwip_stats.mem.err;
-#endif /* MEM_STATS */
- sys_sem_signal(mem_sem);
- return;
- }
- mem = (struct mem *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
-
- LWIP_ASSERT("mem_free: mem->used", mem->used);
-
- mem->used = 0;
-
- if (mem < lfree) {
- lfree = mem;
- }
-
-#if MEM_STATS
- lwip_stats.mem.used -= mem->next - ((u8_t *)mem - ram);
-
-#endif /* MEM_STATS */
- plug_holes(mem);
- sys_sem_signal(mem_sem);
-}
-
-void *
-mem_realloc(void *rmem, mem_size_t newsize)
-{
- mem_size_t size;
- mem_size_t ptr, ptr2;
- struct mem *mem, *mem2;
-
- /* Expand the size of the allocated memory region so that we can
- adjust for alignment. */
- if ((newsize % MEM_ALIGNMENT) != 0) {
- newsize += MEM_ALIGNMENT - ((newsize + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT);
- }
-
- if (newsize > MEM_SIZE) {
- return NULL;
- }
-
- sys_sem_wait(mem_sem);
-
- LWIP_ASSERT("mem_realloc: legal memory", (u8_t *)rmem >= (u8_t *)ram &&
- (u8_t *)rmem < (u8_t *)ram_end);
-
- if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {
- LWIP_DEBUGF(MEM_DEBUG | 3, ("mem_realloc: illegal memory\n"));
- return rmem;
- }
- mem = (struct mem *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);
-
- ptr = (u8_t *)mem - ram;
-
- size = mem->next - ptr - SIZEOF_STRUCT_MEM;
-#if MEM_STATS
- lwip_stats.mem.used -= (size - newsize);
-#endif /* MEM_STATS */
-
- if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE < size) {
- ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;
- mem2 = (struct mem *)&ram[ptr2];
- mem2->used = 0;
- mem2->next = mem->next;
- mem2->prev = ptr;
- mem->next = ptr2;
- if (mem2->next != MEM_SIZE) {
- ((struct mem *)&ram[mem2->next])->prev = ptr2;
- }
-
- plug_holes(mem2);
- }
- sys_sem_signal(mem_sem);
- return rmem;
-}
-
-#if 1
-/**
- * Adam's mem_malloc(), suffers from bug #17922
- * Set if to 0 for alternative mem_malloc().
- */
-void *
-mem_malloc(mem_size_t size)
-{
- mem_size_t ptr, ptr2;
- struct mem *mem, *mem2;
-
- if (size == 0) {
- return NULL;
- }
-
- /* Expand the size of the allocated memory region so that we can
- adjust for alignment. */
- if ((size % MEM_ALIGNMENT) != 0) {
- size += MEM_ALIGNMENT - ((size + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT);
- }
-
- if (size > MEM_SIZE) {
- return NULL;
- }
-
- sys_sem_wait(mem_sem);
-
- for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE; ptr = ((struct mem *)&ram[ptr])->next) {
- mem = (struct mem *)&ram[ptr];
- if (!mem->used &&
- mem->next - (ptr + SIZEOF_STRUCT_MEM) >= size + SIZEOF_STRUCT_MEM) {
- ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
- mem2 = (struct mem *)&ram[ptr2];
-
- mem2->prev = ptr;
- mem2->next = mem->next;
- mem->next = ptr2;
- if (mem2->next != MEM_SIZE) {
- ((struct mem *)&ram[mem2->next])->prev = ptr2;
- }
-
- mem2->used = 0;
- mem->used = 1;
-#if MEM_STATS
- lwip_stats.mem.used += (size + SIZEOF_STRUCT_MEM);
- /* if (lwip_stats.mem.max < lwip_stats.mem.used) {
- lwip_stats.mem.max = lwip_stats.mem.used;
- } */
- if (lwip_stats.mem.max < ptr2) {
- lwip_stats.mem.max = ptr2;
- }
-#endif /* MEM_STATS */
-
- if (mem == lfree) {
- /* Find next free block after mem */
- while (lfree->used && lfree != ram_end) {
- lfree = (struct mem *)&ram[lfree->next];
- }
- LWIP_ASSERT("mem_malloc: !lfree->used", !lfree->used);
- }
- sys_sem_signal(mem_sem);
- LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
- (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
- LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
- (unsigned long)((u8_t *)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
- return (u8_t *)mem + SIZEOF_STRUCT_MEM;
- }
- }
- LWIP_DEBUGF(MEM_DEBUG | 2, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
-#if MEM_STATS
- ++lwip_stats.mem.err;
-#endif /* MEM_STATS */
- sys_sem_signal(mem_sem);
- return NULL;
-}
-#else
-/**
- * Adam's mem_malloc() plus solution for bug #17922
- */
-void *
-mem_malloc(mem_size_t size)
-{
- mem_size_t ptr, ptr2;
- struct mem *mem, *mem2;
-
- if (size == 0) {
- return NULL;
- }
-
- /* Expand the size of the allocated memory region so that we can
- adjust for alignment. */
- if ((size % MEM_ALIGNMENT) != 0) {
- size += MEM_ALIGNMENT - ((size + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT);
- }
-
- if (size > MEM_SIZE) {
- return NULL;
- }
-
- sys_sem_wait(mem_sem);
-
- for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE - size; ptr = ((struct mem *)&ram[ptr])->next) {
- mem = (struct mem *)&ram[ptr];
-
- if (!mem->used) {
-
- ptr2 = ptr + SIZEOF_STRUCT_MEM + size;
-
- if (mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) >= size) {
- /* split large block, create empty remainder */
- mem->next = ptr2;
- mem->used = 1;
- /* create mem2 struct */
- mem2 = (struct mem *)&ram[ptr2];
- mem2->used = 0;
- mem2->next = mem->next;
- mem2->prev = ptr;
-
- if (mem2->next != MEM_SIZE) {
- ((struct mem *)&ram[mem2->next])->prev = ptr2;
- }
- }
- else if (mem->next - (ptr + SIZEOF_STRUCT_MEM) > size) {
- /* near fit, no split, no mem2 creation,
- round up to mem->next */
- ptr2 = mem->next;
- mem->used = 1;
- }
- else if (mem->next - (ptr + SIZEOF_STRUCT_MEM) == size) {
- /* exact fit, do not split, no mem2 creation */
- mem->next = ptr2;
- mem->used = 1;
- }
-
- if (mem->used) {
-#if MEM_STATS
- lwip_stats.mem.used += (size + SIZEOF_STRUCT_MEM);
- if (lwip_stats.mem.max < ptr2) {
- lwip_stats.mem.max = ptr2;
- }
-#endif /* MEM_STATS */
- if (mem == lfree) {
- /* Find next free block after mem */
- while (lfree->used && lfree != ram_end) {
- lfree = (struct mem *)&ram[lfree->next];
- }
- LWIP_ASSERT("mem_malloc: !lfree->used", !lfree->used);
- }
- sys_sem_signal(mem_sem);
- LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.",
- (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);
- LWIP_ASSERT("mem_malloc: allocated memory properly aligned.",
- (unsigned long)((u8_t *)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);
- return (u8_t *)mem + SIZEOF_STRUCT_MEM;
- }
- }
- }
- LWIP_DEBUGF(MEM_DEBUG | 2, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size));
-#if MEM_STATS
- ++lwip_stats.mem.err;
-#endif /* MEM_STATS */
- sys_sem_signal(mem_sem);
- return NULL;
-}
-#endif
-
-#endif /* MEM_LIBC_MALLOC == 0 */
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/memp.c b/src/VBox/Devices/Network/lwip/src/core/memp.c
deleted file mode 100644
index b31812d..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/memp.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/memp.h"
-
-#include "lwip/pbuf.h"
-#include "lwip/udp.h"
-#include "lwip/raw.h"
-#include "lwip/tcp.h"
-#include "lwip/api.h"
-#include "lwip/api_msg.h"
-#include "lwip/tcpip.h"
-
-#include "lwip/sys.h"
-#include "lwip/stats.h"
-
-struct memp {
- struct memp *next;
-};
-
-#define MEMP_SIZE MEM_ALIGN_SIZE(sizeof(struct memp))
-
-static struct memp *memp_tab[MEMP_MAX];
-
-static const u16_t memp_sizes[MEMP_MAX] = {
- MEM_ALIGN_SIZE(sizeof(struct pbuf)),
- MEM_ALIGN_SIZE(sizeof(struct raw_pcb)),
- MEM_ALIGN_SIZE(sizeof(struct udp_pcb)),
- MEM_ALIGN_SIZE(sizeof(struct tcp_pcb)),
- MEM_ALIGN_SIZE(sizeof(struct tcp_pcb_listen)),
- MEM_ALIGN_SIZE(sizeof(struct tcp_seg)),
- MEM_ALIGN_SIZE(sizeof(struct netbuf)),
- MEM_ALIGN_SIZE(sizeof(struct netconn)),
- MEM_ALIGN_SIZE(sizeof(struct api_msg)),
- MEM_ALIGN_SIZE(sizeof(struct tcpip_msg)),
- MEM_ALIGN_SIZE(sizeof(struct sys_timeo))
-};
-
-static const u16_t memp_num[MEMP_MAX] = {
- MEMP_NUM_PBUF,
- MEMP_NUM_RAW_PCB,
- MEMP_NUM_UDP_PCB,
- MEMP_NUM_TCP_PCB,
- MEMP_NUM_TCP_PCB_LISTEN,
- MEMP_NUM_TCP_SEG,
- MEMP_NUM_NETBUF,
- MEMP_NUM_NETCONN,
- MEMP_NUM_API_MSG,
- MEMP_NUM_TCPIP_MSG,
- MEMP_NUM_SYS_TIMEOUT
-};
-
-#define MEMP_TYPE_SIZE(qty, type) \
- ((qty) * (MEMP_SIZE + MEM_ALIGN_SIZE(sizeof(type))))
-
-static u8_t memp_memory[MEM_ALIGNMENT - 1 +
- MEMP_TYPE_SIZE(MEMP_NUM_PBUF, struct pbuf) +
- MEMP_TYPE_SIZE(MEMP_NUM_RAW_PCB, struct raw_pcb) +
- MEMP_TYPE_SIZE(MEMP_NUM_UDP_PCB, struct udp_pcb) +
- MEMP_TYPE_SIZE(MEMP_NUM_TCP_PCB, struct tcp_pcb) +
- MEMP_TYPE_SIZE(MEMP_NUM_TCP_PCB_LISTEN, struct tcp_pcb_listen) +
- MEMP_TYPE_SIZE(MEMP_NUM_TCP_SEG, struct tcp_seg) +
- MEMP_TYPE_SIZE(MEMP_NUM_NETBUF, struct netbuf) +
- MEMP_TYPE_SIZE(MEMP_NUM_NETCONN, struct netconn) +
- MEMP_TYPE_SIZE(MEMP_NUM_API_MSG, struct api_msg) +
- MEMP_TYPE_SIZE(MEMP_NUM_TCPIP_MSG, struct tcpip_msg) +
- MEMP_TYPE_SIZE(MEMP_NUM_SYS_TIMEOUT, struct sys_timeo)];
-
-#if !SYS_LIGHTWEIGHT_PROT
-static sys_sem_t mutex;
-#endif
-
-#if MEMP_SANITY_CHECK
-static int
-memp_sanity(void)
-{
- s16_t i, c;
- struct memp *m, *n;
-
- for (i = 0; i < MEMP_MAX; i++) {
- for (m = memp_tab[i]; m != NULL; m = m->next) {
- c = 1;
- for (n = memp_tab[i]; n != NULL; n = n->next) {
- if (n == m && --c < 0) {
- return 0; /* LW was: abort(); */
- }
- }
- }
- }
- return 1;
-}
-#endif /* MEMP_SANITY_CHECK*/
-
-void
-memp_init(void)
-{
- struct memp *memp;
- u16_t i, j;
-
-#if MEMP_STATS
- for (i = 0; i < MEMP_MAX; ++i) {
- lwip_stats.memp[i].used = lwip_stats.memp[i].max =
- lwip_stats.memp[i].err = 0;
- lwip_stats.memp[i].avail = memp_num[i];
- }
-#endif /* MEMP_STATS */
-
- memp = MEM_ALIGN(memp_memory);
- for (i = 0; i < MEMP_MAX; ++i) {
- memp_tab[i] = NULL;
- for (j = 0; j < memp_num[i]; ++j) {
- memp->next = memp_tab[i];
- memp_tab[i] = memp;
- memp = (struct memp *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]);
- }
- }
-
-#if !SYS_LIGHTWEIGHT_PROT
- mutex = sys_sem_new(1);
-#endif
-}
-
-void *
-memp_malloc(memp_t type)
-{
- struct memp *memp;
- void *mem;
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_DECL_PROTECT(old_level);
-#endif
-
- LWIP_ASSERT("memp_malloc: type < MEMP_MAX", type < MEMP_MAX);
-
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_PROTECT(old_level);
-#else /* SYS_LIGHTWEIGHT_PROT */
- sys_sem_wait(mutex);
-#endif /* SYS_LIGHTWEIGHT_PROT */
-
- memp = memp_tab[type];
-
- if (memp != NULL) {
- memp_tab[type] = memp->next;
- memp->next = NULL;
-#if MEMP_STATS
- ++lwip_stats.memp[type].used;
- if (lwip_stats.memp[type].used > lwip_stats.memp[type].max) {
- lwip_stats.memp[type].max = lwip_stats.memp[type].used;
- }
-#endif /* MEMP_STATS */
- mem = (u8_t *)memp + MEMP_SIZE;
- LWIP_ASSERT("memp_malloc: memp properly aligned",
- ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0);
- } else {
- LWIP_DEBUGF(MEMP_DEBUG | 2, ("memp_malloc: out of memory in pool %"S16_F"\n", type));
-#if MEMP_STATS
- ++lwip_stats.memp[type].err;
-#endif /* MEMP_STATS */
- mem = NULL;
- }
-
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_UNPROTECT(old_level);
-#else /* SYS_LIGHTWEIGHT_PROT */
- sys_sem_signal(mutex);
-#endif /* SYS_LIGHTWEIGHT_PROT */
-
- return mem;
-}
-
-void
-memp_free(memp_t type, void *mem)
-{
- struct memp *memp;
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_DECL_PROTECT(old_level);
-#endif /* SYS_LIGHTWEIGHT_PROT */
-
- if (mem == NULL) {
- return;
- }
-
- memp = (struct memp *)((u8_t *)mem - MEMP_SIZE);
-
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_PROTECT(old_level);
-#else /* SYS_LIGHTWEIGHT_PROT */
- sys_sem_wait(mutex);
-#endif /* SYS_LIGHTWEIGHT_PROT */
-
-#if MEMP_STATS
- lwip_stats.memp[type].used--;
-#endif /* MEMP_STATS */
-
- memp->next = memp_tab[type];
- memp_tab[type] = memp;
-
-#if MEMP_SANITY_CHECK
- LWIP_ASSERT("memp sanity", memp_sanity());
-#endif
-
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_UNPROTECT(old_level);
-#else /* SYS_LIGHTWEIGHT_PROT */
- sys_sem_signal(mutex);
-#endif /* SYS_LIGHTWEIGHT_PROT */
-}
diff --git a/src/VBox/Devices/Network/lwip/src/core/netif.c b/src/VBox/Devices/Network/lwip/src/core/netif.c
deleted file mode 100644
index b1e2bc1..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/netif.c
+++ /dev/null
@@ -1,325 +0,0 @@
-/**
- * @file
- *
- * lwIP network interface abstraction
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/tcp.h"
-#include "lwip/snmp.h"
-
-struct netif *netif_list = NULL;
-struct netif *netif_default = NULL;
-
-/**
- * Add a network interface to the list of lwIP netifs.
- *
- * @param netif a pre-allocated netif structure
- * @param ipaddr IP address for the new netif
- * @param netmask network mask for the new netif
- * @param gw default gateway IP address for the new netif
- * @param state opaque data passed to the new netif
- * @param init callback function that initializes the interface
- * @param input callback function that is called to pass
- * ingress packets up in the protocol layer stack.
- *
- * @return netif, or NULL if failed.
- */
-struct netif *
-netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,
- struct ip_addr *gw,
- void *state,
- err_t (* init)(struct netif *netif),
- err_t (* input)(struct pbuf *p, struct netif *netif))
-{
- static s16_t netifnum = 0;
-
- /* reset new interface configuration state */
- netif->ip_addr.addr = 0;
- netif->netmask.addr = 0;
- netif->gw.addr = 0;
- netif->flags = 0;
-#if LWIP_DHCP
- /* netif not under DHCP control by default */
- netif->dhcp = NULL;
-#endif
- /* remember netif specific state information data */
- netif->state = state;
- netif->num = netifnum++;
- netif->input = input;
-
- netif_set_addr(netif, ipaddr, netmask, gw);
-
- /* call user specified initialization function for netif */
- if (init(netif) != ERR_OK) {
- return NULL;
- }
-
- /* add this netif to the list */
- netif->next = netif_list;
- netif_list = netif;
- snmp_inc_iflist();
-
- LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP addr ",
- netif->name[0], netif->name[1]));
- ip_addr_debug_print(NETIF_DEBUG, ipaddr);
- LWIP_DEBUGF(NETIF_DEBUG, (" netmask "));
- ip_addr_debug_print(NETIF_DEBUG, netmask);
- LWIP_DEBUGF(NETIF_DEBUG, (" gw "));
- ip_addr_debug_print(NETIF_DEBUG, gw);
- LWIP_DEBUGF(NETIF_DEBUG, ("\n"));
- return netif;
-}
-
-void
-netif_set_addr(struct netif *netif,struct ip_addr *ipaddr, struct ip_addr *netmask,
- struct ip_addr *gw)
-{
- netif_set_ipaddr(netif, ipaddr);
- netif_set_netmask(netif, netmask);
- netif_set_gw(netif, gw);
-}
-
-void netif_remove(struct netif * netif)
-{
- if ( netif == NULL ) return;
-
- snmp_delete_ipaddridx_tree(netif);
-
- /* is it the first netif? */
- if (netif_list == netif) {
- netif_list = netif->next;
- snmp_dec_iflist();
- }
- else {
- /* look for netif further down the list */
- struct netif * tmpNetif;
- for (tmpNetif = netif_list; tmpNetif != NULL; tmpNetif = tmpNetif->next) {
- if (tmpNetif->next == netif) {
- tmpNetif->next = netif->next;
- snmp_dec_iflist();
- break;
- }
- }
- if (tmpNetif == NULL)
- return; /* we didn't find any netif today */
- }
- /* this netif is default? */
- if (netif_default == netif)
- /* reset default netif */
- netif_default = NULL;
- LWIP_DEBUGF( NETIF_DEBUG, ("netif_remove: removed netif\n") );
-}
-
-struct netif *
-netif_find(char *name)
-{
- struct netif *netif;
- u8_t num;
-
- if (name == NULL) {
- return NULL;
- }
-
- num = name[2] - '0';
-
- for(netif = netif_list; netif != NULL; netif = netif->next) {
- if (num == netif->num &&
- name[0] == netif->name[0] &&
- name[1] == netif->name[1]) {
- LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1]));
- return netif;
- }
- }
- LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1]));
- return NULL;
-}
-
-void
-netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr)
-{
- /* TODO: Handling of obsolete pcbs */
- /* See: http://mail.gnu.org/archive/html/lwip-users/2003-03/msg00118.html */
-#if LWIP_TCP
- struct tcp_pcb *pcb;
- struct tcp_pcb_listen *lpcb;
-
- /* address is actually being changed? */
- if ((ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0)
- {
- /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */
- LWIP_DEBUGF(NETIF_DEBUG | 1, ("netif_set_ipaddr: netif address being changed\n"));
- pcb = tcp_active_pcbs;
- while (pcb != NULL) {
- /* PCB bound to current local interface address? */
- if (ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) {
- /* this connection must be aborted */
- struct tcp_pcb *next = pcb->next;
- LWIP_DEBUGF(NETIF_DEBUG | 1, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb));
- tcp_abort(pcb);
- pcb = next;
- } else {
- pcb = pcb->next;
- }
- }
- for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
- /* PCB bound to current local interface address? */
- if (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr))) {
- /* The PCB is listening to the old ipaddr and
- * is set to listen to the new one instead */
- ip_addr_set(&(lpcb->local_ip), ipaddr);
- }
- }
- }
-#endif
- snmp_delete_ipaddridx_tree(netif);
- snmp_delete_iprteidx_tree(0,netif);
- /* set new IP address to netif */
- ip_addr_set(&(netif->ip_addr), ipaddr);
- snmp_insert_ipaddridx_tree(netif);
- snmp_insert_iprteidx_tree(0,netif);
-
-#if 0 /* only allowed for Ethernet interfaces TODO: how can we check? */
- /** For Ethernet network interfaces, we would like to send a
- * "gratuitous ARP"; this is an ARP packet sent by a node in order
- * to spontaneously cause other nodes to update an entry in their
- * ARP cache. From RFC 3220 "IP Mobility Support for IPv4" section 4.6.
- */
- etharp_query(netif, ipaddr, NULL);
-#endif
- LWIP_DEBUGF(NETIF_DEBUG | DBG_TRACE | DBG_STATE | 3, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
- netif->name[0], netif->name[1],
- ip4_addr1(&netif->ip_addr),
- ip4_addr2(&netif->ip_addr),
- ip4_addr3(&netif->ip_addr),
- ip4_addr4(&netif->ip_addr)));
-}
-
-void
-netif_set_gw(struct netif *netif, struct ip_addr *gw)
-{
- ip_addr_set(&(netif->gw), gw);
- LWIP_DEBUGF(NETIF_DEBUG | DBG_TRACE | DBG_STATE | 3, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
- netif->name[0], netif->name[1],
- ip4_addr1(&netif->gw),
- ip4_addr2(&netif->gw),
- ip4_addr3(&netif->gw),
- ip4_addr4(&netif->gw)));
-}
-
-void
-netif_set_netmask(struct netif *netif, struct ip_addr *netmask)
-{
- snmp_delete_iprteidx_tree(0, netif);
- /* set new netmask to netif */
- ip_addr_set(&(netif->netmask), netmask);
- snmp_insert_iprteidx_tree(0, netif);
- LWIP_DEBUGF(NETIF_DEBUG | DBG_TRACE | DBG_STATE | 3, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
- netif->name[0], netif->name[1],
- ip4_addr1(&netif->netmask),
- ip4_addr2(&netif->netmask),
- ip4_addr3(&netif->netmask),
- ip4_addr4(&netif->netmask)));
-}
-
-void
-netif_set_default(struct netif *netif)
-{
- if (netif == NULL)
- {
- /* remove default route */
- snmp_delete_iprteidx_tree(1, netif);
- }
- else
- {
- /* install default route */
- snmp_insert_iprteidx_tree(1, netif);
- }
- netif_default = netif;
- LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n",
- netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\''));
-}
-
-/**
- * Bring an interface up, available for processing
- * traffic.
- *
- * @note: Enabling DHCP on a down interface will make it come
- * up once configured.
- *
- * @see dhcp_start()
- */
-void netif_set_up(struct netif *netif)
-{
- netif->flags |= NETIF_FLAG_UP;
-#if LWIP_SNMP
- snmp_get_sysuptime(&netif->ts);
-#endif
-}
-
-/**
- * Ask if an interface is up
- */
-u8_t netif_is_up(struct netif *netif)
-{
- return (netif->flags & NETIF_FLAG_UP)?1:0;
-}
-
-/**
- * Bring an interface down, disabling any traffic processing.
- *
- * @note: Enabling DHCP on a down interface will make it come
- * up once configured.
- *
- * @see dhcp_start()
- */
-void netif_set_down(struct netif *netif)
-{
- netif->flags &= ~NETIF_FLAG_UP;
-#if LWIP_SNMP
- snmp_get_sysuptime(&netif->ts);
-#endif
-}
-
-void
-netif_init(void)
-{
- netif_list = netif_default = NULL;
-}
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/pbuf.c b/src/VBox/Devices/Network/lwip/src/core/pbuf.c
deleted file mode 100644
index 454b135..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/pbuf.c
+++ /dev/null
@@ -1,961 +0,0 @@
-/**
- * @file
- * Packet buffer management
- *
- * Packets are built from the pbuf data structure. It supports dynamic
- * memory allocation for packet contents or can reference externally
- * managed packet contents both in RAM and ROM. Quick allocation for
- * incoming packets is provided through pools with fixed sized pbufs.
- *
- * A packet may span over multiple pbufs, chained as a singly linked
- * list. This is called a "pbuf chain".
- *
- * Multiple packets may be queued, also using this singly linked list.
- * This is called a "packet queue".
- *
- * So, a packet queue consists of one or more pbuf chains, each of
- * which consist of one or more pbufs. Currently, queues are only
- * supported in a limited section of lwIP, this is the etharp queueing
- * code. Outside of this section no packet queues are supported yet.
- *
- * The differences between a pbuf chain and a packet queue are very
- * precise but subtle.
- *
- * The last pbuf of a packet has a ->tot_len field that equals the
- * ->len field. It can be found by traversing the list. If the last
- * pbuf of a packet has a ->next field other than NULL, more packets
- * are on the queue.
- *
- * Therefore, looping through a pbuf of a single packet, has an
- * loop end condition (tot_len == p->len), NOT (next == NULL).
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include <string.h>
-
-#include "lwip/opt.h"
-#include "lwip/stats.h"
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/pbuf.h"
-#include "lwip/sys.h"
-#include "arch/perf.h"
-
-static u8_t pbuf_pool_memory[MEM_ALIGNMENT - 1 + PBUF_POOL_SIZE * MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE + sizeof(struct pbuf))];
-
-#if !SYS_LIGHTWEIGHT_PROT
-static volatile u8_t pbuf_pool_free_lock, pbuf_pool_alloc_lock;
-static sys_sem_t pbuf_pool_free_sem;
-#endif
-
-static struct pbuf *pbuf_pool = NULL;
-
-/**
- * Initializes the pbuf module.
- *
- * A large part of memory is allocated for holding the pool of pbufs.
- * The size of the individual pbufs in the pool is given by the size
- * parameter, and the number of pbufs in the pool by the num parameter.
- *
- * After the memory has been allocated, the pbufs are set up. The
- * ->next pointer in each pbuf is set up to point to the next pbuf in
- * the pool.
- *
- */
-void
-pbuf_init(void)
-{
- struct pbuf *p, *q = NULL;
- u16_t i;
-
- pbuf_pool = (struct pbuf *)MEM_ALIGN(pbuf_pool_memory);
-
-#if PBUF_STATS
- lwip_stats.pbuf.avail = PBUF_POOL_SIZE;
-#endif /* PBUF_STATS */
-
- /* Set up ->next pointers to link the pbufs of the pool together */
- p = pbuf_pool;
-
- for(i = 0; i < PBUF_POOL_SIZE; ++i) {
- p->next = (struct pbuf *)((u8_t *)p + PBUF_POOL_BUFSIZE + sizeof(struct pbuf));
- p->len = p->tot_len = PBUF_POOL_BUFSIZE;
- p->payload = MEM_ALIGN((void *)((u8_t *)p + sizeof(struct pbuf)));
- p->flags = PBUF_FLAG_POOL;
- q = p;
- p = p->next;
- }
-
- /* The ->next pointer of last pbuf is NULL to indicate that there
- are no more pbufs in the pool */
- q->next = NULL;
-
-#if !SYS_LIGHTWEIGHT_PROT
- pbuf_pool_alloc_lock = 0;
- pbuf_pool_free_lock = 0;
- pbuf_pool_free_sem = sys_sem_new(1);
-#endif
-}
-
-/**
- * @internal only called from pbuf_alloc()
- */
-static struct pbuf *
-pbuf_pool_alloc(void)
-{
- struct pbuf *p = NULL;
-
- SYS_ARCH_DECL_PROTECT(old_level);
- SYS_ARCH_PROTECT(old_level);
-
-#if !SYS_LIGHTWEIGHT_PROT
- /* Next, check the actual pbuf pool, but if the pool is locked, we
- pretend to be out of buffers and return NULL. */
- if (pbuf_pool_free_lock) {
-#if PBUF_STATS
- ++lwip_stats.pbuf.alloc_locked;
-#endif /* PBUF_STATS */
- return NULL;
- }
- pbuf_pool_alloc_lock = 1;
- if (!pbuf_pool_free_lock) {
-#endif /* SYS_LIGHTWEIGHT_PROT */
- p = pbuf_pool;
- if (p) {
- pbuf_pool = p->next;
- }
-#if !SYS_LIGHTWEIGHT_PROT
-#if PBUF_STATS
- } else {
- ++lwip_stats.pbuf.alloc_locked;
-#endif /* PBUF_STATS */
- }
- pbuf_pool_alloc_lock = 0;
-#endif /* SYS_LIGHTWEIGHT_PROT */
-
-#if PBUF_STATS
- if (p != NULL) {
- ++lwip_stats.pbuf.used;
- if (lwip_stats.pbuf.used > lwip_stats.pbuf.max) {
- lwip_stats.pbuf.max = lwip_stats.pbuf.used;
- }
- }
-#endif /* PBUF_STATS */
-
- SYS_ARCH_UNPROTECT(old_level);
- return p;
-}
-
-
-/**
- * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type).
- *
- * The actual memory allocated for the pbuf is determined by the
- * layer at which the pbuf is allocated and the requested size
- * (from the size parameter).
- *
- * @param flag this parameter decides how and where the pbuf
- * should be allocated as follows:
- *
- * - PBUF_RAM: buffer memory for pbuf is allocated as one large
- * chunk. This includes protocol headers as well.
- * - PBUF_ROM: no buffer memory is allocated for the pbuf, even for
- * protocol headers. Additional headers must be prepended
- * by allocating another pbuf and chain in to the front of
- * the ROM pbuf. It is assumed that the memory used is really
- * similar to ROM in that it is immutable and will not be
- * changed. Memory which is dynamic should generally not
- * be attached to PBUF_ROM pbufs. Use PBUF_REF instead.
- * - PBUF_REF: no buffer memory is allocated for the pbuf, even for
- * protocol headers. It is assumed that the pbuf is only
- * being used in a single thread. If the pbuf gets queued,
- * then pbuf_take should be called to copy the buffer.
- * - PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from
- * the pbuf pool that is allocated during pbuf_init().
- *
- * @return the allocated pbuf. If multiple pbufs where allocated, this
- * is the first pbuf of a pbuf chain.
- */
-struct pbuf *
-pbuf_alloc(pbuf_layer l, u16_t length, pbuf_flag flag)
-{
- struct pbuf *p, *q, *r;
- u16_t offset;
- s32_t rem_len; /* remaining length */
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_alloc(length=%"U16_F")\n", length));
-
- /* determine header offset */
- offset = 0;
- switch (l) {
- case PBUF_TRANSPORT:
- /* add room for transport (often TCP) layer header */
- offset += PBUF_TRANSPORT_HLEN;
- /* FALLTHROUGH */
- case PBUF_IP:
- /* add room for IP layer header */
- offset += PBUF_IP_HLEN;
- /* FALLTHROUGH */
- case PBUF_LINK:
- /* add room for link layer header */
- offset += PBUF_LINK_HLEN;
- break;
- case PBUF_RAW:
- break;
- default:
- LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0);
- return NULL;
- }
-
- switch (flag) {
- case PBUF_POOL:
- /* allocate head of pbuf chain into p */
- p = pbuf_pool_alloc();
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_alloc: allocated pbuf %p\n", (void *)p));
- if (p == NULL) {
-#if PBUF_STATS
- ++lwip_stats.pbuf.err;
-#endif /* PBUF_STATS */
- return NULL;
- }
- p->next = NULL;
-
- /* make the payload pointer point 'offset' bytes into pbuf data memory */
- p->payload = MEM_ALIGN((void *)((u8_t *)p + (sizeof(struct pbuf) + offset)));
- LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned",
- ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
- /* the total length of the pbuf chain is the requested size */
- p->tot_len = length;
- /* set the length of the first pbuf in the chain */
- p->len = length > PBUF_POOL_BUFSIZE - offset? PBUF_POOL_BUFSIZE - offset: length;
- /* set reference count (needed here in case we fail) */
- p->ref = 1;
-
- /* now allocate the tail of the pbuf chain */
-
- /* remember first pbuf for linkage in next iteration */
- r = p;
- /* remaining length to be allocated */
- rem_len = length - p->len;
- /* any remaining pbufs to be allocated? */
- while (rem_len > 0) {
- q = pbuf_pool_alloc();
- if (q == NULL) {
- LWIP_DEBUGF(PBUF_DEBUG | 2, ("pbuf_alloc: Out of pbufs in pool.\n"));
-#if PBUF_STATS
- ++lwip_stats.pbuf.err;
-#endif /* PBUF_STATS */
- /* free chain so far allocated */
- pbuf_free(p);
- /* bail out unsuccesfully */
- return NULL;
- }
- q->next = NULL;
- /* make previous pbuf point to this pbuf */
- r->next = q;
- /* set total length of this pbuf and next in chain */
- q->tot_len = rem_len;
- /* this pbuf length is pool size, unless smaller sized tail */
- q->len = rem_len > PBUF_POOL_BUFSIZE? PBUF_POOL_BUFSIZE: rem_len;
- q->payload = (void *)((u8_t *)q + sizeof(struct pbuf));
- LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned",
- ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);
- q->ref = 1;
- /* calculate remaining length to be allocated */
- rem_len -= q->len;
- /* remember this pbuf for linkage in next iteration */
- r = q;
- }
- /* end of chain */
- /*r->next = NULL;*/
-
- break;
- case PBUF_RAM:
- /* If pbuf is to be allocated in RAM, allocate memory for it. */
- p = mem_malloc(MEM_ALIGN_SIZE(sizeof(struct pbuf) + offset) + MEM_ALIGN_SIZE(length));
- if (p == NULL) {
- return NULL;
- }
- /* Set up internal structure of the pbuf. */
- p->payload = MEM_ALIGN((void *)((u8_t *)p + sizeof(struct pbuf) + offset));
- p->len = p->tot_len = length;
- p->next = NULL;
- p->flags = PBUF_FLAG_RAM;
-
- LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned",
- ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);
- break;
- /* pbuf references existing (non-volatile static constant) ROM payload? */
- case PBUF_ROM:
- /* pbuf references existing (externally allocated) RAM payload? */
- case PBUF_REF:
- /* only allocate memory for the pbuf structure */
- p = memp_malloc(MEMP_PBUF);
- if (p == NULL) {
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n", flag == PBUF_ROM?"ROM":"REF"));
- return NULL;
- }
- /* caller must set this field properly, afterwards */
- p->payload = NULL;
- p->len = p->tot_len = length;
- p->next = NULL;
- p->flags = (flag == PBUF_ROM? PBUF_FLAG_ROM: PBUF_FLAG_REF);
- break;
- default:
- LWIP_ASSERT("pbuf_alloc: erroneous flag", 0);
- return NULL;
- }
- /* set reference count */
- p->ref = 1;
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p));
- return p;
-}
-
-
-#if PBUF_STATS
-#define DEC_PBUF_STATS do { --lwip_stats.pbuf.used; } while (0)
-#else /* PBUF_STATS */
-#define DEC_PBUF_STATS
-#endif /* PBUF_STATS */
-
-#define PBUF_POOL_FAST_FREE(p) do { \
- p->next = pbuf_pool; \
- pbuf_pool = p; \
- DEC_PBUF_STATS; \
- } while (0)
-
-#if SYS_LIGHTWEIGHT_PROT
-#define PBUF_POOL_FREE(p) do { \
- SYS_ARCH_DECL_PROTECT(old_level); \
- SYS_ARCH_PROTECT(old_level); \
- PBUF_POOL_FAST_FREE(p); \
- SYS_ARCH_UNPROTECT(old_level); \
- } while (0)
-#else /* SYS_LIGHTWEIGHT_PROT */
-#define PBUF_POOL_FREE(p) do { \
- sys_sem_wait(pbuf_pool_free_sem); \
- PBUF_POOL_FAST_FREE(p); \
- sys_sem_signal(pbuf_pool_free_sem); \
- } while (0)
-#endif /* SYS_LIGHTWEIGHT_PROT */
-
-/**
- * Shrink a pbuf chain to a desired length.
- *
- * @param p pbuf to shrink.
- * @param new_len desired new length of pbuf chain
- *
- * Depending on the desired length, the first few pbufs in a chain might
- * be skipped and left unchanged. The new last pbuf in the chain will be
- * resized, and any remaining pbufs will be freed.
- *
- * @note If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted.
- * @note May not be called on a packet queue.
- *
- * @bug Cannot grow the size of a pbuf (chain) (yet).
- */
-void
-pbuf_realloc(struct pbuf *p, u16_t new_len)
-{
- struct pbuf *q;
- u16_t rem_len; /* remaining length */
- s16_t grow;
-
- LWIP_ASSERT("pbuf_realloc: sane p->flags", p->flags == PBUF_FLAG_POOL ||
- p->flags == PBUF_FLAG_ROM ||
- p->flags == PBUF_FLAG_RAM ||
- p->flags == PBUF_FLAG_REF);
-
- /* desired length larger than current length? */
- if (new_len >= p->tot_len) {
- /* enlarging not yet supported */
- return;
- }
-
- /* the pbuf chain grows by (new_len - p->tot_len) bytes
- * (which may be negative in case of shrinking) */
- grow = new_len - p->tot_len;
-
- /* first, step over any pbufs that should remain in the chain */
- rem_len = new_len;
- q = p;
- /* should this pbuf be kept? */
- while (rem_len > q->len) {
- /* decrease remaining length by pbuf length */
- rem_len -= q->len;
- /* decrease total length indicator */
- q->tot_len += grow;
- /* proceed to next pbuf in chain */
- q = q->next;
- }
- /* we have now reached the new last pbuf (in q) */
- /* rem_len == desired length for pbuf q */
-
- /* shrink allocated memory for PBUF_RAM */
- /* (other types merely adjust their length fields */
- if ((q->flags == PBUF_FLAG_RAM) && (rem_len != q->len)) {
- /* reallocate and adjust the length of the pbuf that will be split */
- mem_realloc(q, (u8_t *)q->payload - (u8_t *)q + rem_len);
- }
- /* adjust length fields for new last pbuf */
- q->len = rem_len;
- q->tot_len = q->len;
-
- /* any remaining pbufs in chain? */
- if (q->next != NULL) {
- /* free remaining pbufs in chain */
- pbuf_free(q->next);
- }
- /* q is last packet in chain */
- q->next = NULL;
-
-}
-
-/**
- * Adjusts the payload pointer to hide or reveal headers in the payload.
- *
- * Adjusts the ->payload pointer so that space for a header
- * (dis)appears in the pbuf payload.
- *
- * The ->payload, ->tot_len and ->len fields are adjusted.
- *
- * @param hdr_size_inc Number of bytes to increment header size which
- * increases the size of the pbuf. New space is on the front.
- * (Using a negative value decreases the header size.)
- * If hdr_size_inc is 0, this function does nothing and returns succesful.
- *
- * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so
- * the call will fail. A check is made that the increase in header size does
- * not move the payload pointer in front of the start of the buffer.
- * @return non-zero on failure, zero on success.
- *
- */
-u8_t
-pbuf_header(struct pbuf *p, s16_t header_size_increment)
-{
- u16_t flags;
- void *payload;
-
- LWIP_ASSERT("p != NULL", p != NULL);
- if ((header_size_increment == 0) || (p == NULL)) return 0;
-
- flags = p->flags;
- /* remember current payload pointer */
- payload = p->payload;
-
- /* pbuf types containing payloads? */
- if (flags == PBUF_FLAG_RAM || flags == PBUF_FLAG_POOL) {
- /* set new payload pointer */
- p->payload = (u8_t *)p->payload - header_size_increment;
- /* boundary check fails? */
- if ((u8_t *)p->payload < (u8_t *)p + sizeof(struct pbuf)) {
- LWIP_DEBUGF( PBUF_DEBUG | 2, ("pbuf_header: failed as %p < %p (not enough space for new header size)\n",
- (void *)p->payload,
- (void *)(p + 1)));
- /* restore old payload pointer */
- p->payload = payload;
- /* bail out unsuccesfully */
- return 1;
- }
- /* pbuf types refering to external payloads? */
- } else if (flags == PBUF_FLAG_REF || flags == PBUF_FLAG_ROM) {
- /* hide a header in the payload? */
- if ((header_size_increment < 0) && (header_size_increment - p->len <= 0)) {
- /* increase payload pointer */
- p->payload = (u8_t *)p->payload - header_size_increment;
- } else {
- /* cannot expand payload to front (yet!)
- * bail out unsuccesfully */
- return 1;
- }
- }
- /* modify pbuf length fields */
- p->len += header_size_increment;
- p->tot_len += header_size_increment;
-
- LWIP_DEBUGF( PBUF_DEBUG, ("pbuf_header: old %p new %p (%"S16_F")\n",
- (void *)payload, (void *)p->payload, header_size_increment));
-
- return 0;
-}
-
-/**
- * Dereference a pbuf chain or queue and deallocate any no-longer-used
- * pbufs at the head of this chain or queue.
- *
- * Decrements the pbuf reference count. If it reaches zero, the pbuf is
- * deallocated.
- *
- * For a pbuf chain, this is repeated for each pbuf in the chain,
- * up to the first pbuf which has a non-zero reference count after
- * decrementing. So, when all reference counts are one, the whole
- * chain is free'd.
- *
- * @param pbuf The pbuf (chain) to be dereferenced.
- *
- * @return the number of pbufs that were de-allocated
- * from the head of the chain.
- *
- * @note MUST NOT be called on a packet queue (Not verified to work yet).
- * @note the reference counter of a pbuf equals the number of pointers
- * that refer to the pbuf (or into the pbuf).
- *
- * @internal examples:
- *
- * Assuming existing chains a->b->c with the following reference
- * counts, calling pbuf_free(a) results in:
- *
- * 1->2->3 becomes ...1->3
- * 3->3->3 becomes 2->3->3
- * 1->1->2 becomes ......1
- * 2->1->1 becomes 1->1->1
- * 1->1->1 becomes .......
- *
- */
-u8_t
-pbuf_free(struct pbuf *p)
-{
- u16_t flags;
- struct pbuf *q;
- u8_t count;
- SYS_ARCH_DECL_PROTECT(old_level);
-
- LWIP_ASSERT("p != NULL", p != NULL);
- /* if assertions are disabled, proceed with debug output */
- if (p == NULL) {
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_free(p == NULL) was called.\n"));
- return 0;
- }
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_free(%p)\n", (void *)p));
-
- PERF_START;
-
- LWIP_ASSERT("pbuf_free: sane flags",
- p->flags == PBUF_FLAG_RAM || p->flags == PBUF_FLAG_ROM ||
- p->flags == PBUF_FLAG_REF || p->flags == PBUF_FLAG_POOL);
-
- count = 0;
- /* Since decrementing ref cannot be guaranteed to be a single machine operation
- * we must protect it. Also, the later test of ref must be protected.
- */
- SYS_ARCH_PROTECT(old_level);
- /* de-allocate all consecutive pbufs from the head of the chain that
- * obtain a zero reference count after decrementing*/
- while (p != NULL) {
- /* all pbufs in a chain are referenced at least once */
- LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0);
- /* decrease reference count (number of pointers to pbuf) */
- p->ref--;
- /* this pbuf is no longer referenced to? */
- if (p->ref == 0) {
- /* remember next pbuf in chain for next iteration */
- q = p->next;
- LWIP_DEBUGF( PBUF_DEBUG | 2, ("pbuf_free: deallocating %p\n", (void *)p));
- flags = p->flags;
- /* is this a pbuf from the pool? */
- if (flags == PBUF_FLAG_POOL) {
- p->len = p->tot_len = PBUF_POOL_BUFSIZE;
- p->payload = (void *)((u8_t *)p + sizeof(struct pbuf));
- PBUF_POOL_FREE(p);
- /* is this a ROM or RAM referencing pbuf? */
- } else if (flags == PBUF_FLAG_ROM || flags == PBUF_FLAG_REF) {
- memp_free(MEMP_PBUF, p);
- /* flags == PBUF_FLAG_RAM */
- } else {
- mem_free(p);
- }
- count++;
- /* proceed to next pbuf */
- p = q;
- /* p->ref > 0, this pbuf is still referenced to */
- /* (and so the remaining pbufs in chain as well) */
- } else {
- LWIP_DEBUGF( PBUF_DEBUG | 2, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, (u16_t)p->ref));
- /* stop walking through the chain */
- p = NULL;
- }
- }
- SYS_ARCH_UNPROTECT(old_level);
- PERF_STOP("pbuf_free");
- /* return number of de-allocated pbufs */
- return count;
-}
-
-/**
- * Count number of pbufs in a chain
- *
- * @param p first pbuf of chain
- * @return the number of pbufs in a chain
- */
-
-u8_t
-pbuf_clen(struct pbuf *p)
-{
- u8_t len;
-
- len = 0;
- while (p != NULL) {
- ++len;
- p = p->next;
- }
- return len;
-}
-
-/**
- * Increment the reference count of the pbuf.
- *
- * @param p pbuf to increase reference counter of
- *
- */
-void
-pbuf_ref(struct pbuf *p)
-{
- SYS_ARCH_DECL_PROTECT(old_level);
- /* pbuf given? */
- if (p != NULL) {
- SYS_ARCH_PROTECT(old_level);
- ++(p->ref);
- SYS_ARCH_UNPROTECT(old_level);
- }
-}
-
-/**
- * Concatenate two pbufs (each may be a pbuf chain) and take over
- * the caller's reference of the tail pbuf.
- *
- * @note The caller MAY NOT reference the tail pbuf afterwards.
- * Use pbuf_chain() for that purpose.
- *
- * @see pbuf_chain()
- */
-
-void
-pbuf_cat(struct pbuf *h, struct pbuf *t)
-{
- struct pbuf *p;
-
- LWIP_ASSERT("h != NULL (programmer violates API)", h != NULL);
- LWIP_ASSERT("t != NULL (programmer violates API)", t != NULL);
- if ((h == NULL) || (t == NULL)) return;
-
- /* proceed to last pbuf of chain */
- for (p = h; p->next != NULL; p = p->next) {
- /* add total length of second chain to all totals of first chain */
- p->tot_len += t->tot_len;
- }
- /* { p is last pbuf of first h chain, p->next == NULL } */
- LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len);
- LWIP_ASSERT("p->next == NULL", p->next == NULL);
- /* add total length of second chain to last pbuf total of first chain */
- p->tot_len += t->tot_len;
- /* chain last pbuf of head (p) with first of tail (t) */
- p->next = t;
- /* p->next now references t, but the caller will drop its reference to t,
- * so netto there is no change to the reference count of t.
- */
-}
-
-/**
- * Chain two pbufs (or pbuf chains) together.
- *
- * The caller MUST call pbuf_free(t) once it has stopped
- * using it. Use pbuf_cat() instead if you no longer use t.
- *
- * @param h head pbuf (chain)
- * @param t tail pbuf (chain)
- * @note The pbufs MUST belong to the same packet.
- * @note MAY NOT be called on a packet queue.
- *
- * The ->tot_len fields of all pbufs of the head chain are adjusted.
- * The ->next field of the last pbuf of the head chain is adjusted.
- * The ->ref field of the first pbuf of the tail chain is adjusted.
- *
- */
-void
-pbuf_chain(struct pbuf *h, struct pbuf *t)
-{
- pbuf_cat(h, t);
- /* t is now referenced by h */
- pbuf_ref(t);
- LWIP_DEBUGF(PBUF_DEBUG | DBG_FRESH | 2, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t));
-}
-
-/* For packet queueing. Note that queued packets MUST be dequeued first
- * using pbuf_dequeue() before calling other pbuf_() functions. */
-#if ARP_QUEUEING
-/**
- * Add a packet to the end of a queue.
- *
- * @param q pointer to first packet on the queue
- * @param n packet to be queued
- *
- * Both packets MUST be given, and must be different.
- */
-void
-pbuf_queue(struct pbuf *p, struct pbuf *n)
-{
-#if PBUF_DEBUG /* remember head of queue */
- struct pbuf *q = p;
-#endif
- /* programmer stupidity checks */
- LWIP_ASSERT("p == NULL in pbuf_queue: this indicates a programmer error\n", p != NULL);
- LWIP_ASSERT("n == NULL in pbuf_queue: this indicates a programmer error\n", n != NULL);
- LWIP_ASSERT("p == n in pbuf_queue: this indicates a programmer error\n", p != n);
- if ((p == NULL) || (n == NULL) || (p == n)){
- LWIP_DEBUGF(PBUF_DEBUG | DBG_HALT | 3, ("pbuf_queue: programmer argument error\n"));
- return;
- }
-
- /* iterate through all packets on queue */
- while (p->next != NULL) {
-/* be very picky about pbuf chain correctness */
-#if PBUF_DEBUG
- /* iterate through all pbufs in packet */
- while (p->tot_len != p->len) {
- /* make sure invariant condition holds */
- LWIP_ASSERT("p->len < p->tot_len", p->len < p->tot_len);
- /* make sure each packet is complete */
- LWIP_ASSERT("p->next != NULL", p->next != NULL);
- p = p->next;
- /* { p->tot_len == p->len => p is last pbuf of a packet } */
- }
- /* { p is last pbuf of a packet } */
- /* proceed to next packet on queue */
-#endif
- /* proceed to next pbuf */
- if (p->next != NULL) p = p->next;
- }
- /* { p->tot_len == p->len and p->next == NULL } ==>
- * { p is last pbuf of last packet on queue } */
- /* chain last pbuf of queue with n */
- p->next = n;
- /* n is now referenced to by the (packet p in the) queue */
- pbuf_ref(n);
-#if PBUF_DEBUG
- LWIP_DEBUGF(PBUF_DEBUG | DBG_FRESH | 2,
- ("pbuf_queue: newly queued packet %p sits after packet %p in queue %p\n",
- (void *)n, (void *)p, (void *)q));
-#endif
-}
-
-/**
- * Remove a packet from the head of a queue.
- *
- * The caller MUST reference the remainder of the queue (as returned). The
- * caller MUST NOT call pbuf_ref() as it implicitly takes over the reference
- * from p.
- *
- * @param p pointer to first packet on the queue which will be dequeued.
- * @return first packet on the remaining queue (NULL if no further packets).
- *
- */
-struct pbuf *
-pbuf_dequeue(struct pbuf *p)
-{
- struct pbuf *q;
- LWIP_ASSERT("p != NULL", p != NULL);
-
- /* iterate through all pbufs in packet p */
- while (p->tot_len != p->len) {
- /* make sure invariant condition holds */
- LWIP_ASSERT("p->len < p->tot_len", p->len < p->tot_len);
- /* make sure each packet is complete */
- LWIP_ASSERT("p->next != NULL", p->next != NULL);
- p = p->next;
- }
- /* { p->tot_len == p->len } => p is the last pbuf of the first packet */
- /* remember next packet on queue in q */
- q = p->next;
- /* dequeue packet p from queue */
- p->next = NULL;
- /* any next packet on queue? */
- if (q != NULL) {
- /* although q is no longer referenced by p, it MUST be referenced by
- * the caller, who is maintaining this packet queue. So, we do not call
- * pbuf_free(q) here, resulting in an implicit pbuf_ref(q) for the caller. */
- LWIP_DEBUGF(PBUF_DEBUG | DBG_FRESH | 2, ("pbuf_dequeue: first remaining packet on queue is %p\n", (void *)q));
- } else {
- LWIP_DEBUGF(PBUF_DEBUG | DBG_FRESH | 2, ("pbuf_dequeue: no further packets on queue\n"));
- }
- return q;
-}
-#endif
-
-/**
- *
- * Create PBUF_POOL (or PBUF_RAM) copies of PBUF_REF pbufs.
- *
- * Used to queue packets on behalf of the lwIP stack, such as
- * ARP based queueing.
- *
- * Go through a pbuf chain and replace any PBUF_REF buffers
- * with PBUF_POOL (or PBUF_RAM) pbufs, each taking a copy of
- * the referenced data.
- *
- * @note You MUST explicitly use p = pbuf_take(p);
- * The pbuf you give as argument, may have been replaced
- * by a (differently located) copy through pbuf_take()!
- *
- * @note Any replaced pbufs will be freed through pbuf_free().
- * This may deallocate them if they become no longer referenced.
- *
- * @param p Head of pbuf chain to process
- *
- * @return Pointer to head of pbuf chain
- */
-struct pbuf *
-pbuf_take(struct pbuf *p)
-{
- struct pbuf *q , *prev, *head;
- LWIP_ASSERT("pbuf_take: p != NULL\n", p != NULL);
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 3, ("pbuf_take(%p)\n", (void*)p));
-
- prev = NULL;
- head = p;
- /* iterate through pbuf chain */
- do
- {
- /* pbuf is of type PBUF_REF? */
- if (p->flags == PBUF_FLAG_REF) {
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE, ("pbuf_take: encountered PBUF_REF %p\n", (void *)p));
- /* allocate a pbuf (w/ payload) fully in RAM */
- /* PBUF_POOL buffers are faster if we can use them */
- if (p->len <= PBUF_POOL_BUFSIZE) {
- q = pbuf_alloc(PBUF_RAW, p->len, PBUF_POOL);
- if (q == NULL) {
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_take: Could not allocate PBUF_POOL\n"));
- }
- } else {
- /* no replacement pbuf yet */
- q = NULL;
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_take: PBUF_POOL too small to replace PBUF_REF\n"));
- }
- /* no (large enough) PBUF_POOL was available? retry with PBUF_RAM */
- if (q == NULL) {
- q = pbuf_alloc(PBUF_RAW, p->len, PBUF_RAM);
- if (q == NULL) {
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 2, ("pbuf_take: Could not allocate PBUF_RAM\n"));
- }
- }
- /* replacement pbuf could be allocated? */
- if (q != NULL)
- {
- /* copy p to q */
- /* copy successor */
- q->next = p->next;
- /* remove linkage from original pbuf */
- p->next = NULL;
- /* remove linkage to original pbuf */
- if (prev != NULL) {
- /* prev->next == p at this point */
- LWIP_ASSERT("prev->next == p", prev->next == p);
- /* break chain and insert new pbuf instead */
- prev->next = q;
- /* prev == NULL, so we replaced the head pbuf of the chain */
- } else {
- head = q;
- }
- /* copy pbuf payload */
- memcpy(q->payload, p->payload, p->len);
- q->tot_len = p->tot_len;
- q->len = p->len;
- /* in case p was the first pbuf, it is no longer refered to by
- * our caller, as the caller MUST do p = pbuf_take(p);
- * in case p was not the first pbuf, it is no longer refered to
- * by prev. we can safely free the pbuf here.
- * (note that we have set p->next to NULL already so that
- * we will not free the rest of the chain by accident.)
- */
- pbuf_free(p);
- /* do not copy ref, since someone else might be using the old buffer */
- LWIP_DEBUGF(PBUF_DEBUG, ("pbuf_take: replaced PBUF_REF %p with %p\n", (void *)p, (void *)q));
- p = q;
- } else {
- /* deallocate chain */
- pbuf_free(head);
- LWIP_DEBUGF(PBUF_DEBUG | 2, ("pbuf_take: failed to allocate replacement pbuf for %p\n", (void *)p));
- return NULL;
- }
- /* p->flags != PBUF_FLAG_REF */
- } else {
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 1, ("pbuf_take: skipping pbuf not of type PBUF_REF\n"));
- }
- /* remember this pbuf */
- prev = p;
- /* proceed to next pbuf in original chain */
- p = p->next;
- } while (p);
- LWIP_DEBUGF(PBUF_DEBUG | DBG_TRACE | 1, ("pbuf_take: end of chain reached.\n"));
-
- return head;
-}
-
-/**
- * Dechains the first pbuf from its succeeding pbufs in the chain.
- *
- * Makes p->tot_len field equal to p->len.
- * @param p pbuf to dechain
- * @return remainder of the pbuf chain, or NULL if it was de-allocated.
- * @note May not be called on a packet queue.
- */
-struct pbuf *
-pbuf_dechain(struct pbuf *p)
-{
- struct pbuf *q;
- u8_t tail_gone = 1;
- /* tail */
- q = p->next;
- /* pbuf has successor in chain? */
- if (q != NULL) {
- /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */
- LWIP_ASSERT("p->tot_len == p->len + q->tot_len", q->tot_len == p->tot_len - p->len);
- /* enforce invariant if assertion is disabled */
- q->tot_len = p->tot_len - p->len;
- /* decouple pbuf from remainder */
- p->next = NULL;
- /* total length of pbuf p is its own length only */
- p->tot_len = p->len;
- /* q is no longer referenced by p, free it */
- LWIP_DEBUGF(PBUF_DEBUG | DBG_STATE, ("pbuf_dechain: unreferencing %p\n", (void *)q));
- tail_gone = pbuf_free(q);
- if (tail_gone > 0) {
- LWIP_DEBUGF(PBUF_DEBUG | DBG_STATE,
- ("pbuf_dechain: deallocated %p (as it is no longer referenced)\n", (void *)q));
- }
- /* return remaining tail or NULL if deallocated */
- }
- /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */
- LWIP_ASSERT("p->tot_len == p->len", p->tot_len == p->len);
- return (tail_gone > 0? NULL: q);
-}
diff --git a/src/VBox/Devices/Network/lwip/src/core/raw.c b/src/VBox/Devices/Network/lwip/src/core/raw.c
deleted file mode 100644
index 3019980..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/raw.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/**
- * @file
- *
- * Implementation of raw protocol PCBs for low-level handling of
- * different types of protocols besides (or overriding) those
- * already available in lwIP.
- *
- */
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include <string.h>
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-#include "lwip/memp.h"
-#include "lwip/inet.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/raw.h"
-
-#include "lwip/stats.h"
-
-#include "arch/perf.h"
-#include "lwip/snmp.h"
-
-#if LWIP_RAW
-
-/** The list of RAW PCBs */
-static struct raw_pcb *raw_pcbs = NULL;
-
-void
-raw_init(void)
-{
- raw_pcbs = NULL;
-}
-
-/**
- * Determine if in incoming IP packet is covered by a RAW PCB
- * and if so, pass it to a user-provided receive callback function.
- *
- * Given an incoming IP datagram (as a chain of pbufs) this function
- * finds a corresponding RAW PCB and calls the corresponding receive
- * callback function.
- *
- * @param pbuf pbuf to be demultiplexed to a RAW PCB.
- * @param netif network interface on which the datagram was received.
- * @Return - 1 if the packet has been eaten by a RAW PCB receive
- * callback function. The caller MAY NOT not reference the
- * packet any longer, and MAY NOT call pbuf_free().
- * @return - 0 if packet is not eaten (pbuf is still referenced by the
- * caller).
- *
- */
-u8_t
-raw_input(struct pbuf *p, struct netif *inp)
-{
- struct raw_pcb *pcb;
- struct ip_hdr *iphdr;
- s16_t proto;
- u8_t eaten = 0;
-
- iphdr = p->payload;
- proto = IPH_PROTO(iphdr);
-
- pcb = raw_pcbs;
- /* loop through all raw pcbs until the packet is eaten by one */
- /* this allows multiple pcbs to match against the packet by design */
- while ((eaten == 0) && (pcb != NULL)) {
- if (pcb->protocol == proto) {
- /* receive callback function available? */
- if (pcb->recv != NULL) {
- /* the receive callback function did not eat the packet? */
- if (pcb->recv(pcb->recv_arg, pcb, p, &(iphdr->src)) != 0)
- {
- /* receive function ate the packet */
- p = NULL;
- eaten = 1;
- }
- }
- /* no receive callback function was set for this raw PCB */
- /* drop the packet */
- }
- pcb = pcb->next;
- }
- return eaten;
-}
-
-/**
- * Bind a RAW PCB.
- *
- * @param pcb RAW PCB to be bound with a local address ipaddr.
- * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to
- * bind to all local interfaces.
- *
- * @return lwIP error code.
- * - ERR_OK. Successful. No error occured.
- * - ERR_USE. The specified IP address is already bound to by
- * another RAW PCB.
- *
- * @see raw_disconnect()
- */
-err_t
-raw_bind(struct raw_pcb *pcb, struct ip_addr *ipaddr)
-{
- ip_addr_set(&pcb->local_ip, ipaddr);
- return ERR_OK;
-}
-
-/**
- * Connect an RAW PCB. This function is required by upper layers
- * of lwip. Using the raw api you could use raw_sendto() instead
- *
- * This will associate the RAW PCB with the remote address.
- *
- * @param pcb RAW PCB to be connected with remote address ipaddr and port.
- * @param ipaddr remote IP address to connect with.
- *
- * @return lwIP error code
- *
- * @see raw_disconnect() and raw_sendto()
- */
-err_t
-raw_connect(struct raw_pcb *pcb, struct ip_addr *ipaddr)
-{
- ip_addr_set(&pcb->remote_ip, ipaddr);
- return ERR_OK;
-}
-
-
-/**
- * Set the callback function for received packets that match the
- * raw PCB's protocol and binding.
- *
- * The callback function MUST either
- * - eat the packet by calling pbuf_free() and returning non-zero. The
- * packet will not be passed to other raw PCBs or other protocol layers.
- * - not free the packet, and return zero. The packet will be matched
- * against further PCBs and/or forwarded to another protocol layers.
- *
- * @return non-zero if the packet was free()d, zero if the packet remains
- * available for others.
- */
-void
-raw_recv(struct raw_pcb *pcb,
- u8_t (* recv)(void *arg, struct raw_pcb *upcb, struct pbuf *p,
- struct ip_addr *addr),
- void *recv_arg)
-{
- /* remember recv() callback and user data */
- pcb->recv = recv;
- pcb->recv_arg = recv_arg;
-}
-
-/**
- * Send the raw IP packet to the given address. Note that actually you cannot
- * modify the IP headers (this is inconsistent with the receive callback where
- * you actually get the IP headers), you can only specify the IP payload here.
- * It requires some more changes in lwIP. (there will be a raw_send() function
- * then.)
- *
- * @param pcb the raw pcb which to send
- * @param p the IP payload to send
- * @param ipaddr the destination address of the IP packet
- *
- */
-err_t
-raw_sendto(struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *ipaddr)
-{
- err_t err;
- struct netif *netif;
- struct ip_addr *src_ip;
- struct pbuf *q; /* q will be sent down the stack */
-
- LWIP_DEBUGF(RAW_DEBUG | DBG_TRACE | 3, ("raw_sendto\n"));
-
- /* not enough space to add an IP header to first pbuf in given p chain? */
- if (pbuf_header(p, IP_HLEN)) {
- /* allocate header in new pbuf */
- q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM);
- /* new header pbuf could not be allocated? */
- if (q == NULL) {
- LWIP_DEBUGF(RAW_DEBUG | DBG_TRACE | 2, ("raw_sendto: could not allocate header\n"));
- return ERR_MEM;
- }
- /* chain header q in front of given pbuf p */
- pbuf_chain(q, p);
- /* { first pbuf q points to header pbuf } */
- LWIP_DEBUGF(RAW_DEBUG, ("raw_sendto: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p));
- } else {
- /* first pbuf q equals given pbuf */
- q = p;
- pbuf_header(q, -IP_HLEN);
- }
-
- if ((netif = ip_route(ipaddr)) == NULL) {
- LWIP_DEBUGF(RAW_DEBUG | 1, ("raw_sendto: No route to 0x%"X32_F"\n", ipaddr->addr));
-#if RAW_STATS
- /* ++lwip_stats.raw.rterr;*/
-#endif /* RAW_STATS */
- /* free any temporary header pbuf allocated by pbuf_header() */
- if (q != p) {
- pbuf_free(q);
- }
- return ERR_RTE;
- }
-
- if (ip_addr_isany(&pcb->local_ip)) {
- /* use outgoing network interface IP address as source address */
- src_ip = &(netif->ip_addr);
- } else {
- /* use RAW PCB local IP address as source address */
- src_ip = &(pcb->local_ip);
- }
-
- err = ip_output_if (q, src_ip, ipaddr, pcb->ttl, pcb->tos, pcb->protocol, netif);
-
- /* did we chain a header earlier? */
- if (q != p) {
- /* free the header */
- pbuf_free(q);
- }
- return err;
-}
-
-/**
- * Send the raw IP packet to the address given by raw_connect()
- *
- * @param pcb the raw pcb which to send
- * @param p the IP payload to send
- * @param ipaddr the destination address of the IP packet
- *
- */
-err_t
-raw_send(struct raw_pcb *pcb, struct pbuf *p)
-{
- return raw_sendto(pcb, p, &pcb->remote_ip);
-}
-
-/**
- * Remove an RAW PCB.
- *
- * @param pcb RAW PCB to be removed. The PCB is removed from the list of
- * RAW PCB's and the data structure is freed from memory.
- *
- * @see raw_new()
- */
-void
-raw_remove(struct raw_pcb *pcb)
-{
- struct raw_pcb *pcb2;
- /* pcb to be removed is first in list? */
- if (raw_pcbs == pcb) {
- /* make list start at 2nd pcb */
- raw_pcbs = raw_pcbs->next;
- /* pcb not 1st in list */
- } else for(pcb2 = raw_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
- /* find pcb in raw_pcbs list */
- if (pcb2->next != NULL && pcb2->next == pcb) {
- /* remove pcb from list */
- pcb2->next = pcb->next;
- }
- }
- memp_free(MEMP_RAW_PCB, pcb);
-}
-
-/**
- * Create a RAW PCB.
- *
- * @return The RAW PCB which was created. NULL if the PCB data structure
- * could not be allocated.
- *
- * @param proto the protocol number of the IPs payload (e.g. IP_PROTO_ICMP)
- *
- * @see raw_remove()
- */
-struct raw_pcb *
-raw_new(u16_t proto) {
- struct raw_pcb *pcb;
-
- LWIP_DEBUGF(RAW_DEBUG | DBG_TRACE | 3, ("raw_new\n"));
-
- pcb = memp_malloc(MEMP_RAW_PCB);
- /* could allocate RAW PCB? */
- if (pcb != NULL) {
- /* initialize PCB to all zeroes */
- memset(pcb, 0, sizeof(struct raw_pcb));
- pcb->protocol = proto;
- pcb->ttl = RAW_TTL;
- pcb->next = raw_pcbs;
- raw_pcbs = pcb;
- }
- return pcb;
-}
-
-#endif /* LWIP_RAW */
diff --git a/src/VBox/Devices/Network/lwip/src/core/snmp/asn1_dec.c b/src/VBox/Devices/Network/lwip/src/core/snmp/asn1_dec.c
deleted file mode 100644
index 5e04b38..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/snmp/asn1_dec.c
+++ /dev/null
@@ -1,652 +0,0 @@
-/**
- * @file
- * Abstract Syntax Notation One (ISO 8824, 8825) decoding
- *
- * @todo not optimised (yet), favor correctness over speed, favor speed over size
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_SNMP
-#include "lwip/snmp_asn1.h"
-
-/**
- * Retrieves type field from incoming pbuf chain.
- *
- * @param p points to a pbuf holding an ASN1 coded type field
- * @param ofs points to the offset within the pbuf chain of the ASN1 coded type field
- * @param type return ASN1 type
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
- */
-err_t
-snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
- *type = *msg_ptr;
- return ERR_OK;
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Decodes length field from incoming pbuf chain into host length.
- *
- * @param p points to a pbuf holding an ASN1 coded length
- * @param ofs points to the offset within the pbuf chain of the ASN1 coded length
- * @param octets_used returns number of octets used by the length code
- * @param length return host order length, upto 64k
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
- */
-err_t
-snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
-
- if (*msg_ptr < 0x80)
- {
- /* primitive definite length format */
- *octets_used = 1;
- *length = *msg_ptr;
- return ERR_OK;
- }
- else if (*msg_ptr == 0x80)
- {
- /* constructed indefinite length format, termination with two zero octets */
- u8_t zeros;
- u8_t i;
-
- *length = 0;
- zeros = 0;
- while (zeros != 2)
- {
- i = 2;
- while (i > 0)
- {
- i--;
- (*length) += 1;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- if (*msg_ptr == 0)
- {
- zeros++;
- if (zeros == 2)
- {
- /* stop while (i > 0) */
- i = 0;
- }
- }
- else
- {
- zeros = 0;
- }
- }
- }
- *octets_used = 1;
- return ERR_OK;
- }
- else if (*msg_ptr == 0x81)
- {
- /* constructed definite length format, one octet */
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- *length = *msg_ptr;
- *octets_used = 2;
- return ERR_OK;
- }
- else if (*msg_ptr == 0x82)
- {
- u8_t i;
-
- /* constructed definite length format, two octets */
- i = 2;
- while (i > 0)
- {
- i--;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- if (i == 0)
- {
- /* least significant length octet */
- *length |= *msg_ptr;
- }
- else
- {
- /* most significant length octet */
- *length = (*msg_ptr) << 8;
- }
- }
- *octets_used = 3;
- return ERR_OK;
- }
- else
- {
- /* constructed definite length format 3..127 octets, this is too big (>64k) */
- /** @todo: do we need to accept inefficient codings with many leading zero's? */
- *octets_used = 1 + ((*msg_ptr) & 0x7f);
- return ERR_ARG;
- }
- }
- p = p->next;
- }
-
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Decodes positive integer (counter, gauge, timeticks) into u32_t.
- *
- * @param p points to a pbuf holding an ASN1 coded integer
- * @param ofs points to the offset within the pbuf chain of the ASN1 coded integer
- * @param len length of the coded integer field
- * @param value return host order integer
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
- *
- * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
- * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
- * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
- */
-err_t
-snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
- if ((len > 0) && (len < 6))
- {
- /* start from zero */
- *value = 0;
- if (*msg_ptr & 0x80)
- {
- /* negative, expecting zero sign bit! */
- return ERR_ARG;
- }
- else
- {
- /* positive */
- if ((len > 1) && (*msg_ptr == 0))
- {
- /* skip leading "sign byte" octet 0x00 */
- len--;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- }
- /* OR octets with value */
- while (len > 1)
- {
- len--;
- *value |= *msg_ptr;
- *value <<= 8;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- *value |= *msg_ptr;
- return ERR_OK;
- }
- else
- {
- return ERR_ARG;
- }
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Decodes integer into s32_t.
- *
- * @param p points to a pbuf holding an ASN1 coded integer
- * @param ofs points to the offset within the pbuf chain of the ASN1 coded integer
- * @param len length of the coded integer field
- * @param value return host order integer
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
- *
- * @note ASN coded integers are _always_ signed!
- */
-err_t
-snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
- u8_t *lsb_ptr = (u8_t*)value;
- u8_t sign;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
- if ((len > 0) && (len < 5))
- {
- if (*msg_ptr & 0x80)
- {
- /* negative, start from -1 */
- *value = -1;
- sign = 1;
- }
- else
- {
- /* positive, start from 0 */
- *value = 0;
- sign = 0;
- }
- /* OR/AND octets with value */
- while (len > 1)
- {
- len--;
- if (sign)
- {
- *lsb_ptr &= *msg_ptr;
- *value <<= 8;
- *lsb_ptr |= 255;
- }
- else
- {
- *lsb_ptr |= *msg_ptr;
- *value <<= 8;
- }
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- if (sign)
- {
- *lsb_ptr &= *msg_ptr;
- }
- else
- {
- *lsb_ptr |= *msg_ptr;
- }
- return ERR_OK;
- }
- else
- {
- return ERR_ARG;
- }
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Decodes object identifier from incoming message into array of s32_t.
- *
- * @param p points to a pbuf holding an ASN1 coded object identifier
- * @param ofs points to the offset within the pbuf chain of the ASN1 coded object identifier
- * @param len length of the coded object identifier
- * @param oid return object identifier struct
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
- */
-err_t
-snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
- s32_t *oid_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
-
- oid->len = 0;
- oid_ptr = &oid->id[0];
- if (len > 0)
- {
- /* first compressed octet */
- if (*msg_ptr == 0x2B)
- {
- /* (most) common case 1.3 (iso.org) */
- *oid_ptr = 1;
- oid_ptr++;
- *oid_ptr = 3;
- oid_ptr++;
- }
- else if (*msg_ptr < 40)
- {
- *oid_ptr = 0;
- oid_ptr++;
- *oid_ptr = *msg_ptr;
- oid_ptr++;
- }
- else if (*msg_ptr < 80)
- {
- *oid_ptr = 1;
- oid_ptr++;
- *oid_ptr = (*msg_ptr) - 40;
- oid_ptr++;
- }
- else
- {
- *oid_ptr = 2;
- oid_ptr++;
- *oid_ptr = (*msg_ptr) - 80;
- oid_ptr++;
- }
- oid->len = 2;
- }
- else
- {
- /* accepting zero length identifiers e.g. for
- getnext operation. uncommon but valid */
- return ERR_OK;
- }
- len--;
- if (len > 0)
- {
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN))
- {
- /* sub-identifier uses multiple octets */
- if (*msg_ptr & 0x80)
- {
- s32_t sub_id = 0;
-
- while ((*msg_ptr & 0x80) && (len > 1))
- {
- len--;
- sub_id = (sub_id << 7) + (*msg_ptr & ~0x80);
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- if (!(*msg_ptr & 0x80) && (len > 0))
- {
- /* last octet sub-identifier */
- len--;
- sub_id = (sub_id << 7) + *msg_ptr;
- *oid_ptr = sub_id;
- }
- }
- else
- {
- /* !(*msg_ptr & 0x80) sub-identifier uses single octet */
- len--;
- *oid_ptr = *msg_ptr;
- }
- if (len > 0)
- {
- /* remaining oid bytes available ... */
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- oid_ptr++;
- oid->len++;
- }
- if (len == 0)
- {
- /* len == 0, end of oid */
- return ERR_OK;
- }
- else
- {
- /* len > 0, oid->len == LWIP_SNMP_OBJ_ID_LEN or malformed encoding */
- return ERR_ARG;
- }
-
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Decodes (copies) raw data (ip-addresses, octet strings, opaque encoding)
- * from incoming message into array.
- *
- * @param p points to a pbuf holding an ASN1 coded raw data
- * @param ofs points to the offset within the pbuf chain of the ASN1 coded raw data
- * @param len length of the coded raw data (zero is valid, e.g. empty string!)
- * @param raw_len length of the raw return value
- * @param raw return raw bytes
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode
- */
-err_t
-snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- if (len > 0)
- {
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
- if (raw_len >= len)
- {
- while (len > 1)
- {
- /* copy len - 1 octets */
- len--;
- *raw = *msg_ptr;
- raw++;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- /* copy last octet */
- *raw = *msg_ptr;
- return ERR_OK;
- }
- else
- {
- /* raw_len < len, not enough dst space */
- return ERR_ARG;
- }
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
- }
- else
- {
- /* len == 0, empty string */
- return ERR_OK;
- }
-}
-
-#endif /* LWIP_SNMP */
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/snmp/asn1_enc.c b/src/VBox/Devices/Network/lwip/src/core/snmp/asn1_enc.c
deleted file mode 100644
index 4d04f28..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/snmp/asn1_enc.c
+++ /dev/null
@@ -1,610 +0,0 @@
-/**
- * @file
- * Abstract Syntax Notation One (ISO 8824, 8825) encoding
- *
- * @todo not optimised (yet), favor correctness over speed, favor speed over size
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_SNMP
-#include "lwip/snmp_asn1.h"
-
-/**
- * Returns octet count for length.
- *
- * @param length
- * @param octets_needed points to the return value
- */
-void
-snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed)
-{
- if (length < 0x80U)
- {
- *octets_needed = 1;
- }
- else if (length < 0x100U)
- {
- *octets_needed = 2;
- }
- else
- {
- *octets_needed = 3;
- }
-}
-
-/**
- * Returns octet count for an u32_t.
- *
- * @param value
- * @param octets_needed points to the return value
- *
- * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded
- * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value
- * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!
- */
-void
-snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed)
-{
- if (value < 0x80UL)
- {
- *octets_needed = 1;
- }
- else if (value < 0x8000UL)
- {
- *octets_needed = 2;
- }
- else if (value < 0x800000UL)
- {
- *octets_needed = 3;
- }
- else if (value < 0x80000000UL)
- {
- *octets_needed = 4;
- }
- else
- {
- *octets_needed = 5;
- }
-}
-
-/**
- * Returns octet count for an s32_t.
- *
- * @param value
- * @param octets_needed points to the return value
- *
- * @note ASN coded integers are _always_ signed.
- */
-void
-snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed)
-{
- if (value < 0)
- {
- value = ~value;
- }
- if (value < 0x80L)
- {
- *octets_needed = 1;
- }
- else if (value < 0x8000L)
- {
- *octets_needed = 2;
- }
- else if (value < 0x800000L)
- {
- *octets_needed = 3;
- }
- else
- {
- *octets_needed = 4;
- }
-}
-
-/**
- * Returns octet count for an object identifier.
- *
- * @param ident_len object identifier array length
- * @param ident points to object identifier array
- * @param octets_needed points to the return value
- */
-void
-snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed)
-{
- s32_t sub_id;
- u8_t cnt;
-
- cnt = 0;
- if (ident_len > 1)
- {
- /* compressed prefix in one octet */
- cnt++;
- ident_len -= 2;
- ident += 2;
- }
- while(ident_len > 0)
- {
- ident_len--;
- sub_id = *ident;
-
- sub_id >>= 7;
- cnt++;
- while(sub_id > 0)
- {
- sub_id >>= 7;
- cnt++;
- }
- ident++;
- }
- *octets_needed = cnt;
-}
-
-/**
- * Encodes ASN type field into a pbuf chained ASN1 msg.
- *
- * @param p points to output pbuf to encode value into
- * @param ofs points to the offset within the pbuf chain
- * @param type input ASN1 type
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
- */
-err_t
-snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
- *msg_ptr = type;
- return ERR_OK;
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Encodes host order length field into a pbuf chained ASN1 msg.
- *
- * @param p points to output pbuf to encode length into
- * @param ofs points to the offset within the pbuf chain
- * @param length is the host order length to be encoded
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
- */
-err_t
-snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
-
- if (length < 0x80)
- {
- *msg_ptr = length;
- return ERR_OK;
- }
- else if (length < 0x100)
- {
- *msg_ptr = 0x81;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- *msg_ptr = length;
- return ERR_OK;
- }
- else
- {
- u8_t i;
-
- /* length >= 0x100 && length <= 0xFFFF */
- *msg_ptr = 0x82;
- i = 2;
- while (i > 0)
- {
- i--;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- if (i == 0)
- {
- /* least significant length octet */
- *msg_ptr = length;
- }
- else
- {
- /* most significant length octet */
- *msg_ptr = length >> 8;
- }
- }
- return ERR_OK;
- }
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Encodes u32_t (counter, gauge, timeticks) into a pbuf chained ASN1 msg.
- *
- * @param p points to output pbuf to encode value into
- * @param ofs points to the offset within the pbuf chain
- * @param octets_needed encoding length (from snmp_asn1_enc_u32t_cnt())
- * @param value is the host order u32_t value to be encoded
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
- *
- * @see snmp_asn1_enc_u32t_cnt()
- */
-err_t
-snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u8_t octets_needed, u32_t value)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
-
- if (octets_needed == 5)
- {
- /* not enough bits in 'value' add leading 0x00 */
- octets_needed--;
- *msg_ptr = 0x00;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- while (octets_needed > 1)
- {
- octets_needed--;
- *msg_ptr = value >> (octets_needed << 3);
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- /* (only) one least significant octet */
- *msg_ptr = value;
- return ERR_OK;
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Encodes s32_t integer into a pbuf chained ASN1 msg.
- *
- * @param p points to output pbuf to encode value into
- * @param ofs points to the offset within the pbuf chain
- * @param octets_needed encoding length (from snmp_asn1_enc_s32t_cnt())
- * @param value is the host order s32_t value to be encoded
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
- *
- * @see snmp_asn1_enc_s32t_cnt()
- */
-err_t
-snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u8_t octets_needed, s32_t value)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
-
- while (octets_needed > 1)
- {
- octets_needed--;
- *msg_ptr = value >> (octets_needed << 3);
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- /* (only) one least significant octet */
- *msg_ptr = value;
- return ERR_OK;
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Encodes object identifier into a pbuf chained ASN1 msg.
- *
- * @param p points to output pbuf to encode oid into
- * @param ofs points to the offset within the pbuf chain
- * @param ident_len object identifier array length
- * @param ident points to object identifier array
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
- */
-err_t
-snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
-
- if (ident_len > 1)
- {
- if ((ident[0] == 1) && (ident[1] == 3))
- {
- /* compressed (most common) prefix .iso.org */
- *msg_ptr = 0x2b;
- }
- else
- {
- /* calculate prefix */
- *msg_ptr = (ident[0] * 40) + ident[1];
- }
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- ident_len -= 2;
- ident += 2;
- }
- else
- {
-/* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */
- /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */
- return ERR_ARG;
- }
- while (ident_len > 0)
- {
- s32_t sub_id;
- u8_t shift, tail;
-
- ident_len--;
- sub_id = *ident;
- tail = 0;
- shift = 28;
- while(shift > 0)
- {
- u8_t code;
-
- code = sub_id >> shift;
- if ((code != 0) || (tail != 0))
- {
- tail = 1;
- *msg_ptr = code | 0x80;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- shift -= 7;
- }
- *msg_ptr = (u8_t)sub_id & 0x7F;
- if (ident_len > 0)
- {
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- /* proceed to next sub-identifier */
- ident++;
- }
- return ERR_OK;
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-/**
- * Encodes raw data (octet string, opaque) into a pbuf chained ASN1 msg.
- *
- * @param p points to output pbuf to encode raw data into
- * @param ofs points to the offset within the pbuf chain
- * @param raw_len raw data length
- * @param raw points raw data
- * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode
- */
-err_t
-snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u8_t raw_len, u8_t *raw)
-{
- u16_t plen, base;
- u8_t *msg_ptr;
-
- plen = 0;
- while (p != NULL)
- {
- base = plen;
- plen += p->len;
- if (ofs < plen)
- {
- msg_ptr = p->payload;
- msg_ptr += ofs - base;
-
- while (raw_len > 1)
- {
- /* copy raw_len - 1 octets */
- raw_len--;
- *msg_ptr = *raw;
- raw++;
- ofs += 1;
- if (ofs >= plen)
- {
- /* next octet in next pbuf */
- p = p->next;
- if (p == NULL) { return ERR_ARG; }
- msg_ptr = p->payload;
- plen += p->len;
- }
- else
- {
- /* next octet in same pbuf */
- msg_ptr++;
- }
- }
- if (raw_len > 0)
- {
- /* copy last or single octet */
- *msg_ptr = *raw;
- }
- return ERR_OK;
- }
- p = p->next;
- }
- /* p == NULL, ofs >= plen */
- return ERR_ARG;
-}
-
-#endif /* LWIP_SNMP */
diff --git a/src/VBox/Devices/Network/lwip/src/core/snmp/mib2.c b/src/VBox/Devices/Network/lwip/src/core/snmp/mib2.c
deleted file mode 100644
index 3e478ab..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/snmp/mib2.c
+++ /dev/null
@@ -1,4021 +0,0 @@
-/**
- * @file
- * Management Information Base II (RFC1213) objects and functions.
- *
- * @note the object identifiers for this MIB-2 and private MIB tree
- * must be kept in sorted ascending order. This to ensure correct getnext operation.
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#include "arch/cc.h"
-#include "lwip/opt.h"
-
-#if LWIP_SNMP
-#include "lwip/snmp.h"
-#include "lwip/netif.h"
-#include "netif/etharp.h"
-#include "lwip/ip.h"
-#include "lwip/ip_frag.h"
-#include "lwip/tcp.h"
-#include "lwip/udp.h"
-#include "lwip/snmp_asn1.h"
-#include "lwip/snmp_structs.h"
-
-/**
- * IANA assigned enterprise ID for lwIP is 26381
- * @see http://www.iana.org/assignments/enterprise-numbers
- *
- * @note this enterprise ID is assigned to the lwIP project,
- * all object identifiers living under this ID are assigned
- * by the lwIP maintainers (contact Christiaan Simons)!
- * @note don't change this define, use snmp_set_sysobjid()
- *
- * If you need to create your own private MIB you'll need
- * to apply for your own enterprise ID with IANA:
- * http://www.iana.org/numbers.html
- */
-#define SNMP_ENTERPRISE_ID 26381
-#define SNMP_SYSOBJID_LEN 7
-#define SNMP_SYSOBJID {1, 3, 6, 1, 4, 1, SNMP_ENTERPRISE_ID}
-
-#ifndef SNMP_SYSSERVICES
-#define SNMP_SYSSERVICES ((1 << 6) | (1 << 3) | ((IP_FORWARD) << 2))
-#endif
-
-static void system_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void system_get_value(struct obj_def *od, u16_t len, void *value);
-static u8_t system_set_test(struct obj_def *od, u16_t len, void *value);
-static void system_set_value(struct obj_def *od, u16_t len, void *value);
-static void interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void interfaces_get_value(struct obj_def *od, u16_t len, void *value);
-static void ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void ifentry_get_value(struct obj_def *od, u16_t len, void *value);
-static void atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void atentry_get_value(struct obj_def *od, u16_t len, void *value);
-static void ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void ip_get_value(struct obj_def *od, u16_t len, void *value);
-static u8_t ip_set_test(struct obj_def *od, u16_t len, void *value);
-static void ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value);
-static void ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value);
-static void ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value);
-static void icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void icmp_get_value(struct obj_def *od, u16_t len, void *value);
-#if LWIP_TCP
-static void tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void tcp_get_value(struct obj_def *od, u16_t len, void *value);
-static void tcpconnentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void tcpconnentry_get_value(struct obj_def *od, u16_t len, void *value);
-#endif
-static void udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void udp_get_value(struct obj_def *od, u16_t len, void *value);
-static void udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void udpentry_get_value(struct obj_def *od, u16_t len, void *value);
-static void snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-static void snmp_get_value(struct obj_def *od, u16_t len, void *value);
-static u8_t snmp_set_test(struct obj_def *od, u16_t len, void *value);
-static void snmp_set_value(struct obj_def *od, u16_t len, void *value);
-
-
-/* snmp .1.3.6.1.2.1.11 */
-const mib_scalar_node snmp_scalar = {
- &snmp_get_object_def,
- &snmp_get_value,
- &snmp_set_test,
- &snmp_set_value,
- MIB_NODE_SC,
- 0
-};
-const s32_t snmp_ids[28] = {
- 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16,
- 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30
-};
-struct mib_node* const snmp_nodes[28] = {
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar,
- (struct mib_node* const)&snmp_scalar, (struct mib_node* const)&snmp_scalar
-};
-const struct mib_array_node snmp = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 28,
- snmp_ids,
- snmp_nodes
-};
-
-/* dot3 and EtherLike MIB not planned. (transmission .1.3.6.1.2.1.10) */
-/* historical (some say hysterical). (cmot .1.3.6.1.2.1.9) */
-/* lwIP has no EGP, thus may not implement it. (egp .1.3.6.1.2.1.8) */
-
-/* udp .1.3.6.1.2.1.7 */
-/** index root node for udpTable */
-struct mib_list_rootnode udp_root = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_LR,
- 0,
- NULL,
- NULL,
- 0
-};
-const s32_t udpentry_ids[2] = { 1, 2 };
-struct mib_node* const udpentry_nodes[2] = {
- (struct mib_node* const)&udp_root, (struct mib_node* const)&udp_root,
-};
-const struct mib_array_node udpentry = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 2,
- udpentry_ids,
- udpentry_nodes
-};
-
-s32_t udptable_id = 1;
-struct mib_node* udptable_node = (struct mib_node* const)&udpentry;
-struct mib_ram_array_node udptable = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_RA,
- 0,
- &udptable_id,
- &udptable_node
-};
-
-const mib_scalar_node udp_scalar = {
- &udp_get_object_def,
- &udp_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_SC,
- 0
-};
-const s32_t udp_ids[5] = { 1, 2, 3, 4, 5 };
-struct mib_node* const udp_nodes[5] = {
- (struct mib_node* const)&udp_scalar, (struct mib_node* const)&udp_scalar,
- (struct mib_node* const)&udp_scalar, (struct mib_node* const)&udp_scalar,
- (struct mib_node* const)&udptable
-};
-const struct mib_array_node udp = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 5,
- udp_ids,
- udp_nodes
-};
-
-/* tcp .1.3.6.1.2.1.6 */
-#if LWIP_TCP
-/* only if the TCP protocol is available may implement this group */
-/** index root node for tcpConnTable */
-struct mib_list_rootnode tcpconntree_root = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_LR,
- 0,
- NULL,
- NULL,
- 0
-};
-const s32_t tcpconnentry_ids[5] = { 1, 2, 3, 4, 5 };
-struct mib_node* const tcpconnentry_nodes[5] = {
- (struct mib_node* const)&tcpconntree_root, (struct mib_node* const)&tcpconntree_root,
- (struct mib_node* const)&tcpconntree_root, (struct mib_node* const)&tcpconntree_root,
- (struct mib_node* const)&tcpconntree_root
-};
-const struct mib_array_node tcpconnentry = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 5,
- tcpconnentry_ids,
- tcpconnentry_nodes
-};
-
-s32_t tcpconntable_id = 1;
-struct mib_node* tcpconntable_node = (struct mib_node* const)&tcpconnentry;
-struct mib_ram_array_node tcpconntable = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_RA,
-/** @todo update maxlength when inserting / deleting from table
- 0 when table is empty, 1 when more than one entry */
- 0,
- &tcpconntable_id,
- &tcpconntable_node
-};
-
-const mib_scalar_node tcp_scalar = {
- &tcp_get_object_def,
- &tcp_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_SC,
- 0
-};
-const s32_t tcp_ids[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
-struct mib_node* const tcp_nodes[15] = {
- (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
- (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
- (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
- (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
- (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
- (struct mib_node* const)&tcp_scalar, (struct mib_node* const)&tcp_scalar,
- (struct mib_node* const)&tcpconntable, (struct mib_node* const)&tcp_scalar,
- (struct mib_node* const)&tcp_scalar
-};
-const struct mib_array_node tcp = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 15,
- tcp_ids,
- tcp_nodes
-};
-#endif
-
-/* icmp .1.3.6.1.2.1.5 */
-const mib_scalar_node icmp_scalar = {
- &icmp_get_object_def,
- &icmp_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_SC,
- 0
-};
-const s32_t icmp_ids[26] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 };
-struct mib_node* const icmp_nodes[26] = {
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar,
- (struct mib_node* const)&icmp_scalar, (struct mib_node* const)&icmp_scalar
-};
-const struct mib_array_node icmp = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 26,
- icmp_ids,
- icmp_nodes
-};
-
-/** index root node for ipNetToMediaTable */
-struct mib_list_rootnode ipntomtree_root = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_LR,
- 0,
- NULL,
- NULL,
- 0
-};
-const s32_t ipntomentry_ids[4] = { 1, 2, 3, 4 };
-struct mib_node* const ipntomentry_nodes[4] = {
- (struct mib_node* const)&ipntomtree_root, (struct mib_node* const)&ipntomtree_root,
- (struct mib_node* const)&ipntomtree_root, (struct mib_node* const)&ipntomtree_root
-};
-const struct mib_array_node ipntomentry = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 4,
- ipntomentry_ids,
- ipntomentry_nodes
-};
-
-s32_t ipntomtable_id = 1;
-struct mib_node* ipntomtable_node = (struct mib_node* const)&ipntomentry;
-struct mib_ram_array_node ipntomtable = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_RA,
- 0,
- &ipntomtable_id,
- &ipntomtable_node
-};
-
-/** index root node for ipRouteTable */
-struct mib_list_rootnode iprtetree_root = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_LR,
- 0,
- NULL,
- NULL,
- 0
-};
-const s32_t iprteentry_ids[13] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 };
-struct mib_node* const iprteentry_nodes[13] = {
- (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
- (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
- (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
- (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
- (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
- (struct mib_node* const)&iprtetree_root, (struct mib_node* const)&iprtetree_root,
- (struct mib_node* const)&iprtetree_root
-};
-const struct mib_array_node iprteentry = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 13,
- iprteentry_ids,
- iprteentry_nodes
-};
-
-s32_t iprtetable_id = 1;
-struct mib_node* iprtetable_node = (struct mib_node* const)&iprteentry;
-struct mib_ram_array_node iprtetable = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_RA,
- 0,
- &iprtetable_id,
- &iprtetable_node
-};
-
-/** index root node for ipAddrTable */
-struct mib_list_rootnode ipaddrtree_root = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_LR,
- 0,
- NULL,
- NULL,
- 0
-};
-const s32_t ipaddrentry_ids[5] = { 1, 2, 3, 4, 5 };
-struct mib_node* const ipaddrentry_nodes[5] = {
- (struct mib_node* const)&ipaddrtree_root,
- (struct mib_node* const)&ipaddrtree_root,
- (struct mib_node* const)&ipaddrtree_root,
- (struct mib_node* const)&ipaddrtree_root,
- (struct mib_node* const)&ipaddrtree_root
-};
-const struct mib_array_node ipaddrentry = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 5,
- ipaddrentry_ids,
- ipaddrentry_nodes
-};
-
-s32_t ipaddrtable_id = 1;
-struct mib_node* ipaddrtable_node = (struct mib_node* const)&ipaddrentry;
-struct mib_ram_array_node ipaddrtable = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_RA,
- 0,
- &ipaddrtable_id,
- &ipaddrtable_node
-};
-
-/* ip .1.3.6.1.2.1.4 */
-const mib_scalar_node ip_scalar = {
- &ip_get_object_def,
- &ip_get_value,
- &ip_set_test,
- &noleafs_set_value,
- MIB_NODE_SC,
- 0
-};
-const s32_t ip_ids[23] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 };
-struct mib_node* const ip_nodes[23] = {
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ip_scalar,
- (struct mib_node* const)&ip_scalar, (struct mib_node* const)&ipaddrtable,
- (struct mib_node* const)&iprtetable, (struct mib_node* const)&ipntomtable,
- (struct mib_node* const)&ip_scalar
-};
-const struct mib_array_node ip = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 23,
- ip_ids,
- ip_nodes
-};
-
-/** index root node for atTable */
-struct mib_list_rootnode arptree_root = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_LR,
- 0,
- NULL,
- NULL,
- 0
-};
-const s32_t atentry_ids[3] = { 1, 2, 3 };
-struct mib_node* const atentry_nodes[3] = {
- (struct mib_node* const)&arptree_root,
- (struct mib_node* const)&arptree_root,
- (struct mib_node* const)&arptree_root
-};
-const struct mib_array_node atentry = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 3,
- atentry_ids,
- atentry_nodes
-};
-
-const s32_t attable_id = 1;
-struct mib_node* const attable_node = (struct mib_node* const)&atentry;
-const struct mib_array_node attable = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 1,
- &attable_id,
- &attable_node
-};
-
-/* at .1.3.6.1.2.1.3 */
-s32_t at_id = 1;
-struct mib_node* at_node = (struct mib_node* const)&attable;
-struct mib_ram_array_node at = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_RA,
- 0,
- &at_id,
- &at_node
-};
-
-/** index root node for ifTable */
-struct mib_list_rootnode iflist_root = {
- &ifentry_get_object_def,
- &ifentry_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_LR,
- 0,
- NULL,
- NULL,
- 0
-};
-const s32_t ifentry_ids[22] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 };
-struct mib_node* const ifentry_nodes[22] = {
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root,
- (struct mib_node* const)&iflist_root, (struct mib_node* const)&iflist_root
-};
-const struct mib_array_node ifentry = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 22,
- ifentry_ids,
- ifentry_nodes
-};
-
-s32_t iftable_id = 1;
-struct mib_node* iftable_node = (struct mib_node* const)&ifentry;
-struct mib_ram_array_node iftable = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_RA,
- 0,
- &iftable_id,
- &iftable_node
-};
-
-/* interfaces .1.3.6.1.2.1.2 */
-const mib_scalar_node interfaces_scalar = {
- &interfaces_get_object_def,
- &interfaces_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_SC,
- 0
-};
-const s32_t interfaces_ids[2] = { 1, 2 };
-struct mib_node* const interfaces_nodes[2] = {
- (struct mib_node* const)&interfaces_scalar, (struct mib_node* const)&iftable
-};
-const struct mib_array_node interfaces = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 2,
- interfaces_ids,
- interfaces_nodes
-};
-
-
-/* 0 1 2 3 4 5 6 */
-/* system .1.3.6.1.2.1.1 */
-const mib_scalar_node sys_tem_scalar = {
- &system_get_object_def,
- &system_get_value,
- &system_set_test,
- &system_set_value,
- MIB_NODE_SC,
- 0
-};
-const s32_t sys_tem_ids[7] = { 1, 2, 3, 4, 5, 6, 7 };
-struct mib_node* const sys_tem_nodes[7] = {
- (struct mib_node* const)&sys_tem_scalar, (struct mib_node* const)&sys_tem_scalar,
- (struct mib_node* const)&sys_tem_scalar, (struct mib_node* const)&sys_tem_scalar,
- (struct mib_node* const)&sys_tem_scalar, (struct mib_node* const)&sys_tem_scalar,
- (struct mib_node* const)&sys_tem_scalar
-};
-/* work around name issue with 'sys_tem', some compiler(s?) seem to reserve 'system' */
-const struct mib_array_node sys_tem = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 7,
- sys_tem_ids,
- sys_tem_nodes
-};
-
-/* mib-2 .1.3.6.1.2.1 */
-#if LWIP_TCP
-#define MIB2_GROUPS 8
-#else
-#define MIB2_GROUPS 7
-#endif
-const s32_t mib2_ids[MIB2_GROUPS] =
-{
- 1,
- 2,
- 3,
- 4,
- 5,
-#if LWIP_TCP
- 6,
-#endif
- 7,
- 11
-};
-struct mib_node* const mib2_nodes[MIB2_GROUPS] = {
- (struct mib_node* const)&sys_tem,
- (struct mib_node* const)&interfaces,
- (struct mib_node* const)&at,
- (struct mib_node* const)&ip,
- (struct mib_node* const)&icmp,
-#if LWIP_TCP
- (struct mib_node* const)&tcp,
-#endif
- (struct mib_node* const)&udp,
- (struct mib_node* const)&snmp
-};
-
-const struct mib_array_node mib2 = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- MIB2_GROUPS,
- mib2_ids,
- mib2_nodes
-};
-
-/* mgmt .1.3.6.1.2 */
-const s32_t mgmt_ids[1] = { 1 };
-struct mib_node* const mgmt_nodes[1] = { (struct mib_node* const)&mib2 };
-const struct mib_array_node mgmt = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 1,
- mgmt_ids,
- mgmt_nodes
-};
-
-/* internet .1.3.6.1 */
-#if SNMP_PRIVATE_MIB
-s32_t internet_ids[2] = { 2, 4 };
-struct mib_node* const internet_nodes[2] = { (struct mib_node* const)&mgmt, (struct mib_node* const)&private };
-const struct mib_array_node internet = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 2,
- internet_ids,
- internet_nodes
-};
-#else
-const s32_t internet_ids[1] = { 2 };
-struct mib_node* const internet_nodes[1] = { (struct mib_node* const)&mgmt };
-const struct mib_array_node internet = {
- &noleafs_get_object_def,
- &noleafs_get_value,
- &noleafs_set_test,
- &noleafs_set_value,
- MIB_NODE_AR,
- 1,
- internet_ids,
- internet_nodes
-};
-#endif
-
-/** mib-2.system.sysObjectID */
-static struct snmp_obj_id sysobjid = {SNMP_SYSOBJID_LEN, SNMP_SYSOBJID};
-/** enterprise ID for generic TRAPs, .iso.org.dod.internet.mgmt.mib-2.snmp */
-static struct snmp_obj_id snmpgrp_id = {7,{1,3,6,1,2,1,11}};
-/** mib-2.system.sysServices */
-static const s32_t sysservices = SNMP_SYSSERVICES;
-
-/** mib-2.system.sysDescr */
-static const u8_t sysdescr_len_default = 4;
-static const u8_t sysdescr_default[] = "lwIP";
-static u8_t* sysdescr_len_ptr = (u8_t*)&sysdescr_len_default;
-static u8_t* sysdescr_ptr = (u8_t*)&sysdescr_default[0];
-/** mib-2.system.sysContact */
-static const u8_t syscontact_len_default = 0;
-static const u8_t syscontact_default[] = "";
-static u8_t* syscontact_len_ptr = (u8_t*)&syscontact_len_default;
-static u8_t* syscontact_ptr = (u8_t*)&syscontact_default[0];
-/** mib-2.system.sysName */
-static const u8_t sysname_len_default = 8;
-static const u8_t sysname_default[] = "FQDN-unk";
-static u8_t* sysname_len_ptr = (u8_t*)&sysname_len_default;
-static u8_t* sysname_ptr = (u8_t*)&sysname_default[0];
-/** mib-2.system.sysLocation */
-static const u8_t syslocation_len_default = 0;
-static const u8_t syslocation_default[] = "";
-static u8_t* syslocation_len_ptr = (u8_t*)&syslocation_len_default;
-static u8_t* syslocation_ptr = (u8_t*)&syslocation_default[0];
-/** mib-2.snmp.snmpEnableAuthenTraps */
-static const u8_t snmpenableauthentraps_default = 2; /* disabled */
-static u8_t* snmpenableauthentraps_ptr = (u8_t*)&snmpenableauthentraps_default;
-
-/** mib-2.interfaces.ifTable.ifEntry.ifSpecific (zeroDotZero) */
-static const struct snmp_obj_id ifspecific = {2, {0, 0}};
-/** mib-2.ip.ipRouteTable.ipRouteEntry.ipRouteInfo (zeroDotZero) */
-static const struct snmp_obj_id iprouteinfo = {2, {0, 0}};
-
-
-
-/* mib-2.system counter(s) */
-static u32_t sysuptime = 0;
-
-/* mib-2.ip counter(s) */
-static u32_t ipinreceives = 0,
- ipinhdrerrors = 0,
- ipinaddrerrors = 0,
- ipforwdatagrams = 0,
- ipinunknownprotos = 0,
- ipindiscards = 0,
- ipindelivers = 0,
- ipoutrequests = 0,
- ipoutdiscards = 0,
- ipoutnoroutes = 0,
- ipreasmreqds = 0,
- ipreasmoks = 0,
- ipreasmfails = 0,
- ipfragoks = 0,
- ipfragfails = 0,
- ipfragcreates = 0,
- iproutingdiscards = 0;
-/* mib-2.icmp counter(s) */
-static u32_t icmpinmsgs = 0,
- icmpinerrors = 0,
- icmpindestunreachs = 0,
- icmpintimeexcds = 0,
- icmpinparmprobs = 0,
- icmpinsrcquenchs = 0,
- icmpinredirects = 0,
- icmpinechos = 0,
- icmpinechoreps = 0,
- icmpintimestamps = 0,
- icmpintimestampreps = 0,
- icmpinaddrmasks = 0,
- icmpinaddrmaskreps = 0,
- icmpoutmsgs = 0,
- icmpouterrors = 0,
- icmpoutdestunreachs = 0,
- icmpouttimeexcds = 0,
- icmpoutparmprobs = 0,
- icmpoutsrcquenchs = 0,
- icmpoutredirects = 0,
- icmpoutechos = 0,
- icmpoutechoreps = 0,
- icmpouttimestamps = 0,
- icmpouttimestampreps = 0,
- icmpoutaddrmasks = 0,
- icmpoutaddrmaskreps = 0;
-/* mib-2.tcp counter(s) */
-static u32_t tcpactiveopens = 0,
- tcppassiveopens = 0,
- tcpattemptfails = 0,
- tcpestabresets = 0,
- tcpinsegs = 0,
- tcpoutsegs = 0,
- tcpretranssegs = 0,
- tcpinerrs = 0,
- tcpoutrsts = 0;
-/* mib-2.udp counter(s) */
-static u32_t udpindatagrams = 0,
- udpnoports = 0,
- udpinerrors = 0,
- udpoutdatagrams = 0;
-/* mib-2.snmp counter(s) */
-static u32_t snmpinpkts = 0,
- snmpoutpkts = 0,
- snmpinbadversions = 0,
- snmpinbadcommunitynames = 0,
- snmpinbadcommunityuses = 0,
- snmpinasnparseerrs = 0,
- snmpintoobigs = 0,
- snmpinnosuchnames = 0,
- snmpinbadvalues = 0,
- snmpinreadonlys = 0,
- snmpingenerrs = 0,
- snmpintotalreqvars = 0,
- snmpintotalsetvars = 0,
- snmpingetrequests = 0,
- snmpingetnexts = 0,
- snmpinsetrequests = 0,
- snmpingetresponses = 0,
- snmpintraps = 0,
- snmpouttoobigs = 0,
- snmpoutnosuchnames = 0,
- snmpoutbadvalues = 0,
- snmpoutgenerrs = 0,
- snmpoutgetrequests = 0,
- snmpoutgetnexts = 0,
- snmpoutsetrequests = 0,
- snmpoutgetresponses = 0,
- snmpouttraps = 0;
-
-
-
-/* prototypes of the following functions are in lwip/src/include/lwip/snmp.h */
-/**
- * Copy octet string.
- *
- * @param dst points to destination
- * @param src points to source
- * @param n number of octets to copy.
- */
-void ocstrncpy(u8_t *dst, u8_t *src, u8_t n)
-{
- while (n > 0)
- {
- n--;
- *dst++ = *src++;
- }
-}
-
-/**
- * Copy object identifier (s32_t) array.
- *
- * @param dst points to destination
- * @param src points to source
- * @param n number of sub identifiers to copy.
- */
-void objectidncpy(s32_t *dst, s32_t *src, u8_t n)
-{
- while(n > 0)
- {
- n--;
- *dst++ = *src++;
- }
-}
-
-/**
- * Initializes sysDescr pointers.
- *
- * @param str if non-NULL then copy str pointer
- * @param strlen points to string length, excluding zero terminator
- */
-void snmp_set_sysdesr(u8_t *str, u8_t *strlen)
-{
- if (str != NULL)
- {
- sysdescr_ptr = str;
- sysdescr_len_ptr = strlen;
- }
-}
-
-void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid)
-{
- *oid = &sysobjid;
-}
-
-/**
- * Initializes sysObjectID value.
- *
- * @param oid points to stuct snmp_obj_id to copy
- */
-void snmp_set_sysobjid(struct snmp_obj_id *oid)
-{
- sysobjid = *oid;
-}
-
-/**
- * Must be called at regular 10 msec interval from a timer interrupt
- * or signal handler depending on your runtime environment.
- */
-void snmp_inc_sysuptime(void)
-{
- sysuptime++;
-}
-
-void snmp_get_sysuptime(u32_t *value)
-{
- *value = sysuptime;
-}
-
-/**
- * Initializes sysContact pointers,
- * e.g. ptrs to non-volatile memory external to lwIP.
- *
- * @param str if non-NULL then copy str pointer
- * @param strlen points to string length, excluding zero terminator
- */
-void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen)
-{
- if (ocstr != NULL)
- {
- syscontact_ptr = ocstr;
- syscontact_len_ptr = ocstrlen;
- }
-}
-
-/**
- * Initializes sysName pointers,
- * e.g. ptrs to non-volatile memory external to lwIP.
- *
- * @param str if non-NULL then copy str pointer
- * @param strlen points to string length, excluding zero terminator
- */
-void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen)
-{
- if (ocstr != NULL)
- {
- sysname_ptr = ocstr;
- sysname_len_ptr = ocstrlen;
- }
-}
-
-/**
- * Initializes sysLocation pointers,
- * e.g. ptrs to non-volatile memory external to lwIP.
- *
- * @param str if non-NULL then copy str pointer
- * @param strlen points to string length, excluding zero terminator
- */
-void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen)
-{
- if (ocstr != NULL)
- {
- syslocation_ptr = ocstr;
- syslocation_len_ptr = ocstrlen;
- }
-}
-
-
-void snmp_add_ifinoctets(struct netif *ni, u32_t value)
-{
- ni->ifinoctets += value;
-}
-
-void snmp_inc_ifinucastpkts(struct netif *ni)
-{
- (ni->ifinucastpkts)++;
-}
-
-void snmp_inc_ifinnucastpkts(struct netif *ni)
-{
- (ni->ifinnucastpkts)++;
-}
-
-void snmp_inc_ifindiscards(struct netif *ni)
-{
- (ni->ifindiscards)++;
-}
-
-void snmp_add_ifoutoctets(struct netif *ni, u32_t value)
-{
- ni->ifoutoctets += value;
-}
-
-void snmp_inc_ifoutucastpkts(struct netif *ni)
-{
- (ni->ifoutucastpkts)++;
-}
-
-void snmp_inc_ifoutnucastpkts(struct netif *ni)
-{
- (ni->ifoutnucastpkts)++;
-}
-
-void snmp_inc_ifoutdiscards(struct netif *ni)
-{
- (ni->ifoutdiscards)++;
-}
-
-void snmp_inc_iflist(void)
-{
- struct mib_list_node *if_node = NULL;
-
- snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node);
- /* enable getnext traversal on filled table */
- iftable.maxlength = 1;
-}
-
-void snmp_dec_iflist(void)
-{
- snmp_mib_node_delete(&iflist_root, iflist_root.tail);
- /* disable getnext traversal on empty table */
- if(iflist_root.count == 0) iftable.maxlength = 0;
-}
-
-/**
- * Inserts ARP table indexes (.xIfIndex.xNetAddress)
- * into arp table index trees (both atTable and ipNetToMediaTable).
- */
-void snmp_insert_arpidx_tree(struct netif *ni, struct ip_addr *ip)
-{
- struct mib_list_rootnode *at_rn;
- struct mib_list_node *at_node;
- struct ip_addr hip;
- s32_t arpidx[5];
- u8_t level, tree;
-
- LWIP_ASSERT("ni != NULL", ni != NULL);
- snmp_netiftoifindex(ni, &arpidx[0]);
- hip.addr = ntohl(ip->addr);
- snmp_iptooid(&hip, &arpidx[1]);
-
- for (tree = 0; tree < 2; tree++)
- {
- if (tree == 0)
- {
- at_rn = &arptree_root;
- }
- else
- {
- at_rn = &ipntomtree_root;
- }
- for (level = 0; level < 5; level++)
- {
- at_node = NULL;
- snmp_mib_node_insert(at_rn, arpidx[level], &at_node);
- if ((level != 4) && (at_node != NULL))
- {
- if (at_node->nptr == NULL)
- {
- at_rn = snmp_mib_lrn_alloc();
- at_node->nptr = (struct mib_node*)at_rn;
- if (at_rn != NULL)
- {
- if (level == 3)
- {
- if (tree == 0)
- {
- at_rn->get_object_def = atentry_get_object_def;
- at_rn->get_value = atentry_get_value;
- }
- else
- {
- at_rn->get_object_def = ip_ntomentry_get_object_def;
- at_rn->get_value = ip_ntomentry_get_value;
- }
- at_rn->set_test = noleafs_set_test;
- at_rn->set_value = noleafs_set_value;
- }
- }
- else
- {
- /* at_rn == NULL, malloc failure */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_arpidx_tree() insert failed, mem full"));
- break;
- }
- }
- else
- {
- at_rn = (struct mib_list_rootnode*)at_node->nptr;
- }
- }
- }
- }
- /* enable getnext traversal on filled tables */
- at.maxlength = 1;
- ipntomtable.maxlength = 1;
-}
-
-/**
- * Removes ARP table indexes (.xIfIndex.xNetAddress)
- * from arp table index trees.
- */
-void snmp_delete_arpidx_tree(struct netif *ni, struct ip_addr *ip)
-{
- struct mib_list_rootnode *at_rn, *next, *del_rn[5];
- struct mib_list_node *at_n, *del_n[5];
- struct ip_addr hip;
- s32_t arpidx[5];
- u8_t fc, tree, level, del_cnt;
-
- snmp_netiftoifindex(ni, &arpidx[0]);
- hip.addr = ntohl(ip->addr);
- snmp_iptooid(&hip, &arpidx[1]);
-
- for (tree = 0; tree < 2; tree++)
- {
- /* mark nodes for deletion */
- if (tree == 0)
- {
- at_rn = &arptree_root;
- }
- else
- {
- at_rn = &ipntomtree_root;
- }
- level = 0;
- del_cnt = 0;
- while ((level < 5) && (at_rn != NULL))
- {
- fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n);
- if (fc == 0)
- {
- /* arpidx[level] does not exist */
- del_cnt = 0;
- at_rn = NULL;
- }
- else if (fc == 1)
- {
- del_rn[del_cnt] = at_rn;
- del_n[del_cnt] = at_n;
- del_cnt++;
- at_rn = (struct mib_list_rootnode*)(at_n->nptr);
- }
- else if (fc == 2)
- {
- /* reset delete (2 or more childs) */
- del_cnt = 0;
- at_rn = (struct mib_list_rootnode*)(at_n->nptr);
- }
- level++;
- }
- /* delete marked index nodes */
- while (del_cnt > 0)
- {
- del_cnt--;
-
- at_rn = del_rn[del_cnt];
- at_n = del_n[del_cnt];
-
- next = snmp_mib_node_delete(at_rn, at_n);
- if (next != NULL)
- {
- LWIP_ASSERT("next_count == 0",next->count == 0);
- snmp_mib_lrn_free(next);
- }
- }
- }
- /* disable getnext traversal on empty tables */
- if(arptree_root.count == 0) at.maxlength = 0;
- if(ipntomtree_root.count == 0) ipntomtable.maxlength = 0;
-}
-
-void snmp_inc_ipinreceives(void)
-{
- ipinreceives++;
-}
-
-void snmp_inc_ipinhdrerrors(void)
-{
- ipinhdrerrors++;
-}
-
-void snmp_inc_ipinaddrerrors(void)
-{
- ipinaddrerrors++;
-}
-
-void snmp_inc_ipforwdatagrams(void)
-{
- ipforwdatagrams++;
-}
-
-void snmp_inc_ipinunknownprotos(void)
-{
- ipinunknownprotos++;
-}
-
-void snmp_inc_ipindiscards(void)
-{
- ipindiscards++;
-}
-
-void snmp_inc_ipindelivers(void)
-{
- ipindelivers++;
-}
-
-void snmp_inc_ipoutrequests(void)
-{
- ipoutrequests++;
-}
-
-void snmp_inc_ipoutdiscards(void)
-{
- ipoutdiscards++;
-}
-
-void snmp_inc_ipoutnoroutes(void)
-{
- ipoutnoroutes++;
-}
-
-void snmp_inc_ipreasmreqds(void)
-{
- ipreasmreqds++;
-}
-
-void snmp_inc_ipreasmoks(void)
-{
- ipreasmoks++;
-}
-
-void snmp_inc_ipreasmfails(void)
-{
- ipreasmfails++;
-}
-
-void snmp_inc_ipfragoks(void)
-{
- ipfragoks++;
-}
-
-void snmp_inc_ipfragfails(void)
-{
- ipfragfails++;
-}
-
-void snmp_inc_ipfragcreates(void)
-{
- ipfragcreates++;
-}
-
-void snmp_inc_iproutingdiscards(void)
-{
- iproutingdiscards++;
-}
-
-/**
- * Inserts ipAddrTable indexes (.ipAdEntAddr)
- * into index tree.
- */
-void snmp_insert_ipaddridx_tree(struct netif *ni)
-{
- struct mib_list_rootnode *ipa_rn;
- struct mib_list_node *ipa_node;
- struct ip_addr ip;
- s32_t ipaddridx[4];
- u8_t level;
-
- LWIP_ASSERT("ni != NULL", ni != NULL);
- ip.addr = ntohl(ni->ip_addr.addr);
- snmp_iptooid(&ip, &ipaddridx[0]);
-
- level = 0;
- ipa_rn = &ipaddrtree_root;
- while (level < 4)
- {
- ipa_node = NULL;
- snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node);
- if ((level != 3) && (ipa_node != NULL))
- {
- if (ipa_node->nptr == NULL)
- {
- ipa_rn = snmp_mib_lrn_alloc();
- ipa_node->nptr = (struct mib_node*)ipa_rn;
- if (ipa_rn != NULL)
- {
- if (level == 2)
- {
- ipa_rn->get_object_def = ip_addrentry_get_object_def;
- ipa_rn->get_value = ip_addrentry_get_value;
- ipa_rn->set_test = noleafs_set_test;
- ipa_rn->set_value = noleafs_set_value;
- }
- }
- else
- {
- /* ipa_rn == NULL, malloc failure */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_ipaddridx_tree() insert failed, mem full"));
- break;
- }
- }
- else
- {
- ipa_rn = (struct mib_list_rootnode*)ipa_node->nptr;
- }
- }
- level++;
- }
- /* enable getnext traversal on filled table */
- ipaddrtable.maxlength = 1;
-}
-
-/**
- * Removes ipAddrTable indexes (.ipAdEntAddr)
- * from index tree.
- */
-void snmp_delete_ipaddridx_tree(struct netif *ni)
-{
- struct mib_list_rootnode *ipa_rn, *next, *del_rn[4];
- struct mib_list_node *ipa_n, *del_n[4];
- struct ip_addr ip;
- s32_t ipaddridx[4];
- u8_t fc, level, del_cnt;
-
- LWIP_ASSERT("ni != NULL", ni != NULL);
- ip.addr = ntohl(ni->ip_addr.addr);
- snmp_iptooid(&ip, &ipaddridx[0]);
-
- /* mark nodes for deletion */
- level = 0;
- del_cnt = 0;
- ipa_rn = &ipaddrtree_root;
- while ((level < 4) && (ipa_rn != NULL))
- {
- fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n);
- if (fc == 0)
- {
- /* ipaddridx[level] does not exist */
- del_cnt = 0;
- ipa_rn = NULL;
- }
- else if (fc == 1)
- {
- del_rn[del_cnt] = ipa_rn;
- del_n[del_cnt] = ipa_n;
- del_cnt++;
- ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
- }
- else if (fc == 2)
- {
- /* reset delete (2 or more childs) */
- del_cnt = 0;
- ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr);
- }
- level++;
- }
- /* delete marked index nodes */
- while (del_cnt > 0)
- {
- del_cnt--;
-
- ipa_rn = del_rn[del_cnt];
- ipa_n = del_n[del_cnt];
-
- next = snmp_mib_node_delete(ipa_rn, ipa_n);
- if (next != NULL)
- {
- LWIP_ASSERT("next_count == 0",next->count == 0);
- snmp_mib_lrn_free(next);
- }
- }
- /* disable getnext traversal on empty table */
- if (ipaddrtree_root.count == 0) ipaddrtable.maxlength = 0;
-}
-
-/**
- * Inserts ipRouteTable indexes (.ipRouteDest)
- * into index tree.
- *
- * @param dflt non-zero for the default rte, zero for network rte
- * @param netif points to network interface for this rte
- *
- * @todo record sysuptime for _this_ route when it is installed
- * (needed for ipRouteAge) in the netif.
- */
-void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni)
-{
- u8_t insert = 0;
- struct ip_addr dst;
-
- if (dflt != 0)
- {
- /* the default route 0.0.0.0 */
- dst.addr = 0;
- insert = 1;
- }
- else
- {
- /* route to the network address */
- dst.addr = ntohl(ni->ip_addr.addr & ni->netmask.addr);
- /* exclude 0.0.0.0 network (reserved for default rte) */
- if (dst.addr != 0) insert = 1;
- }
- if (insert)
- {
- struct mib_list_rootnode *iprte_rn;
- struct mib_list_node *iprte_node;
- s32_t iprteidx[4];
- u8_t level;
-
- snmp_iptooid(&dst, &iprteidx[0]);
- level = 0;
- iprte_rn = &iprtetree_root;
- while (level < 4)
- {
- iprte_node = NULL;
- snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node);
- if ((level != 3) && (iprte_node != NULL))
- {
- if (iprte_node->nptr == NULL)
- {
- iprte_rn = snmp_mib_lrn_alloc();
- iprte_node->nptr = (struct mib_node*)iprte_rn;
- if (iprte_rn != NULL)
- {
- if (level == 2)
- {
- iprte_rn->get_object_def = ip_rteentry_get_object_def;
- iprte_rn->get_value = ip_rteentry_get_value;
- iprte_rn->set_test = noleafs_set_test;
- iprte_rn->set_value = noleafs_set_value;
- }
- }
- else
- {
- /* iprte_rn == NULL, malloc failure */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_iprteidx_tree() insert failed, mem full"));
- break;
- }
- }
- else
- {
- iprte_rn = (struct mib_list_rootnode*)iprte_node->nptr;
- }
- }
- level++;
- }
- }
- /* enable getnext traversal on filled table */
- iprtetable.maxlength = 1;
-}
-
-/**
- * Removes ipRouteTable indexes (.ipRouteDest)
- * from index tree.
- *
- * @param dflt non-zero for the default rte, zero for network rte
- * @param netif points to network interface for this rte or NULL
- * for default route to be removed.
- */
-void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni)
-{
- u8_t delete = 0;
- struct ip_addr dst;
-
- if (dflt != 0)
- {
- /* the default route 0.0.0.0 */
- dst.addr = 0;
- delete = 1;
- }
- else
- {
- /* route to the network address */
- dst.addr = ntohl(ni->ip_addr.addr & ni->netmask.addr);
- /* exclude 0.0.0.0 network (reserved for default rte) */
- if (dst.addr != 0) delete = 1;
- }
- if (delete)
- {
- struct mib_list_rootnode *iprte_rn, *next, *del_rn[4];
- struct mib_list_node *iprte_n, *del_n[4];
- s32_t iprteidx[4];
- u8_t fc, level, del_cnt;
-
- snmp_iptooid(&dst, &iprteidx[0]);
- /* mark nodes for deletion */
- level = 0;
- del_cnt = 0;
- iprte_rn = &iprtetree_root;
- while ((level < 4) && (iprte_rn != NULL))
- {
- fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n);
- if (fc == 0)
- {
- /* iprteidx[level] does not exist */
- del_cnt = 0;
- iprte_rn = NULL;
- }
- else if (fc == 1)
- {
- del_rn[del_cnt] = iprte_rn;
- del_n[del_cnt] = iprte_n;
- del_cnt++;
- iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
- }
- else if (fc == 2)
- {
- /* reset delete (2 or more childs) */
- del_cnt = 0;
- iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr);
- }
- level++;
- }
- /* delete marked index nodes */
- while (del_cnt > 0)
- {
- del_cnt--;
-
- iprte_rn = del_rn[del_cnt];
- iprte_n = del_n[del_cnt];
-
- next = snmp_mib_node_delete(iprte_rn, iprte_n);
- if (next != NULL)
- {
- LWIP_ASSERT("next_count == 0",next->count == 0);
- snmp_mib_lrn_free(next);
- }
- }
- }
- /* disable getnext traversal on empty table */
- if (iprtetree_root.count == 0) iprtetable.maxlength = 0;
-}
-
-
-void snmp_inc_icmpinmsgs(void)
-{
- icmpinmsgs++;
-}
-
-void snmp_inc_icmpinerrors(void)
-{
- icmpinerrors++;
-}
-
-void snmp_inc_icmpindestunreachs(void)
-{
- icmpindestunreachs++;
-}
-
-void snmp_inc_icmpintimeexcds(void)
-{
- icmpintimeexcds++;
-}
-
-void snmp_inc_icmpinparmprobs(void)
-{
- icmpinparmprobs++;
-}
-
-void snmp_inc_icmpinsrcquenchs(void)
-{
- icmpinsrcquenchs++;
-}
-
-void snmp_inc_icmpinredirects(void)
-{
- icmpinredirects++;
-}
-
-void snmp_inc_icmpinechos(void)
-{
- icmpinechos++;
-}
-
-void snmp_inc_icmpinechoreps(void)
-{
- icmpinechoreps++;
-}
-
-void snmp_inc_icmpintimestamps(void)
-{
- icmpintimestamps++;
-}
-
-void snmp_inc_icmpintimestampreps(void)
-{
- icmpintimestampreps++;
-}
-
-void snmp_inc_icmpinaddrmasks(void)
-{
- icmpinaddrmasks++;
-}
-
-void snmp_inc_icmpinaddrmaskreps(void)
-{
- icmpinaddrmaskreps++;
-}
-
-void snmp_inc_icmpoutmsgs(void)
-{
- icmpoutmsgs++;
-}
-
-void snmp_inc_icmpouterrors(void)
-{
- icmpouterrors++;
-}
-
-void snmp_inc_icmpoutdestunreachs(void)
-{
- icmpoutdestunreachs++;
-}
-
-void snmp_inc_icmpouttimeexcds(void)
-{
- icmpouttimeexcds++;
-}
-
-void snmp_inc_icmpoutparmprobs(void)
-{
- icmpoutparmprobs++;
-}
-
-void snmp_inc_icmpoutsrcquenchs(void)
-{
- icmpoutsrcquenchs++;
-}
-
-void snmp_inc_icmpoutredirects(void)
-{
- icmpoutredirects++;
-}
-
-void snmp_inc_icmpoutechos(void)
-{
- icmpoutechos++;
-}
-
-void snmp_inc_icmpoutechoreps(void)
-{
- icmpoutechoreps++;
-}
-
-void snmp_inc_icmpouttimestamps(void)
-{
- icmpouttimestamps++;
-}
-
-void snmp_inc_icmpouttimestampreps(void)
-{
- icmpouttimestampreps++;
-}
-
-void snmp_inc_icmpoutaddrmasks(void)
-{
- icmpoutaddrmasks++;
-}
-
-void snmp_inc_icmpoutaddrmaskreps(void)
-{
- icmpoutaddrmaskreps++;
-}
-
-void snmp_inc_tcpactiveopens(void)
-{
- tcpactiveopens++;
-}
-
-void snmp_inc_tcppassiveopens(void)
-{
- tcppassiveopens++;
-}
-
-void snmp_inc_tcpattemptfails(void)
-{
- tcpattemptfails++;
-}
-
-void snmp_inc_tcpestabresets(void)
-{
- tcpestabresets++;
-}
-
-void snmp_inc_tcpinsegs(void)
-{
- tcpinsegs++;
-}
-
-void snmp_inc_tcpoutsegs(void)
-{
- tcpoutsegs++;
-}
-
-void snmp_inc_tcpretranssegs(void)
-{
- tcpretranssegs++;
-}
-
-void snmp_inc_tcpinerrs(void)
-{
- tcpinerrs++;
-}
-
-void snmp_inc_tcpoutrsts(void)
-{
- tcpoutrsts++;
-}
-
-void snmp_inc_udpindatagrams(void)
-{
- udpindatagrams++;
-}
-
-void snmp_inc_udpnoports(void)
-{
- udpnoports++;
-}
-
-void snmp_inc_udpinerrors(void)
-{
- udpinerrors++;
-}
-
-void snmp_inc_udpoutdatagrams(void)
-{
- udpoutdatagrams++;
-}
-
-/**
- * Inserts udpTable indexes (.udpLocalAddress.udpLocalPort)
- * into index tree.
- */
-void snmp_insert_udpidx_tree(struct udp_pcb *pcb)
-{
- struct mib_list_rootnode *udp_rn;
- struct mib_list_node *udp_node;
- struct ip_addr ip;
- s32_t udpidx[5];
- u8_t level;
-
- LWIP_ASSERT("pcb != NULL", pcb != NULL);
- ip.addr = ntohl(pcb->local_ip.addr);
- snmp_iptooid(&ip, &udpidx[0]);
- udpidx[4] = pcb->local_port;
-
- udp_rn = &udp_root;
- for (level = 0; level < 5; level++)
- {
- udp_node = NULL;
- snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node);
- if ((level != 4) && (udp_node != NULL))
- {
- if (udp_node->nptr == NULL)
- {
- udp_rn = snmp_mib_lrn_alloc();
- udp_node->nptr = (struct mib_node*)udp_rn;
- if (udp_rn != NULL)
- {
- if (level == 3)
- {
- udp_rn->get_object_def = udpentry_get_object_def;
- udp_rn->get_value = udpentry_get_value;
- udp_rn->set_test = noleafs_set_test;
- udp_rn->set_value = noleafs_set_value;
- }
- }
- else
- {
- /* udp_rn == NULL, malloc failure */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_udpidx_tree() insert failed, mem full"));
- break;
- }
- }
- else
- {
- udp_rn = (struct mib_list_rootnode*)udp_node->nptr;
- }
- }
- }
- udptable.maxlength = 1;
-}
-
-/**
- * Removes udpTable indexes (.udpLocalAddress.udpLocalPort)
- * from index tree.
- */
-void snmp_delete_udpidx_tree(struct udp_pcb *pcb)
-{
- struct mib_list_rootnode *udp_rn, *next, *del_rn[5];
- struct mib_list_node *udp_n, *del_n[5];
- struct ip_addr ip;
- s32_t udpidx[5];
- u8_t bindings, fc, level, del_cnt;
-
- LWIP_ASSERT("pcb != NULL", pcb != NULL);
- ip.addr = ntohl(pcb->local_ip.addr);
- snmp_iptooid(&ip, &udpidx[0]);
- udpidx[4] = pcb->local_port;
-
- /* count PCBs for a given binding
- (e.g. when reusing ports or for temp output PCBs) */
- bindings = 0;
- pcb = udp_pcbs;
- while ((pcb != NULL))
- {
- if ((pcb->local_ip.addr == ip.addr) &&
- (pcb->local_port == udpidx[4]))
- {
- bindings++;
- }
- pcb = pcb->next;
- }
- if (bindings == 1)
- {
- /* selectively remove */
- /* mark nodes for deletion */
- level = 0;
- del_cnt = 0;
- udp_rn = &udp_root;
- while ((level < 5) && (udp_rn != NULL))
- {
- fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n);
- if (fc == 0)
- {
- /* udpidx[level] does not exist */
- del_cnt = 0;
- udp_rn = NULL;
- }
- else if (fc == 1)
- {
- del_rn[del_cnt] = udp_rn;
- del_n[del_cnt] = udp_n;
- del_cnt++;
- udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
- }
- else if (fc == 2)
- {
- /* reset delete (2 or more childs) */
- del_cnt = 0;
- udp_rn = (struct mib_list_rootnode*)(udp_n->nptr);
- }
- level++;
- }
- /* delete marked index nodes */
- while (del_cnt > 0)
- {
- del_cnt--;
-
- udp_rn = del_rn[del_cnt];
- udp_n = del_n[del_cnt];
-
- next = snmp_mib_node_delete(udp_rn, udp_n);
- if (next != NULL)
- {
- LWIP_ASSERT("next_count == 0",next->count == 0);
- snmp_mib_lrn_free(next);
- }
- }
- }
- /* disable getnext traversal on empty table */
- if (udp_root.count == 0) udptable.maxlength = 0;
-}
-
-
-void snmp_inc_snmpinpkts(void)
-{
- snmpinpkts++;
-}
-
-void snmp_inc_snmpoutpkts(void)
-{
- snmpoutpkts++;
-}
-
-void snmp_inc_snmpinbadversions(void)
-{
- snmpinbadversions++;
-}
-
-void snmp_inc_snmpinbadcommunitynames(void)
-{
- snmpinbadcommunitynames++;
-}
-
-void snmp_inc_snmpinbadcommunityuses(void)
-{
- snmpinbadcommunityuses++;
-}
-
-void snmp_inc_snmpinasnparseerrs(void)
-{
- snmpinasnparseerrs++;
-}
-
-void snmp_inc_snmpintoobigs(void)
-{
- snmpintoobigs++;
-}
-
-void snmp_inc_snmpinnosuchnames(void)
-{
- snmpinnosuchnames++;
-}
-
-void snmp_inc_snmpinbadvalues(void)
-{
- snmpinbadvalues++;
-}
-
-void snmp_inc_snmpinreadonlys(void)
-{
- snmpinreadonlys++;
-}
-
-void snmp_inc_snmpingenerrs(void)
-{
- snmpingenerrs++;
-}
-
-void snmp_add_snmpintotalreqvars(u8_t value)
-{
- snmpintotalreqvars += value;
-}
-
-void snmp_add_snmpintotalsetvars(u8_t value)
-{
- snmpintotalsetvars += value;
-}
-
-void snmp_inc_snmpingetrequests(void)
-{
- snmpingetrequests++;
-}
-
-void snmp_inc_snmpingetnexts(void)
-{
- snmpingetnexts++;
-}
-
-void snmp_inc_snmpinsetrequests(void)
-{
- snmpinsetrequests++;
-}
-
-void snmp_inc_snmpingetresponses(void)
-{
- snmpingetresponses++;
-}
-
-void snmp_inc_snmpintraps(void)
-{
- snmpintraps++;
-}
-
-void snmp_inc_snmpouttoobigs(void)
-{
- snmpouttoobigs++;
-}
-
-void snmp_inc_snmpoutnosuchnames(void)
-{
- snmpoutnosuchnames++;
-}
-
-void snmp_inc_snmpoutbadvalues(void)
-{
- snmpoutbadvalues++;
-}
-
-void snmp_inc_snmpoutgenerrs(void)
-{
- snmpoutgenerrs++;
-}
-
-void snmp_inc_snmpoutgetrequests(void)
-{
- snmpoutgetrequests++;
-}
-
-void snmp_inc_snmpoutgetnexts(void)
-{
- snmpoutgetnexts++;
-}
-
-void snmp_inc_snmpoutsetrequests(void)
-{
- snmpoutsetrequests++;
-}
-
-void snmp_inc_snmpoutgetresponses(void)
-{
- snmpoutgetresponses++;
-}
-
-void snmp_inc_snmpouttraps(void)
-{
- snmpouttraps++;
-}
-
-void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid)
-{
- *oid = &snmpgrp_id;
-}
-
-void snmp_set_snmpenableauthentraps(u8_t *value)
-{
- if (value != NULL)
- {
- snmpenableauthentraps_ptr = value;
- }
-}
-
-void snmp_get_snmpenableauthentraps(u8_t *value)
-{
- *value = *snmpenableauthentraps_ptr;
-}
-
-void
-noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- if (ident_len){}
- if (ident){}
- od->instance = MIB_OBJECT_NONE;
-}
-
-void
-noleafs_get_value(struct obj_def *od, u16_t len, void *value)
-{
- if (od){}
- if (len){}
- if (value){}
-}
-
-u8_t
-noleafs_set_test(struct obj_def *od, u16_t len, void *value)
-{
- if (od){}
- if (len){}
- if (value){}
- /* can't set */
- return 0;
-}
-
-void
-noleafs_set_value(struct obj_def *od, u16_t len, void *value)
-{
- if (od){}
- if (len){}
- if (value){}
-}
-
-
-/**
- * Returns systems object definitions.
- *
- * @param ident_len the address length (2)
- * @param ident points to objectname.0 (object id trailer)
- * @param od points to object definition.
- */
-static void
-system_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- u8_t id;
-
- /* return to object name, adding index depth (1) */
- ident_len += 1;
- ident -= 1;
- if (ident_len == 2)
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def system.%"U16_F".0\n",(u16_t)id));
- switch (id)
- {
- case 1: /* sysDescr */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
- od->v_len = *sysdescr_len_ptr;
- break;
- case 2: /* sysObjectID */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
- od->v_len = sysobjid.len * sizeof(s32_t);
- break;
- case 3: /* sysUpTime */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
- od->v_len = sizeof(u32_t);
- break;
- case 4: /* sysContact */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
- od->v_len = *syscontact_len_ptr;
- break;
- case 5: /* sysName */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
- od->v_len = *sysname_len_ptr;
- break;
- case 6: /* sysLocation */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
- od->v_len = *syslocation_len_ptr;
- break;
- case 7: /* sysServices */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- };
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-/**
- * Returns system object value.
- *
- * @param ident_len the address length (2)
- * @param ident points to objectname.0 (object id trailer)
- * @param len return value space (in bytes)
- * @param value points to (varbind) space to copy value into.
- */
-static void
-system_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id;
-
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* sysDescr */
- ocstrncpy(value,sysdescr_ptr,len);
- break;
- case 2: /* sysObjectID */
- objectidncpy((s32_t*)value,(s32_t*)sysobjid.id,len / sizeof(s32_t));
- break;
- case 3: /* sysUpTime */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = sysuptime;
- }
- break;
- case 4: /* sysContact */
- ocstrncpy(value,syscontact_ptr,len);
- break;
- case 5: /* sysName */
- ocstrncpy(value,sysname_ptr,len);
- break;
- case 6: /* sysLocation */
- ocstrncpy(value,syslocation_ptr,len);
- break;
- case 7: /* sysServices */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = sysservices;
- }
- break;
- };
-}
-
-static u8_t
-system_set_test(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id, set_ok;
-
- if (value) {}
- set_ok = 0;
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 4: /* sysContact */
- if ((syscontact_ptr != syscontact_default) &&
- (len <= 255))
- {
- set_ok = 1;
- }
- break;
- case 5: /* sysName */
- if ((sysname_ptr != sysname_default) &&
- (len <= 255))
- {
- set_ok = 1;
- }
- break;
- case 6: /* sysLocation */
- if ((syslocation_ptr != syslocation_default) &&
- (len <= 255))
- {
- set_ok = 1;
- }
- break;
- };
- return set_ok;
-}
-
-static void
-system_set_value(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id;
-
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 4: /* sysContact */
- ocstrncpy(syscontact_ptr,value,len);
- *syscontact_len_ptr = len;
- break;
- case 5: /* sysName */
- ocstrncpy(sysname_ptr,value,len);
- *sysname_len_ptr = len;
- break;
- case 6: /* sysLocation */
- ocstrncpy(syslocation_ptr,value,len);
- *syslocation_len_ptr = len;
- break;
- };
-}
-
-/**
- * Returns interfaces.ifnumber object definition.
- *
- * @param ident_len the address length (2)
- * @param ident points to objectname.index
- * @param od points to object definition.
- */
-static void
-interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (1) */
- ident_len += 1;
- ident -= 1;
- if (ident_len == 2)
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("interfaces_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-/**
- * Returns interfaces.ifnumber object value.
- *
- * @param ident_len the address length (2)
- * @param ident points to objectname.0 (object id trailer)
- * @param len return value space (in bytes)
- * @param value points to (varbind) space to copy value into.
- */
-static void
-interfaces_get_value(struct obj_def *od, u16_t len, void *value)
-{
- if (len){}
- if (od->id_inst_ptr[0] == 1)
- {
- s32_t *sint_ptr = value;
- *sint_ptr = iflist_root.count;
- }
-}
-
-/**
- * Returns ifentry object definitions.
- *
- * @param ident_len the address length (2)
- * @param ident points to objectname.index
- * @param od points to object definition.
- */
-static void
-ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- u8_t id;
-
- /* return to object name, adding index depth (1) */
- ident_len += 1;
- ident -= 1;
- if (ident_len == 2)
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ifentry.%"U16_F"\n",(u16_t)id));
- switch (id)
- {
- case 1: /* ifIndex */
- case 3: /* ifType */
- case 4: /* ifMtu */
- case 8: /* ifOperStatus */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 2: /* ifDescr */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
- /** @todo this should be some sort of sizeof(struct netif.name) */
- od->v_len = 2;
- break;
- case 5: /* ifSpeed */
- case 21: /* ifOutQLen */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
- od->v_len = sizeof(u32_t);
- break;
- case 6: /* ifPhysAddress */
- {
- struct netif *netif;
-
- snmp_ifindextonetif(ident[1], &netif);
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
- od->v_len = netif->hwaddr_len;
- }
- break;
- case 7: /* ifAdminStatus */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 9: /* ifLastChange */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS);
- od->v_len = sizeof(u32_t);
- break;
- case 10: /* ifInOctets */
- case 11: /* ifInUcastPkts */
- case 12: /* ifInNUcastPkts */
- case 13: /* ifInDiscarts */
- case 14: /* ifInErrors */
- case 15: /* ifInUnkownProtos */
- case 16: /* ifOutOctets */
- case 17: /* ifOutUcastPkts */
- case 18: /* ifOutNUcastPkts */
- case 19: /* ifOutDiscarts */
- case 20: /* ifOutErrors */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
- od->v_len = sizeof(u32_t);
- break;
- case 22: /* ifSpecific */
- /** @note returning zeroDotZero (0.0) no media specific MIB support */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
- od->v_len = ifspecific.len * sizeof(s32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- };
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-/**
- * Returns ifentry object value.
- *
- * @param ident_len the address length (2)
- * @param ident points to objectname.0 (object id trailer)
- * @param len return value space (in bytes)
- * @param value points to (varbind) space to copy value into.
- */
-static void
-ifentry_get_value(struct obj_def *od, u16_t len, void *value)
-{
- struct netif *netif;
- u8_t id;
-
- snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* ifIndex */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = od->id_inst_ptr[1];
- }
- break;
- case 2: /* ifDescr */
- ocstrncpy(value,(u8_t*)netif->name,len);
- break;
- case 3: /* ifType */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = netif->link_type;
- }
- break;
- case 4: /* ifMtu */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = netif->mtu;
- }
- break;
- case 5: /* ifSpeed */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->link_speed;
- }
- break;
- case 6: /* ifPhysAddress */
- ocstrncpy(value,netif->hwaddr,len);
- break;
- case 7: /* ifAdminStatus */
- case 8: /* ifOperStatus */
- {
- s32_t *sint_ptr = value;
- if (netif_is_up(netif))
- {
- *sint_ptr = 1;
- }
- else
- {
- *sint_ptr = 2;
- }
- }
- break;
- case 9: /* ifLastChange */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ts;
- }
- break;
- case 10: /* ifInOctets */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ifinoctets;
- }
- break;
- case 11: /* ifInUcastPkts */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ifinucastpkts;
- }
- break;
- case 12: /* ifInNUcastPkts */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ifinnucastpkts;
- }
- break;
- case 13: /* ifInDiscarts */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ifindiscards;
- }
- break;
- case 14: /* ifInErrors */
- case 15: /* ifInUnkownProtos */
- /** @todo add these counters! */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = 0;
- }
- break;
- case 16: /* ifOutOctets */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ifoutoctets;
- }
- break;
- case 17: /* ifOutUcastPkts */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ifoutucastpkts;
- }
- break;
- case 18: /* ifOutNUcastPkts */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ifoutnucastpkts;
- }
- break;
- case 19: /* ifOutDiscarts */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = netif->ifoutdiscards;
- }
- break;
- case 20: /* ifOutErrors */
- /** @todo add this counter! */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = 0;
- }
- break;
- case 21: /* ifOutQLen */
- /** @todo figure out if this must be 0 (no queue) or 1? */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = 0;
- }
- break;
- case 22: /* ifSpecific */
- objectidncpy((s32_t*)value,(s32_t*)ifspecific.id,len / sizeof(s32_t));
- break;
- };
-}
-
-/**
- * Returns atentry object definitions.
- *
- * @param ident_len the address length (6)
- * @param ident points to objectname.atifindex.atnetaddress
- * @param od points to object definition.
- */
-static void
-atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (5) */
- ident_len += 5;
- ident -= 5;
-
- if (ident_len == 6)
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- switch (ident[0])
- {
- case 1: /* atIfIndex */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 2: /* atPhysAddress */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
- od->v_len = sizeof(struct eth_addr);
- break;
- case 3: /* atNetAddress */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
- od->v_len = 4;
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- }
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-atentry_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id;
- struct eth_addr* ethaddr_ret;
- struct ip_addr* ipaddr_ret;
- struct ip_addr ip;
- struct netif *netif;
-
- if (len) {}
-
- snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
- snmp_oidtoip(&od->id_inst_ptr[2], &ip);
- ip.addr = htonl(ip.addr);
-
- if (etharp_find_addr(netif, &ip, ðaddr_ret, &ipaddr_ret) > -1)
- {
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* atIfIndex */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = od->id_inst_ptr[1];
- }
- break;
- case 2: /* atPhysAddress */
- {
- struct eth_addr *dst = value;
-
- *dst = *ethaddr_ret;
- }
- break;
- case 3: /* atNetAddress */
- {
- struct ip_addr *dst = value;
-
- *dst = *ipaddr_ret;
- }
- break;
- }
- }
-}
-
-static void
-ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- u8_t id;
-
- /* return to object name, adding index depth (1) */
- ident_len += 1;
- ident -= 1;
- if (ident_len == 2)
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id));
- switch (id)
- {
- case 1: /* ipForwarding */
- case 2: /* ipDefaultTTL */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 3: /* ipInReceives */
- case 4: /* ipInHdrErrors */
- case 5: /* ipInAddrErrors */
- case 6: /* ipForwDatagrams */
- case 7: /* ipInUnknownProtos */
- case 8: /* ipInDiscards */
- case 9: /* ipInDelivers */
- case 10: /* ipOutRequests */
- case 11: /* ipOutDiscards */
- case 12: /* ipOutNoRoutes */
- case 14: /* ipReasmReqds */
- case 15: /* ipReasmOKs */
- case 16: /* ipReasmFails */
- case 17: /* ipFragOKs */
- case 18: /* ipFragFails */
- case 19: /* ipFragCreates */
- case 23: /* ipRoutingDiscards */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
- od->v_len = sizeof(u32_t);
- break;
- case 13: /* ipReasmTimeout */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- };
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-ip_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id;
-
- if (len) {}
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* ipForwarding */
- {
- s32_t *sint_ptr = value;
-#if IP_FORWARD
- /* forwarding */
- *sint_ptr = 1;
-#else
- /* not-forwarding */
- *sint_ptr = 2;
-#endif
- }
- break;
- case 2: /* ipDefaultTTL */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = IP_DEFAULT_TTL;
- }
- break;
- case 3: /* ipInReceives */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipinreceives;
- }
- break;
- case 4: /* ipInHdrErrors */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipinhdrerrors;
- }
- break;
- case 5: /* ipInAddrErrors */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipinaddrerrors;
- }
- break;
- case 6: /* ipForwDatagrams */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipforwdatagrams;
- }
- break;
- case 7: /* ipInUnknownProtos */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipinunknownprotos;
- }
- break;
- case 8: /* ipInDiscards */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipindiscards;
- }
- break;
- case 9: /* ipInDelivers */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipindelivers;
- }
- break;
- case 10: /* ipOutRequests */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipoutrequests;
- }
- break;
- case 11: /* ipOutDiscards */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipoutdiscards;
- }
- break;
- case 12: /* ipOutNoRoutes */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipoutnoroutes;
- }
- break;
- case 13: /* ipReasmTimeout */
- {
- s32_t *sint_ptr = value;
-#if IP_REASSEMBLY
- *sint_ptr = IP_REASS_MAXAGE;
-#else
- *sint_ptr = 0;
-#endif
- }
- break;
- case 14: /* ipReasmReqds */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipreasmreqds;
- }
- break;
- case 15: /* ipReasmOKs */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipreasmoks;
- }
- break;
- case 16: /* ipReasmFails */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipreasmfails;
- }
- break;
- case 17: /* ipFragOKs */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipfragoks;
- }
- break;
- case 18: /* ipFragFails */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipfragfails;
- }
- break;
- case 19: /* ipFragCreates */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = ipfragcreates;
- }
- break;
- case 23: /* ipRoutingDiscards */
- /** @todo can lwIP discard routes at all?? hardwire this to 0?? */
- {
- u32_t *uint_ptr = value;
- *uint_ptr = iproutingdiscards;
- }
- break;
- };
-}
-
-/**
- * Test ip object value before setting.
- *
- * @param od is the object definition
- * @param len return value space (in bytes)
- * @param value points to (varbind) space to copy value from.
- *
- * @note we allow set if the value matches the hardwired value,
- * otherwise return badvalue.
- */
-static u8_t
-ip_set_test(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id, set_ok;
- s32_t *sint_ptr = value;
-
- if (len) {}
- set_ok = 0;
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* ipForwarding */
-#if IP_FORWARD
- /* forwarding */
- if (*sint_ptr == 1)
-#else
- /* not-forwarding */
- if (*sint_ptr == 2)
-#endif
- {
- set_ok = 1;
- }
- break;
- case 2: /* ipDefaultTTL */
- if (*sint_ptr == IP_DEFAULT_TTL)
- {
- set_ok = 1;
- }
- break;
- };
- return set_ok;
-}
-
-static void
-ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (4) */
- ident_len += 4;
- ident -= 4;
-
- if (ident_len == 5)
- {
- u8_t id;
-
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- switch (id)
- {
- case 1: /* ipAdEntAddr */
- case 3: /* ipAdEntNetMask */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
- od->v_len = 4;
- break;
- case 2: /* ipAdEntIfIndex */
- case 4: /* ipAdEntBcastAddr */
- case 5: /* ipAdEntReasmMaxSize */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- }
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id;
- u16_t ifidx;
- struct ip_addr ip;
- struct netif *netif = netif_list;
-
- if (len) {}
- snmp_oidtoip(&od->id_inst_ptr[1], &ip);
- ip.addr = htonl(ip.addr);
- ifidx = 0;
- while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr))
- {
- netif = netif->next;
- ifidx++;
- }
-
- if (netif != NULL)
- {
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* ipAdEntAddr */
- {
- struct ip_addr *dst = value;
- *dst = netif->ip_addr;
- }
- break;
- case 2: /* ipAdEntIfIndex */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = ifidx + 1;
- }
- break;
- case 3: /* ipAdEntNetMask */
- {
- struct ip_addr *dst = value;
- *dst = netif->netmask;
- }
- break;
- case 4: /* ipAdEntBcastAddr */
- {
- s32_t *sint_ptr = value;
-
- /* lwIP oddity, there's no broadcast
- address in the netif we can rely on */
- *sint_ptr = ip_addr_broadcast.addr & 1;
- }
- break;
- case 5: /* ipAdEntReasmMaxSize */
- {
- s32_t *sint_ptr = value;
-#if IP_REASSEMBLY
- *sint_ptr = (IP_HLEN + IP_REASS_BUFSIZE);
-#else
- /** @todo returning MTU would be a bad thing and
- returning a wild guess like '576' isn't good either */
- *sint_ptr = 0;
-#endif
- }
- break;
- }
- }
-}
-
-/**
- * @note
- * lwIP IP routing is currently using the network addresses in netif_list.
- * if no suitable network IP is found in netif_list, the default_netif is used.
- */
-static void
-ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- u8_t id;
-
- /* return to object name, adding index depth (4) */
- ident_len += 4;
- ident -= 4;
-
- if (ident_len == 5)
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- switch (id)
- {
- case 1: /* ipRouteDest */
- case 7: /* ipRouteNextHop */
- case 11: /* ipRouteMask */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
- od->v_len = 4;
- break;
- case 2: /* ipRouteIfIndex */
- case 3: /* ipRouteMetric1 */
- case 4: /* ipRouteMetric2 */
- case 5: /* ipRouteMetric3 */
- case 6: /* ipRouteMetric4 */
- case 8: /* ipRouteType */
- case 10: /* ipRouteAge */
- case 12: /* ipRouteMetric5 */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 9: /* ipRouteProto */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 13: /* ipRouteInfo */
- /** @note returning zeroDotZero (0.0) no routing protocol specific MIB */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID);
- od->v_len = iprouteinfo.len * sizeof(s32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- }
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value)
-{
- struct netif *netif;
- struct ip_addr dest;
- s32_t *ident;
- u8_t id;
-
- ident = od->id_inst_ptr;
- snmp_oidtoip(&ident[1], &dest);
- dest.addr = htonl(dest.addr);
-
- if (dest.addr == 0)
- {
- /* ip_route() uses default netif for default route */
- netif = netif_default;
- }
- else
- {
- /* not using ip_route(), need exact match! */
- netif = netif_list;
- while ((netif != NULL) &&
- !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) )
- {
- netif = netif->next;
- }
- }
- if (netif != NULL)
- {
- id = ident[0];
- switch (id)
- {
- case 1: /* ipRouteDest */
- {
- struct ip_addr *dst = value;
-
- if (dest.addr == 0)
- {
- /* default rte has 0.0.0.0 dest */
- dst->addr = 0;
- }
- else
- {
- /* netifs have netaddress dest */
- dst->addr = netif->ip_addr.addr & netif->netmask.addr;
- }
- }
- break;
- case 2: /* ipRouteIfIndex */
- {
- s32_t *sint_ptr = value;
-
- snmp_netiftoifindex(netif, sint_ptr);
- }
- break;
- case 3: /* ipRouteMetric1 */
- {
- s32_t *sint_ptr = value;
-
- if (dest.addr == 0)
- {
- /* default rte has metric 1 */
- *sint_ptr = 1;
- }
- else
- {
- /* other rtes have metric 0 */
- *sint_ptr = 0;
- }
- }
- break;
- case 4: /* ipRouteMetric2 */
- case 5: /* ipRouteMetric3 */
- case 6: /* ipRouteMetric4 */
- case 12: /* ipRouteMetric5 */
- {
- s32_t *sint_ptr = value;
- /* not used */
- *sint_ptr = -1;
- }
- break;
- case 7: /* ipRouteNextHop */
- {
- struct ip_addr *dst = value;
-
- if (dest.addr == 0)
- {
- /* default rte: gateway */
- *dst = netif->gw;
- }
- else
- {
- /* other rtes: netif ip_addr */
- *dst = netif->ip_addr;
- }
- }
- break;
- case 8: /* ipRouteType */
- {
- s32_t *sint_ptr = value;
-
- if (dest.addr == 0)
- {
- /* default rte is indirect */
- *sint_ptr = 4;
- }
- else
- {
- /* other rtes are direct */
- *sint_ptr = 3;
- }
- }
- break;
- case 9: /* ipRouteProto */
- {
- s32_t *sint_ptr = value;
- /* locally defined routes */
- *sint_ptr = 2;
- }
- break;
- case 10: /* ipRouteAge */
- {
- s32_t *sint_ptr = value;
- /** @todo (sysuptime - timestamp last change) / 100
- @see snmp_insert_iprteidx_tree() */
- *sint_ptr = 0;
- }
- break;
- case 11: /* ipRouteMask */
- {
- struct ip_addr *dst = value;
-
- if (dest.addr == 0)
- {
- /* default rte use 0.0.0.0 mask */
- dst->addr = 0;
- }
- else
- {
- /* other rtes use netmask */
- *dst = netif->netmask;
- }
- }
- break;
- case 13: /* ipRouteInfo */
- objectidncpy((s32_t*)value,(s32_t*)iprouteinfo.id,len / sizeof(s32_t));
- break;
- }
- }
-}
-
-static void
-ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (5) */
- ident_len += 5;
- ident -= 5;
-
- if (ident_len == 6)
- {
- u8_t id;
-
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- switch (id)
- {
- case 1: /* ipNetToMediaIfIndex */
- case 4: /* ipNetToMediaType */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 2: /* ipNetToMediaPhysAddress */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR);
- od->v_len = sizeof(struct eth_addr);
- break;
- case 3: /* ipNetToMediaNetAddress */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
- od->v_len = 4;
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- }
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id;
- struct eth_addr* ethaddr_ret;
- struct ip_addr* ipaddr_ret;
- struct ip_addr ip;
- struct netif *netif;
-
- if (len) {}
-
- snmp_ifindextonetif(od->id_inst_ptr[1], &netif);
- snmp_oidtoip(&od->id_inst_ptr[2], &ip);
- ip.addr = htonl(ip.addr);
-
- if (etharp_find_addr(netif, &ip, ðaddr_ret, &ipaddr_ret) > -1)
- {
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* ipNetToMediaIfIndex */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = od->id_inst_ptr[1];
- }
- break;
- case 2: /* ipNetToMediaPhysAddress */
- {
- struct eth_addr *dst = value;
-
- *dst = *ethaddr_ret;
- }
- break;
- case 3: /* ipNetToMediaNetAddress */
- {
- struct ip_addr *dst = value;
-
- *dst = *ipaddr_ret;
- }
- break;
- case 4: /* ipNetToMediaType */
- {
- s32_t *sint_ptr = value;
- /* dynamic (?) */
- *sint_ptr = 3;
- }
- break;
- }
- }
-}
-
-static void
-icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (1) */
- ident_len += 1;
- ident -= 1;
- if ((ident_len == 2) &&
- (ident[0] > 0) && (ident[0] < 27))
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
- od->v_len = sizeof(u32_t);
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("icmp_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-icmp_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u32_t *uint_ptr = value;
- u8_t id;
-
- if (len){}
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* icmpInMsgs */
- *uint_ptr = icmpinmsgs;
- break;
- case 2: /* icmpInErrors */
- *uint_ptr = icmpinerrors;
- break;
- case 3: /* icmpInDestUnreachs */
- *uint_ptr = icmpindestunreachs;
- break;
- case 4: /* icmpInTimeExcds */
- *uint_ptr = icmpintimeexcds;
- break;
- case 5: /* icmpInParmProbs */
- *uint_ptr = icmpinparmprobs;
- break;
- case 6: /* icmpInSrcQuenchs */
- *uint_ptr = icmpinsrcquenchs;
- break;
- case 7: /* icmpInRedirects */
- *uint_ptr = icmpinredirects;
- break;
- case 8: /* icmpInEchos */
- *uint_ptr = icmpinechos;
- break;
- case 9: /* icmpInEchoReps */
- *uint_ptr = icmpinechoreps;
- break;
- case 10: /* icmpInTimestamps */
- *uint_ptr = icmpintimestamps;
- break;
- case 11: /* icmpInTimestampReps */
- *uint_ptr = icmpintimestampreps;
- break;
- case 12: /* icmpInAddrMasks */
- *uint_ptr = icmpinaddrmasks;
- break;
- case 13: /* icmpInAddrMaskReps */
- *uint_ptr = icmpinaddrmaskreps;
- break;
- case 14: /* icmpOutMsgs */
- *uint_ptr = icmpoutmsgs;
- break;
- case 15: /* icmpOutErrors */
- *uint_ptr = icmpouterrors;
- break;
- case 16: /* icmpOutDestUnreachs */
- *uint_ptr = icmpoutdestunreachs;
- break;
- case 17: /* icmpOutTimeExcds */
- *uint_ptr = icmpouttimeexcds;
- break;
- case 18: /* icmpOutParmProbs */
- *uint_ptr = icmpoutparmprobs;
- break;
- case 19: /* icmpOutSrcQuenchs */
- *uint_ptr = icmpoutsrcquenchs;
- break;
- case 20: /* icmpOutRedirects */
- *uint_ptr = icmpoutredirects;
- break;
- case 21: /* icmpOutEchos */
- *uint_ptr = icmpoutechos;
- break;
- case 22: /* icmpOutEchoReps */
- *uint_ptr = icmpoutechoreps;
- break;
- case 23: /* icmpOutTimestamps */
- *uint_ptr = icmpouttimestamps;
- break;
- case 24: /* icmpOutTimestampReps */
- *uint_ptr = icmpouttimestampreps;
- break;
- case 25: /* icmpOutAddrMasks */
- *uint_ptr = icmpoutaddrmasks;
- break;
- case 26: /* icmpOutAddrMaskReps */
- *uint_ptr = icmpoutaddrmaskreps;
- break;
- }
-}
-
-#if LWIP_TCP
-/** @todo tcp grp */
-static void
-tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- u8_t id;
-
- /* return to object name, adding index depth (1) */
- ident_len += 1;
- ident -= 1;
- if (ident_len == 2)
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id));
-
- switch (id)
- {
- case 1: /* tcpRtoAlgorithm */
- case 2: /* tcpRtoMin */
- case 3: /* tcpRtoMax */
- case 4: /* tcpMaxConn */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 5: /* tcpActiveOpens */
- case 6: /* tcpPassiveOpens */
- case 7: /* tcpAttemptFails */
- case 8: /* tcpEstabResets */
- case 10: /* tcpInSegs */
- case 11: /* tcpOutSegs */
- case 12: /* tcpRetransSegs */
- case 14: /* tcpInErrs */
- case 15: /* tcpOutRsts */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
- od->v_len = sizeof(u32_t);
- break;
- case 9: /* tcpCurrEstab */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE);
- od->v_len = sizeof(u32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- };
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-tcp_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u32_t *uint_ptr = value;
- s32_t *sint_ptr = value;
- u8_t id;
-
- if (len){}
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* tcpRtoAlgorithm, vanj(4) */
- *sint_ptr = 4;
- break;
- case 2: /* tcpRtoMin */
- /* @todo not the actual value, a guess,
- needs to be calculated */
- *sint_ptr = 1000;
- break;
- case 3: /* tcpRtoMax */
- /* @todo not the actual value, a guess,
- needs to be calculated */
- *sint_ptr = 60000;
- break;
- case 4: /* tcpMaxConn */
- *sint_ptr = MEMP_NUM_TCP_PCB;
- break;
- case 5: /* tcpActiveOpens */
- *uint_ptr = tcpactiveopens;
- break;
- case 6: /* tcpPassiveOpens */
- *uint_ptr = tcppassiveopens;
- break;
- case 7: /* tcpAttemptFails */
- *uint_ptr = tcpattemptfails;
- break;
- case 8: /* tcpEstabResets */
- *uint_ptr = tcpestabresets;
- break;
- case 9: /* tcpCurrEstab */
- {
- u16_t tcpcurrestab = 0;
- struct tcp_pcb *pcb = tcp_active_pcbs;
- while (pcb != NULL)
- {
- if ((pcb->state == ESTABLISHED) ||
- (pcb->state == CLOSE_WAIT))
- {
- tcpcurrestab++;
- }
- pcb = pcb->next;
- }
- *uint_ptr = tcpcurrestab;
- }
- break;
- case 10: /* tcpInSegs */
- *uint_ptr = tcpinsegs;
- break;
- case 11: /* tcpOutSegs */
- *uint_ptr = tcpoutsegs;
- break;
- case 12: /* tcpRetransSegs */
- *uint_ptr = tcpretranssegs;
- break;
- case 14: /* tcpInErrs */
- *uint_ptr = tcpinerrs;
- break;
- case 15: /* tcpOutRsts */
- *uint_ptr = tcpoutrsts;
- break;
- }
-}
-
-static void
-tcpconnentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (10) */
- ident_len += 10;
- ident -= 10;
-
- if (ident_len == 11)
- {
- u8_t id;
-
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id));
-
- switch (id)
- {
- case 1: /* tcpConnState */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- case 2: /* tcpConnLocalAddress */
- case 4: /* tcpConnRemAddress */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
- od->v_len = 4;
- break;
- case 3: /* tcpConnLocalPort */
- case 5: /* tcpConnRemPort */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcpconnentry_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- };
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcpconnentry_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-tcpconnentry_get_value(struct obj_def *od, u16_t len, void *value)
-{
- struct ip_addr lip, rip;
- u16_t lport, rport;
- s32_t *ident;
-
- ident = od->id_inst_ptr;
- snmp_oidtoip(&ident[1], &lip);
- lip.addr = htonl(lip.addr);
- lport = ident[5];
- snmp_oidtoip(&ident[6], &rip);
- rip.addr = htonl(rip.addr);
- rport = ident[10];
-
- /** @todo find matching PCB */
-}
-#endif
-
-static void
-udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (1) */
- ident_len += 1;
- ident -= 1;
- if ((ident_len == 2) &&
- (ident[0] > 0) && (ident[0] < 6))
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
- od->v_len = sizeof(u32_t);
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("udp_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-udp_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u32_t *uint_ptr = value;
- u8_t id;
-
- if (len){}
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* udpInDatagrams */
- *uint_ptr = udpindatagrams;
- break;
- case 2: /* udpNoPorts */
- *uint_ptr = udpnoports;
- break;
- case 3: /* udpInErrors */
- *uint_ptr = udpinerrors;
- break;
- case 4: /* udpOutDatagrams */
- *uint_ptr = udpoutdatagrams;
- break;
- }
-}
-
-static void
-udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (5) */
- ident_len += 5;
- ident -= 5;
-
- if (ident_len == 6)
- {
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- switch (ident[0])
- {
- case 1: /* udpLocalAddress */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR);
- od->v_len = 4;
- break;
- case 2: /* udpLocalPort */
- od->instance = MIB_OBJECT_TAB;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- }
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-udpentry_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id;
- struct udp_pcb *pcb;
- struct ip_addr ip;
- u16_t port;
-
- if (len){}
- snmp_oidtoip(&od->id_inst_ptr[1], &ip);
- ip.addr = htonl(ip.addr);
- port = od->id_inst_ptr[5];
-
- pcb = udp_pcbs;
- while ((pcb != NULL) &&
- !((pcb->local_ip.addr == ip.addr) &&
- (pcb->local_port == port)))
- {
- pcb = pcb->next;
- }
-
- if (pcb != NULL)
- {
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* udpLocalAddress */
- {
- struct ip_addr *dst = value;
- *dst = pcb->local_ip;
- }
- break;
- case 2: /* udpLocalPort */
- {
- s32_t *sint_ptr = value;
- *sint_ptr = pcb->local_port;
- }
- break;
- }
- }
-}
-
-static void
-snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od)
-{
- /* return to object name, adding index depth (1) */
- ident_len += 1;
- ident -= 1;
- if (ident_len == 2)
- {
- u8_t id;
-
- od->id_inst_len = ident_len;
- od->id_inst_ptr = ident;
-
- id = ident[0];
- switch (id)
- {
- case 1: /* snmpInPkts */
- case 2: /* snmpOutPkts */
- case 3: /* snmpInBadVersions */
- case 4: /* snmpInBadCommunityNames */
- case 5: /* snmpInBadCommunityUses */
- case 6: /* snmpInASNParseErrs */
- case 8: /* snmpInTooBigs */
- case 9: /* snmpInNoSuchNames */
- case 10: /* snmpInBadValues */
- case 11: /* snmpInReadOnlys */
- case 12: /* snmpInGenErrs */
- case 13: /* snmpInTotalReqVars */
- case 14: /* snmpInTotalSetVars */
- case 15: /* snmpInGetRequests */
- case 16: /* snmpInGetNexts */
- case 17: /* snmpInSetRequests */
- case 18: /* snmpInGetResponses */
- case 19: /* snmpInTraps */
- case 20: /* snmpOutTooBigs */
- case 21: /* snmpOutNoSuchNames */
- case 22: /* snmpOutBadValues */
- case 24: /* snmpOutGenErrs */
- case 25: /* snmpOutGetRequests */
- case 26: /* snmpOutGetNexts */
- case 27: /* snmpOutSetRequests */
- case 28: /* snmpOutGetResponses */
- case 29: /* snmpOutTraps */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_ONLY;
- od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER);
- od->v_len = sizeof(u32_t);
- break;
- case 30: /* snmpEnableAuthenTraps */
- od->instance = MIB_OBJECT_SCALAR;
- od->access = MIB_OBJECT_READ_WRITE;
- od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG);
- od->v_len = sizeof(s32_t);
- break;
- default:
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no such object\n"));
- od->instance = MIB_OBJECT_NONE;
- break;
- };
- }
- else
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no scalar\n"));
- od->instance = MIB_OBJECT_NONE;
- }
-}
-
-static void
-snmp_get_value(struct obj_def *od, u16_t len, void *value)
-{
- u32_t *uint_ptr = value;
- u8_t id;
-
- if (len){}
- id = od->id_inst_ptr[0];
- switch (id)
- {
- case 1: /* snmpInPkts */
- *uint_ptr = snmpinpkts;
- break;
- case 2: /* snmpOutPkts */
- *uint_ptr = snmpoutpkts;
- break;
- case 3: /* snmpInBadVersions */
- *uint_ptr = snmpinbadversions;
- break;
- case 4: /* snmpInBadCommunityNames */
- *uint_ptr = snmpinbadcommunitynames;
- break;
- case 5: /* snmpInBadCommunityUses */
- *uint_ptr = snmpinbadcommunityuses;
- break;
- case 6: /* snmpInASNParseErrs */
- *uint_ptr = snmpinasnparseerrs;
- break;
- case 8: /* snmpInTooBigs */
- *uint_ptr = snmpintoobigs;
- break;
- case 9: /* snmpInNoSuchNames */
- *uint_ptr = snmpinnosuchnames;
- break;
- case 10: /* snmpInBadValues */
- *uint_ptr = snmpinbadvalues;
- break;
- case 11: /* snmpInReadOnlys */
- *uint_ptr = snmpinreadonlys;
- break;
- case 12: /* snmpInGenErrs */
- *uint_ptr = snmpingenerrs;
- break;
- case 13: /* snmpInTotalReqVars */
- *uint_ptr = snmpintotalreqvars;
- break;
- case 14: /* snmpInTotalSetVars */
- *uint_ptr = snmpintotalsetvars;
- break;
- case 15: /* snmpInGetRequests */
- *uint_ptr = snmpingetrequests;
- break;
- case 16: /* snmpInGetNexts */
- *uint_ptr = snmpingetnexts;
- break;
- case 17: /* snmpInSetRequests */
- *uint_ptr = snmpinsetrequests;
- break;
- case 18: /* snmpInGetResponses */
- *uint_ptr = snmpingetresponses;
- break;
- case 19: /* snmpInTraps */
- *uint_ptr = snmpintraps;
- break;
- case 20: /* snmpOutTooBigs */
- *uint_ptr = snmpouttoobigs;
- break;
- case 21: /* snmpOutNoSuchNames */
- *uint_ptr = snmpoutnosuchnames;
- break;
- case 22: /* snmpOutBadValues */
- *uint_ptr = snmpoutbadvalues;
- break;
- case 24: /* snmpOutGenErrs */
- *uint_ptr = snmpoutgenerrs;
- break;
- case 25: /* snmpOutGetRequests */
- *uint_ptr = snmpoutgetrequests;
- break;
- case 26: /* snmpOutGetNexts */
- *uint_ptr = snmpoutgetnexts;
- break;
- case 27: /* snmpOutSetRequests */
- *uint_ptr = snmpoutsetrequests;
- break;
- case 28: /* snmpOutGetResponses */
- *uint_ptr = snmpoutgetresponses;
- break;
- case 29: /* snmpOutTraps */
- *uint_ptr = snmpouttraps;
- break;
- case 30: /* snmpEnableAuthenTraps */
- *uint_ptr = *snmpenableauthentraps_ptr;
- break;
- };
-}
-
-/**
- * Test snmp object value before setting.
- *
- * @param od is the object definition
- * @param len return value space (in bytes)
- * @param value points to (varbind) space to copy value from.
- */
-static u8_t
-snmp_set_test(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id, set_ok;
-
- if (len) {}
- set_ok = 0;
- id = od->id_inst_ptr[0];
- if (id == 30)
- {
- /* snmpEnableAuthenTraps */
- s32_t *sint_ptr = value;
-
- if (snmpenableauthentraps_ptr != &snmpenableauthentraps_default)
- {
- /* we should have writable non-volatile mem here */
- if ((*sint_ptr == 1) || (*sint_ptr == 2))
- {
- set_ok = 1;
- }
- }
- else
- {
- /* const or hardwired value */
- if (*sint_ptr == snmpenableauthentraps_default)
- {
- set_ok = 1;
- }
- }
- }
- return set_ok;
-}
-
-static void
-snmp_set_value(struct obj_def *od, u16_t len, void *value)
-{
- u8_t id;
-
- if (len) {}
- id = od->id_inst_ptr[0];
- if (id == 30)
- {
- /* snmpEnableAuthenTraps */
- s32_t *sint_ptr = value;
- *snmpenableauthentraps_ptr = *sint_ptr;
- }
-}
-
-#endif /* LWIP_SNMP */
diff --git a/src/VBox/Devices/Network/lwip/src/core/snmp/mib_structs.c b/src/VBox/Devices/Network/lwip/src/core/snmp/mib_structs.c
deleted file mode 100644
index e68636a..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/snmp/mib_structs.c
+++ /dev/null
@@ -1,1185 +0,0 @@
-/**
- * @file
- * MIB tree access/construction functions.
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_SNMP
-#include "lwip/snmp_structs.h"
-#include "lwip/mem.h"
-
-
-
-/** .iso.org.dod.internet address prefix, @see snmp_iso_*() */
-const s32_t prefix[4] = {1, 3, 6, 1};
-
-#define NODE_STACK_SIZE (LWIP_SNMP_OBJ_ID_LEN)
-/** node stack entry (old news?) */
-struct nse
-{
- /** right child */
- struct mib_node* r_ptr;
- /** right child identifier */
- s32_t r_id;
- /** right child next level */
- u8_t r_nl;
-};
-static u8_t node_stack_cnt = 0;
-static struct nse node_stack[NODE_STACK_SIZE];
-
-/**
- * Pushes nse struct onto stack.
- */
-static void
-push_node(struct nse* node)
-{
- LWIP_ASSERT("node_stack_cnt < NODE_STACK_SIZE",node_stack_cnt < NODE_STACK_SIZE);
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("push_node() node=%p id=%"S32_F"\n",(void*)(node->r_ptr),node->r_id));
- if (node_stack_cnt < NODE_STACK_SIZE)
- {
- node_stack[node_stack_cnt] = *node;
- node_stack_cnt++;
- }
-}
-
-/**
- * Pops nse struct from stack.
- */
-static void
-pop_node(struct nse* node)
-{
- if (node_stack_cnt > 0)
- {
- node_stack_cnt--;
- *node = node_stack[node_stack_cnt];
- }
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("pop_node() node=%p id=%"S32_F"\n",(void *)(node->r_ptr),node->r_id));
-}
-
-/**
- * Conversion from ifIndex to lwIP netif
- * @param ifindex is a s32_t object sub-identifier
- * @param netif points to returned netif struct pointer
- */
-void
-snmp_ifindextonetif(s32_t ifindex, struct netif **netif)
-{
- struct netif *nif = netif_list;
- u16_t i, ifidx;
-
- ifidx = ifindex - 1;
- i = 0;
- while ((nif != NULL) && (i < ifidx))
- {
- nif = nif->next;
- i++;
- }
- *netif = nif;
-}
-
-/**
- * Conversion from lwIP netif to ifIndex
- * @param netif points to a netif struct
- * @param ifindex points to s32_t object sub-identifier
- */
-void
-snmp_netiftoifindex(struct netif *netif, s32_t *ifidx)
-{
- struct netif *nif = netif_list;
- u16_t i;
-
- i = 0;
- while (nif != netif)
- {
- nif = nif->next;
- i++;
- }
- *ifidx = i+1;
-}
-
-/**
- * Conversion from oid to lwIP ip_addr
- * @param ident points to s32_t ident[4] input
- * @param ip points to output struct
- */
-void
-snmp_oidtoip(s32_t *ident, struct ip_addr *ip)
-{
- u32_t ipa;
-
- ipa = ident[0];
- ipa <<= 8;
- ipa |= ident[1];
- ipa <<= 8;
- ipa |= ident[2];
- ipa <<= 8;
- ipa |= ident[3];
- ip->addr = ipa;
-}
-
-/**
- * Conversion from lwIP ip_addr to oid
- * @param ip points to input struct
- * @param ident points to s32_t ident[4] output
- */
-void
-snmp_iptooid(struct ip_addr *ip, s32_t *ident)
-{
- u32_t ipa;
-
- ipa = ip->addr;
- ident[0] = (ipa >> 24) & 0xff;
- ident[1] = (ipa >> 16) & 0xff;
- ident[2] = (ipa >> 8) & 0xff;
- ident[3] = ipa & 0xff;
-}
-
-struct mib_list_node *
-snmp_mib_ln_alloc(s32_t id)
-{
- struct mib_list_node *ln;
-
- ln = (struct mib_list_node *)mem_malloc(sizeof(struct mib_list_node));
- if (ln != NULL)
- {
- ln->prev = NULL;
- ln->next = NULL;
- ln->objid = id;
- ln->nptr = NULL;
- }
- return ln;
-}
-
-void
-snmp_mib_ln_free(struct mib_list_node *ln)
-{
- mem_free(ln);
-}
-
-struct mib_list_rootnode *
-snmp_mib_lrn_alloc(void)
-{
- struct mib_list_rootnode *lrn;
-
- lrn = (struct mib_list_rootnode*)mem_malloc(sizeof(struct mib_list_rootnode));
- if (lrn != NULL)
- {
- lrn->get_object_def = noleafs_get_object_def;
- lrn->get_value = noleafs_get_value;
- lrn->set_test = noleafs_set_test;
- lrn->set_value = noleafs_set_value;
- lrn->node_type = MIB_NODE_LR;
- lrn->maxlength = 0;
- lrn->head = NULL;
- lrn->tail = NULL;
- lrn->count = 0;
- }
- return lrn;
-}
-
-void
-snmp_mib_lrn_free(struct mib_list_rootnode *lrn)
-{
- mem_free(lrn);
-}
-
-/**
- * Inserts node in idx list in a sorted
- * (ascending order) fashion and
- * allocates the node if needed.
- *
- * @param rn points to the root node
- * @param objid is the object sub identifier
- * @param insn points to a pointer to the inserted node
- * used for constructing the tree.
- * @return -1 if failed, 1 if inserted, 2 if present.
- */
-s8_t
-snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn)
-{
- struct mib_list_node *nn;
- s8_t insert;
-
- LWIP_ASSERT("rn != NULL",rn != NULL);
-
- /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */
- insert = 0;
- if (rn->head == NULL)
- {
- /* empty list, add first node */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc empty list objid==%"S32_F"\n",objid));
- nn = snmp_mib_ln_alloc(objid);
- if (nn != NULL)
- {
- rn->head = nn;
- rn->tail = nn;
- *insn = nn;
- insert = 1;
- }
- else
- {
- insert = -1;
- }
- }
- else
- {
- struct mib_list_node *n;
- /* at least one node is present */
- n = rn->head;
- while ((n != NULL) && (insert == 0))
- {
- if (n->objid == objid)
- {
- /* node is already there */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("node already there objid==%"S32_F"\n",objid));
- *insn = n;
- insert = 2;
- }
- else if (n->objid < objid)
- {
- if (n->next == NULL)
- {
- /* alloc and insert at the tail */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins tail objid==%"S32_F"\n",objid));
- nn = snmp_mib_ln_alloc(objid);
- if (nn != NULL)
- {
- nn->next = NULL;
- nn->prev = n;
- n->next = nn;
- rn->tail = nn;
- *insn = nn;
- insert = 1;
- }
- else
- {
- /* insertion failure */
- insert = -1;
- }
- }
- else
- {
- /* there's more to explore: traverse list */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("traverse list\n"));
- n = n->next;
- }
- }
- else
- {
- /* n->objid > objid */
- /* alloc and insert between n->prev and n */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid));
- nn = snmp_mib_ln_alloc(objid);
- if (nn != NULL)
- {
- if (n->prev == NULL)
- {
- /* insert at the head */
- nn->next = n;
- nn->prev = NULL;
- rn->head = nn;
- n->prev = nn;
- }
- else
- {
- /* insert in the middle */
- nn->next = n;
- nn->prev = n->prev;
- n->prev->next = nn;
- n->prev = nn;
- }
- *insn = nn;
- insert = 1;
- }
- else
- {
- /* insertion failure */
- insert = -1;
- }
- }
- }
- }
- if (insert == 1)
- {
- rn->count += 1;
- }
- LWIP_ASSERT("insert != 0",insert != 0);
- return insert;
-}
-
-/**
- * Finds node in idx list and returns deletion mark.
- *
- * @param rn points to the root node
- * @param objid is the object sub identifier
- * @param fn returns pointer to found node
- * @return 0 if not found, 1 if deletable,
- * 2 can't delete (2 or more children), 3 not a list_node
- */
-s8_t
-snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn)
-{
- s8_t fc;
- struct mib_list_node *n;
-
- LWIP_ASSERT("rn != NULL",rn != NULL);
- n = rn->head;
- while ((n != NULL) && (n->objid != objid))
- {
- n = n->next;
- }
- if (n == NULL)
- {
- fc = 0;
- }
- else if (n->nptr == NULL)
- {
- /* leaf, can delete node */
- fc = 1;
- }
- else
- {
- struct mib_list_rootnode *rn;
-
- if (n->nptr->node_type == MIB_NODE_LR)
- {
- rn = (struct mib_list_rootnode *)n->nptr;
- if (rn->count > 1)
- {
- /* can't delete node */
- fc = 2;
- }
- else
- {
- /* count <= 1, can delete node */
- fc = 1;
- }
- }
- else
- {
- /* other node type */
- fc = 3;
- }
- }
- *fn = n;
- return fc;
-}
-
-/**
- * Removes node from idx list
- * if it has a single child left.
- *
- * @param rn points to the root node
- * @param n points to the node to delete
- * @return the nptr to be freed by caller
- */
-struct mib_list_rootnode *
-snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n)
-{
- struct mib_list_rootnode *next;
-
- LWIP_ASSERT("rn != NULL",rn != NULL);
- LWIP_ASSERT("n != NULL",n != NULL);
-
- /* caller must remove this sub-tree */
- next = (struct mib_list_rootnode*)(n->nptr);
- rn->count -= 1;
-
- if (n == rn->head)
- {
- rn->head = n->next;
- if (n->next != NULL)
- {
- /* not last node, new list begin */
- n->next->prev = NULL;
- }
- }
- else if (n == rn->tail)
- {
- rn->tail = n->prev;
- if (n->prev != NULL)
- {
- /* not last node, new list end */
- n->prev->next = NULL;
- }
- }
- else
- {
- /* node must be in the middle */
- n->prev->next = n->next;
- n->next->prev = n->prev;
- }
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("free list objid==%"S32_F"\n",n->objid));
- snmp_mib_ln_free(n);
- if (rn->count == 0)
- {
- rn->head = NULL;
- rn->tail = NULL;
- }
- return next;
-}
-
-
-
-/**
- * Searches tree for the supplied (scalar?) object identifier.
- *
- * @param node points to the root of the tree ('.internet')
- * @param ident_len the length of the supplied object identifier
- * @param ident points to the array of sub identifiers
- * @param np points to the found object instance (rerurn)
- * @return pointer to the requested parent (!) node if success, NULL otherwise
- */
-struct mib_node *
-snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np)
-{
- u8_t node_type, ext_level;
-
- ext_level = 0;
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident));
- while (node != NULL)
- {
- node_type = node->node_type;
- if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
- {
- struct mib_array_node *an;
- u16_t i;
-
- if (ident_len > 0)
- {
- /* array node (internal ROM or RAM, fixed length) */
- an = (struct mib_array_node *)node;
- i = 0;
- while ((i < an->maxlength) && (an->objid[i] != *ident))
- {
- i++;
- }
- if (i < an->maxlength)
- {
- /* found it, if available proceed to child, otherwise inspect leaf */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
- if (an->nptr[i] == NULL)
- {
- /* a scalar leaf OR table,
- inspect remaining instance number / table index */
- np->ident_len = ident_len;
- np->ident = ident;
- return (struct mib_node*)an;
- }
- else
- {
- /* follow next child pointer */
- ident++;
- ident_len--;
- node = an->nptr[i];
- }
- }
- else
- {
- /* search failed, identifier mismatch (nosuchname) */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed *ident==%"S32_F"\n",*ident));
- return NULL;
- }
- }
- else
- {
- /* search failed, short object identifier (nosuchname) */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n"));
- return NULL;
- }
- }
- else if(node_type == MIB_NODE_LR)
- {
- struct mib_list_rootnode *lrn;
- struct mib_list_node *ln;
-
- if (ident_len > 0)
- {
- /* list root node (internal 'RAM', variable length) */
- lrn = (struct mib_list_rootnode *)node;
- ln = lrn->head;
- /* iterate over list, head to tail */
- while ((ln != NULL) && (ln->objid != *ident))
- {
- ln = ln->next;
- }
- if (ln != NULL)
- {
- /* found it, proceed to child */;
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
- if (ln->nptr == NULL)
- {
- np->ident_len = ident_len;
- np->ident = ident;
- return (struct mib_node*)lrn;
- }
- else
- {
- /* follow next child pointer */
- ident_len--;
- ident++;
- node = ln->nptr;
- }
- }
- else
- {
- /* search failed */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed *ident==%"S32_F"\n",*ident));
- return NULL;
- }
- }
- else
- {
- /* search failed, short object identifier (nosuchname) */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed, short object identifier\n"));
- return NULL;
- }
- }
- else if(node_type == MIB_NODE_EX)
- {
- struct mib_external_node *en;
- u16_t i, len;
-
- if (ident_len > 0)
- {
- /* external node (addressing and access via functions) */
- en = (struct mib_external_node *)node;
-
- i = 0;
- len = en->level_length(en->addr_inf,ext_level);
- while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0))
- {
- i++;
- }
- if (i < len)
- {
- s32_t debug_id;
-
- en->get_objid(en->addr_inf,ext_level,i,&debug_id);
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid==%"S32_F" *ident==%"S32_F"\n",debug_id,*ident));
- if ((ext_level + 1) == en->tree_levels)
- {
- np->ident_len = ident_len;
- np->ident = ident;
- return (struct mib_node*)en;
- }
- else
- {
- /* found it, proceed to child */
- ident_len--;
- ident++;
- ext_level++;
- }
- }
- else
- {
- /* search failed */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed *ident==%"S32_F"\n",*ident));
- return NULL;
- }
- }
- else
- {
- /* search failed, short object identifier (nosuchname) */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed, short object identifier\n"));
- return NULL;
- }
- }
- else if (node_type == MIB_NODE_SC)
- {
- mib_scalar_node *sn;
-
- sn = (mib_scalar_node *)node;
- if ((ident_len == 1) && (*ident == 0))
- {
- np->ident_len = ident_len;
- np->ident = ident;
- return (struct mib_node*)sn;
- }
- else
- {
- /* search failed, short object identifier (nosuchname) */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, invalid object identifier length\n"));
- return NULL;
- }
- }
- else
- {
- /* unknown node_type */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node_type %"U16_F" unkown\n",(u16_t)node_type));
- return NULL;
- }
- }
- /* done, found nothing */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p\n",(void*)node));
- return NULL;
-}
-
-/**
- * Test table for presence of at least one table entry.
- */
-static u8_t
-empty_table(struct mib_node *node)
-{
- u8_t node_type;
- u8_t empty = 0;
-
- if (node != NULL)
- {
- node_type = node->node_type;
- if (node_type == MIB_NODE_LR)
- {
- struct mib_list_rootnode *lrn;
- lrn = (struct mib_list_rootnode *)node;
- if ((lrn->count == 0) || (lrn->head == NULL))
- {
- empty = 1;
- }
- }
- else if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
- {
- struct mib_array_node *an;
- an = (struct mib_array_node *)node;
- if ((an->maxlength == 0) || (an->nptr == NULL))
- {
- empty = 1;
- }
- }
- else if (node_type == MIB_NODE_EX)
- {
- struct mib_external_node *en;
- en = (struct mib_external_node *)node;
- if (en->tree_levels == 0)
- {
- empty = 1;
- }
- }
- }
- return empty;
-}
-
-/**
- * Tree expansion.
- */
-struct mib_node *
-snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
-{
- u8_t node_type, ext_level, climb_tree;
-
- ext_level = 0;
- /* reset node stack */
- node_stack_cnt = 0;
- while (node != NULL)
- {
- climb_tree = 0;
- node_type = node->node_type;
- if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA))
- {
- struct mib_array_node *an;
- u16_t i;
-
- /* array node (internal ROM or RAM, fixed length) */
- an = (struct mib_array_node *)node;
- if (ident_len > 0)
- {
- i = 0;
- while ((i < an->maxlength) && (an->objid[i] < *ident))
- {
- i++;
- }
- if (i < an->maxlength)
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident));
- /* add identifier to oidret */
- oidret->id[oidret->len] = an->objid[i];
- (oidret->len)++;
-
- if (an->nptr[i] == NULL)
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
- /* leaf node (e.g. in a fixed size table) */
- if (an->objid[i] > *ident)
- {
- return (struct mib_node*)an;
- }
- else if ((i + 1) < an->maxlength)
- {
- /* an->objid[i] == *ident */
- (oidret->len)--;
- oidret->id[oidret->len] = an->objid[i + 1];
- (oidret->len)++;
- return (struct mib_node*)an;
- }
- else
- {
- /* (i + 1) == an->maxlength */
- (oidret->len)--;
- climb_tree = 1;
- }
- }
- else
- {
- u8_t j;
- struct nse cur_node;
-
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
- /* non-leaf, store right child ptr and id */
- j = i + 1;
- while ((j < an->maxlength) && (empty_table(an->nptr[j])))
- {
- j++;
- }
- if (j < an->maxlength)
- {
- cur_node.r_ptr = an->nptr[j];
- cur_node.r_id = an->objid[j];
- cur_node.r_nl = 0;
- }
- else
- {
- cur_node.r_ptr = NULL;
- }
- push_node(&cur_node);
- if (an->objid[i] == *ident)
- {
- ident_len--;
- ident++;
- }
- else
- {
- /* an->objid[i] < *ident */
- ident_len = 0;
- }
- /* follow next child pointer */
- node = an->nptr[i];
- }
- }
- else
- {
- /* i == an->maxlength */
- climb_tree = 1;
- }
- }
- else
- {
- u8_t j;
- /* ident_len == 0, complete with leftmost '.thing' */
- j = 0;
- while ((j < an->maxlength) && empty_table(an->nptr[j]))
- {
- j++;
- }
- if (j < an->maxlength)
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j]));
- oidret->id[oidret->len] = an->objid[j];
- (oidret->len)++;
- if (an->nptr[j] == NULL)
- {
- /* leaf node */
- return (struct mib_node*)an;
- }
- else
- {
- /* no leaf, continue */
- node = an->nptr[j];
- }
- }
- else
- {
- /* j == an->maxlength */
- climb_tree = 1;
- }
- }
- }
- else if(node_type == MIB_NODE_LR)
- {
- struct mib_list_rootnode *lrn;
- struct mib_list_node *ln;
-
- /* list root node (internal 'RAM', variable length) */
- lrn = (struct mib_list_rootnode *)node;
- if (ident_len > 0)
- {
- ln = lrn->head;
- /* iterate over list, head to tail */
- while ((ln != NULL) && (ln->objid < *ident))
- {
- ln = ln->next;
- }
- if (ln != NULL)
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident));
- oidret->id[oidret->len] = ln->objid;
- (oidret->len)++;
- if (ln->nptr == NULL)
- {
- /* leaf node */
- if (ln->objid > *ident)
- {
- return (struct mib_node*)lrn;
- }
- else if (ln->next != NULL)
- {
- /* ln->objid == *ident */
- (oidret->len)--;
- oidret->id[oidret->len] = ln->next->objid;
- (oidret->len)++;
- return (struct mib_node*)lrn;
- }
- else
- {
- /* ln->next == NULL */
- (oidret->len)--;
- climb_tree = 1;
- }
- }
- else
- {
- struct mib_list_node *jn;
- struct nse cur_node;
-
- /* non-leaf, store right child ptr and id */
- jn = ln->next;
- while ((jn != NULL) && empty_table(jn->nptr))
- {
- jn = jn->next;
- }
- if (jn != NULL)
- {
- cur_node.r_ptr = jn->nptr;
- cur_node.r_id = jn->objid;
- cur_node.r_nl = 0;
- }
- else
- {
- cur_node.r_ptr = NULL;
- }
- push_node(&cur_node);
- if (ln->objid == *ident)
- {
- ident_len--;
- ident++;
- }
- else
- {
- /* ln->objid < *ident */
- ident_len = 0;
- }
- /* follow next child pointer */
- node = ln->nptr;
- }
-
- }
- else
- {
- /* ln == NULL */
- climb_tree = 1;
- }
- }
- else
- {
- struct mib_list_node *jn;
- /* ident_len == 0, complete with leftmost '.thing' */
- jn = lrn->head;
- while ((jn != NULL) && empty_table(jn->nptr))
- {
- jn = jn->next;
- }
- if (jn != NULL)
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid));
- oidret->id[oidret->len] = jn->objid;
- (oidret->len)++;
- if (jn->nptr == NULL)
- {
- /* leaf node */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("jn->nptr == NULL\n"));
- return (struct mib_node*)lrn;
- }
- else
- {
- /* no leaf, continue */
- node = jn->nptr;
- }
- }
- else
- {
- /* jn == NULL */
- climb_tree = 1;
- }
- }
- }
- else if(node_type == MIB_NODE_EX)
- {
- struct mib_external_node *en;
- s32_t ex_id;
-
- /* external node (addressing and access via functions) */
- en = (struct mib_external_node *)node;
- if (ident_len > 0)
- {
- u16_t i, len;
-
- i = 0;
- len = en->level_length(en->addr_inf,ext_level);
- while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0))
- {
- i++;
- }
- if (i < len)
- {
- /* add identifier to oidret */
- en->get_objid(en->addr_inf,ext_level,i,&ex_id);
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident));
- oidret->id[oidret->len] = ex_id;
- (oidret->len)++;
-
- if ((ext_level + 1) == en->tree_levels)
- {
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n"));
- /* leaf node */
- if (ex_id > *ident)
- {
- return (struct mib_node*)en;
- }
- else if ((i + 1) < len)
- {
- /* ex_id == *ident */
- en->get_objid(en->addr_inf,ext_level,i + 1,&ex_id);
- (oidret->len)--;
- oidret->id[oidret->len] = ex_id;
- (oidret->len)++;
- return (struct mib_node*)en;
- }
- else
- {
- /* (i + 1) == len */
- (oidret->len)--;
- climb_tree = 1;
- }
- }
- else
- {
- u8_t j;
- struct nse cur_node;
-
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n"));
- /* non-leaf, store right child ptr and id */
- j = i + 1;
- if (j < len)
- {
- /* right node is the current external node */
- cur_node.r_ptr = node;
- en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id);
- cur_node.r_nl = ext_level + 1;
- }
- else
- {
- cur_node.r_ptr = NULL;
- }
- push_node(&cur_node);
- if (en->ident_cmp(en->addr_inf,ext_level,i,*ident) == 0)
- {
- ident_len--;
- ident++;
- }
- else
- {
- /* external id < *ident */
- ident_len = 0;
- }
- /* proceed to child */
- ext_level++;
- }
- }
- else
- {
- /* i == len (en->level_len()) */
- climb_tree = 1;
- }
- }
- else
- {
- /* ident_len == 0, complete with leftmost '.thing' */
- en->get_objid(en->addr_inf,ext_level,0,&ex_id);
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id));
- oidret->id[oidret->len] = ex_id;
- (oidret->len)++;
- if ((ext_level + 1) == en->tree_levels)
- {
- /* leaf node */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("(ext_level + 1) == en->tree_levels\n"));
- return (struct mib_node*)en;
- }
- else
- {
- /* no leaf, proceed to child */
- ext_level++;
- }
- }
- }
- else if(node_type == MIB_NODE_SC)
- {
- mib_scalar_node *sn;
-
- /* scalar node */
- sn = (mib_scalar_node *)node;
- if (ident_len > 0)
- {
- /* at .0 */
- climb_tree = 1;
- }
- else
- {
- /* ident_len == 0, complete object identifier */
- oidret->id[oidret->len] = 0;
- (oidret->len)++;
- /* leaf node */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("completed scalar leaf\n"));
- return (struct mib_node*)sn;
- }
- }
- else
- {
- /* unknown/unhandled node_type */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown\n",(u16_t)node_type));
- return NULL;
- }
-
- if (climb_tree)
- {
- struct nse child;
-
- /* find right child ptr */
- child.r_ptr = NULL;
- child.r_id = 0;
- child.r_nl = 0;
- while ((node_stack_cnt > 0) && (child.r_ptr == NULL))
- {
- pop_node(&child);
- /* trim returned oid */
- (oidret->len)--;
- }
- if (child.r_ptr != NULL)
- {
- /* incoming ident is useless beyond this point */
- ident_len = 0;
- oidret->id[oidret->len] = child.r_id;
- oidret->len++;
- node = child.r_ptr;
- ext_level = child.r_nl;
- }
- else
- {
- /* tree ends here ... */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed, tree ends here\n"));
- return NULL;
- }
- }
- }
- /* done, found nothing */
- LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p\n",(void*)node));
- return NULL;
-}
-
-/**
- * Test object identifier for the iso.org.dod.internet prefix.
- *
- * @param ident_len the length of the supplied object identifier
- * @param ident points to the array of sub identifiers
- * @return 1 if it matches, 0 otherwise
- */
-u8_t
-snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident)
-{
- if ((ident_len > 3) &&
- (ident[0] == 1) && (ident[1] == 3) &&
- (ident[2] == 6) && (ident[3] == 1))
- {
- return 1;
- }
- else
- {
- return 0;
- }
-}
-
-/**
- * Expands object identifier to the iso.org.dod.internet
- * prefix for use in getnext operation.
- *
- * @param ident_len the length of the supplied object identifier
- * @param ident points to the array of sub identifiers
- * @param oidret points to returned expanded object identifier
- * @return 1 if it matches, 0 otherwise
- *
- * @note ident_len 0 is allowed, expanding to the first known object id!!
- */
-u8_t
-snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret)
-{
- const s32_t *prefix_ptr;
- s32_t *ret_ptr;
- u8_t i;
-
- i = 0;
- prefix_ptr = &prefix[0];
- ret_ptr = &oidret->id[0];
- ident_len = ((ident_len < 4)?ident_len:4);
- while ((i < ident_len) && ((*ident) <= (*prefix_ptr)))
- {
- *ret_ptr++ = *prefix_ptr++;
- ident++;
- i++;
- }
- if (i == ident_len)
- {
- /* match, complete missing bits */
- while (i < 4)
- {
- *ret_ptr++ = *prefix_ptr++;
- i++;
- }
- oidret->len = i;
- return 1;
- }
- else
- {
- /* i != ident_len */
- return 0;
- }
-}
-
-#endif /* LWIP_SNMP */
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/snmp/msg_in.c b/src/VBox/Devices/Network/lwip/src/core/snmp/msg_in.c
deleted file mode 100644
index d071850..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/snmp/msg_in.c
+++ /dev/null
@@ -1,1458 +0,0 @@
-/**
- * @file
- * SNMP input message processing (RFC1157).
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_SNMP
-#include <string.h>
-#include "arch/cc.h"
-#include "lwip/ip_addr.h"
-#include "lwip/mem.h"
-#include "lwip/udp.h"
-#include "lwip/stats.h"
-
-#include "lwip/snmp.h"
-#include "lwip/snmp_asn1.h"
-#include "lwip/snmp_msg.h"
-#include "lwip/snmp_structs.h"
-
-
-/* public (non-static) constants */
-/** SNMP v1 == 0 */
-const s32_t snmp_version = 0;
-/** default SNMP community string */
-const char snmp_publiccommunity[7] = "public";
-
-/* statically allocated buffers for SNMP_CONCURRENT_REQUESTS */
-#if (SNMP_CONCURRENT_REQUESTS == 0)
-#error "need at least one snmp_msg_pstat"
-#endif
-struct snmp_msg_pstat msg_input_list[SNMP_CONCURRENT_REQUESTS];
-/* UDP Protocol Control Block */
-struct udp_pcb *snmp1_pcb = NULL;
-
-static void snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port);
-static err_t snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat);
-static err_t snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat);
-
-
-/**
- * Starts SNMP Agent.
- * Allocates UDP pcb and binds it to IP_ADDR_ANY port 161.
- */
-void
-snmp_init(void)
-{
- struct snmp_msg_pstat *msg_ps;
- u8_t i;
-
- snmp1_pcb = udp_new();
- if (snmp1_pcb != NULL)
- {
- udp_recv(snmp1_pcb, snmp_recv, (void *)SNMP_IN_PORT);
- udp_bind(snmp1_pcb, IP_ADDR_ANY, SNMP_IN_PORT);
- }
- msg_ps = &msg_input_list[0];
- for (i=0; i<SNMP_CONCURRENT_REQUESTS; i++)
- {
- msg_ps->state = SNMP_MSG_EMPTY;
- msg_ps->error_index = 0;
- msg_ps->error_status = SNMP_ES_NOERROR;
- msg_ps++;
- }
- trap_msg.pcb = snmp1_pcb;
- /* The coldstart trap will only be output
- if our outgoing interface is up & configured */
- snmp_coldstart_trap();
-}
-
-static void
-snmp_error_response(struct snmp_msg_pstat *msg_ps, u8_t error)
-{
- snmp_varbind_list_free(&msg_ps->outvb);
- msg_ps->outvb = msg_ps->invb;
- msg_ps->invb.head = NULL;
- msg_ps->invb.tail = NULL;
- msg_ps->invb.count = 0;
- msg_ps->error_status = error;
- msg_ps->error_index = 1 + msg_ps->vb_idx;
- snmp_send_response(msg_ps);
- snmp_varbind_list_free(&msg_ps->outvb);
- msg_ps->state = SNMP_MSG_EMPTY;
-}
-
-static void
-snmp_ok_response(struct snmp_msg_pstat *msg_ps)
-{
- err_t err_ret;
-
- err_ret = snmp_send_response(msg_ps);
- if (err_ret == ERR_MEM)
- {
- /* serious memory problem, can't return tooBig */
-#if LWIP_STATS
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event pbufs.used = %"U16_F"\n",lwip_stats.pbuf.used));
-#endif
- }
- else
- {
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event = %"S32_F"\n",msg_ps->error_status));
- }
- /* free varbinds (if available) */
- snmp_varbind_list_free(&msg_ps->invb);
- snmp_varbind_list_free(&msg_ps->outvb);
- msg_ps->state = SNMP_MSG_EMPTY;
-}
-
-/**
- * Service an internal or external event for SNMP GET.
- *
- * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
- * @param msg_ps points to the assosicated message process state
- */
-static void
-snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
-{
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_get_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
-
- if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
- {
- struct mib_external_node *en;
- struct snmp_name_ptr np;
-
- /* get_object_def() answer*/
- en = msg_ps->ext_mib_node;
- np = msg_ps->ext_name_ptr;
-
- /* translate answer into a known lifeform */
- en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
- if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
- {
- msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
- en->get_value_q(request_id, &msg_ps->ext_object_def);
- }
- else
- {
- en->get_object_def_pc(request_id, np.ident_len, np.ident);
- /* search failed, object id points to unknown object (nosuchname) */
- snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
- }
- }
- else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
- {
- struct mib_external_node *en;
- struct snmp_varbind *vb;
-
- /* get_value() answer */
- en = msg_ps->ext_mib_node;
-
- /* allocate output varbind */
- vb = (struct snmp_varbind *)mem_malloc(sizeof(struct snmp_varbind));
- LWIP_ASSERT("vb != NULL",vb != NULL);
- if (vb != NULL)
- {
- vb->next = NULL;
- vb->prev = NULL;
-
- /* move name from invb to outvb */
- vb->ident = msg_ps->vb_ptr->ident;
- vb->ident_len = msg_ps->vb_ptr->ident_len;
- /* ensure this memory is refereced once only */
- msg_ps->vb_ptr->ident = NULL;
- msg_ps->vb_ptr->ident_len = 0;
-
- vb->value_type = msg_ps->ext_object_def.asn_type;
- vb->value_len = msg_ps->ext_object_def.v_len;
- if (vb->value_len > 0)
- {
- vb->value = mem_malloc(vb->value_len);
- LWIP_ASSERT("vb->value != NULL",vb->value != NULL);
- if (vb->value != NULL)
- {
- en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
- snmp_varbind_tail_add(&msg_ps->outvb, vb);
- /* search again (if vb_idx < msg_ps->invb.count) */
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- msg_ps->vb_idx += 1;
- }
- else
- {
- en->get_value_pc(request_id, &msg_ps->ext_object_def);
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n"));
- msg_ps->vb_ptr->ident = vb->ident;
- msg_ps->vb_ptr->ident_len = vb->ident_len;
- mem_free(vb);
- snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
- }
- }
- else
- {
- /* vb->value_len == 0, empty value (e.g. empty string) */
- en->get_value_a(request_id, &msg_ps->ext_object_def, 0, NULL);
- vb->value = NULL;
- snmp_varbind_tail_add(&msg_ps->outvb, vb);
- /* search again (if vb_idx < msg_ps->invb.count) */
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- msg_ps->vb_idx += 1;
- }
- }
- else
- {
- en->get_value_pc(request_id, &msg_ps->ext_object_def);
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n"));
- snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
- }
- }
-
- while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
- (msg_ps->vb_idx < msg_ps->invb.count))
- {
- struct mib_node *mn;
- struct snmp_name_ptr np;
-
- if (msg_ps->vb_idx == 0)
- {
- msg_ps->vb_ptr = msg_ps->invb.head;
- }
- else
- {
- msg_ps->vb_ptr = msg_ps->vb_ptr->next;
- }
- /** test object identifier for .iso.org.dod.internet prefix */
- if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
- {
- mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
- msg_ps->vb_ptr->ident + 4, &np);
- }
- else
- {
- mn = NULL;
- }
- if (mn != NULL)
- {
- if (mn->node_type == MIB_NODE_EX)
- {
- /* external object */
- struct mib_external_node *en = (struct mib_external_node*)mn;
-
- msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
- /* save en && args in msg_ps!! */
- msg_ps->ext_mib_node = en;
- msg_ps->ext_name_ptr = np;
-
- en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
- }
- else
- {
- /* internal object */
- struct obj_def object_def;
-
- msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
- mn->get_object_def(np.ident_len, np.ident, &object_def);
- if (object_def.instance != MIB_OBJECT_NONE)
- {
- mn = mn;
- }
- else
- {
- /* search failed, object id points to unknown object (nosuchname) */
- mn = NULL;
- }
- if (mn != NULL)
- {
- struct snmp_varbind *vb;
-
- msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
- /* allocate output varbind */
- vb = (struct snmp_varbind *)mem_malloc(sizeof(struct snmp_varbind));
- LWIP_ASSERT("vb != NULL",vb != NULL);
- if (vb != NULL)
- {
- vb->next = NULL;
- vb->prev = NULL;
-
- /* move name from invb to outvb */
- vb->ident = msg_ps->vb_ptr->ident;
- vb->ident_len = msg_ps->vb_ptr->ident_len;
- /* ensure this memory is refereced once only */
- msg_ps->vb_ptr->ident = NULL;
- msg_ps->vb_ptr->ident_len = 0;
-
- vb->value_type = object_def.asn_type;
- vb->value_len = object_def.v_len;
- if (vb->value_len > 0)
- {
- vb->value = mem_malloc(vb->value_len);
- LWIP_ASSERT("vb->value != NULL",vb->value != NULL);
- if (vb->value != NULL)
- {
- mn->get_value(&object_def, vb->value_len, vb->value);
- snmp_varbind_tail_add(&msg_ps->outvb, vb);
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- msg_ps->vb_idx += 1;
- }
- else
- {
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate variable space\n"));
- msg_ps->vb_ptr->ident = vb->ident;
- msg_ps->vb_ptr->ident_len = vb->ident_len;
- mem_free(vb);
- snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
- }
- }
- else
- {
- /* vb->value_len == 0, empty value (e.g. empty string) */
- vb->value = NULL;
- snmp_varbind_tail_add(&msg_ps->outvb, vb);
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- msg_ps->vb_idx += 1;
- }
- }
- else
- {
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate outvb space\n"));
- snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
- }
- }
- }
- }
- if (mn == NULL)
- {
- /* mn == NULL, noSuchName */
- snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
- }
- }
- if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
- (msg_ps->vb_idx == msg_ps->invb.count))
- {
- snmp_ok_response(msg_ps);
- }
-}
-
-/**
- * Service an internal or external event for SNMP GETNEXT.
- *
- * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
- * @param msg_ps points to the assosicated message process state
- */
-static void
-snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
-{
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
-
- if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
- {
- struct mib_external_node *en;
-
- /* get_object_def() answer*/
- en = msg_ps->ext_mib_node;
-
- /* translate answer into a known lifeform */
- en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def);
- if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
- {
- msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE;
- en->get_value_q(request_id, &msg_ps->ext_object_def);
- }
- else
- {
- en->get_object_def_pc(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1]);
- /* search failed, object id points to unknown object (nosuchname) */
- snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
- }
- }
- else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE)
- {
- struct mib_external_node *en;
- struct snmp_varbind *vb;
-
- /* get_value() answer */
- en = msg_ps->ext_mib_node;
-
- vb = snmp_varbind_alloc(&msg_ps->ext_oid,
- msg_ps->ext_object_def.asn_type,
- msg_ps->ext_object_def.v_len);
- if (vb != NULL)
- {
- en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value);
- snmp_varbind_tail_add(&msg_ps->outvb, vb);
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- msg_ps->vb_idx += 1;
- }
- else
- {
- en->get_value_pc(request_id, &msg_ps->ext_object_def);
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n"));
- snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
- }
- }
-
- while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
- (msg_ps->vb_idx < msg_ps->invb.count))
- {
- struct mib_node *mn;
- struct snmp_obj_id oid;
-
- if (msg_ps->vb_idx == 0)
- {
- msg_ps->vb_ptr = msg_ps->invb.head;
- }
- else
- {
- msg_ps->vb_ptr = msg_ps->vb_ptr->next;
- }
- if (snmp_iso_prefix_expand(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident, &oid))
- {
- if (msg_ps->vb_ptr->ident_len > 3)
- {
- /* can offset ident_len and ident */
- mn = snmp_expand_tree((struct mib_node*)&internet,
- msg_ps->vb_ptr->ident_len - 4,
- msg_ps->vb_ptr->ident + 4, &oid);
- }
- else
- {
- /* can't offset ident_len -4, ident + 4 */
- mn = snmp_expand_tree((struct mib_node*)&internet, 0, NULL, &oid);
- }
- }
- else
- {
- mn = NULL;
- }
- if (mn != NULL)
- {
- if (mn->node_type == MIB_NODE_EX)
- {
- /* external object */
- struct mib_external_node *en = (struct mib_external_node*)mn;
-
- msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
- /* save en && args in msg_ps!! */
- msg_ps->ext_mib_node = en;
- msg_ps->ext_oid = oid;
-
- en->get_object_def_q(en->addr_inf, request_id, 1, &oid.id[oid.len - 1]);
- }
- else
- {
- /* internal object */
- struct obj_def object_def;
- struct snmp_varbind *vb;
-
- msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
- mn->get_object_def(1, &oid.id[oid.len - 1], &object_def);
-
- vb = snmp_varbind_alloc(&oid, object_def.asn_type, object_def.v_len);
- if (vb != NULL)
- {
- msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE;
- mn->get_value(&object_def, object_def.v_len, vb->value);
- snmp_varbind_tail_add(&msg_ps->outvb, vb);
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- msg_ps->vb_idx += 1;
- }
- else
- {
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv couldn't allocate outvb space\n"));
- snmp_error_response(msg_ps,SNMP_ES_TOOBIG);
- }
- }
- }
- if (mn == NULL)
- {
- /* mn == NULL, noSuchName */
- snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
- }
- }
- if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
- (msg_ps->vb_idx == msg_ps->invb.count))
- {
- snmp_ok_response(msg_ps);
- }
-}
-
-/**
- * Service an internal or external event for SNMP SET.
- *
- * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
- * @param msg_ps points to the assosicated message process state
- */
-static void
-snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps)
-{
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_set_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state));
-
- if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF)
- {
- struct mib_external_node *en;
- struct snmp_name_ptr np;
-
- /* get_object_def() answer*/
- en = msg_ps->ext_mib_node;
- np = msg_ps->ext_name_ptr;
-
- /* translate answer into a known lifeform */
- en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
- if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
- {
- msg_ps->state = SNMP_MSG_EXTERNAL_SET_TEST;
- en->set_test_q(request_id, &msg_ps->ext_object_def);
- }
- else
- {
- en->get_object_def_pc(request_id, np.ident_len, np.ident);
- /* search failed, object id points to unknown object (nosuchname) */
- snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
- }
- }
- else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST)
- {
- struct mib_external_node *en;
- struct snmp_name_ptr np;
-
- /* set_test() answer*/
- en = msg_ps->ext_mib_node;
- np = msg_ps->ext_name_ptr;
-
- if (msg_ps->ext_object_def.access == MIB_OBJECT_READ_WRITE)
- {
- if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) &&
- (en->set_test_a(request_id,&msg_ps->ext_object_def,
- msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
- {
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- msg_ps->vb_idx += 1;
- }
- else
- {
- en->set_test_pc(request_id,&msg_ps->ext_object_def);
- /* bad value */
- snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
- }
- }
- else
- {
- en->set_test_pc(request_id,&msg_ps->ext_object_def);
- /* object not available for set */
- snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
- }
- }
- else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF_S)
- {
- struct mib_external_node *en;
- struct snmp_name_ptr np;
-
- /* get_object_def() answer*/
- en = msg_ps->ext_mib_node;
- np = msg_ps->ext_name_ptr;
-
- /* translate answer into a known lifeform */
- en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def);
- if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE)
- {
- msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE;
- en->set_value_q(request_id, &msg_ps->ext_object_def,
- msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
- }
- else
- {
- en->get_object_def_pc(request_id, np.ident_len, np.ident);
- /* set_value failed, object has disappeared for some odd reason?? */
- snmp_error_response(msg_ps,SNMP_ES_GENERROR);
- }
- }
- else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_VALUE)
- {
- struct mib_external_node *en;
-
- /** set_value_a() @todo: use reply value?? */
- en = msg_ps->ext_mib_node;
- en->set_value_a(request_id, &msg_ps->ext_object_def, 0, NULL);
-
- /** @todo use set_value_pc() if toobig */
- msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
- msg_ps->vb_idx += 1;
- }
-
- /* test all values before setting */
- while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
- (msg_ps->vb_idx < msg_ps->invb.count))
- {
- struct mib_node *mn;
- struct snmp_name_ptr np;
-
- if (msg_ps->vb_idx == 0)
- {
- msg_ps->vb_ptr = msg_ps->invb.head;
- }
- else
- {
- msg_ps->vb_ptr = msg_ps->vb_ptr->next;
- }
- /** test object identifier for .iso.org.dod.internet prefix */
- if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident))
- {
- mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
- msg_ps->vb_ptr->ident + 4, &np);
- }
- else
- {
- mn = NULL;
- }
- if (mn != NULL)
- {
- if (mn->node_type == MIB_NODE_EX)
- {
- /* external object */
- struct mib_external_node *en = (struct mib_external_node*)mn;
-
- msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF;
- /* save en && args in msg_ps!! */
- msg_ps->ext_mib_node = en;
- msg_ps->ext_name_ptr = np;
-
- en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
- }
- else
- {
- /* internal object */
- struct obj_def object_def;
-
- msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF;
- mn->get_object_def(np.ident_len, np.ident, &object_def);
- if (object_def.instance != MIB_OBJECT_NONE)
- {
- mn = mn;
- }
- else
- {
- /* search failed, object id points to unknown object (nosuchname) */
- mn = NULL;
- }
- if (mn != NULL)
- {
- msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST;
-
- if (object_def.access == MIB_OBJECT_READ_WRITE)
- {
- if ((object_def.asn_type == msg_ps->vb_ptr->value_type) &&
- (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0))
- {
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- msg_ps->vb_idx += 1;
- }
- else
- {
- /* bad value */
- snmp_error_response(msg_ps,SNMP_ES_BADVALUE);
- }
- }
- else
- {
- /* object not available for set */
- snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
- }
- }
- }
- }
- if (mn == NULL)
- {
- /* mn == NULL, noSuchName */
- snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME);
- }
- }
-
- if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) &&
- (msg_ps->vb_idx == msg_ps->invb.count))
- {
- msg_ps->vb_idx = 0;
- msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
- }
-
- /* set all values "atomically" (be as "atomic" as possible) */
- while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
- (msg_ps->vb_idx < msg_ps->invb.count))
- {
- struct mib_node *mn;
- struct snmp_name_ptr np;
-
- if (msg_ps->vb_idx == 0)
- {
- msg_ps->vb_ptr = msg_ps->invb.head;
- }
- else
- {
- msg_ps->vb_ptr = msg_ps->vb_ptr->next;
- }
- /* skip iso prefix test, was done previously while settesting() */
- mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4,
- msg_ps->vb_ptr->ident + 4, &np);
- /* check if object is still available
- (e.g. external hot-plug thingy present?) */
- if (mn != NULL)
- {
- if (mn->node_type == MIB_NODE_EX)
- {
- /* external object */
- struct mib_external_node *en = (struct mib_external_node*)mn;
-
- msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S;
- /* save en && args in msg_ps!! */
- msg_ps->ext_mib_node = en;
- msg_ps->ext_name_ptr = np;
-
- en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident);
- }
- else
- {
- /* internal object */
- struct obj_def object_def;
-
- msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF_S;
- mn->get_object_def(np.ident_len, np.ident, &object_def);
- msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE;
- mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value);
- msg_ps->vb_idx += 1;
- }
- }
- }
- if ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) &&
- (msg_ps->vb_idx == msg_ps->invb.count))
- {
- /* simply echo the input if we can set it
- @todo do we need to return the actual value?
- e.g. if value is silently modified or behaves sticky? */
- msg_ps->outvb = msg_ps->invb;
- msg_ps->invb.head = NULL;
- msg_ps->invb.tail = NULL;
- msg_ps->invb.count = 0;
- snmp_ok_response(msg_ps);
- }
-}
-
-
-/**
- * Handle one internal or external event.
- * Called for one async event. (recv external/private answer)
- *
- * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1)
- */
-void
-snmp_msg_event(u8_t request_id)
-{
- struct snmp_msg_pstat *msg_ps;
-
- if (request_id < SNMP_CONCURRENT_REQUESTS)
- {
- msg_ps = &msg_input_list[request_id];
- if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ)
- {
- snmp_msg_getnext_event(request_id, msg_ps);
- }
- else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ)
- {
- snmp_msg_get_event(request_id, msg_ps);
- }
- else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)
- {
- snmp_msg_set_event(request_id, msg_ps);
- }
- }
-}
-
-
-/* lwIP UDP receive callback function */
-static void
-snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *addr, u16_t port)
-{
- struct udp_hdr *udphdr;
-
- /* suppress unused argument warning */
- if (arg);
- /* peek in the UDP header (goto IP payload) */
- pbuf_header(p, UDP_HLEN);
- udphdr = p->payload;
-
- /* check if datagram is really directed at us (including broadcast requests) */
- if ((pcb == snmp1_pcb) && (ntohs(udphdr->dest) == 161))
- {
- struct snmp_msg_pstat *msg_ps;
- u8_t req_idx;
-
- /* traverse input message process list, look for SNMP_MSG_EMPTY */
- msg_ps = &msg_input_list[0];
- req_idx = 0;
- while ((req_idx<SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY))
- {
- req_idx++;
- msg_ps++;
- }
- if (req_idx != SNMP_CONCURRENT_REQUESTS)
- {
- err_t err_ret;
- u16_t payload_len;
- u16_t payload_ofs;
- u16_t varbind_ofs = 0;
-
- /* accepting request */
- snmp_inc_snmpinpkts();
- /* record used 'protocol control block' */
- msg_ps->pcb = pcb;
- /* source address (network order) */
- msg_ps->sip = *addr;
- /* source port (host order (lwIP oddity)) */
- msg_ps->sp = port;
- /* read UDP payload length from UDP header */
- payload_len = ntohs(udphdr->len) - UDP_HLEN;
-
- /* adjust to UDP payload */
- payload_ofs = UDP_HLEN;
-
- /* check total length, version, community, pdu type */
- err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps);
- if (((msg_ps->rt == SNMP_ASN1_PDU_GET_REQ) ||
- (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ) ||
- (msg_ps->rt == SNMP_ASN1_PDU_SET_REQ)) &&
- ((msg_ps->error_status == SNMP_ES_NOERROR) &&
- (msg_ps->error_index == 0)) )
- {
- /* Only accept requests and requests without error (be robust) */
- err_ret = err_ret;
- }
- else
- {
- /* Reject response and trap headers or error requests as input! */
- err_ret = ERR_ARG;
- }
- if (err_ret == ERR_OK)
- {
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv ok, community %s\n", msg_ps->community));
-
- /* Builds a list of variable bindings. Copy the varbinds from the pbuf
- chain to glue them when these are divided over two or more pbuf's. */
- err_ret = snmp_pdu_dec_varbindlist(p, varbind_ofs, &varbind_ofs, msg_ps);
- if ((err_ret == ERR_OK) && (msg_ps->invb.count > 0))
- {
- /* we've decoded the incoming message, release input msg now */
- pbuf_free(p);
-
- msg_ps->error_status = SNMP_ES_NOERROR;
- msg_ps->error_index = 0;
- /* find object for each variable binding */
- msg_ps->state = SNMP_MSG_SEARCH_OBJ;
- /* first variable binding from list to inspect */
- msg_ps->vb_idx = 0;
-
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count));
-
- /* handle input event and as much objects as possible in one go */
- snmp_msg_event(req_idx);
- }
- else
- {
- /* varbind-list decode failed, or varbind list empty.
- drop request silently, do not return error!
- (errors are only returned for a specific varbind failure) */
- pbuf_free(p);
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed\n"));
- }
- }
- else
- {
- /* header check failed
- drop request silently, do not return error! */
- pbuf_free(p);
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_header_check() failed\n"));
- }
- }
- else
- {
- /* exceeding number of concurrent requests */
- pbuf_free(p);
- }
- }
- else
- {
- /* datagram not for us */
- pbuf_free(p);
- }
-}
-
-/**
- * Checks and decodes incoming SNMP message header, logs header errors.
- *
- * @param p points to pbuf chain of SNMP message (UDP payload)
- * @param ofs points to first octet of SNMP message
- * @param pdu_len the length of the UDP payload
- * @param ofs_ret returns the ofset of the variable bindings
- * @param m_stat points to the current message request state return
- * @return
- * - ERR_OK SNMP header is sane and accepted
- * - ERR_ARG SNMP header is either malformed or rejected
- */
-static err_t
-snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
-{
- err_t derr;
- u16_t len, ofs_base;
- u8_t len_octets;
- u8_t type;
- s32_t version;
-
- ofs_base = ofs;
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if ((derr != ERR_OK) ||
- (pdu_len != (1 + len_octets + len)) ||
- (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
- {
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- ofs += (1 + len_octets);
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
- {
- /* can't decode or no integer (version) */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &version);
- if (derr != ERR_OK)
- {
- /* can't decode */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- if (version != 0)
- {
- /* not version 1 */
- snmp_inc_snmpinbadversions();
- return ERR_ARG;
- }
- ofs += (1 + len_octets + len);
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)))
- {
- /* can't decode or no octet string (community) */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, SNMP_COMMUNITY_STR_LEN, m_stat->community);
- if (derr != ERR_OK)
- {
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- /* add zero terminator */
- len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN));
- m_stat->community[len] = 0;
- m_stat->com_strlen = len;
- if (strncmp(snmp_publiccommunity, (const char*)m_stat->community, SNMP_COMMUNITY_STR_LEN) != 0)
- {
- /** @todo: move this if we need to check more names */
- snmp_inc_snmpinbadcommunitynames();
- snmp_authfail_trap();
- return ERR_ARG;
- }
- ofs += (1 + len_octets + len);
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if (derr != ERR_OK)
- {
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- switch(type)
- {
- case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ):
- /* GetRequest PDU */
- snmp_inc_snmpingetrequests();
- derr = ERR_OK;
- break;
- case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_NEXT_REQ):
- /* GetNextRequest PDU */
- snmp_inc_snmpingetnexts();
- derr = ERR_OK;
- break;
- case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP):
- /* GetResponse PDU */
- snmp_inc_snmpingetresponses();
- derr = ERR_ARG;
- break;
- case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ):
- /* SetRequest PDU */
- snmp_inc_snmpinsetrequests();
- derr = ERR_OK;
- break;
- case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP):
- /* Trap PDU */
- snmp_inc_snmpintraps();
- derr = ERR_ARG;
- break;
- default:
- snmp_inc_snmpinasnparseerrs();
- derr = ERR_ARG;
- break;
- }
- if (derr != ERR_OK)
- {
- /* unsupported input PDU for this agent (no parse error) */
- return ERR_ARG;
- }
- m_stat->rt = type & 0x1F;
- ofs += (1 + len_octets);
- if (len != (pdu_len - (ofs - ofs_base)))
- {
- /* decoded PDU length does not equal actual payload length */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
- {
- /* can't decode or no integer (request ID) */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->rid);
- if (derr != ERR_OK)
- {
- /* can't decode */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- ofs += (1 + len_octets + len);
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
- {
- /* can't decode or no integer (error-status) */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- /* must be noError (0) for incoming requests.
- log errors for mib-2 completeness and for debug purposes */
- derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_status);
- if (derr != ERR_OK)
- {
- /* can't decode */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- switch (m_stat->error_status)
- {
- case SNMP_ES_TOOBIG:
- snmp_inc_snmpintoobigs();
- break;
- case SNMP_ES_NOSUCHNAME:
- snmp_inc_snmpinnosuchnames();
- break;
- case SNMP_ES_BADVALUE:
- snmp_inc_snmpinbadvalues();
- break;
- case SNMP_ES_READONLY:
- snmp_inc_snmpinreadonlys();
- break;
- case SNMP_ES_GENERROR:
- snmp_inc_snmpingenerrs();
- break;
- }
- ofs += (1 + len_octets + len);
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)))
- {
- /* can't decode or no integer (error-index) */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- /* must be 0 for incoming requests.
- decode anyway to catch bad integers (and dirty tricks) */
- derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_index);
- if (derr != ERR_OK)
- {
- /* can't decode */
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- ofs += (1 + len_octets + len);
- *ofs_ret = ofs;
- return ERR_OK;
-}
-
-static err_t
-snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat)
-{
- err_t derr;
- u16_t len, vb_len;
- u8_t len_octets;
- u8_t type;
-
- /* variable binding list */
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len);
- if ((derr != ERR_OK) ||
- (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)))
- {
- snmp_inc_snmpinasnparseerrs();
- return ERR_ARG;
- }
- ofs += (1 + len_octets);
-
- /* start with empty list */
- m_stat->invb.count = 0;
- m_stat->invb.head = NULL;
- m_stat->invb.tail = NULL;
-
- while (vb_len > 0)
- {
- struct snmp_obj_id oid, oid_value;
- struct snmp_varbind *vb;
-
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if ((derr != ERR_OK) ||
- (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) ||
- (len <= 0) || (len > vb_len))
- {
- snmp_inc_snmpinasnparseerrs();
- /* free varbinds (if available) */
- snmp_varbind_list_free(&m_stat->invb);
- return ERR_ARG;
- }
- ofs += (1 + len_octets);
- vb_len -= (1 + len_octets);
-
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)))
- {
- /* can't decode object name length */
- snmp_inc_snmpinasnparseerrs();
- /* free varbinds (if available) */
- snmp_varbind_list_free(&m_stat->invb);
- return ERR_ARG;
- }
- derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid);
- if (derr != ERR_OK)
- {
- /* can't decode object name */
- snmp_inc_snmpinasnparseerrs();
- /* free varbinds (if available) */
- snmp_varbind_list_free(&m_stat->invb);
- return ERR_ARG;
- }
- ofs += (1 + len_octets + len);
- vb_len -= (1 + len_octets + len);
-
- snmp_asn1_dec_type(p, ofs, &type);
- derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len);
- if (derr != ERR_OK)
- {
- /* can't decode object value length */
- snmp_inc_snmpinasnparseerrs();
- /* free varbinds (if available) */
- snmp_varbind_list_free(&m_stat->invb);
- return ERR_ARG;
- }
-
- switch (type)
- {
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
- vb = snmp_varbind_alloc(&oid, type, sizeof(s32_t));
- if (vb != NULL)
- {
- s32_t *vptr = vb->value;
-
- derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, vptr);
- snmp_varbind_tail_add(&m_stat->invb, vb);
- }
- else
- {
- derr = ERR_ARG;
- }
- break;
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
- vb = snmp_varbind_alloc(&oid, type, sizeof(u32_t));
- if (vb != NULL)
- {
- u32_t *vptr = vb->value;
-
- derr = snmp_asn1_dec_u32t(p, ofs + 1 + len_octets, len, vptr);
- snmp_varbind_tail_add(&m_stat->invb, vb);
- }
- else
- {
- derr = ERR_ARG;
- }
- break;
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
- vb = snmp_varbind_alloc(&oid, type, len);
- if (vb != NULL)
- {
- derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, vb->value);
- snmp_varbind_tail_add(&m_stat->invb, vb);
- }
- else
- {
- derr = ERR_ARG;
- }
- break;
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
- vb = snmp_varbind_alloc(&oid, type, 0);
- if (vb != NULL)
- {
- snmp_varbind_tail_add(&m_stat->invb, vb);
- derr = ERR_OK;
- }
- else
- {
- derr = ERR_ARG;
- }
- break;
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
- derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid_value);
- if (derr == ERR_OK)
- {
- vb = snmp_varbind_alloc(&oid, type, oid_value.len * sizeof(s32_t));
- if (vb != NULL)
- {
- u8_t i = oid_value.len;
- s32_t *vptr = vb->value;
-
- while(i > 0)
- {
- i--;
- vptr[i] = oid_value.id[i];
- }
- snmp_varbind_tail_add(&m_stat->invb, vb);
- derr = ERR_OK;
- }
- else
- {
- derr = ERR_ARG;
- }
- }
- break;
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
- if (len == 4)
- {
- /* must be exactly 4 octets! */
- vb = snmp_varbind_alloc(&oid, type, 4);
- if (vb != NULL)
- {
- derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, vb->value);
- snmp_varbind_tail_add(&m_stat->invb, vb);
- }
- else
- {
- derr = ERR_ARG;
- }
- }
- else
- {
- derr = ERR_ARG;
- }
- break;
- default:
- derr = ERR_ARG;
- break;
- }
- if (derr != ERR_OK)
- {
- snmp_inc_snmpinasnparseerrs();
- /* free varbinds (if available) */
- snmp_varbind_list_free(&m_stat->invb);
- return ERR_ARG;
- }
- ofs += (1 + len_octets + len);
- vb_len -= (1 + len_octets + len);
- }
-
- if (m_stat->rt == SNMP_ASN1_PDU_SET_REQ)
- {
- snmp_add_snmpintotalsetvars(m_stat->invb.count);
- }
- else
- {
- snmp_add_snmpintotalreqvars(m_stat->invb.count);
- }
-
- *ofs_ret = ofs;
- return ERR_OK;
-}
-
-struct snmp_varbind*
-snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len)
-{
- struct snmp_varbind *vb;
-
- vb = (struct snmp_varbind *)mem_malloc(sizeof(struct snmp_varbind));
- LWIP_ASSERT("vb != NULL",vb != NULL);
- if (vb != NULL)
- {
- u8_t i;
-
- vb->next = NULL;
- vb->prev = NULL;
- i = oid->len;
- vb->ident_len = i;
- if (i > 0)
- {
- /* allocate array of s32_t for our object identifier */
- vb->ident = (s32_t*)mem_malloc(sizeof(s32_t) * i);
- LWIP_ASSERT("vb->ident != NULL",vb->ident != NULL);
- if (vb->ident == NULL)
- {
- mem_free(vb);
- return NULL;
- }
- while(i > 0)
- {
- i--;
- vb->ident[i] = oid->id[i];
- }
- }
- else
- {
- /* i == 0, pass zero length object identifier */
- vb->ident = NULL;
- }
- vb->value_type = type;
- vb->value_len = len;
- if (len > 0)
- {
- /* allocate raw bytes for our object value */
- vb->value = mem_malloc(len);
- LWIP_ASSERT("vb->value != NULL",vb->value != NULL);
- if (vb->value == NULL)
- {
- if (vb->ident != NULL)
- {
- mem_free(vb->ident);
- }
- mem_free(vb);
- return NULL;
- }
- }
- else
- {
- /* ASN1_NUL type, or zero length ASN1_OC_STR */
- vb->value = NULL;
- }
- }
- return vb;
-}
-
-void
-snmp_varbind_free(struct snmp_varbind *vb)
-{
- if (vb->value != NULL )
- {
- mem_free(vb->value);
- }
- if (vb->ident != NULL )
- {
- mem_free(vb->ident);
- }
- mem_free(vb);
-}
-
-void
-snmp_varbind_list_free(struct snmp_varbind_root *root)
-{
- struct snmp_varbind *vb, *prev;
-
- vb = root->tail;
- while ( vb != NULL )
- {
- prev = vb->prev;
- snmp_varbind_free(vb);
- vb = prev;
- }
- root->count = 0;
- root->head = NULL;
- root->tail = NULL;
-}
-
-void
-snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb)
-{
- if (root->count == 0)
- {
- /* add first varbind to list */
- root->head = vb;
- root->tail = vb;
- }
- else
- {
- /* add nth varbind to list tail */
- root->tail->next = vb;
- vb->prev = root->tail;
- root->tail = vb;
- }
- root->count += 1;
-}
-
-struct snmp_varbind*
-snmp_varbind_tail_remove(struct snmp_varbind_root *root)
-{
- struct snmp_varbind* vb;
-
- if (root->count > 0)
- {
- /* remove tail varbind */
- vb = root->tail;
- root->tail = vb->prev;
- vb->prev->next = NULL;
- root->count -= 1;
- }
- else
- {
- /* nothing to remove */
- vb = NULL;
- }
- return vb;
-}
-
-#endif /* LWIP_SNMP */
diff --git a/src/VBox/Devices/Network/lwip/src/core/snmp/msg_out.c b/src/VBox/Devices/Network/lwip/src/core/snmp/msg_out.c
deleted file mode 100644
index c8961c9..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/snmp/msg_out.c
+++ /dev/null
@@ -1,687 +0,0 @@
-/**
- * @file
- * SNMP output message processing (RFC1157).
- *
- * Output responses and traps are build in two passes:
- *
- * Pass 0: iterate over the output message backwards to determine encoding lengths
- * Pass 1: the actual forward encoding of internal form into ASN1
- *
- * The single-pass encoding method described by Comer & Stevens
- * requires extra buffer space and copying for reversal of the packet.
- * The buffer requirement can be prohibitively large for big payloads
- * (>= 484) therefore we use the two encoding passes.
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#include "lwip/opt.h"
-
-#if LWIP_SNMP
-#include "arch/cc.h"
-#include "lwip/udp.h"
-#include "lwip/netif.h"
-
-#include "lwip/snmp.h"
-#include "lwip/snmp_asn1.h"
-#include "lwip/snmp_msg.h"
-
-struct snmp_trap_dst
-{
- /* destination IP address in network order */
- struct ip_addr dip;
- /* set to 0 when disabled, >0 when enabled */
- u8_t enable;
-};
-#if (SNMP_TRAP_DESTINATIONS == 0)
-#error "need at least one trap destination"
-#endif
-struct snmp_trap_dst trap_dst[SNMP_TRAP_DESTINATIONS];
-
-/** TRAP message structure */
-struct snmp_msg_trap trap_msg;
-
-static u16_t snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len);
-static u16_t snmp_trap_header_sum(struct snmp_msg_trap *m_trap, u16_t vb_len);
-static u16_t snmp_varbind_list_sum(struct snmp_varbind_root *root);
-
-static u16_t snmp_resp_header_enc(struct snmp_msg_pstat *m_stat, struct pbuf *p);
-static u16_t snmp_trap_header_enc(struct snmp_msg_trap *m_trap, struct pbuf *p);
-static u16_t snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs);
-
-/**
- * Sets enable switch for this trap destination.
- * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1
- * @param enable switch if 0 destination is disabled >0 enabled.
- */
-void
-snmp_trap_dst_enable(u8_t dst_idx, u8_t enable)
-{
- if (dst_idx < SNMP_TRAP_DESTINATIONS)
- {
- trap_dst[dst_idx].enable = enable;
- }
-}
-
-/**
- * Sets IPv4 address for this trap destination.
- * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1
- * @param dst IPv4 address in host order.
- */
-void
-snmp_trap_dst_ip_set(u8_t dst_idx, struct ip_addr *dst)
-{
- if (dst_idx < SNMP_TRAP_DESTINATIONS)
- {
- trap_dst[dst_idx].dip.addr = htonl(dst->addr);
- }
-}
-
-/**
- * Sends a 'getresponse' message to the request originator.
- *
- * @param m_stat points to the current message request state source
- * @return ERR_OK when success, ERR_MEM if we're out of memory
- *
- * @note the caller is responsible for filling in outvb in the m_stat
- * and provide error-status and index (except for tooBig errors) ...
- */
-err_t
-snmp_send_response(struct snmp_msg_pstat *m_stat)
-{
- struct snmp_varbind_root emptyvb = {NULL, NULL, 0, 0, 0};
- struct pbuf *p;
- u16_t tot_len;
- err_t err;
-
- /* pass 0, calculate length fields */
- tot_len = snmp_varbind_list_sum(&m_stat->outvb);
- tot_len = snmp_resp_header_sum(m_stat, tot_len);
-
- /* try allocating pbuf(s) for complete response */
- p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
- if (p == NULL)
- {
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() tooBig\n"));
-
- /* can't construct reply, return error-status tooBig */
- m_stat->error_status = SNMP_ES_TOOBIG;
- m_stat->error_index = 0;
- /* pass 0, recalculate lengths, for empty varbind-list */
- tot_len = snmp_varbind_list_sum(&emptyvb);
- tot_len = snmp_resp_header_sum(m_stat, tot_len);
- /* retry allocation once for header and empty varbind-list */
- p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
- }
- if (p != NULL)
- {
- /* first pbuf alloc try or retry alloc success */
- u16_t ofs;
-
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() p != NULL\n"));
-
- /* pass 1, size error, encode packet ino the pbuf(s) */
- ofs = snmp_resp_header_enc(m_stat, p);
- if (m_stat->error_status == SNMP_ES_TOOBIG)
- {
- snmp_varbind_list_enc(&emptyvb, p, ofs);
- }
- else
- {
- snmp_varbind_list_enc(&m_stat->outvb, p, ofs);
- }
-
- switch (m_stat->error_status)
- {
- case SNMP_ES_TOOBIG:
- snmp_inc_snmpouttoobigs();
- break;
- case SNMP_ES_NOSUCHNAME:
- snmp_inc_snmpoutnosuchnames();
- break;
- case SNMP_ES_BADVALUE:
- snmp_inc_snmpoutbadvalues();
- break;
- case SNMP_ES_GENERROR:
- snmp_inc_snmpoutgenerrs();
- break;
- }
- snmp_inc_snmpoutgetresponses();
- snmp_inc_snmpoutpkts();
-
- /** @todo do we need separate rx and tx pcbs for threaded case? */
- /** connect to the originating source */
- udp_connect(m_stat->pcb, &m_stat->sip, m_stat->sp);
- err = udp_send(m_stat->pcb, p);
- if (err == ERR_MEM)
- {
- /** @todo release some memory, retry and return tooBig? tooMuchHassle? */
- err = ERR_MEM;
- }
- else
- {
- err = ERR_OK;
- }
- /** disassociate remote address and port with this pcb */
- udp_disconnect(m_stat->pcb);
-
- pbuf_free(p);
- LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() done\n"));
- return err;
- }
- else
- {
- /* first pbuf alloc try or retry alloc failed
- very low on memory, couldn't return tooBig */
- return ERR_MEM;
- }
-}
-
-
-/**
- * Sends an generic or enterprise specific trap message.
- *
- * @param generic_trap is the trap code
- * @param eoid points to enterprise object identifier
- * @param specific_trap used for enterprise traps when generic_trap == 6
- * @return ERR_OK when success, ERR_MEM if we're out of memory
- *
- * @note the caller is responsible for filling in outvb in the trap_msg
- * @note the use of the enterpise identifier field
- * is per RFC1215.
- * Use .iso.org.dod.internet.mgmt.mib-2.snmp for generic traps
- * and .iso.org.dod.internet.private.enterprises.yourenterprise
- * (sysObjectID) for specific traps.
- */
-err_t
-snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap)
-{
- struct snmp_trap_dst *td;
- struct netif *dst_if;
- struct ip_addr dst_ip;
- struct pbuf *p;
- u16_t i,tot_len;
-
- for (i=0, td = &trap_dst[0]; i<SNMP_TRAP_DESTINATIONS; i++, td++)
- {
- if ((td->enable != 0) && (td->dip.addr != 0))
- {
- /* network order trap destination */
- trap_msg.dip.addr = td->dip.addr;
- /* lookup current source address for this dst */
- dst_if = ip_route(&td->dip);
- dst_ip.addr = ntohl(dst_if->ip_addr.addr);
- trap_msg.sip_raw[0] = dst_ip.addr >> 24;
- trap_msg.sip_raw[1] = dst_ip.addr >> 16;
- trap_msg.sip_raw[2] = dst_ip.addr >> 8;
- trap_msg.sip_raw[3] = dst_ip.addr;
- trap_msg.gen_trap = generic_trap;
- trap_msg.spc_trap = specific_trap;
- if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC)
- {
- /* enterprise-Specific trap */
- trap_msg.enterprise = eoid;
- }
- else
- {
- /* generic (MIB-II) trap */
- snmp_get_snmpgrpid_ptr(&trap_msg.enterprise);
- }
- snmp_get_sysuptime(&trap_msg.ts);
-
- /* pass 0, calculate length fields */
- tot_len = snmp_varbind_list_sum(&trap_msg.outvb);
- tot_len = snmp_trap_header_sum(&trap_msg, tot_len);
-
- /* allocate pbuf(s) */
- p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL);
- if (p != NULL)
- {
- u16_t ofs;
-
- /* pass 1, encode packet ino the pbuf(s) */
- ofs = snmp_trap_header_enc(&trap_msg, p);
- snmp_varbind_list_enc(&trap_msg.outvb, p, ofs);
-
- snmp_inc_snmpouttraps();
- snmp_inc_snmpoutpkts();
-
- /** connect to the TRAP destination */
- udp_connect(trap_msg.pcb, &trap_msg.dip, SNMP_TRAP_PORT);
- udp_send(trap_msg.pcb, p);
- /** disassociate remote address and port with this pcb */
- udp_disconnect(trap_msg.pcb);
-
- pbuf_free(p);
- }
- else
- {
- return ERR_MEM;
- }
- }
- }
- return ERR_OK;
-}
-
-void
-snmp_coldstart_trap(void)
-{
- trap_msg.outvb.head = NULL;
- trap_msg.outvb.tail = NULL;
- trap_msg.outvb.count = 0;
- snmp_send_trap(SNMP_GENTRAP_COLDSTART, NULL, 0);
-}
-
-void
-snmp_authfail_trap(void)
-{
- u8_t enable;
- snmp_get_snmpenableauthentraps(&enable);
- if (enable == 1)
- {
- trap_msg.outvb.head = NULL;
- trap_msg.outvb.tail = NULL;
- trap_msg.outvb.count = 0;
- snmp_send_trap(SNMP_GENTRAP_AUTHFAIL, NULL, 0);
- }
-}
-
-/**
- * Sums response header field lengths from tail to head and
- * returns resp_header_lengths for second encoding pass.
- *
- * @param vb_len varbind-list length
- * @param rhl points to returned header lengths
- * @return the required lenght for encoding the response header
- */
-static u16_t
-snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len)
-{
- u16_t tot_len;
- struct snmp_resp_header_lengths *rhl;
-
- rhl = &m_stat->rhl;
- tot_len = vb_len;
- snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen);
- snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen);
- tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen;
-
- snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen);
- snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen);
- tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen;
-
- snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen);
- snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen);
- tot_len += 1 + rhl->ridlenlen + rhl->ridlen;
-
- rhl->pdulen = tot_len;
- snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen);
- tot_len += 1 + rhl->pdulenlen;
-
- rhl->comlen = m_stat->com_strlen;
- snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen);
- tot_len += 1 + rhl->comlenlen + rhl->comlen;
-
- snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen);
- snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen);
- tot_len += 1 + rhl->verlen + rhl->verlenlen;
-
- rhl->seqlen = tot_len;
- snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen);
- tot_len += 1 + rhl->seqlenlen;
-
- return tot_len;
-}
-
-/**
- * Sums trap header field lengths from tail to head and
- * returns trap_header_lengths for second encoding pass.
- *
- * @param vb_len varbind-list length
- * @param thl points to returned header lengths
- * @return the required lenght for encoding the trap header
- */
-static u16_t
-snmp_trap_header_sum(struct snmp_msg_trap *m_trap, u16_t vb_len)
-{
- u16_t tot_len;
- struct snmp_trap_header_lengths *thl;
-
- thl = &m_trap->thl;
- tot_len = vb_len;
-
- snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen);
- snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen);
- tot_len += 1 + thl->tslen + thl->tslenlen;
-
- snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen);
- snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen);
- tot_len += 1 + thl->strplen + thl->strplenlen;
-
- snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen);
- snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen);
- tot_len += 1 + thl->gtrplen + thl->gtrplenlen;
-
- thl->aaddrlen = 4;
- snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen);
- tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen;
-
- snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen);
- snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen);
- tot_len += 1 + thl->eidlen + thl->eidlenlen;
-
- thl->pdulen = tot_len;
- snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen);
- tot_len += 1 + thl->pdulenlen;
-
- thl->comlen = sizeof(snmp_publiccommunity) - 1;
- snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen);
- tot_len += 1 + thl->comlenlen + thl->comlen;
-
- snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen);
- snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen);
- tot_len += 1 + thl->verlen + thl->verlenlen;
-
- thl->seqlen = tot_len;
- snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen);
- tot_len += 1 + thl->seqlenlen;
-
- return tot_len;
-}
-
-/**
- * Sums varbind lengths from tail to head and
- * annotates lengths in varbind for second encoding pass.
- *
- * @param root points to the root of the variable binding list
- * @return the required lenght for encoding the variable bindings
- */
-static u16_t
-snmp_varbind_list_sum(struct snmp_varbind_root *root)
-{
- struct snmp_varbind *vb;
- u32_t *uint_ptr;
- s32_t *sint_ptr;
- u16_t tot_len;
-
- tot_len = 0;
- vb = root->tail;
- while ( vb != NULL )
- {
- /* encoded value lenght depends on type */
- switch (vb->value_type)
- {
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
- sint_ptr = vb->value;
- snmp_asn1_enc_s32t_cnt(*sint_ptr, &vb->vlen);
- break;
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
- uint_ptr = vb->value;
- snmp_asn1_enc_u32t_cnt(*uint_ptr, &vb->vlen);
- break;
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
- vb->vlen = vb->value_len;
- break;
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
- sint_ptr = vb->value;
- snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen);
- break;
- default:
- /* unsupported type */
- vb->vlen = 0;
- break;
- };
- /* encoding length of value length field */
- snmp_asn1_enc_length_cnt(vb->vlen, &vb->vlenlen);
- snmp_asn1_enc_oid_cnt(vb->ident_len, vb->ident, &vb->olen);
- snmp_asn1_enc_length_cnt(vb->olen, &vb->olenlen);
-
- vb->seqlen = 1 + vb->vlenlen + vb->vlen;
- vb->seqlen += 1 + vb->olenlen + vb->olen;
- snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen);
-
- /* varbind seq */
- tot_len += 1 + vb->seqlenlen + vb->seqlen;
-
- vb = vb->prev;
- }
-
- /* varbind-list seq */
- root->seqlen = tot_len;
- snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen);
- tot_len += 1 + root->seqlenlen;
-
- return tot_len;
-}
-
-/**
- * Encodes response header from head to tail.
- */
-static u16_t
-snmp_resp_header_enc(struct snmp_msg_pstat *m_stat, struct pbuf *p)
-{
- u16_t ofs;
-
- ofs = 0;
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen);
- ofs += m_stat->rhl.seqlenlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen);
- ofs += m_stat->rhl.verlenlen;
- snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version);
- ofs += m_stat->rhl.verlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen);
- ofs += m_stat->rhl.comlenlen;
- snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community);
- ofs += m_stat->rhl.comlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen);
- ofs += m_stat->rhl.pdulenlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen);
- ofs += m_stat->rhl.ridlenlen;
- snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid);
- ofs += m_stat->rhl.ridlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen);
- ofs += m_stat->rhl.errstatlenlen;
- snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status);
- ofs += m_stat->rhl.errstatlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen);
- ofs += m_stat->rhl.erridxlenlen;
- snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index);
- ofs += m_stat->rhl.erridxlen;
-
- return ofs;
-}
-
-/**
- * Encodes trap header from head to tail.
- */
-static u16_t
-snmp_trap_header_enc(struct snmp_msg_trap *m_trap, struct pbuf *p)
-{
- u16_t ofs;
-
- ofs = 0;
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen);
- ofs += m_trap->thl.seqlenlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen);
- ofs += m_trap->thl.verlenlen;
- snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version);
- ofs += m_trap->thl.verlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen);
- ofs += m_trap->thl.comlenlen;
- snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]);
- ofs += m_trap->thl.comlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen);
- ofs += m_trap->thl.pdulenlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen);
- ofs += m_trap->thl.eidlenlen;
- snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]);
- ofs += m_trap->thl.eidlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen);
- ofs += m_trap->thl.aaddrlenlen;
- snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]);
- ofs += m_trap->thl.aaddrlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen);
- ofs += m_trap->thl.gtrplenlen;
- snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap);
- ofs += m_trap->thl.gtrplen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen);
- ofs += m_trap->thl.strplenlen;
- snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap);
- ofs += m_trap->thl.strplen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen);
- ofs += m_trap->thl.tslenlen;
- snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts);
- ofs += m_trap->thl.tslen;
-
- return ofs;
-}
-
-/**
- * Encodes varbind list from head to tail.
- */
-static u16_t
-snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs)
-{
- struct snmp_varbind *vb;
- s32_t *sint_ptr;
- u32_t *uint_ptr;
- u8_t *raw_ptr;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, root->seqlen);
- ofs += root->seqlenlen;
-
- vb = root->head;
- while ( vb != NULL )
- {
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, vb->seqlen);
- ofs += vb->seqlenlen;
-
- snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID));
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, vb->olen);
- ofs += vb->olenlen;
- snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]);
- ofs += vb->olen;
-
- snmp_asn1_enc_type(p, ofs, vb->value_type);
- ofs += 1;
- snmp_asn1_enc_length(p, ofs, vb->vlen);
- ofs += vb->vlenlen;
-
- switch (vb->value_type)
- {
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG):
- sint_ptr = vb->value;
- snmp_asn1_enc_s32t(p, ofs, vb->vlen, *sint_ptr);
- break;
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS):
- uint_ptr = vb->value;
- snmp_asn1_enc_u32t(p, ofs, vb->vlen, *uint_ptr);
- break;
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR):
- case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE):
- raw_ptr = vb->value;
- snmp_asn1_enc_raw(p, ofs, vb->vlen, raw_ptr);
- break;
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL):
- break;
- case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID):
- sint_ptr = vb->value;
- snmp_asn1_enc_oid(p, ofs, vb->value_len / sizeof(s32_t), sint_ptr);
- break;
- default:
- /* unsupported type */
- break;
- };
- ofs += vb->vlen;
- vb = vb->next;
- }
- return ofs;
-}
-
-#endif /* LWIP_SNMP */
diff --git a/src/VBox/Devices/Network/lwip/src/core/stats.c b/src/VBox/Devices/Network/lwip/src/core/stats.c
deleted file mode 100644
index d5b3740..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/stats.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include <string.h>
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-
-#include "lwip/stats.h"
-#include "lwip/mem.h"
-
-
-#if LWIP_STATS
-struct stats_ lwip_stats;
-
-void
-stats_init(void)
-{
- memset(&lwip_stats, 0, sizeof(struct stats_));
-}
-#if LWIP_STATS_DISPLAY
-void
-stats_display_proto(struct stats_proto *proto, char *name)
-{
- LWIP_PLATFORM_DIAG(("\n%s\n\t", name));
- LWIP_PLATFORM_DIAG(("xmit: %"S16_F"\n\t", proto->xmit));
- LWIP_PLATFORM_DIAG(("rexmit: %"S16_F"\n\t", proto->rexmit));
- LWIP_PLATFORM_DIAG(("recv: %"S16_F"\n\t", proto->recv));
- LWIP_PLATFORM_DIAG(("fw: %"S16_F"\n\t", proto->fw));
- LWIP_PLATFORM_DIAG(("drop: %"S16_F"\n\t", proto->drop));
- LWIP_PLATFORM_DIAG(("chkerr: %"S16_F"\n\t", proto->chkerr));
- LWIP_PLATFORM_DIAG(("lenerr: %"S16_F"\n\t", proto->lenerr));
- LWIP_PLATFORM_DIAG(("memerr: %"S16_F"\n\t", proto->memerr));
- LWIP_PLATFORM_DIAG(("rterr: %"S16_F"\n\t", proto->rterr));
- LWIP_PLATFORM_DIAG(("proterr: %"S16_F"\n\t", proto->proterr));
- LWIP_PLATFORM_DIAG(("opterr: %"S16_F"\n\t", proto->opterr));
- LWIP_PLATFORM_DIAG(("err: %"S16_F"\n\t", proto->err));
- LWIP_PLATFORM_DIAG(("cachehit: %"S16_F"\n", proto->cachehit));
-}
-
-void
-stats_display_pbuf(struct stats_pbuf *pbuf)
-{
- LWIP_PLATFORM_DIAG(("\nPBUF\n\t"));
- LWIP_PLATFORM_DIAG(("avail: %"S16_F"\n\t", pbuf->avail));
- LWIP_PLATFORM_DIAG(("used: %"S16_F"\n\t", pbuf->used));
- LWIP_PLATFORM_DIAG(("max: %"S16_F"\n\t", pbuf->max));
- LWIP_PLATFORM_DIAG(("err: %"S16_F"\n\t", pbuf->err));
- LWIP_PLATFORM_DIAG(("alloc_locked: %"S16_F"\n\t", pbuf->alloc_locked));
- LWIP_PLATFORM_DIAG(("refresh_locked: %"S16_F"\n", pbuf->refresh_locked));
-}
-
-void
-stats_display_mem(struct stats_mem *mem, char *name)
-{
- LWIP_PLATFORM_DIAG(("\n MEM %s\n\t", name));
- LWIP_PLATFORM_DIAG(("avail: %"MEM_SIZE_F"\n\t", mem->avail));
- LWIP_PLATFORM_DIAG(("used: %"MEM_SIZE_F"\n\t", mem->used));
- LWIP_PLATFORM_DIAG(("max: %"MEM_SIZE_F"\n\t", mem->max));
- LWIP_PLATFORM_DIAG(("err: %"MEM_SIZE_F"\n", mem->err));
-
-}
-
-void
-stats_display(void)
-{
- s16_t i;
- char * memp_names[] = {"PBUF", "RAW_PCB", "UDP_PCB", "TCP_PCB", "TCP_PCB_LISTEN",
- "TCP_SEG", "NETBUF", "NETCONN", "API_MSG", "TCP_MSG", "TIMEOUT"};
- stats_display_proto(&lwip_stats.link, "LINK");
- stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG");
- stats_display_proto(&lwip_stats.ip, "IP");
- stats_display_proto(&lwip_stats.icmp, "ICMP");
- stats_display_proto(&lwip_stats.udp, "UDP");
- stats_display_proto(&lwip_stats.tcp, "TCP");
- stats_display_pbuf(&lwip_stats.pbuf);
- stats_display_mem(&lwip_stats.mem, "HEAP");
- for (i = 0; i < MEMP_MAX; i++) {
- stats_display_mem(&lwip_stats.memp[i], memp_names[i]);
- }
-
-}
-#endif /* LWIP_STATS_DISPLAY */
-#endif /* LWIP_STATS */
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/sys.c b/src/VBox/Devices/Network/lwip/src/core/sys.c
deleted file mode 100644
index 5ca4c7e..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/sys.c
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/sys.h"
-#include "lwip/opt.h"
-#include "lwip/def.h"
-#include "lwip/memp.h"
-
-#if (NO_SYS == 0)
-
-struct sswt_cb
-{
- s16_t timeflag;
- sys_sem_t *psem;
-};
-
-
-
-void
-sys_mbox_fetch(sys_mbox_t mbox, void **msg)
-{
- u32_t time;
- struct sys_timeouts *timeouts;
- struct sys_timeo *tmptimeout;
- sys_timeout_handler h;
- void *arg;
-
-
- again:
- timeouts = sys_arch_timeouts();
-
- if (!timeouts || !timeouts->next) {
- sys_arch_mbox_fetch(mbox, msg, 0);
- } else {
- if (timeouts->next->time > 0) {
- time = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);
- } else {
- time = SYS_ARCH_TIMEOUT;
- }
-
- if (time == SYS_ARCH_TIMEOUT) {
- /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
- could be fetched. We should now call the timeout handler and
- deallocate the memory allocated for the timeout. */
- tmptimeout = timeouts->next;
- timeouts->next = tmptimeout->next;
- h = tmptimeout->h;
- arg = tmptimeout->arg;
- memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
- if (h != NULL) {
- LWIP_DEBUGF(SYS_DEBUG, ("smf calling h=%p(%p)\n", (void *)(uintptr_t)h, (void *)arg));
- h(arg);
- }
-
- /* We try again to fetch a message from the mbox. */
- goto again;
- } else {
- /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
- occured. The time variable is set to the number of
- milliseconds we waited for the message. */
- if (time <= timeouts->next->time) {
- timeouts->next->time -= time;
- } else {
- timeouts->next->time = 0;
- }
- }
-
- }
-}
-
-void
-sys_sem_wait(sys_sem_t sem)
-{
- u32_t time;
- struct sys_timeouts *timeouts;
- struct sys_timeo *tmptimeout;
- sys_timeout_handler h;
- void *arg;
-
- /* while (sys_arch_sem_wait(sem, 1000) == 0);
- return;*/
-
- again:
-
- timeouts = sys_arch_timeouts();
-
- if (!timeouts || !timeouts->next) {
- sys_arch_sem_wait(sem, 0);
- } else {
- if (timeouts->next->time > 0) {
- time = sys_arch_sem_wait(sem, timeouts->next->time);
- } else {
- time = SYS_ARCH_TIMEOUT;
- }
-
- if (time == SYS_ARCH_TIMEOUT) {
- /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
- could be fetched. We should now call the timeout handler and
- deallocate the memory allocated for the timeout. */
- tmptimeout = timeouts->next;
- timeouts->next = tmptimeout->next;
- h = tmptimeout->h;
- arg = tmptimeout->arg;
- memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
- if (h != NULL) {
- LWIP_DEBUGF(SYS_DEBUG, ("ssw h=%p(%p)\n", (void *)(uintptr_t)h, (void *)arg));
- h(arg);
- }
-
-
- /* We try again to fetch a message from the mbox. */
- goto again;
- } else {
- /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
- occured. The time variable is set to the number of
- milliseconds we waited for the message. */
- if (time <= timeouts->next->time) {
- timeouts->next->time -= time;
- } else {
- timeouts->next->time = 0;
- }
- }
-
- }
-}
-
-void
-sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
-{
- struct sys_timeouts *timeouts;
- struct sys_timeo *timeout, *t;
-
- timeout = memp_malloc(MEMP_SYS_TIMEOUT);
- if (timeout == NULL) {
- return;
- }
- timeout->next = NULL;
- timeout->h = h;
- timeout->arg = arg;
- timeout->time = msecs;
-
- timeouts = sys_arch_timeouts();
-
- LWIP_DEBUGF(SYS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" h=%p arg=%p\n",
- (void *)timeout, msecs, (void *)(uintptr_t)h, (void *)arg));
-
- LWIP_ASSERT("sys_timeout: timeouts != NULL", timeouts != NULL);
-
- if (timeouts->next == NULL) {
- timeouts->next = timeout;
- return;
- }
-
- if (timeouts->next->time > msecs) {
- timeouts->next->time -= msecs;
- timeout->next = timeouts->next;
- timeouts->next = timeout;
- } else {
- for(t = timeouts->next; t != NULL; t = t->next) {
- timeout->time -= t->time;
- if (t->next == NULL || t->next->time > timeout->time) {
- if (t->next != NULL) {
- t->next->time -= timeout->time;
- }
- timeout->next = t->next;
- t->next = timeout;
- break;
- }
- }
- }
-
-}
-
-/* Go through timeout list (for this task only) and remove the first matching entry,
- even though the timeout has not triggered yet.
-*/
-
-void
-sys_untimeout(sys_timeout_handler h, void *arg)
-{
- struct sys_timeouts *timeouts;
- struct sys_timeo *prev_t, *t;
-
- timeouts = sys_arch_timeouts();
-
- if (timeouts->next == NULL)
- return;
-
- for (t = timeouts->next, prev_t = NULL; t != NULL; prev_t = t, t = t->next)
- {
- if ((t->h == h) && (t->arg == arg))
- {
- /* We have a match */
- /* Unlink from previous in list */
- if (prev_t == NULL)
- timeouts->next = t->next;
- else
- prev_t->next = t->next;
- /* If not the last one, add time of this one back to next */
- if (t->next != NULL)
- t->next->time += t->time;
- memp_free(MEMP_SYS_TIMEOUT, t);
- return;
- }
- }
- return;
-}
-
-
-
-
-
-static void
-sswt_handler(void *arg)
-{
- struct sswt_cb *sswt_cb = (struct sswt_cb *) arg;
-
- /* Timeout. Set flag to TRUE and signal semaphore */
- sswt_cb->timeflag = 1;
- sys_sem_signal(*(sswt_cb->psem));
-}
-
-/* Wait for a semaphore with timeout (specified in ms) */
-/* timeout = 0: wait forever */
-/* Returns 0 on timeout. 1 otherwise */
-
-int
-sys_sem_wait_timeout(sys_sem_t sem, u32_t timeout)
-{
- struct sswt_cb sswt_cb;
-
- sswt_cb.psem = &sem;
- sswt_cb.timeflag = 0;
-
- /* If timeout is zero, then just wait forever */
- if (timeout > 0)
- /* Create a timer and pass it the address of our flag */
- sys_timeout(timeout, sswt_handler, &sswt_cb);
- sys_sem_wait(sem);
- /* Was it a timeout? */
- if (sswt_cb.timeflag)
- {
- /* timeout */
- return 0;
- } else {
- /* Not a timeout. Remove timeout entry */
- sys_untimeout(sswt_handler, &sswt_cb);
- return 1;
- }
-
-}
-
-
-void
-sys_msleep(u32_t ms)
-{
- sys_sem_t delaysem = sys_sem_new(0);
-
- sys_sem_wait_timeout(delaysem, ms);
-
- sys_sem_free(delaysem);
-}
-
-
-#endif /* NO_SYS */
diff --git a/src/VBox/Devices/Network/lwip/src/core/tcp.c b/src/VBox/Devices/Network/lwip/src/core/tcp.c
deleted file mode 100644
index 89dfd24..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/tcp.c
+++ /dev/null
@@ -1,1182 +0,0 @@
-/**
- * @file
- *
- * Transmission Control Protocol for IP
- *
- * This file contains common functions for the TCP implementation, such as functinos
- * for manipulating the data structures and the TCP timer functions. TCP functions
- * related to input and output is found in tcp_in.c and tcp_out.c respectively.
- *
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include <string.h>
-
-#include "lwip/opt.h"
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/snmp.h"
-
-#include "lwip/tcp.h"
-#if LWIP_TCP
-
-/* Incremented every coarse grained timer shot (typically every 500 ms). */
-u32_t tcp_ticks;
-const u8_t tcp_backoff[13] =
- { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};
-
-/* The TCP PCB lists. */
-
-/** List of all TCP PCBs in LISTEN state */
-union tcp_listen_pcbs_t tcp_listen_pcbs;
-/** List of all TCP PCBs that are in a state in which
- * they accept or send data. */
-struct tcp_pcb *tcp_active_pcbs;
-/** List of all TCP PCBs in TIME-WAIT state */
-struct tcp_pcb *tcp_tw_pcbs;
-
-struct tcp_pcb *tcp_tmp_pcb;
-
-static u8_t tcp_timer;
-static u16_t tcp_new_port(void);
-
-/**
- * Initializes the TCP layer.
- */
-void
-tcp_init(void)
-{
- /* Clear globals. */
- tcp_listen_pcbs.listen_pcbs = NULL;
- tcp_active_pcbs = NULL;
- tcp_tw_pcbs = NULL;
- tcp_tmp_pcb = NULL;
-
- /* initialize timer */
- tcp_ticks = 0;
- tcp_timer = 0;
-
-}
-
-/**
- * Called periodically to dispatch TCP timers.
- *
- */
-void
-tcp_tmr(void)
-{
- /* Call tcp_fasttmr() every 250 ms */
- tcp_fasttmr();
-
- if (++tcp_timer & 1) {
- /* Call tcp_tmr() every 500 ms, i.e., every other timer
- tcp_tmr() is called. */
- tcp_slowtmr();
- }
-}
-
-/**
- * Closes the connection held by the PCB.
- *
- */
-err_t
-tcp_close(struct tcp_pcb *pcb)
-{
- err_t err;
-
-#if TCP_DEBUG
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in "));
- tcp_debug_print_state(pcb->state);
-#endif /* TCP_DEBUG */
-
- switch (pcb->state) {
- case CLOSED:
- /* Closing a pcb in the CLOSED state might seem erroneous,
- * however, it is in this state once allocated and as yet unused
- * and the user needs some way to free it should the need arise.
- * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)
- * or for a pcb that has been used and then entered the CLOSED state
- * is erroneous, but this should never happen as the pcb has in those cases
- * been freed, and so any remaining handles are bogus. */
- err = ERR_OK;
- memp_free(MEMP_TCP_PCB, pcb);
- pcb = NULL;
- break;
- case LISTEN:
- err = ERR_OK;
- tcp_pcb_remove((struct tcp_pcb **)&tcp_listen_pcbs.pcbs, pcb);
- memp_free(MEMP_TCP_PCB_LISTEN, pcb);
- pcb = NULL;
- break;
- case SYN_SENT:
- err = ERR_OK;
- tcp_pcb_remove(&tcp_active_pcbs, pcb);
- memp_free(MEMP_TCP_PCB, pcb);
- pcb = NULL;
- snmp_inc_tcpattemptfails();
- break;
- case SYN_RCVD:
- err = tcp_send_ctrl(pcb, TCP_FIN);
- if (err == ERR_OK) {
- snmp_inc_tcpattemptfails();
- pcb->state = FIN_WAIT_1;
- }
- break;
- case ESTABLISHED:
- err = tcp_send_ctrl(pcb, TCP_FIN);
- if (err == ERR_OK) {
- snmp_inc_tcpestabresets();
- pcb->state = FIN_WAIT_1;
- }
- break;
- case CLOSE_WAIT:
- err = tcp_send_ctrl(pcb, TCP_FIN);
- if (err == ERR_OK) {
- snmp_inc_tcpestabresets();
- pcb->state = LAST_ACK;
- }
- break;
- default:
- /* Has already been closed, do nothing. */
- err = ERR_OK;
- pcb = NULL;
- break;
- }
-
- if (pcb != NULL && err == ERR_OK) {
- err = tcp_output(pcb);
- }
- return err;
-}
-
-/**
- * Aborts a connection by sending a RST to the remote host and deletes
- * the local protocol control block. This is done when a connection is
- * killed because of shortage of memory.
- *
- */
-void
-tcp_abort(struct tcp_pcb *pcb)
-{
- u32_t seqno, ackno;
- u16_t remote_port, local_port;
- struct ip_addr remote_ip, local_ip;
-#if LWIP_CALLBACK_API
- void (* errf)(void *arg, err_t err);
-#endif /* LWIP_CALLBACK_API */
- void *errf_arg;
-
-
- /* Figure out on which TCP PCB list we are, and remove us. If we
- are in an active state, call the receive function associated with
- the PCB with a NULL argument, and send an RST to the remote end. */
- if (pcb->state == TIME_WAIT) {
- tcp_pcb_remove(&tcp_tw_pcbs, pcb);
- memp_free(MEMP_TCP_PCB, pcb);
- } else {
- seqno = pcb->snd_nxt;
- ackno = pcb->rcv_nxt;
- ip_addr_set(&local_ip, &(pcb->local_ip));
- ip_addr_set(&remote_ip, &(pcb->remote_ip));
- local_port = pcb->local_port;
- remote_port = pcb->remote_port;
-#if LWIP_CALLBACK_API
- errf = pcb->errf;
-#endif /* LWIP_CALLBACK_API */
- errf_arg = pcb->callback_arg;
- tcp_pcb_remove(&tcp_active_pcbs, pcb);
- if (pcb->unacked != NULL) {
- tcp_segs_free(pcb->unacked);
- }
- if (pcb->unsent != NULL) {
- tcp_segs_free(pcb->unsent);
- }
-#if TCP_QUEUE_OOSEQ
- if (pcb->ooseq != NULL) {
- tcp_segs_free(pcb->ooseq);
- }
-#endif /* TCP_QUEUE_OOSEQ */
- memp_free(MEMP_TCP_PCB, pcb);
- TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT);
- LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abort: sending RST\n"));
- tcp_rst(seqno, ackno, &local_ip, &remote_ip, local_port, remote_port);
- }
-}
-
-/**
- * Binds the connection to a local portnumber and IP address. If the
- * IP address is not given (i.e., ipaddr == NULL), the IP address of
- * the outgoing network interface is used instead.
- *
- */
-
-err_t
-tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
-{
- struct tcp_pcb *cpcb;
-
- if (port == 0) {
- port = tcp_new_port();
- }
- /* Check if the address already is in use. */
- for(cpcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs;
- cpcb != NULL; cpcb = cpcb->next) {
- if (cpcb->local_port == port) {
- if (ip_addr_isany(&(cpcb->local_ip)) ||
- ip_addr_isany(ipaddr) ||
- ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
- return ERR_USE;
- }
- }
- }
- for(cpcb = tcp_active_pcbs;
- cpcb != NULL; cpcb = cpcb->next) {
- if (cpcb->local_port == port) {
- if (ip_addr_isany(&(cpcb->local_ip)) ||
- ip_addr_isany(ipaddr) ||
- ip_addr_cmp(&(cpcb->local_ip), ipaddr)) {
- return ERR_USE;
- }
- }
- }
-
- if (!ip_addr_isany(ipaddr)) {
- pcb->local_ip = *ipaddr;
- }
- pcb->local_port = port;
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port));
- return ERR_OK;
-}
-#if LWIP_CALLBACK_API
-static err_t
-tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err)
-{
- (void)arg;
- (void)pcb;
- (void)err;
-
- return ERR_ABRT;
-}
-#endif /* LWIP_CALLBACK_API */
-
-/**
- * Set the state of the connection to be LISTEN, which means that it
- * is able to accept incoming connections. The protocol control block
- * is reallocated in order to consume less memory. Setting the
- * connection to LISTEN is an irreversible process.
- *
- */
-struct tcp_pcb *
-tcp_listen(struct tcp_pcb *pcb)
-{
- struct tcp_pcb_listen *lpcb;
-
- /* already listening? */
- if (pcb->state == LISTEN) {
- return pcb;
- }
- lpcb = memp_malloc(MEMP_TCP_PCB_LISTEN);
- if (lpcb == NULL) {
- return NULL;
- }
- lpcb->callback_arg = pcb->callback_arg;
- lpcb->local_port = pcb->local_port;
- lpcb->state = LISTEN;
- lpcb->so_options = pcb->so_options;
- lpcb->so_options |= SOF_ACCEPTCONN;
- lpcb->ttl = pcb->ttl;
- lpcb->tos = pcb->tos;
- ip_addr_set(&lpcb->local_ip, &pcb->local_ip);
- memp_free(MEMP_TCP_PCB, pcb);
-#if LWIP_CALLBACK_API
- lpcb->accept = tcp_accept_null;
-#endif /* LWIP_CALLBACK_API */
- TCP_REG(&tcp_listen_pcbs.listen_pcbs, lpcb);
- return (struct tcp_pcb *)lpcb;
-}
-
-/**
- * This function should be called by the application when it has
- * processed the data. The purpose is to advertise a larger window
- * when the data has been processed.
- *
- */
-void
-tcp_recved(struct tcp_pcb *pcb, u16_t len)
-{
- if ((u32_t)pcb->rcv_wnd + len > TCP_WND) {
- pcb->rcv_wnd = TCP_WND;
- } else {
- pcb->rcv_wnd += len;
- }
- if (!(pcb->flags & TF_ACK_DELAY) &&
- !(pcb->flags & TF_ACK_NOW)) {
- /*
- * We send an ACK here (if one is not already pending, hence
- * the above tests) as tcp_recved() implies that the application
- * has processed some data, and so we can open the receiver's
- * window to allow more to be transmitted. This could result in
- * two ACKs being sent for each received packet in some limited cases
- * (where the application is only receiving data, and is slow to
- * process it) but it is necessary to guarantee that the sender can
- * continue to transmit.
- */
- tcp_ack(pcb);
- }
- else if (pcb->flags & TF_ACK_DELAY && pcb->rcv_wnd >= TCP_WND/2) {
- /* If we can send a window update such that there is a full
- * segment available in the window, do so now. This is sort of
- * nagle-like in its goals, and tries to hit a compromise between
- * sending acks each time the window is updated, and only sending
- * window updates when a timer expires. The "threshold" used
- * above (currently TCP_WND/2) can be tuned to be more or less
- * aggressive */
- tcp_ack_now(pcb);
- }
-
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n",
- len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd));
-}
-
-/**
- * A nastly hack featuring 'goto' statements that allocates a
- * new TCP local port.
- */
-static u16_t
-tcp_new_port(void)
-{
- struct tcp_pcb *pcb;
-#ifndef TCP_LOCAL_PORT_RANGE_START
-#define TCP_LOCAL_PORT_RANGE_START 4096
-#define TCP_LOCAL_PORT_RANGE_END 0x7fff
-#endif
- static u16_t port = TCP_LOCAL_PORT_RANGE_START;
-
- again:
- if (++port > TCP_LOCAL_PORT_RANGE_END) {
- port = TCP_LOCAL_PORT_RANGE_START;
- }
-
- for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
- if (pcb->local_port == port) {
- goto again;
- }
- }
- for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
- if (pcb->local_port == port) {
- goto again;
- }
- }
- for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
- if (pcb->local_port == port) {
- goto again;
- }
- }
- return port;
-}
-
-/**
- * Connects to another host. The function given as the "connected"
- * argument will be called when the connection has been established.
- *
- */
-err_t
-tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port,
- err_t (* connected)(void *arg, struct tcp_pcb *tpcb, err_t err))
-{
- u32_t optdata;
- err_t ret;
- u32_t iss;
-
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port));
- if (ipaddr != NULL) {
- pcb->remote_ip = *ipaddr;
- } else {
- return ERR_VAL;
- }
- pcb->remote_port = port;
- if (pcb->local_port == 0) {
- pcb->local_port = tcp_new_port();
- }
- iss = tcp_next_iss();
- pcb->rcv_nxt = 0;
- pcb->snd_nxt = iss;
- pcb->lastack = iss - 1;
- pcb->snd_lbb = iss - 1;
- pcb->rcv_wnd = TCP_WND;
- pcb->snd_wnd = TCP_WND;
- pcb->mss = TCP_MSS;
- pcb->cwnd = 1;
- pcb->ssthresh = pcb->mss * 10;
- pcb->state = SYN_SENT;
-#if LWIP_CALLBACK_API
- pcb->connected = connected;
-#endif /* LWIP_CALLBACK_API */
- TCP_REG(&tcp_active_pcbs, pcb);
-
- snmp_inc_tcpactiveopens();
-
- /* Build an MSS option */
- optdata = htonl(((u32_t)2 << 24) |
- ((u32_t)4 << 16) |
- (((u32_t)pcb->mss / 256) << 8) |
- (pcb->mss & 255));
-
- ret = tcp_enqueue(pcb, NULL, 0, TCP_SYN, 0, (u8_t *)&optdata, 4);
- if (ret == ERR_OK) {
- tcp_output(pcb);
- }
- return ret;
-}
-
-/**
- * Called every 500 ms and implements the retransmission timer and the timer that
- * removes PCBs that have been in TIME-WAIT for enough time. It also increments
- * various timers such as the inactivity timer in each PCB.
- */
-void
-tcp_slowtmr(void)
-{
- struct tcp_pcb *pcb, *pcb2, *prev;
- u32_t eff_wnd;
- u8_t pcb_remove; /* flag if a PCB should be removed */
- err_t err;
-
- err = ERR_OK;
-
- ++tcp_ticks;
-
- /* Steps through all of the active PCBs. */
- prev = NULL;
- pcb = tcp_active_pcbs;
- if (pcb == NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n"));
- }
- while (pcb != NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n"));
- LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED);
- LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN);
- LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT);
-
- pcb_remove = 0;
-
- if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) {
- ++pcb_remove;
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n"));
- }
- else if (pcb->nrtx == TCP_MAXRTX) {
- ++pcb_remove;
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n"));
- } else {
- ++pcb->rtime;
- if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {
-
- /* Time for a retransmission. */
- LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"U16_F" pcb->rto %"U16_F"\n",
- pcb->rtime, pcb->rto));
-
- /* Double retransmission time-out unless we are trying to
- * connect to somebody (i.e., we are in SYN_SENT). */
- if (pcb->state != SYN_SENT) {
- pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx];
- }
- /* Reduce congestion window and ssthresh. */
- eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);
- pcb->ssthresh = eff_wnd >> 1;
- if (pcb->ssthresh < pcb->mss) {
- pcb->ssthresh = pcb->mss * 2;
- }
- pcb->cwnd = pcb->mss;
- LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"U16_F" ssthresh %"U16_F"\n",
- pcb->cwnd, pcb->ssthresh));
-
- /* The following needs to be called AFTER cwnd is set to one mss - STJ */
- tcp_rexmit_rto(pcb);
- }
- }
- /* Check if this PCB has stayed too long in FIN-WAIT-2 */
- if (pcb->state == FIN_WAIT_2) {
- if ((u32_t)(tcp_ticks - pcb->tmr) >
- TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {
- ++pcb_remove;
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n"));
- }
- }
-
- /* Check if KEEPALIVE should be sent */
- if((pcb->so_options & SOF_KEEPALIVE) && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {
- if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keepalive + TCP_MAXIDLE) / TCP_SLOW_INTERVAL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n",
- ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip),
- ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip)));
-
- tcp_abort(pcb);
- }
- else if((u32_t)(tcp_ticks - pcb->tmr) > (pcb->keepalive + pcb->keep_cnt * TCP_KEEPINTVL) / TCP_SLOW_INTERVAL) {
- tcp_keepalive(pcb);
- pcb->keep_cnt++;
- }
- }
-
- /* If this PCB has queued out of sequence data, but has been
- inactive for too long, will drop the data (it will eventually
- be retransmitted). */
-#if TCP_QUEUE_OOSEQ
- if (pcb->ooseq != NULL &&
- (u32_t)tcp_ticks - pcb->tmr >=
- pcb->rto * TCP_OOSEQ_TIMEOUT) {
- tcp_segs_free(pcb->ooseq);
- pcb->ooseq = NULL;
- LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n"));
- }
-#endif /* TCP_QUEUE_OOSEQ */
-
- /* Check if this PCB has stayed too long in SYN-RCVD */
- if (pcb->state == SYN_RCVD) {
- if ((u32_t)(tcp_ticks - pcb->tmr) >
- TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {
- ++pcb_remove;
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n"));
- }
- }
-
- /* Check if this PCB has stayed too long in LAST-ACK */
- if (pcb->state == LAST_ACK) {
- if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
- ++pcb_remove;
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n"));
- }
- }
-
- /* If the PCB should be removed, do it. */
- if (pcb_remove) {
- tcp_pcb_purge(pcb);
- /* Remove PCB from tcp_active_pcbs list. */
- if (prev != NULL) {
- LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs);
- prev->next = pcb->next;
- } else {
- /* This PCB was the first. */
- LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb);
- tcp_active_pcbs = pcb->next;
- }
-
- TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_ABRT);
-
- pcb2 = pcb->next;
- memp_free(MEMP_TCP_PCB, pcb);
- pcb = pcb2;
- } else {
-
- /* We check if we should poll the connection. */
- ++pcb->polltmr;
- if (pcb->polltmr >= pcb->pollinterval) {
- pcb->polltmr = 0;
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n"));
- TCP_EVENT_POLL(pcb, err);
- if (err == ERR_OK) {
- tcp_output(pcb);
- }
- }
-
- prev = pcb;
- pcb = pcb->next;
- }
- }
-
-
- /* Steps through all of the TIME-WAIT PCBs. */
- prev = NULL;
- pcb = tcp_tw_pcbs;
- while (pcb != NULL) {
- LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
- pcb_remove = 0;
-
- /* Check if this PCB has stayed long enough in TIME-WAIT */
- if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {
- ++pcb_remove;
- }
-
-
-
- /* If the PCB should be removed, do it. */
- if (pcb_remove) {
- tcp_pcb_purge(pcb);
- /* Remove PCB from tcp_tw_pcbs list. */
- if (prev != NULL) {
- LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs);
- prev->next = pcb->next;
- } else {
- /* This PCB was the first. */
- LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb);
- tcp_tw_pcbs = pcb->next;
- }
- pcb2 = pcb->next;
- memp_free(MEMP_TCP_PCB, pcb);
- pcb = pcb2;
- } else {
- prev = pcb;
- pcb = pcb->next;
- }
- }
-}
-
-/**
- * Is called every TCP_FAST_INTERVAL (250 ms) and sends delayed ACKs.
- */
-void
-tcp_fasttmr(void)
-{
- struct tcp_pcb *pcb;
-
- /* send delayed ACKs */
- for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
- if (pcb->flags & TF_ACK_DELAY) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n"));
- tcp_ack_now(pcb);
- pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
- }
- }
-}
-
-/**
- * Deallocates a list of TCP segments (tcp_seg structures).
- *
- */
-u8_t
-tcp_segs_free(struct tcp_seg *seg)
-{
- u8_t count = 0;
- struct tcp_seg *next;
- while (seg != NULL) {
- next = seg->next;
- count += tcp_seg_free(seg);
- seg = next;
- }
- return count;
-}
-
-/**
- * Frees a TCP segment.
- *
- */
-u8_t
-tcp_seg_free(struct tcp_seg *seg)
-{
- u8_t count = 0;
-
- if (seg != NULL) {
- if (seg->p != NULL) {
- count = pbuf_free(seg->p);
-#if TCP_DEBUG
- seg->p = NULL;
-#endif /* TCP_DEBUG */
- }
- memp_free(MEMP_TCP_SEG, seg);
- }
- return count;
-}
-
-/**
- * Sets the priority of a connection.
- *
- */
-void
-tcp_setprio(struct tcp_pcb *pcb, u8_t prio)
-{
- pcb->prio = prio;
-}
-#if TCP_QUEUE_OOSEQ
-
-/**
- * Returns a copy of the given TCP segment.
- *
- */
-struct tcp_seg *
-tcp_seg_copy(struct tcp_seg *seg)
-{
- struct tcp_seg *cseg;
-
- cseg = memp_malloc(MEMP_TCP_SEG);
- if (cseg == NULL) {
- return NULL;
- }
- memcpy((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg));
- pbuf_ref(cseg->p);
- return cseg;
-}
-#endif
-
-#if LWIP_CALLBACK_API
-static err_t
-tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)
-{
- arg = arg;
- if (p != NULL) {
- pbuf_free(p);
- } else if (err == ERR_OK) {
- return tcp_close(pcb);
- }
- return ERR_OK;
-}
-#endif /* LWIP_CALLBACK_API */
-
-static void
-tcp_kill_prio(u8_t prio)
-{
- struct tcp_pcb *pcb, *inactive;
- u32_t inactivity;
- u8_t mprio;
-
-
- mprio = TCP_PRIO_MAX;
-
- /* We kill the oldest active connection that has lower priority than
- prio. */
- inactivity = 0;
- inactive = NULL;
- for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
- if (pcb->prio <= prio &&
- pcb->prio <= mprio &&
- (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
- inactivity = tcp_ticks - pcb->tmr;
- inactive = pcb;
- mprio = pcb->prio;
- }
- }
- if (inactive != NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n",
- (void *)inactive, inactivity));
- tcp_abort(inactive);
- }
-}
-
-
-static void
-tcp_kill_timewait(void)
-{
- struct tcp_pcb *pcb, *inactive;
- u32_t inactivity;
-
- inactivity = 0;
- inactive = NULL;
- for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
- if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {
- inactivity = tcp_ticks - pcb->tmr;
- inactive = pcb;
- }
- }
- if (inactive != NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n",
- (void *)inactive, inactivity));
- tcp_abort(inactive);
- }
-}
-
-
-
-struct tcp_pcb *
-tcp_alloc(u8_t prio)
-{
- struct tcp_pcb *pcb;
- u32_t iss;
-
- pcb = memp_malloc(MEMP_TCP_PCB);
- if (pcb == NULL) {
- /* Try killing oldest connection in TIME-WAIT. */
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n"));
- tcp_kill_timewait();
- pcb = memp_malloc(MEMP_TCP_PCB);
- if (pcb == NULL) {
- tcp_kill_prio(prio);
- pcb = memp_malloc(MEMP_TCP_PCB);
- }
- }
- if (pcb != NULL) {
- memset(pcb, 0, sizeof(struct tcp_pcb));
- pcb->prio = TCP_PRIO_NORMAL;
- pcb->snd_buf = TCP_SND_BUF;
- pcb->snd_queuelen = 0;
- pcb->rcv_wnd = TCP_WND;
- pcb->tos = 0;
- pcb->ttl = TCP_TTL;
- pcb->mss = TCP_MSS;
- pcb->rto = 3000 / TCP_SLOW_INTERVAL;
- pcb->sa = 0;
- pcb->sv = 3000 / TCP_SLOW_INTERVAL;
- pcb->rtime = 0;
- pcb->cwnd = 1;
- iss = tcp_next_iss();
- pcb->snd_wl2 = iss;
- pcb->snd_nxt = iss;
- pcb->snd_max = iss;
- pcb->lastack = iss;
- pcb->snd_lbb = iss;
- pcb->tmr = tcp_ticks;
-
- pcb->polltmr = 0;
-
-#if LWIP_CALLBACK_API
- pcb->recv = tcp_recv_null;
-#endif /* LWIP_CALLBACK_API */
-
- /* Init KEEPALIVE timer */
- pcb->keepalive = TCP_KEEPDEFAULT;
- pcb->keep_cnt = 0;
- }
- return pcb;
-}
-
-/**
- * Creates a new TCP protocol control block but doesn't place it on
- * any of the TCP PCB lists.
- *
- * @internal: Maybe there should be a idle TCP PCB list where these
- * PCBs are put on. We can then implement port reservation using
- * tcp_bind(). Currently, we lack this (BSD socket type of) feature.
- */
-
-struct tcp_pcb *
-tcp_new(void)
-{
- return tcp_alloc(TCP_PRIO_NORMAL);
-}
-
-/*
- * tcp_arg():
- *
- * Used to specify the argument that should be passed callback
- * functions.
- *
- */
-
-void
-tcp_arg(struct tcp_pcb *pcb, void *arg)
-{
- pcb->callback_arg = arg;
-}
-#if LWIP_CALLBACK_API
-
-/**
- * Used to specify the function that should be called when a TCP
- * connection receives data.
- *
- */
-void
-tcp_recv(struct tcp_pcb *pcb,
- err_t (* recv)(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err))
-{
- pcb->recv = recv;
-}
-
-/**
- * Used to specify the function that should be called when TCP data
- * has been successfully delivered to the remote host.
- *
- */
-
-void
-tcp_sent(struct tcp_pcb *pcb,
- err_t (* sent)(void *arg, struct tcp_pcb *tpcb, u16_t len))
-{
- pcb->sent = sent;
-}
-
-/**
- * Used to specify the function that should be called when a fatal error
- * has occured on the connection.
- *
- */
-void
-tcp_err(struct tcp_pcb *pcb,
- void (* errf)(void *arg, err_t err))
-{
- pcb->errf = errf;
-}
-
-/**
- * Used for specifying the function that should be called when a
- * LISTENing connection has been connected to another host.
- *
- */
-void
-tcp_accept(struct tcp_pcb *pcb,
- err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err))
-{
- ((struct tcp_pcb_listen *)pcb)->accept = accept;
-}
-#endif /* LWIP_CALLBACK_API */
-
-
-/**
- * Used to specify the function that should be called periodically
- * from TCP. The interval is specified in terms of the TCP coarse
- * timer interval, which is called twice a second.
- *
- */
-void
-tcp_poll(struct tcp_pcb *pcb,
- err_t (* poll)(void *arg, struct tcp_pcb *tpcb), u8_t interval)
-{
-#if LWIP_CALLBACK_API
- pcb->poll = poll;
-#endif /* LWIP_CALLBACK_API */
- pcb->pollinterval = interval;
-}
-
-/**
- * Purges a TCP PCB. Removes any buffered data and frees the buffer memory.
- *
- */
-void
-tcp_pcb_purge(struct tcp_pcb *pcb)
-{
- if (pcb->state != CLOSED &&
- pcb->state != TIME_WAIT &&
- pcb->state != LISTEN) {
-
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n"));
-
- if (pcb->unsent != NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sent\n"));
- }
- if (pcb->unacked != NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n"));
- }
-#if TCP_QUEUE_OOSEQ /* LW */
- if (pcb->ooseq != NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n"));
- }
-
- tcp_segs_free(pcb->ooseq);
- pcb->ooseq = NULL;
-#endif /* TCP_QUEUE_OOSEQ */
- tcp_segs_free(pcb->unsent);
- tcp_segs_free(pcb->unacked);
- pcb->unacked = pcb->unsent = NULL;
- }
-}
-
-/**
- * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.
- *
- */
-void
-tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)
-{
- TCP_RMV(pcblist, pcb);
-
- tcp_pcb_purge(pcb);
-
- /* if there is an outstanding delayed ACKs, send it */
- if (pcb->state != TIME_WAIT &&
- pcb->state != LISTEN &&
- pcb->flags & TF_ACK_DELAY) {
- pcb->flags |= TF_ACK_NOW;
- tcp_output(pcb);
- }
- pcb->state = CLOSED;
-
- LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane());
-}
-
-/**
- * Calculates a new initial sequence number for new connections.
- *
- */
-u32_t
-tcp_next_iss(void)
-{
- static u32_t iss = 6510;
-
- iss += tcp_ticks; /* XXX */
- return iss;
-}
-
-#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
-void
-tcp_debug_print(struct tcp_hdr *tcphdr)
-{
- LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n"));
- LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(TCP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n",
- ntohs(tcphdr->src), ntohs(tcphdr->dest)));
- LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (seq no)\n",
- ntohl(tcphdr->seqno)));
- LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (ack no)\n",
- ntohl(tcphdr->ackno)));
- LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" | |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"| %5"U16_F" | (hdrlen, flags (",
- TCPH_HDRLEN(tcphdr),
- TCPH_FLAGS(tcphdr) >> 5 & 1,
- TCPH_FLAGS(tcphdr) >> 4 & 1,
- TCPH_FLAGS(tcphdr) >> 3 & 1,
- TCPH_FLAGS(tcphdr) >> 2 & 1,
- TCPH_FLAGS(tcphdr) >> 1 & 1,
- TCPH_FLAGS(tcphdr) & 1,
- ntohs(tcphdr->wnd)));
- tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
- LWIP_DEBUGF(TCP_DEBUG, ("), win)\n"));
- LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(TCP_DEBUG, ("| 0x%04"X16_F" | %5"U16_F" | (chksum, urgp)\n",
- ntohs(tcphdr->chksum), ntohs(tcphdr->urgp)));
- LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n"));
-}
-
-void
-tcp_debug_print_state(enum tcp_state s)
-{
- LWIP_DEBUGF(TCP_DEBUG, ("State: "));
- switch (s) {
- case CLOSED:
- LWIP_DEBUGF(TCP_DEBUG, ("CLOSED\n"));
- break;
- case LISTEN:
- LWIP_DEBUGF(TCP_DEBUG, ("LISTEN\n"));
- break;
- case SYN_SENT:
- LWIP_DEBUGF(TCP_DEBUG, ("SYN_SENT\n"));
- break;
- case SYN_RCVD:
- LWIP_DEBUGF(TCP_DEBUG, ("SYN_RCVD\n"));
- break;
- case ESTABLISHED:
- LWIP_DEBUGF(TCP_DEBUG, ("ESTABLISHED\n"));
- break;
- case FIN_WAIT_1:
- LWIP_DEBUGF(TCP_DEBUG, ("FIN_WAIT_1\n"));
- break;
- case FIN_WAIT_2:
- LWIP_DEBUGF(TCP_DEBUG, ("FIN_WAIT_2\n"));
- break;
- case CLOSE_WAIT:
- LWIP_DEBUGF(TCP_DEBUG, ("CLOSE_WAIT\n"));
- break;
- case CLOSING:
- LWIP_DEBUGF(TCP_DEBUG, ("CLOSING\n"));
- break;
- case LAST_ACK:
- LWIP_DEBUGF(TCP_DEBUG, ("LAST_ACK\n"));
- break;
- case TIME_WAIT:
- LWIP_DEBUGF(TCP_DEBUG, ("TIME_WAIT\n"));
- break;
- }
-}
-
-void
-tcp_debug_print_flags(u8_t flags)
-{
- if (flags & TCP_FIN) {
- LWIP_DEBUGF(TCP_DEBUG, ("FIN "));
- }
- if (flags & TCP_SYN) {
- LWIP_DEBUGF(TCP_DEBUG, ("SYN "));
- }
- if (flags & TCP_RST) {
- LWIP_DEBUGF(TCP_DEBUG, ("RST "));
- }
- if (flags & TCP_PSH) {
- LWIP_DEBUGF(TCP_DEBUG, ("PSH "));
- }
- if (flags & TCP_ACK) {
- LWIP_DEBUGF(TCP_DEBUG, ("ACK "));
- }
- if (flags & TCP_URG) {
- LWIP_DEBUGF(TCP_DEBUG, ("URG "));
- }
- if (flags & TCP_ECE) {
- LWIP_DEBUGF(TCP_DEBUG, ("ECE "));
- }
- if (flags & TCP_CWR) {
- LWIP_DEBUGF(TCP_DEBUG, ("CWR "));
- }
-}
-
-void
-tcp_debug_print_pcbs(void)
-{
- struct tcp_pcb *pcb;
- LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n"));
- for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
- LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
- pcb->local_port, pcb->remote_port,
- pcb->snd_nxt, pcb->rcv_nxt));
- tcp_debug_print_state(pcb->state);
- }
- LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n"));
- for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
- LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
- pcb->local_port, pcb->remote_port,
- pcb->snd_nxt, pcb->rcv_nxt));
- tcp_debug_print_state(pcb->state);
- }
- LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n"));
- for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
- LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ",
- pcb->local_port, pcb->remote_port,
- pcb->snd_nxt, pcb->rcv_nxt));
- tcp_debug_print_state(pcb->state);
- }
-}
-
-s16_t
-tcp_pcbs_sane(void)
-{
- struct tcp_pcb *pcb;
- for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
- LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED);
- LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN);
- LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
- }
- for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
- LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
- }
- return 1;
-}
-#endif /* TCP_DEBUG */
-#endif /* LWIP_TCP */
-
-
-
-
-
-
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/tcp_in.c b/src/VBox/Devices/Network/lwip/src/core/tcp_in.c
deleted file mode 100644
index f6a3b87..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/tcp_in.c
+++ /dev/null
@@ -1,1209 +0,0 @@
-/**
- * @file
- *
- * Transmission Control Protocol, incoming traffic
- *
- * The input processing functions of the TCP layer.
- *
- * These functions are generally called in the order (ip_input() ->)
- * tcp_input() -> * tcp_process() -> tcp_receive() (-> application).
- *
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include "lwip/def.h"
-#include "lwip/opt.h"
-
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-
-#include "lwip/inet.h"
-#include "lwip/tcp.h"
-
-#include "lwip/stats.h"
-#include "arch/perf.h"
-#include "lwip/snmp.h"
-
-#if LWIP_TCP
-/* These variables are global to all functions involved in the input
- processing of TCP segments. They are set by the tcp_input()
- function. */
-static struct tcp_seg inseg;
-static struct tcp_hdr *tcphdr;
-static struct ip_hdr *iphdr;
-static u32_t seqno, ackno;
-static u8_t flags;
-static u16_t tcplen;
-
-static u8_t recv_flags;
-static struct pbuf *recv_data;
-
-struct tcp_pcb *tcp_input_pcb;
-
-/* Forward declarations. */
-static err_t tcp_process(struct tcp_pcb *pcb);
-static u8_t tcp_receive(struct tcp_pcb *pcb);
-static void tcp_parseopt(struct tcp_pcb *pcb);
-
-static err_t tcp_listen_input(struct tcp_pcb_listen *pcb);
-static err_t tcp_timewait_input(struct tcp_pcb *pcb);
-
-/* tcp_input:
- *
- * The initial input processing of TCP. It verifies the TCP header, demultiplexes
- * the segment between the PCBs and passes it on to tcp_process(), which implements
- * the TCP finite state machine. This function is called by the IP layer (in
- * ip_input()).
- */
-
-void
-tcp_input(struct pbuf *p, struct netif *inp)
-{
- struct tcp_pcb *pcb, *prev;
- struct tcp_pcb_listen *lpcb;
- u8_t hdrlen;
- err_t err;
-
- PERF_START;
-
- TCP_STATS_INC(tcp.recv);
- snmp_inc_tcpinsegs();
-
- iphdr = p->payload;
- tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4);
-
-#if TCP_INPUT_DEBUG
- tcp_debug_print(tcphdr);
-#endif
-
- /* remove header from payload */
- if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) {
- /* drop short packets */
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet (%"U16_F" bytes) discarded\n", p->tot_len));
- TCP_STATS_INC(tcp.lenerr);
- TCP_STATS_INC(tcp.drop);
- pbuf_free(p);
- return;
- }
-
- /* Don't even process incoming broadcasts/multicasts. */
- if (ip_addr_isbroadcast(&(iphdr->dest), inp) ||
- ip_addr_ismulticast(&(iphdr->dest))) {
- snmp_inc_tcpinerrs();
- pbuf_free(p);
- return;
- }
-
-#if CHECKSUM_CHECK_TCP
- /* Verify TCP checksum. */
- if (inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src),
- (struct ip_addr *)&(iphdr->dest),
- IP_PROTO_TCP, p->tot_len) != 0) {
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n",
- inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src), (struct ip_addr *)&(iphdr->dest),
- IP_PROTO_TCP, p->tot_len)));
-#if TCP_DEBUG
- tcp_debug_print(tcphdr);
-#endif /* TCP_DEBUG */
- TCP_STATS_INC(tcp.chkerr);
- TCP_STATS_INC(tcp.drop);
- snmp_inc_tcpinerrs();
- pbuf_free(p);
- return;
- }
-#endif
-
- /* Move the payload pointer in the pbuf so that it points to the
- TCP data instead of the TCP header. */
- hdrlen = TCPH_HDRLEN(tcphdr);
- pbuf_header(p, -(hdrlen * 4));
-
- /* Convert fields in TCP header to host byte order. */
- tcphdr->src = ntohs(tcphdr->src);
- tcphdr->dest = ntohs(tcphdr->dest);
- seqno = tcphdr->seqno = ntohl(tcphdr->seqno);
- ackno = tcphdr->ackno = ntohl(tcphdr->ackno);
- tcphdr->wnd = ntohs(tcphdr->wnd);
-
- flags = TCPH_FLAGS(tcphdr) & TCP_FLAGS;
- tcplen = p->tot_len + ((flags & TCP_FIN || flags & TCP_SYN)? 1: 0);
-
- /* Demultiplex an incoming segment. First, we check if it is destined
- for an active connection. */
- prev = NULL;
-
-
- for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
- LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED);
- LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT);
- LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN);
- if (pcb->remote_port == tcphdr->src &&
- pcb->local_port == tcphdr->dest &&
- ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) &&
- ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) {
-
- /* Move this PCB to the front of the list so that subsequent
- lookups will be faster (we exploit locality in TCP segment
- arrivals). */
- LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb);
- if (prev != NULL) {
- prev->next = pcb->next;
- pcb->next = tcp_active_pcbs;
- tcp_active_pcbs = pcb;
- }
- LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb);
- break;
- }
- prev = pcb;
- }
-
- if (pcb == NULL) {
- /* If it did not go to an active connection, we check the connections
- in the TIME-WAIT state. */
- for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
- LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT);
- if (pcb->remote_port == tcphdr->src &&
- pcb->local_port == tcphdr->dest &&
- ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)) &&
- ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest))) {
- /* We don't really care enough to move this PCB to the front
- of the list since we are not very likely to receive that
- many segments for connections in TIME-WAIT. */
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n"));
- tcp_timewait_input(pcb);
- pbuf_free(p);
- return;
- }
- }
-
- /* Finally, if we still did not get a match, we check all PCBs that
- are LISTENing for incoming connections. */
- prev = NULL;
- for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {
- if ((ip_addr_isany(&(lpcb->local_ip)) ||
- ip_addr_cmp(&(lpcb->local_ip), &(iphdr->dest))) &&
- lpcb->local_port == tcphdr->dest) {
- /* Move this PCB to the front of the list so that subsequent
- lookups will be faster (we exploit locality in TCP segment
- arrivals). */
- if (prev != NULL) {
- ((struct tcp_pcb_listen *)prev)->next = lpcb->next;
- /* our successor is the remainder of the listening list */
- lpcb->next = tcp_listen_pcbs.listen_pcbs;
- /* put this listening pcb at the head of the listening list */
- tcp_listen_pcbs.listen_pcbs = lpcb;
- }
-
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n"));
- tcp_listen_input(lpcb);
- pbuf_free(p);
- return;
- }
- prev = (struct tcp_pcb *)lpcb;
- }
- }
-
-#if TCP_INPUT_DEBUG
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags "));
- tcp_debug_print_flags(TCPH_FLAGS(tcphdr));
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n"));
-#endif /* TCP_INPUT_DEBUG */
-
-
- if (pcb != NULL) {
- /* The incoming segment belongs to a connection. */
-#if TCP_INPUT_DEBUG
-#if TCP_DEBUG
- tcp_debug_print_state(pcb->state);
-#endif /* TCP_DEBUG */
-#endif /* TCP_INPUT_DEBUG */
-
- /* Set up a tcp_seg structure. */
- inseg.next = NULL;
- inseg.len = p->tot_len;
- inseg.dataptr = p->payload;
- inseg.p = p;
- inseg.tcphdr = tcphdr;
-
- recv_data = NULL;
- recv_flags = 0;
-
- tcp_input_pcb = pcb;
- err = tcp_process(pcb);
- tcp_input_pcb = NULL;
- /* A return value of ERR_ABRT means that tcp_abort() was called
- and that the pcb has been freed. If so, we don't do anything. */
- if (err != ERR_ABRT) {
- if (recv_flags & TF_RESET) {
- /* TF_RESET means that the connection was reset by the other
- end. We then call the error callback to inform the
- application that the connection is dead before we
- deallocate the PCB. */
- TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST);
- tcp_pcb_remove(&tcp_active_pcbs, pcb);
- memp_free(MEMP_TCP_PCB, pcb);
- } else if (recv_flags & TF_CLOSED) {
- /* The connection has been closed and we will deallocate the
- PCB. */
- tcp_pcb_remove(&tcp_active_pcbs, pcb);
- memp_free(MEMP_TCP_PCB, pcb);
- } else {
- err = ERR_OK;
- /* If the application has registered a "sent" function to be
- called when new send buffer space is available, we call it
- now. */
- if (pcb->acked > 0) {
- TCP_EVENT_SENT(pcb, pcb->acked, err);
- }
-
- if (recv_data != NULL) {
- /* Notify application that data has been received. */
- TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);
- }
-
- /* If a FIN segment was received, we call the callback
- function with a NULL buffer to indicate EOF. */
- if (recv_flags & TF_GOT_FIN) {
- TCP_EVENT_RECV(pcb, NULL, ERR_OK, err);
- }
- /* If there were no errors, we try to send something out. */
- if (err == ERR_OK) {
- tcp_output(pcb);
- }
- }
- }
-
-
- /* give up our reference to inseg.p */
- if (inseg.p != NULL)
- {
- pbuf_free(inseg.p);
- inseg.p = NULL;
- }
-#if TCP_INPUT_DEBUG
-#if TCP_DEBUG
- tcp_debug_print_state(pcb->state);
-#endif /* TCP_DEBUG */
-#endif /* TCP_INPUT_DEBUG */
-
- } else {
-
- /* If no matching PCB was found, send a TCP RST (reset) to the
- sender. */
- LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n"));
- if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {
- TCP_STATS_INC(tcp.proterr);
- TCP_STATS_INC(tcp.drop);
- tcp_rst(ackno, seqno + tcplen,
- &(iphdr->dest), &(iphdr->src),
- tcphdr->dest, tcphdr->src);
- }
- pbuf_free(p);
- }
-
- LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane());
- PERF_STOP("tcp_input");
-}
-
-/* tcp_listen_input():
- *
- * Called by tcp_input() when a segment arrives for a listening
- * connection.
- */
-
-static err_t
-tcp_listen_input(struct tcp_pcb_listen *pcb)
-{
- struct tcp_pcb *npcb;
- u32_t optdata;
-
- /* In the LISTEN state, we check for incoming SYN segments,
- creates a new PCB, and responds with a SYN|ACK. */
- if (flags & TCP_ACK) {
- /* For incoming segments with the ACK flag set, respond with a
- RST. */
- LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n"));
- tcp_rst(ackno + 1, seqno + tcplen,
- &(iphdr->dest), &(iphdr->src),
- tcphdr->dest, tcphdr->src);
- } else if (flags & TCP_SYN) {
- LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest));
- npcb = tcp_alloc(pcb->prio);
- /* If a new PCB could not be created (probably due to lack of memory),
- we don't do anything, but rely on the sender will retransmit the
- SYN at a time when we have more memory available. */
- if (npcb == NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: could not allocate PCB\n"));
- TCP_STATS_INC(tcp.memerr);
- return ERR_MEM;
- }
- /* Set up the new PCB. */
- ip_addr_set(&(npcb->local_ip), &(iphdr->dest));
- npcb->local_port = pcb->local_port;
- ip_addr_set(&(npcb->remote_ip), &(iphdr->src));
- npcb->remote_port = tcphdr->src;
- npcb->state = SYN_RCVD;
- npcb->rcv_nxt = seqno + 1;
- npcb->snd_wnd = tcphdr->wnd;
- npcb->ssthresh = npcb->snd_wnd;
- npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */
- npcb->callback_arg = pcb->callback_arg;
-#if LWIP_CALLBACK_API
- npcb->accept = pcb->accept;
-#endif /* LWIP_CALLBACK_API */
- /* inherit socket options */
- npcb->so_options = pcb->so_options & (SOF_DEBUG|SOF_DONTROUTE|SOF_KEEPALIVE|SOF_OOBINLINE|SOF_LINGER);
- /* Register the new PCB so that we can begin receiving segments
- for it. */
- TCP_REG(&tcp_active_pcbs, npcb);
-
- /* Parse any options in the SYN. */
- tcp_parseopt(npcb);
-
- snmp_inc_tcppassiveopens();
-
- /* Build an MSS option. */
- optdata = htonl(((u32_t)2 << 24) |
- ((u32_t)4 << 16) |
- (((u32_t)npcb->mss / 256) << 8) |
- (npcb->mss & 255));
- /* Send a SYN|ACK together with the MSS option. */
- tcp_enqueue(npcb, NULL, 0, TCP_SYN | TCP_ACK, 0, (u8_t *)&optdata, 4);
- return tcp_output(npcb);
- }
- return ERR_OK;
-}
-
-/* tcp_timewait_input():
- *
- * Called by tcp_input() when a segment arrives for a connection in
- * TIME_WAIT.
- */
-
-static err_t
-tcp_timewait_input(struct tcp_pcb *pcb)
-{
- if (TCP_SEQ_GT(seqno + tcplen, pcb->rcv_nxt)) {
- pcb->rcv_nxt = seqno + tcplen;
- }
- if (tcplen > 0) {
- tcp_ack_now(pcb);
- }
- return tcp_output(pcb);
-}
-
-/* tcp_process
- *
- * Implements the TCP state machine. Called by tcp_input. In some
- * states tcp_receive() is called to receive data. The tcp_seg
- * argument will be freed by the caller (tcp_input()) unless the
- * recv_data pointer in the pcb is set.
- */
-
-static err_t
-tcp_process(struct tcp_pcb *pcb)
-{
- struct tcp_seg *rseg;
- u8_t acceptable = 0;
- err_t err;
- u8_t accepted_inseq;
-
- err = ERR_OK;
-
- /* Process incoming RST segments. */
- if (flags & TCP_RST) {
- /* First, determine if the reset is acceptable. */
- if (pcb->state == SYN_SENT) {
- if (ackno == pcb->snd_nxt) {
- acceptable = 1;
- }
- } else {
- /*if (TCP_SEQ_GEQ(seqno, pcb->rcv_nxt) &&
- TCP_SEQ_LEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {
- */
- if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) {
- acceptable = 1;
- }
- }
-
- if (acceptable) {
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n"));
- LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED);
- recv_flags = TF_RESET;
- pcb->flags &= ~TF_ACK_DELAY;
- return ERR_RST;
- } else {
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
- seqno, pcb->rcv_nxt));
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n",
- seqno, pcb->rcv_nxt));
- return ERR_OK;
- }
- }
-
- /* Update the PCB (in)activity timer. */
- pcb->tmr = tcp_ticks;
- pcb->keep_cnt = 0;
-
- /* Do different things depending on the TCP state. */
- switch (pcb->state) {
- case SYN_SENT:
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno,
- pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno)));
- /* received SYN ACK with expected sequence number? */
- if ((flags & TCP_ACK) && (flags & TCP_SYN)
- && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) {
- pcb->snd_buf++;
- pcb->rcv_nxt = seqno + 1;
- pcb->lastack = ackno;
- pcb->snd_wnd = tcphdr->wnd;
- pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */
- pcb->state = ESTABLISHED;
- pcb->cwnd = pcb->mss;
- --pcb->snd_queuelen;
- LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen));
- rseg = pcb->unacked;
- pcb->unacked = rseg->next;
- tcp_seg_free(rseg);
-
- /* Parse any options in the SYNACK. */
- tcp_parseopt(pcb);
-
- /* Call the user specified function to call when sucessfully
- * connected. */
- TCP_EVENT_CONNECTED(pcb, ERR_OK, err);
- tcp_ack(pcb);
- }
- /* received ACK? possibly a half-open connection */
- else if (flags & TCP_ACK) {
- /* send a RST to bring the other side in a non-synchronized state. */
- tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src),
- tcphdr->dest, tcphdr->src);
- }
- break;
- case SYN_RCVD:
- if (flags & TCP_ACK &&
- !(flags & TCP_RST)) {
- /* expected ACK number? */
- if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {
- pcb->state = ESTABLISHED;
- LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
-#if LWIP_CALLBACK_API
- LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL);
-#endif
- /* Call the accept function. */
- TCP_EVENT_ACCEPT(pcb, ERR_OK, err);
- if (err != ERR_OK) {
- /* If the accept function returns with an error, we abort
- * the connection. */
- tcp_abort(pcb);
- return ERR_ABRT;
- }
- /* If there was any data contained within this ACK,
- * we'd better pass it on to the application as well. */
- tcp_receive(pcb);
- pcb->cwnd = pcb->mss;
- }
- /* incorrect ACK number */
- else {
- /* send RST */
- tcp_rst(ackno, seqno + tcplen, &(iphdr->dest), &(iphdr->src),
- tcphdr->dest, tcphdr->src);
- }
- }
- break;
- case CLOSE_WAIT:
- /* FALLTHROUGH */
- case ESTABLISHED:
- accepted_inseq = tcp_receive(pcb);
- if ((flags & TCP_FIN) && accepted_inseq) { /* passive close */
- tcp_ack_now(pcb);
- pcb->state = CLOSE_WAIT;
- }
- break;
- case FIN_WAIT_1:
- tcp_receive(pcb);
- if (flags & TCP_FIN) {
- if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
- LWIP_DEBUGF(TCP_DEBUG,
- ("TCP connection closed %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
- tcp_ack_now(pcb);
- tcp_pcb_purge(pcb);
- TCP_RMV(&tcp_active_pcbs, pcb);
- pcb->state = TIME_WAIT;
- TCP_REG(&tcp_tw_pcbs, pcb);
- } else {
- tcp_ack_now(pcb);
- pcb->state = CLOSING;
- }
- } else if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
- pcb->state = FIN_WAIT_2;
- }
- break;
- case FIN_WAIT_2:
- tcp_receive(pcb);
- if (flags & TCP_FIN) {
- LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
- tcp_ack_now(pcb);
- tcp_pcb_purge(pcb);
- TCP_RMV(&tcp_active_pcbs, pcb);
- pcb->state = TIME_WAIT;
- TCP_REG(&tcp_tw_pcbs, pcb);
- }
- break;
- case CLOSING:
- tcp_receive(pcb);
- if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
- LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
- tcp_ack_now(pcb);
- tcp_pcb_purge(pcb);
- TCP_RMV(&tcp_active_pcbs, pcb);
- pcb->state = TIME_WAIT;
- TCP_REG(&tcp_tw_pcbs, pcb);
- }
- break;
- case LAST_ACK:
- tcp_receive(pcb);
- if (flags & TCP_ACK && ackno == pcb->snd_nxt) {
- LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest));
- pcb->state = CLOSED;
- recv_flags = TF_CLOSED;
- }
- break;
- default:
- break;
- }
- return ERR_OK;
-}
-
-/* tcp_receive:
- *
- * Called by tcp_process. Checks if the given segment is an ACK for outstanding
- * data, and if so frees the memory of the buffered data. Next, is places the
- * segment on any of the receive queues (pcb->recved or pcb->ooseq). If the segment
- * is buffered, the pbuf is referenced by pbuf_ref so that it will not be freed until
- * i it has been removed from the buffer.
- *
- * If the incoming segment constitutes an ACK for a segment that was used for RTT
- * estimation, the RTT is estimated here as well.
- *
- * @return 1 if
- */
-
-static u8_t
-tcp_receive(struct tcp_pcb *pcb)
-{
- struct tcp_seg *next;
-#if TCP_QUEUE_OOSEQ
- struct tcp_seg *prev, *cseg;
-#endif
- struct pbuf *p;
- s32_t off;
- s16_t m;
- u32_t right_wnd_edge;
- u16_t new_tot_len;
- u8_t accepted_inseq = 0;
-
- if (flags & TCP_ACK) {
- right_wnd_edge = pcb->snd_wnd + pcb->snd_wl1;
-
- /* Update window. */
- if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||
- (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||
- (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) {
- pcb->snd_wnd = tcphdr->wnd;
- pcb->snd_wl1 = seqno;
- pcb->snd_wl2 = ackno;
- LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %"U32_F"\n", pcb->snd_wnd));
-#if TCP_WND_DEBUG
- } else {
- if (pcb->snd_wnd != tcphdr->wnd) {
- LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: no window update lastack %"U32_F" snd_max %"U32_F" ackno %"U32_F" wl1 %"U32_F" seqno %"U32_F" wl2 %"U32_F"\n",
- pcb->lastack, pcb->snd_max, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2));
- }
-#endif /* TCP_WND_DEBUG */
- }
-
- if (pcb->lastack == ackno) {
- pcb->acked = 0;
-
- if (pcb->snd_wl1 + pcb->snd_wnd == right_wnd_edge){
- ++pcb->dupacks;
- if (pcb->dupacks >= 3 && pcb->unacked != NULL) {
- if (!(pcb->flags & TF_INFR)) {
- /* This is fast retransmit. Retransmit the first unacked segment. */
- LWIP_DEBUGF(TCP_FR_DEBUG, ("tcp_receive: dupacks %"U16_F" (%"U32_F"), fast retransmit %"U32_F"\n",
- (u16_t)pcb->dupacks, pcb->lastack,
- ntohl(pcb->unacked->tcphdr->seqno)));
- tcp_rexmit(pcb);
- /* Set ssthresh to max (FlightSize / 2, 2*SMSS) */
- /*pcb->ssthresh = LWIP_MAX((pcb->snd_max -
- pcb->lastack) / 2,
- 2 * pcb->mss);*/
- /* Set ssthresh to half of the minimum of the currenct cwnd and the advertised window */
- if (pcb->cwnd > pcb->snd_wnd)
- pcb->ssthresh = pcb->snd_wnd / 2;
- else
- pcb->ssthresh = pcb->cwnd / 2;
-
- pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;
- pcb->flags |= TF_INFR;
- } else {
- /* Inflate the congestion window, but not if it means that
- the value overflows. */
- if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
- pcb->cwnd += pcb->mss;
- }
- }
- }
- } else {
- LWIP_DEBUGF(TCP_FR_DEBUG, ("tcp_receive: dupack averted %"U32_F" %"U32_F"\n",
- pcb->snd_wl1 + pcb->snd_wnd, right_wnd_edge));
- }
- } else
- /*if (TCP_SEQ_LT(pcb->lastack, ackno) &&
- TCP_SEQ_LEQ(ackno, pcb->snd_max)) { */
- if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_max)){
- /* We come here when the ACK acknowledges new data. */
-
- /* Reset the "IN Fast Retransmit" flag, since we are no longer
- in fast retransmit. Also reset the congestion window to the
- slow start threshold. */
- if (pcb->flags & TF_INFR) {
- pcb->flags &= ~TF_INFR;
- pcb->cwnd = pcb->ssthresh;
- }
-
- /* Reset the number of retransmissions. */
- pcb->nrtx = 0;
-
- /* Reset the retransmission time-out. */
- pcb->rto = (pcb->sa >> 3) + pcb->sv;
-
- /* Update the send buffer space. */
- pcb->acked = ackno - pcb->lastack;
-
- pcb->snd_buf += pcb->acked;
-
- /* Reset the fast retransmit variables. */
- pcb->dupacks = 0;
- pcb->lastack = ackno;
-
- /* Update the congestion control variables (cwnd and
- ssthresh). */
- if (pcb->state >= ESTABLISHED) {
- if (pcb->cwnd < pcb->ssthresh) {
- if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {
- pcb->cwnd += pcb->mss;
- }
- LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"U16_F"\n", pcb->cwnd));
- } else {
- u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);
- if (new_cwnd > pcb->cwnd) {
- pcb->cwnd = new_cwnd;
- }
- LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %"U16_F"\n", pcb->cwnd));
- }
- }
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %"U32_F", unacked->seqno %"U32_F":%"U32_F"\n",
- ackno,
- pcb->unacked != NULL?
- ntohl(pcb->unacked->tcphdr->seqno): 0,
- pcb->unacked != NULL?
- ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));
-
- /* Remove segment from the unacknowledged list if the incoming
- ACK acknowlegdes them. */
- while (pcb->unacked != NULL &&
- TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) +
- TCP_TCPLEN(pcb->unacked), ackno)) {
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n",
- ntohl(pcb->unacked->tcphdr->seqno),
- ntohl(pcb->unacked->tcphdr->seqno) +
- TCP_TCPLEN(pcb->unacked)));
-
- next = pcb->unacked;
- pcb->unacked = pcb->unacked->next;
-
- LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
- pcb->snd_queuelen -= pbuf_clen(next->p);
- tcp_seg_free(next);
-
- LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unacked)\n", (u16_t)pcb->snd_queuelen));
- if (pcb->snd_queuelen != 0) {
- LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL ||
- pcb->unsent != NULL);
- }
- }
- pcb->polltmr = 0;
- }
-
- /* We go through the ->unsent list to see if any of the segments
- on the list are acknowledged by the ACK. This may seem
- strange since an "unsent" segment shouldn't be acked. The
- rationale is that lwIP puts all outstanding segments on the
- ->unsent list after a retransmission, so these segments may
- in fact have been sent once. */
- while (pcb->unsent != NULL &&
- /*TCP_SEQ_LEQ(ntohl(pcb->unsent->tcphdr->seqno) + TCP_TCPLEN(pcb->unsent), ackno) &&
- TCP_SEQ_LEQ(ackno, pcb->snd_max)*/
- TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) + TCP_TCPLEN(pcb->unsent), pcb->snd_max)
- ) {
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n",
- ntohl(pcb->unsent->tcphdr->seqno), ntohl(pcb->unsent->tcphdr->seqno) +
- TCP_TCPLEN(pcb->unsent)));
-
- next = pcb->unsent;
- pcb->unsent = pcb->unsent->next;
- LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen));
- pcb->snd_queuelen -= pbuf_clen(next->p);
- tcp_seg_free(next);
- LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unsent)\n", (u16_t)pcb->snd_queuelen));
- if (pcb->snd_queuelen != 0) {
- LWIP_ASSERT("tcp_receive: valid queue length",
- pcb->unacked != NULL || pcb->unsent != NULL);
- }
-
- if (pcb->unsent != NULL) {
- pcb->snd_nxt = htonl(pcb->unsent->tcphdr->seqno);
- }
- }
- /* End of ACK for new data processing. */
-
- LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: pcb->rttest %"U32_F" rtseq %"U32_F" ackno %"U32_F"\n",
- pcb->rttest, pcb->rtseq, ackno));
-
- /* RTT estimation calculations. This is done by checking if the
- incoming segment acknowledges the segment we use to take a
- round-trip time measurement. */
- if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {
- m = tcp_ticks - pcb->rttest;
-
- LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n",
- m, m * TCP_SLOW_INTERVAL));
-
- /* This is taken directly from VJs original code in his paper */
- m = m - (pcb->sa >> 3);
- pcb->sa += m;
- if (m < 0) {
- m = -m;
- }
- m = m - (pcb->sv >> 2);
- pcb->sv += m;
- pcb->rto = (pcb->sa >> 3) + pcb->sv;
-
- LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" miliseconds)\n",
- pcb->rto, pcb->rto * TCP_SLOW_INTERVAL));
-
- pcb->rttest = 0;
- }
- }
-
- /* If the incoming segment contains data, we must process it
- further. */
- if (tcplen > 0) {
- /* This code basically does three things:
-
- +) If the incoming segment contains data that is the next
- in-sequence data, this data is passed to the application. This
- might involve trimming the first edge of the data. The rcv_nxt
- variable and the advertised window are adjusted.
-
- +) If the incoming segment has data that is above the next
- sequence number expected (->rcv_nxt), the segment is placed on
- the ->ooseq queue. This is done by finding the appropriate
- place in the ->ooseq queue (which is ordered by sequence
- number) and trim the segment in both ends if needed. An
- immediate ACK is sent to indicate that we received an
- out-of-sequence segment.
-
- +) Finally, we check if the first segment on the ->ooseq queue
- now is in sequence (i.e., if rcv_nxt >= ooseq->seqno). If
- rcv_nxt > ooseq->seqno, we must trim the first edge of the
- segment on ->ooseq before we adjust rcv_nxt. The data in the
- segments that are now on sequence are chained onto the
- incoming segment so that we only need to call the application
- once.
- */
-
- /* First, we check if we must trim the first edge. We have to do
- this if the sequence number of the incoming segment is less
- than rcv_nxt, and the sequence number plus the length of the
- segment is larger than rcv_nxt. */
- /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
- if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/
- if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)){
- /* Trimming the first edge is done by pushing the payload
- pointer in the pbuf downwards. This is somewhat tricky since
- we do not want to discard the full contents of the pbuf up to
- the new starting point of the data since we have to keep the
- TCP header which is present in the first pbuf in the chain.
-
- What is done is really quite a nasty hack: the first pbuf in
- the pbuf chain is pointed to by inseg.p. Since we need to be
- able to deallocate the whole pbuf, we cannot change this
- inseg.p pointer to point to any of the later pbufs in the
- chain. Instead, we point the ->payload pointer in the first
- pbuf to data in one of the later pbufs. We also set the
- inseg.data pointer to point to the right place. This way, the
- ->p pointer will still point to the first pbuf, but the
- ->p->payload pointer will point to data in another pbuf.
-
- After we are done with adjusting the pbuf pointers we must
- adjust the ->data pointer in the seg and the segment
- length.*/
-
- off = pcb->rcv_nxt - seqno;
- p = inseg.p;
- LWIP_ASSERT("inseg.p != NULL", inseg.p);
- if (inseg.p->len < off) {
- new_tot_len = inseg.p->tot_len - off;
- while (p->len < off) {
- off -= p->len;
- /* KJM following line changed (with addition of new_tot_len var)
- to fix bug #9076
- inseg.p->tot_len -= p->len; */
- p->tot_len = new_tot_len;
- p->len = 0;
- p = p->next;
- }
- pbuf_header(p, -off);
- } else {
- pbuf_header(inseg.p, -off);
- }
- /* KJM following line changed to use p->payload rather than inseg->p->payload
- to fix bug #9076 */
- inseg.dataptr = p->payload;
- inseg.len -= pcb->rcv_nxt - seqno;
- inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;
- }
- else {
- if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){
- /* the whole segment is < rcv_nxt */
- /* must be a duplicate of a packet that has already been correctly handled */
-
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno));
- tcp_ack_now(pcb);
- }
- }
-
- /* The sequence number must be within the window (above rcv_nxt
- and below rcv_nxt + rcv_wnd) in order to be further
- processed. */
- /*if (TCP_SEQ_GEQ(seqno, pcb->rcv_nxt) &&
- TCP_SEQ_LT(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
- if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd - 1)){
- if (pcb->rcv_nxt == seqno) {
- accepted_inseq = 1;
- /* The incoming segment is the next in sequence. We check if
- we have to trim the end of the segment and update rcv_nxt
- and pass the data to the application. */
-#if TCP_QUEUE_OOSEQ
- if (pcb->ooseq != NULL &&
- TCP_SEQ_LEQ(pcb->ooseq->tcphdr->seqno, seqno + inseg.len)) {
- /* We have to trim the second edge of the incoming
- segment. */
- inseg.len = pcb->ooseq->tcphdr->seqno - seqno;
- pbuf_realloc(inseg.p, inseg.len);
- }
-#endif /* TCP_QUEUE_OOSEQ */
-
- tcplen = TCP_TCPLEN(&inseg);
-
- /* First received FIN will be ACKed +1, on any successive (duplicate)
- * FINs we are already in CLOSE_WAIT and have already done +1.
- */
- if (pcb->state != CLOSE_WAIT) {
- pcb->rcv_nxt += tcplen;
- }
-
- /* Update the receiver's (our) window. */
- if (pcb->rcv_wnd < tcplen) {
- pcb->rcv_wnd = 0;
- } else {
- pcb->rcv_wnd -= tcplen;
- }
-
- /* If there is data in the segment, we make preparations to
- pass this up to the application. The ->recv_data variable
- is used for holding the pbuf that goes to the
- application. The code for reassembling out-of-sequence data
- chains its data on this pbuf as well.
-
- If the segment was a FIN, we set the TF_GOT_FIN flag that will
- be used to indicate to the application that the remote side has
- closed its end of the connection. */
- if (inseg.p->tot_len > 0) {
- recv_data = inseg.p;
- /* Since this pbuf now is the responsibility of the
- application, we delete our reference to it so that we won't
- (mistakingly) deallocate it. */
- inseg.p = NULL;
- }
- if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n"));
- recv_flags = TF_GOT_FIN;
- }
-
-#if TCP_QUEUE_OOSEQ
- /* We now check if we have segments on the ->ooseq queue that
- is now in sequence. */
- while (pcb->ooseq != NULL &&
- pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {
-
- cseg = pcb->ooseq;
- seqno = pcb->ooseq->tcphdr->seqno;
-
- pcb->rcv_nxt += TCP_TCPLEN(cseg);
- if (pcb->rcv_wnd < TCP_TCPLEN(cseg)) {
- pcb->rcv_wnd = 0;
- } else {
- pcb->rcv_wnd -= TCP_TCPLEN(cseg);
- }
- if (cseg->p->tot_len > 0) {
- /* Chain this pbuf onto the pbuf that we will pass to
- the application. */
- if (recv_data) {
- pbuf_cat(recv_data, cseg->p);
- } else {
- recv_data = cseg->p;
- }
- cseg->p = NULL;
- }
- if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {
- LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN.\n"));
- recv_flags = TF_GOT_FIN;
- if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */
- pcb->state = CLOSE_WAIT;
- }
- }
-
-
- pcb->ooseq = cseg->next;
- tcp_seg_free(cseg);
- }
-#endif /* TCP_QUEUE_OOSEQ */
-
-
- /* Acknowledge the segment(s). */
- tcp_ack(pcb);
-
- } else {
- /* We get here if the incoming segment is out-of-sequence. */
- tcp_ack_now(pcb);
-#if TCP_QUEUE_OOSEQ
- /* We queue the segment on the ->ooseq queue. */
- if (pcb->ooseq == NULL) {
- pcb->ooseq = tcp_seg_copy(&inseg);
- } else {
- /* If the queue is not empty, we walk through the queue and
- try to find a place where the sequence number of the
- incoming segment is between the sequence numbers of the
- previous and the next segment on the ->ooseq queue. That is
- the place where we put the incoming segment. If needed, we
- trim the second edges of the previous and the incoming
- segment so that it will fit into the sequence.
-
- If the incoming segment has the same sequence number as a
- segment on the ->ooseq queue, we discard the segment that
- contains less data. */
-
- prev = NULL;
- for(next = pcb->ooseq; next != NULL; next = next->next) {
- if (seqno == next->tcphdr->seqno) {
- /* The sequence number of the incoming segment is the
- same as the sequence number of the segment on
- ->ooseq. We check the lengths to see which one to
- discard. */
- if (inseg.len > next->len) {
- /* The incoming segment is larger than the old
- segment. We replace the old segment with the new
- one. */
- cseg = tcp_seg_copy(&inseg);
- if (cseg != NULL) {
- cseg->next = next->next;
- if (prev != NULL) {
- prev->next = cseg;
- } else {
- pcb->ooseq = cseg;
- }
- }
- break;
- } else {
- /* Either the lenghts are the same or the incoming
- segment was smaller than the old one; in either
- case, we ditch the incoming segment. */
- break;
- }
- } else {
- if (prev == NULL) {
- if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {
- /* The sequence number of the incoming segment is lower
- than the sequence number of the first segment on the
- queue. We put the incoming segment first on the
- queue. */
-
- if (TCP_SEQ_GT(seqno + inseg.len, next->tcphdr->seqno)) {
- /* We need to trim the incoming segment. */
- inseg.len = next->tcphdr->seqno - seqno;
- pbuf_realloc(inseg.p, inseg.len);
- }
- cseg = tcp_seg_copy(&inseg);
- if (cseg != NULL) {
- cseg->next = next;
- pcb->ooseq = cseg;
- }
- break;
- }
- } else
- /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) &&
- TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/
- if(TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)){
- /* The sequence number of the incoming segment is in
- between the sequence numbers of the previous and
- the next segment on ->ooseq. We trim and insert the
- incoming segment and trim the previous segment, if
- needed. */
- if (TCP_SEQ_GT(seqno + inseg.len, next->tcphdr->seqno)) {
- /* We need to trim the incoming segment. */
- inseg.len = next->tcphdr->seqno - seqno;
- pbuf_realloc(inseg.p, inseg.len);
- }
-
- cseg = tcp_seg_copy(&inseg);
- if (cseg != NULL) {
- cseg->next = next;
- prev->next = cseg;
- if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) {
- /* We need to trim the prev segment. */
- prev->len = seqno - prev->tcphdr->seqno;
- pbuf_realloc(prev->p, prev->len);
- }
- }
- break;
- }
- /* If the "next" segment is the last segment on the
- ooseq queue, we add the incoming segment to the end
- of the list. */
- if (next->next == NULL &&
- TCP_SEQ_GT(seqno, next->tcphdr->seqno)) {
- next->next = tcp_seg_copy(&inseg);
- if (next->next != NULL) {
- if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) {
- /* We need to trim the last segment. */
- next->len = seqno - next->tcphdr->seqno;
- pbuf_realloc(next->p, next->len);
- }
- }
- break;
- }
- }
- prev = next;
- }
- }
-#endif /* TCP_QUEUE_OOSEQ */
-
- }
- } else {
- /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) ||
- TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
- if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){
- tcp_ack_now(pcb);
- }
- }
- } else {
- /* Segments with length 0 is taken care of here. Segments that
- fall out of the window are ACKed. */
- /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) ||
- TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/
- if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){
- tcp_ack_now(pcb);
- }
- }
- return accepted_inseq;
-}
-
-/*
- * tcp_parseopt:
- *
- * Parses the options contained in the incoming segment. (Code taken
- * from uIP with only small changes.)
- *
- */
-
-static void
-tcp_parseopt(struct tcp_pcb *pcb)
-{
- u8_t c;
- u8_t *opts, opt;
- u16_t mss;
-
- opts = (u8_t *)tcphdr + TCP_HLEN;
-
- /* Parse the TCP MSS option, if present. */
- if(TCPH_HDRLEN(tcphdr) > 0x5) {
- for(c = 0; c < (TCPH_HDRLEN(tcphdr) - 5) << 2 ;) {
- opt = opts[c];
- if (opt == 0x00) {
- /* End of options. */
- break;
- } else if (opt == 0x01) {
- ++c;
- /* NOP option. */
- } else if (opt == 0x02 &&
- opts[c + 1] == 0x04) {
- /* An MSS option with the right option length. */
- mss = (opts[c + 2] << 8) | opts[c + 3];
- pcb->mss = mss > TCP_MSS? TCP_MSS: mss;
-
- /* And we are done processing options. */
- break;
- } else {
- if (opts[c + 1] == 0) {
- /* If the length field is zero, the options are malformed
- and we don't process them further. */
- break;
- }
- /* All other options have a length field, so that we easily
- can skip past them. */
- c += opts[c + 1];
- }
- }
- }
-}
-#endif /* LWIP_TCP */
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/tcp_out.c b/src/VBox/Devices/Network/lwip/src/core/tcp_out.c
deleted file mode 100644
index 409110a..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/tcp_out.c
+++ /dev/null
@@ -1,727 +0,0 @@
-/**
- * @file
- *
- * Transmission Control Protocol, outgoing traffic
- *
- * The output functions of TCP.
- *
- */
-
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#include <string.h>
-
-#include "lwip/def.h"
-#include "lwip/opt.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-#include "lwip/sys.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/inet.h"
-#include "lwip/tcp.h"
-#include "lwip/stats.h"
-#include "lwip/snmp.h"
-
-#if LWIP_TCP
-
-/* Forward declarations.*/
-static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb);
-
-err_t
-tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags)
-{
- /* no data, no length, flags, copy=1, no optdata, no optdatalen */
- return tcp_enqueue(pcb, NULL, 0, flags, 1, NULL, 0);
-}
-
-/**
- * Write data for sending (but does not send it immediately).
- *
- * It waits in the expectation of more data being sent soon (as
- * it can send them more efficiently by combining them together).
- * To prompt the system to send data now, call tcp_output() after
- * calling tcp_write().
- *
- * @arg pcb Protocol control block of the TCP connection to enqueue data for.
- *
- * @see tcp_write()
- */
-
-err_t
-tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t copy)
-{
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, arg=%p, len=%"U16_F", copy=%"U16_F")\n", (void *)pcb,
- arg, len, (u16_t)copy));
- /* connection is in valid state for data transmission? */
- if (pcb->state == ESTABLISHED ||
- pcb->state == CLOSE_WAIT ||
- pcb->state == SYN_SENT ||
- pcb->state == SYN_RCVD) {
- if (len > 0) {
- return tcp_enqueue(pcb, (void *)arg, len, 0, copy, NULL, 0);
- }
- return ERR_OK;
- } else {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | DBG_STATE | 3, ("tcp_write() called in invalid state\n"));
- return ERR_CONN;
- }
-}
-
-/**
- * Enqueue either data or TCP options (but not both) for tranmission
- *
- *
- *
- * @arg pcb Protocol control block for the TCP connection to enqueue data for.
- * @arg arg Pointer to the data to be enqueued for sending.
- * @arg len Data length in bytes
- * @arg flags
- * @arg copy 1 if data must be copied, 0 if data is non-volatile and can be
- * referenced.
- * @arg optdata
- * @arg optlen
- */
-err_t
-tcp_enqueue(struct tcp_pcb *pcb, void *arg, u16_t len,
- u8_t flags, u8_t copy,
- u8_t *optdata, u8_t optlen)
-{
- struct pbuf *p;
- struct tcp_seg *seg, *useg, *queue;
- u32_t left, seqno;
- u16_t seglen;
- void *ptr;
- u8_t queuelen;
-
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_enqueue(pcb=%p, arg=%p, len=%"U16_F", flags=%"X16_F", copy=%"U16_F")\n",
- (void *)pcb, arg, len, (u16_t)flags, (u16_t)copy));
- LWIP_ASSERT("tcp_enqueue: len == 0 || optlen == 0 (programmer violates API)",
- len == 0 || optlen == 0);
- LWIP_ASSERT("tcp_enqueue: arg == NULL || optdata == NULL (programmer violates API)",
- arg == NULL || optdata == NULL);
- /* fail on too much data */
- if (len > pcb->snd_buf) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue: too much data (len=%"U16_F" > snd_buf=%"U16_F")\n", len, pcb->snd_buf));
- return ERR_MEM;
- }
- left = len;
- ptr = arg;
-
- /* seqno will be the sequence number of the first segment enqueued
- * by the call to this function. */
- seqno = pcb->snd_lbb;
-
- LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen));
-
- /* If total number of pbufs on the unsent/unacked queues exceeds the
- * configured maximum, return an error */
- queuelen = pcb->snd_queuelen;
- if (queuelen >= TCP_SND_QUEUELEN) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue: too long queue %"U16_F" (max %"U16_F")\n", queuelen, TCP_SND_QUEUELEN));
- TCP_STATS_INC(tcp.memerr);
- return ERR_MEM;
- }
- if (queuelen != 0) {
- LWIP_ASSERT("tcp_enqueue: pbufs on queue => at least one queue non-empty",
- pcb->unacked != NULL || pcb->unsent != NULL);
- } else {
- LWIP_ASSERT("tcp_enqueue: no pbufs on queue => both queues empty",
- pcb->unacked == NULL && pcb->unsent == NULL);
- }
-
- /* First, break up the data into segments and tuck them together in
- * the local "queue" variable. */
- useg = queue = seg = NULL;
- seglen = 0;
- while (queue == NULL || left > 0) {
-
- /* The segment length should be the MSS if the data to be enqueued
- * is larger than the MSS. */
- seglen = left > pcb->mss? pcb->mss: left;
-
- /* Allocate memory for tcp_seg, and fill in fields. */
- seg = memp_malloc(MEMP_TCP_SEG);
- if (seg == NULL) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_enqueue: could not allocate memory for tcp_seg\n"));
- goto memerr;
- }
- seg->next = NULL;
- seg->p = NULL;
-
- /* first segment of to-be-queued data? */
- if (queue == NULL) {
- queue = seg;
- }
- /* subsequent segments of to-be-queued data */
- else {
- /* Attach the segment to the end of the queued segments */
- LWIP_ASSERT("useg != NULL", useg != NULL);
- useg->next = seg;
- }
- /* remember last segment of to-be-queued data for next iteration */
- useg = seg;
-
- /* If copy is set, memory should be allocated
- * and data copied into pbuf, otherwise data comes from
- * ROM or other static memory, and need not be copied. If
- * optdata is != NULL, we have options instead of data. */
-
- /* options? */
- if (optdata != NULL) {
- if ((seg->p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {
- goto memerr;
- }
- ++queuelen;
- seg->dataptr = seg->p->payload;
- }
- /* copy from volatile memory? */
- else if (copy) {
- if ((seg->p = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_RAM)) == NULL) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_enqueue : could not allocate memory for pbuf copy size %"U16_F"\n", seglen));
- goto memerr;
- }
- ++queuelen;
- if (arg != NULL) {
- memcpy(seg->p->payload, ptr, seglen);
- }
- seg->dataptr = seg->p->payload;
- }
- /* do not copy data */
- else {
- /* First, allocate a pbuf for holding the data.
- * since the referenced data is available at least until it is sent out on the
- * link (as it has to be ACKed by the remote party) we can safely use PBUF_ROM
- * instead of PBUF_REF here.
- */
- if ((p = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_enqueue: could not allocate memory for zero-copy pbuf\n"));
- goto memerr;
- }
- ++queuelen;
- /* reference the non-volatile payload data */
- p->payload = ptr;
- seg->dataptr = ptr;
-
- /* Second, allocate a pbuf for the headers. */
- if ((seg->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_RAM)) == NULL) {
- /* If allocation fails, we have to deallocate the data pbuf as
- * well. */
- pbuf_free(p);
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_enqueue: could not allocate memory for header pbuf\n"));
- goto memerr;
- }
- ++queuelen;
-
- /* Concatenate the headers and data pbufs together. */
- pbuf_cat(seg->p/*header*/, p/*data*/);
- p = NULL;
- }
-
- /* Now that there are more segments queued, we check again if the
- length of the queue exceeds the configured maximum. */
- if (queuelen > TCP_SND_QUEUELEN) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_enqueue: queue too long %"U16_F" (%"U16_F")\n", queuelen, TCP_SND_QUEUELEN));
- goto memerr;
- }
-
- seg->len = seglen;
-
- /* build TCP header */
- if (pbuf_header(seg->p, TCP_HLEN)) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_enqueue: no room for TCP header in pbuf.\n"));
- TCP_STATS_INC(tcp.err);
- goto memerr;
- }
- seg->tcphdr = seg->p->payload;
- seg->tcphdr->src = htons(pcb->local_port);
- seg->tcphdr->dest = htons(pcb->remote_port);
- seg->tcphdr->seqno = htonl(seqno);
- seg->tcphdr->urgp = 0;
- TCPH_FLAGS_SET(seg->tcphdr, flags);
- /* don't fill in tcphdr->ackno and tcphdr->wnd until later */
-
- /* Copy the options into the header, if they are present. */
- if (optdata == NULL) {
- TCPH_HDRLEN_SET(seg->tcphdr, 5);
- }
- else {
- TCPH_HDRLEN_SET(seg->tcphdr, (5 + optlen / 4));
- /* Copy options into data portion of segment.
- Options can thus only be sent in non data carrying
- segments such as SYN|ACK. */
- memcpy(seg->dataptr, optdata, optlen);
- }
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | DBG_TRACE, ("tcp_enqueue: queueing %"U32_F":%"U32_F" (0x%"X16_F")\n",
- ntohl(seg->tcphdr->seqno),
- ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg),
- (u16_t)flags));
-
- left -= seglen;
- seqno += seglen;
- ptr = (void *)((u8_t *)ptr + seglen);
- }
-
- /* Now that the data to be enqueued has been broken up into TCP
- segments in the queue variable, we add them to the end of the
- pcb->unsent queue. */
- if (pcb->unsent == NULL) {
- useg = NULL;
- }
- else {
- for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);
- }
- /* { useg is last segment on the unsent queue, NULL if list is empty } */
-
- /* If there is room in the last pbuf on the unsent queue,
- chain the first pbuf on the queue together with that. */
- if (useg != NULL &&
- TCP_TCPLEN(useg) != 0 &&
- !(TCPH_FLAGS(useg->tcphdr) & (TCP_SYN | TCP_FIN)) &&
- !(flags & (TCP_SYN | TCP_FIN)) &&
- /* fit within max seg size */
- useg->len + queue->len <= pcb->mss) {
- /* Remove TCP header from first segment of our to-be-queued list */
- pbuf_header(queue->p, -TCP_HLEN);
- pbuf_cat(useg->p, queue->p);
- useg->len += queue->len;
- useg->next = queue->next;
-
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG | DBG_TRACE | DBG_STATE, ("tcp_enqueue: chaining segments, new len %"U16_F"\n", useg->len));
- if (seg == queue) {
- seg = NULL;
- }
- memp_free(MEMP_TCP_SEG, queue);
- }
- else {
- /* empty list */
- if (useg == NULL) {
- /* initialize list with this segment */
- pcb->unsent = queue;
- }
- /* enqueue segment */
- else {
- useg->next = queue;
- }
- }
- if ((flags & TCP_SYN) || (flags & TCP_FIN)) {
- ++len;
- }
- pcb->snd_lbb += len;
-
- pcb->snd_buf -= len;
-
- /* update number of segments on the queues */
- pcb->snd_queuelen = queuelen;
- LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue: %"S16_F" (after enqueued)\n", pcb->snd_queuelen));
- if (pcb->snd_queuelen != 0) {
- LWIP_ASSERT("tcp_enqueue: valid queue length",
- pcb->unacked != NULL || pcb->unsent != NULL);
- }
-
- /* Set the PSH flag in the last segment that we enqueued, but only
- if the segment has data (indicated by seglen > 0). */
- if (seg != NULL && seglen > 0 && seg->tcphdr != NULL) {
- TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);
- }
-
- return ERR_OK;
-memerr:
- TCP_STATS_INC(tcp.memerr);
-
- if (queue != NULL) {
- tcp_segs_free(queue);
- }
- if (pcb->snd_queuelen != 0) {
- LWIP_ASSERT("tcp_enqueue: valid queue length", pcb->unacked != NULL ||
- pcb->unsent != NULL);
- }
- LWIP_DEBUGF(TCP_QLEN_DEBUG | DBG_STATE, ("tcp_enqueue: %"S16_F" (with mem err)\n", pcb->snd_queuelen));
- return ERR_MEM;
-}
-
-/* find out what we can send and send it */
-err_t
-tcp_output(struct tcp_pcb *pcb)
-{
- struct pbuf *p;
- struct tcp_hdr *tcphdr;
- struct tcp_seg *seg, *useg;
- u32_t wnd;
-#if TCP_CWND_DEBUG
- s16_t i = 0;
-#endif /* TCP_CWND_DEBUG */
-
- /* First, check if we are invoked by the TCP input processing
- code. If so, we do not output anything. Instead, we rely on the
- input processing code to call us when input processing is done
- with. */
- if (tcp_input_pcb == pcb) {
- return ERR_OK;
- }
-
- wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);
-
- seg = pcb->unsent;
-
- /* useg should point to last segment on unacked queue */
- useg = pcb->unacked;
- if (useg != NULL) {
- for (; useg->next != NULL; useg = useg->next);
- }
-
- /* If the TF_ACK_NOW flag is set and no data will be sent (either
- * because the ->unsent queue is empty or because the window does
- * not allow it), construct an empty ACK segment and send it.
- *
- * If data is to be sent, we will just piggyback the ACK (see below).
- */
- if (pcb->flags & TF_ACK_NOW &&
- (seg == NULL ||
- ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {
- p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
- if (p == NULL) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n"));
- return ERR_BUF;
- }
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt));
- /* remove ACK flags from the PCB, as we send an empty ACK now */
- pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
-
- tcphdr = p->payload;
- tcphdr->src = htons(pcb->local_port);
- tcphdr->dest = htons(pcb->remote_port);
- tcphdr->seqno = htonl(pcb->snd_nxt);
- tcphdr->ackno = htonl(pcb->rcv_nxt);
- TCPH_FLAGS_SET(tcphdr, TCP_ACK);
- tcphdr->wnd = htons(pcb->rcv_wnd);
- tcphdr->urgp = 0;
- TCPH_HDRLEN_SET(tcphdr, 5);
-
- tcphdr->chksum = 0;
-#if CHECKSUM_GEN_TCP
- tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip),
- IP_PROTO_TCP, p->tot_len);
-#endif
- ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
- IP_PROTO_TCP);
- pbuf_free(p);
-
- return ERR_OK;
- }
-
-#if TCP_OUTPUT_DEBUG
- if (seg == NULL) {
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n", (void*)pcb->unsent));
- }
-#endif /* TCP_OUTPUT_DEBUG */
-#if TCP_CWND_DEBUG
- if (seg == NULL) {
- LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U32_F", cwnd %"U16_F", wnd %"U32_F", seg == NULL, ack %"U32_F"\n",
- pcb->snd_wnd, pcb->cwnd, wnd,
- pcb->lastack));
- } else {
- LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U32_F", cwnd %"U16_F", wnd %"U32_F", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n",
- pcb->snd_wnd, pcb->cwnd, wnd,
- ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,
- ntohl(seg->tcphdr->seqno), pcb->lastack));
- }
-#endif /* TCP_CWND_DEBUG */
- /* data available and window allows it to be sent? */
- while (seg != NULL &&
- ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {
-#if TCP_CWND_DEBUG
- LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U32_F", cwnd %"U16_F", wnd %"U32_F", effwnd %"U32_F", seq %"U32_F", ack %"U32_F", i %"S16_F"\n",
- pcb->snd_wnd, pcb->cwnd, wnd,
- ntohl(seg->tcphdr->seqno) + seg->len -
- pcb->lastack,
- ntohl(seg->tcphdr->seqno), pcb->lastack, i));
- ++i;
-#endif /* TCP_CWND_DEBUG */
-
- pcb->unsent = seg->next;
-
- if (pcb->state != SYN_SENT) {
- TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);
- pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);
- }
-
- tcp_output_segment(seg, pcb);
- pcb->snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);
- if (TCP_SEQ_LT(pcb->snd_max, pcb->snd_nxt)) {
- pcb->snd_max = pcb->snd_nxt;
- }
- /* put segment on unacknowledged list if length > 0 */
- if (TCP_TCPLEN(seg) > 0) {
- seg->next = NULL;
- /* unacked list is empty? */
- if (pcb->unacked == NULL) {
- pcb->unacked = seg;
- useg = seg;
- /* unacked list is not empty? */
- } else {
- /* In the case of fast retransmit, the packet should not go to the tail
- * of the unacked queue, but rather at the head. We need to check for
- * this case. -STJ Jul 27, 2004 */
- if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))){
- /* add segment to head of unacked list */
- seg->next = pcb->unacked;
- pcb->unacked = seg;
- } else {
- /* add segment to tail of unacked list */
- useg->next = seg;
- useg = useg->next;
- }
- }
- /* do not queue empty segments on the unacked list */
- } else {
- tcp_seg_free(seg);
- }
- seg = pcb->unsent;
- }
- return ERR_OK;
-}
-
-/**
- * Actually send a TCP segment over IP
- */
-static void
-tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb)
-{
- u16_t len;
- struct netif *netif;
-
- /** @bug Exclude retransmitted segments from this count. */
- snmp_inc_tcpoutsegs();
-
- /* The TCP header has already been constructed, but the ackno and
- wnd fields remain. */
- seg->tcphdr->ackno = htonl(pcb->rcv_nxt);
-
- /* silly window avoidance */
- if (pcb->rcv_wnd < pcb->mss) {
- seg->tcphdr->wnd = 0;
- } else {
- /* advertise our receive window size in this TCP segment */
- seg->tcphdr->wnd = htons(pcb->rcv_wnd);
- }
-
- /* If we don't have a local IP address, we get one by
- calling ip_route(). */
- if (ip_addr_isany(&(pcb->local_ip))) {
- netif = ip_route(&(pcb->remote_ip));
- if (netif == NULL) {
- return;
- }
- ip_addr_set(&(pcb->local_ip), &(netif->ip_addr));
- }
-
- pcb->rtime = 0;
-
- if (pcb->rttest == 0) {
- pcb->rttest = tcp_ticks;
- pcb->rtseq = ntohl(seg->tcphdr->seqno);
-
- LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %"U32_F"\n", pcb->rtseq));
- }
- LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n",
- htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) +
- seg->len));
-
- len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);
-
- seg->p->len -= len;
- seg->p->tot_len -= len;
-
- seg->p->payload = seg->tcphdr;
-
- seg->tcphdr->chksum = 0;
-#if CHECKSUM_GEN_TCP
- seg->tcphdr->chksum = inet_chksum_pseudo(seg->p,
- &(pcb->local_ip),
- &(pcb->remote_ip),
- IP_PROTO_TCP, seg->p->tot_len);
-#endif
- TCP_STATS_INC(tcp.xmit);
-
- ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos,
- IP_PROTO_TCP);
-}
-
-void
-tcp_rst(u32_t seqno, u32_t ackno,
- struct ip_addr *local_ip, struct ip_addr *remote_ip,
- u16_t local_port, u16_t remote_port)
-{
- struct pbuf *p;
- struct tcp_hdr *tcphdr;
- p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
- if (p == NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n"));
- return;
- }
-
- tcphdr = p->payload;
- tcphdr->src = htons(local_port);
- tcphdr->dest = htons(remote_port);
- tcphdr->seqno = htonl(seqno);
- tcphdr->ackno = htonl(ackno);
- TCPH_FLAGS_SET(tcphdr, TCP_RST | TCP_ACK);
- tcphdr->wnd = htons(TCP_WND);
- tcphdr->urgp = 0;
- TCPH_HDRLEN_SET(tcphdr, 5);
-
- tcphdr->chksum = 0;
-#if CHECKSUM_GEN_TCP
- tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip,
- IP_PROTO_TCP, p->tot_len);
-#endif
- TCP_STATS_INC(tcp.xmit);
- snmp_inc_tcpoutrsts();
- /* Send output with hardcoded TTL since we have no access to the pcb */
- ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP);
- pbuf_free(p);
- LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno));
-}
-
-/* requeue all unacked segments for retransmission */
-void
-tcp_rexmit_rto(struct tcp_pcb *pcb)
-{
- struct tcp_seg *seg;
-
- if (pcb->unacked == NULL) {
- return;
- }
-
- /* Move all unacked segments to the head of the unsent queue */
- for (seg = pcb->unacked; seg->next != NULL; seg = seg->next);
- /* concatenate unsent queue after unacked queue */
- seg->next = pcb->unsent;
- /* unsent queue is the concatenated queue (of unacked, unsent) */
- pcb->unsent = pcb->unacked;
- /* unacked queue is now empty */
- pcb->unacked = NULL;
-
- pcb->snd_nxt = ntohl(pcb->unsent->tcphdr->seqno);
- /* increment number of retransmissions */
- ++pcb->nrtx;
-
- /* Don't take any RTT measurements after retransmitting. */
- pcb->rttest = 0;
-
- /* Do the actual retransmission */
- tcp_output(pcb);
-}
-
-void
-tcp_rexmit(struct tcp_pcb *pcb)
-{
- struct tcp_seg *seg;
-
- if (pcb->unacked == NULL) {
- return;
- }
-
- /* Move the first unacked segment to the unsent queue */
- seg = pcb->unacked->next;
- pcb->unacked->next = pcb->unsent;
- pcb->unsent = pcb->unacked;
- pcb->unacked = seg;
-
- pcb->snd_nxt = ntohl(pcb->unsent->tcphdr->seqno);
-
- ++pcb->nrtx;
-
- /* Don't take any rtt measurements after retransmitting. */
- pcb->rttest = 0;
-
- /* Do the actual retransmission. */
- snmp_inc_tcpretranssegs();
- tcp_output(pcb);
-
-}
-
-
-void
-tcp_keepalive(struct tcp_pcb *pcb)
-{
- struct pbuf *p;
- struct tcp_hdr *tcphdr;
-
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n",
- ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip),
- ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip)));
-
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt %"U16_F"\n", tcp_ticks, pcb->tmr, pcb->keep_cnt));
-
- p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);
-
- if(p == NULL) {
- LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: could not allocate memory for pbuf\n"));
- return;
- }
-
- tcphdr = p->payload;
- tcphdr->src = htons(pcb->local_port);
- tcphdr->dest = htons(pcb->remote_port);
- tcphdr->seqno = htonl(pcb->snd_nxt - 1);
- tcphdr->ackno = htonl(pcb->rcv_nxt);
- tcphdr->wnd = htons(pcb->rcv_wnd);
- tcphdr->urgp = 0;
- TCPH_HDRLEN_SET(tcphdr, 5);
-
- tcphdr->chksum = 0;
-#if CHECKSUM_GEN_TCP
- tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, IP_PROTO_TCP, p->tot_len);
-#endif
- TCP_STATS_INC(tcp.xmit);
-
- /* Send output to IP */
- ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP);
-
- pbuf_free(p);
-
- LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n", pcb->snd_nxt - 1, pcb->rcv_nxt));
-}
-
-#endif /* LWIP_TCP */
-
-
-
-
-
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/core/udp.c b/src/VBox/Devices/Network/lwip/src/core/udp.c
deleted file mode 100644
index fb15685..0000000
--- a/src/VBox/Devices/Network/lwip/src/core/udp.c
+++ /dev/null
@@ -1,661 +0,0 @@
-/**
- * @file
- * User Datagram Protocol module
- *
- */
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-
-/* udp.c
- *
- * The code for the User Datagram Protocol UDP.
- *
- */
-
-#include <string.h>
-
-#include "lwip/opt.h"
-
-#include "lwip/def.h"
-#include "lwip/memp.h"
-#include "lwip/inet.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/udp.h"
-#include "lwip/icmp.h"
-
-#include "lwip/stats.h"
-
-#include "arch/perf.h"
-#include "lwip/snmp.h"
-
-/* The list of UDP PCBs */
-#if LWIP_UDP
-/* exported in udp.h (was static) */
-struct udp_pcb *udp_pcbs = NULL;
-
-static struct udp_pcb *pcb_cache = NULL;
-
-void
-udp_init(void)
-{
- udp_pcbs = pcb_cache = NULL;
-}
-
-/**
- * Process an incoming UDP datagram.
- *
- * Given an incoming UDP datagram (as a chain of pbufs) this function
- * finds a corresponding UDP PCB and
- *
- * @param pbuf pbuf to be demultiplexed to a UDP PCB.
- * @param netif network interface on which the datagram was received.
- *
- */
-void
-udp_input(struct pbuf *p, struct netif *inp)
-{
- struct udp_hdr *udphdr;
- struct udp_pcb *pcb;
- struct udp_pcb *uncon_pcb;
- struct ip_hdr *iphdr;
- u16_t src, dest;
- u8_t local_match;
-
- PERF_START;
-
- UDP_STATS_INC(udp.recv);
-
- iphdr = p->payload;
-
- if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN)) {
- /* drop short packets */
- LWIP_DEBUGF(UDP_DEBUG,
- ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len));
- UDP_STATS_INC(udp.lenerr);
- UDP_STATS_INC(udp.drop);
- snmp_inc_udpinerrors();
- pbuf_free(p);
- goto end;
- }
-
- pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4));
-
- udphdr = (struct udp_hdr *)p->payload;
-
- LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len));
-
- src = ntohs(udphdr->src);
- dest = ntohs(udphdr->dest);
-
- udp_debug_print(udphdr);
-
- /* print the UDP source and destination */
- LWIP_DEBUGF(UDP_DEBUG,
- ("udp (%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F") <-- "
- "(%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F")\n",
- ip4_addr1(&iphdr->dest), ip4_addr2(&iphdr->dest),
- ip4_addr3(&iphdr->dest), ip4_addr4(&iphdr->dest), ntohs(udphdr->dest),
- ip4_addr1(&iphdr->src), ip4_addr2(&iphdr->src),
- ip4_addr3(&iphdr->src), ip4_addr4(&iphdr->src), ntohs(udphdr->src)));
-
- local_match = 0;
- uncon_pcb = NULL;
- /* Iterate through the UDP pcb list for a matching pcb */
- for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
- /* print the PCB local and remote address */
- LWIP_DEBUGF(UDP_DEBUG,
- ("pcb (%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F") --- "
- "(%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F")\n",
- ip4_addr1(&pcb->local_ip), ip4_addr2(&pcb->local_ip),
- ip4_addr3(&pcb->local_ip), ip4_addr4(&pcb->local_ip), pcb->local_port,
- ip4_addr1(&pcb->remote_ip), ip4_addr2(&pcb->remote_ip),
- ip4_addr3(&pcb->remote_ip), ip4_addr4(&pcb->remote_ip), pcb->remote_port));
-
- /* compare PCB local addr+port to UDP destination addr+port */
- if ((pcb->local_port == dest) &&
- (ip_addr_isany(&pcb->local_ip) ||
- ip_addr_cmp(&(pcb->local_ip), &(iphdr->dest)) ||
- ip_addr_isbroadcast(&(iphdr->dest), inp))) {
- local_match = 1;
- if ((uncon_pcb == NULL) &&
- ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) {
- /* the first unconnected matching PCB */
- uncon_pcb = pcb;
- }
- }
- /* compare PCB remote addr+port to UDP source addr+port */
- if ((local_match != 0) &&
- (pcb->remote_port == src) &&
- (ip_addr_isany(&pcb->remote_ip) ||
- ip_addr_cmp(&(pcb->remote_ip), &(iphdr->src)))) {
- /* the first fully matching PCB */
- break;
- }
- }
- /* no fully matching pcb found? then look for an unconnected pcb */
- if (pcb == NULL) {
- pcb = uncon_pcb;
- }
-
- /* Check checksum if this is a match or if it was directed at us. */
- if (pcb != NULL || ip_addr_cmp(&inp->ip_addr, &iphdr->dest)) {
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE, ("udp_input: calculating checksum\n"));
-#ifdef IPv6
- if (iphdr->nexthdr == IP_PROTO_UDPLITE) {
-#else
- if (IPH_PROTO(iphdr) == IP_PROTO_UDPLITE) {
-#endif /* IPv4 */
- /* Do the UDP Lite checksum */
-#if CHECKSUM_CHECK_UDP
- if (inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src),
- (struct ip_addr *)&(iphdr->dest),
- IP_PROTO_UDPLITE, ntohs(udphdr->len)) != 0) {
- LWIP_DEBUGF(UDP_DEBUG | 2,
- ("udp_input: UDP Lite datagram discarded due to failing checksum\n"));
- UDP_STATS_INC(udp.chkerr);
- UDP_STATS_INC(udp.drop);
- snmp_inc_udpinerrors();
- pbuf_free(p);
- goto end;
- }
-#endif
- } else {
-#if CHECKSUM_CHECK_UDP
- if (udphdr->chksum != 0) {
- if (inet_chksum_pseudo(p, (struct ip_addr *)&(iphdr->src),
- (struct ip_addr *)&(iphdr->dest),
- IP_PROTO_UDP, p->tot_len) != 0) {
- LWIP_DEBUGF(UDP_DEBUG | 2,
- ("udp_input: UDP datagram discarded due to failing checksum\n"));
- UDP_STATS_INC(udp.chkerr);
- UDP_STATS_INC(udp.drop);
- snmp_inc_udpinerrors();
- pbuf_free(p);
- goto end;
- }
- }
-#endif
- }
- pbuf_header(p, -UDP_HLEN);
- if (pcb != NULL) {
- snmp_inc_udpindatagrams();
- /* callback */
- if (pcb->recv != NULL)
- pcb->recv(pcb->recv_arg, pcb, p, &(iphdr->src), src);
- } else {
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE, ("udp_input: not for us.\n"));
-
- /* No match was found, send ICMP destination port unreachable unless
- destination address was broadcast/multicast. */
-
- if (!ip_addr_isbroadcast(&iphdr->dest, inp) &&
- !ip_addr_ismulticast(&iphdr->dest)) {
-
- /* restore pbuf pointer */
- p->payload = iphdr;
- icmp_dest_unreach(p, ICMP_DUR_PORT);
- }
- UDP_STATS_INC(udp.proterr);
- UDP_STATS_INC(udp.drop);
- snmp_inc_udpnoports();
- pbuf_free(p);
- }
- } else {
- pbuf_free(p);
- }
-end:
- PERF_STOP("udp_input");
-}
-
-/**
- * Send data to a specified address using UDP.
- *
- * @param pcb UDP PCB used to send the data.
- * @param pbuf chain of pbuf's to be sent.
- * @param dst_ip Destination IP address.
- * @param dst_port Destination UDP port.
- *
- * If the PCB already has a remote address association, it will
- * be restored after the data is sent.
- *
- * @return lwIP error code.
- * - ERR_OK. Successful. No error occured.
- * - ERR_MEM. Out of memory.
- * - ERR_RTE. Could not find route to destination address.
- *
- * @see udp_disconnect() udp_send()
- */
-err_t
-udp_sendto(struct udp_pcb *pcb, struct pbuf *p,
- struct ip_addr *dst_ip, u16_t dst_port)
-{
- err_t err;
- /* temporary space for current PCB remote address */
- struct ip_addr pcb_remote_ip;
- u16_t pcb_remote_port;
- /* remember current remote peer address of PCB */
- pcb_remote_ip.addr = pcb->remote_ip.addr;
- pcb_remote_port = pcb->remote_port;
- /* copy packet destination address to PCB remote peer address */
- pcb->remote_ip.addr = dst_ip->addr;
- pcb->remote_port = dst_port;
- /* send to the packet destination address */
- err = udp_send(pcb, p);
- /* restore PCB remote peer address */
- pcb->remote_ip.addr = pcb_remote_ip.addr;
- pcb->remote_port = pcb_remote_port;
- return err;
-}
-
-/**
- * Send data using UDP.
- *
- * @param pcb UDP PCB used to send the data.
- * @param pbuf chain of pbuf's to be sent.
- *
- * @return lwIP error code.
- * - ERR_OK. Successful. No error occured.
- * - ERR_MEM. Out of memory.
- * - ERR_RTE. Could not find route to destination address.
- *
- * @see udp_disconnect() udp_sendto()
- */
-err_t
-udp_send(struct udp_pcb *pcb, struct pbuf *p)
-{
- struct udp_hdr *udphdr;
- struct netif *netif;
- struct ip_addr *src_ip;
- err_t err;
- struct pbuf *q; /* q will be sent down the stack */
-
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | 3, ("udp_send\n"));
-
- /* if the PCB is not yet bound to a port, bind it here */
- if (pcb->local_port == 0) {
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | 2, ("udp_send: not yet bound to a port, binding now\n"));
- err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
- if (err != ERR_OK) {
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | 2, ("udp_send: forced port bind failed\n"));
- return err;
- }
- }
- /* find the outgoing network interface for this packet */
- netif = ip_route(&(pcb->remote_ip));
- /* no outgoing network interface could be found? */
- if (netif == NULL) {
- LWIP_DEBUGF(UDP_DEBUG | 1, ("udp_send: No route to 0x%"X32_F"\n", pcb->remote_ip.addr));
- UDP_STATS_INC(udp.rterr);
- return ERR_RTE;
- }
-
- /* not enough space to add an UDP header to first pbuf in given p chain? */
- if (pbuf_header(p, UDP_HLEN)) {
- /* allocate header in a seperate new pbuf */
- q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);
- /* new header pbuf could not be allocated? */
- if (q == NULL) {
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | 2, ("udp_send: could not allocate header\n"));
- return ERR_MEM;
- }
- /* chain header q in front of given pbuf p */
- pbuf_chain(q, p);
- /* first pbuf q points to header pbuf */
- LWIP_DEBUGF(UDP_DEBUG,
- ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p));
- /* adding a header within p succeeded */
- } else {
- /* first pbuf q equals given pbuf */
- q = p;
- LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p));
- }
- /* q now represents the packet to be sent */
- udphdr = q->payload;
- udphdr->src = htons(pcb->local_port);
- udphdr->dest = htons(pcb->remote_port);
- /* in UDP, 0 checksum means 'no checksum' */
- udphdr->chksum = 0x0000;
-
- /* PCB local address is IP_ANY_ADDR? */
- if (ip_addr_isany(&pcb->local_ip)) {
- /* use outgoing network interface IP address as source address */
- src_ip = &(netif->ip_addr);
- } else {
- /* use UDP PCB local IP address as source address */
- src_ip = &(pcb->local_ip);
- }
-
- LWIP_DEBUGF(UDP_DEBUG, ("udp_send: sending datagram of length %"U16_F"\n", q->tot_len));
-
- /* UDP Lite protocol? */
- if (pcb->flags & UDP_FLAGS_UDPLITE) {
- LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE packet length %"U16_F"\n", q->tot_len));
- /* set UDP message length in UDP header */
- udphdr->len = htons(pcb->chksum_len);
- /* calculate checksum */
-#if CHECKSUM_GEN_UDP
- udphdr->chksum = inet_chksum_pseudo(q, src_ip, &(pcb->remote_ip),
- IP_PROTO_UDP, pcb->chksum_len);
- /* chksum zero must become 0xffff, as zero means 'no checksum' */
- if (udphdr->chksum == 0x0000)
- udphdr->chksum = 0xffff;
-#else
- udphdr->chksum = 0x0000;
-#endif
- /* output to IP */
- LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDPLITE,)\n"));
- err = ip_output_if(q, src_ip, &pcb->remote_ip, pcb->ttl, pcb->tos, IP_PROTO_UDPLITE, netif);
- } else { /* UDP */
- LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len));
- udphdr->len = htons(q->tot_len);
- /* calculate checksum */
-#if CHECKSUM_GEN_UDP
- if ((pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) {
- udphdr->chksum = inet_chksum_pseudo(q, src_ip, &pcb->remote_ip, IP_PROTO_UDP, q->tot_len);
- /* chksum zero must become 0xffff, as zero means 'no checksum' */
- if (udphdr->chksum == 0x0000) udphdr->chksum = 0xffff;
- }
-#else
- udphdr->chksum = 0x0000;
-#endif
- LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum));
- LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n"));
- /* output to IP */
- err = ip_output_if(q, src_ip, &pcb->remote_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif);
- }
- /* TODO: must this be increased even if error occured? */
- snmp_inc_udpoutdatagrams();
-
- /* did we chain a seperate header pbuf earlier? */
- if (q != p) {
- /* free the header pbuf */
- pbuf_free(q);
- q = NULL;
- /* p is still referenced by the caller, and will live on */
- }
-
- UDP_STATS_INC(udp.xmit);
- return err;
-}
-
-/**
- * Bind an UDP PCB.
- *
- * @param pcb UDP PCB to be bound with a local address ipaddr and port.
- * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to
- * bind to all local interfaces.
- * @param port local UDP port to bind with.
- *
- * @return lwIP error code.
- * - ERR_OK. Successful. No error occured.
- * - ERR_USE. The specified ipaddr and port are already bound to by
- * another UDP PCB.
- *
- * @see udp_disconnect()
- */
-err_t
-udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
-{
- struct udp_pcb *ipcb;
- u8_t rebind;
-
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | 3, ("udp_bind(ipaddr = "));
- ip_addr_debug_print(UDP_DEBUG, ipaddr);
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | 3, (", port = %"U16_F")\n", port));
-
- rebind = 0;
- /* Check for double bind and rebind of the same pcb */
- for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
- /* is this UDP PCB already on active list? */
- if (pcb == ipcb) {
- /* pcb may occur at most once in active list */
- LWIP_ASSERT("rebind == 0", rebind == 0);
- /* pcb already in list, just rebind */
- rebind = 1;
- }
-
- /* this code does not allow upper layer to share a UDP port for
- listening to broadcast or multicast traffic (See SO_REUSE_ADDR and
- SO_REUSE_PORT under *BSD). TODO: See where it fits instead, OR
- combine with implementation of UDP PCB flags. Leon Woestenberg. */
-#ifdef LWIP_UDP_TODO
- /* port matches that of PCB in list? */
- else
- if ((ipcb->local_port == port) &&
- /* IP address matches, or one is IP_ADDR_ANY? */
- (ip_addr_isany(&(ipcb->local_ip)) ||
- ip_addr_isany(ipaddr) ||
- ip_addr_cmp(&(ipcb->local_ip), ipaddr))) {
- /* other PCB already binds to this local IP and port */
- LWIP_DEBUGF(UDP_DEBUG,
- ("udp_bind: local port %"U16_F" already bound by another pcb\n", port));
- return ERR_USE;
- }
-#endif
- }
-
- ip_addr_set(&pcb->local_ip, ipaddr);
-
- /* no port specified? */
- if (port == 0) {
-#ifndef UDP_LOCAL_PORT_RANGE_START
-#define UDP_LOCAL_PORT_RANGE_START 4096
-#define UDP_LOCAL_PORT_RANGE_END 0x7fff
-#endif
- port = UDP_LOCAL_PORT_RANGE_START;
- ipcb = udp_pcbs;
- while ((ipcb != NULL) && (port != UDP_LOCAL_PORT_RANGE_END)) {
- if (ipcb->local_port == port) {
- port++;
- ipcb = udp_pcbs;
- } else
- ipcb = ipcb->next;
- }
- if (ipcb != NULL) {
- /* no more ports available in local range */
- LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n"));
- return ERR_USE;
- }
- }
- pcb->local_port = port;
- snmp_insert_udpidx_tree(pcb);
- /* pcb not active yet? */
- if (rebind == 0) {
- /* place the PCB on the active list if not already there */
- pcb->next = udp_pcbs;
- udp_pcbs = pcb;
- }
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | DBG_STATE,
- ("udp_bind: bound to %"U16_F".%"U16_F".%"U16_F".%"U16_F", port %"U16_F"\n",
- (u16_t)(ntohl(pcb->local_ip.addr) >> 24 & 0xff),
- (u16_t)(ntohl(pcb->local_ip.addr) >> 16 & 0xff),
- (u16_t)(ntohl(pcb->local_ip.addr) >> 8 & 0xff),
- (u16_t)(ntohl(pcb->local_ip.addr) & 0xff), pcb->local_port));
- return ERR_OK;
-}
-/**
- * Connect an UDP PCB.
- *
- * This will associate the UDP PCB with the remote address.
- *
- * @param pcb UDP PCB to be connected with remote address ipaddr and port.
- * @param ipaddr remote IP address to connect with.
- * @param port remote UDP port to connect with.
- *
- * @return lwIP error code
- *
- * @see udp_disconnect()
- */
-err_t
-udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
-{
- struct udp_pcb *ipcb;
-
- if (pcb->local_port == 0) {
- err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);
- if (err != ERR_OK)
- return err;
- }
-
- ip_addr_set(&pcb->remote_ip, ipaddr);
- pcb->remote_port = port;
- pcb->flags |= UDP_FLAGS_CONNECTED;
-/** TODO: this functionality belongs in upper layers */
-#ifdef LWIP_UDP_TODO
- /* Nail down local IP for netconn_addr()/getsockname() */
- if (ip_addr_isany(&pcb->local_ip) && !ip_addr_isany(&pcb->remote_ip)) {
- struct netif *netif;
-
- if ((netif = ip_route(&(pcb->remote_ip))) == NULL) {
- LWIP_DEBUGF(UDP_DEBUG, ("udp_connect: No route to 0x%lx\n", pcb->remote_ip.addr));
- UDP_STATS_INC(udp.rterr);
- return ERR_RTE;
- }
- /** TODO: this will bind the udp pcb locally, to the interface which
- is used to route output packets to the remote address. However, we
- might want to accept incoming packets on any interface! */
- pcb->local_ip = netif->ip_addr;
- } else if (ip_addr_isany(&pcb->remote_ip)) {
- pcb->local_ip.addr = 0;
- }
-#endif
- LWIP_DEBUGF(UDP_DEBUG | DBG_TRACE | DBG_STATE,
- ("udp_connect: connected to %"U16_F".%"U16_F".%"U16_F".%"U16_F",port %"U16_F"\n",
- (u16_t)(ntohl(pcb->remote_ip.addr) >> 24 & 0xff),
- (u16_t)(ntohl(pcb->remote_ip.addr) >> 16 & 0xff),
- (u16_t)(ntohl(pcb->remote_ip.addr) >> 8 & 0xff),
- (u16_t)(ntohl(pcb->remote_ip.addr) & 0xff), pcb->remote_port));
-
- /* Insert UDP PCB into the list of active UDP PCBs. */
- for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {
- if (pcb == ipcb) {
- /* already on the list, just return */
- return ERR_OK;
- }
- }
- /* PCB not yet on the list, add PCB now */
- pcb->next = udp_pcbs;
- udp_pcbs = pcb;
- return ERR_OK;
-}
-
-void
-udp_disconnect(struct udp_pcb *pcb)
-{
- /* reset remote address association */
- ip_addr_set(&pcb->remote_ip, IP_ADDR_ANY);
- pcb->remote_port = 0;
- /* mark PCB as unconnected */
- pcb->flags &= ~UDP_FLAGS_CONNECTED;
-}
-
-void
-udp_recv(struct udp_pcb *pcb,
- void (* recv)(void *arg, struct udp_pcb *upcb, struct pbuf *p,
- struct ip_addr *addr, u16_t port),
- void *recv_arg)
-{
- /* remember recv() callback and user data */
- pcb->recv = recv;
- pcb->recv_arg = recv_arg;
-}
-
-/**
- * Remove an UDP PCB.
- *
- * @param pcb UDP PCB to be removed. The PCB is removed from the list of
- * UDP PCB's and the data structure is freed from memory.
- *
- * @see udp_new()
- */
-void
-udp_remove(struct udp_pcb *pcb)
-{
- struct udp_pcb *pcb2;
-
- snmp_delete_udpidx_tree(pcb);
- /* pcb to be removed is first in list? */
- if (udp_pcbs == pcb) {
- /* make list start at 2nd pcb */
- udp_pcbs = udp_pcbs->next;
- /* pcb not 1st in list */
- } else
- for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {
- /* find pcb in udp_pcbs list */
- if (pcb2->next != NULL && pcb2->next == pcb) {
- /* remove pcb from list */
- pcb2->next = pcb->next;
- }
- }
- memp_free(MEMP_UDP_PCB, pcb);
-}
-
-/**
- * Create a UDP PCB.
- *
- * @return The UDP PCB which was created. NULL if the PCB data structure
- * could not be allocated.
- *
- * @see udp_remove()
- */
-struct udp_pcb *
-udp_new(void)
-{
- struct udp_pcb *pcb;
- pcb = memp_malloc(MEMP_UDP_PCB);
- /* could allocate UDP PCB? */
- if (pcb != NULL) {
- /* initialize PCB to all zeroes */
- memset(pcb, 0, sizeof(struct udp_pcb));
- pcb->ttl = UDP_TTL;
- }
- return pcb;
-}
-
-#if UDP_DEBUG
-void
-udp_debug_print(struct udp_hdr *udphdr)
-{
- LWIP_DEBUGF(UDP_DEBUG, ("UDP header:\n"));
- LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n",
- ntohs(udphdr->src), ntohs(udphdr->dest)));
- LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n"));
- LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | 0x%04"X16_F" | (len, chksum)\n",
- ntohs(udphdr->len), ntohs(udphdr->chksum)));
- LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n"));
-}
-#endif /* UDP_DEBUG */
-
-#endif /* LWIP_UDP */
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/icmp.h b/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/icmp.h
deleted file mode 100644
index 634405b..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/icmp.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_ICMP_H__
-#define __LWIP_ICMP_H__
-
-#include "lwip/arch.h"
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-
-#define ICMP_ER 0 /* echo reply */
-#define ICMP_DUR 3 /* destination unreachable */
-#define ICMP_SQ 4 /* source quench */
-#define ICMP_RD 5 /* redirect */
-#define ICMP_ECHO 8 /* echo */
-#define ICMP_TE 11 /* time exceeded */
-#define ICMP_PP 12 /* parameter problem */
-#define ICMP_TS 13 /* timestamp */
-#define ICMP_TSR 14 /* timestamp reply */
-#define ICMP_IRQ 15 /* information request */
-#define ICMP_IR 16 /* information reply */
-
-enum icmp_dur_type {
- ICMP_DUR_NET = 0, /* net unreachable */
- ICMP_DUR_HOST = 1, /* host unreachable */
- ICMP_DUR_PROTO = 2, /* protocol unreachable */
- ICMP_DUR_PORT = 3, /* port unreachable */
- ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */
- ICMP_DUR_SR = 5 /* source route failed */
-};
-
-enum icmp_te_type {
- ICMP_TE_TTL = 0, /* time to live exceeded in transit */
- ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */
-};
-
-void icmp_input(struct pbuf *p, struct netif *inp);
-
-void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t);
-void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t);
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct icmp_echo_hdr {
- PACK_STRUCT_FIELD(u16_t _type_code);
- PACK_STRUCT_FIELD(u16_t chksum);
- PACK_STRUCT_FIELD(u16_t id);
- PACK_STRUCT_FIELD(u16_t seqno);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-
-PACK_STRUCT_BEGIN
-struct icmp_dur_hdr {
- PACK_STRUCT_FIELD(u16_t _type_code);
- PACK_STRUCT_FIELD(u16_t chksum);
- PACK_STRUCT_FIELD(u32_t unused);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-
-PACK_STRUCT_BEGIN
-struct icmp_te_hdr {
- PACK_STRUCT_FIELD(u16_t _type_code);
- PACK_STRUCT_FIELD(u16_t chksum);
- PACK_STRUCT_FIELD(u32_t unused);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-#define ICMPH_TYPE(hdr) (ntohs((hdr)->_type_code) >> 8)
-#define ICMPH_CODE(hdr) (ntohs((hdr)->_type_code) & 0xff)
-
-#define ICMPH_TYPE_SET(hdr, type) ((hdr)->_type_code = htons(ICMPH_CODE(hdr) | ((type) << 8)))
-#define ICMPH_CODE_SET(hdr, code) ((hdr)->_type_code = htons((code) | (ICMPH_TYPE(hdr) << 8)))
-
-#endif /* __LWIP_ICMP_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/inet.h b/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/inet.h
deleted file mode 100644
index 57a55a3..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/inet.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_INET_H__
-#define __LWIP_INET_H__
-
-#include "lwip/arch.h"
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip_addr.h"
-
-u16_t inet_chksum(void *dataptr, u16_t len);
-#if 0 /* optimized routine */
-u16_t inet_chksum4(u8_t *dataptr, u16_t len);
-#endif
-u16_t inet_chksum_pbuf(struct pbuf *p);
-u16_t inet_chksum_pseudo(struct pbuf *p,
- struct ip_addr *src, struct ip_addr *dest,
- u8_t proto, u16_t proto_len);
-
-u32_t inet_addr(const char *cp);
-int inet_aton(const char *cp, struct in_addr *addr);
-char *inet_ntoa(struct in_addr addr); /* returns ptr to static buffer; not reentrant! */
-
-#ifdef htons
-#undef htons
-#endif /* htons */
-#ifdef htonl
-#undef htonl
-#endif /* htonl */
-#ifdef ntohs
-#undef ntohs
-#endif /* ntohs */
-#ifdef ntohl
-#undef ntohl
-#endif /* ntohl */
-
-#ifndef LWIP_PLATFORM_BYTESWAP
-#define LWIP_PLATFORM_BYTESWAP 0
-#endif
-
-#if BYTE_ORDER == BIG_ENDIAN
-#define htons(x) (x)
-#define ntohs(x) (x)
-#define htonl(x) (x)
-#define ntohl(x) (x)
-#else /* BYTE_ORDER != BIG_ENDIAN */
-#ifdef LWIP_PREFIX_BYTEORDER_FUNCS
-/* workaround for naming collisions on some platforms */
-#define htons lwip_htons
-#define ntohs lwip_ntohs
-#define htonl lwip_htonl
-#define ntohl lwip_ntohl
-#endif
-#if LWIP_PLATFORM_BYTESWAP
-#define htons(x) LWIP_PLATFORM_HTONS(x)
-#define ntohs(x) LWIP_PLATFORM_HTONS(x)
-#define htonl(x) LWIP_PLATFORM_HTONL(x)
-#define ntohl(x) LWIP_PLATFORM_HTONL(x)
-#else
-u16_t htons(u16_t x);
-u16_t ntohs(u16_t x);
-u32_t htonl(u32_t x);
-u32_t ntohl(u32_t x);
-#endif
-
-#endif
-
-#endif /* __LWIP_INET_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip.h b/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip.h
deleted file mode 100644
index 9f745f5..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_IP_H__
-#define __LWIP_IP_H__
-
-#include "lwip/arch.h"
-
-#include "lwip/def.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip_addr.h"
-
-#include "lwip/err.h"
-
-
-void ip_init(void);
-struct netif *ip_route(struct ip_addr *dest);
-err_t ip_input(struct pbuf *p, struct netif *inp);
-err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
- u8_t ttl, u8_t tos, u8_t proto);
-err_t ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
- u8_t ttl, u8_t tos, u8_t proto,
- struct netif *netif);
-
-#define IP_HLEN 20
-
-#define IP_PROTO_ICMP 1
-#define IP_PROTO_UDP 17
-#define IP_PROTO_UDPLITE 136
-#define IP_PROTO_TCP 6
-
-/* This is passed as the destination address to ip_output_if (not
- to ip_output), meaning that an IP header already is constructed
- in the pbuf. This is used when TCP retransmits. */
-#ifdef IP_HDRINCL
-#undef IP_HDRINCL
-#endif /* IP_HDRINCL */
-#define IP_HDRINCL NULL
-
-
-/* This is the common part of all PCB types. It needs to be at the
- beginning of a PCB type definition. It is located here so that
- changes to this common part are made in one location instead of
- having to change all PCB structs. */
-#define IP_PCB struct ip_addr local_ip; \
- struct ip_addr remote_ip; \
- /* Socket options */ \
- u16_t so_options; \
- /* Type Of Service */ \
- u8_t tos; \
- /* Time To Live */ \
- u8_t ttl
-
-/*
- * Option flags per-socket. These are the same like SO_XXX.
- */
-#define SOF_DEBUG (u16_t)0x0001U /* turn on debugging info recording */
-#define SOF_ACCEPTCONN (u16_t)0x0002U /* socket has had listen() */
-#define SOF_REUSEADDR (u16_t)0x0004U /* allow local address reuse */
-#define SOF_KEEPALIVE (u16_t)0x0008U /* keep connections alive */
-#define SOF_DONTROUTE (u16_t)0x0010U /* just use interface addresses */
-#define SOF_BROADCAST (u16_t)0x0020U /* permit sending of broadcast msgs */
-#define SOF_USELOOPBACK (u16_t)0x0040U /* bypass hardware when possible */
-#define SOF_LINGER (u16_t)0x0080U /* linger on close if data present */
-#define SOF_OOBINLINE (u16_t)0x0100U /* leave received OOB data in line */
-#define SOF_REUSEPORT (u16_t)0x0200U /* allow local address & port reuse */
-
-
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip_hdr {
- /* version / header length / type of service */
- PACK_STRUCT_FIELD(u16_t _v_hl_tos);
- /* total length */
- PACK_STRUCT_FIELD(u16_t _len);
- /* identification */
- PACK_STRUCT_FIELD(u16_t _id);
- /* fragment offset field */
- PACK_STRUCT_FIELD(u16_t _offset);
-#define IP_RF 0x8000 /* reserved fragment flag */
-#define IP_DF 0x4000 /* dont fragment flag */
-#define IP_MF 0x2000 /* more fragments flag */
-#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
- /* time to live / protocol*/
- PACK_STRUCT_FIELD(u16_t _ttl_proto);
- /* checksum */
- PACK_STRUCT_FIELD(u16_t _chksum);
- /* source and destination IP addresses */
- PACK_STRUCT_FIELD(struct ip_addr src);
- PACK_STRUCT_FIELD(struct ip_addr dest);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-#define IPH_V(hdr) (ntohs((hdr)->_v_hl_tos) >> 12)
-#define IPH_HL(hdr) ((ntohs((hdr)->_v_hl_tos) >> 8) & 0x0f)
-#define IPH_TOS(hdr) (ntohs((hdr)->_v_hl_tos) & 0xff)
-#define IPH_LEN(hdr) ((hdr)->_len)
-#define IPH_ID(hdr) ((hdr)->_id)
-#define IPH_OFFSET(hdr) ((hdr)->_offset)
-#define IPH_TTL(hdr) (ntohs((hdr)->_ttl_proto) >> 8)
-#define IPH_PROTO(hdr) (ntohs((hdr)->_ttl_proto) & 0xff)
-#define IPH_CHKSUM(hdr) ((hdr)->_chksum)
-
-#define IPH_VHLTOS_SET(hdr, v, hl, tos) (hdr)->_v_hl_tos = (htons(((v) << 12) | ((hl) << 8) | (tos)))
-#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len)
-#define IPH_ID_SET(hdr, id) (hdr)->_id = (id)
-#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off)
-#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl_proto = (htons(IPH_PROTO(hdr) | ((u16_t)(ttl) << 8)))
-#define IPH_PROTO_SET(hdr, proto) (hdr)->_ttl_proto = (htons((proto) | (IPH_TTL(hdr) << 8)))
-#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum)
-
-#if IP_DEBUG
-void ip_debug_print(struct pbuf *p);
-#else
-#define ip_debug_print(p)
-#endif /* IP_DEBUG */
-
-#endif /* __LWIP_IP_H__ */
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip_addr.h b/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip_addr.h
deleted file mode 100644
index d877ebe..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip_addr.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_IP_ADDR_H__
-#define __LWIP_IP_ADDR_H__
-
-#include "lwip/arch.h"
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip_addr {
- PACK_STRUCT_FIELD(u32_t addr);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-/*
- * struct ipaddr2 is used in the definition of the ARP packet format in
- * order to support compilers that don't have structure packing.
- */
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ip_addr2 {
- PACK_STRUCT_FIELD(u16_t addrw[2]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-/* For compatibility with BSD code */
-struct in_addr {
- u32_t s_addr;
-};
-
-struct netif;
-
-extern const struct ip_addr ip_addr_any;
-extern const struct ip_addr ip_addr_broadcast;
-
-/** IP_ADDR_ can be used as a fixed IP address
- * for the wildcard and the broadcast address
- */
-#define IP_ADDR_ANY ((struct ip_addr *)&ip_addr_any)
-#define IP_ADDR_BROADCAST ((struct ip_addr *)&ip_addr_broadcast)
-
-#define INADDR_NONE ((u32_t)0xffffffff) /* 255.255.255.255 */
-#define INADDR_LOOPBACK ((u32_t)0x7f000001) /* 127.0.0.1 */
-
-/* Definitions of the bits in an Internet address integer.
-
- On subnets, host and network parts are found according to
- the subnet mask, not these masks. */
-
-#define IN_CLASSA(a) ((((u32_t)(a)) & 0x80000000) == 0)
-#define IN_CLASSA_NET 0xff000000
-#define IN_CLASSA_NSHIFT 24
-#define IN_CLASSA_HOST (0xffffffff & ~IN_CLASSA_NET)
-#define IN_CLASSA_MAX 128
-
-#define IN_CLASSB(a) ((((u32_t)(a)) & 0xc0000000) == 0x80000000)
-#define IN_CLASSB_NET 0xffff0000
-#define IN_CLASSB_NSHIFT 16
-#define IN_CLASSB_HOST (0xffffffff & ~IN_CLASSB_NET)
-#define IN_CLASSB_MAX 65536
-
-#define IN_CLASSC(a) ((((u32_t)(a)) & 0xe0000000) == 0xc0000000)
-#define IN_CLASSC_NET 0xffffff00
-#define IN_CLASSC_NSHIFT 8
-#define IN_CLASSC_HOST (0xffffffff & ~IN_CLASSC_NET)
-
-#define IN_CLASSD(a) (((u32_t)(a) & 0xf0000000) == 0xe0000000)
-#define IN_CLASSD_NET 0xf0000000 /* These ones aren't really */
-#define IN_CLASSD_NSHIFT 28 /* net and host fields, but */
-#define IN_CLASSD_HOST 0x0fffffff /* routing needn't know. */
-#define IN_MULTICAST(a) IN_CLASSD(a)
-
-#define IN_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000) == 0xf0000000)
-#define IN_BADCLASS(a) (((u32_t)(a) & 0xf0000000) == 0xf0000000)
-
-#define IN_LOOPBACKNET 127 /* official! */
-
-#define IP4_ADDR(ipaddr, a,b,c,d) \
- (ipaddr)->addr = htonl(((u32_t)((a) & 0xff) << 24) | \
- ((u32_t)((b) & 0xff) << 16) | \
- ((u32_t)((c) & 0xff) << 8) | \
- (u32_t)((d) & 0xff))
-
-#define ip_addr_set(dest, src) (dest)->addr = \
- ((src) == NULL? 0:\
- (src)->addr)
-/**
- * Determine if two address are on the same network.
- *
- * @arg addr1 IP address 1
- * @arg addr2 IP address 2
- * @arg mask network identifier mask
- * @return !0 if the network identifiers of both address match
- */
-#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
- (mask)->addr) == \
- ((addr2)->addr & \
- (mask)->addr))
-#define ip_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)
-
-#define ip_addr_isany(addr1) ((addr1) == NULL || (addr1)->addr == 0)
-
-u8_t ip_addr_isbroadcast(struct ip_addr *, struct netif *);
-
-#define ip_addr_ismulticast(addr1) (((addr1)->addr & ntohl(0xf0000000)) == ntohl(0xe0000000))
-
-#define ip_addr_debug_print(debug, ipaddr) \
- LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F, \
- ipaddr ? (u16_t)(ntohl((ipaddr)->addr) >> 24) & 0xff : 0, \
- ipaddr ? (u16_t)(ntohl((ipaddr)->addr) >> 16) & 0xff : 0, \
- ipaddr ? (u16_t)(ntohl((ipaddr)->addr) >> 8) & 0xff : 0, \
- ipaddr ? (u16_t)ntohl((ipaddr)->addr) & 0xff : 0))
-
-/* These are cast to u16_t, with the intent that they are often arguments
- * to printf using the U16_F format from cc.h. */
-#define ip4_addr1(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 24) & 0xff)
-#define ip4_addr2(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 16) & 0xff)
-#define ip4_addr3(ipaddr) ((u16_t)(ntohl((ipaddr)->addr) >> 8) & 0xff)
-#define ip4_addr4(ipaddr) ((u16_t)(ntohl((ipaddr)->addr)) & 0xff)
-
-#endif /* __LWIP_IP_ADDR_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip_frag.h b/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip_frag.h
deleted file mode 100644
index a326c1c..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv4/lwip/ip_frag.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Jani Monoses <jani at iv.ro>
- *
- */
-
-#ifndef __LWIP_IP_FRAG_H__
-#define __LWIP_IP_FRAG_H__
-
-#include "lwip/opt.h"
-#include "lwip/err.h"
-#include "lwip/pbuf.h"
-#include "lwip/netif.h"
-#include "lwip/ip_addr.h"
-
-void ip_frag_init(void);
-void ip_reass_tmr(void);
-struct pbuf * ip_reass(struct pbuf *p);
-err_t ip_frag(struct pbuf *p, struct netif *netif, struct ip_addr *dest);
-
-#endif /* __LWIP_IP_FRAG_H__ */
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/icmp.h b/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/icmp.h
deleted file mode 100644
index 2b6adb1..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/icmp.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_ICMP_H__
-#define __LWIP_ICMP_H__
-
-#include "lwip/arch.h"
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-
-#include "lwip/netif.h"
-
-#define ICMP6_DUR 1
-#define ICMP6_TE 3
-#define ICMP6_ECHO 128 /* echo */
-#define ICMP6_ER 129 /* echo reply */
-
-
-enum icmp_dur_type {
- ICMP_DUR_NET = 0, /* net unreachable */
- ICMP_DUR_HOST = 1, /* host unreachable */
- ICMP_DUR_PROTO = 2, /* protocol unreachable */
- ICMP_DUR_PORT = 3, /* port unreachable */
- ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */
- ICMP_DUR_SR = 5 /* source route failed */
-};
-
-enum icmp_te_type {
- ICMP_TE_TTL = 0, /* time to live exceeded in transit */
- ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */
-};
-
-void icmp_input(struct pbuf *p, struct netif *inp);
-
-void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t);
-void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t);
-
-struct icmp_echo_hdr {
- u8_t type;
- u8_t icode;
- u16_t chksum;
- u16_t id;
- u16_t seqno;
-};
-
-struct icmp_dur_hdr {
- u8_t type;
- u8_t icode;
- u16_t chksum;
- u32_t unused;
-};
-
-struct icmp_te_hdr {
- u8_t type;
- u8_t icode;
- u16_t chksum;
- u32_t unused;
-};
-
-#endif /* __LWIP_ICMP_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/inet.h b/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/inet.h
deleted file mode 100644
index ae78343..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/inet.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_INET_H__
-#define __LWIP_INET_H__
-
-#include "lwip/arch.h"
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip_addr.h"
-
-u16_t inet_chksum(void *data, u16_t len);
-u16_t inet_chksum_pbuf(struct pbuf *p);
-u16_t inet_chksum_pseudo(struct pbuf *p,
- struct ip_addr *src, struct ip_addr *dest,
- u8_t proto, u32_t proto_len);
-
-u32_t inet_addr(const char *cp);
-s8_t inet_aton(const char *cp, struct in_addr *addr);
-
-#ifndef _MACHINE_ENDIAN_H_
-#ifndef _NETINET_IN_H
-#ifndef _LINUX_BYTEORDER_GENERIC_H
-u16_t htons(u16_t n);
-u16_t ntohs(u16_t n);
-u32_t htonl(u32_t n);
-u32_t ntohl(u32_t n);
-#endif /* _LINUX_BYTEORDER_GENERIC_H */
-#endif /* _NETINET_IN_H */
-#endif /* _MACHINE_ENDIAN_H_ */
-
-#endif /* __LWIP_INET_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/ip.h b/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/ip.h
deleted file mode 100644
index 6d7d510..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/ip.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_IP_H__
-#define __LWIP_IP_H__
-
-#include "lwip/opt.h"
-#include "lwip/def.h"
-#include "lwip/pbuf.h"
-#include "lwip/ip_addr.h"
-
-#include "lwip/err.h"
-
-#define IP_HLEN 40
-
-#define IP_PROTO_ICMP 58
-#define IP_PROTO_UDP 17
-#define IP_PROTO_UDPLITE 136
-#define IP_PROTO_TCP 6
-
-/* This is passed as the destination address to ip_output_if (not
- to ip_output), meaning that an IP header already is constructed
- in the pbuf. This is used when TCP retransmits. */
-#ifdef IP_HDRINCL
-#undef IP_HDRINCL
-#endif /* IP_HDRINCL */
-#define IP_HDRINCL NULL
-
-
-/* The IPv6 header. */
-struct ip_hdr {
-#if BYTE_ORDER == LITTLE_ENDIAN
- u8_t tclass1:4, v:4;
- u8_t flow1:4, tclass2:4;
-#else
- u8_t v:4, tclass1:4;
- u8_t tclass2:8, flow1:4;
-#endif
- u16_t flow2;
- u16_t len; /* payload length */
- u8_t nexthdr; /* next header */
- u8_t hoplim; /* hop limit (TTL) */
- struct ip_addr src, dest; /* source and destination IP addresses */
-};
-
-void ip_init(void);
-
-#include "lwip/netif.h"
-
-struct netif *ip_route(struct ip_addr *dest);
-
-void ip_input(struct pbuf *p, struct netif *inp);
-
-/* source and destination addresses in network byte order, please */
-err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
- u8_t ttl, u8_t proto);
-
-err_t ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest,
- u8_t ttl, u8_t proto,
- struct netif *netif);
-
-#if IP_DEBUG
-void ip_debug_print(struct pbuf *p);
-#endif /* IP_DEBUG */
-
-#endif /* __LWIP_IP_H__ */
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/ip_addr.h b/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/ip_addr.h
deleted file mode 100644
index db1f090..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/ipv6/lwip/ip_addr.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_IP_ADDR_H__
-#define __LWIP_IP_ADDR_H__
-
-#include "lwip/arch.h"
-
-#define IP_ADDR_ANY 0
-
-struct ip_addr {
- u32_t addr[4];
-};
-
-#define IP6_ADDR(ipaddr, a,b,c,d,e,f,g,h) do { (ipaddr)->addr[0] = htonl((u32_t)((a & 0xffff) << 16) | (b & 0xffff)); \
- (ipaddr)->addr[1] = htonl(((c & 0xffff) << 16) | (d & 0xffff)); \
- (ipaddr)->addr[2] = htonl(((e & 0xffff) << 16) | (f & 0xffff)); \
- (ipaddr)->addr[3] = htonl(((g & 0xffff) << 16) | (h & 0xffff)); } while(0)
-
-u8_t ip_addr_netcmp(struct ip_addr *addr1, struct ip_addr *addr2,
- struct ip_addr *mask);
-u8_t ip_addr_cmp(struct ip_addr *addr1, struct ip_addr *addr2);
-void ip_addr_set(struct ip_addr *dest, struct ip_addr *src);
-u8_t ip_addr_isany(struct ip_addr *addr);
-
-
-#if IP_DEBUG
-void ip_addr_debug_print(struct ip_addr *addr);
-#endif /* IP_DEBUG */
-
-#endif /* __LWIP_IP_ADDR_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/api.h b/src/VBox/Devices/Network/lwip/src/include/lwip/api.h
deleted file mode 100644
index 7f0ad59..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/api.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_API_H__
-#define __LWIP_API_H__
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-#include "lwip/sys.h"
-
-#include "lwip/ip.h"
-
-#include "lwip/raw.h"
-#include "lwip/udp.h"
-#include "lwip/tcp.h"
-
-#include "lwip/err.h"
-
-#define NETCONN_NOCOPY 0x00
-#define NETCONN_COPY 0x01
-
-enum netconn_type {
- NETCONN_TCP,
- NETCONN_UDP,
- NETCONN_UDPLITE,
- NETCONN_UDPNOCHKSUM,
- NETCONN_RAW
-};
-
-enum netconn_state {
- NETCONN_NONE,
- NETCONN_WRITE,
- NETCONN_ACCEPT,
- NETCONN_RECV,
- NETCONN_CONNECT,
- NETCONN_CLOSE
-};
-
-enum netconn_evt {
- NETCONN_EVT_RCVPLUS,
- NETCONN_EVT_RCVMINUS,
- NETCONN_EVT_SENDPLUS,
- NETCONN_EVT_SENDMINUS
-};
-
-struct netbuf {
- struct pbuf *p, *ptr;
- struct ip_addr *fromaddr;
- u16_t fromport;
- err_t err;
-};
-
-struct netconn {
- enum netconn_type type;
- enum netconn_state state;
- union {
- struct tcp_pcb *tcp;
- struct udp_pcb *udp;
- struct raw_pcb *raw;
- } pcb;
- err_t err;
- sys_mbox_t mbox;
- sys_mbox_t recvmbox;
- sys_mbox_t acceptmbox;
- sys_sem_t sem;
- int socket;
- u16_t recv_avail;
- void (* callback)(struct netconn *, enum netconn_evt, u16_t len);
-};
-
-/* Network buffer functions: */
-struct netbuf * netbuf_new (void);
-void netbuf_delete (struct netbuf *buf);
-void * netbuf_alloc (struct netbuf *buf, u16_t size);
-void netbuf_free (struct netbuf *buf);
-void netbuf_ref (struct netbuf *buf,
- void *dataptr, u16_t size);
-void netbuf_chain (struct netbuf *head,
- struct netbuf *tail);
-
-u16_t netbuf_len (struct netbuf *buf);
-err_t netbuf_data (struct netbuf *buf,
- void **dataptr, u16_t *len);
-s8_t netbuf_next (struct netbuf *buf);
-void netbuf_first (struct netbuf *buf);
-
-void netbuf_copy (struct netbuf *buf,
- void *dataptr, u16_t len);
-void netbuf_copy_partial(struct netbuf *buf, void *dataptr,
- u16_t len, u16_t offset);
-struct ip_addr * netbuf_fromaddr (struct netbuf *buf);
-u16_t netbuf_fromport (struct netbuf *buf);
-
-/* Network connection functions: */
-struct netconn * netconn_new (enum netconn_type type);
-struct
-netconn *netconn_new_with_callback(enum netconn_type t,
- void (*callback)(struct netconn *, enum netconn_evt, u16_t len));
-struct
-netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u16_t proto,
- void (*callback)(struct netconn *, enum netconn_evt, u16_t len));
-err_t netconn_delete (struct netconn *conn);
-enum netconn_type netconn_type (struct netconn *conn);
-err_t netconn_peer (struct netconn *conn,
- struct ip_addr *addr,
- u16_t *port);
-err_t netconn_addr (struct netconn *conn,
- struct ip_addr **addr,
- u16_t *port);
-err_t netconn_bind (struct netconn *conn,
- struct ip_addr *addr,
- u16_t port);
-err_t netconn_connect (struct netconn *conn,
- struct ip_addr *addr,
- u16_t port);
-err_t netconn_disconnect (struct netconn *conn);
-err_t netconn_listen (struct netconn *conn);
-struct netconn * netconn_accept (struct netconn *conn);
-struct netbuf * netconn_recv (struct netconn *conn);
-err_t netconn_send (struct netconn *conn,
- struct netbuf *buf);
-err_t netconn_write (struct netconn *conn,
- void *dataptr, u16_t size,
- u8_t copy);
-err_t netconn_close (struct netconn *conn);
-
-err_t netconn_err (struct netconn *conn);
-
-#endif /* __LWIP_API_H__ */
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/api_msg.h b/src/VBox/Devices/Network/lwip/src/include/lwip/api_msg.h
deleted file mode 100644
index 3fef3dd..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/api_msg.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_API_MSG_H__
-#define __LWIP_API_MSG_H__
-
-#include "lwip/opt.h"
-#include "lwip/pbuf.h"
-#include "lwip/sys.h"
-
-#include "lwip/ip.h"
-
-#include "lwip/udp.h"
-#include "lwip/tcp.h"
-
-#include "lwip/api.h"
-
-enum api_msg_type {
- API_MSG_NEWCONN,
- API_MSG_DELCONN,
-
- API_MSG_BIND,
- API_MSG_CONNECT,
- API_MSG_DISCONNECT,
-
- API_MSG_LISTEN,
- API_MSG_ACCEPT,
-
- API_MSG_SEND,
- API_MSG_RECV,
- API_MSG_WRITE,
-
- API_MSG_CLOSE,
-
- API_MSG_MAX
-};
-
-struct api_msg_msg {
- struct netconn *conn;
- enum netconn_type conntype;
- union {
- struct pbuf *p;
- struct {
- struct ip_addr *ipaddr;
- u16_t port;
- } bc;
- struct {
- void *dataptr;
- u16_t len;
- u8_t copy;
- } w;
- sys_mbox_t mbox;
- u16_t len;
- } msg;
-};
-
-struct api_msg {
- enum api_msg_type type;
- struct api_msg_msg msg;
-};
-
-void api_msg_input(struct api_msg *msg);
-void api_msg_post(struct api_msg *msg);
-
-#endif /* __LWIP_API_MSG_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/arch.h b/src/VBox/Devices/Network/lwip/src/include/lwip/arch.h
deleted file mode 100644
index 3713bba..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/arch.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_ARCH_H__
-#define __LWIP_ARCH_H__
-
-#ifndef LITTLE_ENDIAN
-#define LITTLE_ENDIAN 1234
-#endif
-
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN 4321
-#endif
-
-#include "arch/cc.h"
-
-#ifndef PACK_STRUCT_BEGIN
-#define PACK_STRUCT_BEGIN
-#endif /* PACK_STRUCT_BEGIN */
-
-#ifndef PACK_STRUCT_END
-#define PACK_STRUCT_END
-#endif /* PACK_STRUCT_END */
-
-#ifndef PACK_STRUCT_FIELD
-#define PACK_STRUCT_FIELD(x) x
-#endif /* PACK_STRUCT_FIELD */
-
-
-
-#ifdef LWIP_PROVIDE_ERRNO
-
-#define EPERM 1 /* Operation not permitted */
-#define ENOENT 2 /* No such file or directory */
-#define ESRCH 3 /* No such process */
-#define EINTR 4 /* Interrupted system call */
-#define EIO 5 /* I/O error */
-#define ENXIO 6 /* No such device or address */
-#define E2BIG 7 /* Arg list too long */
-#define ENOEXEC 8 /* Exec format error */
-#define EBADF 9 /* Bad file number */
-#define ECHILD 10 /* No child processes */
-#define EAGAIN 11 /* Try again */
-#define ENOMEM 12 /* Out of memory */
-#define EACCES 13 /* Permission denied */
-#define EFAULT 14 /* Bad address */
-#define ENOTBLK 15 /* Block device required */
-#define EBUSY 16 /* Device or resource busy */
-#define EEXIST 17 /* File exists */
-#define EXDEV 18 /* Cross-device link */
-#define ENODEV 19 /* No such device */
-#define ENOTDIR 20 /* Not a directory */
-#define EISDIR 21 /* Is a directory */
-#define EINVAL 22 /* Invalid argument */
-#define ENFILE 23 /* File table overflow */
-#define EMFILE 24 /* Too many open files */
-#define ENOTTY 25 /* Not a typewriter */
-#define ETXTBSY 26 /* Text file busy */
-#define EFBIG 27 /* File too large */
-#define ENOSPC 28 /* No space left on device */
-#define ESPIPE 29 /* Illegal seek */
-#define EROFS 30 /* Read-only file system */
-#define EMLINK 31 /* Too many links */
-#define EPIPE 32 /* Broken pipe */
-#define EDOM 33 /* Math argument out of domain of func */
-#define ERANGE 34 /* Math result not representable */
-#define EDEADLK 35 /* Resource deadlock would occur */
-#define ENAMETOOLONG 36 /* File name too long */
-#define ENOLCK 37 /* No record locks available */
-#define ENOSYS 38 /* Function not implemented */
-#define ENOTEMPTY 39 /* Directory not empty */
-#define ELOOP 40 /* Too many symbolic links encountered */
-#define EWOULDBLOCK EAGAIN /* Operation would block */
-#define ENOMSG 42 /* No message of desired type */
-#define EIDRM 43 /* Identifier removed */
-#define ECHRNG 44 /* Channel number out of range */
-#define EL2NSYNC 45 /* Level 2 not synchronized */
-#define EL3HLT 46 /* Level 3 halted */
-#define EL3RST 47 /* Level 3 reset */
-#define ELNRNG 48 /* Link number out of range */
-#define EUNATCH 49 /* Protocol driver not attached */
-#define ENOCSI 50 /* No CSI structure available */
-#define EL2HLT 51 /* Level 2 halted */
-#define EBADE 52 /* Invalid exchange */
-#define EBADR 53 /* Invalid request descriptor */
-#define EXFULL 54 /* Exchange full */
-#define ENOANO 55 /* No anode */
-#define EBADRQC 56 /* Invalid request code */
-#define EBADSLT 57 /* Invalid slot */
-
-#define EDEADLOCK EDEADLK
-
-#define EBFONT 59 /* Bad font file format */
-#define ENOSTR 60 /* Device not a stream */
-#define ENODATA 61 /* No data available */
-#define ETIME 62 /* Timer expired */
-#define ENOSR 63 /* Out of streams resources */
-#define ENONET 64 /* Machine is not on the network */
-#define ENOPKG 65 /* Package not installed */
-#define EREMOTE 66 /* Object is remote */
-#define ENOLINK 67 /* Link has been severed */
-#define EADV 68 /* Advertise error */
-#define ESRMNT 69 /* Srmount error */
-#define ECOMM 70 /* Communication error on send */
-#define EPROTO 71 /* Protocol error */
-#define EMULTIHOP 72 /* Multihop attempted */
-#define EDOTDOT 73 /* RFS specific error */
-#define EBADMSG 74 /* Not a data message */
-#define EOVERFLOW 75 /* Value too large for defined data type */
-#define ENOTUNIQ 76 /* Name not unique on network */
-#define EBADFD 77 /* File descriptor in bad state */
-#define EREMCHG 78 /* Remote address changed */
-#define ELIBACC 79 /* Can not access a needed shared library */
-#define ELIBBAD 80 /* Accessing a corrupted shared library */
-#define ELIBSCN 81 /* .lib section in a.out corrupted */
-#define ELIBMAX 82 /* Attempting to link in too many shared libraries */
-#define ELIBEXEC 83 /* Cannot exec a shared library directly */
-#define EILSEQ 84 /* Illegal byte sequence */
-#define ERESTART 85 /* Interrupted system call should be restarted */
-#define ESTRPIPE 86 /* Streams pipe error */
-#define EUSERS 87 /* Too many users */
-#define ENOTSOCK 88 /* Socket operation on non-socket */
-#define EDESTADDRREQ 89 /* Destination address required */
-#define EMSGSIZE 90 /* Message too long */
-#define EPROTOTYPE 91 /* Protocol wrong type for socket */
-#define ENOPROTOOPT 92 /* Protocol not available */
-#define EPROTONOSUPPORT 93 /* Protocol not supported */
-#define ESOCKTNOSUPPORT 94 /* Socket type not supported */
-#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */
-#define EPFNOSUPPORT 96 /* Protocol family not supported */
-#define EAFNOSUPPORT 97 /* Address family not supported by protocol */
-#define EADDRINUSE 98 /* Address already in use */
-#define EADDRNOTAVAIL 99 /* Cannot assign requested address */
-#define ENETDOWN 100 /* Network is down */
-#define ENETUNREACH 101 /* Network is unreachable */
-#define ENETRESET 102 /* Network dropped connection because of reset */
-#define ECONNABORTED 103 /* Software caused connection abort */
-#define ECONNRESET 104 /* Connection reset by peer */
-#define ENOBUFS 105 /* No buffer space available */
-#define EISCONN 106 /* Transport endpoint is already connected */
-#define ENOTCONN 107 /* Transport endpoint is not connected */
-#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */
-#define ETOOMANYREFS 109 /* Too many references: cannot splice */
-#define ETIMEDOUT 110 /* Connection timed out */
-#define ECONNREFUSED 111 /* Connection refused */
-#define EHOSTDOWN 112 /* Host is down */
-#define EHOSTUNREACH 113 /* No route to host */
-#define EALREADY 114 /* Operation already in progress */
-#define EINPROGRESS 115 /* Operation now in progress */
-#define ESTALE 116 /* Stale NFS file handle */
-#define EUCLEAN 117 /* Structure needs cleaning */
-#define ENOTNAM 118 /* Not a XENIX named type file */
-#define ENAVAIL 119 /* No XENIX semaphores available */
-#define EISNAM 120 /* Is a named type file */
-#define EREMOTEIO 121 /* Remote I/O error */
-#define EDQUOT 122 /* Quota exceeded */
-
-#define ENOMEDIUM 123 /* No medium found */
-#define EMEDIUMTYPE 124 /* Wrong medium type */
-
-
-#define ENSROK 0 /* DNS server returned answer with no data */
-#define ENSRNODATA 160 /* DNS server returned answer with no data */
-#define ENSRFORMERR 161 /* DNS server claims query was misformatted */
-#define ENSRSERVFAIL 162 /* DNS server returned general failure */
-#define ENSRNOTFOUND 163 /* Domain name not found */
-#define ENSRNOTIMP 164 /* DNS server does not implement requested operation */
-#define ENSRREFUSED 165 /* DNS server refused query */
-#define ENSRBADQUERY 166 /* Misformatted DNS query */
-#define ENSRBADNAME 167 /* Misformatted domain name */
-#define ENSRBADFAMILY 168 /* Unsupported address family */
-#define ENSRBADRESP 169 /* Misformatted DNS reply */
-#define ENSRCONNREFUSED 170 /* Could not contact DNS servers */
-#define ENSRTIMEOUT 171 /* Timeout while contacting DNS servers */
-#define ENSROF 172 /* End of file */
-#define ENSRFILE 173 /* Error reading file */
-#define ENSRNOMEM 174 /* Out of memory */
-#define ENSRDESTRUCTION 175 /* Application terminated lookup */
-#define ENSRQUERYDOMAINTOOLONG 176 /* Domain name is too long */
-#define ENSRCNAMELOOP 177 /* Domain name is too long */
-
-#ifndef errno
-extern int errno;
-#endif
-
-#endif /* LWIP_PROVIDE_ERRNO */
-
-#endif /* __LWIP_ARCH_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/debug.h b/src/VBox/Devices/Network/lwip/src/include/lwip/debug.h
deleted file mode 100644
index 3220541..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/debug.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_DEBUG_H__
-#define __LWIP_DEBUG_H__
-
-#include "arch/cc.h"
-
-/** lower two bits indicate debug level
- * - 0 off
- * - 1 warning
- * - 2 serious
- * - 3 severe
- */
-
-#define DBG_LEVEL_OFF 0
-#define DBG_LEVEL_WARNING 1 /* bad checksums, dropped packets, ... */
-#define DBG_LEVEL_SERIOUS 2 /* memory allocation failures, ... */
-#define DBG_LEVEL_SEVERE 3 /* */
-#define DBG_MASK_LEVEL 3
-
-/** flag for LWIP_DEBUGF to enable that debug message */
-#define DBG_ON 0x80U
-/** flag for LWIP_DEBUGF to disable that debug message */
-#define DBG_OFF 0x00U
-
-/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */
-#define DBG_TRACE 0x40U
-/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */
-#define DBG_STATE 0x20U
-/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */
-#define DBG_FRESH 0x10U
-/** flag for LWIP_DEBUGF to halt after printing this debug message */
-#define DBG_HALT 0x08U
-
-#ifndef LWIP_NOASSERT
-# define LWIP_ASSERT(x,y) do { if(!(y)) LWIP_PLATFORM_ASSERT(x); } while(0)
-#else
-# define LWIP_ASSERT(x,y) do {} while (0)
-#endif
-
-#ifdef LWIP_DEBUG
-/** print debug message only if debug message type is enabled...
- * AND is of correct type AND is at least DBG_LEVEL
- */
-# define LWIP_DEBUGF(debug,x) do { if (((debug) & DBG_ON) && ((debug) & DBG_TYPES_ON) && ((s16_t)((debug) & DBG_MASK_LEVEL) >= DBG_MIN_LEVEL)) { LWIP_PLATFORM_DIAG(x); if ((debug) & DBG_HALT) while(1); } } while(0)
-# define LWIP_ERROR(x) do { LWIP_PLATFORM_DIAG(x); } while(0)
-#else /* LWIP_DEBUG */
-# define LWIP_DEBUGF(debug,x) do {} while (0)
-# define LWIP_ERROR(x) do {} while (0)
-#endif /* LWIP_DEBUG */
-
-#endif /* __LWIP_DEBUG_H__ */
-
-
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/def.h b/src/VBox/Devices/Network/lwip/src/include/lwip/def.h
deleted file mode 100644
index eba9b87..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/def.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_DEF_H__
-#define __LWIP_DEF_H__
-
-/* this might define NULL already */
-#include "arch/cc.h"
-
-#define LWIP_MAX(x , y) (x) > (y) ? (x) : (y)
-#define LWIP_MIN(x , y) (x) < (y) ? (x) : (y)
-
-#ifndef NULL
-#define NULL ((void *)0)
-#endif
-
-
-#endif /* __LWIP_DEF_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/dhcp.h b/src/VBox/Devices/Network/lwip/src/include/lwip/dhcp.h
deleted file mode 100644
index bfe753f..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/dhcp.h
+++ /dev/null
@@ -1,223 +0,0 @@
-/** @file
- */
-
-#ifndef __LWIP_DHCP_H__
-#define __LWIP_DHCP_H__
-
-#include "lwip/opt.h"
-#include "lwip/netif.h"
-#include "lwip/udp.h"
-
-/** period (in seconds) of the application calling dhcp_coarse_tmr() */
-#define DHCP_COARSE_TIMER_SECS 60
-/** period (in milliseconds) of the application calling dhcp_fine_tmr() */
-#define DHCP_FINE_TIMER_MSECS 500
-
-struct dhcp
-{
- /** current DHCP state machine state */
- u8_t state;
- /** retries of current request */
- u8_t tries;
- /** transaction identifier of last sent request */
- u32_t xid;
- /** our connection to the DHCP server */
- struct udp_pcb *pcb;
- /** (first) pbuf of incoming msg */
- struct pbuf *p;
- /** incoming msg */
- struct dhcp_msg *msg_in;
- /** incoming msg options */
- struct dhcp_msg *options_in;
- /** ingoing msg options length */
- u16_t options_in_len;
-
- struct pbuf *p_out; /* pbuf of outcoming msg */
- struct dhcp_msg *msg_out; /* outgoing msg */
- u16_t options_out_len; /* outgoing msg options length */
- u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */
- u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */
- u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */
- struct ip_addr server_ip_addr; /* dhcp server address that offered this lease */
- struct ip_addr offered_ip_addr;
- struct ip_addr offered_sn_mask;
- struct ip_addr offered_gw_addr;
- struct ip_addr offered_bc_addr;
-#define DHCP_MAX_DNS 2
- u32_t dns_count; /* actual number of DNS servers obtained */
- struct ip_addr offered_dns_addr[DHCP_MAX_DNS]; /* DNS server addresses */
-
- u32_t offered_t0_lease; /* lease period (in seconds) */
- u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */
- u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period) */
-/** Patch #1308
- * TODO: See dhcp.c "TODO"s
- */
-#if 0
- struct ip_addr offered_si_addr;
- u8_t *boot_file_name;
-#endif
-};
-
-/* MUST be compiled with "pack structs" or equivalent! */
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-/** minimum set of fields of any DHCP message */
-struct dhcp_msg
-{
- PACK_STRUCT_FIELD(u8_t op);
- PACK_STRUCT_FIELD(u8_t htype);
- PACK_STRUCT_FIELD(u8_t hlen);
- PACK_STRUCT_FIELD(u8_t hops);
- PACK_STRUCT_FIELD(u32_t xid);
- PACK_STRUCT_FIELD(u16_t secs);
- PACK_STRUCT_FIELD(u16_t flags);
- PACK_STRUCT_FIELD(struct ip_addr ciaddr);
- PACK_STRUCT_FIELD(struct ip_addr yiaddr);
- PACK_STRUCT_FIELD(struct ip_addr siaddr);
- PACK_STRUCT_FIELD(struct ip_addr giaddr);
-#define DHCP_CHADDR_LEN 16U
- PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]);
-#define DHCP_SNAME_LEN 64U
- PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]);
-#define DHCP_FILE_LEN 128U
- PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]);
- PACK_STRUCT_FIELD(u32_t cookie);
-#define DHCP_MIN_OPTIONS_LEN 68U
-/** make sure user does not configure this too small */
-#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN))
-# undef DHCP_OPTIONS_LEN
-#endif
-/** allow this to be configured in lwipopts.h, but not too small */
-#if (!defined(DHCP_OPTIONS_LEN))
-/** set this to be sufficient for your options in outgoing DHCP msgs */
-# define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN
-#endif
- PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-/** start DHCP configuration */
-err_t dhcp_start(struct netif *netif);
-/** enforce early lease renewal (not needed normally)*/
-err_t dhcp_renew(struct netif *netif);
-/** release the DHCP lease, usually called before dhcp_stop()*/
-err_t dhcp_release(struct netif *netif);
-/** stop DHCP configuration */
-void dhcp_stop(struct netif *netif);
-/** inform server of our manual IP address */
-void dhcp_inform(struct netif *netif);
-
-/** if enabled, check whether the offered IP address is not in use, using ARP */
-#if DHCP_DOES_ARP_CHECK
-void dhcp_arp_reply(struct netif *netif, struct ip_addr *addr);
-#endif
-
-/** to be called every minute */
-void dhcp_coarse_tmr(void);
-/** to be called every half second */
-void dhcp_fine_tmr(void);
-
-/** DHCP message item offsets and length */
-#define DHCP_MSG_OFS (UDP_DATA_OFS)
- #define DHCP_OP_OFS (DHCP_MSG_OFS + 0)
- #define DHCP_HTYPE_OFS (DHCP_MSG_OFS + 1)
- #define DHCP_HLEN_OFS (DHCP_MSG_OFS + 2)
- #define DHCP_HOPS_OFS (DHCP_MSG_OFS + 3)
- #define DHCP_XID_OFS (DHCP_MSG_OFS + 4)
- #define DHCP_SECS_OFS (DHCP_MSG_OFS + 8)
- #define DHCP_FLAGS_OFS (DHCP_MSG_OFS + 10)
- #define DHCP_CIADDR_OFS (DHCP_MSG_OFS + 12)
- #define DHCP_YIADDR_OFS (DHCP_MSG_OFS + 16)
- #define DHCP_SIADDR_OFS (DHCP_MSG_OFS + 20)
- #define DHCP_GIADDR_OFS (DHCP_MSG_OFS + 24)
- #define DHCP_CHADDR_OFS (DHCP_MSG_OFS + 28)
- #define DHCP_SNAME_OFS (DHCP_MSG_OFS + 44)
- #define DHCP_FILE_OFS (DHCP_MSG_OFS + 108)
-#define DHCP_MSG_LEN 236
-
-#define DHCP_COOKIE_OFS (DHCP_MSG_OFS + DHCP_MSG_LEN)
-#define DHCP_OPTIONS_OFS (DHCP_MSG_OFS + DHCP_MSG_LEN + 4)
-
-#define DHCP_CLIENT_PORT 68
-#define DHCP_SERVER_PORT 67
-
-/** DHCP client states */
-#define DHCP_REQUESTING 1
-#define DHCP_INIT 2
-#define DHCP_REBOOTING 3
-#define DHCP_REBINDING 4
-#define DHCP_RENEWING 5
-#define DHCP_SELECTING 6
-#define DHCP_INFORMING 7
-#define DHCP_CHECKING 8
-#define DHCP_PERMANENT 9
-#define DHCP_BOUND 10
-/** not yet implemented #define DHCP_RELEASING 11 */
-#define DHCP_BACKING_OFF 12
-#define DHCP_OFF 13
-
-#define DHCP_BOOTREQUEST 1
-#define DHCP_BOOTREPLY 2
-
-#define DHCP_DISCOVER 1
-#define DHCP_OFFER 2
-#define DHCP_REQUEST 3
-#define DHCP_DECLINE 4
-#define DHCP_ACK 5
-#define DHCP_NAK 6
-#define DHCP_RELEASE 7
-#define DHCP_INFORM 8
-
-#define DHCP_HTYPE_ETH 1
-
-#define DHCP_HLEN_ETH 6
-
-#define DHCP_BROADCAST_FLAG 15
-#define DHCP_BROADCAST_MASK (1 << DHCP_FLAG_BROADCAST)
-
-/** BootP options */
-#define DHCP_OPTION_PAD 0
-#define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */
-#define DHCP_OPTION_ROUTER 3
-#define DHCP_OPTION_DNS_SERVER 6
-#define DHCP_OPTION_HOSTNAME 12
-#define DHCP_OPTION_IP_TTL 23
-#define DHCP_OPTION_MTU 26
-#define DHCP_OPTION_BROADCAST 28
-#define DHCP_OPTION_TCP_TTL 37
-#define DHCP_OPTION_END 255
-
-/** DHCP options */
-#define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */
-#define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */
-#define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */
-
-#define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */
-#define DHCP_OPTION_MESSAGE_TYPE_LEN 1
-
-
-#define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */
-#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */
-
-#define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */
-#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2
-
-#define DHCP_OPTION_T1 58 /* T1 renewal time */
-#define DHCP_OPTION_T2 59 /* T2 rebinding time */
-#define DHCP_OPTION_CLIENT_ID 61
-#define DHCP_OPTION_TFTP_SERVERNAME 66
-#define DHCP_OPTION_BOOTFILE 67
-
-/** possible combinations of overloading the file and sname fields with options */
-#define DHCP_OVERLOAD_NONE 0
-#define DHCP_OVERLOAD_FILE 1
-#define DHCP_OVERLOAD_SNAME 2
-#define DHCP_OVERLOAD_SNAME_FILE 3
-
-#endif /*__LWIP_DHCP_H__*/
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/err.h b/src/VBox/Devices/Network/lwip/src/include/lwip/err.h
deleted file mode 100644
index c92cb26..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/err.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_ERR_H__
-#define __LWIP_ERR_H__
-
-#include "lwip/opt.h"
-
-#include "arch/cc.h"
-
-typedef s8_t err_t;
-
-/* Definitions for error constants. */
-
-#define ERR_OK 0 /* No error, everything OK. */
-#define ERR_MEM -1 /* Out of memory error. */
-#define ERR_BUF -2 /* Buffer error. */
-
-
-#define ERR_ABRT -3 /* Connection aborted. */
-#define ERR_RST -4 /* Connection reset. */
-#define ERR_CLSD -5 /* Connection closed. */
-#define ERR_CONN -6 /* Not connected. */
-
-#define ERR_VAL -7 /* Illegal value. */
-
-#define ERR_ARG -8 /* Illegal argument. */
-
-#define ERR_RTE -9 /* Routing problem. */
-
-#define ERR_USE -10 /* Address in use. */
-
-#define ERR_IF -11 /* Low-level netif error */
-#define ERR_ISCONN -12 /* Already connected. */
-
-
-#ifdef LWIP_DEBUG
-extern char *lwip_strerr(err_t err);
-#else
-#define lwip_strerr(x) ""
-#endif /* LWIP_DEBUG */
-#endif /* __LWIP_ERR_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/mem.h b/src/VBox/Devices/Network/lwip/src/include/lwip/mem.h
deleted file mode 100644
index f14d176..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/mem.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_MEM_H__
-#define __LWIP_MEM_H__
-
-#include "lwip/opt.h"
-#include "lwip/arch.h"
-
-#if MEM_SIZE > 64000l
-typedef u32_t mem_size_t;
-#define MEM_SIZE_F U32_F
-#else
-typedef u16_t mem_size_t;
-#define MEM_SIZE_F U16_F
-#endif /* MEM_SIZE > 64000 */
-
-#if MEM_LIBC_MALLOC
-/* aliases for C library malloc() */
-#define mem_init()
-#define mem_free(x) free(x)
-#define mem_malloc(x) malloc(x)
-#define mem_realloc(x, size) realloc(x,size)
-#else
-/* lwIP alternative malloc */
-void mem_init(void);
-void *mem_malloc(mem_size_t size);
-void mem_free(void *mem);
-void *mem_realloc(void *mem, mem_size_t size);
-#endif
-
-#ifndef MEM_ALIGN_SIZE
-#define MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1))
-#endif
-
-#ifndef MEM_ALIGN
-#define MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1)))
-#endif
-
-#endif /* __LWIP_MEM_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/memp.h b/src/VBox/Devices/Network/lwip/src/include/lwip/memp.h
deleted file mode 100644
index 1cd46fa..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/memp.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#ifndef __LWIP_MEMP_H__
-#define __LWIP_MEMP_H__
-
-#include "lwip/opt.h"
-
-typedef enum {
- MEMP_PBUF,
- MEMP_RAW_PCB,
- MEMP_UDP_PCB,
- MEMP_TCP_PCB,
- MEMP_TCP_PCB_LISTEN,
- MEMP_TCP_SEG,
-
- MEMP_NETBUF,
- MEMP_NETCONN,
- MEMP_API_MSG,
- MEMP_TCPIP_MSG,
-
- MEMP_SYS_TIMEOUT,
-
- MEMP_MAX
-} memp_t;
-
-void memp_init(void);
-
-void *memp_malloc(memp_t type);
-void *memp_realloc(memp_t fromtype, memp_t totype, void *mem);
-void memp_free(memp_t type, void *mem);
-
-#endif /* __LWIP_MEMP_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/netif.h b/src/VBox/Devices/Network/lwip/src/include/lwip/netif.h
deleted file mode 100644
index b773769..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/netif.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_NETIF_H__
-#define __LWIP_NETIF_H__
-
-#include "lwip/opt.h"
-
-#include "lwip/err.h"
-
-#include "lwip/ip_addr.h"
-
-#include "lwip/inet.h"
-#include "lwip/pbuf.h"
-#if LWIP_DHCP
-# include "lwip/dhcp.h"
-#endif
-
-/** must be the maximum of all used hardware address lengths
- across all types of interfaces in use */
-#define NETIF_MAX_HWADDR_LEN 6U
-
-/** TODO: define the use (where, when, whom) of netif flags */
-
-/** whether the network interface is 'up'. this is
- * a software flag used to control whether this network
- * interface is enabled and processes traffic.
- */
-#define NETIF_FLAG_UP 0x1U
-/** if set, the netif has broadcast capability */
-#define NETIF_FLAG_BROADCAST 0x2U
-/** if set, the netif is one end of a point-to-point connection */
-#define NETIF_FLAG_POINTTOPOINT 0x4U
-/** if set, the interface is configured using DHCP */
-#define NETIF_FLAG_DHCP 0x08U
-/** if set, the interface has an active link
- * (set by the network interface driver) */
-#define NETIF_FLAG_LINK_UP 0x10U
-
-/** Generic data structure used for all lwIP network interfaces.
- * The following fields should be filled in by the initialization
- * function for the device driver: hwaddr_len, hwaddr[], mtu, flags */
-
-struct netif {
- /** pointer to next in linked list */
- struct netif *next;
-
- /** IP address configuration in network byte order */
- struct ip_addr ip_addr;
- struct ip_addr netmask;
- struct ip_addr gw;
-
- /** This function is called by the network device driver
- * to pass a packet up the TCP/IP stack. */
- err_t (* input)(struct pbuf *p, struct netif *inp);
- /** This function is called by the IP module when it wants
- * to send a packet on the interface. This function typically
- * first resolves the hardware address, then sends the packet. */
- err_t (* output)(struct netif *netif, struct pbuf *p,
- struct ip_addr *ipaddr);
- /** This function is called by the ARP module when it wants
- * to send a packet on the interface. This function outputs
- * the pbuf as-is on the link medium. */
- err_t (* linkoutput)(struct netif *netif, struct pbuf *p);
- /** This field can be set by the device driver and could point
- * to state information for the device. */
- void *state;
-#if LWIP_DHCP
- /** the DHCP client state information for this netif */
- struct dhcp *dhcp;
-#endif
- /** number of bytes used in hwaddr */
- u8_t hwaddr_len;
- /** link level hardware address of this interface */
- u8_t hwaddr[NETIF_MAX_HWADDR_LEN];
- /** maximum transfer unit (in bytes) */
- u16_t mtu;
- /** flags (see NETIF_FLAG_ above) */
- u8_t flags;
- /** descriptive abbreviation */
- char name[2];
- /** number of this interface */
- u8_t num;
-#if LWIP_SNMP
- /** link type (ifType values per RFC1213) */
- u8_t link_type;
- /** (estimate) link speed */
- u32_t link_speed;
- /** timestamp at last change made (up/down) */
- u32_t ts;
- /** counters */
- u32_t ifinoctets;
- u32_t ifinucastpkts;
- u32_t ifinnucastpkts;
- u32_t ifindiscards;
- u32_t ifoutoctets;
- u32_t ifoutucastpkts;
- u32_t ifoutnucastpkts;
- u32_t ifoutdiscards;
-#endif
-};
-
-/** The list of network interfaces. */
-extern struct netif *netif_list;
-/** The default network interface. */
-extern struct netif *netif_default;
-
-/* netif_init() must be called first. */
-void netif_init(void);
-
-struct netif *netif_add(struct netif *netif, struct ip_addr *ipaddr, struct ip_addr *netmask,
- struct ip_addr *gw,
- void *state,
- err_t (* init)(struct netif *netif),
- err_t (* input)(struct pbuf *p, struct netif *netif));
-
-void
-netif_set_addr(struct netif *netif,struct ip_addr *ipaddr, struct ip_addr *netmask,
- struct ip_addr *gw);
-void netif_remove(struct netif * netif);
-
-/* Returns a network interface given its name. The name is of the form
- "et0", where the first two letters are the "name" field in the
- netif structure, and the digit is in the num field in the same
- structure. */
-struct netif *netif_find(char *name);
-
-void netif_set_default(struct netif *netif);
-
-void netif_set_ipaddr(struct netif *netif, struct ip_addr *ipaddr);
-void netif_set_netmask(struct netif *netif, struct ip_addr *netmast);
-void netif_set_gw(struct netif *netif, struct ip_addr *gw);
-void netif_set_up(struct netif *netif);
-void netif_set_down(struct netif *netif);
-u8_t netif_is_up(struct netif *netif);
-
-#endif /* __LWIP_NETIF_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/opt.h b/src/VBox/Devices/Network/lwip/src/include/lwip/opt.h
deleted file mode 100644
index c8bdb49..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/opt.h
+++ /dev/null
@@ -1,722 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_OPT_H__
-#define __LWIP_OPT_H__
-
-/* Include user defined options first */
-#include "lwipopts.h"
-#include "lwip/debug.h"
-
-/* Define default values for unconfigured parameters. */
-
-/* Platform specific locking */
-
-/*
- * enable SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection
- * for certain critical regions during buffer allocation, deallocation and memory
- * allocation and deallocation.
- */
-#ifndef SYS_LIGHTWEIGHT_PROT
-#define SYS_LIGHTWEIGHT_PROT 0
-#endif
-
-#ifndef NO_SYS
-#define NO_SYS 0
-#endif
-/* ---------- Memory options ---------- */
-#ifndef MEM_LIBC_MALLOC
-#define MEM_LIBC_MALLOC 0
-#endif
-
-/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which
- lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2
- byte alignment -> define MEM_ALIGNMENT to 2. */
-
-#ifndef MEM_ALIGNMENT
-#define MEM_ALIGNMENT 1
-#endif
-
-/* MEM_SIZE: the size of the heap memory. If the application will send
-a lot of data that needs to be copied, this should be set high. */
-#ifndef MEM_SIZE
-#define MEM_SIZE 1600
-#endif
-
-#ifndef MEMP_SANITY_CHECK
-#define MEMP_SANITY_CHECK 0
-#endif
-
-/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application
- sends a lot of data out of ROM (or other static memory), this
- should be set high. */
-#ifndef MEMP_NUM_PBUF
-#define MEMP_NUM_PBUF 16
-#endif
-
-/* Number of raw connection PCBs */
-#ifndef MEMP_NUM_RAW_PCB
-#define MEMP_NUM_RAW_PCB 4
-#endif
-
-/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One
- per active UDP "connection". */
-#ifndef MEMP_NUM_UDP_PCB
-#define MEMP_NUM_UDP_PCB 4
-#endif
-/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP
- connections. */
-#ifndef MEMP_NUM_TCP_PCB
-#define MEMP_NUM_TCP_PCB 5
-#endif
-/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP
- connections. */
-#ifndef MEMP_NUM_TCP_PCB_LISTEN
-#define MEMP_NUM_TCP_PCB_LISTEN 8
-#endif
-/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP
- segments. */
-#ifndef MEMP_NUM_TCP_SEG
-#define MEMP_NUM_TCP_SEG 16
-#endif
-/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active
- timeouts. */
-#ifndef MEMP_NUM_SYS_TIMEOUT
-#define MEMP_NUM_SYS_TIMEOUT 3
-#endif
-
-/* The following four are used only with the sequential API and can be
- set to 0 if the application only will use the raw API. */
-/* MEMP_NUM_NETBUF: the number of struct netbufs. */
-#ifndef MEMP_NUM_NETBUF
-#define MEMP_NUM_NETBUF 2
-#endif
-/* MEMP_NUM_NETCONN: the number of struct netconns. */
-#ifndef MEMP_NUM_NETCONN
-#define MEMP_NUM_NETCONN 4
-#endif
-/* MEMP_NUM_APIMSG: the number of struct api_msg, used for
- communication between the TCP/IP stack and the sequential
- programs. */
-#ifndef MEMP_NUM_API_MSG
-#define MEMP_NUM_API_MSG 8
-#endif
-/* MEMP_NUM_TCPIPMSG: the number of struct tcpip_msg, which is used
- for sequential API communication and incoming packets. Used in
- src/api/tcpip.c. */
-#ifndef MEMP_NUM_TCPIP_MSG
-#define MEMP_NUM_TCPIP_MSG 8
-#endif
-
-/* ---------- Pbuf options ---------- */
-/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */
-
-#ifndef PBUF_POOL_SIZE
-#define PBUF_POOL_SIZE 16
-#endif
-
-/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */
-
-#ifndef PBUF_POOL_BUFSIZE
-#define PBUF_POOL_BUFSIZE 128
-#endif
-
-/* PBUF_LINK_HLEN: the number of bytes that should be allocated for a
- link level header. Defaults to 14 for Ethernet. */
-
-#ifndef PBUF_LINK_HLEN
-#define PBUF_LINK_HLEN 14
-#endif
-
-
-
-/* ---------- ARP options ---------- */
-
-/** Number of active hardware address, IP address pairs cached */
-#ifndef ARP_TABLE_SIZE
-#define ARP_TABLE_SIZE 10
-#endif
-
-/**
- * If enabled, outgoing packets are queued during hardware address
- * resolution.
- *
- * This feature has not stabilized yet. Single-packet queueing is
- * believed to be stable, multi-packet queueing is believed to
- * clash with the TCP segment queueing.
- *
- * As multi-packet-queueing is currently disabled, enabling this
- * _should_ work, but we need your testing feedback on lwip-users.
- *
- */
-#ifndef ARP_QUEUEING
-#define ARP_QUEUEING 1
-#endif
-
-/* This option is deprecated */
-#ifdef ETHARP_QUEUE_FIRST
-#error ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h.
-#endif
-
-/* This option is removed to comply with the ARP standard */
-#ifdef ETHARP_ALWAYS_INSERT
-#error ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h.
-#endif
-
-/* ---------- IP options ---------- */
-/* Define IP_FORWARD to 1 if you wish to have the ability to forward
- IP packets across network interfaces. If you are going to run lwIP
- on a device with only one network interface, define this to 0. */
-#ifndef IP_FORWARD
-#define IP_FORWARD 0
-#endif
-
-/* If defined to 1, IP options are allowed (but not parsed). If
- defined to 0, all packets with IP options are dropped. */
-#ifndef IP_OPTIONS
-#define IP_OPTIONS 1
-#endif
-
-/** IP reassembly and segmentation. Even if they both deal with IP
- * fragments, note that these are orthogonal, one dealing with incoming
- * packets, the other with outgoing packets
- */
-
-/** Reassemble incoming fragmented IP packets */
-#ifndef IP_REASSEMBLY
-#define IP_REASSEMBLY 1
-#endif
-
-/** Fragment outgoing IP packets if their size exceeds MTU */
-#ifndef IP_FRAG
-#define IP_FRAG 1
-#endif
-
-/* IP reassemly default age in seconds */
-#ifndef IP_REASS_MAXAGE
-#define IP_REASS_MAXAGE 3
-#endif
-
-/* IP reassembly buffer size (minus IP header) */
-#ifndef IP_REASS_BUFSIZE
-#define IP_REASS_BUFSIZE 5760
-#endif
-
-/* Assumed max MTU on any interface for IP frag buffer */
-#ifndef IP_FRAG_MAX_MTU
-#define IP_FRAG_MAX_MTU 1500
-#endif
-
-/** Global default value for Time To Live used by transport layers. */
-#ifndef IP_DEFAULT_TTL
-#define IP_DEFAULT_TTL 255
-#endif
-
-/* ---------- ICMP options ---------- */
-
-#ifndef ICMP_TTL
-#define ICMP_TTL (IP_DEFAULT_TTL)
-#endif
-
-/* ---------- RAW options ---------- */
-
-#ifndef LWIP_RAW
-#define LWIP_RAW 1
-#endif
-
-#ifndef RAW_TTL
-#define RAW_TTL (IP_DEFAULT_TTL)
-#endif
-
-/* ---------- DHCP options ---------- */
-
-#ifndef LWIP_DHCP
-#define LWIP_DHCP 0
-#endif
-
-/* 1 if you want to do an ARP check on the offered address
- (recommended). */
-#ifndef DHCP_DOES_ARP_CHECK
-#define DHCP_DOES_ARP_CHECK 1
-#endif
-
-/* ---------- SNMP options ---------- */
-/** @note UDP must be available for SNMP transport */
-#ifndef LWIP_SNMP
-#define LWIP_SNMP 0
-#endif
-
-/** @note At least one request buffer is required. */
-#ifndef SNMP_CONCURRENT_REQUESTS
-#define SNMP_CONCURRENT_REQUESTS 1
-#endif
-
-/** @note At least one trap destination is required */
-#ifndef SNMP_TRAP_DESTINATIONS
-#define SNMP_TRAP_DESTINATIONS 1
-#endif
-
-#ifndef SNMP_PRIVATE_MIB
-#define SNMP_PRIVATE_MIB 0
-#endif
-
-/* ---------- UDP options ---------- */
-#ifndef LWIP_UDP
-#define LWIP_UDP 1
-#endif
-
-#ifndef UDP_TTL
-#define UDP_TTL (IP_DEFAULT_TTL)
-#endif
-
-/* ---------- TCP options ---------- */
-#ifndef LWIP_TCP
-#define LWIP_TCP 1
-#endif
-
-#ifndef TCP_TTL
-#define TCP_TTL (IP_DEFAULT_TTL)
-#endif
-
-#ifndef TCP_WND
-#define TCP_WND 2048
-#endif
-
-#ifndef TCP_MAXRTX
-#define TCP_MAXRTX 12
-#endif
-
-#ifndef TCP_SYNMAXRTX
-#define TCP_SYNMAXRTX 6
-#endif
-
-
-/* Controls if TCP should queue segments that arrive out of
- order. Define to 0 if your device is low on memory. */
-#ifndef TCP_QUEUE_OOSEQ
-#define TCP_QUEUE_OOSEQ 1
-#endif
-
-/* TCP Maximum segment size. */
-#ifndef TCP_MSS
-#define TCP_MSS 128 /* A *very* conservative default. */
-#endif
-
-/* TCP sender buffer space (bytes). */
-#ifndef TCP_SND_BUF
-#define TCP_SND_BUF 256
-#endif
-
-/* TCP sender buffer space (pbufs). This must be at least = 2 *
- TCP_SND_BUF/TCP_MSS for things to work. */
-#ifndef TCP_SND_QUEUELEN
-#define TCP_SND_QUEUELEN 4 * TCP_SND_BUF/TCP_MSS
-#endif
-
-
-/* Maximum number of retransmissions of data segments. */
-
-/* Maximum number of retransmissions of SYN segments. */
-
-/* TCP writable space (bytes). This must be less than or equal
- to TCP_SND_BUF. It is the amount of space which must be
- available in the tcp snd_buf for select to return writable */
-#ifndef TCP_SNDLOWAT
-#define TCP_SNDLOWAT TCP_SND_BUF/2
-#endif
-
-/* Support loop interface (127.0.0.1) */
-#ifndef LWIP_HAVE_LOOPIF
-#define LWIP_HAVE_LOOPIF 0
-#endif
-
-#ifndef LWIP_EVENT_API
-#define LWIP_EVENT_API 0
-#define LWIP_CALLBACK_API 1
-#else
-#define LWIP_EVENT_API 1
-#define LWIP_CALLBACK_API 0
-#endif
-
-#ifndef LWIP_COMPAT_SOCKETS
-#define LWIP_COMPAT_SOCKETS 1
-#endif
-
-
-#ifndef TCPIP_THREAD_PRIO
-#define TCPIP_THREAD_PRIO 1
-#endif
-
-#ifndef SLIPIF_THREAD_PRIO
-#define SLIPIF_THREAD_PRIO 1
-#endif
-
-#ifndef PPP_THREAD_PRIO
-#define PPP_THREAD_PRIO 1
-#endif
-
-#ifndef DEFAULT_THREAD_PRIO
-#define DEFAULT_THREAD_PRIO 1
-#endif
-
-
-/* ---------- Socket Options ---------- */
-/* Enable SO_REUSEADDR and SO_REUSEPORT options */
-#ifdef SO_REUSE
-/* I removed the lot since this was an ugly hack. It broke the raw-API.
- It also came with many ugly goto's, Christiaan Simons. */
-#error "SO_REUSE currently unavailable, this was a hack"
-#endif
-
-
-/* ---------- Statistics options ---------- */
-#ifndef LWIP_STATS
-#define LWIP_STATS 1
-#endif
-
-#if LWIP_STATS
-
-#ifndef LWIP_STATS_DISPLAY
-#define LWIP_STATS_DISPLAY 0
-#endif
-
-#ifndef LINK_STATS
-#define LINK_STATS 1
-#endif
-
-#ifndef IP_STATS
-#define IP_STATS 1
-#endif
-
-#ifndef IPFRAG_STATS
-#define IPFRAG_STATS 1
-#endif
-
-#ifndef ICMP_STATS
-#define ICMP_STATS 1
-#endif
-
-#ifndef UDP_STATS
-#define UDP_STATS 1
-#endif
-
-#ifndef TCP_STATS
-#define TCP_STATS 1
-#endif
-
-#ifndef MEM_STATS
-#define MEM_STATS 1
-#endif
-
-#ifndef MEMP_STATS
-#define MEMP_STATS 1
-#endif
-
-#ifndef PBUF_STATS
-#define PBUF_STATS 1
-#endif
-
-#ifndef SYS_STATS
-#define SYS_STATS 1
-#endif
-
-#ifndef RAW_STATS
-#define RAW_STATS 0
-#endif
-
-#else
-
-#define LINK_STATS 0
-#define IP_STATS 0
-#define IPFRAG_STATS 0
-#define ICMP_STATS 0
-#define UDP_STATS 0
-#define TCP_STATS 0
-#define MEM_STATS 0
-#define MEMP_STATS 0
-#define PBUF_STATS 0
-#define SYS_STATS 0
-#define RAW_STATS 0
-#define LWIP_STATS_DISPLAY 0
-
-#endif /* LWIP_STATS */
-
-/* ---------- PPP options ---------- */
-
-#ifndef PPP_SUPPORT
-#define PPP_SUPPORT 0 /* Set for PPP */
-#endif
-
-#if PPP_SUPPORT
-
-#define NUM_PPP 1 /* Max PPP sessions. */
-
-
-
-#ifndef PAP_SUPPORT
-#define PAP_SUPPORT 0 /* Set for PAP. */
-#endif
-
-#ifndef CHAP_SUPPORT
-#define CHAP_SUPPORT 0 /* Set for CHAP. */
-#endif
-
-#define MSCHAP_SUPPORT 0 /* Set for MSCHAP (NOT FUNCTIONAL!) */
-#define CBCP_SUPPORT 0 /* Set for CBCP (NOT FUNCTIONAL!) */
-#define CCP_SUPPORT 0 /* Set for CCP (NOT FUNCTIONAL!) */
-
-#ifndef VJ_SUPPORT
-#define VJ_SUPPORT 0 /* Set for VJ header compression. */
-#endif
-
-#ifndef MD5_SUPPORT
-#define MD5_SUPPORT 0 /* Set for MD5 (see also CHAP) */
-#endif
-
-
-/*
- * Timeouts.
- */
-#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */
-#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */
-#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */
-#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */
-
-#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */
-#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */
-
-#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */
-#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */
-
-
-/* Interval in seconds between keepalive echo requests, 0 to disable. */
-#if 1
-#define LCP_ECHOINTERVAL 0
-#else
-#define LCP_ECHOINTERVAL 10
-#endif
-
-/* Number of unanswered echo requests before failure. */
-#define LCP_MAXECHOFAILS 3
-
-/* Max Xmit idle time (in jiffies) before resend flag char. */
-#define PPP_MAXIDLEFLAG 100
-
-/*
- * Packet sizes
- *
- * Note - lcp shouldn't be allowed to negotiate stuff outside these
- * limits. See lcp.h in the pppd directory.
- * (XXX - these constants should simply be shared by lcp.c instead
- * of living in lcp.h)
- */
-#define PPP_MTU 1500 /* Default MTU (size of Info field) */
-#if 0
-#define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN)
-#else
-#define PPP_MAXMTU 1500 /* Largest MTU we allow */
-#endif
-#define PPP_MINMTU 64
-#define PPP_MRU 1500 /* default MRU = max length of info field */
-#define PPP_MAXMRU 1500 /* Largest MRU we allow */
-#define PPP_DEFMRU 296 /* Try for this */
-#define PPP_MINMRU 128 /* No MRUs below this */
-
-
-#define MAXNAMELEN 256 /* max length of hostname or name for auth */
-#define MAXSECRETLEN 256 /* max length of password or secret */
-
-#endif /* PPP_SUPPORT */
-
-/* checksum options - set to zero for hardware checksum support */
-
-#ifndef CHECKSUM_GEN_IP
-#define CHECKSUM_GEN_IP 1
-#endif
-
-#ifndef CHECKSUM_GEN_UDP
-#define CHECKSUM_GEN_UDP 1
-#endif
-
-#ifndef CHECKSUM_GEN_TCP
-#define CHECKSUM_GEN_TCP 1
-#endif
-
-#ifndef CHECKSUM_CHECK_IP
-#define CHECKSUM_CHECK_IP 1
-#endif
-
-#ifndef CHECKSUM_CHECK_UDP
-#define CHECKSUM_CHECK_UDP 1
-#endif
-
-#ifndef CHECKSUM_CHECK_TCP
-#define CHECKSUM_CHECK_TCP 1
-#endif
-
-/* Debugging options all default to off */
-
-#ifndef DBG_TYPES_ON
-#define DBG_TYPES_ON 0
-#endif
-
-#ifndef ETHARP_DEBUG
-#define ETHARP_DEBUG DBG_OFF
-#endif
-
-#ifndef NETIF_DEBUG
-#define NETIF_DEBUG DBG_OFF
-#endif
-
-#ifndef PBUF_DEBUG
-#define PBUF_DEBUG DBG_OFF
-#endif
-
-#ifndef API_LIB_DEBUG
-#define API_LIB_DEBUG DBG_OFF
-#endif
-
-#ifndef API_MSG_DEBUG
-#define API_MSG_DEBUG DBG_OFF
-#endif
-
-#ifndef SOCKETS_DEBUG
-#define SOCKETS_DEBUG DBG_OFF
-#endif
-
-#ifndef ICMP_DEBUG
-#define ICMP_DEBUG DBG_OFF
-#endif
-
-#ifndef INET_DEBUG
-#define INET_DEBUG DBG_OFF
-#endif
-
-#ifndef IP_DEBUG
-#define IP_DEBUG DBG_OFF
-#endif
-
-#ifndef IP_REASS_DEBUG
-#define IP_REASS_DEBUG DBG_OFF
-#endif
-
-#ifndef RAW_DEBUG
-#define RAW_DEBUG DBG_OFF
-#endif
-
-#ifndef MEM_DEBUG
-#define MEM_DEBUG DBG_OFF
-#endif
-
-#ifndef MEMP_DEBUG
-#define MEMP_DEBUG DBG_OFF
-#endif
-
-#ifndef SYS_DEBUG
-#define SYS_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_DEBUG
-#define TCP_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_INPUT_DEBUG
-#define TCP_INPUT_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_FR_DEBUG
-#define TCP_FR_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_RTO_DEBUG
-#define TCP_RTO_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_REXMIT_DEBUG
-#define TCP_REXMIT_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_CWND_DEBUG
-#define TCP_CWND_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_WND_DEBUG
-#define TCP_WND_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_OUTPUT_DEBUG
-#define TCP_OUTPUT_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_RST_DEBUG
-#define TCP_RST_DEBUG DBG_OFF
-#endif
-
-#ifndef TCP_QLEN_DEBUG
-#define TCP_QLEN_DEBUG DBG_OFF
-#endif
-
-#ifndef UDP_DEBUG
-#define UDP_DEBUG DBG_OFF
-#endif
-
-#ifndef TCPIP_DEBUG
-#define TCPIP_DEBUG DBG_OFF
-#endif
-
-#ifndef PPP_DEBUG
-#define PPP_DEBUG DBG_OFF
-#endif
-
-#ifndef SLIP_DEBUG
-#define SLIP_DEBUG DBG_OFF
-#endif
-
-#ifndef DHCP_DEBUG
-#define DHCP_DEBUG DBG_OFF
-#endif
-
-#ifndef SNMP_MSG_DEBUG
-#define SNMP_MSG_DEBUG DBG_OFF
-#endif
-
-#ifndef SNMP_MIB_DEBUG
-#define SNMP_MIB_DEBUG DBG_OFF
-#endif
-
-#ifndef DBG_MIN_LEVEL
-#define DBG_MIN_LEVEL DBG_LEVEL_OFF
-#endif
-
-#endif /* __LWIP_OPT_H__ */
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/pbuf.h b/src/VBox/Devices/Network/lwip/src/include/lwip/pbuf.h
deleted file mode 100644
index 546aa30..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/pbuf.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#ifndef __LWIP_PBUF_H__
-#define __LWIP_PBUF_H__
-
-#include "arch/cc.h"
-
-
-#define PBUF_TRANSPORT_HLEN 20
-#define PBUF_IP_HLEN 20
-
-typedef enum {
- PBUF_TRANSPORT,
- PBUF_IP,
- PBUF_LINK,
- PBUF_RAW
-} pbuf_layer;
-
-typedef enum {
- PBUF_RAM,
- PBUF_ROM,
- PBUF_REF,
- PBUF_POOL
-} pbuf_flag;
-
-/* Definitions for the pbuf flag field. These are NOT the flags that
- * are passed to pbuf_alloc(). */
-#define PBUF_FLAG_RAM 0x00U /* Flags that pbuf data is stored in RAM */
-#define PBUF_FLAG_ROM 0x01U /* Flags that pbuf data is stored in ROM */
-#define PBUF_FLAG_POOL 0x02U /* Flags that the pbuf comes from the pbuf pool */
-#define PBUF_FLAG_REF 0x04U /* Flags thet the pbuf payload refers to RAM */
-
-/** indicates this packet was broadcast on the link */
-#define PBUF_FLAG_LINK_BROADCAST 0x80U
-
-struct pbuf {
- /** next pbuf in singly linked pbuf chain */
- struct pbuf *next;
-
- /** pointer to the actual data in the buffer */
- void *payload;
-
- /**
- * total length of this buffer and all next buffers in chain
- * belonging to the same packet.
- *
- * For non-queue packet chains this is the invariant:
- * p->tot_len == p->len + (p->next? p->next->tot_len: 0)
- */
- u16_t tot_len;
-
- /** length of this buffer */
- u16_t len;
-
- /** flags telling the type of pbuf, see PBUF_FLAG_ */
- u16_t flags;
-
- /**
- * the reference count always equals the number of pointers
- * that refer to this pbuf. This can be pointers from an application,
- * the stack itself, or pbuf->next pointers from a chain.
- */
- u16_t ref;
-
-};
-
-void pbuf_init(void);
-
-struct pbuf *pbuf_alloc(pbuf_layer l, u16_t size, pbuf_flag flag);
-void pbuf_realloc(struct pbuf *p, u16_t size);
-u8_t pbuf_header(struct pbuf *p, s16_t header_size);
-void pbuf_ref(struct pbuf *p);
-void pbuf_ref_chain(struct pbuf *p);
-u8_t pbuf_free(struct pbuf *p);
-u8_t pbuf_clen(struct pbuf *p);
-void pbuf_cat(struct pbuf *h, struct pbuf *t);
-void pbuf_chain(struct pbuf *h, struct pbuf *t);
-struct pbuf *pbuf_take(struct pbuf *f);
-struct pbuf *pbuf_dechain(struct pbuf *p);
-void pbuf_queue(struct pbuf *p, struct pbuf *n);
-struct pbuf * pbuf_dequeue(struct pbuf *p);
-
-#endif /* __LWIP_PBUF_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/raw.h b/src/VBox/Devices/Network/lwip/src/include/lwip/raw.h
deleted file mode 100644
index 6f7a987..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/raw.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_RAW_H__
-#define __LWIP_RAW_H__
-
-#include "lwip/arch.h"
-
-#include "lwip/pbuf.h"
-#include "lwip/inet.h"
-#include "lwip/ip.h"
-
-struct raw_pcb {
-/* Common members of all PCB types */
- IP_PCB;
-
- struct raw_pcb *next;
-
- u16_t protocol;
-
- u8_t (* recv)(void *arg, struct raw_pcb *pcb, struct pbuf *p,
- struct ip_addr *addr);
- void *recv_arg;
-};
-
-/* The following functions is the application layer interface to the
- RAW code. */
-struct raw_pcb * raw_new (u16_t proto);
-void raw_remove (struct raw_pcb *pcb);
-err_t raw_bind (struct raw_pcb *pcb, struct ip_addr *ipaddr);
-err_t raw_connect (struct raw_pcb *pcb, struct ip_addr *ipaddr);
-
-void raw_recv (struct raw_pcb *pcb,
- u8_t (* recv)(void *arg, struct raw_pcb *pcb,
- struct pbuf *p,
- struct ip_addr *addr),
- void *recv_arg);
-err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, struct ip_addr *ipaddr);
-err_t raw_send (struct raw_pcb *pcb, struct pbuf *p);
-
-/* The following functions are the lower layer interface to RAW. */
-u8_t raw_input (struct pbuf *p, struct netif *inp);
-void raw_init (void);
-
-
-#endif /* __LWIP_RAW_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/sio.h b/src/VBox/Devices/Network/lwip/src/include/lwip/sio.h
deleted file mode 100644
index 8a37aa3..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/sio.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- */
-
-/*
- * This is the interface to the platform specific serial IO module
- * It needs to be implemented by those platforms which need SLIP or PPP
- */
-
-#include "arch/cc.h"
-
-#ifndef __sio_fd_t_defined
-typedef void * sio_fd_t;
-#endif
-
-#ifndef sio_open
-sio_fd_t sio_open(u8_t);
-#endif
-
-#ifndef sio_send
-void sio_send(u8_t, sio_fd_t);
-#endif
-
-#ifndef sio_recv
-u8_t sio_recv(sio_fd_t);
-#endif
-
-#ifndef sio_read
-u32_t sio_read(sio_fd_t, u8_t *, u32_t);
-#endif
-
-#ifndef sio_write
-u32_t sio_write(sio_fd_t, u8_t *, u32_t);
-#endif
-
-#ifndef sio_read_abort
-void sio_read_abort(sio_fd_t);
-#endif
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/snmp.h b/src/VBox/Devices/Network/lwip/src/include/lwip/snmp.h
deleted file mode 100644
index 95145ce..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/snmp.h
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (c) 2001, 2002 Leon Woestenberg <leon.woestenberg at axon.tv>
- * Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Leon Woestenberg <leon.woestenberg at axon.tv>
- *
- */
-#ifndef __LWIP_SNMP_H__
-#define __LWIP_SNMP_H__
-
-#include "lwip/opt.h"
-#include "lwip/netif.h"
-#include "lwip/udp.h"
-
-/* SNMP support available? */
-#if defined(LWIP_SNMP) && (LWIP_SNMP > 0)
-
-/** fixed maximum length for object identifier type */
-#define LWIP_SNMP_OBJ_ID_LEN 32
-/** internal object identifier representation */
-struct snmp_obj_id
-{
- u8_t len;
- s32_t id[LWIP_SNMP_OBJ_ID_LEN];
-};
-
-/* system */
-void snmp_set_sysdesr(u8_t* str, u8_t* strlen);
-void snmp_set_sysobjid(struct snmp_obj_id *oid);
-void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid);
-void snmp_inc_sysuptime(void);
-void snmp_get_sysuptime(u32_t *value);
-void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen);
-void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen);
-void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen);
-
-/* network interface */
-void snmp_add_ifinoctets(struct netif *ni, u32_t value);
-void snmp_inc_ifinucastpkts(struct netif *ni);
-void snmp_inc_ifinnucastpkts(struct netif *ni);
-void snmp_inc_ifindiscards(struct netif *ni);
-void snmp_add_ifoutoctets(struct netif *ni, u32_t value);
-void snmp_inc_ifoutucastpkts(struct netif *ni);
-void snmp_inc_ifoutnucastpkts(struct netif *ni);
-void snmp_inc_ifoutdiscards(struct netif *ni);
-void snmp_inc_iflist(void);
-void snmp_dec_iflist(void);
-
-/* ARP (for atTable and ipNetToMediaTable) */
-void snmp_insert_arpidx_tree(struct netif *ni, struct ip_addr *ip);
-void snmp_delete_arpidx_tree(struct netif *ni, struct ip_addr *ip);
-
-/* IP */
-void snmp_inc_ipinreceives(void);
-void snmp_inc_ipinhdrerrors(void);
-void snmp_inc_ipinaddrerrors(void);
-void snmp_inc_ipforwdatagrams(void);
-void snmp_inc_ipinunknownprotos(void);
-void snmp_inc_ipindiscards(void);
-void snmp_inc_ipindelivers(void);
-void snmp_inc_ipoutrequests(void);
-void snmp_inc_ipoutdiscards(void);
-void snmp_inc_ipoutnoroutes(void);
-void snmp_inc_ipreasmreqds(void);
-void snmp_inc_ipreasmoks(void);
-void snmp_inc_ipreasmfails(void);
-void snmp_inc_ipfragoks(void);
-void snmp_inc_ipfragfails(void);
-void snmp_inc_ipfragcreates(void);
-void snmp_inc_iproutingdiscards(void);
-void snmp_insert_ipaddridx_tree(struct netif *ni);
-void snmp_delete_ipaddridx_tree(struct netif *ni);
-void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni);
-void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni);
-
-/* ICMP */
-void snmp_inc_icmpinmsgs(void);
-void snmp_inc_icmpinerrors(void);
-void snmp_inc_icmpindestunreachs(void);
-void snmp_inc_icmpintimeexcds(void);
-void snmp_inc_icmpinparmprobs(void);
-void snmp_inc_icmpinsrcquenchs(void);
-void snmp_inc_icmpinredirects(void);
-void snmp_inc_icmpinechos(void);
-void snmp_inc_icmpinechoreps(void);
-void snmp_inc_icmpintimestamps(void);
-void snmp_inc_icmpintimestampreps(void);
-void snmp_inc_icmpinaddrmasks(void);
-void snmp_inc_icmpinaddrmaskreps(void);
-void snmp_inc_icmpoutmsgs(void);
-void snmp_inc_icmpouterrors(void);
-void snmp_inc_icmpoutdestunreachs(void);
-void snmp_inc_icmpouttimeexcds(void);
-void snmp_inc_icmpoutparmprobs(void);
-void snmp_inc_icmpoutsrcquenchs(void);
-void snmp_inc_icmpoutredirects(void);
-void snmp_inc_icmpoutechos(void);
-void snmp_inc_icmpoutechoreps(void);
-void snmp_inc_icmpouttimestamps(void);
-void snmp_inc_icmpouttimestampreps(void);
-void snmp_inc_icmpoutaddrmasks(void);
-void snmp_inc_icmpoutaddrmaskreps(void);
-
-/* TCP */
-void snmp_inc_tcpactiveopens(void);
-void snmp_inc_tcppassiveopens(void);
-void snmp_inc_tcpattemptfails(void);
-void snmp_inc_tcpestabresets(void);
-void snmp_inc_tcpinsegs(void);
-void snmp_inc_tcpoutsegs(void);
-void snmp_inc_tcpretranssegs(void);
-void snmp_inc_tcpinerrs(void);
-void snmp_inc_tcpoutrsts(void);
-
-/* UDP */
-void snmp_inc_udpindatagrams(void);
-void snmp_inc_udpnoports(void);
-void snmp_inc_udpinerrors(void);
-void snmp_inc_udpoutdatagrams(void);
-void snmp_insert_udpidx_tree(struct udp_pcb *pcb);
-void snmp_delete_udpidx_tree(struct udp_pcb *pcb);
-
-/* SNMP */
-void snmp_inc_snmpinpkts(void);
-void snmp_inc_snmpoutpkts(void);
-void snmp_inc_snmpinbadversions(void);
-void snmp_inc_snmpinbadcommunitynames(void);
-void snmp_inc_snmpinbadcommunityuses(void);
-void snmp_inc_snmpinasnparseerrs(void);
-void snmp_inc_snmpintoobigs(void);
-void snmp_inc_snmpinnosuchnames(void);
-void snmp_inc_snmpinbadvalues(void);
-void snmp_inc_snmpinreadonlys(void);
-void snmp_inc_snmpingenerrs(void);
-void snmp_add_snmpintotalreqvars(u8_t value);
-void snmp_add_snmpintotalsetvars(u8_t value);
-void snmp_inc_snmpingetrequests(void);
-void snmp_inc_snmpingetnexts(void);
-void snmp_inc_snmpinsetrequests(void);
-void snmp_inc_snmpingetresponses(void);
-void snmp_inc_snmpintraps(void);
-void snmp_inc_snmpouttoobigs(void);
-void snmp_inc_snmpoutnosuchnames(void);
-void snmp_inc_snmpoutbadvalues(void);
-void snmp_inc_snmpoutgenerrs(void);
-void snmp_inc_snmpoutgetrequests(void);
-void snmp_inc_snmpoutgetnexts(void);
-void snmp_inc_snmpoutsetrequests(void);
-void snmp_inc_snmpoutgetresponses(void);
-void snmp_inc_snmpouttraps(void);
-void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid);
-void snmp_set_snmpenableauthentraps(u8_t *value);
-void snmp_get_snmpenableauthentraps(u8_t *value);
-
-/* LWIP_SNMP support not available */
-/* define everything to be empty */
-#else
-
-/* system */
-#define snmp_set_sysdesr(str, strlen)
-#define snmp_get_sysobjid_ptr(oid)
-#define snmp_inc_sysuptime()
-#define snmp_get_sysuptime(value)
-
-/* network interface */
-#define snmp_add_ifinoctets(ni,value)
-#define snmp_inc_ifinucastpkts(ni)
-#define snmp_inc_ifinnucastpkts(ni)
-#define snmp_inc_ifindiscards(ni)
-#define snmp_add_ifoutoctets(ni,value)
-#define snmp_inc_ifoutucastpkts(ni)
-#define snmp_inc_ifoutnucastpkts(ni)
-#define snmp_inc_ifoutdiscards(ni)
-#define snmp_inc_iflist()
-#define snmp_dec_iflist()
-
-/* ARP */
-#define snmp_insert_arpidx_tree(ni,ip)
-#define snmp_delete_arpidx_tree(ni,ip)
-
-/* IP */
-#define snmp_inc_ipinreceives()
-#define snmp_inc_ipinhdrerrors()
-#define snmp_inc_ipinaddrerrors()
-#define snmp_inc_ipforwdatagrams()
-#define snmp_inc_ipinunknownprotos()
-#define snmp_inc_ipindiscards()
-#define snmp_inc_ipindelivers()
-#define snmp_inc_ipoutrequests()
-#define snmp_inc_ipoutdiscards()
-#define snmp_inc_ipoutnoroutes()
-#define snmp_inc_ipreasmreqds()
-#define snmp_inc_ipreasmoks()
-#define snmp_inc_ipreasmfails()
-#define snmp_inc_ipfragoks()
-#define snmp_inc_ipfragfails()
-#define snmp_inc_ipfragcreates()
-#define snmp_inc_iproutingdiscards()
-#define snmp_insert_ipaddridx_tree(ni)
-#define snmp_delete_ipaddridx_tree(ni)
-#define snmp_insert_iprteidx_tree(dflt, ni)
-#define snmp_delete_iprteidx_tree(dflt, ni)
-
-/* ICMP */
-#define snmp_inc_icmpinmsgs()
-#define snmp_inc_icmpinerrors()
-#define snmp_inc_icmpindestunreachs()
-#define snmp_inc_icmpintimeexcds()
-#define snmp_inc_icmpinparmprobs()
-#define snmp_inc_icmpinsrcquenchs()
-#define snmp_inc_icmpinredirects()
-#define snmp_inc_icmpinechos()
-#define snmp_inc_icmpinechoreps()
-#define snmp_inc_icmpintimestamps()
-#define snmp_inc_icmpintimestampreps()
-#define snmp_inc_icmpinaddrmasks()
-#define snmp_inc_icmpinaddrmaskreps()
-#define snmp_inc_icmpoutmsgs()
-#define snmp_inc_icmpouterrors()
-#define snmp_inc_icmpoutdestunreachs()
-#define snmp_inc_icmpouttimeexcds()
-#define snmp_inc_icmpoutparmprobs()
-#define snmp_inc_icmpoutsrcquenchs()
-#define snmp_inc_icmpoutredirects()
-#define snmp_inc_icmpoutechos()
-#define snmp_inc_icmpoutechoreps()
-#define snmp_inc_icmpouttimestamps()
-#define snmp_inc_icmpouttimestampreps()
-#define snmp_inc_icmpoutaddrmasks()
-#define snmp_inc_icmpoutaddrmaskreps()
-/* TCP */
-#define snmp_inc_tcpactiveopens()
-#define snmp_inc_tcppassiveopens()
-#define snmp_inc_tcpattemptfails()
-#define snmp_inc_tcpestabresets()
-#define snmp_inc_tcpinsegs()
-#define snmp_inc_tcpoutsegs()
-#define snmp_inc_tcpretranssegs()
-#define snmp_inc_tcpinerrs()
-#define snmp_inc_tcpoutrsts()
-
-/* UDP */
-#define snmp_inc_udpindatagrams()
-#define snmp_inc_udpnoports()
-#define snmp_inc_udpinerrors()
-#define snmp_inc_udpoutdatagrams()
-#define snmp_insert_udpidx_tree(pcb)
-#define snmp_delete_udpidx_tree(pcb)
-
-/* SNMP */
-#define snmp_inc_snmpinpkts()
-#define snmp_inc_snmpoutpkts()
-#define snmp_inc_snmpinbadversions()
-#define snmp_inc_snmpinbadcommunitynames()
-#define snmp_inc_snmpinbadcommunityuses()
-#define snmp_inc_snmpinasnparseerrs()
-#define snmp_inc_snmpintoobigs()
-#define snmp_inc_snmpinnosuchnames()
-#define snmp_inc_snmpinbadvalues()
-#define snmp_inc_snmpinreadonlys()
-#define snmp_inc_snmpingenerrs()
-#define snmp_add_snmpintotalreqvars(value)
-#define snmp_add_snmpintotalsetvars(value)
-#define snmp_inc_snmpingetrequests()
-#define snmp_inc_snmpingetnexts()
-#define snmp_inc_snmpinsetrequests()
-#define snmp_inc_snmpingetresponses()
-#define snmp_inc_snmpintraps()
-#define snmp_inc_snmpouttoobigs()
-#define snmp_inc_snmpoutnosuchnames()
-#define snmp_inc_snmpoutbadvalues()
-#define snmp_inc_snmpoutgenerrs()
-#define snmp_inc_snmpoutgetrequests()
-#define snmp_inc_snmpoutgetnexts()
-#define snmp_inc_snmpoutsetrequests()
-#define snmp_inc_snmpoutgetresponses()
-#define snmp_inc_snmpouttraps()
-#define snmp_get_snmpgrpid_ptr(oid)
-#define snmp_set_snmpenableauthentraps(value)
-#define snmp_get_snmpenableauthentraps(value)
-
-#endif
-
-#endif /* __LWIP_SNMP_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_asn1.h b/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_asn1.h
deleted file mode 100644
index c1df94a..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_asn1.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * @file
- * Abstract Syntax Notation One (ISO 8824, 8825) codec.
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#ifndef __LWIP_SNMP_ASN1_H__
-#define __LWIP_SNMP_ASN1_H__
-
-#include "lwip/opt.h"
-#include "arch/cc.h"
-#include "lwip/err.h"
-#include "lwip/pbuf.h"
-#include "lwip/snmp.h"
-
-#define SNMP_ASN1_UNIV (!0x80 | !0x40)
-#define SNMP_ASN1_APPLIC (!0x80 | 0x40)
-#define SNMP_ASN1_CONTXT ( 0x80 | !0x40)
-
-#define SNMP_ASN1_CONSTR (0x20)
-#define SNMP_ASN1_PRIMIT (!0x20)
-
-/* universal tags */
-#define SNMP_ASN1_INTEG 2
-#define SNMP_ASN1_OC_STR 4
-#define SNMP_ASN1_NUL 5
-#define SNMP_ASN1_OBJ_ID 6
-#define SNMP_ASN1_SEQ 16
-
-/* application specific (SNMP) tags */
-#define SNMP_ASN1_IPADDR 0 /* octet string size(4) */
-#define SNMP_ASN1_COUNTER 1 /* u32_t */
-#define SNMP_ASN1_GAUGE 2 /* u32_t */
-#define SNMP_ASN1_TIMETICKS 3 /* u32_t */
-#define SNMP_ASN1_OPAQUE 4 /* octet string */
-
-/* context specific (SNMP) tags */
-#define SNMP_ASN1_PDU_GET_REQ 0
-#define SNMP_ASN1_PDU_GET_NEXT_REQ 1
-#define SNMP_ASN1_PDU_GET_RESP 2
-#define SNMP_ASN1_PDU_SET_REQ 3
-#define SNMP_ASN1_PDU_TRAP 4
-
-err_t snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type);
-err_t snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length);
-err_t snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value);
-err_t snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value);
-err_t snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid);
-err_t snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw);
-
-void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed);
-void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed);
-void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed);
-void snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed);
-err_t snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type);
-err_t snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length);
-err_t snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u8_t octets_needed, u32_t value);
-err_t snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u8_t octets_needed, s32_t value);
-err_t snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident);
-err_t snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u8_t raw_len, u8_t *raw);
-
-#endif
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_msg.h b/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_msg.h
deleted file mode 100644
index 66faedd..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_msg.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
- * @file
- * SNMP Agent message handling structures.
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#ifndef __LWIP_SNMP_MSG_H__
-#define __LWIP_SNMP_MSG_H__
-
-#include "lwip/opt.h"
-#include "arch/cc.h"
-#include "lwip/snmp.h"
-#include "lwip/snmp_structs.h"
-
-#if SNMP_PRIVATE_MIB
-#include "private_mib.h"
-#endif
-
-#define SNMP_IN_PORT 161
-#define SNMP_TRAP_PORT 162
-
-#define SNMP_ES_NOERROR 0
-#define SNMP_ES_TOOBIG 1
-#define SNMP_ES_NOSUCHNAME 2
-#define SNMP_ES_BADVALUE 3
-#define SNMP_ES_READONLY 4
-#define SNMP_ES_GENERROR 5
-
-#define SNMP_GENTRAP_COLDSTART 0
-#define SNMP_GENTRAP_WARMSTART 1
-#define SNMP_GENTRAP_AUTHFAIL 4
-#define SNMP_GENTRAP_ENTERPRISESPC 6
-
-struct snmp_varbind
-{
- /* next pointer, NULL for last in list */
- struct snmp_varbind *next;
- /* previous pointer, NULL for first in list */
- struct snmp_varbind *prev;
-
- /* object identifier length (in s32_t) */
- u8_t ident_len;
- /* object identifier array */
- s32_t *ident;
-
- /* object value ASN1 type */
- u8_t value_type;
- /* object value length (in u8_t) */
- u8_t value_len;
- /* object value */
- void *value;
-
- /* encoding varbind seq length length */
- u8_t seqlenlen;
- /* encoding object identifier length length */
- u8_t olenlen;
- /* encoding object value length length */
- u8_t vlenlen;
- /* encoding varbind seq length */
- u16_t seqlen;
- /* encoding object identifier length */
- u16_t olen;
- /* encoding object value length */
- u16_t vlen;
-};
-
-struct snmp_varbind_root
-{
- struct snmp_varbind *head;
- struct snmp_varbind *tail;
- /* number of variable bindings in list */
- u8_t count;
- /* encoding varbind-list seq length length */
- u8_t seqlenlen;
- /* encoding varbind-list seq length */
- u16_t seqlen;
-};
-
-/** output response message header length fields */
-struct snmp_resp_header_lengths
-{
- /* encoding error-index length length */
- u8_t erridxlenlen;
- /* encoding error-status length length */
- u8_t errstatlenlen;
- /* encoding request id length length */
- u8_t ridlenlen;
- /* encoding pdu length length */
- u8_t pdulenlen;
- /* encoding community length length */
- u8_t comlenlen;
- /* encoding version length length */
- u8_t verlenlen;
- /* encoding sequence length length */
- u8_t seqlenlen;
-
- /* encoding error-index length */
- u16_t erridxlen;
- /* encoding error-status length */
- u16_t errstatlen;
- /* encoding request id length */
- u16_t ridlen;
- /* encoding pdu length */
- u16_t pdulen;
- /* encoding community length */
- u16_t comlen;
- /* encoding version length */
- u16_t verlen;
- /* encoding sequence length */
- u16_t seqlen;
-};
-
-/** output response message header length fields */
-struct snmp_trap_header_lengths
-{
- /* encoding timestamp length length */
- u8_t tslenlen;
- /* encoding specific-trap length length */
- u8_t strplenlen;
- /* encoding generic-trap length length */
- u8_t gtrplenlen;
- /* encoding agent-addr length length */
- u8_t aaddrlenlen;
- /* encoding enterprise-id length length */
- u8_t eidlenlen;
- /* encoding pdu length length */
- u8_t pdulenlen;
- /* encoding community length length */
- u8_t comlenlen;
- /* encoding version length length */
- u8_t verlenlen;
- /* encoding sequence length length */
- u8_t seqlenlen;
-
- /* encoding timestamp length */
- u16_t tslen;
- /* encoding specific-trap length */
- u16_t strplen;
- /* encoding generic-trap length */
- u16_t gtrplen;
- /* encoding agent-addr length */
- u16_t aaddrlen;
- /* encoding enterprise-id length */
- u16_t eidlen;
- /* encoding pdu length */
- u16_t pdulen;
- /* encoding community length */
- u16_t comlen;
- /* encoding version length */
- u16_t verlen;
- /* encoding sequence length */
- u16_t seqlen;
-};
-
-/* Accepting new SNMP messages. */
-#define SNMP_MSG_EMPTY 0
-/* Search for matching object for variable binding. */
-#define SNMP_MSG_SEARCH_OBJ 1
-/* Perform SNMP operation on in-memory object.
- Pass-through states, for symmetry only. */
-#define SNMP_MSG_INTERNAL_GET_OBJDEF 2
-#define SNMP_MSG_INTERNAL_GET_VALUE 3
-#define SNMP_MSG_INTERNAL_SET_TEST 4
-#define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5
-#define SNMP_MSG_INTERNAL_SET_VALUE 6
-/* Perform SNMP operation on object located externally.
- In theory this could be used for building a proxy agent.
- Practical use is for an enterprise spc. app. gateway. */
-#define SNMP_MSG_EXTERNAL_GET_OBJDEF 7
-#define SNMP_MSG_EXTERNAL_GET_VALUE 8
-#define SNMP_MSG_EXTERNAL_SET_TEST 9
-#define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10
-#define SNMP_MSG_EXTERNAL_SET_VALUE 11
-
-#define SNMP_COMMUNITY_STR_LEN 64
-struct snmp_msg_pstat
-{
- /* lwIP local port (161) binding */
- struct udp_pcb *pcb;
- /* source IP address */
- struct ip_addr sip;
- /* source UDP port */
- u16_t sp;
- /* request type */
- u8_t rt;
- /* request ID */
- s32_t rid;
- /* error status */
- s32_t error_status;
- /* error index */
- s32_t error_index;
- /* community name (zero terminated) */
- u8_t community[SNMP_COMMUNITY_STR_LEN + 1];
- /* community string length (exclusive zero term) */
- u8_t com_strlen;
- /* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */
- u8_t state;
- /* saved arguments for MSG_EXTERNAL_x */
- struct mib_external_node *ext_mib_node;
- struct snmp_name_ptr ext_name_ptr;
- struct obj_def ext_object_def;
- struct snmp_obj_id ext_oid;
- /* index into input variable binding list */
- u8_t vb_idx;
- /* ptr into input variable binding list */
- struct snmp_varbind *vb_ptr;
- /* list of variable bindings from input */
- struct snmp_varbind_root invb;
- /* list of variable bindings to output */
- struct snmp_varbind_root outvb;
- /* output response lengths used in ASN encoding */
- struct snmp_resp_header_lengths rhl;
-};
-
-struct snmp_msg_trap
-{
- /* lwIP local port (161) binding */
- struct udp_pcb *pcb;
- /* destination IP address in network order */
- struct ip_addr dip;
-
- /* source enterprise ID (sysObjectID) */
- struct snmp_obj_id *enterprise;
- /* source IP address, raw network order format */
- u8_t sip_raw[4];
- /* generic trap code */
- u32_t gen_trap;
- /* specific trap code */
- u32_t spc_trap;
- /* timestamp */
- u32_t ts;
- /* list of variable bindings to output */
- struct snmp_varbind_root outvb;
- /* output trap lengths used in ASN encoding */
- struct snmp_trap_header_lengths thl;
-};
-
-/** Agent Version constant, 0 = v1 oddity */
-extern const s32_t snmp_version;
-/** Agent default "public" community string */
-extern const char snmp_publiccommunity[7];
-
-extern struct snmp_msg_trap trap_msg;
-
-/** Agent setup, start listening to port 161. */
-void snmp_init(void);
-void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable);
-void snmp_trap_dst_ip_set(u8_t dst_idx, struct ip_addr *dst);
-
-/** Varbind-list functions. */
-struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len);
-void snmp_varbind_free(struct snmp_varbind *vb);
-void snmp_varbind_list_free(struct snmp_varbind_root *root);
-void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb);
-struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root);
-
-/** Handle an internal (recv) or external (private response) event. */
-void snmp_msg_event(u8_t request_id);
-err_t snmp_send_response(struct snmp_msg_pstat *m_stat);
-err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap);
-void snmp_coldstart_trap(void);
-void snmp_authfail_trap(void);
-
-#endif
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_structs.h b/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_structs.h
deleted file mode 100644
index f485466..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/snmp_structs.h
+++ /dev/null
@@ -1,253 +0,0 @@
-/**
- * @file
- * Generic MIB tree structures.
- *
- * @todo namespace prefixes
- */
-
-/*
- * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * Author: Christiaan Simons <christiaan.simons at axon.tv>
- */
-
-#ifndef __LWIP_SNMP_STRUCTS_H__
-#define __LWIP_SNMP_STRUCTS_H__
-
-#include "lwip/opt.h"
-#if LWIP_SNMP
-
-#include "arch/cc.h"
-#include "lwip/snmp.h"
-
-#if SNMP_PRIVATE_MIB
-#include "private_mib.h"
-#endif
-
-/* MIB object instance */
-#define MIB_OBJECT_NONE 0
-#define MIB_OBJECT_SCALAR 1
-#define MIB_OBJECT_TAB 2
-
-/* MIB object access */
-#define MIB_OBJECT_READ_ONLY 0
-#define MIB_OBJECT_READ_WRITE 1
-#define MIB_OBJECT_WRITE_ONLY 2
-#define MIB_OBJECT_NOT_ACCESSIBLE 3
-
-/** object definition returned by (get_object_def)() */
-struct obj_def
-{
- /* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */
- u8_t instance;
- /* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */
- u8_t access;
- /* ASN type for this object */
- u8_t asn_type;
- /* value length (host length) */
- u16_t v_len;
- /* length of instance part of supplied object identifier */
- u8_t id_inst_len;
- /* instance part of supplied object identifier */
- s32_t *id_inst_ptr;
-};
-
-struct snmp_name_ptr
-{
- u8_t ident_len;
- s32_t *ident;
-};
-
-/** MIB const scalar (.0) node */
-#define MIB_NODE_SC 0x01
-/** MIB const array node */
-#define MIB_NODE_AR 0x02
-/** MIB array node (mem_malloced from RAM) */
-#define MIB_NODE_RA 0x03
-/** MIB list root node (mem_malloced from RAM) */
-#define MIB_NODE_LR 0x04
-/** MIB node for external objects */
-#define MIB_NODE_EX 0x05
-
-/** node "base class" layout, the mandatory fields for a node */
-struct mib_node
-{
- /** returns struct obj_def for the given object identifier */
- void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
- /** returns object value for the given object identifier,
- @note the caller must allocate at least len bytes for the value */
- void (*get_value)(struct obj_def *od, u16_t len, void *value);
- /** tests length and/or range BEFORE setting */
- u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
- /** sets object value, only to be called when set_test() */
- void (*set_value)(struct obj_def *od, u16_t len, void *value);
- /** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */
- const u8_t node_type;
- /* array or max list length */
- const u16_t maxlength;
-};
-
-/** derived node for scalars .0 index */
-typedef struct mib_node mib_scalar_node;
-
-/** derived node, points to a fixed size const array
- of sub-identifiers plus a 'child' pointer */
-struct mib_array_node
-{
- /* inherited "base class" members */
- void (* const get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
- void (* const get_value)(struct obj_def *od, u16_t len, void *value);
- u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
- void (*set_value)(struct obj_def *od, u16_t len, void *value);
-
- const u8_t node_type;
- const u16_t maxlength;
-
- /* aditional struct members */
- const s32_t *objid;
- struct mib_node* const *nptr;
-};
-
-/** derived node, points to a fixed size mem_malloced array
- of sub-identifiers plus a 'child' pointer */
-struct mib_ram_array_node
-{
- /* inherited "base class" members */
- void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
- void (*get_value)(struct obj_def *od, u16_t len, void *value);
- u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
- void (*set_value)(struct obj_def *od, u16_t len, void *value);
-
- u8_t node_type;
- u16_t maxlength;
-
- /* aditional struct members */
- s32_t *objid;
- struct mib_node **nptr;
-};
-
-struct mib_list_node
-{
- struct mib_list_node *prev;
- struct mib_list_node *next;
- s32_t objid;
- struct mib_node *nptr;
-};
-
-/** derived node, points to a doubly linked list
- of sub-identifiers plus a 'child' pointer */
-struct mib_list_rootnode
-{
- /* inherited "base class" members */
- void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
- void (*get_value)(struct obj_def *od, u16_t len, void *value);
- u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
- void (*set_value)(struct obj_def *od, u16_t len, void *value);
-
- u8_t node_type;
- u16_t maxlength;
-
- /* aditional struct members */
- struct mib_list_node *head;
- struct mib_list_node *tail;
- /* counts list nodes in list */
- u16_t count;
-};
-
-/** derived node, has access functions for mib object in external memory or device
- using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */
-struct mib_external_node
-{
- /* inherited "base class" members */
- void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od);
- void (*get_value)(struct obj_def *od, u16_t len, void *value);
- u8_t (*set_test)(struct obj_def *od, u16_t len, void *value);
- void (*set_value)(struct obj_def *od, u16_t len, void *value);
-
- u8_t node_type;
- u16_t maxlength;
-
- /* aditional struct members */
- /** points to an extenal (in memory) record of some sort of addressing
- information, passed to and interpreted by the funtions below */
- void* addr_inf;
- /** tree levels under this node */
- u8_t tree_levels;
- /** number of objects at this level */
- u16_t (*level_length)(void* addr_inf, u8_t level);
- /** compares object sub identifier with external id
- return zero when equal, nonzero when unequal */
- s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id);
- void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id);
-
- /** async Questions */
- void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident);
- void (*get_value_q)(u8_t rid, struct obj_def *od);
- void (*set_test_q)(u8_t rid, struct obj_def *od);
- void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value);
- /** async Answers */
- void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od);
- void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
- u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
- void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value);
- /** async Panic Close (agent returns error reply,
- e.g. used for external transaction cleanup) */
- void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident);
- void (*get_value_pc)(u8_t rid, struct obj_def *od);
- void (*set_test_pc)(u8_t rid, struct obj_def *od);
- void (*set_value_pc)(u8_t rid, struct obj_def *od);
-};
-
-/** export MIB tree from mib2.c */
-extern const struct mib_array_node internet;
-
-/** dummy function pointers for non-leaf MIB nodes from mib2.c */
-void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od);
-void noleafs_get_value(struct obj_def *od, u16_t len, void *value);
-u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value);
-void noleafs_set_value(struct obj_def *od, u16_t len, void *value);
-
-void snmp_oidtoip(s32_t *ident, struct ip_addr *ip);
-void snmp_iptooid(struct ip_addr *ip, s32_t *ident);
-void snmp_ifindextonetif(s32_t ifindex, struct netif **netif);
-void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx);
-
-struct mib_list_node* snmp_mib_ln_alloc(s32_t id);
-void snmp_mib_ln_free(struct mib_list_node *ln);
-struct mib_list_rootnode* snmp_mib_lrn_alloc(void);
-void snmp_mib_lrn_free(struct mib_list_rootnode *lrn);
-
-s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn);
-s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn);
-struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n);
-
-struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np);
-struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
-u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident);
-u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret);
-
-#endif /* LWIP_SNMP */
-#endif
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/sockets.h b/src/VBox/Devices/Network/lwip/src/include/lwip/sockets.h
deleted file mode 100644
index d5f8ccf..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/sockets.h
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-
-#ifndef __LWIP_SOCKETS_H__
-#define __LWIP_SOCKETS_H__
-#include "lwip/ip_addr.h"
-
-struct sockaddr_in {
- u8_t sin_len;
- u8_t sin_family;
- u16_t sin_port;
- struct in_addr sin_addr;
- char sin_zero[8];
-};
-
-struct sockaddr {
- u8_t sa_len;
- u8_t sa_family;
- char sa_data[14];
-};
-
-#ifndef socklen_t
-# define socklen_t int
-#endif
-
-
-#define SOCK_STREAM 1
-#define SOCK_DGRAM 2
-#define SOCK_RAW 3
-
-/*
- * Option flags per-socket.
- */
-#define SO_DEBUG 0x0001 /* turn on debugging info recording */
-#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */
-#define SO_REUSEADDR 0x0004 /* allow local address reuse */
-#define SO_KEEPALIVE 0x0008 /* keep connections alive */
-#define SO_DONTROUTE 0x0010 /* just use interface addresses */
-#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs */
-#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible */
-#define SO_LINGER 0x0080 /* linger on close if data present */
-#define SO_OOBINLINE 0x0100 /* leave received OOB data in line */
-#define SO_REUSEPORT 0x0200 /* allow local address & port reuse */
-
-#define SO_DONTLINGER (int)(~SO_LINGER)
-
-/*
- * Additional options, not kept in so_options.
- */
-#define SO_SNDBUF 0x1001 /* send buffer size */
-#define SO_RCVBUF 0x1002 /* receive buffer size */
-#define SO_SNDLOWAT 0x1003 /* send low-water mark */
-#define SO_RCVLOWAT 0x1004 /* receive low-water mark */
-#define SO_SNDTIMEO 0x1005 /* send timeout */
-#define SO_RCVTIMEO 0x1006 /* receive timeout */
-#define SO_ERROR 0x1007 /* get error status and clear */
-#define SO_TYPE 0x1008 /* get socket type */
-
-
-
-/*
- * Structure used for manipulating linger option.
- */
-struct linger {
- int l_onoff; /* option on/off */
- int l_linger; /* linger time */
-};
-
-/*
- * Level number for (get/set)sockopt() to apply to socket itself.
- */
-#define SOL_SOCKET 0xfff /* options for socket level */
-
-
-#define AF_UNSPEC 0
-#define AF_INET 2
-#define PF_INET AF_INET
-#define PF_UNSPEC AF_UNSPEC
-
-#define IPPROTO_IP 0
-#define IPPROTO_TCP 6
-#define IPPROTO_UDP 17
-
-#define INADDR_ANY 0
-#define INADDR_BROADCAST 0xffffffff
-
-/* Flags we can use with send and recv. */
-#define MSG_DONTWAIT 0x40 /* Nonblocking i/o for this operation only */
-
-
-/*
- * Options for level IPPROTO_IP
- */
-#define IP_TOS 1
-#define IP_TTL 2
-
-
-#define IPTOS_TOS_MASK 0x1E
-#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK)
-#define IPTOS_LOWDELAY 0x10
-#define IPTOS_THROUGHPUT 0x08
-#define IPTOS_RELIABILITY 0x04
-#define IPTOS_LOWCOST 0x02
-#define IPTOS_MINCOST IPTOS_LOWCOST
-
-/*
- * Definitions for IP precedence (also in ip_tos) (hopefully unused)
- */
-#define IPTOS_PREC_MASK 0xe0
-#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK)
-#define IPTOS_PREC_NETCONTROL 0xe0
-#define IPTOS_PREC_INTERNETCONTROL 0xc0
-#define IPTOS_PREC_CRITIC_ECP 0xa0
-#define IPTOS_PREC_FLASHOVERRIDE 0x80
-#define IPTOS_PREC_FLASH 0x60
-#define IPTOS_PREC_IMMEDIATE 0x40
-#define IPTOS_PREC_PRIORITY 0x20
-#define IPTOS_PREC_ROUTINE 0x00
-
-
-/*
- * Commands for ioctlsocket(), taken from the BSD file fcntl.h.
- *
- *
- * Ioctl's have the command encoded in the lower word,
- * and the size of any in or out parameters in the upper
- * word. The high 2 bits of the upper word are used
- * to encode the in/out status of the parameter; for now
- * we restrict parameters to at most 128 bytes.
- */
-#if !defined(FIONREAD) || !defined(FIONBIO)
-#define IOCPARM_MASK 0x7f /* parameters must be < 128 bytes */
-#define IOC_VOID 0x20000000 /* no parameters */
-#define IOC_OUT 0x40000000 /* copy out parameters */
-#define IOC_IN 0x80000000 /* copy in parameters */
-#define IOC_INOUT (IOC_IN|IOC_OUT)
- /* 0x20000000 distinguishes new &
- old ioctl's */
-#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
-
-#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-
-#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-#endif
-
-#ifndef FIONREAD
-#define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */
-#endif
-#ifndef FIONBIO
-#define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */
-#endif
-
-/* Socket I/O Controls */
-#ifndef SIOCSHIWAT
-#define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */
-#define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */
-#define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */
-#define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */
-#define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */
-#endif
-
-#ifndef O_NONBLOCK
-#define O_NONBLOCK 04000U
-#endif
-
-#ifndef FD_SET
- #undef FD_SETSIZE
- #define FD_SETSIZE 16
- #define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7)))
- #define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7)))
- #define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7)))
- #define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p)))
-
- typedef struct fd_set {
- unsigned char fd_bits [(FD_SETSIZE+7)/8];
- } fd_set;
-
-/*
- * only define this in sockets.c so it does not interfere
- * with other projects namespaces where timeval is present
- */
-#ifndef LWIP_TIMEVAL_PRIVATE
-#define LWIP_TIMEVAL_PRIVATE 1
-#endif
-
-#if LWIP_TIMEVAL_PRIVATE
- struct timeval {
- long tv_sec; /* seconds */
- long tv_usec; /* and microseconds */
- };
-#endif
-
-#endif
-
-int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen);
-int lwip_bind(int s, struct sockaddr *name, socklen_t namelen);
-int lwip_shutdown(int s, int how);
-int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen);
-int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen);
-int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);
-int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);
-int lwip_close(int s);
-int lwip_connect(int s, struct sockaddr *name, socklen_t namelen);
-int lwip_listen(int s, int backlog);
-int lwip_recv(int s, void *mem, int len, unsigned int flags);
-int lwip_read(int s, void *mem, int len);
-int lwip_recvfrom(int s, void *mem, int len, unsigned int flags,
- struct sockaddr *from, socklen_t *fromlen);
-int lwip_send(int s, void *dataptr, int size, unsigned int flags);
-int lwip_sendto(int s, void *dataptr, int size, unsigned int flags,
- struct sockaddr *to, socklen_t tolen);
-int lwip_socket(int domain, int type, int protocol);
-int lwip_write(int s, void *dataptr, int size);
-int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,
- struct timeval *timeout);
-int lwip_ioctl(int s, long cmd, void *argp);
-
-#if LWIP_COMPAT_SOCKETS
-#define accept(a,b,c) lwip_accept(a,b,c)
-#define bind(a,b,c) lwip_bind(a,b,c)
-#define shutdown(a,b) lwip_shutdown(a,b)
-#define close(s) lwip_close(s)
-#define connect(a,b,c) lwip_connect(a,b,c)
-#define getsockname(a,b,c) lwip_getsockname(a,b,c)
-#define getpeername(a,b,c) lwip_getpeername(a,b,c)
-#define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e)
-#define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e)
-#define listen(a,b) lwip_listen(a,b)
-#define recv(a,b,c,d) lwip_recv(a,b,c,d)
-#define read(a,b,c) lwip_read(a,b,c)
-#define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f)
-#define send(a,b,c,d) lwip_send(a,b,c,d)
-#define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f)
-#define socket(a,b,c) lwip_socket(a,b,c)
-#define write(a,b,c) lwip_write(a,b,c)
-#define select(a,b,c,d,e) lwip_select(a,b,c,d,e)
-#define ioctlsocket(a,b,c) lwip_ioctl(a,b,c)
-#endif /* LWIP_COMPAT_SOCKETS */
-
-#endif /* __LWIP_SOCKETS_H__ */
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/stats.h b/src/VBox/Devices/Network/lwip/src/include/lwip/stats.h
deleted file mode 100644
index 71acfd0..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/stats.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_STATS_H__
-#define __LWIP_STATS_H__
-
-#include "lwip/opt.h"
-#include "arch/cc.h"
-
-#include "lwip/mem.h"
-#include "lwip/memp.h"
-
-#if LWIP_STATS
-
-struct stats_proto {
- u16_t xmit; /* Transmitted packets. */
- u16_t rexmit; /* Retransmitted packets. */
- u16_t recv; /* Received packets. */
- u16_t fw; /* Forwarded packets. */
- u16_t drop; /* Dropped packets. */
- u16_t chkerr; /* Checksum error. */
- u16_t lenerr; /* Invalid length error. */
- u16_t memerr; /* Out of memory error. */
- u16_t rterr; /* Routing error. */
- u16_t proterr; /* Protocol error. */
- u16_t opterr; /* Error in options. */
- u16_t err; /* Misc error. */
- u16_t cachehit;
-};
-
-struct stats_mem {
- mem_size_t avail;
- mem_size_t used;
- mem_size_t max;
- mem_size_t err;
-};
-
-struct stats_pbuf {
- u16_t avail;
- u16_t used;
- u16_t max;
- u16_t err;
-
- u16_t alloc_locked;
- u16_t refresh_locked;
-};
-
-struct stats_syselem {
- u16_t used;
- u16_t max;
- u16_t err;
-};
-
-struct stats_sys {
- struct stats_syselem sem;
- struct stats_syselem mbox;
-};
-
-struct stats_ {
- struct stats_proto link;
- struct stats_proto ip_frag;
- struct stats_proto ip;
- struct stats_proto icmp;
- struct stats_proto udp;
- struct stats_proto tcp;
- struct stats_pbuf pbuf;
- struct stats_mem mem;
- struct stats_mem memp[MEMP_MAX];
- struct stats_sys sys;
-};
-
-extern struct stats_ lwip_stats;
-
-
-void stats_init(void);
-
-#define STATS_INC(x) ++lwip_stats.x
-#else
-#define stats_init()
-#define STATS_INC(x)
-#endif /* LWIP_STATS */
-
-#if TCP_STATS
-#define TCP_STATS_INC(x) STATS_INC(x)
-#else
-#define TCP_STATS_INC(x)
-#endif
-
-#if UDP_STATS
-#define UDP_STATS_INC(x) STATS_INC(x)
-#else
-#define UDP_STATS_INC(x)
-#endif
-
-#if ICMP_STATS
-#define ICMP_STATS_INC(x) STATS_INC(x)
-#else
-#define ICMP_STATS_INC(x)
-#endif
-
-#if IP_STATS
-#define IP_STATS_INC(x) STATS_INC(x)
-#else
-#define IP_STATS_INC(x)
-#endif
-
-#if IPFRAG_STATS
-#define IPFRAG_STATS_INC(x) STATS_INC(x)
-#else
-#define IPFRAG_STATS_INC(x)
-#endif
-
-#if LINK_STATS
-#define LINK_STATS_INC(x) STATS_INC(x)
-#else
-#define LINK_STATS_INC(x)
-#endif
-
-/* Display of statistics */
-#if LWIP_STATS_DISPLAY
-void stats_display(void);
-#else
-#define stats_display()
-#endif
-
-#endif /* __LWIP_STATS_H__ */
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/sys.h b/src/VBox/Devices/Network/lwip/src/include/lwip/sys.h
deleted file mode 100644
index f7925b3..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/sys.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_SYS_H__
-#define __LWIP_SYS_H__
-
-#include "arch/cc.h"
-
-#include "lwip/opt.h"
-
-
-#if NO_SYS
-
-/* For a totally minimal and standalone system, we provide null
- definitions of the sys_ functions. */
-typedef u8_t sys_sem_t;
-typedef u8_t sys_mbox_t;
-struct sys_timeo {u8_t dummy;};
-
-#define sys_init()
-#define sys_timeout(m,h,a)
-#define sys_untimeout(m,a)
-#define sys_sem_new(c) c
-#define sys_sem_signal(s)
-#define sys_sem_wait(s)
-#define sys_sem_free(s)
-#define sys_mbox_new() 0
-#define sys_mbox_fetch(m,d)
-#define sys_mbox_post(m,d)
-#define sys_mbox_free(m)
-
-#define sys_thread_new(t,a,p)
-
-#else /* NO_SYS */
-
-#include "arch/sys_arch.h"
-
-/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */
-#define SYS_ARCH_TIMEOUT 0xffffffff
-
-typedef void (* sys_timeout_handler)(void *arg);
-
-struct sys_timeo {
- struct sys_timeo *next;
- u32_t time;
- sys_timeout_handler h;
- void *arg;
-};
-
-struct sys_timeouts {
- struct sys_timeo *next;
-};
-
-/* sys_init() must be called before anthing else. */
-void sys_init(void);
-
-/*
- * sys_timeout():
- *
- * Schedule a timeout a specified amount of milliseconds in the
- * future. When the timeout occurs, the specified timeout handler will
- * be called. The handler will be passed the "arg" argument when
- * called.
- *
- */
-void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg);
-void sys_untimeout(sys_timeout_handler h, void *arg);
-struct sys_timeouts *sys_arch_timeouts(void);
-
-/* Semaphore functions. */
-sys_sem_t sys_sem_new(u8_t count);
-void sys_sem_signal(sys_sem_t sem);
-u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout);
-void sys_sem_free(sys_sem_t sem);
-void sys_sem_wait(sys_sem_t sem);
-int sys_sem_wait_timeout(sys_sem_t sem, u32_t timeout);
-
-/* Time functions. */
-#ifdef VBOX
-void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */
-#else
-#ifndef sys_msleep
-void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */
-#endif
-#endif
-#ifndef sys_jiffies
-u32_t sys_jiffies(void); /* since power up. */
-#endif
-
-/* Mailbox functions. */
-sys_mbox_t sys_mbox_new(void);
-void sys_mbox_post(sys_mbox_t mbox, void *msg);
-u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout);
-void sys_mbox_free(sys_mbox_t mbox);
-void sys_mbox_fetch(sys_mbox_t mbox, void **msg);
-
-
-/* Thread functions. */
-sys_thread_t sys_thread_new(void (* thread)(void *arg), void *arg, int prio);
-
-/* The following functions are used only in Unix code, and
- can be omitted when porting the stack. */
-/* Returns the current time in microseconds. */
-unsigned long sys_now(void);
-
-#endif /* NO_SYS */
-
-/* Critical Region Protection */
-/* These functions must be implemented in the sys_arch.c file.
- In some implementations they can provide a more light-weight protection
- mechanism than using semaphores. Otherwise semaphores can be used for
- implementation */
-#ifndef SYS_ARCH_PROTECT
-/** SYS_LIGHTWEIGHT_PROT
- * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection
- * for certain critical regions during buffer allocation, deallocation and memory
- * allocation and deallocation.
- */
-#if SYS_LIGHTWEIGHT_PROT
-
-/** SYS_ARCH_DECL_PROTECT
- * declare a protection variable. This macro will default to defining a variable of
- * type sys_prot_t. If a particular port needs a different implementation, then
- * this macro may be defined in sys_arch.h.
- */
-#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev
-/** SYS_ARCH_PROTECT
- * Perform a "fast" protect. This could be implemented by
- * disabling interrupts for an embedded system or by using a semaphore or
- * mutex. The implementation should allow calling SYS_ARCH_PROTECT when
- * already protected. The old protection level is returned in the variable
- * "lev". This macro will default to calling the sys_arch_protect() function
- * which should be implemented in sys_arch.c. If a particular port needs a
- * different implementation, then this macro may be defined in sys_arch.h
- */
-#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()
-/** SYS_ARCH_UNPROTECT
- * Perform a "fast" set of the protection level to "lev". This could be
- * implemented by setting the interrupt level to "lev" within the MACRO or by
- * using a semaphore or mutex. This macro will default to calling the
- * sys_arch_unprotect() function which should be implemented in
- * sys_arch.c. If a particular port needs a different implementation, then
- * this macro may be defined in sys_arch.h
- */
-#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev)
-sys_prot_t sys_arch_protect(void);
-void sys_arch_unprotect(sys_prot_t pval);
-
-#else
-
-#define SYS_ARCH_DECL_PROTECT(lev)
-#define SYS_ARCH_PROTECT(lev)
-#define SYS_ARCH_UNPROTECT(lev)
-
-#endif /* SYS_LIGHTWEIGHT_PROT */
-
-#endif /* SYS_ARCH_PROTECT */
-
-#endif /* __LWIP_SYS_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/tcp.h b/src/VBox/Devices/Network/lwip/src/include/lwip/tcp.h
deleted file mode 100644
index 9f86892..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/tcp.h
+++ /dev/null
@@ -1,531 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_TCP_H__
-#define __LWIP_TCP_H__
-
-#include "lwip/sys.h"
-#include "lwip/mem.h"
-
-#include "lwip/pbuf.h"
-#include "lwip/opt.h"
-#include "lwip/ip.h"
-#include "lwip/icmp.h"
-
-#include "lwip/err.h"
-
-struct tcp_pcb;
-
-/* Functions for interfacing with TCP: */
-
-/* Lower layer interface to TCP: */
-void tcp_init (void); /* Must be called first to
- initialize TCP. */
-void tcp_tmr (void); /* Must be called every
- TCP_TMR_INTERVAL
- ms. (Typically 250 ms). */
-/* Application program's interface: */
-struct tcp_pcb * tcp_new (void);
-struct tcp_pcb * tcp_alloc (u8_t prio);
-
-void tcp_arg (struct tcp_pcb *pcb, void *arg);
-void tcp_accept (struct tcp_pcb *pcb,
- err_t (* accept)(void *arg, struct tcp_pcb *newpcb,
- err_t err));
-void tcp_recv (struct tcp_pcb *pcb,
- err_t (* recv)(void *arg, struct tcp_pcb *tpcb,
- struct pbuf *p, err_t err));
-void tcp_sent (struct tcp_pcb *pcb,
- err_t (* sent)(void *arg, struct tcp_pcb *tpcb,
- u16_t len));
-void tcp_poll (struct tcp_pcb *pcb,
- err_t (* poll)(void *arg, struct tcp_pcb *tpcb),
- u8_t interval);
-void tcp_err (struct tcp_pcb *pcb,
- void (* err)(void *arg, err_t err));
-
-#define tcp_mss(pcb) ((pcb)->mss)
-#define tcp_sndbuf(pcb) ((pcb)->snd_buf)
-
-void tcp_recved (struct tcp_pcb *pcb, u16_t len);
-err_t tcp_bind (struct tcp_pcb *pcb, struct ip_addr *ipaddr,
- u16_t port);
-err_t tcp_connect (struct tcp_pcb *pcb, struct ip_addr *ipaddr,
- u16_t port, err_t (* connected)(void *arg,
- struct tcp_pcb *tpcb,
- err_t err));
-struct tcp_pcb * tcp_listen (struct tcp_pcb *pcb);
-void tcp_abort (struct tcp_pcb *pcb);
-err_t tcp_close (struct tcp_pcb *pcb);
-err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len,
- u8_t copy);
-
-void tcp_setprio (struct tcp_pcb *pcb, u8_t prio);
-
-#define TCP_PRIO_MIN 1
-#define TCP_PRIO_NORMAL 64
-#define TCP_PRIO_MAX 127
-
-/* It is also possible to call these two functions at the right
- intervals (instead of calling tcp_tmr()). */
-void tcp_slowtmr (void);
-void tcp_fasttmr (void);
-
-
-/* Only used by IP to pass a TCP segment to TCP: */
-void tcp_input (struct pbuf *p, struct netif *inp);
-/* Used within the TCP code only: */
-err_t tcp_output (struct tcp_pcb *pcb);
-void tcp_rexmit (struct tcp_pcb *pcb);
-void tcp_rexmit_rto (struct tcp_pcb *pcb);
-
-
-
-#define TCP_SEQ_LT(a,b) ((s32_t)((a)-(b)) < 0)
-#define TCP_SEQ_LEQ(a,b) ((s32_t)((a)-(b)) <= 0)
-#define TCP_SEQ_GT(a,b) ((s32_t)((a)-(b)) > 0)
-#define TCP_SEQ_GEQ(a,b) ((s32_t)((a)-(b)) >= 0)
-/* is b<=a<=c? */
-#if 0 /* see bug #10548 */
-#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b))
-#endif
-#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c))
-#define TCP_FIN 0x01U
-#define TCP_SYN 0x02U
-#define TCP_RST 0x04U
-#define TCP_PSH 0x08U
-#define TCP_ACK 0x10U
-#define TCP_URG 0x20U
-#define TCP_ECE 0x40U
-#define TCP_CWR 0x80U
-
-#define TCP_FLAGS 0x3fU
-
-/* Length of the TCP header, excluding options. */
-#define TCP_HLEN 20
-
-#ifndef TCP_TMR_INTERVAL
-#define TCP_TMR_INTERVAL 250 /* The TCP timer interval in
- milliseconds. */
-#endif /* TCP_TMR_INTERVAL */
-
-#ifndef TCP_FAST_INTERVAL
-#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in
- milliseconds */
-#endif /* TCP_FAST_INTERVAL */
-
-#ifndef TCP_SLOW_INTERVAL
-#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in
- milliseconds */
-#endif /* TCP_SLOW_INTERVAL */
-
-#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */
-#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */
-
-#define TCP_OOSEQ_TIMEOUT 6U /* x RTO */
-
-#define TCP_MSL 60000 /* The maximum segment lifetime in microseconds */
-
-/*
- * User-settable options (used with setsockopt).
- */
-#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */
-#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keepalive miliseconds */
-
-/* Keepalive values */
-#define TCP_KEEPDEFAULT 7200000 /* KEEPALIVE timer in miliseconds */
-#define TCP_KEEPINTVL 75000 /* Time between KEEPALIVE probes in miliseconds */
-#define TCP_KEEPCNT 9 /* Counter for KEEPALIVE probes */
-#define TCP_MAXIDLE TCP_KEEPCNT * TCP_KEEPINTVL /* Maximum KEEPALIVE probe time */
-
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct tcp_hdr {
- PACK_STRUCT_FIELD(u16_t src);
- PACK_STRUCT_FIELD(u16_t dest);
- PACK_STRUCT_FIELD(u32_t seqno);
- PACK_STRUCT_FIELD(u32_t ackno);
- PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags);
- PACK_STRUCT_FIELD(u16_t wnd);
- PACK_STRUCT_FIELD(u16_t chksum);
- PACK_STRUCT_FIELD(u16_t urgp);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-#define TCPH_OFFSET(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 8)
-#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)
-#define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS)
-
-#define TCPH_OFFSET_SET(phdr, offset) (phdr)->_hdrlen_rsvd_flags = htons(((offset) << 8) | TCPH_FLAGS(phdr))
-#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr))
-#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons((ntohs((phdr)->_hdrlen_rsvd_flags) & ~TCP_FLAGS) | (flags))
-#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (flags))
-#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)) )
-
-#define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & TCP_FIN || \
- TCPH_FLAGS((seg)->tcphdr) & TCP_SYN)? 1: 0))
-
-enum tcp_state {
- CLOSED = 0,
- LISTEN = 1,
- SYN_SENT = 2,
- SYN_RCVD = 3,
- ESTABLISHED = 4,
- FIN_WAIT_1 = 5,
- FIN_WAIT_2 = 6,
- CLOSE_WAIT = 7,
- CLOSING = 8,
- LAST_ACK = 9,
- TIME_WAIT = 10
-};
-
-/* the TCP protocol control block */
-struct tcp_pcb {
-/** common PCB members */
- IP_PCB;
-/** protocol specific PCB members */
- struct tcp_pcb *next; /* for the linked list */
- enum tcp_state state; /* TCP state */
- u8_t prio;
- void *callback_arg;
-
- u16_t local_port;
- u16_t remote_port;
-
- u8_t flags;
-#define TF_ACK_DELAY (u8_t)0x01U /* Delayed ACK. */
-#define TF_ACK_NOW (u8_t)0x02U /* Immediate ACK. */
-#define TF_INFR (u8_t)0x04U /* In fast recovery. */
-#define TF_RESET (u8_t)0x08U /* Connection was reset. */
-#define TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */
-#define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */
-#define TF_NODELAY (u8_t)0x40U /* Disable Nagle algorithm */
-
- /* receiver variables */
- u32_t rcv_nxt; /* next seqno expected */
- u16_t rcv_wnd; /* receiver window */
-
- /* Timers */
- u32_t tmr;
- u8_t polltmr, pollinterval;
-
- /* Retransmission timer. */
- u16_t rtime;
-
- u16_t mss; /* maximum segment size */
-
- /* RTT (round trip time) estimation variables */
- u32_t rttest; /* RTT estimate in 500ms ticks */
- u32_t rtseq; /* sequence number being timed */
- s16_t sa, sv; /* @todo document this */
-
- u16_t rto; /* retransmission time-out */
- u8_t nrtx; /* number of retransmissions */
-
- /* fast retransmit/recovery */
- u32_t lastack; /* Highest acknowledged seqno. */
- u8_t dupacks;
-
- /* congestion avoidance/control variables */
- u16_t cwnd;
- u16_t ssthresh;
-
- /* sender variables */
- u32_t snd_nxt, /* next seqno to be sent */
- snd_max, /* Highest seqno sent. */
- snd_wnd, /* sender window */
- snd_wl1, snd_wl2, /* Sequence and acknowledgement numbers of last
- window update. */
- snd_lbb; /* Sequence number of next byte to be buffered. */
-
- u16_t acked;
-
- u16_t snd_buf; /* Available buffer space for sending (in bytes). */
- u8_t snd_queuelen; /* Available buffer space for sending (in tcp_segs). */
-
-
- /* These are ordered by sequence number: */
- struct tcp_seg *unsent; /* Unsent (queued) segments. */
- struct tcp_seg *unacked; /* Sent but unacknowledged segments. */
-#if TCP_QUEUE_OOSEQ
- struct tcp_seg *ooseq; /* Received out of sequence segments. */
-#endif /* TCP_QUEUE_OOSEQ */
-
-#if LWIP_CALLBACK_API
- /* Function to be called when more send buffer space is available. */
- err_t (* sent)(void *arg, struct tcp_pcb *pcb, u16_t space);
-
- /* Function to be called when (in-sequence) data has arrived. */
- err_t (* recv)(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);
-
- /* Function to be called when a connection has been set up. */
- err_t (* connected)(void *arg, struct tcp_pcb *pcb, err_t err);
-
- /* Function to call when a listener has been connected. */
- err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err);
-
- /* Function which is called periodically. */
- err_t (* poll)(void *arg, struct tcp_pcb *pcb);
-
- /* Function to be called whenever a fatal error occurs. */
- void (* errf)(void *arg, err_t err);
-#endif /* LWIP_CALLBACK_API */
-
- /* idle time before KEEPALIVE is sent */
- u32_t keepalive;
-
- /* KEEPALIVE counter */
- u8_t keep_cnt;
-};
-
-struct tcp_pcb_listen {
-/* Common members of all PCB types */
- IP_PCB;
-
-/* Protocol specific PCB members */
- struct tcp_pcb_listen *next; /* for the linked list */
-
- /* Even if state is obviously LISTEN this is here for
- * field compatibility with tpc_pcb to which it is cast sometimes
- * Until a cleaner solution emerges this is here.FIXME
- */
- enum tcp_state state; /* TCP state */
-
- u8_t prio;
- void *callback_arg;
-
- u16_t local_port;
-
-#if LWIP_CALLBACK_API
- /* Function to call when a listener has been connected. */
- err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err);
-#endif /* LWIP_CALLBACK_API */
-};
-
-#if LWIP_EVENT_API
-
-enum lwip_event {
- LWIP_EVENT_ACCEPT,
- LWIP_EVENT_SENT,
- LWIP_EVENT_RECV,
- LWIP_EVENT_CONNECTED,
- LWIP_EVENT_POLL,
- LWIP_EVENT_ERR
-};
-
-err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,
- enum lwip_event,
- struct pbuf *p,
- u16_t size,
- err_t err);
-
-#define TCP_EVENT_ACCEPT(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
- LWIP_EVENT_ACCEPT, NULL, 0, err)
-#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
- LWIP_EVENT_SENT, NULL, space, ERR_OK)
-#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
- LWIP_EVENT_RECV, (p), 0, (err))
-#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
- LWIP_EVENT_CONNECTED, NULL, 0, (err))
-#define TCP_EVENT_POLL(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\
- LWIP_EVENT_POLL, NULL, 0, ERR_OK)
-#define TCP_EVENT_ERR(errf,arg,err) lwip_tcp_event((arg), NULL, \
- LWIP_EVENT_ERR, NULL, 0, (err))
-#else /* LWIP_EVENT_API */
-#define TCP_EVENT_ACCEPT(pcb,err,ret) \
- if((pcb)->accept != NULL) \
- (ret = (pcb)->accept((pcb)->callback_arg,(pcb),(err)))
-#define TCP_EVENT_SENT(pcb,space,ret) \
- if((pcb)->sent != NULL) \
- (ret = (pcb)->sent((pcb)->callback_arg,(pcb),(space)))
-#define TCP_EVENT_RECV(pcb,p,err,ret) \
- if((pcb)->recv != NULL) \
- { ret = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err)); } else { \
- if (p) pbuf_free(p); }
-#define TCP_EVENT_CONNECTED(pcb,err,ret) \
- if((pcb)->connected != NULL) \
- (ret = (pcb)->connected((pcb)->callback_arg,(pcb),(err)))
-#define TCP_EVENT_POLL(pcb,ret) \
- if((pcb)->poll != NULL) \
- (ret = (pcb)->poll((pcb)->callback_arg,(pcb)))
-#define TCP_EVENT_ERR(errf,arg,err) \
- if((errf) != NULL) \
- (errf)((arg),(err))
-#endif /* LWIP_EVENT_API */
-
-/* This structure represents a TCP segment on the unsent and unacked queues */
-struct tcp_seg {
- struct tcp_seg *next; /* used when putting segements on a queue */
- struct pbuf *p; /* buffer containing data + TCP header */
- void *dataptr; /* pointer to the TCP data in the pbuf */
- u16_t len; /* the TCP length of this segment */
- struct tcp_hdr *tcphdr; /* the TCP header */
-};
-
-/* Internal functions and global variables: */
-struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb);
-void tcp_pcb_purge(struct tcp_pcb *pcb);
-void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb);
-
-u8_t tcp_segs_free(struct tcp_seg *seg);
-u8_t tcp_seg_free(struct tcp_seg *seg);
-struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg);
-
-#define tcp_ack(pcb) if((pcb)->flags & TF_ACK_DELAY) { \
- (pcb)->flags &= ~TF_ACK_DELAY; \
- (pcb)->flags |= TF_ACK_NOW; \
- tcp_output(pcb); \
- } else { \
- (pcb)->flags |= TF_ACK_DELAY; \
- }
-
-#define tcp_ack_now(pcb) (pcb)->flags |= TF_ACK_NOW; \
- tcp_output(pcb)
-
-err_t tcp_send_ctrl(struct tcp_pcb *pcb, u8_t flags);
-err_t tcp_enqueue(struct tcp_pcb *pcb, void *dataptr, u16_t len,
- u8_t flags, u8_t copy,
- u8_t *optdata, u8_t optlen);
-
-void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg);
-
-void tcp_rst(u32_t seqno, u32_t ackno,
- struct ip_addr *local_ip, struct ip_addr *remote_ip,
- u16_t local_port, u16_t remote_port);
-
-u32_t tcp_next_iss(void);
-
-void tcp_keepalive(struct tcp_pcb *pcb);
-
-extern struct tcp_pcb *tcp_input_pcb;
-extern u32_t tcp_ticks;
-
-#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG
-void tcp_debug_print(struct tcp_hdr *tcphdr);
-void tcp_debug_print_flags(u8_t flags);
-void tcp_debug_print_state(enum tcp_state s);
-void tcp_debug_print_pcbs(void);
-s16_t tcp_pcbs_sane(void);
-#else
-# define tcp_debug_print(tcphdr)
-# define tcp_debug_print_flags(flags)
-# define tcp_debug_print_state(s)
-# define tcp_debug_print_pcbs()
-# define tcp_pcbs_sane() 1
-#endif /* TCP_DEBUG */
-
-#if NO_SYS
-#define tcp_timer_needed()
-#else
-void tcp_timer_needed(void);
-#endif
-
-/* The TCP PCB lists. */
-union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */
- struct tcp_pcb_listen *listen_pcbs;
- struct tcp_pcb *pcbs;
-};
-extern union tcp_listen_pcbs_t tcp_listen_pcbs;
-extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a
- state in which they accept or send
- data. */
-extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */
-
-extern struct tcp_pcb *tcp_tmp_pcb; /* Only used for temporary storage. */
-
-/* Axioms about the above lists:
- 1) Every TCP PCB that is not CLOSED is in one of the lists.
- 2) A PCB is only in one of the lists.
- 3) All PCBs in the tcp_listen_pcbs list is in LISTEN state.
- 4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state.
-*/
-
-/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB
- with a PCB list or removes a PCB from a list, respectively. */
-#if 0
-#define TCP_REG(pcbs, npcb) do {\
- LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", npcb, npcb->local_port)); \
- for(tcp_tmp_pcb = *pcbs; \
- tcp_tmp_pcb != NULL; \
- tcp_tmp_pcb = tcp_tmp_pcb->next) { \
- LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != npcb); \
- } \
- LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", npcb->state != CLOSED); \
- npcb->next = *pcbs; \
- LWIP_ASSERT("TCP_REG: npcb->next != npcb", npcb->next != npcb); \
- *(pcbs) = npcb; \
- LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \
- tcp_timer_needed(); \
- } while(0)
-#define TCP_RMV(pcbs, npcb) do { \
- LWIP_ASSERT("TCP_RMV: pcbs != NULL", *pcbs != NULL); \
- LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", npcb, *pcbs)); \
- if(*pcbs == npcb) { \
- *pcbs = (*pcbs)->next; \
- } else for(tcp_tmp_pcb = *pcbs; tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \
- if(tcp_tmp_pcb->next != NULL && tcp_tmp_pcb->next == npcb) { \
- tcp_tmp_pcb->next = npcb->next; \
- break; \
- } \
- } \
- npcb->next = NULL; \
- LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \
- LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", npcb, *pcbs)); \
- } while(0)
-
-#else /* LWIP_DEBUG */
-#define TCP_REG(pcbs, npcb) do { \
- npcb->next = *pcbs; \
- *(pcbs) = npcb; \
- tcp_timer_needed(); \
- } while(0)
-#define TCP_RMV(pcbs, npcb) do { \
- if(*(pcbs) == npcb) { \
- (*(pcbs)) = (*pcbs)->next; \
- } else for(tcp_tmp_pcb = *pcbs; tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \
- if(tcp_tmp_pcb->next != NULL && tcp_tmp_pcb->next == npcb) { \
- tcp_tmp_pcb->next = npcb->next; \
- break; \
- } \
- } \
- npcb->next = NULL; \
- } while(0)
-#endif /* LWIP_DEBUG */
-#endif /* __LWIP_TCP_H__ */
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/tcpip.h b/src/VBox/Devices/Network/lwip/src/include/lwip/tcpip.h
deleted file mode 100644
index 58d88d7..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/tcpip.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_TCPIP_H__
-#define __LWIP_TCPIP_H__
-
-#include "lwip/api_msg.h"
-#include "lwip/pbuf.h"
-
-void tcpip_init(void (* tcpip_init_done)(void *), void *arg);
-#ifdef VBOX
-void tcpip_terminate(void);
-#endif
-void tcpip_apimsg(struct api_msg *apimsg);
-err_t tcpip_input(struct pbuf *p, struct netif *inp);
-err_t tcpip_callback(void (*f)(void *ctx), void *ctx);
-
-void tcpip_tcp_timer_needed(void);
-
-enum tcpip_msg_type {
- TCPIP_MSG_API,
- TCPIP_MSG_INPUT,
- TCPIP_MSG_CALLBACK
-#ifdef VBOX
- ,
- TCPIP_MSG_TERM
-#endif
-};
-
-struct tcpip_msg {
- enum tcpip_msg_type type;
- sys_sem_t *sem;
- union {
- struct api_msg *apimsg;
- struct {
- struct pbuf *p;
- struct netif *netif;
- } inp;
- struct {
- void (*f)(void *ctx);
- void *ctx;
- } cb;
- } msg;
-};
-
-
-#endif /* __LWIP_TCPIP_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/lwip/udp.h b/src/VBox/Devices/Network/lwip/src/include/lwip/udp.h
deleted file mode 100644
index 346898e..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/lwip/udp.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __LWIP_UDP_H__
-#define __LWIP_UDP_H__
-
-#include "lwip/arch.h"
-
-#include "lwip/pbuf.h"
-#include "lwip/inet.h"
-#include "lwip/ip.h"
-
-#define UDP_HLEN 8
-
-struct udp_hdr {
- PACK_STRUCT_FIELD(u16_t src);
- PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */
- PACK_STRUCT_FIELD(u16_t len);
- PACK_STRUCT_FIELD(u16_t chksum);
-} PACK_STRUCT_STRUCT;
-
-#define UDP_FLAGS_NOCHKSUM 0x01U
-#define UDP_FLAGS_UDPLITE 0x02U
-#define UDP_FLAGS_CONNECTED 0x04U
-
-struct udp_pcb {
-/* Common members of all PCB types */
- IP_PCB;
-
-/* Protocol specific PCB members */
-
- struct udp_pcb *next;
-
- u8_t flags;
- u16_t local_port, remote_port;
-
- u16_t chksum_len;
-
- void (* recv)(void *arg, struct udp_pcb *pcb, struct pbuf *p,
- struct ip_addr *addr, u16_t port);
- void *recv_arg;
-};
-/* udp_pcbs export for exernal reference (e.g. SNMP agent) */
-extern struct udp_pcb *udp_pcbs;
-
-/* The following functions is the application layer interface to the
- UDP code. */
-struct udp_pcb * udp_new (void);
-void udp_remove (struct udp_pcb *pcb);
-err_t udp_bind (struct udp_pcb *pcb, struct ip_addr *ipaddr,
- u16_t port);
-err_t udp_connect (struct udp_pcb *pcb, struct ip_addr *ipaddr,
- u16_t port);
-void udp_disconnect (struct udp_pcb *pcb);
-void udp_recv (struct udp_pcb *pcb,
- void (* recv)(void *arg, struct udp_pcb *upcb,
- struct pbuf *p,
- struct ip_addr *addr,
- u16_t port),
- void *recv_arg);
-err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p, struct ip_addr *dst_ip, u16_t dst_port);
-err_t udp_send (struct udp_pcb *pcb, struct pbuf *p);
-
-#define udp_flags(pcb) ((pcb)->flags)
-#define udp_setflags(pcb, f) ((pcb)->flags = (f))
-
-/* The following functions are the lower layer interface to UDP. */
-void udp_input (struct pbuf *p, struct netif *inp);
-void udp_init (void);
-
-#if UDP_DEBUG
-void udp_debug_print(struct udp_hdr *udphdr);
-#else
-#define udp_debug_print(udphdr)
-#endif
-#endif /* __LWIP_UDP_H__ */
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/include/netif/etharp.h b/src/VBox/Devices/Network/lwip/src/include/netif/etharp.h
deleted file mode 100644
index d64f55e..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/netif/etharp.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
- * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg at axon.tv>
- * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-#ifndef __NETIF_ETHARP_H__
-#define __NETIF_ETHARP_H__
-
-#ifndef ETH_PAD_SIZE
-#define ETH_PAD_SIZE 0
-#endif
-
-#include "lwip/pbuf.h"
-#include "lwip/ip_addr.h"
-#include "lwip/netif.h"
-#include "lwip/ip.h"
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct eth_addr {
- PACK_STRUCT_FIELD(u8_t addr[6]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct eth_hdr {
-#if ETH_PAD_SIZE
- PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]);
-#endif
- PACK_STRUCT_FIELD(struct eth_addr dest);
- PACK_STRUCT_FIELD(struct eth_addr src);
- PACK_STRUCT_FIELD(u16_t type);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-/** the ARP message */
-struct etharp_hdr {
- PACK_STRUCT_FIELD(struct eth_hdr ethhdr);
- PACK_STRUCT_FIELD(u16_t hwtype);
- PACK_STRUCT_FIELD(u16_t proto);
- PACK_STRUCT_FIELD(u16_t _hwlen_protolen);
- PACK_STRUCT_FIELD(u16_t opcode);
- PACK_STRUCT_FIELD(struct eth_addr shwaddr);
- PACK_STRUCT_FIELD(struct ip_addr2 sipaddr);
- PACK_STRUCT_FIELD(struct eth_addr dhwaddr);
- PACK_STRUCT_FIELD(struct ip_addr2 dipaddr);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
-struct ethip_hdr {
- PACK_STRUCT_FIELD(struct eth_hdr eth);
- PACK_STRUCT_FIELD(struct ip_hdr ip);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-# include "arch/epstruct.h"
-#endif
-
-/** 5 seconds period */
-#define ARP_TMR_INTERVAL 5000
-
-#define ETHTYPE_ARP 0x0806
-#define ETHTYPE_IP 0x0800
-
-
-void etharp_init(void);
-void etharp_tmr(void);
-s8_t etharp_find_addr(struct netif *netif, struct ip_addr *ipaddr,
- struct eth_addr **eth_ret, struct ip_addr **ip_ret);
-void etharp_ip_input(struct netif *netif, struct pbuf *p);
-void etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr,
- struct pbuf *p);
-err_t etharp_output(struct netif *netif, struct ip_addr *ipaddr,
- struct pbuf *q);
-err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q);
-err_t etharp_request(struct netif *netif, struct ip_addr *ipaddr);
-
-#endif /* __NETIF_ARP_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/netif/loopif.h b/src/VBox/Devices/Network/lwip/src/include/netif/loopif.h
deleted file mode 100644
index 97b3c67..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/netif/loopif.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __NETIF_LOOPIF_H__
-#define __NETIF_LOOPIF_H__
-
-#include "lwip/netif.h"
-
-err_t loopif_init(struct netif *netif);
-
-#endif /* __NETIF_LOOPIF_H__ */
diff --git a/src/VBox/Devices/Network/lwip/src/include/netif/slipif.h b/src/VBox/Devices/Network/lwip/src/include/netif/slipif.h
deleted file mode 100644
index bf70046..0000000
--- a/src/VBox/Devices/Network/lwip/src/include/netif/slipif.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (c) 2001, Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#ifndef __NETIF_SLIPIF_H__
-#define __NETIF_SLIPIF_H__
-
-#include "lwip/netif.h"
-
-err_t slipif_init(struct netif * netif);
-
-#endif
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/FILES b/src/VBox/Devices/Network/lwip/src/netif/FILES
deleted file mode 100644
index 825d407..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/FILES
+++ /dev/null
@@ -1,27 +0,0 @@
-This directory contains generic network interface device drivers that
-do not contain any hardware or architecture specific code. The files
-are:
-
-etharp.c
- Implements the ARP (Address Resolution Protocol) over
- Ethernet. The code in this file should be used together with
- Ethernet device drivers. Note that this module has been
- largely made Ethernet independent so you should be able to
- adapt this for other link layers (such as Firewire).
-
-ethernetif.c
- An example of how an Ethernet device driver could look. This
- file can be used as a "skeleton" for developing new Ethernet
- network device drivers. It uses the etharp.c ARP code.
-
-loopif.c
- An example network interface that shows how a "loopback"
- interface would work. This is not really intended for actual
- use, but as a very basic example of how initialization and
- output functions work.
-
-slipif.c
- A generic implementation of the SLIP (Serial Line IP)
- protocol. It requires a sio (serial I/O) module to work.
-
-ppp/ Point-to-Point Protocol stack
diff --git a/src/VBox/Devices/Network/lwip/src/netif/etharp.c b/src/VBox/Devices/Network/lwip/src/netif/etharp.c
deleted file mode 100644
index 9787f6d..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/etharp.c
+++ /dev/null
@@ -1,892 +0,0 @@
-/**
- * @file
- * Address Resolution Protocol module for IP over Ethernet
- *
- * Functionally, ARP is divided into two parts. The first maps an IP address
- * to a physical address when sending a packet, and the second part answers
- * requests from other machines for our physical address.
- *
- * This implementation complies with RFC 826 (Ethernet ARP). It supports
- * Gratuitious ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6
- * if an interface calls etharp_query(our_netif, its_ip_addr, NULL) upon
- * address change.
- */
-
-/*
- * Copyright (c) 2001-2003 Swedish Institute of Computer Science.
- * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg at axon.tv>
- * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- */
-#include <string.h>
-#include "lwip/opt.h"
-#include "lwip/inet.h"
-#include "netif/etharp.h"
-#include "lwip/ip.h"
-#include "lwip/stats.h"
-#include "lwip/snmp.h"
-
-/* ARP needs to inform DHCP of any ARP replies? */
-#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
-# include "lwip/dhcp.h"
-#endif
-
-/** the time an ARP entry stays valid after its last update,
- * (240 * 5) seconds = 20 minutes.
- */
-#define ARP_MAXAGE 240
-/** the time an ARP entry stays pending after first request,
- * (2 * 5) seconds = 10 seconds.
- *
- * @internal Keep this number at least 2, otherwise it might
- * run out instantly if the timeout occurs directly after a request.
- */
-#define ARP_MAXPENDING 2
-
-#define HWTYPE_ETHERNET 1
-
-/** ARP message types */
-#define ARP_REQUEST 1
-#define ARP_REPLY 2
-
-#define ARPH_HWLEN(hdr) (ntohs((hdr)->_hwlen_protolen) >> 8)
-#define ARPH_PROTOLEN(hdr) (ntohs((hdr)->_hwlen_protolen) & 0xff)
-
-#define ARPH_HWLEN_SET(hdr, len) (hdr)->_hwlen_protolen = htons(ARPH_PROTOLEN(hdr) | ((len) << 8))
-#define ARPH_PROTOLEN_SET(hdr, len) (hdr)->_hwlen_protolen = htons((len) | (ARPH_HWLEN(hdr) << 8))
-
-enum etharp_state {
- ETHARP_STATE_EMPTY,
- ETHARP_STATE_PENDING,
- ETHARP_STATE_STABLE,
- /** @internal transitional state used in etharp_tmr() for convenience*/
- ETHARP_STATE_EXPIRED
-};
-
-struct etharp_entry {
-#if ARP_QUEUEING
- /**
- * Pointer to queue of pending outgoing packets on this ARP entry.
- */
- struct pbuf *p;
-#endif
- struct ip_addr ipaddr;
- struct eth_addr ethaddr;
- enum etharp_state state;
- u8_t ctime;
- struct netif *netif;
-};
-
-static const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
-static struct etharp_entry arp_table[ARP_TABLE_SIZE];
-
-/**
- * Try hard to create a new entry - we want the IP address to appear in
- * the cache (even if this means removing an active entry or so). */
-#define ETHARP_TRY_HARD 1
-
-static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags);
-static err_t update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags);
-/**
- * Initializes ARP module.
- */
-void
-etharp_init(void)
-{
- u8_t i;
- /* clear ARP entries */
- for(i = 0; i < ARP_TABLE_SIZE; ++i) {
- arp_table[i].state = ETHARP_STATE_EMPTY;
-#if ARP_QUEUEING
- arp_table[i].p = NULL;
-#endif
- arp_table[i].ctime = 0;
- arp_table[i].netif = NULL;
- }
-}
-
-/**
- * Clears expired entries in the ARP table.
- *
- * This function should be called every ETHARP_TMR_INTERVAL microseconds (5 seconds),
- * in order to expire entries in the ARP table.
- */
-void
-etharp_tmr(void)
-{
- u8_t i;
-
- LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n"));
- /* remove expired entries from the ARP table */
- for (i = 0; i < ARP_TABLE_SIZE; ++i) {
- arp_table[i].ctime++;
- /* stable entry? */
- if ((arp_table[i].state == ETHARP_STATE_STABLE) &&
- /* entry has become old? */
- (arp_table[i].ctime >= ARP_MAXAGE)) {
- LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired stable entry %"U16_F".\n", (u16_t)i));
- arp_table[i].state = ETHARP_STATE_EXPIRED;
- /* pending entry? */
- } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
- /* entry unresolved/pending for too long? */
- if (arp_table[i].ctime >= ARP_MAXPENDING) {
- LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired pending entry %"U16_F".\n", (u16_t)i));
- arp_table[i].state = ETHARP_STATE_EXPIRED;
-#if ARP_QUEUEING
- } else if (arp_table[i].p != NULL) {
- /* resend an ARP query here */
-#endif
- }
- }
- /* clean up entries that have just been expired */
- if (arp_table[i].state == ETHARP_STATE_EXPIRED) {
- /* remove from SNMP ARP index tree */
- snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr);
-#if ARP_QUEUEING
- /* and empty packet queue */
- if (arp_table[i].p != NULL) {
- /* remove all queued packets */
- LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].p)));
- pbuf_free(arp_table[i].p);
- arp_table[i].p = NULL;
- }
-#endif
- /* recycle entry for re-use */
- arp_table[i].state = ETHARP_STATE_EMPTY;
- }
- }
-}
-
-/**
- * Search the ARP table for a matching or new entry.
- *
- * If an IP address is given, return a pending or stable ARP entry that matches
- * the address. If no match is found, create a new entry with this address set,
- * but in state ETHARP_EMPTY. The caller must check and possibly change the
- * state of the returned entry.
- *
- * If ipaddr is NULL, return a initialized new entry in state ETHARP_EMPTY.
- *
- * In all cases, attempt to create new entries from an empty entry. If no
- * empty entries are available and ETHARP_TRY_HARD flag is set, recycle
- * old entries. Heuristic choose the least important entry for recycling.
- *
- * @param ipaddr IP address to find in ARP cache, or to add if not found.
- * @param flags
- * - ETHARP_TRY_HARD: Try hard to create a entry by allowing recycling of
- * active (stable or pending) entries.
- *
- * @return The ARP entry index that matched or is created, ERR_MEM if no
- * entry is found or could be recycled.
- */
-static s8_t find_entry(struct ip_addr *ipaddr, u8_t flags)
-{
- s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;
- s8_t empty = ARP_TABLE_SIZE;
- u8_t i = 0, age_pending = 0, age_stable = 0;
-#if ARP_QUEUEING
- /* oldest entry with packets on queue */
- s8_t old_queue = ARP_TABLE_SIZE;
- /* its age */
- u8_t age_queue = 0;
-#endif
-
- /**
- * a) do a search through the cache, remember candidates
- * b) select candidate entry
- * c) create new entry
- */
-
- /* a) in a single search sweep, do all of this
- * 1) remember the first empty entry (if any)
- * 2) remember the oldest stable entry (if any)
- * 3) remember the oldest pending entry without queued packets (if any)
- * 4) remember the oldest pending entry with queued packets (if any)
- * 5) search for a matching IP entry, either pending or stable
- * until 5 matches, or all entries are searched for.
- */
-
- for (i = 0; i < ARP_TABLE_SIZE; ++i) {
- /* no empty entry found yet and now we do find one? */
- if ((empty == ARP_TABLE_SIZE) && (arp_table[i].state == ETHARP_STATE_EMPTY)) {
- LWIP_DEBUGF(ETHARP_DEBUG, ("find_entry: found empty entry %"U16_F"\n", (u16_t)i));
- /* remember first empty entry */
- empty = i;
- }
- /* pending entry? */
- else if (arp_table[i].state == ETHARP_STATE_PENDING) {
- /* if given, does IP address match IP address in ARP entry? */
- if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) {
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("find_entry: found matching pending entry %"U16_F"\n", (u16_t)i));
- /* found exact IP address match, simply bail out */
- return i;
-#if ARP_QUEUEING
- /* pending with queued packets? */
- } else if (arp_table[i].p != NULL) {
- if (arp_table[i].ctime >= age_queue) {
- old_queue = i;
- age_queue = arp_table[i].ctime;
- }
-#endif
- /* pending without queued packets? */
- } else {
- if (arp_table[i].ctime >= age_pending) {
- old_pending = i;
- age_pending = arp_table[i].ctime;
- }
- }
- }
- /* stable entry? */
- else if (arp_table[i].state == ETHARP_STATE_STABLE) {
- /* if given, does IP address match IP address in ARP entry? */
- if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) {
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("find_entry: found matching stable entry %"U16_F"\n", (u16_t)i));
- /* found exact IP address match, simply bail out */
- return i;
- /* remember entry with oldest stable entry in oldest, its age in maxtime */
- } else if (arp_table[i].ctime >= age_stable) {
- old_stable = i;
- age_stable = arp_table[i].ctime;
- }
- }
- }
- /* { we have no match } => try to create a new entry */
-
- /* no empty entry found and not allowed to recycle? */
- if ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_TRY_HARD) == 0))
- {
- return (s8_t)ERR_MEM;
- }
-
- /* b) choose the least destructive entry to recycle:
- * 1) empty entry
- * 2) oldest stable entry
- * 3) oldest pending entry without queued packets
- * 4) oldest pending entry without queued packets
- *
- * { ETHARP_TRY_HARD is set at this point }
- */
-
- /* 1) empty entry available? */
- if (empty < ARP_TABLE_SIZE) {
- i = empty;
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("find_entry: selecting empty entry %"U16_F"\n", (u16_t)i));
- }
- /* 2) found recyclable stable entry? */
- else if (old_stable < ARP_TABLE_SIZE) {
- /* recycle oldest stable*/
- i = old_stable;
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i));
-#if ARP_QUEUEING
- /* no queued packets should exist on stable entries */
- LWIP_ASSERT("arp_table[i].p == NULL", arp_table[i].p == NULL);
-#endif
- /* 3) found recyclable pending entry without queued packets? */
- } else if (old_pending < ARP_TABLE_SIZE) {
- /* recycle oldest pending */
- i = old_pending;
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i));
-#if ARP_QUEUEING
- /* 4) found recyclable pending entry with queued packets? */
- } else if (old_queue < ARP_TABLE_SIZE) {
- /* recycle oldest pending */
- i = old_queue;
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("find_entry: selecting oldest pending entry %"U16_F", freeing packet queue %p\n", (u16_t)i, (void *)(arp_table[i].p)));
- pbuf_free(arp_table[i].p);
- arp_table[i].p = NULL;
-#endif
- /* no empty or recyclable entries found */
- } else {
- return (s8_t)ERR_MEM;
- }
-
- /* { empty or recyclable entry found } */
- LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE);
-
- if (arp_table[i].state != ETHARP_STATE_EMPTY)
- {
- snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr);
- }
- /* recycle entry (no-op for an already empty entry) */
- arp_table[i].state = ETHARP_STATE_EMPTY;
-
- /* IP address given? */
- if (ipaddr != NULL) {
- /* set IP address */
- ip_addr_set(&arp_table[i].ipaddr, ipaddr);
- }
- arp_table[i].ctime = 0;
- return (err_t)i;
-}
-
-/**
- * Update (or insert) a IP/MAC address pair in the ARP cache.
- *
- * If a pending entry is resolved, any queued packets will be sent
- * at this point.
- *
- * @param ipaddr IP address of the inserted ARP entry.
- * @param ethaddr Ethernet address of the inserted ARP entry.
- * @param flags Defines behaviour:
- * - ETHARP_TRY_HARD Allows ARP to insert this as a new item. If not specified,
- * only existing ARP entries will be updated.
- *
- * @return
- * - ERR_OK Succesfully updated ARP cache.
- * - ERR_MEM If we could not add a new ARP entry when ETHARP_TRY_HARD was set.
- * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
- *
- * @see pbuf_free()
- */
-static err_t
-update_arp_entry(struct netif *netif, struct ip_addr *ipaddr, struct eth_addr *ethaddr, u8_t flags)
-{
- s8_t i;
- u8_t k;
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE | 3, ("update_arp_entry()\n"));
- LWIP_ASSERT("netif->hwaddr_len != 0", netif->hwaddr_len != 0);
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("update_arp_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n",
- ip4_addr1(ipaddr), ip4_addr2(ipaddr), ip4_addr3(ipaddr), ip4_addr4(ipaddr),
- ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2],
- ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5]));
- /* non-unicast address? */
- if (ip_addr_isany(ipaddr) ||
- ip_addr_isbroadcast(ipaddr, netif) ||
- ip_addr_ismulticast(ipaddr)) {
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("update_arp_entry: will not add non-unicast IP address to ARP cache\n"));
- return ERR_ARG;
- }
- /* find or create ARP entry */
- i = find_entry(ipaddr, flags);
- /* bail out if no entry could be found */
- if (i < 0) return (err_t)i;
-
- /* mark it stable */
- arp_table[i].state = ETHARP_STATE_STABLE;
- /* record network interface */
- arp_table[i].netif = netif;
-
- /* insert in SNMP ARP index tree */
- snmp_insert_arpidx_tree(netif, &arp_table[i].ipaddr);
-
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i));
- /* update address */
- k = netif->hwaddr_len;
- while (k > 0) {
- k--;
- arp_table[i].ethaddr.addr[k] = ethaddr->addr[k];
- }
- /* reset time stamp */
- arp_table[i].ctime = 0;
-/* this is where we will send out queued packets! */
-#if ARP_QUEUEING
- while (arp_table[i].p != NULL) {
- /* get the first packet on the queue */
- struct pbuf *p = arp_table[i].p;
- /* Ethernet header */
- struct eth_hdr *ethhdr = p->payload;
- /* remember (and reference) remainder of queue */
- /* note: this will also terminate the p pbuf chain */
- arp_table[i].p = pbuf_dequeue(p);
- /* fill-in Ethernet header */
- k = netif->hwaddr_len;
- while(k > 0) {
- k--;
- ethhdr->dest.addr[k] = ethaddr->addr[k];
- ethhdr->src.addr[k] = netif->hwaddr[k];
- }
- ethhdr->type = htons(ETHTYPE_IP);
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("update_arp_entry: sending queued IP packet %p.\n", (void *)p));
- /* send the queued IP packet */
- netif->linkoutput(netif, p);
- /* free the queued IP packet */
- pbuf_free(p);
- }
-#endif
- return ERR_OK;
-}
-
-/**
- * Finds (stable) ethernet/IP address pair from ARP table
- * using interface and IP address index.
- * @note the addresses in the ARP table are in network order!
- *
- * @param netif points to interface index
- * @param ipaddr points to the (network order) IP address index
- * @param eth_ret points to return pointer
- * @param ip_ret points to return pointer
- * @return table index if found, -1 otherwise
- */
-s8_t
-etharp_find_addr(struct netif *netif, struct ip_addr *ipaddr,
- struct eth_addr **eth_ret, struct ip_addr **ip_ret)
-{
- s8_t i;
-
- i = 0;
- while (i < ARP_TABLE_SIZE)
- {
- if ((arp_table[i].state == ETHARP_STATE_STABLE) &&
- (arp_table[i].netif == netif) &&
- ip_addr_cmp(ipaddr, &arp_table[i].ipaddr) )
- {
- *eth_ret = &arp_table[i].ethaddr;
- *ip_ret = &arp_table[i].ipaddr;
- return i;
- }
- i++;
- }
- return -1;
-}
-
-/**
- * Updates the ARP table using the given IP packet.
- *
- * Uses the incoming IP packet's source address to update the
- * ARP cache for the local network. The function does not alter
- * or free the packet. This function must be called before the
- * packet p is passed to the IP layer.
- *
- * @param netif The lwIP network interface on which the IP packet pbuf arrived.
- * @param pbuf The IP packet that arrived on netif.
- *
- * @return NULL
- *
- * @see pbuf_free()
- */
-void
-etharp_ip_input(struct netif *netif, struct pbuf *p)
-{
- struct ethip_hdr *hdr;
- LWIP_ASSERT("netif != NULL", netif != NULL);
- /* Only insert an entry if the source IP address of the
- incoming IP packet comes from a host on the local network. */
- hdr = p->payload;
- /* source is not on the local network? */
- if (!ip_addr_netcmp(&(hdr->ip.src), &(netif->ip_addr), &(netif->netmask))) {
- /* do nothing */
- return;
- }
-
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_ip_input: updating ETHARP table.\n"));
- /* update ARP table */
- /* @todo We could use ETHARP_TRY_HARD if we think we are going to talk
- * back soon (for example, if the destination IP address is ours. */
- update_arp_entry(netif, &(hdr->ip.src), &(hdr->eth.src), 0);
-}
-
-
-/**
- * Responds to ARP requests to us. Upon ARP replies to us, add entry to cache
- * send out queued IP packets. Updates cache with snooped address pairs.
- *
- * Should be called for incoming ARP packets. The pbuf in the argument
- * is freed by this function.
- *
- * @param netif The lwIP network interface on which the ARP packet pbuf arrived.
- * @param pbuf The ARP packet that arrived on netif. Is freed by this function.
- * @param ethaddr Ethernet address of netif.
- *
- * @return NULL
- *
- * @see pbuf_free()
- */
-void
-etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p)
-{
- struct etharp_hdr *hdr;
- /* these are aligned properly, whereas the ARP header fields might not be */
- struct ip_addr sipaddr, dipaddr;
- u8_t i;
- u8_t for_us;
-
- LWIP_ASSERT("netif != NULL", netif != NULL);
-
- /* drop short ARP packets */
- if (p->tot_len < sizeof(struct etharp_hdr)) {
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE | 1, ("etharp_arp_input: packet dropped, too short (%"S16_F"/%"S16_F")\n", p->tot_len, (s16_t)sizeof(struct etharp_hdr)));
- pbuf_free(p);
- return;
- }
-
- hdr = p->payload;
-
- /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without
- * structure packing (not using structure copy which breaks strict-aliasing rules). */
- memcpy(&sipaddr, &hdr->sipaddr, sizeof(sipaddr));
- memcpy(&dipaddr, &hdr->dipaddr, sizeof(dipaddr));
-
- /* this interface is not configured? */
- if (netif->ip_addr.addr == 0) {
- for_us = 0;
- } else {
- /* ARP packet directed to us? */
- for_us = ip_addr_cmp(&dipaddr, &(netif->ip_addr));
- }
-
- /* ARP message directed to us? */
- if (for_us) {
- /* add IP address in ARP cache; assume requester wants to talk to us.
- * can result in directly sending the queued packets for this host. */
- update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), ETHARP_TRY_HARD);
- /* ARP message not directed to us? */
- } else {
- /* update the source IP address in the cache, if present */
- update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), 0);
- }
-
- /* now act on the message itself */
- switch (htons(hdr->opcode)) {
- /* ARP request? */
- case ARP_REQUEST:
- /* ARP request. If it asked for our address, we send out a
- * reply. In any case, we time-stamp any existing ARP entry,
- * and possiby send out an IP packet that was queued on it. */
-
- LWIP_DEBUGF (ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: incoming ARP request\n"));
- /* ARP request for our address? */
- if (for_us) {
-
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: replying to ARP request for our IP address\n"));
- /* re-use pbuf to send ARP reply */
- hdr->opcode = htons(ARP_REPLY);
-
- hdr->dipaddr = hdr->sipaddr;
- hdr->sipaddr = *(struct ip_addr2 *)&netif->ip_addr;
-
- i = netif->hwaddr_len;
- while(i > 0) {
- i--;
- hdr->dhwaddr.addr[i] = hdr->shwaddr.addr[i];
- hdr->shwaddr.addr[i] = ethaddr->addr[i];
- hdr->ethhdr.dest.addr[i] = hdr->dhwaddr.addr[i];
- hdr->ethhdr.src.addr[i] = ethaddr->addr[i];
- }
-
- hdr->hwtype = htons(HWTYPE_ETHERNET);
- ARPH_HWLEN_SET(hdr, netif->hwaddr_len);
-
- hdr->proto = htons(ETHTYPE_IP);
- ARPH_PROTOLEN_SET(hdr, sizeof(struct ip_addr));
-
- hdr->ethhdr.type = htons(ETHTYPE_ARP);
- /* return ARP reply */
- netif->linkoutput(netif, p);
- /* we are not configured? */
- } else if (netif->ip_addr.addr == 0) {
- /* { for_us == 0 and netif->ip_addr.addr == 0 } */
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: we are unconfigured, ARP request ignored.\n"));
- /* request was not directed to us */
- } else {
- /* { for_us == 0 and netif->ip_addr.addr != 0 } */
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: ARP request was not for us.\n"));
- }
- break;
- case ARP_REPLY:
- /* ARP reply. We already updated the ARP cache earlier. */
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: incoming ARP reply\n"));
-#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)
- /* DHCP wants to know about ARP replies from any host with an
- * IP address also offered to us by the DHCP server. We do not
- * want to take a duplicate IP address on a single network.
- * @todo How should we handle redundant (fail-over) interfaces?
- * */
- dhcp_arp_reply(netif, &sipaddr);
-#endif
- break;
- default:
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_arp_input: ARP unknown opcode type %"S16_F"\n", htons(hdr->opcode)));
- break;
- }
- /* free ARP packet */
- pbuf_free(p);
-}
-
-/**
- * Resolve and fill-in Ethernet address header for outgoing packet.
- *
- * For IP multicast and broadcast, corresponding Ethernet addresses
- * are selected and the packet is transmitted on the link.
- *
- * For unicast addresses, the packet is submitted to etharp_query(). In
- * case the IP address is outside the local network, the IP address of
- * the gateway is used.
- *
- * @param netif The lwIP network interface which the IP packet will be sent on.
- * @param ipaddr The IP address of the packet destination.
- * @param pbuf The pbuf(s) containing the IP packet to be sent.
- *
- * @return
- * - ERR_RTE No route to destination (no gateway to external networks),
- * or the return type of either etharp_query() or netif->linkoutput().
- */
-err_t
-etharp_output(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q)
-{
- struct eth_addr *dest, *srcaddr, mcastaddr;
- struct eth_hdr *ethhdr;
- u8_t i;
-
- /* make room for Ethernet header - should not fail */
- if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) {
- /* bail out */
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE | 2, ("etharp_output: could not allocate room for header.\n"));
- LINK_STATS_INC(link.lenerr);
- return ERR_BUF;
- }
-
- /* assume unresolved Ethernet address */
- dest = NULL;
- /* Determine on destination hardware address. Broadcasts and multicasts
- * are special, other IP addresses are looked up in the ARP table. */
-
- /* broadcast destination IP address? */
- if (ip_addr_isbroadcast(ipaddr, netif)) {
- /* broadcast on Ethernet also */
- dest = (struct eth_addr *)ðbroadcast;
- /* multicast destination IP address? */
- } else if (ip_addr_ismulticast(ipaddr)) {
- /* Hash IP multicast address to MAC address.*/
- mcastaddr.addr[0] = 0x01;
- mcastaddr.addr[1] = 0x00;
- mcastaddr.addr[2] = 0x5e;
- mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;
- mcastaddr.addr[4] = ip4_addr3(ipaddr);
- mcastaddr.addr[5] = ip4_addr4(ipaddr);
- /* destination Ethernet address is multicast */
- dest = &mcastaddr;
- /* unicast destination IP address? */
- } else {
- /* outside local network? */
- if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask))) {
- /* interface has default gateway? */
- if (netif->gw.addr != 0) {
- /* send to hardware address of default gateway IP address */
- ipaddr = &(netif->gw);
- /* no default gateway available */
- } else {
- /* no route to destination error (default gateway missing) */
- return ERR_RTE;
- }
- }
- /* queue on destination Ethernet address belonging to ipaddr */
- return etharp_query(netif, ipaddr, q);
- }
-
- /* continuation for multicast/broadcast destinations */
- /* obtain source Ethernet address of the given interface */
- srcaddr = (struct eth_addr *)netif->hwaddr;
- ethhdr = q->payload;
- i = netif->hwaddr_len;
- while(i > 0) {
- i--;
- ethhdr->dest.addr[i] = dest->addr[i];
- ethhdr->src.addr[i] = srcaddr->addr[i];
- }
- ethhdr->type = htons(ETHTYPE_IP);
- /* send packet directly on the link */
- return netif->linkoutput(netif, q);
-}
-
-/**
- * Send an ARP request for the given IP address and/or queue a packet.
- *
- * If the IP address was not yet in the cache, a pending ARP cache entry
- * is added and an ARP request is sent for the given address. The packet
- * is queued on this entry.
- *
- * If the IP address was already pending in the cache, a new ARP request
- * is sent for the given address. The packet is queued on this entry.
- *
- * If the IP address was already stable in the cache, and a packet is
- * given, it is directly sent and no ARP request is sent out.
- *
- * If the IP address was already stable in the cache, and no packet is
- * given, an ARP request is sent out.
- *
- * @param netif The lwIP network interface on which ipaddr
- * must be queried for.
- * @param ipaddr The IP address to be resolved.
- * @param q If non-NULL, a pbuf that must be delivered to the IP address.
- * q is not freed by this function.
- *
- * @return
- * - ERR_BUF Could not make room for Ethernet header.
- * - ERR_MEM Hardware address unknown, and no more ARP entries available
- * to query for address or queue the packet.
- * - ERR_MEM Could not queue packet due to memory shortage.
- * - ERR_RTE No route to destination (no gateway to external networks).
- * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.
- *
- */
-err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q)
-{
- struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
- err_t result = ERR_MEM;
- s8_t i; /* ARP entry index */
- u8_t k; /* Ethernet address octet index */
-
- /* non-unicast address? */
- if (ip_addr_isbroadcast(ipaddr, netif) ||
- ip_addr_ismulticast(ipaddr) ||
- ip_addr_isany(ipaddr)) {
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n"));
- return ERR_ARG;
- }
-
- /* find entry in ARP cache, ask to create entry if queueing packet */
- i = find_entry(ipaddr, ETHARP_TRY_HARD);
-
- /* could not find or create entry? */
- if (i < 0)
- {
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_query: could not create ARP entry\n"));
- if (q) LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_query: packet dropped\n"));
- return (err_t)i;
- }
-
- /* mark a fresh entry as pending (we just sent a request) */
- if (arp_table[i].state == ETHARP_STATE_EMPTY) {
- arp_table[i].state = ETHARP_STATE_PENDING;
- }
-
- /* { i is either a STABLE or (new or existing) PENDING entry } */
- LWIP_ASSERT("arp_table[i].state == PENDING or STABLE",
- ((arp_table[i].state == ETHARP_STATE_PENDING) ||
- (arp_table[i].state == ETHARP_STATE_STABLE)));
-
- /* do we have a pending entry? or an implicit query request? */
- if ((arp_table[i].state == ETHARP_STATE_PENDING) || (q == NULL)) {
- /* try to resolve it; send out ARP request */
- result = etharp_request(netif, ipaddr);
- }
-
- /* packet given? */
- if (q != NULL) {
- /* stable entry? */
- if (arp_table[i].state == ETHARP_STATE_STABLE) {
- /* we have a valid IP->Ethernet address mapping,
- * fill in the Ethernet header for the outgoing packet */
- struct eth_hdr *ethhdr = q->payload;
- k = netif->hwaddr_len;
- while(k > 0) {
- k--;
- ethhdr->dest.addr[k] = arp_table[i].ethaddr.addr[k];
- ethhdr->src.addr[k] = srcaddr->addr[k];
- }
- ethhdr->type = htons(ETHTYPE_IP);
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_query: sending packet %p\n", (void *)q));
- /* send the packet */
- result = netif->linkoutput(netif, q);
- /* pending entry? (either just created or already pending */
- } else if (arp_table[i].state == ETHARP_STATE_PENDING) {
-#if ARP_QUEUEING /* queue the given q packet */
- struct pbuf *p;
- /* copy any PBUF_REF referenced payloads into PBUF_RAM */
- /* (the caller of lwIP assumes the referenced payload can be
- * freed after it returns from the lwIP call that brought us here) */
- p = pbuf_take(q);
- /* packet could be taken over? */
- if (p != NULL) {
- /* queue packet ... */
- if (arp_table[i].p == NULL) {
- /* ... in the empty queue */
- pbuf_ref(p);
- arp_table[i].p = p;
-#if 0 /* multi-packet-queueing disabled, see bug #11400 */
- } else {
- /* ... at tail of non-empty queue */
- pbuf_queue(arp_table[i].p, p);
-#endif
- }
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i));
- result = ERR_OK;
- } else {
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q));
- /* { result == ERR_MEM } through initialization */
- }
-#else /* ARP_QUEUEING == 0 */
- /* q && state == PENDING && ARP_QUEUEING == 0 => result = ERR_MEM */
- /* { result == ERR_MEM } through initialization */
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_query: Ethernet destination address unknown, queueing disabled, packet %p dropped\n", (void *)q));
-#endif
- }
- }
- return result;
-}
-
-err_t etharp_request(struct netif *netif, struct ip_addr *ipaddr)
-{
- struct pbuf *p;
- struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;
- err_t result = ERR_OK;
- u8_t k; /* ARP entry index */
-
- /* allocate a pbuf for the outgoing ARP request packet */
- p = pbuf_alloc(PBUF_LINK, sizeof(struct etharp_hdr), PBUF_RAM);
- /* could allocate a pbuf for an ARP request? */
- if (p != NULL) {
- struct etharp_hdr *hdr = p->payload;
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE, ("etharp_request: sending ARP request.\n"));
- hdr->opcode = htons(ARP_REQUEST);
- k = netif->hwaddr_len;
- while(k > 0) {
- k--;
- hdr->shwaddr.addr[k] = srcaddr->addr[k];
- /* the hardware address is what we ask for, in
- * a request it is a don't-care value, we use zeroes */
- hdr->dhwaddr.addr[k] = 0x00;
- }
- hdr->dipaddr = *(struct ip_addr2 *)ipaddr;
- hdr->sipaddr = *(struct ip_addr2 *)&netif->ip_addr;
-
- hdr->hwtype = htons(HWTYPE_ETHERNET);
- ARPH_HWLEN_SET(hdr, netif->hwaddr_len);
-
- hdr->proto = htons(ETHTYPE_IP);
- ARPH_PROTOLEN_SET(hdr, sizeof(struct ip_addr));
- k = netif->hwaddr_len;
- while(k > 0) {
- k--;
- /* broadcast to all network interfaces on the local network */
- hdr->ethhdr.dest.addr[k] = 0xff;
- hdr->ethhdr.src.addr[k] = srcaddr->addr[k];
- }
- hdr->ethhdr.type = htons(ETHTYPE_ARP);
- /* send ARP query */
- result = netif->linkoutput(netif, p);
- /* free ARP query packet */
- pbuf_free(p);
- p = NULL;
- /* could not allocate pbuf for ARP request */
- } else {
- result = ERR_MEM;
- LWIP_DEBUGF(ETHARP_DEBUG | DBG_TRACE | 2, ("etharp_request: could not allocate pbuf for ARP request.\n"));
- }
- return result;
-}
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ethernetif.c b/src/VBox/Devices/Network/lwip/src/netif/ethernetif.c
deleted file mode 100644
index 87d5917..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ethernetif.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-
-/*
- * This file is a skeleton for developing Ethernet network interface
- * drivers for lwIP. Add code to the low_level functions and do a
- * search-and-replace for the word "ethernetif" to replace it with
- * something that better describes your network interface.
- */
-
-#include "lwip/opt.h"
-#include "lwip/def.h"
-#include "lwip/mem.h"
-#include "lwip/pbuf.h"
-#include "lwip/sys.h"
-#include <lwip/stats.h>
-
-#include "netif/etharp.h"
-
-/* Define those to better describe your network interface. */
-#define IFNAME0 'e'
-#define IFNAME1 'n'
-
-struct ethernetif {
- struct eth_addr *ethaddr;
- /* Add whatever per-interface state that is needed here. */
-};
-
-static const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
-
-/* Forward declarations. */
-static void ethernetif_input(struct netif *netif);
-static err_t ethernetif_output(struct netif *netif, struct pbuf *p,
- struct ip_addr *ipaddr);
-
-static void
-low_level_init(struct netif *netif)
-{
- struct ethernetif *ethernetif = netif->state;
-
- /* set MAC hardware address length */
- netif->hwaddr_len = 6;
-
- /* set MAC hardware address */
- netif->hwaddr[0] = ;
- ...
- netif->hwaddr[5] = ;
-
- /* maximum transfer unit */
- netif->mtu = 1500;
-
- /* broadcast capability */
- netif->flags = NETIF_FLAG_BROADCAST;
-
- /* Do whatever else is needed to initialize interface. */
-}
-
-/*
- * low_level_output():
- *
- * Should do the actual transmission of the packet. The packet is
- * contained in the pbuf that is passed to the function. This pbuf
- * might be chained.
- *
- */
-
-static err_t
-low_level_output(struct netif *netif, struct pbuf *p)
-{
- struct ethernetif *ethernetif = netif->state;
- struct pbuf *q;
-
- initiate transfer();
-
-#if ETH_PAD_SIZE
- pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
-#endif
-
- for(q = p; q != NULL; q = q->next) {
- /* Send the data from the pbuf to the interface, one pbuf at a
- time. The size of the data in each pbuf is kept in the ->len
- variable. */
- send data from(q->payload, q->len);
- }
-
- signal that packet should be sent();
-
-#if ETH_PAD_SIZE
- pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
-#endif
-
-#if LINK_STATS
- lwip_stats.link.xmit++;
-#endif /* LINK_STATS */
-
- return ERR_OK;
-}
-
-/*
- * low_level_input():
- *
- * Should allocate a pbuf and transfer the bytes of the incoming
- * packet from the interface into the pbuf.
- *
- */
-
-static struct pbuf *
-low_level_input(struct netif *netif)
-{
- struct ethernetif *ethernetif = netif->state;
- struct pbuf *p, *q;
- u16_t len;
-
- /* Obtain the size of the packet and put it into the "len"
- variable. */
- len = ;
-
-#if ETH_PAD_SIZE
- len += ETH_PAD_SIZE; /* allow room for Ethernet padding */
-#endif
-
- /* We allocate a pbuf chain of pbufs from the pool. */
- p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
-
- if (p != NULL) {
-
-#if ETH_PAD_SIZE
- pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */
-#endif
-
- /* We iterate over the pbuf chain until we have read the entire
- * packet into the pbuf. */
- for(q = p; q != NULL; q = q->next) {
- /* Read enough bytes to fill this pbuf in the chain. The
- * available data in the pbuf is given by the q->len
- * variable. */
- read data into(q->payload, q->len);
- }
- acknowledge that packet has been read();
-
-#if ETH_PAD_SIZE
- pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */
-#endif
-
-#if LINK_STATS
- lwip_stats.link.recv++;
-#endif /* LINK_STATS */
- } else {
- drop packet();
-#if LINK_STATS
- lwip_stats.link.memerr++;
- lwip_stats.link.drop++;
-#endif /* LINK_STATS */
- }
-
- return p;
-}
-
-/*
- * ethernetif_output():
- *
- * This function is called by the TCP/IP stack when an IP packet
- * should be sent. It calls the function called low_level_output() to
- * do the actual transmission of the packet.
- *
- */
-
-static err_t
-ethernetif_output(struct netif *netif, struct pbuf *p,
- struct ip_addr *ipaddr)
-{
-
- /* resolve hardware address, then send (or queue) packet */
- return etharp_output(netif, ipaddr, p);
-
-}
-
-/*
- * ethernetif_input():
- *
- * This function should be called when a packet is ready to be read
- * from the interface. It uses the function low_level_input() that
- * should handle the actual reception of bytes from the network
- * interface.
- *
- */
-
-static void
-ethernetif_input(struct netif *netif)
-{
- struct ethernetif *ethernetif;
- struct eth_hdr *ethhdr;
- struct pbuf *p;
-
- ethernetif = netif->state;
-
- /* move received packet into a new pbuf */
- p = low_level_input(netif);
- /* no packet could be read, silently ignore this */
- if (p == NULL) return;
- /* points to packet payload, which starts with an Ethernet header */
- ethhdr = p->payload;
-
-#if LINK_STATS
- lwip_stats.link.recv++;
-#endif /* LINK_STATS */
-
- ethhdr = p->payload;
-
- switch (htons(ethhdr->type)) {
- /* IP packet? */
- case ETHTYPE_IP:
-#if 0
-/* CSi disabled ARP table update on ingress IP packets.
- This seems to work but needs thorough testing. */
- /* update ARP table */
- etharp_ip_input(netif, p);
-#endif
- /* skip Ethernet header */
- pbuf_header(p, -sizeof(struct eth_hdr));
- /* pass to network layer */
- netif->input(p, netif);
- break;
-
- case ETHTYPE_ARP:
- /* pass p to ARP module */
- etharp_arp_input(netif, ethernetif->ethaddr, p);
- break;
- default:
- pbuf_free(p);
- p = NULL;
- break;
- }
-}
-
-static void
-arp_timer(void *arg)
-{
- etharp_tmr();
- sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
-}
-
-/*
- * ethernetif_init():
- *
- * Should be called at the beginning of the program to set up the
- * network interface. It calls the function low_level_init() to do the
- * actual setup of the hardware.
- *
- */
-
-err_t
-ethernetif_init(struct netif *netif)
-{
- struct ethernetif *ethernetif;
-
- ethernetif = mem_malloc(sizeof(struct ethernetif));
-
- if (ethernetif == NULL)
- {
- LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory\n"));
- return ERR_MEM;
- }
-
-#if LWIP_SNMP
- /* ifType ethernetCsmacd(6) @see RFC1213 */
- netif->link_type = 6;
- /* your link speed here */
- netif->link_speed = ;
- netif->ts = 0;
- netif->ifinoctets = 0;
- netif->ifinucastpkts = 0;
- netif->ifinnucastpkts = 0;
- netif->ifindiscards = 0;
- netif->ifoutoctets = 0;
- netif->ifoutucastpkts = 0;
- netif->ifoutnucastpkts = 0;
- netif->ifoutdiscards = 0;
-#endif
-
- netif->state = ethernetif;
- netif->name[0] = IFNAME0;
- netif->name[1] = IFNAME1;
- netif->output = ethernetif_output;
- netif->linkoutput = low_level_output;
-
- ethernetif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);
-
- low_level_init(netif);
-
- etharp_init();
-
- sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);
-
- return ERR_OK;
-}
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/loopif.c b/src/VBox/Devices/Network/lwip/src/netif/loopif.c
deleted file mode 100644
index 0464cb8..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/loopif.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
- * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
- * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
- * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * This file is part of the lwIP TCP/IP stack.
- *
- * Author: Adam Dunkels <adam at sics.se>
- *
- */
-#include "lwip/opt.h"
-
-#if LWIP_HAVE_LOOPIF
-
-#include "netif/loopif.h"
-#include "lwip/mem.h"
-
-#if defined(LWIP_DEBUG) && defined(LWIP_TCPDUMP)
-#include "netif/tcpdump.h"
-#endif /* LWIP_DEBUG && LWIP_TCPDUMP */
-
-#include "lwip/tcp.h"
-#include "lwip/ip.h"
-
-static void
-loopif_input( void * arg )
-{
- struct netif *netif = (struct netif *)( ((void **)arg)[ 0 ] );
- struct pbuf *r = (struct pbuf *)( ((void **)arg)[ 1 ] );
-
- mem_free( arg );
- netif -> input( r, netif );
-}
-
-static err_t
-loopif_output(struct netif *netif, struct pbuf *p,
- struct ip_addr *ipaddr)
-{
- struct pbuf *q, *r;
- u8_t *ptr;
- void **arg;
-
-#if defined(LWIP_DEBUG) && defined(LWIP_TCPDUMP)
- tcpdump(p);
-#endif /* LWIP_DEBUG && LWIP_TCPDUMP */
-
- r = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
- if (r != NULL) {
- ptr = r->payload;
-
- for(q = p; q != NULL; q = q->next) {
- memcpy(ptr, q->payload, q->len);
- ptr += q->len;
- }
-
- arg = mem_malloc( sizeof( void *[2]));
- if( NULL == arg ) {
- return ERR_MEM;
- }
-
- arg[0] = netif;
- arg[1] = r;
- /**
- * workaround (patch #1779) to try to prevent bug #2595:
- * When connecting to "localhost" with the loopif interface,
- * tcp_output doesn't get the opportunity to finnish sending the
- * segment before tcp_process gets it, resulting in tcp_process
- * referencing pcb->unacked-> which still is NULL.
- *
- * TODO: Is there still a race condition here? Leon
- */
- sys_timeout( 1, loopif_input, arg );
-
- return ERR_OK;
- }
- return ERR_MEM;
-}
-
-err_t
-loopif_init(struct netif *netif)
-{
- netif->name[0] = 'l';
- netif->name[1] = 'o';
-#if 0 /** TODO: I think this should be enabled, or not? Leon */
- netif->input = loopif_input;
-#endif
- netif->output = loopif_output;
- return ERR_OK;
-}
-
-#endif /* LWIP_HAVE_LOOPIF */
-
-
-
-
-
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/auth.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/auth.c
deleted file mode 100644
index 3334964..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/auth.c
+++ /dev/null
@@ -1,927 +0,0 @@
-/*****************************************************************************
-* auth.c - Network Authentication and Phase Control program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* Copyright (c) 1997 by Global Election Systems Inc. All rights reserved.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-08 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Ported from public pppd code.
-*****************************************************************************/
-/*
- * auth.c - PPP authentication and phase control.
- *
- * Copyright (c) 1993 The Australian National University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the Australian National University. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include "ppp.h"
-#if PPP_SUPPORT > 0
-#include "fsm.h"
-#include "lcp.h"
-#include "pap.h"
-#include "chap.h"
-#include "auth.h"
-#include "ipcp.h"
-
-#if CBCP_SUPPORT > 0
-#include "cbcp.h"
-#endif
-
-#include "pppdebug.h"
-
-
-/*************************/
-/*** LOCAL DEFINITIONS ***/
-/*************************/
-
-/* Bits in auth_pending[] */
-#define PAP_WITHPEER 1
-#define PAP_PEER 2
-#define CHAP_WITHPEER 4
-#define CHAP_PEER 8
-
-
-
-/************************/
-/*** LOCAL DATA TYPES ***/
-/************************/
-/* Used for storing a sequence of words. Usually malloced. */
-struct wordlist {
- struct wordlist *next;
- char word[1];
-};
-
-
-
-/***********************************/
-/*** LOCAL FUNCTION DECLARATIONS ***/
-/***********************************/
-extern char *crypt (const char *, const char *);
-
-/* Prototypes for procedures local to this file. */
-
-static void network_phase (int);
-static void check_idle (void *);
-static void connect_time_expired (void *);
-#if 0
-static int login (char *, char *, char **, int *);
-#endif
-static void logout (void);
-static int null_login (int);
-static int get_pap_passwd (int, char *, char *);
-static int have_pap_secret (void);
-static int have_chap_secret (char *, char *, u32_t);
-static int ip_addr_check (u32_t, struct wordlist *);
-#if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT > 0 */
-static void set_allowed_addrs(int unit, struct wordlist *addrs);
-static void free_wordlist (struct wordlist *);
-#endif
-#if CBCP_SUPPORT > 0
-static void callback_phase (int);
-#endif
-
-
-/******************************/
-/*** PUBLIC DATA STRUCTURES ***/
-/******************************/
-
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-#if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
-/* The name by which the peer authenticated itself to us. */
-static char peer_authname[MAXNAMELEN];
-#endif
-
-/* Records which authentication operations haven't completed yet. */
-static int auth_pending[NUM_PPP];
-
-/* Set if we have successfully called login() */
-static int logged_in;
-
-/* Set if we have run the /etc/ppp/auth-up script. */
-static int did_authup;
-
-/* List of addresses which the peer may use. */
-static struct wordlist *addresses[NUM_PPP];
-
-/* Number of network protocols which we have opened. */
-static int num_np_open;
-
-/* Number of network protocols which have come up. */
-static int num_np_up;
-
-#if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
-/* Set if we got the contents of passwd[] from the pap-secrets file. */
-static int passwd_from_file;
-#endif
-
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-/*
- * An Open on LCP has requested a change from Dead to Establish phase.
- * Do what's necessary to bring the physical layer up.
- */
-void link_required(int unit)
-{
- AUTHDEBUG((LOG_INFO, "link_required: %d\n", unit));
-}
-
-/*
- * LCP has terminated the link; go to the Dead phase and take the
- * physical layer down.
- */
-void link_terminated(int unit)
-{
- AUTHDEBUG((LOG_INFO, "link_terminated: %d\n", unit));
-
- if (lcp_phase[unit] == PHASE_DEAD)
- return;
- if (logged_in)
- logout();
- lcp_phase[unit] = PHASE_DEAD;
- AUTHDEBUG((LOG_NOTICE, "Connection terminated.\n"));
- pppMainWakeup(unit);
-}
-
-/*
- * LCP has gone down; it will either die or try to re-establish.
- */
-void link_down(int unit)
-{
- int i;
- struct protent *protp;
-
- AUTHDEBUG((LOG_INFO, "link_down: %d\n", unit));
- if (did_authup) {
- /* XXX Do link down processing. */
- did_authup = 0;
- }
- for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) {
- if (!protp->enabled_flag)
- continue;
- if (protp->protocol != PPP_LCP && protp->lowerdown != NULL)
- (*protp->lowerdown)(unit);
- if (protp->protocol < 0xC000 && protp->close != NULL)
- (*protp->close)(unit, "LCP down");
- }
- num_np_open = 0;
- num_np_up = 0;
- if (lcp_phase[unit] != PHASE_DEAD)
- lcp_phase[unit] = PHASE_TERMINATE;
- pppMainWakeup(unit);
-}
-
-/*
- * The link is established.
- * Proceed to the Dead, Authenticate or Network phase as appropriate.
- */
-void link_established(int unit)
-{
- int auth;
- int i;
- struct protent *protp;
- lcp_options *wo = &lcp_wantoptions[unit];
- lcp_options *go = &lcp_gotoptions[unit];
-#if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
- lcp_options *ho = &lcp_hisoptions[unit];
-#endif
-
- AUTHDEBUG((LOG_INFO, "link_established: %d\n", unit));
- /*
- * Tell higher-level protocols that LCP is up.
- */
- for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i)
- if (protp->protocol != PPP_LCP && protp->enabled_flag
- && protp->lowerup != NULL)
- (*protp->lowerup)(unit);
-
- if (ppp_settings.auth_required && !(go->neg_chap || go->neg_upap)) {
- /*
- * We wanted the peer to authenticate itself, and it refused:
- * treat it as though it authenticated with PAP using a username
- * of "" and a password of "". If that's not OK, boot it out.
- */
- if (!wo->neg_upap || !null_login(unit)) {
- AUTHDEBUG((LOG_WARNING, "peer refused to authenticate\n"));
- lcp_close(unit, "peer refused to authenticate");
- return;
- }
- }
-
- lcp_phase[unit] = PHASE_AUTHENTICATE;
- auth = 0;
-#if CHAP_SUPPORT > 0
- if (go->neg_chap) {
- ChapAuthPeer(unit, ppp_settings.our_name, go->chap_mdtype);
- auth |= CHAP_PEER;
- }
-#endif
-#if PAP_SUPPORT > 0 && CHAP_SUPPORT > 0
- else
-#endif
-#if PAP_SUPPORT > 0
- if (go->neg_upap) {
- upap_authpeer(unit);
- auth |= PAP_PEER;
- }
-#endif
-#if CHAP_SUPPORT > 0
- if (ho->neg_chap) {
- ChapAuthWithPeer(unit, ppp_settings.user, ho->chap_mdtype);
- auth |= CHAP_WITHPEER;
- }
-#endif
-#if PAP_SUPPORT > 0 && CHAP_SUPPORT > 0
- else
-#endif
-#if PAP_SUPPORT > 0
- if (ho->neg_upap) {
- if (ppp_settings.passwd[0] == 0) {
- passwd_from_file = 1;
- if (!get_pap_passwd(unit, ppp_settings.user, ppp_settings.passwd))
- AUTHDEBUG((LOG_ERR, "No secret found for PAP login\n"));
- }
- upap_authwithpeer(unit, ppp_settings.user, ppp_settings.passwd);
- auth |= PAP_WITHPEER;
- }
-#endif
- auth_pending[unit] = auth;
-
- if (!auth)
- network_phase(unit);
-}
-
-
-/*
- * The peer has failed to authenticate himself using `protocol'.
- */
-void auth_peer_fail(int unit, u16_t protocol)
-{
- AUTHDEBUG((LOG_INFO, "auth_peer_fail: %d proto=%X\n", unit, protocol));
- /*
- * Authentication failure: take the link down
- */
- lcp_close(unit, "Authentication failed");
-}
-
-
-#if PAP_SUPPORT > 0 || CHAP_SUPPORT > 0
-/*
- * The peer has been successfully authenticated using `protocol'.
- */
-void auth_peer_success(int unit, u16_t protocol, char *name, int namelen)
-{
- int pbit;
-
- AUTHDEBUG((LOG_INFO, "auth_peer_success: %d proto=%X\n", unit, protocol));
- switch (protocol) {
- case PPP_CHAP:
- pbit = CHAP_PEER;
- break;
- case PPP_PAP:
- pbit = PAP_PEER;
- break;
- default:
- AUTHDEBUG((LOG_WARNING, "auth_peer_success: unknown protocol %x\n",
- protocol));
- return;
- }
-
- /*
- * Save the authenticated name of the peer for later.
- */
- if (namelen > sizeof(peer_authname) - 1)
- namelen = sizeof(peer_authname) - 1;
- BCOPY(name, peer_authname, namelen);
- peer_authname[namelen] = 0;
-
- /*
- * If there is no more authentication still to be done,
- * proceed to the network (or callback) phase.
- */
- if ((auth_pending[unit] &= ~pbit) == 0)
- network_phase(unit);
-}
-
-/*
- * We have failed to authenticate ourselves to the peer using `protocol'.
- */
-void auth_withpeer_fail(int unit, u16_t protocol)
-{
- int errCode = PPPERR_AUTHFAIL;
-
- AUTHDEBUG((LOG_INFO, "auth_withpeer_fail: %d proto=%X\n", unit, protocol));
- if (passwd_from_file)
- BZERO(ppp_settings.passwd, MAXSECRETLEN);
- /*
- * XXX Warning: the unit number indicates the interface which is
- * not necessarily the PPP connection. It works here as long
- * as we are only supporting PPP interfaces.
- */
- pppIOCtl(unit, PPPCTLS_ERRCODE, &errCode);
-
- /*
- * We've failed to authenticate ourselves to our peer.
- * He'll probably take the link down, and there's not much
- * we can do except wait for that.
- */
-}
-
-/*
- * We have successfully authenticated ourselves with the peer using `protocol'.
- */
-void auth_withpeer_success(int unit, u16_t protocol)
-{
- int pbit;
-
- AUTHDEBUG((LOG_INFO, "auth_withpeer_success: %d proto=%X\n", unit, protocol));
- switch (protocol) {
- case PPP_CHAP:
- pbit = CHAP_WITHPEER;
- break;
- case PPP_PAP:
- if (passwd_from_file)
- BZERO(ppp_settings.passwd, MAXSECRETLEN);
- pbit = PAP_WITHPEER;
- break;
- default:
- AUTHDEBUG((LOG_WARNING, "auth_peer_success: unknown protocol %x\n",
- protocol));
- pbit = 0;
- }
-
- /*
- * If there is no more authentication still being done,
- * proceed to the network (or callback) phase.
- */
- if ((auth_pending[unit] &= ~pbit) == 0)
- network_phase(unit);
-}
-#endif
-
-
-/*
- * np_up - a network protocol has come up.
- */
-void np_up(int unit, u16_t proto)
-{
- AUTHDEBUG((LOG_INFO, "np_up: %d proto=%X\n", unit, proto));
- if (num_np_up == 0) {
- AUTHDEBUG((LOG_INFO, "np_up: maxconnect=%d idle_time_limit=%d\n",ppp_settings.maxconnect,ppp_settings.idle_time_limit));
- /*
- * At this point we consider that the link has come up successfully.
- */
- if (ppp_settings.idle_time_limit > 0)
- TIMEOUT(check_idle, NULL, ppp_settings.idle_time_limit);
-
- /*
- * Set a timeout to close the connection once the maximum
- * connect time has expired.
- */
- if (ppp_settings.maxconnect > 0)
- TIMEOUT(connect_time_expired, 0, ppp_settings.maxconnect);
- }
- ++num_np_up;
-}
-
-/*
- * np_down - a network protocol has gone down.
- */
-void np_down(int unit, u16_t proto)
-{
- AUTHDEBUG((LOG_INFO, "np_down: %d proto=%X\n", unit, proto));
- if (--num_np_up == 0 && ppp_settings.idle_time_limit > 0) {
- UNTIMEOUT(check_idle, NULL);
- }
-}
-
-/*
- * np_finished - a network protocol has finished using the link.
- */
-void np_finished(int unit, u16_t proto)
-{
- AUTHDEBUG((LOG_INFO, "np_finished: %d proto=%X\n", unit, proto));
- if (--num_np_open <= 0) {
- /* no further use for the link: shut up shop. */
- lcp_close(0, "No network protocols running");
- }
-}
-
-/*
- * auth_reset - called when LCP is starting negotiations to recheck
- * authentication options, i.e. whether we have appropriate secrets
- * to use for authenticating ourselves and/or the peer.
- */
-void auth_reset(int unit)
-{
- lcp_options *go = &lcp_gotoptions[unit];
- lcp_options *ao = &lcp_allowoptions[0];
- ipcp_options *ipwo = &ipcp_wantoptions[0];
- u32_t remote;
-
- AUTHDEBUG((LOG_INFO, "auth_reset: %d\n", unit));
- ao->neg_upap = !ppp_settings.refuse_pap && (ppp_settings.passwd[0] != 0 || get_pap_passwd(unit, NULL, NULL));
- ao->neg_chap = !ppp_settings.refuse_chap && ppp_settings.passwd[0] != 0 /*have_chap_secret(ppp_settings.user, ppp_settings.remote_name, (u32_t)0)*/;
-
- if (go->neg_upap && !have_pap_secret())
- go->neg_upap = 0;
- if (go->neg_chap) {
- remote = ipwo->accept_remote? 0: ipwo->hisaddr;
- if (!have_chap_secret(ppp_settings.remote_name, ppp_settings.our_name, remote))
- go->neg_chap = 0;
- }
-}
-
-
-#if PAP_SUPPORT > 0
-/*
- * check_passwd - Check the user name and passwd against the PAP secrets
- * file. If requested, also check against the system password database,
- * and login the user if OK.
- *
- * returns:
- * UPAP_AUTHNAK: Authentication failed.
- * UPAP_AUTHACK: Authentication succeeded.
- * In either case, msg points to an appropriate message.
- */
-int check_passwd(
- int unit,
- char *auser,
- int userlen,
- char *apasswd,
- int passwdlen,
- char **msg,
- int *msglen
-)
-{
-#if 1
- *msg = (char *) 0;
- return UPAP_AUTHACK; /* XXX Assume all entries OK. */
-#else
- int ret = 0;
- struct wordlist *addrs = NULL;
- char passwd[256], user[256];
- char secret[MAXWORDLEN];
- static u_short attempts = 0;
-
- /*
- * Make copies of apasswd and auser, then null-terminate them.
- */
- BCOPY(apasswd, passwd, passwdlen);
- passwd[passwdlen] = '\0';
- BCOPY(auser, user, userlen);
- user[userlen] = '\0';
- *msg = (char *) 0;
-
- /* XXX Validate user name and password. */
- ret = UPAP_AUTHACK; /* XXX Assume all entries OK. */
-
- if (ret == UPAP_AUTHNAK) {
- if (*msg == (char *) 0)
- *msg = "Login incorrect";
- *msglen = strlen(*msg);
- /*
- * Frustrate passwd stealer programs.
- * Allow 10 tries, but start backing off after 3 (stolen from login).
- * On 10'th, drop the connection.
- */
- if (attempts++ >= 10) {
- AUTHDEBUG((LOG_WARNING, "%d LOGIN FAILURES BY %s\n", attempts, user));
- /*ppp_panic("Excess Bad Logins");*/
- }
- if (attempts > 3) {
- sys_msleep((attempts - 3) * 5);
- }
- if (addrs != NULL) {
- free_wordlist(addrs);
- }
- } else {
- attempts = 0; /* Reset count */
- if (*msg == (char *) 0)
- *msg = "Login ok";
- *msglen = strlen(*msg);
- set_allowed_addrs(unit, addrs);
- }
-
- BZERO(passwd, sizeof(passwd));
- BZERO(secret, sizeof(secret));
-
- return ret;
-#endif
-}
-#endif
-
-
-/*
- * auth_ip_addr - check whether the peer is authorized to use
- * a given IP address. Returns 1 if authorized, 0 otherwise.
- */
-int auth_ip_addr(int unit, u32_t addr)
-{
- return ip_addr_check(addr, addresses[unit]);
-}
-
-/*
- * bad_ip_adrs - return 1 if the IP address is one we don't want
- * to use, such as an address in the loopback net or a multicast address.
- * addr is in network byte order.
- */
-int bad_ip_adrs(u32_t addr)
-{
- addr = ntohl(addr);
- return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET
- || IN_MULTICAST(addr) || IN_BADCLASS(addr);
-}
-
-
-#if CHAP_SUPPORT > 0
-/*
- * get_secret - open the CHAP secret file and return the secret
- * for authenticating the given client on the given server.
- * (We could be either client or server).
- */
-int get_secret(
- int unit,
- char *client,
- char *server,
- char *secret,
- int *secret_len,
- int save_addrs
-)
-{
-#if 1
- int len;
- struct wordlist *addrs;
-
- addrs = NULL;
-
- if(!client || !client[0] || strcmp(client, ppp_settings.user)) {
- return 0;
- }
-
- len = strlen(ppp_settings.passwd);
- if (len > MAXSECRETLEN) {
- AUTHDEBUG((LOG_ERR, "Secret for %s on %s is too long\n", client, server));
- len = MAXSECRETLEN;
- }
- BCOPY(ppp_settings.passwd, secret, len);
- *secret_len = len;
-
- return 1;
-#else
- int ret = 0, len;
- struct wordlist *addrs;
- char secbuf[MAXWORDLEN];
-
- addrs = NULL;
- secbuf[0] = 0;
-
- /* XXX Find secret. */
- if (ret < 0)
- return 0;
-
- if (save_addrs)
- set_allowed_addrs(unit, addrs);
-
- len = strlen(secbuf);
- if (len > MAXSECRETLEN) {
- AUTHDEBUG((LOG_ERR, "Secret for %s on %s is too long\n", client, server));
- len = MAXSECRETLEN;
- }
- BCOPY(secbuf, secret, len);
- BZERO(secbuf, sizeof(secbuf));
- *secret_len = len;
-
- return 1;
-#endif
-}
-#endif
-
-
-#if 0 /* UNUSED */
-/*
- * auth_check_options - called to check authentication options.
- */
-void auth_check_options(void)
-{
- lcp_options *wo = &lcp_wantoptions[0];
- int can_auth;
- ipcp_options *ipwo = &ipcp_wantoptions[0];
- u32_t remote;
-
- /* Default our_name to hostname, and user to our_name */
- if (ppp_settings.our_name[0] == 0 || ppp_settings.usehostname)
- strcpy(ppp_settings.our_name, ppp_settings.hostname);
- if (ppp_settings.user[0] == 0)
- strcpy(ppp_settings.user, ppp_settings.our_name);
-
- /* If authentication is required, ask peer for CHAP or PAP. */
- if (ppp_settings.auth_required && !wo->neg_chap && !wo->neg_upap) {
- wo->neg_chap = 1;
- wo->neg_upap = 1;
- }
-
- /*
- * Check whether we have appropriate secrets to use
- * to authenticate the peer.
- */
- can_auth = wo->neg_upap && have_pap_secret();
- if (!can_auth && wo->neg_chap) {
- remote = ipwo->accept_remote? 0: ipwo->hisaddr;
- can_auth = have_chap_secret(ppp_settings.remote_name, ppp_settings.our_name, remote);
- }
-
- if (ppp_settings.auth_required && !can_auth) {
- ppp_panic("No auth secret");
- }
-}
-#endif
-
-
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-/*
- * Proceed to the network phase.
- */
-static void network_phase(int unit)
-{
- int i;
- struct protent *protp;
- lcp_options *go = &lcp_gotoptions[unit];
-
- /*
- * If the peer had to authenticate, run the auth-up script now.
- */
- if ((go->neg_chap || go->neg_upap) && !did_authup) {
- /* XXX Do setup for peer authentication. */
- did_authup = 1;
- }
-
-#if CBCP_SUPPORT > 0
- /*
- * If we negotiated callback, do it now.
- */
- if (go->neg_cbcp) {
- lcp_phase[unit] = PHASE_CALLBACK;
- (*cbcp_protent.open)(unit);
- return;
- }
-#endif
-
- lcp_phase[unit] = PHASE_NETWORK;
- for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i)
- if (protp->protocol < 0xC000 && protp->enabled_flag
- && protp->open != NULL) {
- (*protp->open)(unit);
- if (protp->protocol != PPP_CCP)
- ++num_np_open;
- }
-
- if (num_np_open == 0)
- /* nothing to do */
- lcp_close(0, "No network protocols running");
-}
-
-/*
- * check_idle - check whether the link has been idle for long
- * enough that we can shut it down.
- */
-static void check_idle(void *arg)
-{
- struct ppp_idle idle;
- u_short itime;
-
- (void)arg;
- if (!get_idle_time(0, &idle))
- return;
- itime = LWIP_MIN(idle.xmit_idle, idle.recv_idle);
- if (itime >= ppp_settings.idle_time_limit) {
- /* link is idle: shut it down. */
- AUTHDEBUG((LOG_INFO, "Terminating connection due to lack of activity.\n"));
- lcp_close(0, "Link inactive");
- } else {
- TIMEOUT(check_idle, NULL, ppp_settings.idle_time_limit - itime);
- }
-}
-
-/*
- * connect_time_expired - log a message and close the connection.
- */
-static void connect_time_expired(void *arg)
-{
- (void)arg;
-
- AUTHDEBUG((LOG_INFO, "Connect time expired\n"));
- lcp_close(0, "Connect time expired"); /* Close connection */
-}
-
-#if 0
-/*
- * login - Check the user name and password against the system
- * password database, and login the user if OK.
- *
- * returns:
- * UPAP_AUTHNAK: Login failed.
- * UPAP_AUTHACK: Login succeeded.
- * In either case, msg points to an appropriate message.
- */
-static int login(char *user, char *passwd, char **msg, int *msglen)
-{
- /* XXX Fail until we decide that we want to support logins. */
- return (UPAP_AUTHNAK);
-}
-#endif
-
-/*
- * logout - Logout the user.
- */
-static void logout(void)
-{
- logged_in = 0;
-}
-
-
-/*
- * null_login - Check if a username of "" and a password of "" are
- * acceptable, and iff so, set the list of acceptable IP addresses
- * and return 1.
- */
-static int null_login(int unit)
-{
- (void)unit;
- /* XXX Fail until we decide that we want to support logins. */
- return 0;
-}
-
-
-/*
- * get_pap_passwd - get a password for authenticating ourselves with
- * our peer using PAP. Returns 1 on success, 0 if no suitable password
- * could be found.
- */
-static int get_pap_passwd(int unit, char *user, char *passwd)
-{
-/* normally we would reject PAP if no password is provided,
- but this causes problems with some providers (like CHT in Taiwan)
- who incorrectly request PAP and expect a bogus/empty password, so
- always provide a default user/passwd of "none"/"none"
-*/
- if(user)
- strcpy(user, "none");
- if(passwd)
- strcpy(passwd, "none");
-
- return 1;
-}
-
-
-/*
- * have_pap_secret - check whether we have a PAP file with any
- * secrets that we could possibly use for authenticating the peer.
- */
-static int have_pap_secret(void)
-{
- /* XXX Fail until we set up our passwords. */
- return 0;
-}
-
-
-/*
- * have_chap_secret - check whether we have a CHAP file with a
- * secret that we could possibly use for authenticating `client'
- * on `server'. Either can be the null string, meaning we don't
- * know the identity yet.
- */
-static int have_chap_secret(char *client, char *server, u32_t remote)
-{
- (void)client;
- (void)server;
- (void)remote;
- /* XXX Fail until we set up our passwords. */
- return 0;
-}
-
-
-#if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT > 0 */
-/*
- * set_allowed_addrs() - set the list of allowed addresses.
- */
-static void set_allowed_addrs(int unit, struct wordlist *addrs)
-{
- if (addresses[unit] != NULL)
- free_wordlist(addresses[unit]);
- addresses[unit] = addrs;
-
-#if 0
- /*
- * If there's only one authorized address we might as well
- * ask our peer for that one right away
- */
- if (addrs != NULL && addrs->next == NULL) {
- char *p = addrs->word;
- struct ipcp_options *wo = &ipcp_wantoptions[unit];
- u32_t a;
- struct hostent *hp;
-
- if (wo->hisaddr == 0 && *p != '!' && *p != '-'
- && strchr(p, '/') == NULL) {
- hp = gethostbyname(p);
- if (hp != NULL && hp->h_addrtype == AF_INET)
- a = *(u32_t *)hp->h_addr;
- else
- a = inet_addr(p);
- if (a != (u32_t) -1)
- wo->hisaddr = a;
- }
- }
-#endif
-}
-#endif
-
-static int ip_addr_check(u32_t addr, struct wordlist *addrs)
-{
-
- /* don't allow loopback or multicast address */
- if (bad_ip_adrs(addr))
- return 0;
-
- if (addrs == NULL)
- return !ppp_settings.auth_required; /* no addresses authorized */
-
- /* XXX All other addresses allowed. */
- return 1;
-}
-
-#if 0 /* PAP_SUPPORT > 0 || CHAP_SUPPORT */
-/*
- * free_wordlist - release memory allocated for a wordlist.
- */
-static void free_wordlist(struct wordlist *wp)
-{
- struct wordlist *next;
-
- while (wp != NULL) {
- next = wp->next;
- free(wp);
- wp = next;
- }
-}
-#endif
-
-#endif /* PPP_SUPPORT */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/auth.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/auth.h
deleted file mode 100644
index d6a5de5..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/auth.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*****************************************************************************
-* auth.h - PPP Authentication and phase control header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1998 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-04 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original derived from BSD pppd.h.
-*****************************************************************************/
-/*
- * pppd.h - PPP daemon global declarations.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-#ifndef AUTH_H
-#define AUTH_H
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-void link_required (int); /* we are starting to use the link */
-void link_terminated (int); /* we are finished with the link */
-void link_down (int); /* the LCP layer has left the Opened state */
-void link_established (int); /* the link is up; authenticate now */
-void np_up (int, u16_t); /* a network protocol has come up */
-void np_down (int, u16_t); /* a network protocol has gone down */
-void np_finished (int, u16_t); /* a network protocol no longer needs link */
-void auth_peer_fail (int, u16_t);/* peer failed to authenticate itself */
-
-/* peer successfully authenticated itself */
-void auth_peer_success (int, u16_t, char *, int);
-
-/* we failed to authenticate ourselves */
-void auth_withpeer_fail (int, u16_t);
-
-/* we successfully authenticated ourselves */
-void auth_withpeer_success (int, u16_t);
-
-/* check authentication options supplied */
-void auth_check_options (void);
-void auth_reset (int); /* check what secrets we have */
-
-/* Check peer-supplied username/password */
-int check_passwd (int, char *, int, char *, int, char **, int *);
-
-/* get "secret" for chap */
-int get_secret (int, char *, char *, char *, int *, int);
-
-/* check if IP address is authorized */
-int auth_ip_addr (int, u32_t);
-
-/* check if IP address is unreasonable */
-int bad_ip_adrs (u32_t);
-
-
-#endif /* AUTH_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/chap.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/chap.c
deleted file mode 100644
index 4d1dc0d..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/chap.c
+++ /dev/null
@@ -1,872 +0,0 @@
-/*** WARNING - THIS HAS NEVER BEEN FINISHED ***/
-/*****************************************************************************
-* chap.c - Network Challenge Handshake Authentication Protocol program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-04 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original based on BSD chap.c.
-*****************************************************************************/
-/*
- * chap.c - Challenge Handshake Authentication Protocol.
- *
- * Copyright (c) 1993 The Australian National University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the Australian National University. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Copyright (c) 1991 Gregory M. Christy.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Gregory M. Christy. The name of the author may not be used to
- * endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include "ppp.h"
-#if PPP_SUPPORT > 0
-#include "magic.h"
-
-#if CHAP_SUPPORT > 0
-
-#include "randm.h"
-#include "auth.h"
-#include "md5.h"
-#include "chap.h"
-#include "chpms.h"
-#include "pppdebug.h"
-
-
-/*************************/
-/*** LOCAL DEFINITIONS ***/
-/*************************/
-
-
-/************************/
-/*** LOCAL DATA TYPES ***/
-/************************/
-
-
-/***********************************/
-/*** LOCAL FUNCTION DECLARATIONS ***/
-/***********************************/
-/*
- * Protocol entry points.
- */
-static void ChapInit (int);
-static void ChapLowerUp (int);
-static void ChapLowerDown (int);
-static void ChapInput (int, u_char *, int);
-static void ChapProtocolReject (int);
-static int ChapPrintPkt (u_char *, int,
- void (*) (void *, char *, ...), void *);
-
-static void ChapChallengeTimeout (void *);
-static void ChapResponseTimeout (void *);
-static void ChapReceiveChallenge (chap_state *, u_char *, int, int);
-static void ChapRechallenge (void *);
-static void ChapReceiveResponse (chap_state *, u_char *, int, int);
-static void ChapReceiveSuccess(chap_state *cstate, u_char *inp, u_char id, int len);
-static void ChapReceiveFailure(chap_state *cstate, u_char *inp, u_char id, int len);
-static void ChapSendStatus (chap_state *, int);
-static void ChapSendChallenge (chap_state *);
-static void ChapSendResponse (chap_state *);
-static void ChapGenChallenge (chap_state *);
-
-
-/******************************/
-/*** PUBLIC DATA STRUCTURES ***/
-/******************************/
-chap_state chap[NUM_PPP]; /* CHAP state; one for each unit */
-
-struct protent chap_protent = {
- PPP_CHAP,
- ChapInit,
- ChapInput,
- ChapProtocolReject,
- ChapLowerUp,
- ChapLowerDown,
- NULL,
- NULL,
-#if 0
- ChapPrintPkt,
- NULL,
-#endif
- 1,
- "CHAP",
-#if 0
- NULL,
- NULL,
- NULL
-#endif
-};
-
-
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-static char *ChapCodenames[] = {
- "Challenge", "Response", "Success", "Failure"
-};
-
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-/*
- * ChapAuthWithPeer - Authenticate us with our peer (start client).
- *
- */
-void ChapAuthWithPeer(int unit, char *our_name, int digest)
-{
- chap_state *cstate = &chap[unit];
-
- cstate->resp_name = our_name;
- cstate->resp_type = digest;
-
- if (cstate->clientstate == CHAPCS_INITIAL ||
- cstate->clientstate == CHAPCS_PENDING) {
- /* lower layer isn't up - wait until later */
- cstate->clientstate = CHAPCS_PENDING;
- return;
- }
-
- /*
- * We get here as a result of LCP coming up.
- * So even if CHAP was open before, we will
- * have to re-authenticate ourselves.
- */
- cstate->clientstate = CHAPCS_LISTEN;
-}
-
-
-/*
- * ChapAuthPeer - Authenticate our peer (start server).
- */
-void ChapAuthPeer(int unit, char *our_name, int digest)
-{
- chap_state *cstate = &chap[unit];
-
- cstate->chal_name = our_name;
- cstate->chal_type = digest;
-
- if (cstate->serverstate == CHAPSS_INITIAL ||
- cstate->serverstate == CHAPSS_PENDING) {
- /* lower layer isn't up - wait until later */
- cstate->serverstate = CHAPSS_PENDING;
- return;
- }
-
- ChapGenChallenge(cstate);
- ChapSendChallenge(cstate); /* crank it up dude! */
- cstate->serverstate = CHAPSS_INITIAL_CHAL;
-}
-
-
-
-
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-/*
- * ChapInit - Initialize a CHAP unit.
- */
-static void ChapInit(int unit)
-{
- chap_state *cstate = &chap[unit];
-
- BZERO(cstate, sizeof(*cstate));
- cstate->unit = unit;
- cstate->clientstate = CHAPCS_INITIAL;
- cstate->serverstate = CHAPSS_INITIAL;
- cstate->timeouttime = CHAP_DEFTIMEOUT;
- cstate->max_transmits = CHAP_DEFTRANSMITS;
- /* random number generator is initialized in magic_init */
-}
-
-
-/*
- * ChapChallengeTimeout - Timeout expired on sending challenge.
- */
-static void ChapChallengeTimeout(void *arg)
-{
- chap_state *cstate = (chap_state *) arg;
-
- /* if we aren't sending challenges, don't worry. then again we */
- /* probably shouldn't be here either */
- if (cstate->serverstate != CHAPSS_INITIAL_CHAL &&
- cstate->serverstate != CHAPSS_RECHALLENGE)
- return;
-
- if (cstate->chal_transmits >= cstate->max_transmits) {
- /* give up on peer */
- CHAPDEBUG((LOG_ERR, "Peer failed to respond to CHAP challenge\n"));
- cstate->serverstate = CHAPSS_BADAUTH;
- auth_peer_fail(cstate->unit, PPP_CHAP);
- return;
- }
-
- ChapSendChallenge(cstate); /* Re-send challenge */
-}
-
-
-/*
- * ChapResponseTimeout - Timeout expired on sending response.
- */
-static void ChapResponseTimeout(void *arg)
-{
- chap_state *cstate = (chap_state *) arg;
-
- /* if we aren't sending a response, don't worry. */
- if (cstate->clientstate != CHAPCS_RESPONSE)
- return;
-
- ChapSendResponse(cstate); /* re-send response */
-}
-
-
-/*
- * ChapRechallenge - Time to challenge the peer again.
- */
-static void ChapRechallenge(void *arg)
-{
- chap_state *cstate = (chap_state *) arg;
-
- /* if we aren't sending a response, don't worry. */
- if (cstate->serverstate != CHAPSS_OPEN)
- return;
-
- ChapGenChallenge(cstate);
- ChapSendChallenge(cstate);
- cstate->serverstate = CHAPSS_RECHALLENGE;
-}
-
-
-/*
- * ChapLowerUp - The lower layer is up.
- *
- * Start up if we have pending requests.
- */
-static void ChapLowerUp(int unit)
-{
- chap_state *cstate = &chap[unit];
-
- if (cstate->clientstate == CHAPCS_INITIAL)
- cstate->clientstate = CHAPCS_CLOSED;
- else if (cstate->clientstate == CHAPCS_PENDING)
- cstate->clientstate = CHAPCS_LISTEN;
-
- if (cstate->serverstate == CHAPSS_INITIAL)
- cstate->serverstate = CHAPSS_CLOSED;
- else if (cstate->serverstate == CHAPSS_PENDING) {
- ChapGenChallenge(cstate);
- ChapSendChallenge(cstate);
- cstate->serverstate = CHAPSS_INITIAL_CHAL;
- }
-}
-
-
-/*
- * ChapLowerDown - The lower layer is down.
- *
- * Cancel all timeouts.
- */
-static void ChapLowerDown(int unit)
-{
- chap_state *cstate = &chap[unit];
-
- /* Timeout(s) pending? Cancel if so. */
- if (cstate->serverstate == CHAPSS_INITIAL_CHAL ||
- cstate->serverstate == CHAPSS_RECHALLENGE)
- UNTIMEOUT(ChapChallengeTimeout, cstate);
- else if (cstate->serverstate == CHAPSS_OPEN
- && cstate->chal_interval != 0)
- UNTIMEOUT(ChapRechallenge, cstate);
- if (cstate->clientstate == CHAPCS_RESPONSE)
- UNTIMEOUT(ChapResponseTimeout, cstate);
-
- cstate->clientstate = CHAPCS_INITIAL;
- cstate->serverstate = CHAPSS_INITIAL;
-}
-
-
-/*
- * ChapProtocolReject - Peer doesn't grok CHAP.
- */
-static void ChapProtocolReject(int unit)
-{
- chap_state *cstate = &chap[unit];
-
- if (cstate->serverstate != CHAPSS_INITIAL &&
- cstate->serverstate != CHAPSS_CLOSED)
- auth_peer_fail(unit, PPP_CHAP);
- if (cstate->clientstate != CHAPCS_INITIAL &&
- cstate->clientstate != CHAPCS_CLOSED)
- auth_withpeer_fail(unit, PPP_CHAP);
- ChapLowerDown(unit); /* shutdown chap */
-}
-
-
-/*
- * ChapInput - Input CHAP packet.
- */
-static void ChapInput(int unit, u_char *inpacket, int packet_len)
-{
- chap_state *cstate = &chap[unit];
- u_char *inp;
- u_char code, id;
- int len;
-
- /*
- * Parse header (code, id and length).
- * If packet too short, drop it.
- */
- inp = inpacket;
- if (packet_len < CHAP_HEADERLEN) {
- CHAPDEBUG((LOG_INFO, "ChapInput: rcvd short header.\n"));
- return;
- }
- GETCHAR(code, inp);
- GETCHAR(id, inp);
- GETSHORT(len, inp);
- if (len < CHAP_HEADERLEN) {
- CHAPDEBUG((LOG_INFO, "ChapInput: rcvd illegal length.\n"));
- return;
- }
- if (len > packet_len) {
- CHAPDEBUG((LOG_INFO, "ChapInput: rcvd short packet.\n"));
- return;
- }
- len -= CHAP_HEADERLEN;
-
- /*
- * Action depends on code (as in fact it usually does :-).
- */
- switch (code) {
- case CHAP_CHALLENGE:
- ChapReceiveChallenge(cstate, inp, id, len);
- break;
-
- case CHAP_RESPONSE:
- ChapReceiveResponse(cstate, inp, id, len);
- break;
-
- case CHAP_FAILURE:
- ChapReceiveFailure(cstate, inp, id, len);
- break;
-
- case CHAP_SUCCESS:
- ChapReceiveSuccess(cstate, inp, id, len);
- break;
-
- default: /* Need code reject? */
- CHAPDEBUG((LOG_WARNING, "Unknown CHAP code (%d) received.\n", code));
- break;
- }
-}
-
-
-/*
- * ChapReceiveChallenge - Receive Challenge and send Response.
- */
-static void ChapReceiveChallenge(chap_state *cstate, u_char *inp, int id, int len)
-{
- int rchallenge_len;
- u_char *rchallenge;
- int secret_len;
- char secret[MAXSECRETLEN];
- char rhostname[256];
- MD5_CTX mdContext;
- u_char hash[MD5_SIGNATURE_SIZE];
-
- CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: Rcvd id %d.\n", id));
- if (cstate->clientstate == CHAPCS_CLOSED ||
- cstate->clientstate == CHAPCS_PENDING) {
- CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: in state %d\n",
- cstate->clientstate));
- return;
- }
-
- if (len < 2) {
- CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: rcvd short packet.\n"));
- return;
- }
-
- GETCHAR(rchallenge_len, inp);
- len -= sizeof (u_char) + rchallenge_len; /* now name field length */
- if (len < 0) {
- CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: rcvd short packet.\n"));
- return;
- }
- rchallenge = inp;
- INCPTR(rchallenge_len, inp);
-
- if (len >= sizeof(rhostname))
- len = sizeof(rhostname) - 1;
- BCOPY(inp, rhostname, len);
- rhostname[len] = '\000';
-
- CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: received name field '%s'\n",
- rhostname));
-
- /* Microsoft doesn't send their name back in the PPP packet */
- if (ppp_settings.remote_name[0] != 0 && (ppp_settings.explicit_remote || rhostname[0] == 0)) {
- strncpy(rhostname, ppp_settings.remote_name, sizeof(rhostname));
- rhostname[sizeof(rhostname) - 1] = 0;
- CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: using '%s' as remote name\n",
- rhostname));
- }
-
- /* get secret for authenticating ourselves with the specified host */
- if (!get_secret(cstate->unit, cstate->resp_name, rhostname,
- secret, &secret_len, 0)) {
- secret_len = 0; /* assume null secret if can't find one */
- CHAPDEBUG((LOG_WARNING, "No CHAP secret found for authenticating us to %s\n", rhostname));
- }
-
- /* cancel response send timeout if necessary */
- if (cstate->clientstate == CHAPCS_RESPONSE)
- UNTIMEOUT(ChapResponseTimeout, cstate);
-
- cstate->resp_id = id;
- cstate->resp_transmits = 0;
-
- /* generate MD based on negotiated type */
- switch (cstate->resp_type) {
-
- case CHAP_DIGEST_MD5:
- MD5Init(&mdContext);
- MD5Update(&mdContext, &cstate->resp_id, 1);
- MD5Update(&mdContext, (u_char*)secret, secret_len);
- MD5Update(&mdContext, rchallenge, rchallenge_len);
- MD5Final(hash, &mdContext);
- BCOPY(hash, cstate->response, MD5_SIGNATURE_SIZE);
- cstate->resp_length = MD5_SIGNATURE_SIZE;
- break;
-
-#ifdef CHAPMS
- case CHAP_MICROSOFT:
- ChapMS(cstate, rchallenge, rchallenge_len, secret, secret_len);
- break;
-#endif
-
- default:
- CHAPDEBUG((LOG_INFO, "unknown digest type %d\n", cstate->resp_type));
- return;
- }
-
- BZERO(secret, sizeof(secret));
- ChapSendResponse(cstate);
-}
-
-
-/*
- * ChapReceiveResponse - Receive and process response.
- */
-static void ChapReceiveResponse(chap_state *cstate, u_char *inp, int id, int len)
-{
- u_char *remmd, remmd_len;
- int secret_len, old_state;
- int code;
- char rhostname[256];
- MD5_CTX mdContext;
- char secret[MAXSECRETLEN];
- u_char hash[MD5_SIGNATURE_SIZE];
-
- CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: Rcvd id %d.\n", id));
-
- if (cstate->serverstate == CHAPSS_CLOSED ||
- cstate->serverstate == CHAPSS_PENDING) {
- CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: in state %d\n",
- cstate->serverstate));
- return;
- }
-
- if (id != cstate->chal_id)
- return; /* doesn't match ID of last challenge */
-
- /*
- * If we have received a duplicate or bogus Response,
- * we have to send the same answer (Success/Failure)
- * as we did for the first Response we saw.
- */
- if (cstate->serverstate == CHAPSS_OPEN) {
- ChapSendStatus(cstate, CHAP_SUCCESS);
- return;
- }
- if (cstate->serverstate == CHAPSS_BADAUTH) {
- ChapSendStatus(cstate, CHAP_FAILURE);
- return;
- }
-
- if (len < 2) {
- CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: rcvd short packet.\n"));
- return;
- }
- GETCHAR(remmd_len, inp); /* get length of MD */
- remmd = inp; /* get pointer to MD */
- INCPTR(remmd_len, inp);
-
- len -= sizeof (u_char) + remmd_len;
- if (len < 0) {
- CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: rcvd short packet.\n"));
- return;
- }
-
- UNTIMEOUT(ChapChallengeTimeout, cstate);
-
- if (len >= sizeof(rhostname))
- len = sizeof(rhostname) - 1;
- BCOPY(inp, rhostname, len);
- rhostname[len] = '\000';
-
- CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: received name field: %s\n",
- rhostname));
-
- /*
- * Get secret for authenticating them with us,
- * do the hash ourselves, and compare the result.
- */
- code = CHAP_FAILURE;
- if (!get_secret(cstate->unit, rhostname, cstate->chal_name,
- secret, &secret_len, 1)) {
-/* CHAPDEBUG((LOG_WARNING, TL_CHAP, "No CHAP secret found for authenticating %s\n", rhostname)); */
- CHAPDEBUG((LOG_WARNING, "No CHAP secret found for authenticating %s\n",
- rhostname));
- } else {
-
- /* generate MD based on negotiated type */
- switch (cstate->chal_type) {
-
- case CHAP_DIGEST_MD5: /* only MD5 is defined for now */
- if (remmd_len != MD5_SIGNATURE_SIZE)
- break; /* it's not even the right length */
- MD5Init(&mdContext);
- MD5Update(&mdContext, &cstate->chal_id, 1);
- MD5Update(&mdContext, (u_char*)secret, secret_len);
- MD5Update(&mdContext, cstate->challenge, cstate->chal_len);
- MD5Final(hash, &mdContext);
-
- /* compare local and remote MDs and send the appropriate status */
- if (memcmp (hash, remmd, MD5_SIGNATURE_SIZE) == 0)
- code = CHAP_SUCCESS; /* they are the same! */
- break;
-
- default:
- CHAPDEBUG((LOG_INFO, "unknown digest type %d\n", cstate->chal_type));
- }
- }
-
- BZERO(secret, sizeof(secret));
- ChapSendStatus(cstate, code);
-
- if (code == CHAP_SUCCESS) {
- old_state = cstate->serverstate;
- cstate->serverstate = CHAPSS_OPEN;
- if (old_state == CHAPSS_INITIAL_CHAL) {
- auth_peer_success(cstate->unit, PPP_CHAP, rhostname, len);
- }
- if (cstate->chal_interval != 0)
- TIMEOUT(ChapRechallenge, cstate, cstate->chal_interval);
- } else {
- CHAPDEBUG((LOG_ERR, "CHAP peer authentication failed\n"));
- cstate->serverstate = CHAPSS_BADAUTH;
- auth_peer_fail(cstate->unit, PPP_CHAP);
- }
-}
-
-/*
- * ChapReceiveSuccess - Receive Success
- */
-static void ChapReceiveSuccess(chap_state *cstate, u_char *inp, u_char id, int len)
-{
-
- CHAPDEBUG((LOG_INFO, "ChapReceiveSuccess: Rcvd id %d.\n", id));
-
- if (cstate->clientstate == CHAPCS_OPEN)
- /* presumably an answer to a duplicate response */
- return;
-
- if (cstate->clientstate != CHAPCS_RESPONSE) {
- /* don't know what this is */
- CHAPDEBUG((LOG_INFO, "ChapReceiveSuccess: in state %d\n",
- cstate->clientstate));
- return;
- }
-
- UNTIMEOUT(ChapResponseTimeout, cstate);
-
- /*
- * Print message.
- */
- if (len > 0)
- PRINTMSG(inp, len);
-
- cstate->clientstate = CHAPCS_OPEN;
-
- auth_withpeer_success(cstate->unit, PPP_CHAP);
-}
-
-
-/*
- * ChapReceiveFailure - Receive failure.
- */
-static void ChapReceiveFailure(chap_state *cstate, u_char *inp, u_char id, int len)
-{
- CHAPDEBUG((LOG_INFO, "ChapReceiveFailure: Rcvd id %d.\n", id));
-
- if (cstate->clientstate != CHAPCS_RESPONSE) {
- /* don't know what this is */
- CHAPDEBUG((LOG_INFO, "ChapReceiveFailure: in state %d\n",
- cstate->clientstate));
- return;
- }
-
- UNTIMEOUT(ChapResponseTimeout, cstate);
-
- /*
- * Print message.
- */
- if (len > 0)
- PRINTMSG(inp, len);
-
- CHAPDEBUG((LOG_ERR, "CHAP authentication failed\n"));
- auth_withpeer_fail(cstate->unit, PPP_CHAP);
-}
-
-
-/*
- * ChapSendChallenge - Send an Authenticate challenge.
- */
-static void ChapSendChallenge(chap_state *cstate)
-{
- u_char *outp;
- int chal_len, name_len;
- int outlen;
-
- chal_len = cstate->chal_len;
- name_len = strlen(cstate->chal_name);
- outlen = CHAP_HEADERLEN + sizeof (u_char) + chal_len + name_len;
- outp = outpacket_buf[cstate->unit];
-
- MAKEHEADER(outp, PPP_CHAP); /* paste in a CHAP header */
-
- PUTCHAR(CHAP_CHALLENGE, outp);
- PUTCHAR(cstate->chal_id, outp);
- PUTSHORT(outlen, outp);
-
- PUTCHAR(chal_len, outp); /* put length of challenge */
- BCOPY(cstate->challenge, outp, chal_len);
- INCPTR(chal_len, outp);
-
- BCOPY(cstate->chal_name, outp, name_len); /* append hostname */
-
- pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN);
-
- CHAPDEBUG((LOG_INFO, "ChapSendChallenge: Sent id %d.\n", cstate->chal_id));
-
- TIMEOUT(ChapChallengeTimeout, cstate, cstate->timeouttime);
- ++cstate->chal_transmits;
-}
-
-
-/*
- * ChapSendStatus - Send a status response (ack or nak).
- */
-static void ChapSendStatus(chap_state *cstate, int code)
-{
- u_char *outp;
- int outlen, msglen;
- char msg[256];
-
- if (code == CHAP_SUCCESS)
- strcpy(msg, "Welcome!");
- else
- strcpy(msg, "I don't like you. Go 'way.");
- msglen = strlen(msg);
-
- outlen = CHAP_HEADERLEN + msglen;
- outp = outpacket_buf[cstate->unit];
-
- MAKEHEADER(outp, PPP_CHAP); /* paste in a header */
-
- PUTCHAR(code, outp);
- PUTCHAR(cstate->chal_id, outp);
- PUTSHORT(outlen, outp);
- BCOPY(msg, outp, msglen);
- pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN);
-
- CHAPDEBUG((LOG_INFO, "ChapSendStatus: Sent code %d, id %d.\n", code,
- cstate->chal_id));
-}
-
-/*
- * ChapGenChallenge is used to generate a pseudo-random challenge string of
- * a pseudo-random length between min_len and max_len. The challenge
- * string and its length are stored in *cstate, and various other fields of
- * *cstate are initialized.
- */
-
-static void ChapGenChallenge(chap_state *cstate)
-{
- int chal_len;
- u_char *ptr = cstate->challenge;
- int i;
-
- /* pick a random challenge length between MIN_CHALLENGE_LENGTH and
- MAX_CHALLENGE_LENGTH */
- chal_len = (unsigned)
- ((((magic() >> 16) *
- (MAX_CHALLENGE_LENGTH - MIN_CHALLENGE_LENGTH)) >> 16)
- + MIN_CHALLENGE_LENGTH);
- cstate->chal_len = chal_len;
- cstate->chal_id = ++cstate->id;
- cstate->chal_transmits = 0;
-
- /* generate a random string */
- for (i = 0; i < chal_len; i++ )
- *ptr++ = (char) (magic() & 0xff);
-}
-
-/*
- * ChapSendResponse - send a response packet with values as specified
- * in *cstate.
- */
-/* ARGSUSED */
-static void ChapSendResponse(chap_state *cstate)
-{
- u_char *outp;
- int outlen, md_len, name_len;
-
- md_len = cstate->resp_length;
- name_len = strlen(cstate->resp_name);
- outlen = CHAP_HEADERLEN + sizeof (u_char) + md_len + name_len;
- outp = outpacket_buf[cstate->unit];
-
- MAKEHEADER(outp, PPP_CHAP);
-
- PUTCHAR(CHAP_RESPONSE, outp); /* we are a response */
- PUTCHAR(cstate->resp_id, outp); /* copy id from challenge packet */
- PUTSHORT(outlen, outp); /* packet length */
-
- PUTCHAR(md_len, outp); /* length of MD */
- BCOPY(cstate->response, outp, md_len); /* copy MD to buffer */
- INCPTR(md_len, outp);
-
- BCOPY(cstate->resp_name, outp, name_len); /* append our name */
-
- /* send the packet */
- pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN);
-
- cstate->clientstate = CHAPCS_RESPONSE;
- TIMEOUT(ChapResponseTimeout, cstate, cstate->timeouttime);
- ++cstate->resp_transmits;
-}
-
-/*
- * ChapPrintPkt - print the contents of a CHAP packet.
- */
-static int ChapPrintPkt(
- u_char *p,
- int plen,
- void (*printer) (void *, char *, ...),
- void *arg
-)
-{
- int code, id, len;
- int clen, nlen;
- u_char x;
-
- if (plen < CHAP_HEADERLEN)
- return 0;
- GETCHAR(code, p);
- GETCHAR(id, p);
- GETSHORT(len, p);
- if (len < CHAP_HEADERLEN || len > plen)
- return 0;
-
- if (code >= 1 && code <= sizeof(ChapCodenames) / sizeof(char *))
- printer(arg, " %s", ChapCodenames[code-1]);
- else
- printer(arg, " code=0x%x", code);
- printer(arg, " id=0x%x", id);
- len -= CHAP_HEADERLEN;
- switch (code) {
- case CHAP_CHALLENGE:
- case CHAP_RESPONSE:
- if (len < 1)
- break;
- clen = p[0];
- if (len < clen + 1)
- break;
- ++p;
- nlen = len - clen - 1;
- printer(arg, " <");
- for (; clen > 0; --clen) {
- GETCHAR(x, p);
- printer(arg, "%.2x", x);
- }
- printer(arg, ">, name = %.*Z", nlen, p);
- break;
- case CHAP_FAILURE:
- case CHAP_SUCCESS:
- printer(arg, " %.*Z", len, p);
- break;
- default:
- for (clen = len; clen > 0; --clen) {
- GETCHAR(x, p);
- printer(arg, " %.2x", x);
- }
- }
-
- return len + CHAP_HEADERLEN;
-}
-
-#endif
-
-#endif /* PPP_SUPPORT */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/chap.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/chap.h
deleted file mode 100644
index 06d1b15..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/chap.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*****************************************************************************
-* chap.h - Network Challenge Handshake Authentication Protocol header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1998 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-03 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original built from BSD network code.
-******************************************************************************/
-/*
- * chap.h - Challenge Handshake Authentication Protocol definitions.
- *
- * Copyright (c) 1993 The Australian National University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the Australian National University. The name of the University
- * may not be used to endorse or promote products derived from this
- * software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Copyright (c) 1991 Gregory M. Christy
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the author.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id: chap.h $
- */
-
-#ifndef CHAP_H
-#define CHAP_H
-
-/*************************
-*** PUBLIC DEFINITIONS ***
-*************************/
-
-/* Code + ID + length */
-#define CHAP_HEADERLEN 4
-
-/*
- * CHAP codes.
- */
-
-#define CHAP_DIGEST_MD5 5 /* use MD5 algorithm */
-#define MD5_SIGNATURE_SIZE 16 /* 16 bytes in a MD5 message digest */
-#define CHAP_MICROSOFT 0x80 /* use Microsoft-compatible alg. */
-#define MS_CHAP_RESPONSE_LEN 49 /* Response length for MS-CHAP */
-
-#define CHAP_CHALLENGE 1
-#define CHAP_RESPONSE 2
-#define CHAP_SUCCESS 3
-#define CHAP_FAILURE 4
-
-/*
- * Challenge lengths (for challenges we send) and other limits.
- */
-#define MIN_CHALLENGE_LENGTH 32
-#define MAX_CHALLENGE_LENGTH 64
-#define MAX_RESPONSE_LENGTH 64 /* sufficient for MD5 or MS-CHAP */
-
-/*
- * Client (peer) states.
- */
-#define CHAPCS_INITIAL 0 /* Lower layer down, not opened */
-#define CHAPCS_CLOSED 1 /* Lower layer up, not opened */
-#define CHAPCS_PENDING 2 /* Auth us to peer when lower up */
-#define CHAPCS_LISTEN 3 /* Listening for a challenge */
-#define CHAPCS_RESPONSE 4 /* Sent response, waiting for status */
-#define CHAPCS_OPEN 5 /* We've received Success */
-
-/*
- * Server (authenticator) states.
- */
-#define CHAPSS_INITIAL 0 /* Lower layer down, not opened */
-#define CHAPSS_CLOSED 1 /* Lower layer up, not opened */
-#define CHAPSS_PENDING 2 /* Auth peer when lower up */
-#define CHAPSS_INITIAL_CHAL 3 /* We've sent the first challenge */
-#define CHAPSS_OPEN 4 /* We've sent a Success msg */
-#define CHAPSS_RECHALLENGE 5 /* We've sent another challenge */
-#define CHAPSS_BADAUTH 6 /* We've sent a Failure msg */
-
-/************************
-*** PUBLIC DATA TYPES ***
-************************/
-
-/*
- * Each interface is described by a chap structure.
- */
-
-typedef struct chap_state {
- int unit; /* Interface unit number */
- int clientstate; /* Client state */
- int serverstate; /* Server state */
- u_char challenge[MAX_CHALLENGE_LENGTH]; /* last challenge string sent */
- u_char chal_len; /* challenge length */
- u_char chal_id; /* ID of last challenge */
- u_char chal_type; /* hash algorithm for challenges */
- u_char id; /* Current id */
- char *chal_name; /* Our name to use with challenge */
- int chal_interval; /* Time until we challenge peer again */
- int timeouttime; /* Timeout time in seconds */
- int max_transmits; /* Maximum # of challenge transmissions */
- int chal_transmits; /* Number of transmissions of challenge */
- int resp_transmits; /* Number of transmissions of response */
- u_char response[MAX_RESPONSE_LENGTH]; /* Response to send */
- u_char resp_length; /* length of response */
- u_char resp_id; /* ID for response messages */
- u_char resp_type; /* hash algorithm for responses */
- char *resp_name; /* Our name to send with response */
-} chap_state;
-
-
-/******************
-*** PUBLIC DATA ***
-******************/
-extern chap_state chap[];
-
-extern struct protent chap_protent;
-
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-
-void ChapAuthWithPeer (int, char *, int);
-void ChapAuthPeer (int, char *, int);
-
-#endif /* CHAP_H */
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/chpms.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/chpms.c
deleted file mode 100644
index 01755ba..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/chpms.c
+++ /dev/null
@@ -1,398 +0,0 @@
-/*** WARNING - THIS CODE HAS NOT BEEN FINISHED! ***/
-/*****************************************************************************
-* chpms.c - Network MicroSoft Challenge Handshake Authentication Protocol program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* Copyright (c) 1997 by Global Election Systems Inc. All rights reserved.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-08 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original based on BSD chap_ms.c.
-*****************************************************************************/
-/*
- * chap_ms.c - Microsoft MS-CHAP compatible implementation.
- *
- * Copyright (c) 1995 Eric Rosenquist, Strata Software Limited.
- * http://www.strataware.com/
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Eric Rosenquist. The name of the author may not be used to
- * endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/*
- * Modifications by Lauri Pesonen / lpesonen at clinet.fi, april 1997
- *
- * Implemented LANManager type password response to MS-CHAP challenges.
- * Now pppd provides both NT style and LANMan style blocks, and the
- * prefered is set by option "ms-lanman". Default is to use NT.
- * The hash text (StdText) was taken from Win95 RASAPI32.DLL.
- *
- * You should also use DOMAIN\\USERNAME as described in README.MSCHAP80
- */
-
-#define USE_CRYPT
-
-
-#include "ppp.h"
-
-#if MSCHAP_SUPPORT > 0
-
-#include "md4.h"
-#ifndef USE_CRYPT
-#include "des.h"
-#endif
-#include "chap.h"
-#include "chpms.h"
-#include "pppdebug.h"
-
-
-/*************************/
-/*** LOCAL DEFINITIONS ***/
-/*************************/
-
-
-/************************/
-/*** LOCAL DATA TYPES ***/
-/************************/
-typedef struct {
- u_char LANManResp[24];
- u_char NTResp[24];
- u_char UseNT; /* If 1, ignore the LANMan response field */
-} MS_ChapResponse;
-/* We use MS_CHAP_RESPONSE_LEN, rather than sizeof(MS_ChapResponse),
- in case this struct gets padded. */
-
-
-
-/***********************************/
-/*** LOCAL FUNCTION DECLARATIONS ***/
-/***********************************/
-
-/* XXX Don't know what to do with these. */
-extern void setkey(const char *);
-extern void encrypt(char *, int);
-
-static void DesEncrypt (u_char *, u_char *, u_char *);
-static void MakeKey (u_char *, u_char *);
-
-#ifdef USE_CRYPT
-static void Expand (u_char *, u_char *);
-static void Collapse (u_char *, u_char *);
-#endif
-
-static void ChallengeResponse(
- u_char *challenge, /* IN 8 octets */
- u_char *pwHash, /* IN 16 octets */
- u_char *response /* OUT 24 octets */
-);
-static void ChapMS_NT(
- char *rchallenge,
- int rchallenge_len,
- char *secret,
- int secret_len,
- MS_ChapResponse *response
-);
-static u_char Get7Bits(
- u_char *input,
- int startBit
-);
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-void ChapMS(
- chap_state *cstate,
- char *rchallenge,
- int rchallenge_len,
- char *secret,
- int secret_len
-)
-{
- MS_ChapResponse response;
-#ifdef MSLANMAN
- extern int ms_lanman;
-#endif
-
-#if 0
- CHAPDEBUG((LOG_INFO, "ChapMS: secret is '%.*s'\n", secret_len, secret));
-#endif
- BZERO(&response, sizeof(response));
-
- /* Calculate both always */
- ChapMS_NT(rchallenge, rchallenge_len, secret, secret_len, &response);
-
-#ifdef MSLANMAN
- ChapMS_LANMan(rchallenge, rchallenge_len, secret, secret_len, &response);
-
- /* prefered method is set by option */
- response.UseNT = !ms_lanman;
-#else
- response.UseNT = 1;
-#endif
-
- BCOPY(&response, cstate->response, MS_CHAP_RESPONSE_LEN);
- cstate->resp_length = MS_CHAP_RESPONSE_LEN;
-}
-
-
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-static void ChallengeResponse(
- u_char *challenge, /* IN 8 octets */
- u_char *pwHash, /* IN 16 octets */
- u_char *response /* OUT 24 octets */
-)
-{
- char ZPasswordHash[21];
-
- BZERO(ZPasswordHash, sizeof(ZPasswordHash));
- BCOPY(pwHash, ZPasswordHash, 16);
-
-#if 0
- log_packet(ZPasswordHash, sizeof(ZPasswordHash), "ChallengeResponse - ZPasswordHash", LOG_DEBUG);
-#endif
-
- DesEncrypt(challenge, ZPasswordHash + 0, response + 0);
- DesEncrypt(challenge, ZPasswordHash + 7, response + 8);
- DesEncrypt(challenge, ZPasswordHash + 14, response + 16);
-
-#if 0
- log_packet(response, 24, "ChallengeResponse - response", LOG_DEBUG);
-#endif
-}
-
-
-#ifdef USE_CRYPT
-static void DesEncrypt(
- u_char *clear, /* IN 8 octets */
- u_char *key, /* IN 7 octets */
- u_char *cipher /* OUT 8 octets */
-)
-{
- u_char des_key[8];
- u_char crypt_key[66];
- u_char des_input[66];
-
- MakeKey(key, des_key);
-
- Expand(des_key, crypt_key);
- setkey(crypt_key);
-
-#if 0
- CHAPDEBUG((LOG_INFO, "DesEncrypt: 8 octet input : %02X%02X%02X%02X%02X%02X%02X%02X\n",
- clear[0], clear[1], clear[2], clear[3], clear[4], clear[5], clear[6], clear[7]));
-#endif
-
- Expand(clear, des_input);
- encrypt(des_input, 0);
- Collapse(des_input, cipher);
-
-#if 0
- CHAPDEBUG((LOG_INFO, "DesEncrypt: 8 octet output: %02X%02X%02X%02X%02X%02X%02X%02X\n",
- cipher[0], cipher[1], cipher[2], cipher[3], cipher[4], cipher[5], cipher[6], cipher[7]));
-#endif
-}
-
-#else /* USE_CRYPT */
-
-static void DesEncrypt(
- u_char *clear, /* IN 8 octets */
- u_char *key, /* IN 7 octets */
- u_char *cipher /* OUT 8 octets */
-)
-{
- des_cblock des_key;
- des_key_schedule key_schedule;
-
- MakeKey(key, des_key);
-
- des_set_key(&des_key, key_schedule);
-
-#if 0
- CHAPDEBUG((LOG_INFO, "DesEncrypt: 8 octet input : %02X%02X%02X%02X%02X%02X%02X%02X\n",
- clear[0], clear[1], clear[2], clear[3], clear[4], clear[5], clear[6], clear[7]));
-#endif
-
- des_ecb_encrypt((des_cblock *)clear, (des_cblock *)cipher, key_schedule, 1);
-
-#if 0
- CHAPDEBUG((LOG_INFO, "DesEncrypt: 8 octet output: %02X%02X%02X%02X%02X%02X%02X%02X\n",
- cipher[0], cipher[1], cipher[2], cipher[3], cipher[4], cipher[5], cipher[6], cipher[7]));
-#endif
-}
-
-#endif /* USE_CRYPT */
-
-
-static u_char Get7Bits(
- u_char *input,
- int startBit
-)
-{
- register unsigned int word;
-
- word = (unsigned)input[startBit / 8] << 8;
- word |= (unsigned)input[startBit / 8 + 1];
-
- word >>= 15 - (startBit % 8 + 7);
-
- return word & 0xFE;
-}
-
-#ifdef USE_CRYPT
-
-/* in == 8-byte string (expanded version of the 56-bit key)
- * out == 64-byte string where each byte is either 1 or 0
- * Note that the low-order "bit" is always ignored by by setkey()
- */
-static void Expand(u_char *in, u_char *out)
-{
- int j, c;
- int i;
-
- for(i = 0; i < 64; in++){
- c = *in;
- for(j = 7; j >= 0; j--)
- *out++ = (c >> j) & 01;
- i += 8;
- }
-}
-
-/* The inverse of Expand
- */
-static void Collapse(u_char *in, u_char *out)
-{
- int j;
- int i;
- unsigned int c;
-
- for (i = 0; i < 64; i += 8, out++) {
- c = 0;
- for (j = 7; j >= 0; j--, in++)
- c |= *in << j;
- *out = c & 0xff;
- }
-}
-#endif
-
-static void MakeKey(
- u_char *key, /* IN 56 bit DES key missing parity bits */
- u_char *des_key /* OUT 64 bit DES key with parity bits added */
-)
-{
- des_key[0] = Get7Bits(key, 0);
- des_key[1] = Get7Bits(key, 7);
- des_key[2] = Get7Bits(key, 14);
- des_key[3] = Get7Bits(key, 21);
- des_key[4] = Get7Bits(key, 28);
- des_key[5] = Get7Bits(key, 35);
- des_key[6] = Get7Bits(key, 42);
- des_key[7] = Get7Bits(key, 49);
-
-#ifndef USE_CRYPT
- des_set_odd_parity((des_cblock *)des_key);
-#endif
-
-#if 0
- CHAPDEBUG((LOG_INFO, "MakeKey: 56-bit input : %02X%02X%02X%02X%02X%02X%02X\n",
- key[0], key[1], key[2], key[3], key[4], key[5], key[6]));
- CHAPDEBUG((LOG_INFO, "MakeKey: 64-bit output: %02X%02X%02X%02X%02X%02X%02X%02X\n",
- des_key[0], des_key[1], des_key[2], des_key[3], des_key[4], des_key[5], des_key[6], des_key[7]));
-#endif
-}
-
-static void ChapMS_NT(
- char *rchallenge,
- int rchallenge_len,
- char *secret,
- int secret_len,
- MS_ChapResponse *response
-)
-{
- int i;
- MDstruct md4Context;
- u_char unicodePassword[MAX_NT_PASSWORD * 2];
- static int low_byte_first = -1;
-
- /* Initialize the Unicode version of the secret (== password). */
- /* This implicitly supports 8-bit ISO8859/1 characters. */
- BZERO(unicodePassword, sizeof(unicodePassword));
- for (i = 0; i < secret_len; i++)
- unicodePassword[i * 2] = (u_char)secret[i];
-
- MDbegin(&md4Context);
- MDupdate(&md4Context, unicodePassword, secret_len * 2 * 8); /* Unicode is 2 bytes/char, *8 for bit count */
-
- if (low_byte_first == -1)
- low_byte_first = (htons((unsigned short int)1) != 1);
- if (low_byte_first == 0)
- MDreverse((u_long *)&md4Context); /* sfb 961105 */
-
- MDupdate(&md4Context, NULL, 0); /* Tell MD4 we're done */
-
- ChallengeResponse(rchallenge, (char *)md4Context.buffer, response->NTResp);
-}
-
-#ifdef MSLANMAN
-static u_char *StdText = (u_char *)"KGS!@#$%"; /* key from rasapi32.dll */
-
-static ChapMS_LANMan(
- char *rchallenge,
- int rchallenge_len,
- char *secret,
- int secret_len,
- MS_ChapResponse *response
-)
-{
- int i;
- u_char UcasePassword[MAX_NT_PASSWORD]; /* max is actually 14 */
- u_char PasswordHash[16];
-
- /* LANMan password is case insensitive */
- BZERO(UcasePassword, sizeof(UcasePassword));
- for (i = 0; i < secret_len; i++)
- UcasePassword[i] = (u_char)toupper(secret[i]);
- DesEncrypt( StdText, UcasePassword + 0, PasswordHash + 0 );
- DesEncrypt( StdText, UcasePassword + 7, PasswordHash + 8 );
- ChallengeResponse(rchallenge, PasswordHash, response->LANManResp);
-}
-#endif
-
-#endif /* MSCHAP_SUPPORT */
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/chpms.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/chpms.h
deleted file mode 100644
index cfb2047..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/chpms.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*****************************************************************************
-* chpms.h - Network Microsoft Challenge Handshake Protocol header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1998 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 98-01-30 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original built from BSD network code.
-******************************************************************************/
-/*
- * chap.h - Challenge Handshake Authentication Protocol definitions.
- *
- * Copyright (c) 1995 Eric Rosenquist, Strata Software Limited.
- * http://www.strataware.com/
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Eric Rosenquist. The name of the author may not be used to
- * endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id: chpms.h $
- */
-
-#ifndef CHPMS_H
-#define CHPMS_H
-
-#define MAX_NT_PASSWORD 256 /* Maximum number of (Unicode) chars in an NT password */
-
-void ChapMS (chap_state *, char *, int, char *, int);
-
-#endif /* CHPMS_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/fsm.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/fsm.c
deleted file mode 100644
index fe8b38a..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/fsm.c
+++ /dev/null
@@ -1,838 +0,0 @@
-/*****************************************************************************
-* fsm.c - Network Control Protocol Finite State Machine program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-01 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original based on BSD fsm.c.
-*****************************************************************************/
-/*
- * fsm.c - {Link, IP} Control Protocol Finite State Machine.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-
-/*
- * TODO:
- * Randomize fsm id on link/init.
- * Deal with variable outgoing MTU.
- */
-
-#include "ppp.h"
-#if PPP_SUPPORT > 0
-#include "fsm.h"
-#include "pppdebug.h"
-
-
-/*************************/
-/*** LOCAL DEFINITIONS ***/
-/*************************/
-
-
-/************************/
-/*** LOCAL DATA TYPES ***/
-/************************/
-
-
-/***********************************/
-/*** LOCAL FUNCTION DECLARATIONS ***/
-/***********************************/
-static void fsm_timeout (void *);
-static void fsm_rconfreq (fsm *, u_char, u_char *, int);
-static void fsm_rconfack (fsm *, int, u_char *, int);
-static void fsm_rconfnakrej (fsm *, int, int, u_char *, int);
-static void fsm_rtermreq (fsm *, int, u_char *, int);
-static void fsm_rtermack (fsm *);
-static void fsm_rcoderej (fsm *, u_char *, int);
-static void fsm_sconfreq (fsm *, int);
-
-#define PROTO_NAME(f) ((f)->callbacks->proto_name)
-
-
-/******************************/
-/*** PUBLIC DATA STRUCTURES ***/
-/******************************/
-
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-int peer_mru[NUM_PPP];
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-
-/*
- * fsm_init - Initialize fsm.
- *
- * Initialize fsm state.
- */
-void fsm_init(fsm *f)
-{
- f->state = INITIAL;
- f->flags = 0;
- f->id = 0; /* XXX Start with random id? */
- f->timeouttime = FSM_DEFTIMEOUT;
- f->maxconfreqtransmits = FSM_DEFMAXCONFREQS;
- f->maxtermtransmits = FSM_DEFMAXTERMREQS;
- f->maxnakloops = FSM_DEFMAXNAKLOOPS;
- f->term_reason_len = 0;
-}
-
-
-/*
- * fsm_lowerup - The lower layer is up.
- */
-void fsm_lowerup(fsm *f)
-{
- int oldState = f->state;
-
- switch( f->state ){
- case INITIAL:
- f->state = CLOSED;
- break;
-
- case STARTING:
- if( f->flags & OPT_SILENT )
- f->state = STOPPED;
- else {
- /* Send an initial configure-request */
- fsm_sconfreq(f, 0);
- f->state = REQSENT;
- }
- break;
-
- default:
- FSMDEBUG((LOG_INFO, "%s: Up event in state %d!\n",
- PROTO_NAME(f), f->state));
- }
-
- FSMDEBUG((LOG_INFO, "%s: lowerup state %d -> %d\n",
- PROTO_NAME(f), oldState, f->state));
-}
-
-
-/*
- * fsm_lowerdown - The lower layer is down.
- *
- * Cancel all timeouts and inform upper layers.
- */
-void fsm_lowerdown(fsm *f)
-{
- int oldState = f->state;
-
- switch( f->state ){
- case CLOSED:
- f->state = INITIAL;
- break;
-
- case STOPPED:
- f->state = STARTING;
- if( f->callbacks->starting )
- (*f->callbacks->starting)(f);
- break;
-
- case CLOSING:
- f->state = INITIAL;
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- break;
-
- case STOPPING:
- case REQSENT:
- case ACKRCVD:
- case ACKSENT:
- f->state = STARTING;
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- break;
-
- case OPENED:
- if( f->callbacks->down )
- (*f->callbacks->down)(f);
- f->state = STARTING;
- break;
-
- default:
- FSMDEBUG((LOG_INFO, "%s: Down event in state %d!\n",
- PROTO_NAME(f), f->state));
- }
-
- FSMDEBUG((LOG_INFO, "%s: lowerdown state %d -> %d\n",
- PROTO_NAME(f), oldState, f->state));
-}
-
-
-/*
- * fsm_open - Link is allowed to come up.
- */
-void fsm_open(fsm *f)
-{
- int oldState = f->state;
-
- switch( f->state ){
- case INITIAL:
- f->state = STARTING;
- if( f->callbacks->starting )
- (*f->callbacks->starting)(f);
- break;
-
- case CLOSED:
- if( f->flags & OPT_SILENT )
- f->state = STOPPED;
- else {
- /* Send an initial configure-request */
- fsm_sconfreq(f, 0);
- f->state = REQSENT;
- }
- break;
-
- case CLOSING:
- f->state = STOPPING;
- /* fall through */
- case STOPPED:
- case OPENED:
- if( f->flags & OPT_RESTART ){
- fsm_lowerdown(f);
- fsm_lowerup(f);
- }
- break;
- }
-
- FSMDEBUG((LOG_INFO, "%s: open state %d -> %d\n",
- PROTO_NAME(f), oldState, f->state));
-}
-
-
-/*
- * fsm_close - Start closing connection.
- *
- * Cancel timeouts and either initiate close or possibly go directly to
- * the CLOSED state.
- */
-void fsm_close(fsm *f, char *reason)
-{
- int oldState = f->state;
-
- f->term_reason = reason;
- f->term_reason_len = (reason == NULL? 0: strlen(reason));
- switch( f->state ){
- case STARTING:
- f->state = INITIAL;
- break;
- case STOPPED:
- f->state = CLOSED;
- break;
- case STOPPING:
- f->state = CLOSING;
- break;
-
- case REQSENT:
- case ACKRCVD:
- case ACKSENT:
- case OPENED:
- if( f->state != OPENED )
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- else if( f->callbacks->down )
- (*f->callbacks->down)(f); /* Inform upper layers we're down */
-
- /* Init restart counter, send Terminate-Request */
- f->retransmits = f->maxtermtransmits;
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
- (u_char *) f->term_reason, f->term_reason_len);
- TIMEOUT(fsm_timeout, f, f->timeouttime);
- --f->retransmits;
-
- f->state = CLOSING;
- break;
- }
-
- FSMDEBUG((LOG_INFO, "%s: close reason=%s state %d -> %d\n",
- PROTO_NAME(f), reason, oldState, f->state));
-}
-
-
-/*
- * fsm_sdata - Send some data.
- *
- * Used for all packets sent to our peer by this module.
- */
-void fsm_sdata(
- fsm *f,
- u_char code,
- u_char id,
- u_char *data,
- int datalen
-)
-{
- u_char *outp;
- int outlen;
-
- /* Adjust length to be smaller than MTU */
- outp = outpacket_buf[f->unit];
- if (datalen > peer_mru[f->unit] - (int)HEADERLEN)
- datalen = peer_mru[f->unit] - HEADERLEN;
- if (datalen && data != outp + PPP_HDRLEN + HEADERLEN)
- BCOPY(data, outp + PPP_HDRLEN + HEADERLEN, datalen);
- outlen = datalen + HEADERLEN;
- MAKEHEADER(outp, f->protocol);
- PUTCHAR(code, outp);
- PUTCHAR(id, outp);
- PUTSHORT(outlen, outp);
- pppWrite(f->unit, outpacket_buf[f->unit], outlen + PPP_HDRLEN);
- FSMDEBUG((LOG_INFO, "fsm_sdata(%s): Sent code %d,%d,%d.\n",
- PROTO_NAME(f), code, id, outlen));
-}
-
-
-/*
- * fsm_input - Input packet.
- */
-void fsm_input(fsm *f, u_char *inpacket, int l)
-{
- u_char *inp = inpacket;
- u_char code, id;
- int len;
-
- /*
- * Parse header (code, id and length).
- * If packet too short, drop it.
- */
- if (l < HEADERLEN) {
- FSMDEBUG((LOG_WARNING, "fsm_input(%x): Rcvd short header.\n",
- f->protocol));
- return;
- }
- GETCHAR(code, inp);
- GETCHAR(id, inp);
- GETSHORT(len, inp);
- if (len < HEADERLEN) {
- FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd illegal length.\n",
- f->protocol));
- return;
- }
- if (len > l) {
- FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd short packet.\n",
- f->protocol));
- return;
- }
- len -= HEADERLEN; /* subtract header length */
-
- if( f->state == INITIAL || f->state == STARTING ){
- FSMDEBUG((LOG_INFO, "fsm_input(%x): Rcvd packet in state %d.\n",
- f->protocol, f->state));
- return;
- }
- FSMDEBUG((LOG_INFO, "fsm_input(%s):%d,%d,%d\n", PROTO_NAME(f), code, id, l));
- /*
- * Action depends on code.
- */
- switch (code) {
- case CONFREQ:
- fsm_rconfreq(f, id, inp, len);
- break;
-
- case CONFACK:
- fsm_rconfack(f, id, inp, len);
- break;
-
- case CONFNAK:
- case CONFREJ:
- fsm_rconfnakrej(f, code, id, inp, len);
- break;
-
- case TERMREQ:
- fsm_rtermreq(f, id, inp, len);
- break;
-
- case TERMACK:
- fsm_rtermack(f);
- break;
-
- case CODEREJ:
- fsm_rcoderej(f, inp, len);
- break;
-
- default:
- if( !f->callbacks->extcode
- || !(*f->callbacks->extcode)(f, code, id, inp, len) )
- fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);
- break;
- }
-}
-
-
-/*
- * fsm_protreject - Peer doesn't speak this protocol.
- *
- * Treat this as a catastrophic error (RXJ-).
- */
-void fsm_protreject(fsm *f)
-{
- switch( f->state ){
- case CLOSING:
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- /* fall through */
- case CLOSED:
- f->state = CLOSED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- break;
-
- case STOPPING:
- case REQSENT:
- case ACKRCVD:
- case ACKSENT:
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- /* fall through */
- case STOPPED:
- f->state = STOPPED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- break;
-
- case OPENED:
- if( f->callbacks->down )
- (*f->callbacks->down)(f);
-
- /* Init restart counter, send Terminate-Request */
- f->retransmits = f->maxtermtransmits;
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
- (u_char *) f->term_reason, f->term_reason_len);
- TIMEOUT(fsm_timeout, f, f->timeouttime);
- --f->retransmits;
-
- f->state = STOPPING;
- break;
-
- default:
- FSMDEBUG((LOG_INFO, "%s: Protocol-reject event in state %d!\n",
- PROTO_NAME(f), f->state));
- }
-}
-
-
-
-
-
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-
-/*
- * fsm_timeout - Timeout expired.
- */
-static void fsm_timeout(void *arg)
-{
- fsm *f = (fsm *) arg;
-
- switch (f->state) {
- case CLOSING:
- case STOPPING:
- if( f->retransmits <= 0 ){
- FSMDEBUG((LOG_WARNING, "%s: timeout sending Terminate-Request state=%d\n",
- PROTO_NAME(f), f->state));
- /*
- * We've waited for an ack long enough. Peer probably heard us.
- */
- f->state = (f->state == CLOSING)? CLOSED: STOPPED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- } else {
- FSMDEBUG((LOG_WARNING, "%s: timeout resending Terminate-Requests state=%d\n",
- PROTO_NAME(f), f->state));
- /* Send Terminate-Request */
- fsm_sdata(f, TERMREQ, f->reqid = ++f->id,
- (u_char *) f->term_reason, f->term_reason_len);
- TIMEOUT(fsm_timeout, f, f->timeouttime);
- --f->retransmits;
- }
- break;
-
- case REQSENT:
- case ACKRCVD:
- case ACKSENT:
- if (f->retransmits <= 0) {
- FSMDEBUG((LOG_WARNING, "%s: timeout sending Config-Requests state=%d\n",
- PROTO_NAME(f), f->state));
- f->state = STOPPED;
- if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )
- (*f->callbacks->finished)(f);
-
- } else {
- FSMDEBUG((LOG_WARNING, "%s: timeout resending Config-Request state=%d\n",
- PROTO_NAME(f), f->state));
- /* Retransmit the configure-request */
- if (f->callbacks->retransmit)
- (*f->callbacks->retransmit)(f);
- fsm_sconfreq(f, 1); /* Re-send Configure-Request */
- if( f->state == ACKRCVD )
- f->state = REQSENT;
- }
- break;
-
- default:
- FSMDEBUG((LOG_INFO, "%s: Timeout event in state %d!\n",
- PROTO_NAME(f), f->state));
- }
-}
-
-
-/*
- * fsm_rconfreq - Receive Configure-Request.
- */
-static void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len)
-{
- int code, reject_if_disagree;
-
- FSMDEBUG((LOG_INFO, "fsm_rconfreq(%s): Rcvd id %d state=%d\n",
- PROTO_NAME(f), id, f->state));
- switch( f->state ){
- case CLOSED:
- /* Go away, we're closed */
- fsm_sdata(f, TERMACK, id, NULL, 0);
- return;
- case CLOSING:
- case STOPPING:
- return;
-
- case OPENED:
- /* Go down and restart negotiation */
- if( f->callbacks->down )
- (*f->callbacks->down)(f); /* Inform upper layers */
- fsm_sconfreq(f, 0); /* Send initial Configure-Request */
- break;
-
- case STOPPED:
- /* Negotiation started by our peer */
- fsm_sconfreq(f, 0); /* Send initial Configure-Request */
- f->state = REQSENT;
- break;
- }
-
- /*
- * Pass the requested configuration options
- * to protocol-specific code for checking.
- */
- if (f->callbacks->reqci){ /* Check CI */
- reject_if_disagree = (f->nakloops >= f->maxnakloops);
- code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);
- }
- else if (len)
- code = CONFREJ; /* Reject all CI */
- else
- code = CONFACK;
-
- /* send the Ack, Nak or Rej to the peer */
- fsm_sdata(f, (u_char)code, id, inp, len);
-
- if (code == CONFACK) {
- if (f->state == ACKRCVD) {
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- f->state = OPENED;
- if (f->callbacks->up)
- (*f->callbacks->up)(f); /* Inform upper layers */
- }
- else
- f->state = ACKSENT;
- f->nakloops = 0;
- }
- else {
- /* we sent CONFACK or CONFREJ */
- if (f->state != ACKRCVD)
- f->state = REQSENT;
- if( code == CONFNAK )
- ++f->nakloops;
- }
-}
-
-
-/*
- * fsm_rconfack - Receive Configure-Ack.
- */
-static void fsm_rconfack(fsm *f, int id, u_char *inp, int len)
-{
- FSMDEBUG((LOG_INFO, "fsm_rconfack(%s): Rcvd id %d state=%d\n",
- PROTO_NAME(f), id, f->state));
-
- if (id != f->reqid || f->seen_ack) /* Expected id? */
- return; /* Nope, toss... */
- if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):
- (len == 0)) ){
- /* Ack is bad - ignore it */
- FSMDEBUG((LOG_INFO, "%s: received bad Ack (length %d)\n",
- PROTO_NAME(f), len));
- return;
- }
- f->seen_ack = 1;
-
- switch (f->state) {
- case CLOSED:
- case STOPPED:
- fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);
- break;
-
- case REQSENT:
- f->state = ACKRCVD;
- f->retransmits = f->maxconfreqtransmits;
- break;
-
- case ACKRCVD:
- /* Huh? an extra valid Ack? oh well... */
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- fsm_sconfreq(f, 0);
- f->state = REQSENT;
- break;
-
- case ACKSENT:
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- f->state = OPENED;
- f->retransmits = f->maxconfreqtransmits;
- if (f->callbacks->up)
- (*f->callbacks->up)(f); /* Inform upper layers */
- break;
-
- case OPENED:
- /* Go down and restart negotiation */
- if (f->callbacks->down)
- (*f->callbacks->down)(f); /* Inform upper layers */
- fsm_sconfreq(f, 0); /* Send initial Configure-Request */
- f->state = REQSENT;
- break;
- }
-}
-
-
-/*
- * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.
- */
-static void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len)
-{
- int (*proc) (fsm *, u_char *, int);
- int ret;
-
- FSMDEBUG((LOG_INFO, "fsm_rconfnakrej(%s): Rcvd id %d state=%d\n",
- PROTO_NAME(f), id, f->state));
-
- if (id != f->reqid || f->seen_ack) /* Expected id? */
- return; /* Nope, toss... */
- proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci;
- if (!proc || !(ret = proc(f, inp, len))) {
- /* Nak/reject is bad - ignore it */
- FSMDEBUG((LOG_INFO, "%s: received bad %s (length %d)\n",
- PROTO_NAME(f), (code==CONFNAK? "Nak": "reject"), len));
- return;
- }
- f->seen_ack = 1;
-
- switch (f->state) {
- case CLOSED:
- case STOPPED:
- fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);
- break;
-
- case REQSENT:
- case ACKSENT:
- /* They didn't agree to what we wanted - try another request */
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- if (ret < 0)
- f->state = STOPPED; /* kludge for stopping CCP */
- else
- fsm_sconfreq(f, 0); /* Send Configure-Request */
- break;
-
- case ACKRCVD:
- /* Got a Nak/reject when we had already had an Ack?? oh well... */
- UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */
- fsm_sconfreq(f, 0);
- f->state = REQSENT;
- break;
-
- case OPENED:
- /* Go down and restart negotiation */
- if (f->callbacks->down)
- (*f->callbacks->down)(f); /* Inform upper layers */
- fsm_sconfreq(f, 0); /* Send initial Configure-Request */
- f->state = REQSENT;
- break;
- }
-}
-
-
-/*
- * fsm_rtermreq - Receive Terminate-Req.
- */
-static void fsm_rtermreq(fsm *f, int id, u_char *p, int len)
-{
- FSMDEBUG((LOG_INFO, "fsm_rtermreq(%s): Rcvd id %d state=%d\n",
- PROTO_NAME(f), id, f->state));
-
- switch (f->state) {
- case ACKRCVD:
- case ACKSENT:
- f->state = REQSENT; /* Start over but keep trying */
- break;
-
- case OPENED:
- if (len > 0) {
- FSMDEBUG((LOG_INFO, "%s terminated by peer (%x)\n", PROTO_NAME(f), p));
- } else {
- FSMDEBUG((LOG_INFO, "%s terminated by peer\n", PROTO_NAME(f)));
- }
- if (f->callbacks->down)
- (*f->callbacks->down)(f); /* Inform upper layers */
- f->retransmits = 0;
- f->state = STOPPING;
- TIMEOUT(fsm_timeout, f, f->timeouttime);
- break;
- }
-
- fsm_sdata(f, TERMACK, (u_char)id, NULL, 0);
-}
-
-
-/*
- * fsm_rtermack - Receive Terminate-Ack.
- */
-static void fsm_rtermack(fsm *f)
-{
- FSMDEBUG((LOG_INFO, "fsm_rtermack(%s): state=%d\n",
- PROTO_NAME(f), f->state));
-
- switch (f->state) {
- case CLOSING:
- UNTIMEOUT(fsm_timeout, f);
- f->state = CLOSED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- break;
- case STOPPING:
- UNTIMEOUT(fsm_timeout, f);
- f->state = STOPPED;
- if( f->callbacks->finished )
- (*f->callbacks->finished)(f);
- break;
-
- case ACKRCVD:
- f->state = REQSENT;
- break;
-
- case OPENED:
- if (f->callbacks->down)
- (*f->callbacks->down)(f); /* Inform upper layers */
- fsm_sconfreq(f, 0);
- break;
- }
-}
-
-
-/*
- * fsm_rcoderej - Receive an Code-Reject.
- */
-static void fsm_rcoderej(fsm *f, u_char *inp, int len)
-{
- u_char code, id;
-
- FSMDEBUG((LOG_INFO, "fsm_rcoderej(%s): state=%d\n",
- PROTO_NAME(f), f->state));
-
- if (len < HEADERLEN) {
- FSMDEBUG((LOG_INFO, "fsm_rcoderej: Rcvd short Code-Reject packet!\n"));
- return;
- }
- GETCHAR(code, inp);
- GETCHAR(id, inp);
- FSMDEBUG((LOG_WARNING, "%s: Rcvd Code-Reject for code %d, id %d\n",
- PROTO_NAME(f), code, id));
-
- if( f->state == ACKRCVD )
- f->state = REQSENT;
-}
-
-
-/*
- * fsm_sconfreq - Send a Configure-Request.
- */
-static void fsm_sconfreq(fsm *f, int retransmit)
-{
- u_char *outp;
- int cilen;
-
- if( f->state != REQSENT && f->state != ACKRCVD && f->state != ACKSENT ){
- /* Not currently negotiating - reset options */
- if( f->callbacks->resetci )
- (*f->callbacks->resetci)(f);
- f->nakloops = 0;
- }
-
- if( !retransmit ){
- /* New request - reset retransmission counter, use new ID */
- f->retransmits = f->maxconfreqtransmits;
- f->reqid = ++f->id;
- }
-
- f->seen_ack = 0;
-
- /*
- * Make up the request packet
- */
- outp = outpacket_buf[f->unit] + PPP_HDRLEN + HEADERLEN;
- if( f->callbacks->cilen && f->callbacks->addci ){
- cilen = (*f->callbacks->cilen)(f);
- if( cilen > peer_mru[f->unit] - (int)HEADERLEN )
- cilen = peer_mru[f->unit] - HEADERLEN;
- if (f->callbacks->addci)
- (*f->callbacks->addci)(f, outp, &cilen);
- } else
- cilen = 0;
-
- /* send the request to our peer */
- fsm_sdata(f, CONFREQ, f->reqid, outp, cilen);
-
- /* start the retransmit timer */
- --f->retransmits;
- TIMEOUT(fsm_timeout, f, f->timeouttime);
-
- FSMDEBUG((LOG_INFO, "%s: sending Configure-Request, id %d\n",
- PROTO_NAME(f), f->reqid));
-}
-
-#endif /* PPP_SUPPORT */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/fsm.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/fsm.h
deleted file mode 100644
index 17bdd4a..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/fsm.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/*****************************************************************************
-* fsm.h - Network Control Protocol Finite State Machine header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* Copyright (c) 1997 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-11-05 Guy Lancaster <glanca at gesn.com>, Global Election Systems Inc.
-* Original based on BSD code.
-*****************************************************************************/
-/*
- * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id: fsm.h $
- */
-
-#ifndef FSM_H
-#define FSM_H
-
-
-/*****************************************************************************
-************************* PUBLIC DEFINITIONS *********************************
-*****************************************************************************/
-/*
- * LCP Packet header = Code, id, length.
- */
-#define HEADERLEN (sizeof (u_char) + sizeof (u_char) + sizeof (u_short))
-
-
-/*
- * CP (LCP, IPCP, etc.) codes.
- */
-#define CONFREQ 1 /* Configuration Request */
-#define CONFACK 2 /* Configuration Ack */
-#define CONFNAK 3 /* Configuration Nak */
-#define CONFREJ 4 /* Configuration Reject */
-#define TERMREQ 5 /* Termination Request */
-#define TERMACK 6 /* Termination Ack */
-#define CODEREJ 7 /* Code Reject */
-
-/*
- * Link states.
- */
-#define INITIAL 0 /* Down, hasn't been opened */
-#define STARTING 1 /* Down, been opened */
-#define CLOSED 2 /* Up, hasn't been opened */
-#define STOPPED 3 /* Open, waiting for down event */
-#define CLOSING 4 /* Terminating the connection, not open */
-#define STOPPING 5 /* Terminating, but open */
-#define REQSENT 6 /* We've sent a Config Request */
-#define ACKRCVD 7 /* We've received a Config Ack */
-#define ACKSENT 8 /* We've sent a Config Ack */
-#define OPENED 9 /* Connection available */
-
-
-/*
- * Flags - indicate options controlling FSM operation
- */
-#define OPT_PASSIVE 1 /* Don't die if we don't get a response */
-#define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */
-#define OPT_SILENT 4 /* Wait for peer to speak first */
-
-
-/*****************************************************************************
-************************* PUBLIC DATA TYPES **********************************
-*****************************************************************************/
-/*
- * Each FSM is described by an fsm structure and fsm callbacks.
- */
-typedef struct fsm {
- int unit; /* Interface unit number */
- u_short protocol; /* Data Link Layer Protocol field value */
- int state; /* State */
- int flags; /* Contains option bits */
- u_char id; /* Current id */
- u_char reqid; /* Current request id */
- u_char seen_ack; /* Have received valid Ack/Nak/Rej to Req */
- int timeouttime; /* Timeout time in milliseconds */
- int maxconfreqtransmits;/* Maximum Configure-Request transmissions */
- int retransmits; /* Number of retransmissions left */
- int maxtermtransmits; /* Maximum Terminate-Request transmissions */
- int nakloops; /* Number of nak loops since last ack */
- int maxnakloops; /* Maximum number of nak loops tolerated */
- struct fsm_callbacks* callbacks;/* Callback routines */
- char* term_reason; /* Reason for closing protocol */
- int term_reason_len; /* Length of term_reason */
-} fsm;
-
-
-typedef struct fsm_callbacks {
- void (*resetci) /* Reset our Configuration Information */
- (fsm*);
- int (*cilen) /* Length of our Configuration Information */
- (fsm*);
- void (*addci) /* Add our Configuration Information */
- (fsm*, u_char*, int*);
- int (*ackci) /* ACK our Configuration Information */
- (fsm*, u_char*, int);
- int (*nakci) /* NAK our Configuration Information */
- (fsm*, u_char*, int);
- int (*rejci) /* Reject our Configuration Information */
- (fsm*, u_char*, int);
- int (*reqci) /* Request peer's Configuration Information */
- (fsm*, u_char*, int*, int);
- void (*up) /* Called when fsm reaches OPENED state */
- (fsm*);
- void (*down) /* Called when fsm leaves OPENED state */
- (fsm*);
- void (*starting) /* Called when we want the lower layer */
- (fsm*);
- void (*finished) /* Called when we don't want the lower layer */
- (fsm*);
- void (*protreject) /* Called when Protocol-Reject received */
- (int);
- void (*retransmit) /* Retransmission is necessary */
- (fsm*);
- int (*extcode) /* Called when unknown code received */
- (fsm*, int, u_char, u_char*, int);
- char *proto_name; /* String name for protocol (for messages) */
-} fsm_callbacks;
-
-
-/*****************************************************************************
-*********************** PUBLIC DATA STRUCTURES *******************************
-*****************************************************************************/
-/*
- * Variables
- */
-extern int peer_mru[]; /* currently negotiated peer MRU (per unit) */
-
-
-/*****************************************************************************
-************************** PUBLIC FUNCTIONS **********************************
-*****************************************************************************/
-
-/*
- * Prototypes
- */
-void fsm_init (fsm*);
-void fsm_lowerup (fsm*);
-void fsm_lowerdown (fsm*);
-void fsm_open (fsm*);
-void fsm_close (fsm*, char*);
-void fsm_input (fsm*, u_char*, int);
-void fsm_protreject (fsm*);
-void fsm_sdata (fsm*, u_char, u_char, u_char*, int);
-
-
-#endif /* FSM_H */
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/ipcp.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/ipcp.c
deleted file mode 100644
index d5b2518..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/ipcp.c
+++ /dev/null
@@ -1,1377 +0,0 @@
-/*****************************************************************************
-* ipcp.c - Network PPP IP Control Protocol program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-08 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original.
-*****************************************************************************/
-/*
- * ipcp.c - PPP IP Control Protocol.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include <string.h>
-
-#include "ppp.h"
-#if PPP_SUPPORT > 0
-#include "auth.h"
-#include "fsm.h"
-#include "vj.h"
-#include "ipcp.h"
-#include "pppdebug.h"
-
-
-/*************************/
-/*** LOCAL DEFINITIONS ***/
-/*************************/
-/* #define OLD_CI_ADDRS 1 */ /* Support deprecated address negotiation. */
-
-/*
- * Lengths of configuration options.
- */
-#define CILEN_VOID 2
-#define CILEN_COMPRESS 4 /* min length for compression protocol opt. */
-#define CILEN_VJ 6 /* length for RFC1332 Van-Jacobson opt. */
-#define CILEN_ADDR 6 /* new-style single address option */
-#define CILEN_ADDRS 10 /* old-style dual address option */
-
-
-
-/***********************************/
-/*** LOCAL FUNCTION DECLARATIONS ***/
-/***********************************/
-/*
- * Callbacks for fsm code. (CI = Configuration Information)
- */
-static void ipcp_resetci (fsm *); /* Reset our CI */
-static int ipcp_cilen (fsm *); /* Return length of our CI */
-static void ipcp_addci (fsm *, u_char *, int *); /* Add our CI */
-static int ipcp_ackci (fsm *, u_char *, int); /* Peer ack'd our CI */
-static int ipcp_nakci (fsm *, u_char *, int); /* Peer nak'd our CI */
-static int ipcp_rejci (fsm *, u_char *, int); /* Peer rej'd our CI */
-static int ipcp_reqci (fsm *, u_char *, int *, int); /* Rcv CI */
-static void ipcp_up (fsm *); /* We're UP */
-static void ipcp_down (fsm *); /* We're DOWN */
-#if 0
-static void ipcp_script (fsm *, char *); /* Run an up/down script */
-#endif
-static void ipcp_finished (fsm *); /* Don't need lower layer */
-
-/*
- * Protocol entry points from main code.
- */
-static void ipcp_init (int);
-static void ipcp_open (int);
-static void ipcp_close (int, char *);
-static void ipcp_lowerup (int);
-static void ipcp_lowerdown (int);
-static void ipcp_input (int, u_char *, int);
-static void ipcp_protrej (int);
-
-static void ipcp_clear_addrs (int);
-
-#define CODENAME(x) ((x) == CONFACK ? "ACK" : \
- (x) == CONFNAK ? "NAK" : "REJ")
-
-
-
-/******************************/
-/*** PUBLIC DATA STRUCTURES ***/
-/******************************/
-/* global vars */
-ipcp_options ipcp_wantoptions[NUM_PPP]; /* Options that we want to request */
-ipcp_options ipcp_gotoptions[NUM_PPP]; /* Options that peer ack'd */
-ipcp_options ipcp_allowoptions[NUM_PPP]; /* Options we allow peer to request */
-ipcp_options ipcp_hisoptions[NUM_PPP]; /* Options that we ack'd */
-
-fsm ipcp_fsm[NUM_PPP]; /* IPCP fsm structure */
-
-struct protent ipcp_protent = {
- PPP_IPCP,
- ipcp_init,
- ipcp_input,
- ipcp_protrej,
- ipcp_lowerup,
- ipcp_lowerdown,
- ipcp_open,
- ipcp_close,
-#if 0
- ipcp_printpkt,
- NULL,
-#endif
- 1,
- "IPCP",
-#if 0
- ip_check_options,
- NULL,
- ip_active_pkt
-#endif
-};
-
-
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-/* local vars */
-static int cis_received[NUM_PPP]; /* # Conf-Reqs received */
-static int default_route_set[NUM_PPP]; /* Have set up a default route */
-
-static fsm_callbacks ipcp_callbacks = { /* IPCP callback routines */
- ipcp_resetci, /* Reset our Configuration Information */
- ipcp_cilen, /* Length of our Configuration Information */
- ipcp_addci, /* Add our Configuration Information */
- ipcp_ackci, /* ACK our Configuration Information */
- ipcp_nakci, /* NAK our Configuration Information */
- ipcp_rejci, /* Reject our Configuration Information */
- ipcp_reqci, /* Request peer's Configuration Information */
- ipcp_up, /* Called when fsm reaches OPENED state */
- ipcp_down, /* Called when fsm leaves OPENED state */
- NULL, /* Called when we want the lower layer up */
- ipcp_finished, /* Called when we want the lower layer down */
- NULL, /* Called when Protocol-Reject received */
- NULL, /* Retransmission is necessary */
- NULL, /* Called to handle protocol-specific codes */
- "IPCP" /* String name of protocol */
-};
-
-
-
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-
-/*
- * Non-standard inet_ntoa left here for compat with original ppp
- * sources. Assumes u32_t instead of struct in_addr.
- */
-
-char * _inet_ntoa(u32_t n)
-{
- struct in_addr ia;
- ia.s_addr = n;
- return inet_ntoa(ia);
-}
-
-#define inet_ntoa _inet_ntoa
-
-/*
- * ipcp_init - Initialize IPCP.
- */
-static void ipcp_init(int unit)
-{
- fsm *f = &ipcp_fsm[unit];
- ipcp_options *wo = &ipcp_wantoptions[unit];
- ipcp_options *ao = &ipcp_allowoptions[unit];
-
- f->unit = unit;
- f->protocol = PPP_IPCP;
- f->callbacks = &ipcp_callbacks;
- fsm_init(&ipcp_fsm[unit]);
-
- memset(wo, 0, sizeof(*wo));
- memset(ao, 0, sizeof(*ao));
-
- wo->neg_addr = 1;
- wo->ouraddr = 0;
-#if VJ_SUPPORT > 0
- wo->neg_vj = 1;
-#else
- wo->neg_vj = 0;
-#endif
- wo->vj_protocol = IPCP_VJ_COMP;
- wo->maxslotindex = MAX_SLOTS - 1;
- wo->cflag = 0;
-
- wo->default_route = 1;
-
- ao->neg_addr = 1;
-#if VJ_SUPPORT > 0
- ao->neg_vj = 1;
-#else
- ao->neg_vj = 0;
-#endif
- ao->maxslotindex = MAX_SLOTS - 1;
- ao->cflag = 1;
-
- ao->default_route = 1;
-}
-
-
-/*
- * ipcp_open - IPCP is allowed to come up.
- */
-static void ipcp_open(int unit)
-{
- fsm_open(&ipcp_fsm[unit]);
-}
-
-
-/*
- * ipcp_close - Take IPCP down.
- */
-static void ipcp_close(int unit, char *reason)
-{
- fsm_close(&ipcp_fsm[unit], reason);
-}
-
-
-/*
- * ipcp_lowerup - The lower layer is up.
- */
-static void ipcp_lowerup(int unit)
-{
- fsm_lowerup(&ipcp_fsm[unit]);
-}
-
-
-/*
- * ipcp_lowerdown - The lower layer is down.
- */
-static void ipcp_lowerdown(int unit)
-{
- fsm_lowerdown(&ipcp_fsm[unit]);
-}
-
-
-/*
- * ipcp_input - Input IPCP packet.
- */
-static void ipcp_input(int unit, u_char *p, int len)
-{
- fsm_input(&ipcp_fsm[unit], p, len);
-}
-
-
-/*
- * ipcp_protrej - A Protocol-Reject was received for IPCP.
- *
- * Pretend the lower layer went down, so we shut up.
- */
-static void ipcp_protrej(int unit)
-{
- fsm_lowerdown(&ipcp_fsm[unit]);
-}
-
-
-/*
- * ipcp_resetci - Reset our CI.
- */
-static void ipcp_resetci(fsm *f)
-{
- ipcp_options *wo = &ipcp_wantoptions[f->unit];
-
- wo->req_addr = wo->neg_addr && ipcp_allowoptions[f->unit].neg_addr;
- if (wo->ouraddr == 0)
- wo->accept_local = 1;
- if (wo->hisaddr == 0)
- wo->accept_remote = 1;
- /* Request DNS addresses from the peer */
- wo->req_dns1 = ppp_settings.usepeerdns;
- wo->req_dns2 = ppp_settings.usepeerdns;
- ipcp_gotoptions[f->unit] = *wo;
- cis_received[f->unit] = 0;
-}
-
-
-/*
- * ipcp_cilen - Return length of our CI.
- */
-static int ipcp_cilen(fsm *f)
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- ipcp_options *wo = &ipcp_wantoptions[f->unit];
- ipcp_options *ho = &ipcp_hisoptions[f->unit];
-
-#define LENCIVJ(neg, old) (neg ? (old? CILEN_COMPRESS : CILEN_VJ) : 0)
-#define LENCIADDR(neg, old) (neg ? (old? CILEN_ADDRS : CILEN_ADDR) : 0)
-#define LENCIDNS(neg) (neg ? (CILEN_ADDR) : 0)
-
- /*
- * First see if we want to change our options to the old
- * forms because we have received old forms from the peer.
- */
- if (wo->neg_addr && !go->neg_addr && !go->old_addrs) {
- /* use the old style of address negotiation */
- go->neg_addr = 1;
- go->old_addrs = 1;
- }
- if (wo->neg_vj && !go->neg_vj && !go->old_vj) {
- /* try an older style of VJ negotiation */
- if (cis_received[f->unit] == 0) {
- /* keep trying the new style until we see some CI from the peer */
- go->neg_vj = 1;
- } else {
- /* use the old style only if the peer did */
- if (ho->neg_vj && ho->old_vj) {
- go->neg_vj = 1;
- go->old_vj = 1;
- go->vj_protocol = ho->vj_protocol;
- }
- }
- }
-
- return (LENCIADDR(go->neg_addr, go->old_addrs)
- + LENCIVJ(go->neg_vj, go->old_vj) +
- LENCIDNS(go->req_dns1) +
- LENCIDNS(go->req_dns2));
-}
-
-
-/*
- * ipcp_addci - Add our desired CIs to a packet.
- */
-static void ipcp_addci(fsm *f, u_char *ucp, int *lenp)
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- int len = *lenp;
-
-#define ADDCIVJ(opt, neg, val, old, maxslotindex, cflag) \
- if (neg) { \
- int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \
- if (len >= vjlen) { \
- PUTCHAR(opt, ucp); \
- PUTCHAR(vjlen, ucp); \
- PUTSHORT(val, ucp); \
- if (!old) { \
- PUTCHAR(maxslotindex, ucp); \
- PUTCHAR(cflag, ucp); \
- } \
- len -= vjlen; \
- } else \
- neg = 0; \
- }
-
-#define ADDCIADDR(opt, neg, old, val1, val2) \
- if (neg) { \
- int addrlen = (old? CILEN_ADDRS: CILEN_ADDR); \
- if (len >= addrlen) { \
- u32_t l; \
- PUTCHAR(opt, ucp); \
- PUTCHAR(addrlen, ucp); \
- l = ntohl(val1); \
- PUTLONG(l, ucp); \
- if (old) { \
- l = ntohl(val2); \
- PUTLONG(l, ucp); \
- } \
- len -= addrlen; \
- } else \
- neg = 0; \
- }
-
-#define ADDCIDNS(opt, neg, addr) \
- if (neg) { \
- if (len >= CILEN_ADDR) { \
- u32_t l; \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_ADDR, ucp); \
- l = ntohl(addr); \
- PUTLONG(l, ucp); \
- len -= CILEN_ADDR; \
- } else \
- neg = 0; \
- }
-
- ADDCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), go->neg_addr,
- go->old_addrs, go->ouraddr, go->hisaddr);
-
- ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
- go->maxslotindex, go->cflag);
-
- ADDCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);
-
- ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
-
- *lenp -= len;
-}
-
-
-/*
- * ipcp_ackci - Ack our CIs.
- *
- * Returns:
- * 0 - Ack was bad.
- * 1 - Ack was good.
- */
-static int ipcp_ackci(fsm *f, u_char *p, int len)
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- u_short cilen, citype, cishort;
- u32_t cilong;
- u_char cimaxslotindex, cicflag;
-
- /*
- * CIs must be in exactly the same order that we sent...
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-
-#define ACKCIVJ(opt, neg, val, old, maxslotindex, cflag) \
- if (neg) { \
- int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \
- if ((len -= vjlen) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != vjlen || \
- citype != opt) \
- goto bad; \
- GETSHORT(cishort, p); \
- if (cishort != val) \
- goto bad; \
- if (!old) { \
- GETCHAR(cimaxslotindex, p); \
- if (cimaxslotindex != maxslotindex) \
- goto bad; \
- GETCHAR(cicflag, p); \
- if (cicflag != cflag) \
- goto bad; \
- } \
- }
-
-#define ACKCIADDR(opt, neg, old, val1, val2) \
- if (neg) { \
- int addrlen = (old? CILEN_ADDRS: CILEN_ADDR); \
- u32_t l; \
- if ((len -= addrlen) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != addrlen || \
- citype != opt) \
- goto bad; \
- GETLONG(l, p); \
- cilong = htonl(l); \
- if (val1 != cilong) \
- goto bad; \
- if (old) { \
- GETLONG(l, p); \
- cilong = htonl(l); \
- if (val2 != cilong) \
- goto bad; \
- } \
- }
-
-#define ACKCIDNS(opt, neg, addr) \
- if (neg) { \
- u32_t l; \
- if ((len -= CILEN_ADDR) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_ADDR || \
- citype != opt) \
- goto bad; \
- GETLONG(l, p); \
- cilong = htonl(l); \
- if (addr != cilong) \
- goto bad; \
- }
-
- ACKCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), go->neg_addr,
- go->old_addrs, go->ouraddr, go->hisaddr);
-
- ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,
- go->maxslotindex, go->cflag);
-
- ACKCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);
-
- ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);
-
- /*
- * If there are any remaining CIs, then this packet is bad.
- */
- if (len != 0)
- goto bad;
- return (1);
-
-bad:
- IPCPDEBUG((LOG_INFO, "ipcp_ackci: received bad Ack!\n"));
- return (0);
-}
-
-/*
- * ipcp_nakci - Peer has sent a NAK for some of our CIs.
- * This should not modify any state if the Nak is bad
- * or if IPCP is in the OPENED state.
- *
- * Returns:
- * 0 - Nak was bad.
- * 1 - Nak was good.
- */
-static int ipcp_nakci(fsm *f, u_char *p, int len)
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- u_char cimaxslotindex, cicflag;
- u_char citype, cilen, *next;
- u_short cishort;
- u32_t ciaddr1, ciaddr2, l, cidnsaddr;
- ipcp_options no; /* options we've seen Naks for */
- ipcp_options try; /* options to request next time */
-
- BZERO(&no, sizeof(no));
- try = *go;
-
- /*
- * Any Nak'd CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define NAKCIADDR(opt, neg, old, code) \
- if (go->neg && \
- len >= (cilen = (old? CILEN_ADDRS: CILEN_ADDR)) && \
- p[1] == cilen && \
- p[0] == opt) { \
- len -= cilen; \
- INCPTR(2, p); \
- GETLONG(l, p); \
- ciaddr1 = htonl(l); \
- if (old) { \
- GETLONG(l, p); \
- ciaddr2 = htonl(l); \
- no.old_addrs = 1; \
- } else \
- ciaddr2 = 0; \
- no.neg = 1; \
- code \
- }
-
-#define NAKCIVJ(opt, neg, code) \
- if (go->neg && \
- ((cilen = p[1]) == CILEN_COMPRESS || cilen == CILEN_VJ) && \
- len >= cilen && \
- p[0] == opt) { \
- len -= cilen; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- no.neg = 1; \
- code \
- }
-
-#define NAKCIDNS(opt, neg, code) \
- if (go->neg && \
- ((cilen = p[1]) == CILEN_ADDR) && \
- len >= cilen && \
- p[0] == opt) { \
- len -= cilen; \
- INCPTR(2, p); \
- GETLONG(l, p); \
- cidnsaddr = htonl(l); \
- no.neg = 1; \
- code \
- }
-
- /*
- * Accept the peer's idea of {our,his} address, if different
- * from our idea, only if the accept_{local,remote} flag is set.
- */
- NAKCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), neg_addr, go->old_addrs,
- if (go->accept_local && ciaddr1) { /* Do we know our address? */
- try.ouraddr = ciaddr1;
- IPCPDEBUG((LOG_INFO, "local IP address %s\n",
- inet_ntoa(ciaddr1)));
- }
- if (go->accept_remote && ciaddr2) { /* Does he know his? */
- try.hisaddr = ciaddr2;
- IPCPDEBUG((LOG_INFO, "remote IP address %s\n",
- inet_ntoa(ciaddr2)));
- }
- );
-
- /*
- * Accept the peer's value of maxslotindex provided that it
- * is less than what we asked for. Turn off slot-ID compression
- * if the peer wants. Send old-style compress-type option if
- * the peer wants.
- */
- NAKCIVJ(CI_COMPRESSTYPE, neg_vj,
- if (cilen == CILEN_VJ) {
- GETCHAR(cimaxslotindex, p);
- GETCHAR(cicflag, p);
- if (cishort == IPCP_VJ_COMP) {
- try.old_vj = 0;
- if (cimaxslotindex < go->maxslotindex)
- try.maxslotindex = cimaxslotindex;
- if (!cicflag)
- try.cflag = 0;
- } else {
- try.neg_vj = 0;
- }
- } else {
- if (cishort == IPCP_VJ_COMP || cishort == IPCP_VJ_COMP_OLD) {
- try.old_vj = 1;
- try.vj_protocol = cishort;
- } else {
- try.neg_vj = 0;
- }
- }
- );
-
- NAKCIDNS(CI_MS_DNS1, req_dns1,
- try.dnsaddr[0] = cidnsaddr;
- IPCPDEBUG((LOG_INFO, "primary DNS address %s\n", inet_ntoa(cidnsaddr)));
- );
-
- NAKCIDNS(CI_MS_DNS2, req_dns2,
- try.dnsaddr[1] = cidnsaddr;
- IPCPDEBUG((LOG_INFO, "secondary DNS address %s\n", inet_ntoa(cidnsaddr)));
- );
-
- /*
- * There may be remaining CIs, if the peer is requesting negotiation
- * on an option that we didn't include in our request packet.
- * If they want to negotiate about IP addresses, we comply.
- * If they want us to ask for compression, we refuse.
- */
- while (len > CILEN_VOID) {
- GETCHAR(citype, p);
- GETCHAR(cilen, p);
- if( (len -= cilen) < 0 )
- goto bad;
- next = p + cilen - 2;
-
- switch (citype) {
- case CI_COMPRESSTYPE:
- if (go->neg_vj || no.neg_vj ||
- (cilen != CILEN_VJ && cilen != CILEN_COMPRESS))
- goto bad;
- no.neg_vj = 1;
- break;
- case CI_ADDRS:
- if ((go->neg_addr && go->old_addrs) || no.old_addrs
- || cilen != CILEN_ADDRS)
- goto bad;
- try.neg_addr = 1;
- try.old_addrs = 1;
- GETLONG(l, p);
- ciaddr1 = htonl(l);
- if (ciaddr1 && go->accept_local)
- try.ouraddr = ciaddr1;
- GETLONG(l, p);
- ciaddr2 = htonl(l);
- if (ciaddr2 && go->accept_remote)
- try.hisaddr = ciaddr2;
- no.old_addrs = 1;
- break;
- case CI_ADDR:
- if (go->neg_addr || no.neg_addr || cilen != CILEN_ADDR)
- goto bad;
- try.old_addrs = 0;
- GETLONG(l, p);
- ciaddr1 = htonl(l);
- if (ciaddr1 && go->accept_local)
- try.ouraddr = ciaddr1;
- if (try.ouraddr != 0)
- try.neg_addr = 1;
- no.neg_addr = 1;
- break;
- }
- p = next;
- }
-
- /* If there is still anything left, this packet is bad. */
- if (len != 0)
- goto bad;
-
- /*
- * OK, the Nak is good. Now we can update state.
- */
- if (f->state != OPENED)
- *go = try;
-
- return 1;
-
-bad:
- IPCPDEBUG((LOG_INFO, "ipcp_nakci: received bad Nak!\n"));
- return 0;
-}
-
-
-/*
- * ipcp_rejci - Reject some of our CIs.
- */
-static int ipcp_rejci(fsm *f, u_char *p, int len)
-{
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- u_char cimaxslotindex, ciflag, cilen;
- u_short cishort;
- u32_t cilong;
- ipcp_options try; /* options to request next time */
-
- try = *go;
- /*
- * Any Rejected CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define REJCIADDR(opt, neg, old, val1, val2) \
- if (go->neg && \
- len >= (cilen = old? CILEN_ADDRS: CILEN_ADDR) && \
- p[1] == cilen && \
- p[0] == opt) { \
- u32_t l; \
- len -= cilen; \
- INCPTR(2, p); \
- GETLONG(l, p); \
- cilong = htonl(l); \
- /* Check rejected value. */ \
- if (cilong != val1) \
- goto bad; \
- if (old) { \
- GETLONG(l, p); \
- cilong = htonl(l); \
- /* Check rejected value. */ \
- if (cilong != val2) \
- goto bad; \
- } \
- try.neg = 0; \
- }
-
-#define REJCIVJ(opt, neg, val, old, maxslot, cflag) \
- if (go->neg && \
- p[1] == (old? CILEN_COMPRESS : CILEN_VJ) && \
- len >= p[1] && \
- p[0] == opt) { \
- len -= p[1]; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- /* Check rejected value. */ \
- if (cishort != val) \
- goto bad; \
- if (!old) { \
- GETCHAR(cimaxslotindex, p); \
- if (cimaxslotindex != maxslot) \
- goto bad; \
- GETCHAR(ciflag, p); \
- if (ciflag != cflag) \
- goto bad; \
- } \
- try.neg = 0; \
- }
-
-#define REJCIDNS(opt, neg, dnsaddr) \
- if (go->neg && \
- ((cilen = p[1]) == CILEN_ADDR) && \
- len >= cilen && \
- p[0] == opt) { \
- u32_t l; \
- len -= cilen; \
- INCPTR(2, p); \
- GETLONG(l, p); \
- cilong = htonl(l); \
- /* Check rejected value. */ \
- if (cilong != dnsaddr) \
- goto bad; \
- try.neg = 0; \
- }
-
- REJCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), neg_addr,
- go->old_addrs, go->ouraddr, go->hisaddr);
-
- REJCIVJ(CI_COMPRESSTYPE, neg_vj, go->vj_protocol, go->old_vj,
- go->maxslotindex, go->cflag);
-
- REJCIDNS(CI_MS_DNS1, req_dns1, go->dnsaddr[0]);
-
- REJCIDNS(CI_MS_DNS2, req_dns2, go->dnsaddr[1]);
-
- /*
- * If there are any remaining CIs, then this packet is bad.
- */
- if (len != 0)
- goto bad;
- /*
- * Now we can update state.
- */
- if (f->state != OPENED)
- *go = try;
- return 1;
-
-bad:
- IPCPDEBUG((LOG_INFO, "ipcp_rejci: received bad Reject!\n"));
- return 0;
-}
-
-
-/*
- * ipcp_reqci - Check the peer's requested CIs and send appropriate response.
- *
- * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
- * appropriately. If reject_if_disagree is non-zero, doesn't return
- * CONFNAK; returns CONFREJ if it can't return CONFACK.
- */
-static int ipcp_reqci(
- fsm *f,
- u_char *inp, /* Requested CIs */
- int *len, /* Length of requested CIs */
- int reject_if_disagree
-)
-{
- ipcp_options *wo = &ipcp_wantoptions[f->unit];
- ipcp_options *ho = &ipcp_hisoptions[f->unit];
- ipcp_options *ao = &ipcp_allowoptions[f->unit];
-#ifdef OLD_CI_ADDRS
- ipcp_options *go = &ipcp_gotoptions[f->unit];
-#endif
- u_char *cip, *next; /* Pointer to current and next CIs */
- u_short cilen, citype; /* Parsed len, type */
- u_short cishort; /* Parsed short value */
- u32_t tl, ciaddr1; /* Parsed address values */
-#ifdef OLD_CI_ADDRS
- u32_t ciaddr2; /* Parsed address values */
-#endif
- int rc = CONFACK; /* Final packet return code */
- int orc; /* Individual option return code */
- u_char *p; /* Pointer to next char to parse */
- u_char *ucp = inp; /* Pointer to current output char */
- int l = *len; /* Length left */
- u_char maxslotindex, cflag;
- int d;
-
- cis_received[f->unit] = 1;
-
- /*
- * Reset all his options.
- */
- BZERO(ho, sizeof(*ho));
-
- /*
- * Process all his options.
- */
- next = inp;
- while (l) {
- orc = CONFACK; /* Assume success */
- cip = p = next; /* Remember begining of CI */
- if (l < 2 || /* Not enough data for CI header or */
- p[1] < 2 || /* CI length too small or */
- p[1] > l) { /* CI length too big? */
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: bad CI length!\n"));
- orc = CONFREJ; /* Reject bad CI */
- cilen = l; /* Reject till end of packet */
- l = 0; /* Don't loop again */
- goto endswitch;
- }
- GETCHAR(citype, p); /* Parse CI type */
- GETCHAR(cilen, p); /* Parse CI length */
- l -= cilen; /* Adjust remaining length */
- next += cilen; /* Step to next CI */
-
- switch (citype) { /* Check CI type */
-#ifdef OLD_CI_ADDRS /* Need to save space... */
- case CI_ADDRS:
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: received ADDRS\n"));
- if (!ao->neg_addr ||
- cilen != CILEN_ADDRS) { /* Check CI length */
- orc = CONFREJ; /* Reject CI */
- break;
- }
-
- /*
- * If he has no address, or if we both have his address but
- * disagree about it, then NAK it with our idea.
- * In particular, if we don't know his address, but he does,
- * then accept it.
- */
- GETLONG(tl, p); /* Parse source address (his) */
- ciaddr1 = htonl(tl);
- IPCPDEBUG((LOG_INFO, "his addr %s\n", inet_ntoa(ciaddr1)));
- if (ciaddr1 != wo->hisaddr
- && (ciaddr1 == 0 || !wo->accept_remote)) {
- orc = CONFNAK;
- if (!reject_if_disagree) {
- DECPTR(sizeof(u32_t), p);
- tl = ntohl(wo->hisaddr);
- PUTLONG(tl, p);
- }
- } else if (ciaddr1 == 0 && wo->hisaddr == 0) {
- /*
- * If neither we nor he knows his address, reject the option.
- */
- orc = CONFREJ;
- wo->req_addr = 0; /* don't NAK with 0.0.0.0 later */
- break;
- }
-
- /*
- * If he doesn't know our address, or if we both have our address
- * but disagree about it, then NAK it with our idea.
- */
- GETLONG(tl, p); /* Parse desination address (ours) */
- ciaddr2 = htonl(tl);
- IPCPDEBUG((LOG_INFO, "our addr %s\n", inet_ntoa(ciaddr2)));
- if (ciaddr2 != wo->ouraddr) {
- if (ciaddr2 == 0 || !wo->accept_local) {
- orc = CONFNAK;
- if (!reject_if_disagree) {
- DECPTR(sizeof(u32_t), p);
- tl = ntohl(wo->ouraddr);
- PUTLONG(tl, p);
- }
- } else {
- go->ouraddr = ciaddr2; /* accept peer's idea */
- }
- }
-
- ho->neg_addr = 1;
- ho->old_addrs = 1;
- ho->hisaddr = ciaddr1;
- ho->ouraddr = ciaddr2;
- break;
-#endif
-
- case CI_ADDR:
- if (!ao->neg_addr) {
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Reject ADDR not allowed\n"));
- orc = CONFREJ; /* Reject CI */
- break;
- } else if (cilen != CILEN_ADDR) { /* Check CI length */
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Reject ADDR bad len\n"));
- orc = CONFREJ; /* Reject CI */
- break;
- }
-
- /*
- * If he has no address, or if we both have his address but
- * disagree about it, then NAK it with our idea.
- * In particular, if we don't know his address, but he does,
- * then accept it.
- */
- GETLONG(tl, p); /* Parse source address (his) */
- ciaddr1 = htonl(tl);
- if (ciaddr1 != wo->hisaddr
- && (ciaddr1 == 0 || !wo->accept_remote)) {
- orc = CONFNAK;
- if (!reject_if_disagree) {
- DECPTR(sizeof(u32_t), p);
- tl = ntohl(wo->hisaddr);
- PUTLONG(tl, p);
- }
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Nak ADDR %s\n", inet_ntoa(ciaddr1)));
- } else if (ciaddr1 == 0 && wo->hisaddr == 0) {
- /*
- * Don't ACK an address of 0.0.0.0 - reject it instead.
- */
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Reject ADDR %s\n", inet_ntoa(ciaddr1)));
- orc = CONFREJ;
- wo->req_addr = 0; /* don't NAK with 0.0.0.0 later */
- break;
- }
-
- ho->neg_addr = 1;
- ho->hisaddr = ciaddr1;
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: ADDR %s\n", inet_ntoa(ciaddr1)));
- break;
-
- case CI_MS_DNS1:
- case CI_MS_DNS2:
- /* Microsoft primary or secondary DNS request */
- d = citype == CI_MS_DNS2;
-
- /* If we do not have a DNS address then we cannot send it */
- if (ao->dnsaddr[d] == 0 ||
- cilen != CILEN_ADDR) { /* Check CI length */
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Rejecting DNS%d Request\n", d+1));
- orc = CONFREJ; /* Reject CI */
- break;
- }
- GETLONG(tl, p);
- if (htonl(tl) != ao->dnsaddr[d]) {
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Naking DNS%d Request %d\n",
- d+1, inet_ntoa(tl)));
- DECPTR(sizeof(u32_t), p);
- tl = ntohl(ao->dnsaddr[d]);
- PUTLONG(tl, p);
- orc = CONFNAK;
- }
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: received DNS%d Request\n", d+1));
- break;
-
- case CI_MS_WINS1:
- case CI_MS_WINS2:
- /* Microsoft primary or secondary WINS request */
- d = citype == CI_MS_WINS2;
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: received WINS%d Request\n", d+1));
-
- /* If we do not have a DNS address then we cannot send it */
- if (ao->winsaddr[d] == 0 ||
- cilen != CILEN_ADDR) { /* Check CI length */
- orc = CONFREJ; /* Reject CI */
- break;
- }
- GETLONG(tl, p);
- if (htonl(tl) != ao->winsaddr[d]) {
- DECPTR(sizeof(u32_t), p);
- tl = ntohl(ao->winsaddr[d]);
- PUTLONG(tl, p);
- orc = CONFNAK;
- }
- break;
-
- case CI_COMPRESSTYPE:
- if (!ao->neg_vj) {
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Rejecting COMPRESSTYPE not allowed\n"));
- orc = CONFREJ;
- break;
- } else if (cilen != CILEN_VJ && cilen != CILEN_COMPRESS) {
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Rejecting COMPRESSTYPE len=%d\n", cilen));
- orc = CONFREJ;
- break;
- }
- GETSHORT(cishort, p);
-
- if (!(cishort == IPCP_VJ_COMP ||
- (cishort == IPCP_VJ_COMP_OLD && cilen == CILEN_COMPRESS))) {
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Rejecting COMPRESSTYPE %d\n", cishort));
- orc = CONFREJ;
- break;
- }
-
- ho->neg_vj = 1;
- ho->vj_protocol = cishort;
- if (cilen == CILEN_VJ) {
- GETCHAR(maxslotindex, p);
- if (maxslotindex > ao->maxslotindex) {
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Naking VJ max slot %d\n", maxslotindex));
- orc = CONFNAK;
- if (!reject_if_disagree){
- DECPTR(1, p);
- PUTCHAR(ao->maxslotindex, p);
- }
- }
- GETCHAR(cflag, p);
- if (cflag && !ao->cflag) {
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Naking VJ cflag %d\n", cflag));
- orc = CONFNAK;
- if (!reject_if_disagree){
- DECPTR(1, p);
- PUTCHAR(wo->cflag, p);
- }
- }
- ho->maxslotindex = maxslotindex;
- ho->cflag = cflag;
- } else {
- ho->old_vj = 1;
- ho->maxslotindex = MAX_SLOTS - 1;
- ho->cflag = 1;
- }
- IPCPDEBUG((LOG_INFO,
- "ipcp_reqci: received COMPRESSTYPE p=%d old=%d maxslot=%d cflag=%d\n",
- ho->vj_protocol, ho->old_vj, ho->maxslotindex, ho->cflag));
- break;
-
- default:
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Rejecting unknown CI type %d\n", citype));
- orc = CONFREJ;
- break;
- }
-
-endswitch:
- if (orc == CONFACK && /* Good CI */
- rc != CONFACK) /* but prior CI wasnt? */
- continue; /* Don't send this one */
-
- if (orc == CONFNAK) { /* Nak this CI? */
- if (reject_if_disagree) { /* Getting fed up with sending NAKs? */
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Rejecting too many naks\n"));
- orc = CONFREJ; /* Get tough if so */
- } else {
- if (rc == CONFREJ) /* Rejecting prior CI? */
- continue; /* Don't send this one */
- if (rc == CONFACK) { /* Ack'd all prior CIs? */
- rc = CONFNAK; /* Not anymore... */
- ucp = inp; /* Backup */
- }
- }
- }
-
- if (orc == CONFREJ && /* Reject this CI */
- rc != CONFREJ) { /* but no prior ones? */
- rc = CONFREJ;
- ucp = inp; /* Backup */
- }
-
- /* Need to move CI? */
- if (ucp != cip)
- BCOPY(cip, ucp, cilen); /* Move it */
-
- /* Update output pointer */
- INCPTR(cilen, ucp);
- }
-
- /*
- * If we aren't rejecting this packet, and we want to negotiate
- * their address, and they didn't send their address, then we
- * send a NAK with a CI_ADDR option appended. We assume the
- * input buffer is long enough that we can append the extra
- * option safely.
- */
- if (rc != CONFREJ && !ho->neg_addr &&
- wo->req_addr && !reject_if_disagree) {
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: Requesting peer address\n"));
- if (rc == CONFACK) {
- rc = CONFNAK;
- ucp = inp; /* reset pointer */
- wo->req_addr = 0; /* don't ask again */
- }
- PUTCHAR(CI_ADDR, ucp);
- PUTCHAR(CILEN_ADDR, ucp);
- tl = ntohl(wo->hisaddr);
- PUTLONG(tl, ucp);
- }
-
- *len = (int)(ucp - inp); /* Compute output length */
- IPCPDEBUG((LOG_INFO, "ipcp_reqci: returning Configure-%s\n", CODENAME(rc)));
- return (rc); /* Return final code */
-}
-
-
-#if 0
-/*
- * ip_check_options - check that any IP-related options are OK,
- * and assign appropriate defaults.
- */
-static void ip_check_options(u_long localAddr)
-{
- ipcp_options *wo = &ipcp_wantoptions[0];
-
- /*
- * Load our default IP address but allow the remote host to give us
- * a new address.
- */
- if (wo->ouraddr == 0 && !ppp_settings.disable_defaultip) {
- wo->accept_local = 1; /* don't insist on this default value */
- wo->ouraddr = htonl(localAddr);
- }
-}
-#endif
-
-
-/*
- * ipcp_up - IPCP has come UP.
- *
- * Configure the IP network interface appropriately and bring it up.
- */
-static void ipcp_up(fsm *f)
-{
- u32_t mask;
- ipcp_options *ho = &ipcp_hisoptions[f->unit];
- ipcp_options *go = &ipcp_gotoptions[f->unit];
- ipcp_options *wo = &ipcp_wantoptions[f->unit];
-
- np_up(f->unit, PPP_IP);
- IPCPDEBUG((LOG_INFO, "ipcp: up\n"));
-
- /*
- * We must have a non-zero IP address for both ends of the link.
- */
- if (!ho->neg_addr)
- ho->hisaddr = wo->hisaddr;
-
- if (ho->hisaddr == 0) {
- IPCPDEBUG((LOG_ERR, "Could not determine remote IP address\n"));
- ipcp_close(f->unit, "Could not determine remote IP address");
- return;
- }
- if (go->ouraddr == 0) {
- IPCPDEBUG((LOG_ERR, "Could not determine local IP address\n"));
- ipcp_close(f->unit, "Could not determine local IP address");
- return;
- }
-
- if (ppp_settings.usepeerdns && (go->dnsaddr[0] || go->dnsaddr[1])) {
- /*pppGotDNSAddrs(go->dnsaddr[0], go->dnsaddr[1]);*/
- }
-
- /*
- * Check that the peer is allowed to use the IP address it wants.
- */
- if (!auth_ip_addr(f->unit, ho->hisaddr)) {
- IPCPDEBUG((LOG_ERR, "Peer is not authorized to use remote address %s\n",
- inet_ntoa(ho->hisaddr)));
- ipcp_close(f->unit, "Unauthorized remote IP address");
- return;
- }
-
- /* set tcp compression */
- sifvjcomp(f->unit, ho->neg_vj, ho->cflag, ho->maxslotindex);
-
- /*
- * Set IP addresses and (if specified) netmask.
- */
- mask = GetMask(go->ouraddr);
-
- if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask, go->dnsaddr[0], go->dnsaddr[1])) {
- IPCPDEBUG((LOG_WARNING, "sifaddr failed\n"));
- ipcp_close(f->unit, "Interface configuration failed");
- return;
- }
-
- /* bring the interface up for IP */
- if (!sifup(f->unit)) {
- IPCPDEBUG((LOG_WARNING, "sifup failed\n"));
- ipcp_close(f->unit, "Interface configuration failed");
- return;
- }
-
- sifnpmode(f->unit, PPP_IP, NPMODE_PASS);
-
- /* assign a default route through the interface if required */
- if (ipcp_wantoptions[f->unit].default_route)
- if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr))
- default_route_set[f->unit] = 1;
-
- IPCPDEBUG((LOG_NOTICE, "local IP address %s\n", inet_ntoa(go->ouraddr)));
- IPCPDEBUG((LOG_NOTICE, "remote IP address %s\n", inet_ntoa(ho->hisaddr)));
- if (go->dnsaddr[0]) {
- IPCPDEBUG((LOG_NOTICE, "primary DNS address %s\n", inet_ntoa(go->dnsaddr[0])));
- }
- if (go->dnsaddr[1]) {
- IPCPDEBUG((LOG_NOTICE, "secondary DNS address %s\n", inet_ntoa(go->dnsaddr[1])));
- }
-}
-
-
-/*
- * ipcp_down - IPCP has gone DOWN.
- *
- * Take the IP network interface down, clear its addresses
- * and delete routes through it.
- */
-static void ipcp_down(fsm *f)
-{
- IPCPDEBUG((LOG_INFO, "ipcp: down\n"));
- np_down(f->unit, PPP_IP);
- sifvjcomp(f->unit, 0, 0, 0);
-
- sifdown(f->unit);
- ipcp_clear_addrs(f->unit);
-}
-
-
-/*
- * ipcp_clear_addrs() - clear the interface addresses, routes, etc.
- */
-static void ipcp_clear_addrs(int unit)
-{
- u32_t ouraddr, hisaddr;
-
- ouraddr = ipcp_gotoptions[unit].ouraddr;
- hisaddr = ipcp_hisoptions[unit].hisaddr;
- if (default_route_set[unit]) {
- cifdefaultroute(unit, ouraddr, hisaddr);
- default_route_set[unit] = 0;
- }
- cifaddr(unit, ouraddr, hisaddr);
-}
-
-
-/*
- * ipcp_finished - possibly shut down the lower layers.
- */
-static void ipcp_finished(fsm *f)
-{
- np_finished(f->unit, PPP_IP);
-}
-
-#if 0
-static int ipcp_printpkt(
- u_char *p,
- int plen,
- void (*printer) (void *, char *, ...),
- void *arg
-)
-{
- (void)p;
- (void)plen;
- (void)printer;
- (void)arg;
- return 0;
-}
-
-/*
- * ip_active_pkt - see if this IP packet is worth bringing the link up for.
- * We don't bring the link up for IP fragments or for TCP FIN packets
- * with no data.
- */
-#define IP_HDRLEN 20 /* bytes */
-#define IP_OFFMASK 0x1fff
-#define IPPROTO_TCP 6
-#define TCP_HDRLEN 20
-#define TH_FIN 0x01
-
-/*
- * We use these macros because the IP header may be at an odd address,
- * and some compilers might use word loads to get th_off or ip_hl.
- */
-
-#define net_short(x) (((x)[0] << 8) + (x)[1])
-#define get_iphl(x) (((unsigned char *)(x))[0] & 0xF)
-#define get_ipoff(x) net_short((unsigned char *)(x) + 6)
-#define get_ipproto(x) (((unsigned char *)(x))[9])
-#define get_tcpoff(x) (((unsigned char *)(x))[12] >> 4)
-#define get_tcpflags(x) (((unsigned char *)(x))[13])
-
-static int ip_active_pkt(u_char *pkt, int len)
-{
- u_char *tcp;
- int hlen;
-
- len -= PPP_HDRLEN;
- pkt += PPP_HDRLEN;
- if (len < IP_HDRLEN)
- return 0;
- if ((get_ipoff(pkt) & IP_OFFMASK) != 0)
- return 0;
- if (get_ipproto(pkt) != IPPROTO_TCP)
- return 1;
- hlen = get_iphl(pkt) * 4;
- if (len < hlen + TCP_HDRLEN)
- return 0;
- tcp = pkt + hlen;
- if ((get_tcpflags(tcp) & TH_FIN) != 0 && len == hlen + get_tcpoff(tcp) * 4)
- return 0;
- return 1;
-}
-#endif
-
-#endif /* PPP_SUPPORT */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/ipcp.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/ipcp.h
deleted file mode 100644
index d96c02e..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/ipcp.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*****************************************************************************
-* ipcp.h - PPP IP NCP: Internet Protocol Network Control Protocol header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-04 Guy Lancaster <glanca at gesn.com>, Global Election Systems Inc.
-* Original derived from BSD codes.
-*****************************************************************************/
-/*
- * ipcp.h - IP Control Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id: ipcp.h $
- */
-
-#ifndef IPCP_H
-#define IPCP_H
-
-/*************************
-*** PUBLIC DEFINITIONS ***
-*************************/
-/*
- * Options.
- */
-#define CI_ADDRS 1 /* IP Addresses */
-#define CI_COMPRESSTYPE 2 /* Compression Type */
-#define CI_ADDR 3
-
-#define CI_MS_WINS1 128 /* Primary WINS value */
-#define CI_MS_DNS1 129 /* Primary DNS value */
-#define CI_MS_WINS2 130 /* Secondary WINS value */
-#define CI_MS_DNS2 131 /* Secondary DNS value */
-
-#define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */
-#define IPCP_VJMODE_RFC1172 2 /* "old-rfc"mode (option # = 0x002d) */
-#define IPCP_VJMODE_RFC1332 3 /* "new-rfc"mode (option # = 0x002d, */
- /* maxslot and slot number compression) */
-
-#define IPCP_VJ_COMP 0x002d /* current value for VJ compression option*/
-#define IPCP_VJ_COMP_OLD 0x0037 /* "old" (i.e, broken) value for VJ */
- /* compression option*/
-
-
-/************************
-*** PUBLIC DATA TYPES ***
-************************/
-
-typedef struct ipcp_options {
- u_int neg_addr : 1; /* Negotiate IP Address? */
- u_int old_addrs : 1; /* Use old (IP-Addresses) option? */
- u_int req_addr : 1; /* Ask peer to send IP address? */
- u_int default_route : 1; /* Assign default route through interface? */
- u_int proxy_arp : 1; /* Make proxy ARP entry for peer? */
- u_int neg_vj : 1; /* Van Jacobson Compression? */
- u_int old_vj : 1; /* use old (short) form of VJ option? */
- u_int accept_local : 1; /* accept peer's value for ouraddr */
- u_int accept_remote : 1; /* accept peer's value for hisaddr */
- u_int req_dns1 : 1; /* Ask peer to send primary DNS address? */
- u_int req_dns2 : 1; /* Ask peer to send secondary DNS address? */
- u_short vj_protocol; /* protocol value to use in VJ option */
- u_char maxslotindex; /* VJ slots - 1. */
- u_char cflag; /* VJ slot compression flag. */
- u32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */
- u32_t dnsaddr[2]; /* Primary and secondary MS DNS entries */
- u32_t winsaddr[2]; /* Primary and secondary MS WINS entries */
-} ipcp_options;
-
-
-/*****************************
-*** PUBLIC DATA STRUCTURES ***
-*****************************/
-
-extern fsm ipcp_fsm[];
-extern ipcp_options ipcp_wantoptions[];
-extern ipcp_options ipcp_gotoptions[];
-extern ipcp_options ipcp_allowoptions[];
-extern ipcp_options ipcp_hisoptions[];
-
-extern struct protent ipcp_protent;
-
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-
-
-#endif /* IPCP_H */
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/lcp.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/lcp.c
deleted file mode 100644
index 6a988d6..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/lcp.c
+++ /dev/null
@@ -1,1991 +0,0 @@
-/*****************************************************************************
-* lcp.c - Network Link Control Protocol program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-01 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original.
-*****************************************************************************/
-
-/*
- * lcp.c - PPP Link Control Protocol.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include <string.h>
-
-#include "ppp.h"
-#if PPP_SUPPORT > 0
-#include "fsm.h"
-#include "chap.h"
-#include "magic.h"
-#include "auth.h"
-#include "lcp.h"
-#include "pppdebug.h"
-
-
-/*************************/
-/*** LOCAL DEFINITIONS ***/
-/*************************/
-/*
- * Length of each type of configuration option (in octets)
- */
-#define CILEN_VOID 2
-#define CILEN_CHAR 3
-#define CILEN_SHORT 4 /* CILEN_VOID + sizeof(short) */
-#define CILEN_CHAP 5 /* CILEN_VOID + sizeof(short) + 1 */
-#define CILEN_LONG 6 /* CILEN_VOID + sizeof(long) */
-#define CILEN_LQR 8 /* CILEN_VOID + sizeof(short) + sizeof(long) */
-#define CILEN_CBCP 3
-
-
-/***********************************/
-/*** LOCAL FUNCTION DECLARATIONS ***/
-/***********************************/
-/*
- * Callbacks for fsm code. (CI = Configuration Information)
- */
-static void lcp_resetci (fsm*); /* Reset our CI */
-static int lcp_cilen (fsm*); /* Return length of our CI */
-static void lcp_addci (fsm*, u_char*, int*); /* Add our CI to pkt */
-static int lcp_ackci (fsm*, u_char*, int);/* Peer ack'd our CI */
-static int lcp_nakci (fsm*, u_char*, int);/* Peer nak'd our CI */
-static int lcp_rejci (fsm*, u_char*, int);/* Peer rej'd our CI */
-static int lcp_reqci (fsm*, u_char*, int*, int); /* Rcv peer CI */
-static void lcp_up (fsm*); /* We're UP */
-static void lcp_down (fsm*); /* We're DOWN */
-static void lcp_starting (fsm*); /* We need lower layer up */
-static void lcp_finished (fsm*); /* We need lower layer down */
-static int lcp_extcode (fsm*, int, u_char, u_char*, int);
-
-static void lcp_rprotrej (fsm*, u_char*, int);
-
-/*
- * routines to send LCP echos to peer
- */
-static void lcp_echo_lowerup (int);
-static void lcp_echo_lowerdown (int);
-static void LcpEchoTimeout (void*);
-static void lcp_received_echo_reply (fsm*, int, u_char*, int);
-static void LcpSendEchoRequest (fsm*);
-static void LcpLinkFailure (fsm*);
-static void LcpEchoCheck (fsm*);
-
-/*
- * Protocol entry points.
- * Some of these are called directly.
- */
-static void lcp_input (int, u_char *, int);
-static void lcp_protrej (int);
-
-#define CODENAME(x) ((x) == CONFACK ? "ACK" : \
- (x) == CONFNAK ? "NAK" : "REJ")
-
-
-/******************************/
-/*** PUBLIC DATA STRUCTURES ***/
-/******************************/
-/* global vars */
-LinkPhase lcp_phase[NUM_PPP]; /* Phase of link session (RFC 1661) */
-lcp_options lcp_wantoptions[NUM_PPP]; /* Options that we want to request */
-lcp_options lcp_gotoptions[NUM_PPP]; /* Options that peer ack'd */
-lcp_options lcp_allowoptions[NUM_PPP]; /* Options we allow peer to request */
-lcp_options lcp_hisoptions[NUM_PPP]; /* Options that we ack'd */
-ext_accm xmit_accm[NUM_PPP]; /* extended transmit ACCM */
-
-
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-static fsm lcp_fsm[NUM_PPP]; /* LCP fsm structure (global)*/
-static u_int lcp_echo_interval = LCP_ECHOINTERVAL; /* Interval between LCP echo-requests */
-static u_int lcp_echo_fails = LCP_MAXECHOFAILS; /* Tolerance to unanswered echo-requests */
-static u32_t lcp_echos_pending = 0; /* Number of outstanding echo msgs */
-static u32_t lcp_echo_number = 0; /* ID number of next echo frame */
-static u32_t lcp_echo_timer_running = 0; /* TRUE if a timer is running */
-
-static u_char nak_buffer[PPP_MRU]; /* where we construct a nak packet */
-
-static fsm_callbacks lcp_callbacks = { /* LCP callback routines */
- lcp_resetci, /* Reset our Configuration Information */
- lcp_cilen, /* Length of our Configuration Information */
- lcp_addci, /* Add our Configuration Information */
- lcp_ackci, /* ACK our Configuration Information */
- lcp_nakci, /* NAK our Configuration Information */
- lcp_rejci, /* Reject our Configuration Information */
- lcp_reqci, /* Request peer's Configuration Information */
- lcp_up, /* Called when fsm reaches OPENED state */
- lcp_down, /* Called when fsm leaves OPENED state */
- lcp_starting, /* Called when we want the lower layer up */
- lcp_finished, /* Called when we want the lower layer down */
- NULL, /* Called when Protocol-Reject received */
- NULL, /* Retransmission is necessary */
- lcp_extcode, /* Called to handle LCP-specific codes */
- "LCP" /* String name of protocol */
-};
-
-struct protent lcp_protent = {
- PPP_LCP,
- lcp_init,
- lcp_input,
- lcp_protrej,
- lcp_lowerup,
- lcp_lowerdown,
- lcp_open,
- lcp_close,
-#if 0
- lcp_printpkt,
- NULL,
-#endif
- 1,
- "LCP",
-#if 0
- NULL,
- NULL,
- NULL
-#endif
-};
-
-int lcp_loopbackfail = DEFLOOPBACKFAIL;
-
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-/*
- * lcp_init - Initialize LCP.
- */
-void lcp_init(int unit)
-{
- fsm *f = &lcp_fsm[unit];
- lcp_options *wo = &lcp_wantoptions[unit];
- lcp_options *ao = &lcp_allowoptions[unit];
-
- f->unit = unit;
- f->protocol = PPP_LCP;
- f->callbacks = &lcp_callbacks;
-
- fsm_init(f);
-
- wo->passive = 0;
- wo->silent = 0;
- wo->restart = 0; /* Set to 1 in kernels or multi-line
- * implementations */
- wo->neg_mru = 1;
- wo->mru = PPP_DEFMRU;
- wo->neg_asyncmap = 1;
- wo->asyncmap = 0x00000000l; /* Assume don't need to escape any ctl chars. */
- wo->neg_chap = 0; /* Set to 1 on server */
- wo->neg_upap = 0; /* Set to 1 on server */
- wo->chap_mdtype = CHAP_DIGEST_MD5;
- wo->neg_magicnumber = 1;
- wo->neg_pcompression = 1;
- wo->neg_accompression = 1;
- wo->neg_lqr = 0; /* no LQR implementation yet */
- wo->neg_cbcp = 0;
-
- ao->neg_mru = 1;
- ao->mru = PPP_MAXMRU;
- ao->neg_asyncmap = 1;
- ao->asyncmap = 0x00000000l; /* Assume don't need to escape any ctl chars. */
- ao->neg_chap = (CHAP_SUPPORT != 0);
- ao->chap_mdtype = CHAP_DIGEST_MD5;
- ao->neg_upap = (PAP_SUPPORT != 0);
- ao->neg_magicnumber = 1;
- ao->neg_pcompression = 1;
- ao->neg_accompression = 1;
- ao->neg_lqr = 0; /* no LQR implementation yet */
- ao->neg_cbcp = (CBCP_SUPPORT != 0);
-
- /*
- * Set transmit escape for the flag and escape characters plus anything
- * set for the allowable options.
- */
- memset(xmit_accm[unit], 0, sizeof(xmit_accm[0]));
- xmit_accm[unit][15] = 0x60;
- xmit_accm[unit][0] = (u_char)(ao->asyncmap & 0xFF);
- xmit_accm[unit][1] = (u_char)((ao->asyncmap >> 8) & 0xFF);
- xmit_accm[unit][2] = (u_char)((ao->asyncmap >> 16) & 0xFF);
- xmit_accm[unit][3] = (u_char)((ao->asyncmap >> 24) & 0xFF);
- LCPDEBUG((LOG_INFO, "lcp_init: xmit_accm=%X %X %X %X\n",
- xmit_accm[unit][0],
- xmit_accm[unit][1],
- xmit_accm[unit][2],
- xmit_accm[unit][3]));
-
- lcp_phase[unit] = PHASE_INITIALIZE;
-}
-
-
-/*
- * lcp_open - LCP is allowed to come up.
- */
-void lcp_open(int unit)
-{
- fsm *f = &lcp_fsm[unit];
- lcp_options *wo = &lcp_wantoptions[unit];
-
- f->flags = 0;
- if (wo->passive)
- f->flags |= OPT_PASSIVE;
- if (wo->silent)
- f->flags |= OPT_SILENT;
- fsm_open(f);
-
- lcp_phase[unit] = PHASE_ESTABLISH;
-}
-
-
-/*
- * lcp_close - Take LCP down.
- */
-void lcp_close(int unit, char *reason)
-{
- fsm *f = &lcp_fsm[unit];
-
- if (lcp_phase[unit] != PHASE_DEAD)
- lcp_phase[unit] = PHASE_TERMINATE;
- if (f->state == STOPPED && f->flags & (OPT_PASSIVE|OPT_SILENT)) {
- /*
- * This action is not strictly according to the FSM in RFC1548,
- * but it does mean that the program terminates if you do an
- * lcp_close() in passive/silent mode when a connection hasn't
- * been established.
- */
- f->state = CLOSED;
- lcp_finished(f);
- }
- else
- fsm_close(&lcp_fsm[unit], reason);
-}
-
-
-/*
- * lcp_lowerup - The lower layer is up.
- */
-void lcp_lowerup(int unit)
-{
- lcp_options *wo = &lcp_wantoptions[unit];
-
- /*
- * Don't use A/C or protocol compression on transmission,
- * but accept A/C and protocol compressed packets
- * if we are going to ask for A/C and protocol compression.
- */
- ppp_set_xaccm(unit, &xmit_accm[unit]);
- ppp_send_config(unit, PPP_MRU, 0xffffffffl, 0, 0);
- ppp_recv_config(unit, PPP_MRU, 0x00000000l,
- wo->neg_pcompression, wo->neg_accompression);
- peer_mru[unit] = PPP_MRU;
- lcp_allowoptions[unit].asyncmap
- = (u_long)xmit_accm[unit][0]
- | ((u_long)xmit_accm[unit][1] << 8)
- | ((u_long)xmit_accm[unit][2] << 16)
- | ((u_long)xmit_accm[unit][3] << 24);
- LCPDEBUG((LOG_INFO, "lcp_lowerup: asyncmap=%X %X %X %X\n",
- xmit_accm[unit][3],
- xmit_accm[unit][2],
- xmit_accm[unit][1],
- xmit_accm[unit][0]));
-
- fsm_lowerup(&lcp_fsm[unit]);
-}
-
-
-/*
- * lcp_lowerdown - The lower layer is down.
- */
-void lcp_lowerdown(int unit)
-{
- fsm_lowerdown(&lcp_fsm[unit]);
-}
-
-/*
- * lcp_sprotrej - Send a Protocol-Reject for some protocol.
- */
-void lcp_sprotrej(int unit, u_char *p, int len)
-{
- /*
- * Send back the protocol and the information field of the
- * rejected packet. We only get here if LCP is in the OPENED state.
- */
-
- fsm_sdata(&lcp_fsm[unit], PROTREJ, ++lcp_fsm[unit].id,
- p, len);
-}
-
-
-
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-/*
- * lcp_input - Input LCP packet.
- */
-static void lcp_input(int unit, u_char *p, int len)
-{
- fsm *f = &lcp_fsm[unit];
-
- fsm_input(f, p, len);
-}
-
-
-/*
- * lcp_extcode - Handle a LCP-specific code.
- */
-static int lcp_extcode(fsm *f, int code, u_char id, u_char *inp, int len)
-{
- u_char *magp;
-
- switch( code ){
- case PROTREJ:
- lcp_rprotrej(f, inp, len);
- break;
-
- case ECHOREQ:
- if (f->state != OPENED)
- break;
- LCPDEBUG((LOG_INFO, "lcp: Echo-Request, Rcvd id %d\n", id));
- magp = inp;
- PUTLONG(lcp_gotoptions[f->unit].magicnumber, magp);
- fsm_sdata(f, ECHOREP, id, inp, len);
- break;
-
- case ECHOREP:
- lcp_received_echo_reply(f, id, inp, len);
- break;
-
- case DISCREQ:
- break;
-
- default:
- return 0;
- }
- return 1;
-}
-
-
-/*
- * lcp_rprotrej - Receive an Protocol-Reject.
- *
- * Figure out which protocol is rejected and inform it.
- */
-static void lcp_rprotrej(fsm *f, u_char *inp, int len)
-{
- int i;
- struct protent *protp;
- u_short prot;
-
- if (len < sizeof (u_short)) {
- LCPDEBUG((LOG_INFO,
- "lcp_rprotrej: Rcvd short Protocol-Reject packet!\n"));
- return;
- }
-
- GETSHORT(prot, inp);
-
- LCPDEBUG((LOG_INFO,
- "lcp_rprotrej: Rcvd Protocol-Reject packet for %x!\n",
- prot));
-
- /*
- * Protocol-Reject packets received in any state other than the LCP
- * OPENED state SHOULD be silently discarded.
- */
- if( f->state != OPENED ){
- LCPDEBUG((LOG_INFO, "Protocol-Reject discarded: LCP in state %d\n",
- f->state));
- return;
- }
-
- /*
- * Upcall the proper Protocol-Reject routine.
- */
- for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i)
- if (protp->protocol == prot && protp->enabled_flag) {
- (*protp->protrej)(f->unit);
- return;
- }
-
- LCPDEBUG((LOG_WARNING, "Protocol-Reject for unsupported protocol 0x%x\n",
- prot));
-}
-
-
-/*
- * lcp_protrej - A Protocol-Reject was received.
- */
-static void lcp_protrej(int unit)
-{
- (void)unit;
- /*
- * Can't reject LCP!
- */
- LCPDEBUG((LOG_WARNING,
- "lcp_protrej: Received Protocol-Reject for LCP!\n"));
- fsm_protreject(&lcp_fsm[unit]);
-}
-
-
-/*
- * lcp_resetci - Reset our CI.
- */
-static void lcp_resetci(fsm *f)
-{
- lcp_wantoptions[f->unit].magicnumber = magic();
- lcp_wantoptions[f->unit].numloops = 0;
- lcp_gotoptions[f->unit] = lcp_wantoptions[f->unit];
- peer_mru[f->unit] = PPP_MRU;
- auth_reset(f->unit);
-}
-
-
-/*
- * lcp_cilen - Return length of our CI.
- */
-static int lcp_cilen(fsm *f)
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
-
-#define LENCIVOID(neg) ((neg) ? CILEN_VOID : 0)
-#define LENCICHAP(neg) ((neg) ? CILEN_CHAP : 0)
-#define LENCISHORT(neg) ((neg) ? CILEN_SHORT : 0)
-#define LENCILONG(neg) ((neg) ? CILEN_LONG : 0)
-#define LENCILQR(neg) ((neg) ? CILEN_LQR: 0)
-#define LENCICBCP(neg) ((neg) ? CILEN_CBCP: 0)
- /*
- * NB: we only ask for one of CHAP and UPAP, even if we will
- * accept either.
- */
- return (LENCISHORT(go->neg_mru && go->mru != PPP_DEFMRU) +
- LENCILONG(go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl) +
- LENCICHAP(go->neg_chap) +
- LENCISHORT(!go->neg_chap && go->neg_upap) +
- LENCILQR(go->neg_lqr) +
- LENCICBCP(go->neg_cbcp) +
- LENCILONG(go->neg_magicnumber) +
- LENCIVOID(go->neg_pcompression) +
- LENCIVOID(go->neg_accompression));
-}
-
-
-/*
- * lcp_addci - Add our desired CIs to a packet.
- */
-static void lcp_addci(fsm *f, u_char *ucp, int *lenp)
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- u_char *start_ucp = ucp;
-
-#define ADDCIVOID(opt, neg) \
- if (neg) { \
- LCPDEBUG((LOG_INFO, "lcp_addci: opt=%d\n", opt)); \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_VOID, ucp); \
- }
-#define ADDCISHORT(opt, neg, val) \
- if (neg) { \
- LCPDEBUG((LOG_INFO, "lcp_addci: INT opt=%d %X\n", opt, val)); \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_SHORT, ucp); \
- PUTSHORT(val, ucp); \
- }
-#define ADDCICHAP(opt, neg, val, digest) \
- if (neg) { \
- LCPDEBUG((LOG_INFO, "lcp_addci: CHAP opt=%d %X\n", opt, val)); \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_CHAP, ucp); \
- PUTSHORT(val, ucp); \
- PUTCHAR(digest, ucp); \
- }
-#define ADDCILONG(opt, neg, val) \
- if (neg) { \
- LCPDEBUG((LOG_INFO, "lcp_addci: L opt=%d %lX\n", opt, val)); \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_LONG, ucp); \
- PUTLONG(val, ucp); \
- }
-#define ADDCILQR(opt, neg, val) \
- if (neg) { \
- LCPDEBUG((LOG_INFO, "lcp_addci: LQR opt=%d %lX\n", opt, val)); \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_LQR, ucp); \
- PUTSHORT(PPP_LQR, ucp); \
- PUTLONG(val, ucp); \
- }
-#define ADDCICHAR(opt, neg, val) \
- if (neg) { \
- LCPDEBUG((LOG_INFO, "lcp_addci: CHAR opt=%d %X '%z'\n", opt, val, val)); \
- PUTCHAR(opt, ucp); \
- PUTCHAR(CILEN_CHAR, ucp); \
- PUTCHAR(val, ucp); \
- }
-
- ADDCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru);
- ADDCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl,
- go->asyncmap);
- ADDCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype);
- ADDCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
- ADDCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
- ADDCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
- ADDCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);
- ADDCIVOID(CI_PCOMPRESSION, go->neg_pcompression);
- ADDCIVOID(CI_ACCOMPRESSION, go->neg_accompression);
-
- if (ucp - start_ucp != *lenp) {
- /* this should never happen, because peer_mtu should be 1500 */
- LCPDEBUG((LOG_ERR, "Bug in lcp_addci: wrong length\n"));
- }
-}
-
-
-/*
- * lcp_ackci - Ack our CIs.
- * This should not modify any state if the Ack is bad.
- *
- * Returns:
- * 0 - Ack was bad.
- * 1 - Ack was good.
- */
-static int lcp_ackci(fsm *f, u_char *p, int len)
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- u_char cilen, citype, cichar;
- u_short cishort;
- u32_t cilong;
-
- /*
- * CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define ACKCIVOID(opt, neg) \
- if (neg) { \
- if ((len -= CILEN_VOID) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_VOID || \
- citype != opt) \
- goto bad; \
- }
-#define ACKCISHORT(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_SHORT) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_SHORT || \
- citype != opt) \
- goto bad; \
- GETSHORT(cishort, p); \
- if (cishort != val) \
- goto bad; \
- }
-#define ACKCICHAR(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_CHAR) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_CHAR || \
- citype != opt) \
- goto bad; \
- GETCHAR(cichar, p); \
- if (cichar != val) \
- goto bad; \
- }
-#define ACKCICHAP(opt, neg, val, digest) \
- if (neg) { \
- if ((len -= CILEN_CHAP) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_CHAP || \
- citype != opt) \
- goto bad; \
- GETSHORT(cishort, p); \
- if (cishort != val) \
- goto bad; \
- GETCHAR(cichar, p); \
- if (cichar != digest) \
- goto bad; \
- }
-#define ACKCILONG(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_LONG) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_LONG || \
- citype != opt) \
- goto bad; \
- GETLONG(cilong, p); \
- if (cilong != val) \
- goto bad; \
- }
-#define ACKCILQR(opt, neg, val) \
- if (neg) { \
- if ((len -= CILEN_LQR) < 0) \
- goto bad; \
- GETCHAR(citype, p); \
- GETCHAR(cilen, p); \
- if (cilen != CILEN_LQR || \
- citype != opt) \
- goto bad; \
- GETSHORT(cishort, p); \
- if (cishort != PPP_LQR) \
- goto bad; \
- GETLONG(cilong, p); \
- if (cilong != val) \
- goto bad; \
- }
-
- ACKCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru);
- ACKCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl,
- go->asyncmap);
- ACKCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype);
- ACKCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);
- ACKCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);
- ACKCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);
- ACKCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);
- ACKCIVOID(CI_PCOMPRESSION, go->neg_pcompression);
- ACKCIVOID(CI_ACCOMPRESSION, go->neg_accompression);
-
- /*
- * If there are any remaining CIs, then this packet is bad.
- */
- if (len != 0)
- goto bad;
- LCPDEBUG((LOG_INFO, "lcp_acki: Ack\n"));
- return (1);
-bad:
- LCPDEBUG((LOG_WARNING, "lcp_acki: received bad Ack!\n"));
- return (0);
-}
-
-
-/*
- * lcp_nakci - Peer has sent a NAK for some of our CIs.
- * This should not modify any state if the Nak is bad
- * or if LCP is in the OPENED state.
- *
- * Returns:
- * 0 - Nak was bad.
- * 1 - Nak was good.
- */
-static int lcp_nakci(fsm *f, u_char *p, int len)
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- lcp_options *wo = &lcp_wantoptions[f->unit];
- u_char citype, cichar, *next;
- u_short cishort;
- u32_t cilong;
- lcp_options no; /* options we've seen Naks for */
- lcp_options try; /* options to request next time */
- int looped_back = 0;
- int cilen;
-
- BZERO(&no, sizeof(no));
- try = *go;
-
- /*
- * Any Nak'd CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define NAKCIVOID(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_VOID && \
- p[1] == CILEN_VOID && \
- p[0] == opt) { \
- len -= CILEN_VOID; \
- INCPTR(CILEN_VOID, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCICHAP(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_CHAP && \
- p[1] == CILEN_CHAP && \
- p[0] == opt) { \
- len -= CILEN_CHAP; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- GETCHAR(cichar, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCICHAR(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_CHAR && \
- p[1] == CILEN_CHAR && \
- p[0] == opt) { \
- len -= CILEN_CHAR; \
- INCPTR(2, p); \
- GETCHAR(cichar, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCISHORT(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_SHORT && \
- p[1] == CILEN_SHORT && \
- p[0] == opt) { \
- len -= CILEN_SHORT; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCILONG(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_LONG && \
- p[1] == CILEN_LONG && \
- p[0] == opt) { \
- len -= CILEN_LONG; \
- INCPTR(2, p); \
- GETLONG(cilong, p); \
- no.neg = 1; \
- code \
- }
-#define NAKCILQR(opt, neg, code) \
- if (go->neg && \
- len >= CILEN_LQR && \
- p[1] == CILEN_LQR && \
- p[0] == opt) { \
- len -= CILEN_LQR; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- GETLONG(cilong, p); \
- no.neg = 1; \
- code \
- }
-
- /*
- * We don't care if they want to send us smaller packets than
- * we want. Therefore, accept any MRU less than what we asked for,
- * but then ignore the new value when setting the MRU in the kernel.
- * If they send us a bigger MRU than what we asked, accept it, up to
- * the limit of the default MRU we'd get if we didn't negotiate.
- */
- if (go->neg_mru && go->mru != PPP_DEFMRU) {
- NAKCISHORT(CI_MRU, neg_mru,
- if (cishort <= wo->mru || cishort < PPP_DEFMRU)
- try.mru = cishort;
- );
- }
-
- /*
- * Add any characters they want to our (receive-side) asyncmap.
- */
- if (go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl) {
- NAKCILONG(CI_ASYNCMAP, neg_asyncmap,
- try.asyncmap = go->asyncmap | cilong;
- );
- }
-
- /*
- * If they've nak'd our authentication-protocol, check whether
- * they are proposing a different protocol, or a different
- * hash algorithm for CHAP.
- */
- if ((go->neg_chap || go->neg_upap)
- && len >= CILEN_SHORT
- && p[0] == CI_AUTHTYPE && p[1] >= CILEN_SHORT && p[1] <= len) {
- cilen = p[1];
- len -= cilen;
- no.neg_chap = go->neg_chap;
- no.neg_upap = go->neg_upap;
- INCPTR(2, p);
- GETSHORT(cishort, p);
- if (cishort == PPP_PAP && cilen == CILEN_SHORT) {
- /*
- * If we were asking for CHAP, they obviously don't want to do it.
- * If we weren't asking for CHAP, then we were asking for PAP,
- * in which case this Nak is bad.
- */
- if (!go->neg_chap)
- goto bad;
- try.neg_chap = 0;
-
- } else if (cishort == PPP_CHAP && cilen == CILEN_CHAP) {
- GETCHAR(cichar, p);
- if (go->neg_chap) {
- /*
- * We were asking for CHAP/MD5; they must want a different
- * algorithm. If they can't do MD5, we'll have to stop
- * asking for CHAP.
- */
- if (cichar != go->chap_mdtype)
- try.neg_chap = 0;
- } else {
- /*
- * Stop asking for PAP if we were asking for it.
- */
- try.neg_upap = 0;
- }
-
- } else {
- /*
- * We don't recognize what they're suggesting.
- * Stop asking for what we were asking for.
- */
- if (go->neg_chap)
- try.neg_chap = 0;
- else
- try.neg_upap = 0;
- p += cilen - CILEN_SHORT;
- }
- }
-
- /*
- * If they can't cope with our link quality protocol, we'll have
- * to stop asking for LQR. We haven't got any other protocol.
- * If they Nak the reporting period, take their value XXX ?
- */
- NAKCILQR(CI_QUALITY, neg_lqr,
- if (cishort != PPP_LQR)
- try.neg_lqr = 0;
- else
- try.lqr_period = cilong;
- );
-
- /*
- * Only implementing CBCP...not the rest of the callback options
- */
- NAKCICHAR(CI_CALLBACK, neg_cbcp,
- try.neg_cbcp = 0;
- );
-
- /*
- * Check for a looped-back line.
- */
- NAKCILONG(CI_MAGICNUMBER, neg_magicnumber,
- try.magicnumber = magic();
- looped_back = 1;
- );
-
- /*
- * Peer shouldn't send Nak for protocol compression or
- * address/control compression requests; they should send
- * a Reject instead. If they send a Nak, treat it as a Reject.
- */
- NAKCIVOID(CI_PCOMPRESSION, neg_pcompression,
- try.neg_pcompression = 0;
- );
- NAKCIVOID(CI_ACCOMPRESSION, neg_accompression,
- try.neg_accompression = 0;
- );
-
- /*
- * There may be remaining CIs, if the peer is requesting negotiation
- * on an option that we didn't include in our request packet.
- * If we see an option that we requested, or one we've already seen
- * in this packet, then this packet is bad.
- * If we wanted to respond by starting to negotiate on the requested
- * option(s), we could, but we don't, because except for the
- * authentication type and quality protocol, if we are not negotiating
- * an option, it is because we were told not to.
- * For the authentication type, the Nak from the peer means
- * `let me authenticate myself with you' which is a bit pointless.
- * For the quality protocol, the Nak means `ask me to send you quality
- * reports', but if we didn't ask for them, we don't want them.
- * An option we don't recognize represents the peer asking to
- * negotiate some option we don't support, so ignore it.
- */
- while (len > CILEN_VOID) {
- GETCHAR(citype, p);
- GETCHAR(cilen, p);
- if (cilen < CILEN_VOID || (len -= cilen) < 0)
- goto bad;
- next = p + cilen - 2;
-
- switch (citype) {
- case CI_MRU:
- if ((go->neg_mru && go->mru != PPP_DEFMRU)
- || no.neg_mru || cilen != CILEN_SHORT)
- goto bad;
- GETSHORT(cishort, p);
- if (cishort < PPP_DEFMRU)
- try.mru = cishort;
- break;
- case CI_ASYNCMAP:
- if ((go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl)
- || no.neg_asyncmap || cilen != CILEN_LONG)
- goto bad;
- break;
- case CI_AUTHTYPE:
- if (go->neg_chap || no.neg_chap || go->neg_upap || no.neg_upap)
- goto bad;
- break;
- case CI_MAGICNUMBER:
- if (go->neg_magicnumber || no.neg_magicnumber ||
- cilen != CILEN_LONG)
- goto bad;
- break;
- case CI_PCOMPRESSION:
- if (go->neg_pcompression || no.neg_pcompression
- || cilen != CILEN_VOID)
- goto bad;
- break;
- case CI_ACCOMPRESSION:
- if (go->neg_accompression || no.neg_accompression
- || cilen != CILEN_VOID)
- goto bad;
- break;
- case CI_QUALITY:
- if (go->neg_lqr || no.neg_lqr || cilen != CILEN_LQR)
- goto bad;
- break;
- }
- p = next;
- }
-
- /* If there is still anything left, this packet is bad. */
- if (len != 0)
- goto bad;
-
- /*
- * OK, the Nak is good. Now we can update state.
- */
- if (f->state != OPENED) {
- if (looped_back) {
- if (++try.numloops >= lcp_loopbackfail) {
- LCPDEBUG((LOG_NOTICE, "Serial line is looped back.\n"));
- lcp_close(f->unit, "Loopback detected");
- }
- }
- else
- try.numloops = 0;
- *go = try;
- }
-
- return 1;
-
-bad:
- LCPDEBUG((LOG_WARNING, "lcp_nakci: received bad Nak!\n"));
- return 0;
-}
-
-
-/*
- * lcp_rejci - Peer has Rejected some of our CIs.
- * This should not modify any state if the Reject is bad
- * or if LCP is in the OPENED state.
- *
- * Returns:
- * 0 - Reject was bad.
- * 1 - Reject was good.
- */
-static int lcp_rejci(fsm *f, u_char *p, int len)
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- u_char cichar;
- u_short cishort;
- u32_t cilong;
- lcp_options try; /* options to request next time */
-
- try = *go;
-
- /*
- * Any Rejected CIs must be in exactly the same order that we sent.
- * Check packet length and CI length at each step.
- * If we find any deviations, then this packet is bad.
- */
-#define REJCIVOID(opt, neg) \
- if (go->neg && \
- len >= CILEN_VOID && \
- p[1] == CILEN_VOID && \
- p[0] == opt) { \
- len -= CILEN_VOID; \
- INCPTR(CILEN_VOID, p); \
- try.neg = 0; \
- LCPDEBUG((LOG_INFO, "lcp_rejci: void opt %d rejected\n", opt)); \
- }
-#define REJCISHORT(opt, neg, val) \
- if (go->neg && \
- len >= CILEN_SHORT && \
- p[1] == CILEN_SHORT && \
- p[0] == opt) { \
- len -= CILEN_SHORT; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- /* Check rejected value. */ \
- if (cishort != val) \
- goto bad; \
- try.neg = 0; \
- LCPDEBUG((LOG_INFO,"lcp_rejci: short opt %d rejected\n", opt)); \
- }
-#define REJCICHAP(opt, neg, val, digest) \
- if (go->neg && \
- len >= CILEN_CHAP && \
- p[1] == CILEN_CHAP && \
- p[0] == opt) { \
- len -= CILEN_CHAP; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- GETCHAR(cichar, p); \
- /* Check rejected value. */ \
- if (cishort != val || cichar != digest) \
- goto bad; \
- try.neg = 0; \
- try.neg_upap = 0; \
- LCPDEBUG((LOG_INFO,"lcp_rejci: chap opt %d rejected\n", opt)); \
- }
-#define REJCILONG(opt, neg, val) \
- if (go->neg && \
- len >= CILEN_LONG && \
- p[1] == CILEN_LONG && \
- p[0] == opt) { \
- len -= CILEN_LONG; \
- INCPTR(2, p); \
- GETLONG(cilong, p); \
- /* Check rejected value. */ \
- if (cilong != val) \
- goto bad; \
- try.neg = 0; \
- LCPDEBUG((LOG_INFO,"lcp_rejci: long opt %d rejected\n", opt)); \
- }
-#define REJCILQR(opt, neg, val) \
- if (go->neg && \
- len >= CILEN_LQR && \
- p[1] == CILEN_LQR && \
- p[0] == opt) { \
- len -= CILEN_LQR; \
- INCPTR(2, p); \
- GETSHORT(cishort, p); \
- GETLONG(cilong, p); \
- /* Check rejected value. */ \
- if (cishort != PPP_LQR || cilong != val) \
- goto bad; \
- try.neg = 0; \
- LCPDEBUG((LOG_INFO,"lcp_rejci: LQR opt %d rejected\n", opt)); \
- }
-#define REJCICBCP(opt, neg, val) \
- if (go->neg && \
- len >= CILEN_CBCP && \
- p[1] == CILEN_CBCP && \
- p[0] == opt) { \
- len -= CILEN_CBCP; \
- INCPTR(2, p); \
- GETCHAR(cichar, p); \
- /* Check rejected value. */ \
- if (cichar != val) \
- goto bad; \
- try.neg = 0; \
- LCPDEBUG((LOG_INFO,"lcp_rejci: Callback opt %d rejected\n", opt)); \
- }
-
- REJCISHORT(CI_MRU, neg_mru, go->mru);
- REJCILONG(CI_ASYNCMAP, neg_asyncmap, go->asyncmap);
- REJCICHAP(CI_AUTHTYPE, neg_chap, PPP_CHAP, go->chap_mdtype);
- if (!go->neg_chap) {
- REJCISHORT(CI_AUTHTYPE, neg_upap, PPP_PAP);
- }
- REJCILQR(CI_QUALITY, neg_lqr, go->lqr_period);
- REJCICBCP(CI_CALLBACK, neg_cbcp, CBCP_OPT);
- REJCILONG(CI_MAGICNUMBER, neg_magicnumber, go->magicnumber);
- REJCIVOID(CI_PCOMPRESSION, neg_pcompression);
- REJCIVOID(CI_ACCOMPRESSION, neg_accompression);
-
- /*
- * If there are any remaining CIs, then this packet is bad.
- */
- if (len != 0)
- goto bad;
- /*
- * Now we can update state.
- */
- if (f->state != OPENED)
- *go = try;
- return 1;
-
-bad:
- LCPDEBUG((LOG_WARNING, "lcp_rejci: received bad Reject!\n"));
- return 0;
-}
-
-
-/*
- * lcp_reqci - Check the peer's requested CIs and send appropriate response.
- *
- * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified
- * appropriately. If reject_if_disagree is non-zero, doesn't return
- * CONFNAK; returns CONFREJ if it can't return CONFACK.
- */
-static int lcp_reqci(fsm *f,
- u_char *inp, /* Requested CIs */
- int *lenp, /* Length of requested CIs */
- int reject_if_disagree)
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
- lcp_options *ho = &lcp_hisoptions[f->unit];
- lcp_options *ao = &lcp_allowoptions[f->unit];
- u_char *cip, *next; /* Pointer to current and next CIs */
- int cilen, citype, cichar; /* Parsed len, type, char value */
- u_short cishort; /* Parsed short value */
- u32_t cilong; /* Parse long value */
- int rc = CONFACK; /* Final packet return code */
- int orc; /* Individual option return code */
- u_char *p; /* Pointer to next char to parse */
- u_char *rejp; /* Pointer to next char in reject frame */
- u_char *nakp; /* Pointer to next char in Nak frame */
- int l = *lenp; /* Length left */
-#if TRACELCP > 0
- char traceBuf[80];
- int traceNdx = 0;
-#endif
-
- /*
- * Reset all his options.
- */
- BZERO(ho, sizeof(*ho));
-
- /*
- * Process all his options.
- */
- next = inp;
- nakp = nak_buffer;
- rejp = inp;
- while (l) {
- orc = CONFACK; /* Assume success */
- cip = p = next; /* Remember begining of CI */
- if (l < 2 || /* Not enough data for CI header or */
- p[1] < 2 || /* CI length too small or */
- p[1] > l) { /* CI length too big? */
- LCPDEBUG((LOG_WARNING, "lcp_reqci: bad CI length!\n"));
- orc = CONFREJ; /* Reject bad CI */
- cilen = l; /* Reject till end of packet */
- l = 0; /* Don't loop again */
- citype = 0;
- goto endswitch;
- }
- GETCHAR(citype, p); /* Parse CI type */
- GETCHAR(cilen, p); /* Parse CI length */
- l -= cilen; /* Adjust remaining length */
- next += cilen; /* Step to next CI */
-
- switch (citype) { /* Check CI type */
- case CI_MRU:
- if (!ao->neg_mru) { /* Allow option? */
- LCPDEBUG((LOG_INFO, "lcp_reqci: Reject MRU - not allowed\n"));
- orc = CONFREJ; /* Reject CI */
- break;
- } else if (cilen != CILEN_SHORT) { /* Check CI length */
- LCPDEBUG((LOG_INFO, "lcp_reqci: Reject MRU - bad length\n"));
- orc = CONFREJ; /* Reject CI */
- break;
- }
- GETSHORT(cishort, p); /* Parse MRU */
-
- /*
- * He must be able to receive at least our minimum.
- * No need to check a maximum. If he sends a large number,
- * we'll just ignore it.
- */
- if (cishort < PPP_MINMRU) {
- LCPDEBUG((LOG_INFO, "lcp_reqci: Nak - MRU too small\n"));
- orc = CONFNAK; /* Nak CI */
- PUTCHAR(CI_MRU, nakp);
- PUTCHAR(CILEN_SHORT, nakp);
- PUTSHORT(PPP_MINMRU, nakp); /* Give him a hint */
- break;
- }
- ho->neg_mru = 1; /* Remember he sent MRU */
- ho->mru = cishort; /* And remember value */
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " MRU %d", cishort);
- traceNdx = strlen(traceBuf);
-#endif
- break;
-
- case CI_ASYNCMAP:
- if (!ao->neg_asyncmap) {
- LCPDEBUG((LOG_INFO, "lcp_reqci: Reject ASYNCMAP not allowed\n"));
- orc = CONFREJ;
- break;
- } else if (cilen != CILEN_LONG) {
- LCPDEBUG((LOG_INFO, "lcp_reqci: Reject ASYNCMAP bad length\n"));
- orc = CONFREJ;
- break;
- }
- GETLONG(cilong, p);
-
- /*
- * Asyncmap must have set at least the bits
- * which are set in lcp_allowoptions[unit].asyncmap.
- */
- if ((ao->asyncmap & ~cilong) != 0) {
- LCPDEBUG((LOG_INFO, "lcp_reqci: Nak ASYNCMAP %lX missing %lX\n",
- cilong, ao->asyncmap));
- orc = CONFNAK;
- PUTCHAR(CI_ASYNCMAP, nakp);
- PUTCHAR(CILEN_LONG, nakp);
- PUTLONG(ao->asyncmap | cilong, nakp);
- break;
- }
- ho->neg_asyncmap = 1;
- ho->asyncmap = cilong;
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " ASYNCMAP=%lX", cilong);
- traceNdx = strlen(traceBuf);
-#endif
- break;
-
- case CI_AUTHTYPE:
- if (cilen < CILEN_SHORT) {
- LCPDEBUG((LOG_INFO, "lcp_reqci: Reject AUTHTYPE missing arg\n"));
- orc = CONFREJ;
- break;
- } else if (!(ao->neg_upap || ao->neg_chap)) {
- /*
- * Reject the option if we're not willing to authenticate.
- */
- LCPDEBUG((LOG_INFO, "lcp_reqci: Reject AUTHTYPE not allowed\n"));
- orc = CONFREJ;
- break;
- }
- GETSHORT(cishort, p);
-
- /*
- * Authtype must be UPAP or CHAP.
- *
- * Note: if both ao->neg_upap and ao->neg_chap are set,
- * and the peer sends a Configure-Request with two
- * authenticate-protocol requests, one for CHAP and one
- * for UPAP, then we will reject the second request.
- * Whether we end up doing CHAP or UPAP depends then on
- * the ordering of the CIs in the peer's Configure-Request.
- */
-
- if (cishort == PPP_PAP) {
- if (ho->neg_chap) { /* we've already accepted CHAP */
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Reject AUTHTYPE PAP already accepted\n"));
- orc = CONFREJ;
- break;
- } else if (cilen != CILEN_SHORT) {
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Reject AUTHTYPE PAP bad len\n"));
- orc = CONFREJ;
- break;
- }
- if (!ao->neg_upap) { /* we don't want to do PAP */
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE PAP not allowed\n"));
- orc = CONFNAK; /* NAK it and suggest CHAP */
- PUTCHAR(CI_AUTHTYPE, nakp);
- PUTCHAR(CILEN_CHAP, nakp);
- PUTSHORT(PPP_CHAP, nakp);
- PUTCHAR(ao->chap_mdtype, nakp);
- break;
- }
- ho->neg_upap = 1;
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " PAP (%X)", cishort);
- traceNdx = strlen(traceBuf);
-#endif
- break;
- }
- if (cishort == PPP_CHAP) {
- if (ho->neg_upap) { /* we've already accepted PAP */
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Reject AUTHTYPE CHAP accepted PAP\n"));
- orc = CONFREJ;
- break;
- } else if (cilen != CILEN_CHAP) {
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Reject AUTHTYPE CHAP bad len\n"));
- orc = CONFREJ;
- break;
- }
- if (!ao->neg_chap) { /* we don't want to do CHAP */
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE CHAP not allowed\n"));
- orc = CONFNAK; /* NAK it and suggest PAP */
- PUTCHAR(CI_AUTHTYPE, nakp);
- PUTCHAR(CILEN_SHORT, nakp);
- PUTSHORT(PPP_PAP, nakp);
- break;
- }
- GETCHAR(cichar, p); /* get digest type*/
- if (cichar != CHAP_DIGEST_MD5
-#ifdef CHAPMS
- && cichar != CHAP_MICROSOFT
-#endif
- ) {
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE CHAP digest=%d\n", cichar));
- orc = CONFNAK;
- PUTCHAR(CI_AUTHTYPE, nakp);
- PUTCHAR(CILEN_CHAP, nakp);
- PUTSHORT(PPP_CHAP, nakp);
- PUTCHAR(ao->chap_mdtype, nakp);
- break;
- }
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CHAP %X,%d", cishort, cichar);
- traceNdx = strlen(traceBuf);
-#endif
- ho->chap_mdtype = cichar; /* save md type */
- ho->neg_chap = 1;
- break;
- }
-
- /*
- * We don't recognize the protocol they're asking for.
- * Nak it with something we're willing to do.
- * (At this point we know ao->neg_upap || ao->neg_chap.)
- */
- orc = CONFNAK;
- PUTCHAR(CI_AUTHTYPE, nakp);
- if (ao->neg_chap) {
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE %d req CHAP\n", cishort));
- PUTCHAR(CILEN_CHAP, nakp);
- PUTSHORT(PPP_CHAP, nakp);
- PUTCHAR(ao->chap_mdtype, nakp);
- }
- else {
- LCPDEBUG((LOG_WARNING, "lcp_reqci: Nak AUTHTYPE %d req PAP\n", cishort));
- PUTCHAR(CILEN_SHORT, nakp);
- PUTSHORT(PPP_PAP, nakp);
- }
- break;
-
- case CI_QUALITY:
- GETSHORT(cishort, p);
- GETLONG(cilong, p);
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " QUALITY (%x %x)", cishort, (unsigned int) cilong);
- traceNdx = strlen(traceBuf);
-#endif
-
- if (!ao->neg_lqr ||
- cilen != CILEN_LQR) {
- orc = CONFREJ;
- break;
- }
-
- /*
- * Check the protocol and the reporting period.
- * XXX When should we Nak this, and what with?
- */
- if (cishort != PPP_LQR) {
- orc = CONFNAK;
- PUTCHAR(CI_QUALITY, nakp);
- PUTCHAR(CILEN_LQR, nakp);
- PUTSHORT(PPP_LQR, nakp);
- PUTLONG(ao->lqr_period, nakp);
- break;
- }
- break;
-
- case CI_MAGICNUMBER:
- if (!(ao->neg_magicnumber || go->neg_magicnumber) ||
- cilen != CILEN_LONG) {
- orc = CONFREJ;
- break;
- }
- GETLONG(cilong, p);
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " MAGICNUMBER (%lX)", cilong);
- traceNdx = strlen(traceBuf);
-#endif
-
- /*
- * He must have a different magic number.
- */
- if (go->neg_magicnumber &&
- cilong == go->magicnumber) {
- cilong = magic(); /* Don't put magic() inside macro! */
- orc = CONFNAK;
- PUTCHAR(CI_MAGICNUMBER, nakp);
- PUTCHAR(CILEN_LONG, nakp);
- PUTLONG(cilong, nakp);
- break;
- }
- ho->neg_magicnumber = 1;
- ho->magicnumber = cilong;
- break;
-
-
- case CI_PCOMPRESSION:
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " PCOMPRESSION");
- traceNdx = strlen(traceBuf);
-#endif
- if (!ao->neg_pcompression ||
- cilen != CILEN_VOID) {
- orc = CONFREJ;
- break;
- }
- ho->neg_pcompression = 1;
- break;
-
- case CI_ACCOMPRESSION:
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " ACCOMPRESSION");
- traceNdx = strlen(traceBuf);
-#endif
- if (!ao->neg_accompression ||
- cilen != CILEN_VOID) {
- orc = CONFREJ;
- break;
- }
- ho->neg_accompression = 1;
- break;
-
- case CI_MRRU:
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_MRRU");
- traceNdx = strlen(traceBuf);
-#endif
- orc = CONFREJ;
- break;
-
- case CI_SSNHF:
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_SSNHF");
- traceNdx = strlen(traceBuf);
-#endif
- orc = CONFREJ;
- break;
-
- case CI_EPDISC:
-#if TRACELCP > 0
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_EPDISC");
- traceNdx = strlen(traceBuf);
-#endif
- orc = CONFREJ;
- break;
-
- default:
-#if TRACELCP
- snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " unknown %d", citype);
- traceNdx = strlen(traceBuf);
-#endif
- orc = CONFREJ;
- break;
- }
-
- endswitch:
-#if TRACELCP
- if (traceNdx >= 80 - 32) {
- LCPDEBUG((LOG_INFO, "lcp_reqci: rcvd%s\n", traceBuf));
- traceNdx = 0;
- }
-#endif
- if (orc == CONFACK && /* Good CI */
- rc != CONFACK) /* but prior CI wasnt? */
- continue; /* Don't send this one */
-
- if (orc == CONFNAK) { /* Nak this CI? */
- if (reject_if_disagree /* Getting fed up with sending NAKs? */
- && citype != CI_MAGICNUMBER) {
- orc = CONFREJ; /* Get tough if so */
- }
- else {
- if (rc == CONFREJ) /* Rejecting prior CI? */
- continue; /* Don't send this one */
- rc = CONFNAK;
- }
- }
- if (orc == CONFREJ) { /* Reject this CI */
- rc = CONFREJ;
- if (cip != rejp) /* Need to move rejected CI? */
- BCOPY(cip, rejp, cilen); /* Move it */
- INCPTR(cilen, rejp); /* Update output pointer */
- }
- }
-
- /*
- * If we wanted to send additional NAKs (for unsent CIs), the
- * code would go here. The extra NAKs would go at *nakp.
- * At present there are no cases where we want to ask the
- * peer to negotiate an option.
- */
-
- switch (rc) {
- case CONFACK:
- *lenp = (int)(next - inp);
- break;
- case CONFNAK:
- /*
- * Copy the Nak'd options from the nak_buffer to the caller's buffer.
- */
- *lenp = (int)(nakp - nak_buffer);
- BCOPY(nak_buffer, inp, *lenp);
- break;
- case CONFREJ:
- *lenp = (int)(rejp - inp);
- break;
- }
-
-#if TRACELCP > 0
- if (traceNdx > 0) {
- LCPDEBUG((LOG_INFO, "lcp_reqci: %s\n", traceBuf));
- }
-#endif
- LCPDEBUG((LOG_INFO, "lcp_reqci: returning CONF%s.\n", CODENAME(rc)));
- return (rc); /* Return final code */
-}
-
-
-/*
- * lcp_up - LCP has come UP.
- */
-static void lcp_up(fsm *f)
-{
- lcp_options *wo = &lcp_wantoptions[f->unit];
- lcp_options *ho = &lcp_hisoptions[f->unit];
- lcp_options *go = &lcp_gotoptions[f->unit];
- lcp_options *ao = &lcp_allowoptions[f->unit];
-
- if (!go->neg_magicnumber)
- go->magicnumber = 0;
- if (!ho->neg_magicnumber)
- ho->magicnumber = 0;
-
- /*
- * Set our MTU to the smaller of the MTU we wanted and
- * the MRU our peer wanted. If we negotiated an MRU,
- * set our MRU to the larger of value we wanted and
- * the value we got in the negotiation.
- */
- ppp_send_config(f->unit, LWIP_MIN(ao->mru, (ho->neg_mru? ho->mru: PPP_MRU)),
- (ho->neg_asyncmap? ho->asyncmap: 0xffffffffl),
- ho->neg_pcompression, ho->neg_accompression);
- /*
- * If the asyncmap hasn't been negotiated, we really should
- * set the receive asyncmap to ffffffff, but we set it to 0
- * for backwards contemptibility.
- */
- ppp_recv_config(f->unit, (go->neg_mru? LWIP_MAX(wo->mru, go->mru): PPP_MRU),
- (go->neg_asyncmap? go->asyncmap: 0x00000000),
- go->neg_pcompression, go->neg_accompression);
-
- if (ho->neg_mru)
- peer_mru[f->unit] = ho->mru;
-
- lcp_echo_lowerup(f->unit); /* Enable echo messages */
-
- link_established(f->unit);
-}
-
-
-/*
- * lcp_down - LCP has gone DOWN.
- *
- * Alert other protocols.
- */
-static void lcp_down(fsm *f)
-{
- lcp_options *go = &lcp_gotoptions[f->unit];
-
- lcp_echo_lowerdown(f->unit);
-
- link_down(f->unit);
-
- ppp_send_config(f->unit, PPP_MRU, 0xffffffffl, 0, 0);
- ppp_recv_config(f->unit, PPP_MRU,
- (go->neg_asyncmap? go->asyncmap: 0x00000000),
- go->neg_pcompression, go->neg_accompression);
- peer_mru[f->unit] = PPP_MRU;
-}
-
-
-/*
- * lcp_starting - LCP needs the lower layer up.
- */
-static void lcp_starting(fsm *f)
-{
- link_required(f->unit);
-}
-
-
-/*
- * lcp_finished - LCP has finished with the lower layer.
- */
-static void lcp_finished(fsm *f)
-{
- link_terminated(f->unit);
-}
-
-
-#if 0
-/*
- * print_string - print a readable representation of a string using
- * printer.
- */
-static void print_string(
- char *p,
- int len,
- void (*printer) (void *, char *, ...),
- void *arg
-)
-{
- int c;
-
- printer(arg, "\"");
- for (; len > 0; --len) {
- c = *p++;
- if (' ' <= c && c <= '~') {
- if (c == '\\' || c == '"')
- printer(arg, "\\");
- printer(arg, "%c", c);
- } else {
- switch (c) {
- case '\n':
- printer(arg, "\\n");
- break;
- case '\r':
- printer(arg, "\\r");
- break;
- case '\t':
- printer(arg, "\\t");
- break;
- default:
- printer(arg, "\\%.3o", c);
- }
- }
- }
- printer(arg, "\"");
-}
-
-
-/*
- * lcp_printpkt - print the contents of an LCP packet.
- */
-static char *lcp_codenames[] = {
- "ConfReq", "ConfAck", "ConfNak", "ConfRej",
- "TermReq", "TermAck", "CodeRej", "ProtRej",
- "EchoReq", "EchoRep", "DiscReq"
-};
-
-static int lcp_printpkt(
- u_char *p,
- int plen,
- void (*printer) (void *, char *, ...),
- void *arg
-)
-{
- int code, id, len, olen;
- u_char *pstart, *optend;
- u_short cishort;
- u32_t cilong;
-
- if (plen < HEADERLEN)
- return 0;
- pstart = p;
- GETCHAR(code, p);
- GETCHAR(id, p);
- GETSHORT(len, p);
- if (len < HEADERLEN || len > plen)
- return 0;
-
- if (code >= 1 && code <= sizeof(lcp_codenames) / sizeof(char *))
- printer(arg, " %s", lcp_codenames[code-1]);
- else
- printer(arg, " code=0x%x", code);
- printer(arg, " id=0x%x", id);
- len -= HEADERLEN;
- switch (code) {
- case CONFREQ:
- case CONFACK:
- case CONFNAK:
- case CONFREJ:
- /* print option list */
- while (len >= 2) {
- GETCHAR(code, p);
- GETCHAR(olen, p);
- p -= 2;
- if (olen < 2 || olen > len) {
- break;
- }
- printer(arg, " <");
- len -= olen;
- optend = p + olen;
- switch (code) {
- case CI_MRU:
- if (olen == CILEN_SHORT) {
- p += 2;
- GETSHORT(cishort, p);
- printer(arg, "mru %d", cishort);
- }
- break;
- case CI_ASYNCMAP:
- if (olen == CILEN_LONG) {
- p += 2;
- GETLONG(cilong, p);
- printer(arg, "asyncmap 0x%lx", cilong);
- }
- break;
- case CI_AUTHTYPE:
- if (olen >= CILEN_SHORT) {
- p += 2;
- printer(arg, "auth ");
- GETSHORT(cishort, p);
- switch (cishort) {
- case PPP_PAP:
- printer(arg, "pap");
- break;
- case PPP_CHAP:
- printer(arg, "chap");
- break;
- default:
- printer(arg, "0x%x", cishort);
- }
- }
- break;
- case CI_QUALITY:
- if (olen >= CILEN_SHORT) {
- p += 2;
- printer(arg, "quality ");
- GETSHORT(cishort, p);
- switch (cishort) {
- case PPP_LQR:
- printer(arg, "lqr");
- break;
- default:
- printer(arg, "0x%x", cishort);
- }
- }
- break;
- case CI_CALLBACK:
- if (olen >= CILEN_CHAR) {
- p += 2;
- printer(arg, "callback ");
- GETSHORT(cishort, p);
- switch (cishort) {
- case CBCP_OPT:
- printer(arg, "CBCP");
- break;
- default:
- printer(arg, "0x%x", cishort);
- }
- }
- break;
- case CI_MAGICNUMBER:
- if (olen == CILEN_LONG) {
- p += 2;
- GETLONG(cilong, p);
- printer(arg, "magic 0x%x", cilong);
- }
- break;
- case CI_PCOMPRESSION:
- if (olen == CILEN_VOID) {
- p += 2;
- printer(arg, "pcomp");
- }
- break;
- case CI_ACCOMPRESSION:
- if (olen == CILEN_VOID) {
- p += 2;
- printer(arg, "accomp");
- }
- break;
- }
- while (p < optend) {
- GETCHAR(code, p);
- printer(arg, " %.2x", code);
- }
- printer(arg, ">");
- }
- break;
-
- case TERMACK:
- case TERMREQ:
- if (len > 0 && *p >= ' ' && *p < 0x7f) {
- printer(arg, " ");
- print_string((char*)p, len, printer, arg);
- p += len;
- len = 0;
- }
- break;
-
- case ECHOREQ:
- case ECHOREP:
- case DISCREQ:
- if (len >= 4) {
- GETLONG(cilong, p);
- printer(arg, " magic=0x%x", cilong);
- p += 4;
- len -= 4;
- }
- break;
- }
-
- /* print the rest of the bytes in the packet */
- for (; len > 0; --len) {
- GETCHAR(code, p);
- printer(arg, " %.2x", code);
- }
-
- return (int)(p - pstart);
-}
-#endif
-
-/*
- * Time to shut down the link because there is nothing out there.
- */
-
-static void LcpLinkFailure (fsm *f)
-{
- if (f->state == OPENED) {
- LCPDEBUG((LOG_INFO, "No response to %d echo-requests\n", lcp_echos_pending));
- LCPDEBUG((LOG_NOTICE, "Serial link appears to be disconnected.\n"));
- lcp_close(f->unit, "Peer not responding");
- }
-}
-
-/*
- * Timer expired for the LCP echo requests from this process.
- */
-
-static void LcpEchoCheck (fsm *f)
-{
- LcpSendEchoRequest (f);
-
- /*
- * Start the timer for the next interval.
- */
- LWIP_ASSERT("lcp_echo_timer_running == 0", lcp_echo_timer_running == 0);
-
- TIMEOUT (LcpEchoTimeout, f, lcp_echo_interval);
- lcp_echo_timer_running = 1;
-}
-
-/*
- * LcpEchoTimeout - Timer expired on the LCP echo
- */
-
-static void LcpEchoTimeout (void *arg)
-{
- if (lcp_echo_timer_running != 0) {
- lcp_echo_timer_running = 0;
- LcpEchoCheck ((fsm *) arg);
- }
-}
-
-/*
- * LcpEchoReply - LCP has received a reply to the echo
- */
-static void lcp_received_echo_reply (fsm *f, int id, u_char *inp, int len)
-{
- u32_t magic;
-
- (void)id;
-
- /* Check the magic number - don't count replies from ourselves. */
- if (len < 4) {
- LCPDEBUG((LOG_WARNING, "lcp: received short Echo-Reply, length %d\n", len));
- return;
- }
- GETLONG(magic, inp);
- if (lcp_gotoptions[f->unit].neg_magicnumber
- && magic == lcp_gotoptions[f->unit].magicnumber) {
- LCPDEBUG((LOG_WARNING, "appear to have received our own echo-reply!\n"));
- return;
- }
-
- /* Reset the number of outstanding echo frames */
- lcp_echos_pending = 0;
-}
-
-/*
- * LcpSendEchoRequest - Send an echo request frame to the peer
- */
-
-static void LcpSendEchoRequest (fsm *f)
-{
- u32_t lcp_magic;
- u_char pkt[4], *pktp;
-
- /*
- * Detect the failure of the peer at this point.
- */
- if (lcp_echo_fails != 0) {
- if (lcp_echos_pending++ >= lcp_echo_fails) {
- LcpLinkFailure(f);
- lcp_echos_pending = 0;
- }
- }
-
- /*
- * Make and send the echo request frame.
- */
- if (f->state == OPENED) {
- lcp_magic = lcp_gotoptions[f->unit].magicnumber;
- pktp = pkt;
- PUTLONG(lcp_magic, pktp);
- fsm_sdata(f, ECHOREQ, (u_char)(lcp_echo_number++ & 0xFF), pkt, (int)(pktp - pkt));
- }
-}
-
-/*
- * lcp_echo_lowerup - Start the timer for the LCP frame
- */
-
-static void lcp_echo_lowerup (int unit)
-{
- fsm *f = &lcp_fsm[unit];
-
- /* Clear the parameters for generating echo frames */
- lcp_echos_pending = 0;
- lcp_echo_number = 0;
- lcp_echo_timer_running = 0;
-
- /* If a timeout interval is specified then start the timer */
- if (lcp_echo_interval != 0)
- LcpEchoCheck (f);
-}
-
-/*
- * lcp_echo_lowerdown - Stop the timer for the LCP frame
- */
-
-static void lcp_echo_lowerdown (int unit)
-{
- fsm *f = &lcp_fsm[unit];
-
- if (lcp_echo_timer_running != 0) {
- UNTIMEOUT (LcpEchoTimeout, f);
- lcp_echo_timer_running = 0;
- }
-}
-
-#endif /* PPP_SUPPORT */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/lcp.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/lcp.h
deleted file mode 100644
index 1decc38..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/lcp.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*****************************************************************************
-* lcp.h - Network Link Control Protocol header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-11-05 Guy Lancaster <glanca at gesn.com>, Global Election Systems Inc.
-* Original derived from BSD codes.
-*****************************************************************************/
-/*
- * lcp.h - Link Control Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id: lcp.h $
- */
-
-#ifndef LCP_H
-#define LCP_H
-
-
-/*************************
-*** PUBLIC DEFINITIONS ***
-*************************/
-/*
- * Options.
- */
-#define CI_MRU 1 /* Maximum Receive Unit */
-#define CI_ASYNCMAP 2 /* Async Control Character Map */
-#define CI_AUTHTYPE 3 /* Authentication Type */
-#define CI_QUALITY 4 /* Quality Protocol */
-#define CI_MAGICNUMBER 5 /* Magic Number */
-#define CI_PCOMPRESSION 7 /* Protocol Field Compression */
-#define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */
-#define CI_CALLBACK 13 /* callback */
-#define CI_MRRU 17 /* max reconstructed receive unit; multilink */
-#define CI_SSNHF 18 /* short sequence numbers for multilink */
-#define CI_EPDISC 19 /* endpoint discriminator */
-
-/*
- * LCP-specific packet types.
- */
-#define PROTREJ 8 /* Protocol Reject */
-#define ECHOREQ 9 /* Echo Request */
-#define ECHOREP 10 /* Echo Reply */
-#define DISCREQ 11 /* Discard Request */
-#define CBCP_OPT 6 /* Use callback control protocol */
-
-
-/************************
-*** PUBLIC DATA TYPES ***
-************************/
-
-/*
- * The state of options is described by an lcp_options structure.
- */
-typedef struct lcp_options {
- u_int passive : 1; /* Don't die if we don't get a response */
- u_int silent : 1; /* Wait for the other end to start first */
- u_int restart : 1; /* Restart vs. exit after close */
- u_int neg_mru : 1; /* Negotiate the MRU? */
- u_int neg_asyncmap : 1; /* Negotiate the async map? */
- u_int neg_upap : 1; /* Ask for UPAP authentication? */
- u_int neg_chap : 1; /* Ask for CHAP authentication? */
- u_int neg_magicnumber : 1; /* Ask for magic number? */
- u_int neg_pcompression : 1; /* HDLC Protocol Field Compression? */
- u_int neg_accompression : 1; /* HDLC Address/Control Field Compression? */
- u_int neg_lqr : 1; /* Negotiate use of Link Quality Reports */
- u_int neg_cbcp : 1; /* Negotiate use of CBCP */
-#ifdef PPP_MULTILINK
- u_int neg_mrru : 1; /* Negotiate multilink MRRU */
- u_int neg_ssnhf : 1; /* Negotiate short sequence numbers */
- u_int neg_endpoint : 1; /* Negotiate endpoint discriminator */
-#endif
- u_short mru; /* Value of MRU */
-#ifdef PPP_MULTILINK
- u_short mrru; /* Value of MRRU, and multilink enable */
-#endif
- u_char chap_mdtype; /* which MD type (hashing algorithm) */
- u32_t asyncmap; /* Value of async map */
- u32_t magicnumber;
- int numloops; /* Number of loops during magic number neg. */
- u32_t lqr_period; /* Reporting period for LQR 1/100ths second */
-#ifdef PPP_MULTILINK
- struct epdisc endpoint; /* endpoint discriminator */
-#endif
-} lcp_options;
-
-/*
- * Values for phase from BSD pppd.h based on RFC 1661.
- */
-typedef enum {
- PHASE_DEAD = 0,
- PHASE_INITIALIZE,
- PHASE_ESTABLISH,
- PHASE_AUTHENTICATE,
- PHASE_CALLBACK,
- PHASE_NETWORK,
- PHASE_TERMINATE
-} LinkPhase;
-
-
-/*****************************
-*** PUBLIC DATA STRUCTURES ***
-*****************************/
-
-extern LinkPhase lcp_phase[NUM_PPP]; /* Phase of link session (RFC 1661) */
-extern lcp_options lcp_wantoptions[];
-extern lcp_options lcp_gotoptions[];
-extern lcp_options lcp_allowoptions[];
-extern lcp_options lcp_hisoptions[];
-extern ext_accm xmit_accm[];
-
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-
-void lcp_init (int);
-void lcp_open (int);
-void lcp_close (int, char *);
-void lcp_lowerup (int);
-void lcp_lowerdown (int);
-void lcp_sprotrej (int, u_char *, int); /* send protocol reject */
-
-extern struct protent lcp_protent;
-
-/* Default number of times we receive our magic number from the peer
- before deciding the link is looped-back. */
-#define DEFLOOPBACKFAIL 10
-
-#endif /* LCP_H */
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/magic.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/magic.c
deleted file mode 100644
index 4274016..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/magic.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*****************************************************************************
-* magic.c - Network Random Number Generator program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-04 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original based on BSD magic.c.
-*****************************************************************************/
-/*
- * magic.c - PPP Magic Number routines.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include "ppp.h"
-#include "randm.h"
-#include "magic.h"
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-/*
- * magicInit - Initialize the magic number generator.
- *
- * Since we use another random number generator that has its own
- * initialization, we do nothing here.
- */
-void magicInit()
-{
- return;
-}
-
-/*
- * magic - Returns the next magic number.
- */
-u32_t magic()
-{
- return avRandom();
-}
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/magic.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/magic.h
deleted file mode 100644
index 54619b7..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/magic.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*****************************************************************************
-* magic.h - Network Random Number Generator header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-04 Guy Lancaster <glanca at gesn.com>, Global Election Systems Inc.
-* Original derived from BSD codes.
-*****************************************************************************/
-/*
- * magic.h - PPP Magic Number definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * $Id: magic.h $
- */
-
-#ifndef MAGIC_H
-#define MAGIC_H
-
-/*****************************************************************************
-************************** PUBLIC FUNCTIONS **********************************
-*****************************************************************************/
-
-void magicInit(void); /* Initialize the magic number generator */
-u32_t magic(void); /* Returns the next magic number */
-
-#endif /* MAGIC_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/md5.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/md5.c
deleted file mode 100644
index e077cde..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/md5.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- ***********************************************************************
- ** md5.c -- the source code for MD5 routines **
- ** RSA Data Security, Inc. MD5 Message-Digest Algorithm **
- ** Created: 2/17/90 RLR **
- ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. **
- ***********************************************************************
- */
-
-/*
- ***********************************************************************
- ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
- ** **
- ** License to copy and use this software is granted provided that **
- ** it is identified as the "RSA Data Security, Inc. MD5 Message- **
- ** Digest Algorithm" in all material mentioning or referencing this **
- ** software or this function. **
- ** **
- ** License is also granted to make and use derivative works **
- ** provided that such works are identified as "derived from the RSA **
- ** Data Security, Inc. MD5 Message-Digest Algorithm" in all **
- ** material mentioning or referencing the derived work. **
- ** **
- ** RSA Data Security, Inc. makes no representations concerning **
- ** either the merchantability of this software or the suitability **
- ** of this software for any particular purpose. It is provided "as **
- ** is" without express or implied warranty of any kind. **
- ** **
- ** These notices must be retained in any copies of any part of this **
- ** documentation and/or software. **
- ***********************************************************************
- */
-
-#include "ppp.h"
-#include "md5.h"
-#include "pppdebug.h"
-
-#if CHAP_SUPPORT > 0 || MD5_SUPPORT > 0
-
-/*
- ***********************************************************************
- ** Message-digest routines: **
- ** To form the message digest for a message M **
- ** (1) Initialize a context buffer mdContext using MD5Init **
- ** (2) Call MD5Update on mdContext and M **
- ** (3) Call MD5Final on mdContext **
- ** The message digest is now in mdContext->digest[0...15] **
- ***********************************************************************
- */
-
-/* forward declaration */
-static void Transform (u32_t *buf, u32_t *in);
-
-static unsigned char PADDING[64] = {
- 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-/* F, G, H and I are basic MD5 functions */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
-
-/* ROTATE_LEFT rotates x left n bits */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
-/* Rotation is separate from addition to prevent recomputation */
-#define FF(a, b, c, d, x, s, ac) \
- {(a) += F ((b), (c), (d)) + (x) + (u32_t)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define GG(a, b, c, d, x, s, ac) \
- {(a) += G ((b), (c), (d)) + (x) + (u32_t)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define HH(a, b, c, d, x, s, ac) \
- {(a) += H ((b), (c), (d)) + (x) + (u32_t)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define II(a, b, c, d, x, s, ac) \
- {(a) += I ((b), (c), (d)) + (x) + (u32_t)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-
-#ifdef __STDC__
-#define UL(x) x##UL
-#else
-#ifdef WIN32
-#define UL(x) x##UL
-#else
-#define UL(x) x
-#endif
-#endif
-
-/* The routine MD5Init initializes the message-digest context
- mdContext. All fields are set to zero.
- */
-void MD5Init (MD5_CTX *mdContext)
-{
- mdContext->i[0] = mdContext->i[1] = (u32_t)0;
-
- /* Load magic initialization constants.
- */
- mdContext->buf[0] = (u32_t)0x67452301UL;
- mdContext->buf[1] = (u32_t)0xefcdab89UL;
- mdContext->buf[2] = (u32_t)0x98badcfeUL;
- mdContext->buf[3] = (u32_t)0x10325476UL;
-}
-
-/* The routine MD5Update updates the message-digest context to
- account for the presence of each of the characters inBuf[0..inLen-1]
- in the message whose digest is being computed.
- */
-void MD5Update(MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen)
-{
- u32_t in[16];
- int mdi;
- unsigned int i, ii;
-
-#if 0
- ppp_trace(LOG_INFO, "MD5Update: %u:%.*H\n", inLen, MIN(inLen, 20) * 2, inBuf);
- ppp_trace(LOG_INFO, "MD5Update: %u:%s\n", inLen, inBuf);
-#endif
-
- /* compute number of bytes mod 64 */
- mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
-
- /* update number of bits */
- if ((mdContext->i[0] + ((u32_t)inLen << 3)) < mdContext->i[0])
- mdContext->i[1]++;
- mdContext->i[0] += ((u32_t)inLen << 3);
- mdContext->i[1] += ((u32_t)inLen >> 29);
-
- while (inLen--) {
- /* add new character to buffer, increment mdi */
- mdContext->in[mdi++] = *inBuf++;
-
- /* transform if necessary */
- if (mdi == 0x40) {
- for (i = 0, ii = 0; i < 16; i++, ii += 4)
- in[i] = (((u32_t)mdContext->in[ii+3]) << 24) |
- (((u32_t)mdContext->in[ii+2]) << 16) |
- (((u32_t)mdContext->in[ii+1]) << 8) |
- ((u32_t)mdContext->in[ii]);
- Transform (mdContext->buf, in);
- mdi = 0;
- }
- }
-}
-
-/* The routine MD5Final terminates the message-digest computation and
- ends with the desired message digest in mdContext->digest[0...15].
- */
-void MD5Final (unsigned char hash[], MD5_CTX *mdContext)
-{
- u32_t in[16];
- int mdi;
- unsigned int i, ii;
- unsigned int padLen;
-
- /* save number of bits */
- in[14] = mdContext->i[0];
- in[15] = mdContext->i[1];
-
- /* compute number of bytes mod 64 */
- mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
-
- /* pad out to 56 mod 64 */
- padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
- MD5Update (mdContext, PADDING, padLen);
-
- /* append length in bits and transform */
- for (i = 0, ii = 0; i < 14; i++, ii += 4)
- in[i] = (((u32_t)mdContext->in[ii+3]) << 24) |
- (((u32_t)mdContext->in[ii+2]) << 16) |
- (((u32_t)mdContext->in[ii+1]) << 8) |
- ((u32_t)mdContext->in[ii]);
- Transform (mdContext->buf, in);
-
- /* store buffer in digest */
- for (i = 0, ii = 0; i < 4; i++, ii += 4) {
- mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
- mdContext->digest[ii+1] =
- (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
- mdContext->digest[ii+2] =
- (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
- mdContext->digest[ii+3] =
- (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
- }
- memcpy(hash, mdContext->digest, 16);
-}
-
-/* Basic MD5 step. Transforms buf based on in.
- */
-static void Transform (u32_t *buf, u32_t *in)
-{
- u32_t a = buf[0], b = buf[1], c = buf[2], d = buf[3];
-
- /* Round 1 */
-#define S11 7
-#define S12 12
-#define S13 17
-#define S14 22
- FF ( a, b, c, d, in[ 0], S11, UL(3614090360)); /* 1 */
- FF ( d, a, b, c, in[ 1], S12, UL(3905402710)); /* 2 */
- FF ( c, d, a, b, in[ 2], S13, UL( 606105819)); /* 3 */
- FF ( b, c, d, a, in[ 3], S14, UL(3250441966)); /* 4 */
- FF ( a, b, c, d, in[ 4], S11, UL(4118548399)); /* 5 */
- FF ( d, a, b, c, in[ 5], S12, UL(1200080426)); /* 6 */
- FF ( c, d, a, b, in[ 6], S13, UL(2821735955)); /* 7 */
- FF ( b, c, d, a, in[ 7], S14, UL(4249261313)); /* 8 */
- FF ( a, b, c, d, in[ 8], S11, UL(1770035416)); /* 9 */
- FF ( d, a, b, c, in[ 9], S12, UL(2336552879)); /* 10 */
- FF ( c, d, a, b, in[10], S13, UL(4294925233)); /* 11 */
- FF ( b, c, d, a, in[11], S14, UL(2304563134)); /* 12 */
- FF ( a, b, c, d, in[12], S11, UL(1804603682)); /* 13 */
- FF ( d, a, b, c, in[13], S12, UL(4254626195)); /* 14 */
- FF ( c, d, a, b, in[14], S13, UL(2792965006)); /* 15 */
- FF ( b, c, d, a, in[15], S14, UL(1236535329)); /* 16 */
-
- /* Round 2 */
-#define S21 5
-#define S22 9
-#define S23 14
-#define S24 20
- GG ( a, b, c, d, in[ 1], S21, UL(4129170786)); /* 17 */
- GG ( d, a, b, c, in[ 6], S22, UL(3225465664)); /* 18 */
- GG ( c, d, a, b, in[11], S23, UL( 643717713)); /* 19 */
- GG ( b, c, d, a, in[ 0], S24, UL(3921069994)); /* 20 */
- GG ( a, b, c, d, in[ 5], S21, UL(3593408605)); /* 21 */
- GG ( d, a, b, c, in[10], S22, UL( 38016083)); /* 22 */
- GG ( c, d, a, b, in[15], S23, UL(3634488961)); /* 23 */
- GG ( b, c, d, a, in[ 4], S24, UL(3889429448)); /* 24 */
- GG ( a, b, c, d, in[ 9], S21, UL( 568446438)); /* 25 */
- GG ( d, a, b, c, in[14], S22, UL(3275163606)); /* 26 */
- GG ( c, d, a, b, in[ 3], S23, UL(4107603335)); /* 27 */
- GG ( b, c, d, a, in[ 8], S24, UL(1163531501)); /* 28 */
- GG ( a, b, c, d, in[13], S21, UL(2850285829)); /* 29 */
- GG ( d, a, b, c, in[ 2], S22, UL(4243563512)); /* 30 */
- GG ( c, d, a, b, in[ 7], S23, UL(1735328473)); /* 31 */
- GG ( b, c, d, a, in[12], S24, UL(2368359562)); /* 32 */
-
- /* Round 3 */
-#define S31 4
-#define S32 11
-#define S33 16
-#define S34 23
- HH ( a, b, c, d, in[ 5], S31, UL(4294588738)); /* 33 */
- HH ( d, a, b, c, in[ 8], S32, UL(2272392833)); /* 34 */
- HH ( c, d, a, b, in[11], S33, UL(1839030562)); /* 35 */
- HH ( b, c, d, a, in[14], S34, UL(4259657740)); /* 36 */
- HH ( a, b, c, d, in[ 1], S31, UL(2763975236)); /* 37 */
- HH ( d, a, b, c, in[ 4], S32, UL(1272893353)); /* 38 */
- HH ( c, d, a, b, in[ 7], S33, UL(4139469664)); /* 39 */
- HH ( b, c, d, a, in[10], S34, UL(3200236656)); /* 40 */
- HH ( a, b, c, d, in[13], S31, UL( 681279174)); /* 41 */
- HH ( d, a, b, c, in[ 0], S32, UL(3936430074)); /* 42 */
- HH ( c, d, a, b, in[ 3], S33, UL(3572445317)); /* 43 */
- HH ( b, c, d, a, in[ 6], S34, UL( 76029189)); /* 44 */
- HH ( a, b, c, d, in[ 9], S31, UL(3654602809)); /* 45 */
- HH ( d, a, b, c, in[12], S32, UL(3873151461)); /* 46 */
- HH ( c, d, a, b, in[15], S33, UL( 530742520)); /* 47 */
- HH ( b, c, d, a, in[ 2], S34, UL(3299628645)); /* 48 */
-
- /* Round 4 */
-#define S41 6
-#define S42 10
-#define S43 15
-#define S44 21
- II ( a, b, c, d, in[ 0], S41, UL(4096336452)); /* 49 */
- II ( d, a, b, c, in[ 7], S42, UL(1126891415)); /* 50 */
- II ( c, d, a, b, in[14], S43, UL(2878612391)); /* 51 */
- II ( b, c, d, a, in[ 5], S44, UL(4237533241)); /* 52 */
- II ( a, b, c, d, in[12], S41, UL(1700485571)); /* 53 */
- II ( d, a, b, c, in[ 3], S42, UL(2399980690)); /* 54 */
- II ( c, d, a, b, in[10], S43, UL(4293915773)); /* 55 */
- II ( b, c, d, a, in[ 1], S44, UL(2240044497)); /* 56 */
- II ( a, b, c, d, in[ 8], S41, UL(1873313359)); /* 57 */
- II ( d, a, b, c, in[15], S42, UL(4264355552)); /* 58 */
- II ( c, d, a, b, in[ 6], S43, UL(2734768916)); /* 59 */
- II ( b, c, d, a, in[13], S44, UL(1309151649)); /* 60 */
- II ( a, b, c, d, in[ 4], S41, UL(4149444226)); /* 61 */
- II ( d, a, b, c, in[11], S42, UL(3174756917)); /* 62 */
- II ( c, d, a, b, in[ 2], S43, UL( 718787259)); /* 63 */
- II ( b, c, d, a, in[ 9], S44, UL(3951481745)); /* 64 */
-
- buf[0] += a;
- buf[1] += b;
- buf[2] += c;
- buf[3] += d;
-}
-
-#endif
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/md5.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/md5.h
deleted file mode 100644
index 0e81cdc..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/md5.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- ***********************************************************************
- ** md5.h -- header file for implementation of MD5 **
- ** RSA Data Security, Inc. MD5 Message-Digest Algorithm **
- ** Created: 2/17/90 RLR **
- ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version **
- ** Revised (for MD5): RLR 4/27/91 **
- ** -- G modified to have y&~z instead of y&z **
- ** -- FF, GG, HH modified to add in last register done **
- ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 **
- ** -- distinct additive constant for each step **
- ** -- round 4 added, working mod 7 **
- ***********************************************************************
- */
-
-/*
- ***********************************************************************
- ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
- ** **
- ** License to copy and use this software is granted provided that **
- ** it is identified as the "RSA Data Security, Inc. MD5 Message- **
- ** Digest Algorithm" in all material mentioning or referencing this **
- ** software or this function. **
- ** **
- ** License is also granted to make and use derivative works **
- ** provided that such works are identified as "derived from the RSA **
- ** Data Security, Inc. MD5 Message-Digest Algorithm" in all **
- ** material mentioning or referencing the derived work. **
- ** **
- ** RSA Data Security, Inc. makes no representations concerning **
- ** either the merchantability of this software or the suitability **
- ** of this software for any particular purpose. It is provided "as **
- ** is" without express or implied warranty of any kind. **
- ** **
- ** These notices must be retained in any copies of any part of this **
- ** documentation and/or software. **
- ***********************************************************************
- */
-
-#ifndef MD5_H
-#define MD5_H
-
-/* Data structure for MD5 (Message-Digest) computation */
-typedef struct {
- u32_t i[2]; /* number of _bits_ handled mod 2^64 */
- u32_t buf[4]; /* scratch buffer */
- unsigned char in[64]; /* input buffer */
- unsigned char digest[16]; /* actual digest after MD5Final call */
-} MD5_CTX;
-
-void MD5Init (MD5_CTX *mdContext);
-void MD5Update (MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen);
-void MD5Final (unsigned char hash[], MD5_CTX *mdContext);
-
-#endif /* MD5_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/pap.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/pap.c
deleted file mode 100644
index 23e438f..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/pap.c
+++ /dev/null
@@ -1,608 +0,0 @@
-/*****************************************************************************
-* pap.c - Network Password Authentication Protocol program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-12 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original.
-*****************************************************************************/
-/*
- * upap.c - User/Password Authentication Protocol.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include "ppp.h"
-#include "auth.h"
-#include "pap.h"
-#include "pppdebug.h"
-
-
-#if PAP_SUPPORT > 0
-
-/***********************************/
-/*** LOCAL FUNCTION DECLARATIONS ***/
-/***********************************/
-/*
- * Protocol entry points.
- */
-static void upap_init (int);
-static void upap_lowerup (int);
-static void upap_lowerdown (int);
-static void upap_input (int, u_char *, int);
-static void upap_protrej (int);
-
-static void upap_timeout (void *);
-static void upap_reqtimeout (void *);
-static void upap_rauthreq (upap_state *, u_char *, int, int);
-static void upap_rauthack (upap_state *, u_char *, int, int);
-static void upap_rauthnak (upap_state *, u_char *, int, int);
-static void upap_sauthreq (upap_state *);
-static void upap_sresp (upap_state *, u_char, u_char, char *, int);
-
-
-
-
-/******************************/
-/*** PUBLIC DATA STRUCTURES ***/
-/******************************/
-struct protent pap_protent = {
- PPP_PAP,
- upap_init,
- upap_input,
- upap_protrej,
- upap_lowerup,
- upap_lowerdown,
- NULL,
- NULL,
-#if 0
- upap_printpkt,
- NULL,
-#endif
- 1,
- "PAP",
-#if 0
- NULL,
- NULL,
- NULL
-#endif
-};
-
-upap_state upap[NUM_PPP]; /* UPAP state; one for each unit */
-
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-/*
- * Set the default login name and password for the pap sessions
- */
-void upap_setloginpasswd(int unit, const char *luser, const char *lpassword)
-{
- upap_state *u = &upap[unit];
-
- /* Save the username and password we're given */
- u->us_user = luser;
- u->us_userlen = strlen(luser);
- u->us_passwd = lpassword;
- u->us_passwdlen = strlen(lpassword);
-}
-
-
-/*
- * upap_authwithpeer - Authenticate us with our peer (start client).
- *
- * Set new state and send authenticate's.
- */
-void upap_authwithpeer(int unit, char *user, char *password)
-{
- upap_state *u = &upap[unit];
-
- UPAPDEBUG((LOG_INFO, "upap_authwithpeer: %d user=%s password=%s s=%d\n",
- unit, user, password, u->us_clientstate));
-
- upap_setloginpasswd(unit, user, password);
-
- u->us_transmits = 0;
-
- /* Lower layer up yet? */
- if (u->us_clientstate == UPAPCS_INITIAL ||
- u->us_clientstate == UPAPCS_PENDING) {
- u->us_clientstate = UPAPCS_PENDING;
- return;
- }
-
- upap_sauthreq(u); /* Start protocol */
-}
-
-
-/*
- * upap_authpeer - Authenticate our peer (start server).
- *
- * Set new state.
- */
-void upap_authpeer(int unit)
-{
- upap_state *u = &upap[unit];
-
- /* Lower layer up yet? */
- if (u->us_serverstate == UPAPSS_INITIAL ||
- u->us_serverstate == UPAPSS_PENDING) {
- u->us_serverstate = UPAPSS_PENDING;
- return;
- }
-
- u->us_serverstate = UPAPSS_LISTEN;
- if (u->us_reqtimeout > 0)
- TIMEOUT(upap_reqtimeout, u, u->us_reqtimeout);
-}
-
-
-
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-/*
- * upap_init - Initialize a UPAP unit.
- */
-static void upap_init(int unit)
-{
- upap_state *u = &upap[unit];
-
- UPAPDEBUG((LOG_INFO, "upap_init: %d\n", unit));
- u->us_unit = unit;
- u->us_user = NULL;
- u->us_userlen = 0;
- u->us_passwd = NULL;
- u->us_passwdlen = 0;
- u->us_clientstate = UPAPCS_INITIAL;
- u->us_serverstate = UPAPSS_INITIAL;
- u->us_id = 0;
- u->us_timeouttime = UPAP_DEFTIMEOUT;
- u->us_maxtransmits = 10;
- u->us_reqtimeout = UPAP_DEFREQTIME;
-}
-
-/*
- * upap_timeout - Retransmission timer for sending auth-reqs expired.
- */
-static void upap_timeout(void *arg)
-{
- upap_state *u = (upap_state *) arg;
-
- UPAPDEBUG((LOG_INFO, "upap_timeout: %d timeout %d expired s=%d\n",
- u->us_unit, u->us_timeouttime, u->us_clientstate));
-
- if (u->us_clientstate != UPAPCS_AUTHREQ)
- return;
-
- if (u->us_transmits >= u->us_maxtransmits) {
- /* give up in disgust */
- UPAPDEBUG((LOG_ERR, "No response to PAP authenticate-requests\n"));
- u->us_clientstate = UPAPCS_BADAUTH;
- auth_withpeer_fail(u->us_unit, PPP_PAP);
- return;
- }
-
- upap_sauthreq(u); /* Send Authenticate-Request */
-}
-
-
-/*
- * upap_reqtimeout - Give up waiting for the peer to send an auth-req.
- */
-static void upap_reqtimeout(void *arg)
-{
- upap_state *u = (upap_state *) arg;
-
- if (u->us_serverstate != UPAPSS_LISTEN)
- return; /* huh?? */
-
- auth_peer_fail(u->us_unit, PPP_PAP);
- u->us_serverstate = UPAPSS_BADAUTH;
-}
-
-
-/*
- * upap_lowerup - The lower layer is up.
- *
- * Start authenticating if pending.
- */
-static void upap_lowerup(int unit)
-{
- upap_state *u = &upap[unit];
-
- UPAPDEBUG((LOG_INFO, "upap_lowerup: %d s=%d\n", unit, u->us_clientstate));
-
- if (u->us_clientstate == UPAPCS_INITIAL)
- u->us_clientstate = UPAPCS_CLOSED;
- else if (u->us_clientstate == UPAPCS_PENDING) {
- upap_sauthreq(u); /* send an auth-request */
- }
-
- if (u->us_serverstate == UPAPSS_INITIAL)
- u->us_serverstate = UPAPSS_CLOSED;
- else if (u->us_serverstate == UPAPSS_PENDING) {
- u->us_serverstate = UPAPSS_LISTEN;
- if (u->us_reqtimeout > 0)
- TIMEOUT(upap_reqtimeout, u, u->us_reqtimeout);
- }
-}
-
-
-/*
- * upap_lowerdown - The lower layer is down.
- *
- * Cancel all timeouts.
- */
-static void upap_lowerdown(int unit)
-{
- upap_state *u = &upap[unit];
-
- UPAPDEBUG((LOG_INFO, "upap_lowerdown: %d s=%d\n", unit, u->us_clientstate));
-
- if (u->us_clientstate == UPAPCS_AUTHREQ) /* Timeout pending? */
- UNTIMEOUT(upap_timeout, u); /* Cancel timeout */
- if (u->us_serverstate == UPAPSS_LISTEN && u->us_reqtimeout > 0)
- UNTIMEOUT(upap_reqtimeout, u);
-
- u->us_clientstate = UPAPCS_INITIAL;
- u->us_serverstate = UPAPSS_INITIAL;
-}
-
-
-/*
- * upap_protrej - Peer doesn't speak this protocol.
- *
- * This shouldn't happen. In any case, pretend lower layer went down.
- */
-static void upap_protrej(int unit)
-{
- upap_state *u = &upap[unit];
-
- if (u->us_clientstate == UPAPCS_AUTHREQ) {
- UPAPDEBUG((LOG_ERR, "PAP authentication failed due to protocol-reject\n"));
- auth_withpeer_fail(unit, PPP_PAP);
- }
- if (u->us_serverstate == UPAPSS_LISTEN) {
- UPAPDEBUG((LOG_ERR, "PAP authentication of peer failed (protocol-reject)\n"));
- auth_peer_fail(unit, PPP_PAP);
- }
- upap_lowerdown(unit);
-}
-
-
-/*
- * upap_input - Input UPAP packet.
- */
-static void upap_input(int unit, u_char *inpacket, int l)
-{
- upap_state *u = &upap[unit];
- u_char *inp;
- u_char code, id;
- int len;
-
- /*
- * Parse header (code, id and length).
- * If packet too short, drop it.
- */
- inp = inpacket;
- if (l < UPAP_HEADERLEN) {
- UPAPDEBUG((LOG_INFO, "pap_input: rcvd short header.\n"));
- return;
- }
- GETCHAR(code, inp);
- GETCHAR(id, inp);
- GETSHORT(len, inp);
- if (len < UPAP_HEADERLEN) {
- UPAPDEBUG((LOG_INFO, "pap_input: rcvd illegal length.\n"));
- return;
- }
- if (len > l) {
- UPAPDEBUG((LOG_INFO, "pap_input: rcvd short packet.\n"));
- return;
- }
- len -= UPAP_HEADERLEN;
-
- /*
- * Action depends on code.
- */
- switch (code) {
- case UPAP_AUTHREQ:
- upap_rauthreq(u, inp, id, len);
- break;
-
- case UPAP_AUTHACK:
- upap_rauthack(u, inp, id, len);
- break;
-
- case UPAP_AUTHNAK:
- upap_rauthnak(u, inp, id, len);
- break;
-
- default: /* XXX Need code reject */
- break;
- }
-}
-
-
-/*
- * upap_rauth - Receive Authenticate.
- */
-static void upap_rauthreq(
- upap_state *u,
- u_char *inp,
- int id,
- int len
-)
-{
- u_char ruserlen, rpasswdlen;
- char *ruser, *rpasswd;
- int retcode;
- char *msg;
- int msglen;
-
- UPAPDEBUG((LOG_INFO, "pap_rauth: Rcvd id %d.\n", id));
-
- if (u->us_serverstate < UPAPSS_LISTEN)
- return;
-
- /*
- * If we receive a duplicate authenticate-request, we are
- * supposed to return the same status as for the first request.
- */
- if (u->us_serverstate == UPAPSS_OPEN) {
- upap_sresp(u, UPAP_AUTHACK, id, "", 0); /* return auth-ack */
- return;
- }
- if (u->us_serverstate == UPAPSS_BADAUTH) {
- upap_sresp(u, UPAP_AUTHNAK, id, "", 0); /* return auth-nak */
- return;
- }
-
- /*
- * Parse user/passwd.
- */
- if (len < sizeof (u_char)) {
- UPAPDEBUG((LOG_INFO, "pap_rauth: rcvd short packet.\n"));
- return;
- }
- GETCHAR(ruserlen, inp);
- len -= sizeof (u_char) + ruserlen + sizeof (u_char);
- if (len < 0) {
- UPAPDEBUG((LOG_INFO, "pap_rauth: rcvd short packet.\n"));
- return;
- }
- ruser = (char *) inp;
- INCPTR(ruserlen, inp);
- GETCHAR(rpasswdlen, inp);
- if (len < rpasswdlen) {
- UPAPDEBUG((LOG_INFO, "pap_rauth: rcvd short packet.\n"));
- return;
- }
- rpasswd = (char *) inp;
-
- /*
- * Check the username and password given.
- */
- retcode = check_passwd(u->us_unit, ruser, ruserlen, rpasswd,
- rpasswdlen, &msg, &msglen);
- BZERO(rpasswd, rpasswdlen);
-
- upap_sresp(u, retcode, id, msg, msglen);
-
- if (retcode == UPAP_AUTHACK) {
- u->us_serverstate = UPAPSS_OPEN;
- auth_peer_success(u->us_unit, PPP_PAP, ruser, ruserlen);
- } else {
- u->us_serverstate = UPAPSS_BADAUTH;
- auth_peer_fail(u->us_unit, PPP_PAP);
- }
-
- if (u->us_reqtimeout > 0)
- UNTIMEOUT(upap_reqtimeout, u);
-}
-
-
-/*
- * upap_rauthack - Receive Authenticate-Ack.
- */
-static void upap_rauthack(
- upap_state *u,
- u_char *inp,
- int id,
- int len
-)
-{
- u_char msglen;
- char *msg;
-
- UPAPDEBUG((LOG_INFO, "pap_rauthack: Rcvd id %d s=%d\n", id, u->us_clientstate));
-
- if (u->us_clientstate != UPAPCS_AUTHREQ) /* XXX */
- return;
-
- /*
- * Parse message.
- */
- if (len < sizeof (u_char)) {
- UPAPDEBUG((LOG_INFO, "pap_rauthack: rcvd short packet.\n"));
- return;
- }
- GETCHAR(msglen, inp);
- len -= sizeof (u_char);
- if (len < msglen) {
- UPAPDEBUG((LOG_INFO, "pap_rauthack: rcvd short packet.\n"));
- return;
- }
- msg = (char *) inp;
- PRINTMSG(msg, msglen);
-
- u->us_clientstate = UPAPCS_OPEN;
-
- auth_withpeer_success(u->us_unit, PPP_PAP);
-}
-
-
-/*
- * upap_rauthnak - Receive Authenticate-Nakk.
- */
-static void upap_rauthnak(
- upap_state *u,
- u_char *inp,
- int id,
- int len
-)
-{
- u_char msglen;
- char *msg;
-
- UPAPDEBUG((LOG_INFO, "pap_rauthnak: Rcvd id %d s=%d\n", id, u->us_clientstate));
-
- if (u->us_clientstate != UPAPCS_AUTHREQ) /* XXX */
- return;
-
- /*
- * Parse message.
- */
- if (len < sizeof (u_char)) {
- UPAPDEBUG((LOG_INFO, "pap_rauthnak: rcvd short packet.\n"));
- return;
- }
- GETCHAR(msglen, inp);
- len -= sizeof (u_char);
- if (len < msglen) {
- UPAPDEBUG((LOG_INFO, "pap_rauthnak: rcvd short packet.\n"));
- return;
- }
- msg = (char *) inp;
- PRINTMSG(msg, msglen);
-
- u->us_clientstate = UPAPCS_BADAUTH;
-
- UPAPDEBUG((LOG_ERR, "PAP authentication failed\n"));
- auth_withpeer_fail(u->us_unit, PPP_PAP);
-}
-
-
-/*
- * upap_sauthreq - Send an Authenticate-Request.
- */
-static void upap_sauthreq(upap_state *u)
-{
- u_char *outp;
- int outlen;
-
- outlen = UPAP_HEADERLEN + 2 * sizeof (u_char)
- + u->us_userlen + u->us_passwdlen;
- outp = outpacket_buf[u->us_unit];
-
- MAKEHEADER(outp, PPP_PAP);
-
- PUTCHAR(UPAP_AUTHREQ, outp);
- PUTCHAR(++u->us_id, outp);
- PUTSHORT(outlen, outp);
- PUTCHAR(u->us_userlen, outp);
- BCOPY(u->us_user, outp, u->us_userlen);
- INCPTR(u->us_userlen, outp);
- PUTCHAR(u->us_passwdlen, outp);
- BCOPY(u->us_passwd, outp, u->us_passwdlen);
-
- pppWrite(u->us_unit, outpacket_buf[u->us_unit], outlen + PPP_HDRLEN);
-
- UPAPDEBUG((LOG_INFO, "pap_sauth: Sent id %d\n", u->us_id));
-
- TIMEOUT(upap_timeout, u, u->us_timeouttime);
- ++u->us_transmits;
- u->us_clientstate = UPAPCS_AUTHREQ;
-}
-
-
-/*
- * upap_sresp - Send a response (ack or nak).
- */
-static void upap_sresp(
- upap_state *u,
- u_char code,
- u_char id,
- char *msg,
- int msglen
-)
-{
- u_char *outp;
- int outlen;
-
- outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen;
- outp = outpacket_buf[u->us_unit];
- MAKEHEADER(outp, PPP_PAP);
-
- PUTCHAR(code, outp);
- PUTCHAR(id, outp);
- PUTSHORT(outlen, outp);
- PUTCHAR(msglen, outp);
- BCOPY(msg, outp, msglen);
- pppWrite(u->us_unit, outpacket_buf[u->us_unit], outlen + PPP_HDRLEN);
-
- UPAPDEBUG((LOG_INFO, "pap_sresp: Sent code %d, id %d s=%d\n",
- code, id, u->us_clientstate));
-}
-
-#if 0
-/*
- * upap_printpkt - print the contents of a PAP packet.
- */
-static int upap_printpkt(
- u_char *p,
- int plen,
- void (*printer) (void *, char *, ...),
- void *arg
-)
-{
- (void)p;
- (void)plen;
- (void)printer;
- (void)arg;
- return 0;
-}
-#endif
-
-#endif /* PAP_SUPPORT */
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/pap.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/pap.h
deleted file mode 100644
index 215c8a4..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/pap.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*****************************************************************************
-* pap.h - PPP Password Authentication Protocol header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-12-04 Guy Lancaster <glanca at gesn.com>, Global Election Systems Inc.
-* Original derived from BSD codes.
-*****************************************************************************/
-/*
- * upap.h - User/Password Authentication Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-
-#ifndef PAP_H
-#define PAP_H
-
-/*************************
-*** PUBLIC DEFINITIONS ***
-*************************/
-/*
- * Packet header = Code, id, length.
- */
-#define UPAP_HEADERLEN (sizeof (u_char) + sizeof (u_char) + sizeof (u_short))
-
-
-/*
- * UPAP codes.
- */
-#define UPAP_AUTHREQ 1 /* Authenticate-Request */
-#define UPAP_AUTHACK 2 /* Authenticate-Ack */
-#define UPAP_AUTHNAK 3 /* Authenticate-Nak */
-
-/*
- * Client states.
- */
-#define UPAPCS_INITIAL 0 /* Connection down */
-#define UPAPCS_CLOSED 1 /* Connection up, haven't requested auth */
-#define UPAPCS_PENDING 2 /* Connection down, have requested auth */
-#define UPAPCS_AUTHREQ 3 /* We've sent an Authenticate-Request */
-#define UPAPCS_OPEN 4 /* We've received an Ack */
-#define UPAPCS_BADAUTH 5 /* We've received a Nak */
-
-/*
- * Server states.
- */
-#define UPAPSS_INITIAL 0 /* Connection down */
-#define UPAPSS_CLOSED 1 /* Connection up, haven't requested auth */
-#define UPAPSS_PENDING 2 /* Connection down, have requested auth */
-#define UPAPSS_LISTEN 3 /* Listening for an Authenticate */
-#define UPAPSS_OPEN 4 /* We've sent an Ack */
-#define UPAPSS_BADAUTH 5 /* We've sent a Nak */
-
-
-/************************
-*** PUBLIC DATA TYPES ***
-************************/
-
-/*
- * Each interface is described by upap structure.
- */
-typedef struct upap_state {
- int us_unit; /* Interface unit number */
- const char *us_user; /* User */
- int us_userlen; /* User length */
- const char *us_passwd; /* Password */
- int us_passwdlen; /* Password length */
- int us_clientstate; /* Client state */
- int us_serverstate; /* Server state */
- u_char us_id; /* Current id */
- int us_timeouttime; /* Timeout (seconds) for auth-req retrans. */
- int us_transmits; /* Number of auth-reqs sent */
- int us_maxtransmits; /* Maximum number of auth-reqs to send */
- int us_reqtimeout; /* Time to wait for auth-req from peer */
-} upap_state;
-
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-
-extern upap_state upap[];
-
-void upap_setloginpasswd(int unit, const char *luser, const char *lpassword);
-void upap_authwithpeer (int, char *, char *);
-void upap_authpeer (int);
-
-extern struct protent pap_protent;
-
-#endif /* PAP_H */
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.c
deleted file mode 100644
index 5295f6a..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.c
+++ /dev/null
@@ -1,1631 +0,0 @@
-/*****************************************************************************
-* ppp.c - Network Point to Point Protocol program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-11-05 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original.
-*****************************************************************************/
-
-/*
- * ppp_defs.h - PPP definitions.
- *
- * if_pppvar.h - private structures and declarations for PPP.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies. This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
- */
-
-/*
- * if_ppp.h - Point-to-Point Protocol definitions.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#include <string.h>
-
-#include "ppp.h"
-#if PPP_SUPPORT > 0
-#include "randm.h"
-#include "fsm.h"
-#if PAP_SUPPORT > 0
-#include "pap.h"
-#endif
-#if CHAP_SUPPORT > 0
-#include "chap.h"
-#endif
-#include "ipcp.h"
-#include "lcp.h"
-#include "magic.h"
-#include "auth.h"
-#if VJ_SUPPORT > 0
-#include "vj.h"
-#endif
-
-#include "pppdebug.h"
-
-/*************************/
-/*** LOCAL DEFINITIONS ***/
-/*************************/
-
-/*
- * The basic PPP frame.
- */
-#define PPP_ADDRESS(p) (((u_char *)(p))[0])
-#define PPP_CONTROL(p) (((u_char *)(p))[1])
-#define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3])
-
-/* PPP packet parser states. Current state indicates operation yet to be
- * completed. */
-typedef enum {
- PDIDLE = 0, /* Idle state - waiting. */
- PDSTART, /* Process start flag. */
- PDADDRESS, /* Process address field. */
- PDCONTROL, /* Process control field. */
- PDPROTOCOL1, /* Process protocol field 1. */
- PDPROTOCOL2, /* Process protocol field 2. */
- PDDATA /* Process data byte. */
-} PPPDevStates;
-
-#define ESCAPE_P(accm, c) ((accm)[(c) >> 3] & pppACCMMask[c & 0x07])
-
-/************************/
-/*** LOCAL DATA TYPES ***/
-/************************/
-/*
- * PPP interface control block.
- */
-typedef struct PPPControl_s {
- char openFlag; /* True when in use. */
- char oldFrame; /* Old framing character for fd. */
- sio_fd_t fd; /* File device ID of port. */
- int kill_link; /* Shut the link down. */
- int sig_hup; /* Carrier lost. */
- int if_up; /* True when the interface is up. */
- int errCode; /* Code indicating why interface is down. */
- struct pbuf *inHead, *inTail; /* The input packet. */
- PPPDevStates inState; /* The input process state. */
- char inEscaped; /* Escape next character. */
- u16_t inProtocol; /* The input protocol code. */
- u16_t inFCS; /* Input Frame Check Sequence value. */
- int mtu; /* Peer's mru */
- int pcomp; /* Does peer accept protocol compression? */
- int accomp; /* Does peer accept addr/ctl compression? */
- u_long lastXMit; /* Time of last transmission. */
- ext_accm inACCM; /* Async-Ctl-Char-Map for input. */
- ext_accm outACCM; /* Async-Ctl-Char-Map for output. */
-#if VJ_SUPPORT > 0
- int vjEnabled; /* Flag indicating VJ compression enabled. */
- struct vjcompress vjComp; /* Van Jabobsen compression header. */
-#endif
-
- struct netif netif;
-
- struct ppp_addrs addrs;
-
- void (*linkStatusCB)(void *ctx, int errCode, void *arg);
- void *linkStatusCtx;
-
-} PPPControl;
-
-
-/*
- * Ioctl definitions.
- */
-
-struct npioctl {
- int protocol; /* PPP procotol, e.g. PPP_IP */
- enum NPmode mode;
-};
-
-
-
-/***********************************/
-/*** LOCAL FUNCTION DECLARATIONS ***/
-/***********************************/
-static void pppMain(void *pd);
-static void pppDrop(PPPControl *pc);
-static void pppInProc(int pd, u_char *s, int l);
-
-
-/******************************/
-/*** PUBLIC DATA STRUCTURES ***/
-/******************************/
-u_long subnetMask;
-
-static PPPControl pppControl[NUM_PPP]; /* The PPP interface control blocks. */
-
-/*
- * PPP Data Link Layer "protocol" table.
- * One entry per supported protocol.
- * The last entry must be NULL.
- */
-struct protent *ppp_protocols[] = {
- &lcp_protent,
-#if PAP_SUPPORT > 0
- &pap_protent,
-#endif
-#if CHAP_SUPPORT > 0
- &chap_protent,
-#endif
-#if CBCP_SUPPORT > 0
- &cbcp_protent,
-#endif
- &ipcp_protent,
-#if CCP_SUPPORT > 0
- &ccp_protent,
-#endif
- NULL
-};
-
-
-/*
- * Buffers for outgoing packets. This must be accessed only from the appropriate
- * PPP task so that it doesn't need to be protected to avoid collisions.
- */
-u_char outpacket_buf[NUM_PPP][PPP_MRU+PPP_HDRLEN];
-
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-
-/*
- * FCS lookup table as calculated by genfcstab.
- */
-static const u_short fcstab[256] = {
- 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
- 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
- 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
- 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
- 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
- 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
- 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
- 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
- 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
- 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
- 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
- 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
- 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
- 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
- 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
- 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
- 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
- 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
- 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
- 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
- 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
- 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
- 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
- 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
- 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
- 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
- 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
- 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
- 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
- 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
- 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
- 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
-};
-
-/* PPP's Asynchronous-Control-Character-Map. The mask array is used
- * to select the specific bit for a character. */
-static u_char pppACCMMask[] = {
- 0x01,
- 0x02,
- 0x04,
- 0x08,
- 0x10,
- 0x20,
- 0x40,
- 0x80
-};
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-/* Initialize the PPP subsystem. */
-
-struct ppp_settings ppp_settings;
-
-void pppInit(void)
-{
- struct protent *protp;
- int i, j;
-
- memset(&ppp_settings, 0, sizeof(ppp_settings));
- ppp_settings.usepeerdns = 1;
- pppSetAuth(PPPAUTHTYPE_NONE, NULL, NULL);
-
- magicInit();
-
- for (i = 0; i < NUM_PPP; i++) {
- pppControl[i].openFlag = 0;
-
- subnetMask = htonl(0xffffff00);
-
- /*
- * Initialize to the standard option set.
- */
- for (j = 0; (protp = ppp_protocols[j]) != NULL; ++j)
- (*protp->init)(i);
- }
-
-#if LINK_STATS
- /* Clear the statistics. */
- memset(&lwip_stats.link, 0, sizeof(lwip_stats.link));
-#endif
-}
-
-void pppSetAuth(enum pppAuthType authType, const char *user, const char *passwd)
-{
- switch(authType) {
- case PPPAUTHTYPE_NONE:
- default:
-#ifdef LWIP_PPP_STRICT_PAP_REJECT
- ppp_settings.refuse_pap = 1;
-#else
- /* some providers request pap and accept an empty login/pw */
- ppp_settings.refuse_pap = 0;
-#endif
- ppp_settings.refuse_chap = 1;
- break;
- case PPPAUTHTYPE_ANY:
-/* Warning: Using PPPAUTHTYPE_ANY might have security consequences.
- * RFC 1994 says:
- *
- * In practice, within or associated with each PPP server, there is a
- * database which associates "user" names with authentication
- * information ("secrets"). It is not anticipated that a particular
- * named user would be authenticated by multiple methods. This would
- * make the user vulnerable to attacks which negotiate the least secure
- * method from among a set (such as PAP rather than CHAP). If the same
- * secret was used, PAP would reveal the secret to be used later with
- * CHAP.
- *
- * Instead, for each user name there should be an indication of exactly
- * one method used to authenticate that user name. If a user needs to
- * make use of different authentication methods under different
- * circumstances, then distinct user names SHOULD be employed, each of
- * which identifies exactly one authentication method.
- *
- */
- ppp_settings.refuse_pap = 0;
- ppp_settings.refuse_chap = 0;
- break;
- case PPPAUTHTYPE_PAP:
- ppp_settings.refuse_pap = 0;
- ppp_settings.refuse_chap = 1;
- break;
- case PPPAUTHTYPE_CHAP:
- ppp_settings.refuse_pap = 1;
- ppp_settings.refuse_chap = 0;
- break;
- }
-
- if(user) {
- strncpy(ppp_settings.user, user, sizeof(ppp_settings.user)-1);
- ppp_settings.user[sizeof(ppp_settings.user)-1] = '\0';
- } else
- ppp_settings.user[0] = '\0';
-
- if(passwd) {
- strncpy(ppp_settings.passwd, passwd, sizeof(ppp_settings.passwd)-1);
- ppp_settings.passwd[sizeof(ppp_settings.passwd)-1] = '\0';
- } else
- ppp_settings.passwd[0] = '\0';
-}
-
-/* Open a new PPP connection using the given I/O device.
- * This initializes the PPP control block but does not
- * attempt to negotiate the LCP session. If this port
- * connects to a modem, the modem connection must be
- * established before calling this.
- * Return a new PPP connection descriptor on success or
- * an error code (negative) on failure. */
-int pppOpen(sio_fd_t fd, void (*linkStatusCB)(void *ctx, int errCode, void *arg), void *linkStatusCtx)
-{
- PPPControl *pc;
- int pd;
-
- /* Find a free PPP session descriptor. Critical region? */
- for (pd = 0; pd < NUM_PPP && pppControl[pd].openFlag != 0; pd++);
- if (pd >= NUM_PPP)
- pd = PPPERR_OPEN;
- else
- pppControl[pd].openFlag = !0;
-
- /* Launch a deamon thread. */
- if (pd >= 0) {
-
- pppControl[pd].openFlag = 1;
-
- lcp_init(pd);
- pc = &pppControl[pd];
- pc->fd = fd;
- pc->kill_link = 0;
- pc->sig_hup = 0;
- pc->if_up = 0;
- pc->errCode = 0;
- pc->inState = PDIDLE;
- pc->inHead = NULL;
- pc->inTail = NULL;
- pc->inEscaped = 0;
- pc->lastXMit = 0;
-
-#if VJ_SUPPORT > 0
- pc->vjEnabled = 0;
- vj_compress_init(&pc->vjComp);
-#endif
-
- /*
- * Default the in and out accm so that escape and flag characters
- * are always escaped.
- */
- memset(pc->inACCM, 0, sizeof(ext_accm));
- pc->inACCM[15] = 0x60;
- memset(pc->outACCM, 0, sizeof(ext_accm));
- pc->outACCM[15] = 0x60;
-
- pc->linkStatusCB = linkStatusCB;
- pc->linkStatusCtx = linkStatusCtx;
-
- sys_thread_new(pppMain, (void*)pd, PPP_THREAD_PRIO);
- if(!linkStatusCB) {
- while(pd >= 0 && !pc->if_up) {
- sys_msleep(500);
- if (lcp_phase[pd] == PHASE_DEAD) {
- pppClose(pd);
- if (pc->errCode)
- pd = pc->errCode;
- else
- pd = PPPERR_CONNECT;
- }
- }
- }
- }
- return pd;
-}
-
-/* Close a PPP connection and release the descriptor.
- * Any outstanding packets in the queues are dropped.
- * Return 0 on success, an error code on failure. */
-int pppClose(int pd)
-{
- PPPControl *pc = &pppControl[pd];
- int st = 0;
-
- /* Disconnect */
- pc->kill_link = !0;
- pppMainWakeup(pd);
-
- if(!pc->linkStatusCB) {
- while(st >= 0 && lcp_phase[pd] != PHASE_DEAD) {
- sys_msleep(500);
- break;
- }
- }
- return st;
-}
-
-/* This function is called when carrier is lost on the PPP channel. */
-void pppSigHUP(int pd)
-{
- PPPControl *pc = &pppControl[pd];
-
- pc->sig_hup = 1;
- pppMainWakeup(pd);
-}
-
-static void nPut(PPPControl *pc, struct pbuf *nb)
-{
- struct pbuf *b;
- int c;
-
- for(b = nb; b != NULL; b = b->next) {
- if((c = sio_write(pc->fd, b->payload, b->len)) != b->len) {
- PPPDEBUG((LOG_WARNING,
- "PPP nPut: incomplete sio_write(%d,, %u) = %d\n", pc->fd, b->len, c));
-#if LINK_STATS
- lwip_stats.link.err++;
-#endif /* LINK_STATS */
- pc->lastXMit = 0; /* prepend PPP_FLAG to next packet */
- break;
- }
- }
- pbuf_free(nb);
-
-#if LINK_STATS
- lwip_stats.link.xmit++;
-#endif /* LINK_STATS */
-}
-
-/*
- * pppAppend - append given character to end of given pbuf. If outACCM
- * is not NULL and the character needs to be escaped, do so.
- * If pbuf is full, append another.
- * Return the current pbuf.
- */
-static struct pbuf *pppAppend(u_char c, struct pbuf *nb, ext_accm *outACCM)
-{
- struct pbuf *tb = nb;
-
- /* Make sure there is room for the character and an escape code.
- * Sure we don't quite fill the buffer if the character doesn't
- * get escaped but is one character worth complicating this? */
- /* Note: We assume no packet header. */
- if (nb && (PBUF_POOL_BUFSIZE - nb->len) < 2) {
- tb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
- if (tb) {
- nb->next = tb;
- }
-#if LINK_STATS
- else {
- lwip_stats.link.memerr++;
- }
-#endif /* LINK_STATS */
- nb = tb;
- }
- if (nb) {
- if (outACCM && ESCAPE_P(*outACCM, c)) {
- *((u_char*)nb->payload + nb->len++) = PPP_ESCAPE;
- *((u_char*)nb->payload + nb->len++) = c ^ PPP_TRANS;
- }
- else
- *((u_char*)nb->payload + nb->len++) = c;
- }
-
- return tb;
-}
-
-/* Send a packet on the given connection. */
-static err_t pppifOutput(struct netif *netif, struct pbuf *pb, struct ip_addr *ipaddr)
-{
- int pd = (int)netif->state;
- u_short protocol = PPP_IP;
- PPPControl *pc = &pppControl[pd];
- u_int fcsOut = PPP_INITFCS;
- struct pbuf *headMB = NULL, *tailMB = NULL, *p;
- u_char c;
-
- (void)ipaddr;
-
- /* Validate parameters. */
- /* We let any protocol value go through - it can't hurt us
- * and the peer will just drop it if it's not accepting it. */
- if (pd < 0 || pd >= NUM_PPP || !pc->openFlag || !pb) {
- PPPDEBUG((LOG_WARNING, "pppifOutput[%d]: bad parms prot=%d pb=%p\n",
- pd, protocol, pb));
-#if LINK_STATS
- lwip_stats.link.opterr++;
- lwip_stats.link.drop++;
-#endif
- return ERR_ARG;
- }
-
- /* Check that the link is up. */
- if (lcp_phase[pd] == PHASE_DEAD) {
- PPPDEBUG((LOG_ERR, "pppifOutput[%d]: link not up\n", pd));
-#if LINK_STATS
- lwip_stats.link.rterr++;
- lwip_stats.link.drop++;
-#endif
- return ERR_RTE;
- }
-
- /* Grab an output buffer. */
- headMB = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
- if (headMB == NULL) {
- PPPDEBUG((LOG_WARNING, "pppifOutput[%d]: first alloc fail\n", pd));
-#if LINK_STATS
- lwip_stats.link.memerr++;
- lwip_stats.link.drop++;
-#endif /* LINK_STATS */
- return ERR_MEM;
- }
-
-#if VJ_SUPPORT > 0
- /*
- * Attempt Van Jacobson header compression if VJ is configured and
- * this is an IP packet.
- */
- if (protocol == PPP_IP && pc->vjEnabled) {
- switch (vj_compress_tcp(&pc->vjComp, pb)) {
- case TYPE_IP:
- /* No change...
- protocol = PPP_IP_PROTOCOL;
- */
- break;
- case TYPE_COMPRESSED_TCP:
- protocol = PPP_VJC_COMP;
- break;
- case TYPE_UNCOMPRESSED_TCP:
- protocol = PPP_VJC_UNCOMP;
- break;
- default:
- PPPDEBUG((LOG_WARNING, "pppifOutput[%d]: bad IP packet\n", pd));
-#if LINK_STATS
- lwip_stats.link.proterr++;
- lwip_stats.link.drop++;
-#endif
- pbuf_free(headMB);
- return ERR_VAL;
- }
- }
-#endif
-
- tailMB = headMB;
-
- /* Build the PPP header. */
- if ((sys_jiffies() - pc->lastXMit) >= PPP_MAXIDLEFLAG)
- tailMB = pppAppend(PPP_FLAG, tailMB, NULL);
- pc->lastXMit = sys_jiffies();
- if (!pc->accomp) {
- fcsOut = PPP_FCS(fcsOut, PPP_ALLSTATIONS);
- tailMB = pppAppend(PPP_ALLSTATIONS, tailMB, &pc->outACCM);
- fcsOut = PPP_FCS(fcsOut, PPP_UI);
- tailMB = pppAppend(PPP_UI, tailMB, &pc->outACCM);
- }
- if (!pc->pcomp || protocol > 0xFF) {
- c = (protocol >> 8) & 0xFF;
- fcsOut = PPP_FCS(fcsOut, c);
- tailMB = pppAppend(c, tailMB, &pc->outACCM);
- }
- c = protocol & 0xFF;
- fcsOut = PPP_FCS(fcsOut, c);
- tailMB = pppAppend(c, tailMB, &pc->outACCM);
-
- /* Load packet. */
- for(p = pb; p; p = p->next) {
- int n;
- u_char *sPtr;
-
- sPtr = (u_char*)p->payload;
- n = p->len;
- while (n-- > 0) {
- c = *sPtr++;
-
- /* Update FCS before checking for special characters. */
- fcsOut = PPP_FCS(fcsOut, c);
-
- /* Copy to output buffer escaping special characters. */
- tailMB = pppAppend(c, tailMB, &pc->outACCM);
- }
- }
-
- /* Add FCS and trailing flag. */
- c = ~fcsOut & 0xFF;
- tailMB = pppAppend(c, tailMB, &pc->outACCM);
- c = (~fcsOut >> 8) & 0xFF;
- tailMB = pppAppend(c, tailMB, &pc->outACCM);
- tailMB = pppAppend(PPP_FLAG, tailMB, NULL);
-
- /* If we failed to complete the packet, throw it away. */
- if (!tailMB) {
- PPPDEBUG((LOG_WARNING,
- "pppifOutput[%d]: Alloc err - dropping proto=%d\n",
- pd, protocol));
- pbuf_free(headMB);
-#if LINK_STATS
- lwip_stats.link.memerr++;
- lwip_stats.link.drop++;
-#endif
- return ERR_MEM;
- }
-
- /* Send it. */
- PPPDEBUG((LOG_INFO, "pppifOutput[%d]: proto=0x%04X\n", pd, protocol));
-
- nPut(pc, headMB);
-
- return ERR_OK;
-}
-
-/* Get and set parameters for the given connection.
- * Return 0 on success, an error code on failure. */
-int pppIOCtl(int pd, int cmd, void *arg)
-{
- PPPControl *pc = &pppControl[pd];
- int st = 0;
-
- if (pd < 0 || pd >= NUM_PPP)
- st = PPPERR_PARAM;
- else {
- switch(cmd) {
- case PPPCTLG_UPSTATUS: /* Get the PPP up status. */
- if (arg)
- *(int *)arg = (int)(pc->if_up);
- else
- st = PPPERR_PARAM;
- break;
- case PPPCTLS_ERRCODE: /* Set the PPP error code. */
- if (arg)
- pc->errCode = *(int *)arg;
- else
- st = PPPERR_PARAM;
- break;
- case PPPCTLG_ERRCODE: /* Get the PPP error code. */
- if (arg)
- *(int *)arg = (int)(pc->errCode);
- else
- st = PPPERR_PARAM;
- break;
- case PPPCTLG_FD:
- if (arg)
- *(sio_fd_t *)arg = pc->fd;
- else
- st = PPPERR_PARAM;
- break;
- default:
- st = PPPERR_PARAM;
- break;
- }
- }
-
- return st;
-}
-
-/*
- * Return the Maximum Transmission Unit for the given PPP connection.
- */
-u_int pppMTU(int pd)
-{
- PPPControl *pc = &pppControl[pd];
- u_int st;
-
- /* Validate parameters. */
- if (pd < 0 || pd >= NUM_PPP || !pc->openFlag)
- st = 0;
- else
- st = pc->mtu;
-
- return st;
-}
-
-/*
- * Write n characters to a ppp link.
- * RETURN: >= 0 Number of characters written
- * -1 Failed to write to device
- */
-int pppWrite(int pd, const u_char *s, int n)
-{
- PPPControl *pc = &pppControl[pd];
- u_char c;
- u_int fcsOut = PPP_INITFCS;
- struct pbuf *headMB = NULL, *tailMB;
- headMB = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
- if (headMB == NULL) {
-#if LINK_STATS
- lwip_stats.link.memerr++;
- lwip_stats.link.proterr++;
-#endif /* LINK_STATS */
- return PPPERR_ALLOC;
- }
-
- tailMB = headMB;
-
- /* If the link has been idle, we'll send a fresh flag character to
- * flush any noise. */
- if ((sys_jiffies() - pc->lastXMit) >= PPP_MAXIDLEFLAG)
- tailMB = pppAppend(PPP_FLAG, tailMB, NULL);
- pc->lastXMit = sys_jiffies();
-
- /* Load output buffer. */
- while (n-- > 0) {
- c = *s++;
-
- /* Update FCS before checking for special characters. */
- fcsOut = PPP_FCS(fcsOut, c);
-
- /* Copy to output buffer escaping special characters. */
- tailMB = pppAppend(c, tailMB, &pc->outACCM);
- }
-
- /* Add FCS and trailing flag. */
- c = ~fcsOut & 0xFF;
- tailMB = pppAppend(c, tailMB, &pc->outACCM);
- c = (~fcsOut >> 8) & 0xFF;
- tailMB = pppAppend(c, tailMB, &pc->outACCM);
- tailMB = pppAppend(PPP_FLAG, tailMB, NULL);
-
- /* If we failed to complete the packet, throw it away.
- * Otherwise send it. */
- if (!tailMB) {
- PPPDEBUG((LOG_WARNING,
- "pppWrite[%d]: Alloc err - dropping pbuf len=%d\n", pd, headMB->len));
-/* "pppWrite[%d]: Alloc err - dropping %d:%.*H", pd, headMB->len, LWIP_MIN(headMB->len * 2, 40), headMB->payload)); */
- pbuf_free(headMB);
-#if LINK_STATS
- lwip_stats.link.memerr++;
- lwip_stats.link.proterr++;
-#endif /* LINK_STATS */
- return PPPERR_ALLOC;
- }
-
- PPPDEBUG((LOG_INFO, "pppWrite[%d]: len=%d\n", pd, headMB->len));
-/* "pppWrite[%d]: %d:%.*H", pd, headMB->len, LWIP_MIN(headMB->len * 2, 40), headMB->payload)); */
- nPut(pc, headMB);
-
- return PPPERR_NONE;
-}
-
-/*
- * ppp_send_config - configure the transmit characteristics of
- * the ppp interface.
- */
-void ppp_send_config(
- int unit,
- int mtu,
- u32_t asyncmap,
- int pcomp,
- int accomp
-)
-{
- PPPControl *pc = &pppControl[unit];
- int i;
-
- pc->mtu = mtu;
- pc->pcomp = pcomp;
- pc->accomp = accomp;
-
- /* Load the ACCM bits for the 32 control codes. */
- for (i = 0; i < 32/8; i++)
- pc->outACCM[i] = (u_char)((asyncmap >> (8 * i)) & 0xFF);
- PPPDEBUG((LOG_INFO, "ppp_send_config[%d]: outACCM=%X %X %X %X\n",
- unit,
- pc->outACCM[0], pc->outACCM[1], pc->outACCM[2], pc->outACCM[3]));
-}
-
-
-/*
- * ppp_set_xaccm - set the extended transmit ACCM for the interface.
- */
-void ppp_set_xaccm(int unit, ext_accm *accm)
-{
- memcpy(pppControl[unit].outACCM, accm, sizeof(ext_accm));
- PPPDEBUG((LOG_INFO, "ppp_set_xaccm[%d]: outACCM=%X %X %X %X\n",
- unit,
- pppControl[unit].outACCM[0],
- pppControl[unit].outACCM[1],
- pppControl[unit].outACCM[2],
- pppControl[unit].outACCM[3]));
-}
-
-
-/*
- * ppp_recv_config - configure the receive-side characteristics of
- * the ppp interface.
- */
-void ppp_recv_config(
- int unit,
- int mru,
- u32_t asyncmap,
- int pcomp,
- int accomp
-)
-{
- PPPControl *pc = &pppControl[unit];
- int i;
-
- (void)accomp;
- (void)pcomp;
- (void)mru;
-
- /* Load the ACCM bits for the 32 control codes. */
- for (i = 0; i < 32 / 8; i++)
- pc->inACCM[i] = (u_char)(asyncmap >> (i * 8));
- PPPDEBUG((LOG_INFO, "ppp_recv_config[%d]: inACCM=%X %X %X %X\n",
- unit,
- pc->inACCM[0], pc->inACCM[1], pc->inACCM[2], pc->inACCM[3]));
-}
-
-#if 0
-/*
- * ccp_test - ask kernel whether a given compression method
- * is acceptable for use. Returns 1 if the method and parameters
- * are OK, 0 if the method is known but the parameters are not OK
- * (e.g. code size should be reduced), or -1 if the method is unknown.
- */
-int ccp_test(
- int unit,
- int opt_len,
- int for_transmit,
- u_char *opt_ptr
-)
-{
- return 0; /* XXX Currently no compression. */
-}
-
-/*
- * ccp_flags_set - inform kernel about the current state of CCP.
- */
-void ccp_flags_set(int unit, int isopen, int isup)
-{
- /* XXX */
-}
-
-/*
- * ccp_fatal_error - returns 1 if decompression was disabled as a
- * result of an error detected after decompression of a packet,
- * 0 otherwise. This is necessary because of patent nonsense.
- */
-int ccp_fatal_error(int unit)
-{
- /* XXX */
- return 0;
-}
-#endif
-
-/*
- * get_idle_time - return how long the link has been idle.
- */
-int get_idle_time(int u, struct ppp_idle *ip)
-{
- /* XXX */
- (void)u;
- (void)ip;
-
- return 0;
-}
-
-
-/*
- * Return user specified netmask, modified by any mask we might determine
- * for address `addr' (in network byte order).
- * Here we scan through the system's list of interfaces, looking for
- * any non-point-to-point interfaces which might appear to be on the same
- * network as `addr'. If we find any, we OR in their netmask to the
- * user-specified netmask.
- */
-u32_t GetMask(u32_t addr)
-{
- u32_t mask, nmask;
-
- htonl(addr);
- if (IN_CLASSA(addr)) /* determine network mask for address class */
- nmask = IN_CLASSA_NET;
- else if (IN_CLASSB(addr))
- nmask = IN_CLASSB_NET;
- else
- nmask = IN_CLASSC_NET;
- /* class D nets are disallowed by bad_ip_adrs */
- mask = subnetMask | htonl(nmask);
-
- /* XXX
- * Scan through the system's network interfaces.
- * Get each netmask and OR them into our mask.
- */
-
- return mask;
-}
-
-/*
- * sifvjcomp - config tcp header compression
- */
-int sifvjcomp(
- int pd,
- int vjcomp,
- int cidcomp,
- int maxcid
-)
-{
-#if VJ_SUPPORT > 0
- PPPControl *pc = &pppControl[pd];
-
- pc->vjEnabled = vjcomp;
- pc->vjComp.compressSlot = cidcomp;
- pc->vjComp.maxSlotIndex = maxcid;
- PPPDEBUG((LOG_INFO, "sifvjcomp: VJ compress enable=%d slot=%d max slot=%d\n",
- vjcomp, cidcomp, maxcid));
-#endif
-
- return 0;
-}
-
-/*
- * pppifNetifInit - netif init callback
- */
-static err_t pppifNetifInit(struct netif *netif)
-{
- netif->name[0] = 'p';
- netif->name[1] = 'p';
- netif->output = pppifOutput;
- netif->mtu = pppMTU((int)netif->state);
- return ERR_OK;
-}
-
-
-/*
- * sifup - Config the interface up and enable IP packets to pass.
- */
-int sifup(int pd)
-{
- PPPControl *pc = &pppControl[pd];
- int st = 1;
-
- if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
- st = 0;
- PPPDEBUG((LOG_WARNING, "sifup[%d]: bad parms\n", pd));
- } else {
- netif_remove(&pc->netif);
- if (netif_add(&pc->netif, &pc->addrs.our_ipaddr, &pc->addrs.netmask, &pc->addrs.his_ipaddr, (void *)pd, pppifNetifInit, ip_input)) {
-
- netif_set_up(&pc->netif);
- pc->if_up = 1;
- pc->errCode = PPPERR_NONE;
-
- PPPDEBUG((LOG_DEBUG, "sifup: unit %d: linkStatusCB=%lx errCode=%d\n", pd, pc->linkStatusCB, pc->errCode));
- if(pc->linkStatusCB)
- pc->linkStatusCB(pc->linkStatusCtx, pc->errCode, &pc->addrs);
- } else {
- st = 0;
- PPPDEBUG((LOG_ERR, "sifup[%d]: netif_add failed\n", pd));
- }
- }
-
- return st;
-}
-
-/*
- * sifnpmode - Set the mode for handling packets for a given NP.
- */
-int sifnpmode(int u, int proto, enum NPmode mode)
-{
- (void)u;
- (void)proto;
- (void)mode;
- return 0;
-}
-
-/*
- * sifdown - Config the interface down and disable IP.
- */
-int sifdown(int pd)
-{
- PPPControl *pc = &pppControl[pd];
- int st = 1;
-
- if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
- st = 0;
- PPPDEBUG((LOG_WARNING, "sifdown[%d]: bad parms\n", pd));
- } else {
- pc->if_up = 0;
- netif_remove(&pc->netif);
- PPPDEBUG((LOG_DEBUG, "sifdown: unit %d: linkStatusCB=%lx errCode=%d\n", pd, pc->linkStatusCB, pc->errCode));
- if(pc->linkStatusCB)
- pc->linkStatusCB(pc->linkStatusCtx, PPPERR_CONNECT, NULL);
- }
- return st;
-}
-
-/*
- * sifaddr - Config the interface IP addresses and netmask.
- */
-int sifaddr(
- int pd, /* Interface unit ??? */
- u32_t o, /* Our IP address ??? */
- u32_t h, /* His IP address ??? */
- u32_t m, /* IP subnet mask ??? */
- u32_t ns1, /* Primary DNS */
- u32_t ns2 /* Secondary DNS */
-)
-{
- PPPControl *pc = &pppControl[pd];
- int st = 1;
-
- if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
- st = 0;
- PPPDEBUG((LOG_WARNING, "sifup[%d]: bad parms\n", pd));
- } else {
- memcpy(&pc->addrs.our_ipaddr, &o, sizeof(o));
- memcpy(&pc->addrs.his_ipaddr, &h, sizeof(h));
- memcpy(&pc->addrs.netmask, &m, sizeof(m));
- memcpy(&pc->addrs.dns1, &ns1, sizeof(ns1));
- memcpy(&pc->addrs.dns2, &ns2, sizeof(ns2));
- }
- return st;
-}
-
-/*
- * cifaddr - Clear the interface IP addresses, and delete routes
- * through the interface if possible.
- */
-int cifaddr(
- int pd, /* Interface unit ??? */
- u32_t o, /* Our IP address ??? */
- u32_t h /* IP broadcast address ??? */
-)
-{
- PPPControl *pc = &pppControl[pd];
- int st = 1;
-
- (void)o;
- (void)h;
- if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
- st = 0;
- PPPDEBUG((LOG_WARNING, "sifup[%d]: bad parms\n", pd));
- } else {
- IP4_ADDR(&pc->addrs.our_ipaddr, 0,0,0,0);
- IP4_ADDR(&pc->addrs.his_ipaddr, 0,0,0,0);
- IP4_ADDR(&pc->addrs.netmask, 255,255,255,0);
- IP4_ADDR(&pc->addrs.dns1, 0,0,0,0);
- IP4_ADDR(&pc->addrs.dns2, 0,0,0,0);
- }
- return st;
-}
-
-/*
- * sifdefaultroute - assign a default route through the address given.
- */
-int sifdefaultroute(int pd, u32_t l, u32_t g)
-{
- PPPControl *pc = &pppControl[pd];
- int st = 1;
-
- (void)l;
- (void)g;
- if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
- st = 0;
- PPPDEBUG((LOG_WARNING, "sifup[%d]: bad parms\n", pd));
- } else {
- netif_set_default(&pc->netif);
- }
-
- /* TODO: check how PPP handled the netMask, previously not set by ipSetDefault */
-
- return st;
-}
-
-/*
- * cifdefaultroute - delete a default route through the address given.
- */
-int cifdefaultroute(int pd, u32_t l, u32_t g)
-{
- PPPControl *pc = &pppControl[pd];
- int st = 1;
-
- (void)l;
- (void)g;
- if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) {
- st = 0;
- PPPDEBUG((LOG_WARNING, "sifup[%d]: bad parms\n", pd));
- } else {
- netif_set_default(NULL);
- }
-
- return st;
-}
-
-void
-pppMainWakeup(int pd)
-{
- PPPDEBUG((LOG_DEBUG, "pppMainWakeup: unit %d\n", pd));
- sio_read_abort(pppControl[pd].fd);
-}
-
-/* these callbacks are necessary because lcp_* functions
- must be called in the same context as pppInput(),
- namely the tcpip_thread(), essentially because
- they manipulate timeouts which are thread-private
-*/
-
-static void
-pppStartCB(void *arg)
-{
- int pd = (int)arg;
-
- PPPDEBUG((LOG_DEBUG, "pppStartCB: unit %d\n", pd));
- lcp_lowerup(pd);
- lcp_open(pd); /* Start protocol */
-}
-
-static void
-pppStopCB(void *arg)
-{
- int pd = (int)arg;
-
- PPPDEBUG((LOG_DEBUG, "pppStopCB: unit %d\n", pd));
- lcp_close(pd, "User request");
-}
-
-static void
-pppHupCB(void *arg)
-{
- int pd = (int)arg;
-
- PPPDEBUG((LOG_DEBUG, "pppHupCB: unit %d\n", pd));
- lcp_lowerdown(pd);
- link_terminated(pd);
-}
-/**********************************/
-/*** LOCAL FUNCTION DEFINITIONS ***/
-/**********************************/
-/* The main PPP process function. This implements the state machine according
- * to section 4 of RFC 1661: The Point-To-Point Protocol. */
-static void pppMain(void *arg)
-{
- int pd = (int)arg;
- struct pbuf *p;
- PPPControl* pc;
-
- pc = &pppControl[pd];
-
- p = pbuf_alloc(PBUF_RAW, PPP_MRU+PPP_HDRLEN, PBUF_RAM);
- if(!p) {
- LWIP_ASSERT("p != NULL", p);
- pc->errCode = PPPERR_ALLOC;
- goto out;
- }
-
- /*
- * Start the connection and handle incoming events (packet or timeout).
- */
- PPPDEBUG((LOG_INFO, "pppMain: unit %d: Connecting\n", pd));
- tcpip_callback(pppStartCB, arg);
- while (lcp_phase[pd] != PHASE_DEAD) {
- if (pc->kill_link) {
- PPPDEBUG((LOG_DEBUG, "pppMainWakeup: unit %d kill_link -> pppStopCB\n", pd));
- pc->errCode = PPPERR_USER;
- /* This will leave us at PHASE_DEAD. */
- tcpip_callback(pppStopCB, arg);
- pc->kill_link = 0;
- }
- else if (pc->sig_hup) {
- PPPDEBUG((LOG_DEBUG, "pppMainWakeup: unit %d sig_hup -> pppHupCB\n", pd));
- pc->sig_hup = 0;
- tcpip_callback(pppHupCB, arg);
- } else {
- int c = sio_read(pc->fd, p->payload, p->len);
- if(c > 0) {
- pppInProc(pd, p->payload, c);
- } else {
- PPPDEBUG((LOG_DEBUG, "pppMainWakeup: unit %d sio_read len=%d returned %d\n", pd, p->len, c));
- sys_msleep(1); /* give other tasks a chance to run */
- }
- }
- }
- PPPDEBUG((LOG_INFO, "pppMain: unit %d: PHASE_DEAD\n", pd));
- pbuf_free(p);
-
-out:
- PPPDEBUG((LOG_DEBUG, "pppMain: unit %d: linkStatusCB=%lx errCode=%d\n", pd, pc->linkStatusCB, pc->errCode));
- if(pc->linkStatusCB)
- pc->linkStatusCB(pc->linkStatusCtx, pc->errCode ? pc->errCode : PPPERR_PROTOCOL, NULL);
-
- pc->openFlag = 0;
-}
-
-static struct pbuf *pppSingleBuf(struct pbuf *p)
-{
- struct pbuf *q, *b;
- u_char *pl;
-
- if(p->tot_len == p->len)
- return p;
-
- q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);
- if(!q) {
- PPPDEBUG((LOG_ERR,
- "pppSingleBuf: unable to alloc new buf (%d)\n", p->tot_len));
- return p; /* live dangerously */
- }
-
- for(b = p, pl = q->payload; b != NULL; b = b->next) {
- memcpy(pl, b->payload, b->len);
- pl += b->len;
- }
-
- pbuf_free(p);
-
- return q;
-}
-
-struct pppInputHeader {
- int unit;
- u16_t proto;
-};
-
-/*
- * Pass the processed input packet to the appropriate handler.
- * This function and all handlers run in the context of the tcpip_thread
- */
-static void pppInput(void *arg)
-{
- struct pbuf *nb = (struct pbuf *)arg;
- u16_t protocol;
- int pd;
-
- pd = ((struct pppInputHeader *)nb->payload)->unit;
- protocol = ((struct pppInputHeader *)nb->payload)->proto;
-
- pbuf_header(nb, -(int)sizeof(struct pppInputHeader));
-
-#if LINK_STATS
- lwip_stats.link.recv++;
-#endif /* LINK_STATS */
-
- /*
- * Toss all non-LCP packets unless LCP is OPEN.
- * Until we get past the authentication phase, toss all packets
- * except LCP, LQR and authentication packets.
- */
- if((lcp_phase[pd] <= PHASE_AUTHENTICATE) && (protocol != PPP_LCP)) {
- if(!((protocol == PPP_LQR) || (protocol == PPP_PAP) || (protocol == PPP_CHAP)) ||
- (lcp_phase[pd] != PHASE_AUTHENTICATE)) {
- PPPDEBUG((LOG_INFO, "pppInput: discarding proto 0x%04X in phase %d\n", protocol, lcp_phase[pd]));
- goto drop;
- }
- }
-
- switch(protocol) {
- case PPP_VJC_COMP: /* VJ compressed TCP */
-#if VJ_SUPPORT > 0
- PPPDEBUG((LOG_INFO, "pppInput[%d]: vj_comp in pbuf len=%d\n", pd, nb->len));
- /*
- * Clip off the VJ header and prepend the rebuilt TCP/IP header and
- * pass the result to IP.
- */
- if (vj_uncompress_tcp(&nb, &pppControl[pd].vjComp) >= 0) {
- if (pppControl[pd].netif.input != NULL) {
- pppControl[pd].netif.input(nb, &pppControl[pd].netif);
- }
- return;
- }
- /* Something's wrong so drop it. */
- PPPDEBUG((LOG_WARNING, "pppInput[%d]: Dropping VJ compressed\n", pd));
-#else
- /* No handler for this protocol so drop the packet. */
- PPPDEBUG((LOG_INFO, "pppInput[%d]: drop VJ Comp in %d:%s\n", pd, nb->len, nb->payload));
-#endif /* VJ_SUPPORT > 0 */
- break;
- case PPP_VJC_UNCOMP: /* VJ uncompressed TCP */
-#if VJ_SUPPORT > 0
- PPPDEBUG((LOG_INFO, "pppInput[%d]: vj_un in pbuf len=%d\n", pd, nb->len));
- /*
- * Process the TCP/IP header for VJ header compression and then pass
- * the packet to IP.
- */
- if (vj_uncompress_uncomp(nb, &pppControl[pd].vjComp) >= 0) {
- if (pppControl[pd].netif.input != NULL) {
- pppControl[pd].netif.input(nb, &pppControl[pd].netif);
- }
- return;
- }
- /* Something's wrong so drop it. */
- PPPDEBUG((LOG_WARNING, "pppInput[%d]: Dropping VJ uncompressed\n", pd));
-#else
- /* No handler for this protocol so drop the packet. */
- PPPDEBUG((LOG_INFO,
- "pppInput[%d]: drop VJ UnComp in %d:.*H\n",
- pd, nb->len, LWIP_MIN(nb->len * 2, 40), nb->payload));
-#endif /* VJ_SUPPORT > 0 */
- break;
- case PPP_IP: /* Internet Protocol */
- PPPDEBUG((LOG_INFO, "pppInput[%d]: ip in pbuf len=%d\n", pd, nb->len));
- if (pppControl[pd].netif.input != NULL) {
- pppControl[pd].netif.input(nb, &pppControl[pd].netif);
- }
- return;
- default:
- {
- struct protent *protp;
- int i;
-
- /*
- * Upcall the proper protocol input routine.
- */
- for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) {
- if (protp->protocol == protocol && protp->enabled_flag) {
- PPPDEBUG((LOG_INFO, "pppInput[%d]: %s len=%d\n", pd, protp->name, nb->len));
- nb = pppSingleBuf(nb);
- (*protp->input)(pd, nb->payload, nb->len);
- goto out;
- }
- }
-
- /* No handler for this protocol so reject the packet. */
- PPPDEBUG((LOG_INFO, "pppInput[%d]: rejecting unsupported proto 0x%04X len=%d\n", pd, protocol, nb->len));
- pbuf_header(nb, sizeof(protocol));
-#if BYTE_ORDER == LITTLE_ENDIAN
- protocol = htons(protocol);
- memcpy(nb->payload, &protocol, sizeof(protocol));
-#endif
- lcp_sprotrej(pd, nb->payload, nb->len);
- }
- break;
- }
-
-drop:
-#if LINK_STATS
- lwip_stats.link.drop++;
-#endif
-
-out:
- pbuf_free(nb);
- return;
-}
-
-
-/*
- * Drop the input packet.
- */
-static void pppDrop(PPPControl *pc)
-{
- if (pc->inHead != NULL) {
-#if 0
- PPPDEBUG((LOG_INFO, "pppDrop: %d:%.*H\n", pc->inHead->len, min(60, pc->inHead->len * 2), pc->inHead->payload));
-#endif
- PPPDEBUG((LOG_INFO, "pppDrop: pbuf len=%d\n", pc->inHead->len));
- if (pc->inTail && (pc->inTail != pc->inHead))
- pbuf_free(pc->inTail);
- pbuf_free(pc->inHead);
- pc->inHead = NULL;
- pc->inTail = NULL;
- }
-#if VJ_SUPPORT > 0
- vj_uncompress_err(&pc->vjComp);
-#endif
-
-#if LINK_STATS
- lwip_stats.link.drop++;
-#endif /* LINK_STATS */
-}
-
-
-/*
- * Process a received octet string.
- */
-static void pppInProc(int pd, u_char *s, int l)
-{
- PPPControl *pc = &pppControl[pd];
- struct pbuf *nextNBuf;
- u_char curChar;
-
- PPPDEBUG((LOG_DEBUG, "pppInProc[%d]: got %d bytes\n", pd, l));
- while (l-- > 0) {
- curChar = *s++;
-
- /* Handle special characters. */
- if (ESCAPE_P(pc->inACCM, curChar)) {
- /* Check for escape sequences. */
- /* XXX Note that this does not handle an escaped 0x5d character which
- * would appear as an escape character. Since this is an ASCII ']'
- * and there is no reason that I know of to escape it, I won't complicate
- * the code to handle this case. GLL */
- if (curChar == PPP_ESCAPE)
- pc->inEscaped = 1;
- /* Check for the flag character. */
- else if (curChar == PPP_FLAG) {
- /* If this is just an extra flag character, ignore it. */
- if (pc->inState <= PDADDRESS)
- ;
- /* If we haven't received the packet header, drop what has come in. */
- else if (pc->inState < PDDATA) {
- PPPDEBUG((LOG_WARNING,
- "pppInProc[%d]: Dropping incomplete packet %d\n",
- pd, pc->inState));
-#if LINK_STATS
- lwip_stats.link.lenerr++;
-#endif
- pppDrop(pc);
- }
- /* If the fcs is invalid, drop the packet. */
- else if (pc->inFCS != PPP_GOODFCS) {
- PPPDEBUG((LOG_INFO,
- "pppInProc[%d]: Dropping bad fcs 0x%04X proto=0x%04X\n",
- pd, pc->inFCS, pc->inProtocol));
-#if LINK_STATS
- lwip_stats.link.chkerr++;
-#endif
- pppDrop(pc);
- }
- /* Otherwise it's a good packet so pass it on. */
- else {
-
- /* Trim off the checksum. */
- if(pc->inTail->len >= 2) {
- pc->inTail->len -= 2;
-
- pc->inTail->tot_len = pc->inTail->len;
- if (pc->inTail != pc->inHead) {
- pbuf_cat(pc->inHead, pc->inTail);
- }
- } else {
- pc->inTail->tot_len = pc->inTail->len;
- if (pc->inTail != pc->inHead) {
- pbuf_cat(pc->inHead, pc->inTail);
- }
-
- pbuf_realloc(pc->inHead, pc->inHead->tot_len - 2);
- }
-
- /* Dispatch the packet thereby consuming it. */
- if(tcpip_callback(pppInput, pc->inHead) != ERR_OK) {
- PPPDEBUG((LOG_ERR,
- "pppInProc[%d]: tcpip_callback() failed, dropping packet\n", pd));
- pbuf_free(pc->inHead);
-#if LINK_STATS
- lwip_stats.link.drop++;
-#endif
- }
- pc->inHead = NULL;
- pc->inTail = NULL;
- }
-
- /* Prepare for a new packet. */
- pc->inFCS = PPP_INITFCS;
- pc->inState = PDADDRESS;
- pc->inEscaped = 0;
- }
- /* Other characters are usually control characters that may have
- * been inserted by the physical layer so here we just drop them. */
- else {
- PPPDEBUG((LOG_WARNING,
- "pppInProc[%d]: Dropping ACCM char <%d>\n", pd, curChar));
- }
- }
- /* Process other characters. */
- else {
- /* Unencode escaped characters. */
- if (pc->inEscaped) {
- pc->inEscaped = 0;
- curChar ^= PPP_TRANS;
- }
-
- /* Process character relative to current state. */
- switch(pc->inState) {
- case PDIDLE: /* Idle state - waiting. */
- /* Drop the character if it's not 0xff
- * we would have processed a flag character above. */
- if (curChar != PPP_ALLSTATIONS) {
- break;
- }
-
- /* Fall through */
- case PDSTART: /* Process start flag. */
- /* Prepare for a new packet. */
- pc->inFCS = PPP_INITFCS;
-
- /* Fall through */
- case PDADDRESS: /* Process address field. */
- if (curChar == PPP_ALLSTATIONS) {
- pc->inState = PDCONTROL;
- break;
- }
- /* Else assume compressed address and control fields so
- * fall through to get the protocol... */
- case PDCONTROL: /* Process control field. */
- /* If we don't get a valid control code, restart. */
- if (curChar == PPP_UI) {
- pc->inState = PDPROTOCOL1;
- break;
- }
-#if 0
- else {
- PPPDEBUG((LOG_WARNING,
- "pppInProc[%d]: Invalid control <%d>\n", pd, curChar));
- pc->inState = PDSTART;
- }
-#endif
- case PDPROTOCOL1: /* Process protocol field 1. */
- /* If the lower bit is set, this is the end of the protocol
- * field. */
- if (curChar & 1) {
- pc->inProtocol = curChar;
- pc->inState = PDDATA;
- }
- else {
- pc->inProtocol = (u_int)curChar << 8;
- pc->inState = PDPROTOCOL2;
- }
- break;
- case PDPROTOCOL2: /* Process protocol field 2. */
- pc->inProtocol |= curChar;
- pc->inState = PDDATA;
- break;
- case PDDATA: /* Process data byte. */
- /* Make space to receive processed data. */
- if (pc->inTail == NULL || pc->inTail->len == PBUF_POOL_BUFSIZE) {
- if(pc->inTail) {
- pc->inTail->tot_len = pc->inTail->len;
- if (pc->inTail != pc->inHead) {
- pbuf_cat(pc->inHead, pc->inTail);
- }
- }
- /* If we haven't started a packet, we need a packet header. */
- nextNBuf = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);
- if (nextNBuf == NULL) {
- /* No free buffers. Drop the input packet and let the
- * higher layers deal with it. Continue processing
- * the received pbuf chain in case a new packet starts. */
- PPPDEBUG((LOG_ERR, "pppInProc[%d]: NO FREE MBUFS!\n", pd));
-#if LINK_STATS
- lwip_stats.link.memerr++;
-#endif /* LINK_STATS */
- pppDrop(pc);
- pc->inState = PDSTART; /* Wait for flag sequence. */
- break;
- }
- if (pc->inHead == NULL) {
- struct pppInputHeader *pih = nextNBuf->payload;
-
- pih->unit = pd;
- pih->proto = pc->inProtocol;
-
- nextNBuf->len += sizeof(*pih);
-
- pc->inHead = nextNBuf;
- }
- pc->inTail = nextNBuf;
- }
- /* Load character into buffer. */
- ((u_char*)pc->inTail->payload)[pc->inTail->len++] = curChar;
- break;
- }
-
- /* update the frame check sequence number. */
- pc->inFCS = PPP_FCS(pc->inFCS, curChar);
- }
- }
- avRandomize();
-}
-
-#endif /* PPP_SUPPORT */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.h
deleted file mode 100644
index 25cea83..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/ppp.h
+++ /dev/null
@@ -1,446 +0,0 @@
-/*****************************************************************************
-* ppp.h - Network Point to Point Protocol header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1997 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 97-11-05 Guy Lancaster <glanca at gesn.com>, Global Election Systems Inc.
-* Original derived from BSD codes.
-*****************************************************************************/
-
-#ifndef PPP_H
-#define PPP_H
-
-#include "lwip/opt.h"
-
-#if PPP_SUPPORT > 0
-#include "lwip/sio.h"
-#include "lwip/api.h"
-#include "lwip/sockets.h"
-#include "lwip/stats.h"
-#include "lwip/mem.h"
-#include "lwip/tcpip.h"
-#include "lwip/netif.h"
-
-/*
- * pppd.h - PPP daemon global declarations.
- *
- * Copyright (c) 1989 Carnegie Mellon University.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by Carnegie Mellon University. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-/*
- * ppp_defs.h - PPP definitions.
- *
- * Copyright (c) 1994 The Australian National University.
- * All rights reserved.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation is hereby granted, provided that the above copyright
- * notice appears in all copies. This software is provided without any
- * warranty, express or implied. The Australian National University
- * makes no representations about the suitability of this software for
- * any purpose.
- *
- * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY
- * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
- * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO
- * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
- * OR MODIFICATIONS.
- */
-
-#define TIMEOUT(f, a, t) sys_untimeout((f), (a)), sys_timeout((t)*1000, (f), (a))
-#define UNTIMEOUT(f, a) sys_untimeout((f), (a))
-
-
-# ifndef __u_char_defined
-
-/* Type definitions for BSD code. */
-typedef unsigned long u_long;
-typedef unsigned int u_int;
-typedef unsigned short u_short;
-typedef unsigned char u_char;
-
-#endif
-
-/*
- * Constants and structures defined by the internet system,
- * Per RFC 790, September 1981, and numerous additions.
- */
-
-/*
- * The basic PPP frame.
- */
-#define PPP_HDRLEN 4 /* octets for standard ppp header */
-#define PPP_FCSLEN 2 /* octets for FCS */
-
-
-/*
- * Significant octet values.
- */
-#define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */
-#define PPP_UI 0x03 /* Unnumbered Information */
-#define PPP_FLAG 0x7e /* Flag Sequence */
-#define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */
-#define PPP_TRANS 0x20 /* Asynchronous transparency modifier */
-
-/*
- * Protocol field values.
- */
-#define PPP_IP 0x21 /* Internet Protocol */
-#define PPP_AT 0x29 /* AppleTalk Protocol */
-#define PPP_VJC_COMP 0x2d /* VJ compressed TCP */
-#define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */
-#define PPP_COMP 0xfd /* compressed packet */
-#define PPP_IPCP 0x8021 /* IP Control Protocol */
-#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */
-#define PPP_CCP 0x80fd /* Compression Control Protocol */
-#define PPP_LCP 0xc021 /* Link Control Protocol */
-#define PPP_PAP 0xc023 /* Password Authentication Protocol */
-#define PPP_LQR 0xc025 /* Link Quality Report protocol */
-#define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */
-#define PPP_CBCP 0xc029 /* Callback Control Protocol */
-
-/*
- * Values for FCS calculations.
- */
-#define PPP_INITFCS 0xffff /* Initial FCS value */
-#define PPP_GOODFCS 0xf0b8 /* Good final FCS value */
-#define PPP_FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])
-
-/*
- * Extended asyncmap - allows any character to be escaped.
- */
-typedef u_char ext_accm[32];
-
-/*
- * What to do with network protocol (NP) packets.
- */
-enum NPmode {
- NPMODE_PASS, /* pass the packet through */
- NPMODE_DROP, /* silently drop the packet */
- NPMODE_ERROR, /* return an error */
- NPMODE_QUEUE /* save it up for later. */
-};
-
-/*
- * Inline versions of get/put char/short/long.
- * Pointer is advanced; we assume that both arguments
- * are lvalues and will already be in registers.
- * cp MUST be u_char *.
- */
-#define GETCHAR(c, cp) { \
- (c) = *(cp)++; \
-}
-#define PUTCHAR(c, cp) { \
- *(cp)++ = (u_char) (c); \
-}
-
-
-#define GETSHORT(s, cp) { \
- (s) = *(cp); (cp)++; (s) << 8; \
- (s) |= *(cp); (cp)++; \
-}
-#define PUTSHORT(s, cp) { \
- *(cp)++ = (u_char) ((s) >> 8); \
- *(cp)++ = (u_char) (s); \
-}
-
-#define GETLONG(l, cp) { \
- (l) = *(cp); (cp)++; (l) << 8; \
- (l) |= *(cp); (cp)++; (l) <<= 8; \
- (l) |= *(cp); (cp)++; (l) <<= 8; \
- (l) |= *(cp); (cp)++; \
-}
-#define PUTLONG(l, cp) { \
- *(cp)++ = (u_char) ((l) >> 24); \
- *(cp)++ = (u_char) ((l) >> 16); \
- *(cp)++ = (u_char) ((l) >> 8); \
- *(cp)++ = (u_char) (l); \
-}
-
-
-#define INCPTR(n, cp) ((cp) += (n))
-#define DECPTR(n, cp) ((cp) -= (n))
-
-#define BCMP(s0, s1, l) memcmp((u_char *)(s0), (u_char *)(s1), (l))
-#define BCOPY(s, d, l) memcpy((d), (s), (l))
-#define BZERO(s, n) memset(s, 0, n)
-#if PPP_DEBUG
-#define PRINTMSG(m, l) { m[l] = '\0'; ppp_trace(LOG_INFO, "Remote message: %s\n", m); }
-#else
-#define PRINTMSG(m, l)
-#endif
-
-/*
- * MAKEHEADER - Add PPP Header fields to a packet.
- */
-#define MAKEHEADER(p, t) { \
- PUTCHAR(PPP_ALLSTATIONS, p); \
- PUTCHAR(PPP_UI, p); \
- PUTSHORT(t, p); }
-
-/*************************
-*** PUBLIC DEFINITIONS ***
-*************************/
-
-/* Error codes. */
-#define PPPERR_NONE 0 /* No error. */
-#define PPPERR_PARAM -1 /* Invalid parameter. */
-#define PPPERR_OPEN -2 /* Unable to open PPP session. */
-#define PPPERR_DEVICE -3 /* Invalid I/O device for PPP. */
-#define PPPERR_ALLOC -4 /* Unable to allocate resources. */
-#define PPPERR_USER -5 /* User interrupt. */
-#define PPPERR_CONNECT -6 /* Connection lost. */
-#define PPPERR_AUTHFAIL -7 /* Failed authentication challenge. */
-#define PPPERR_PROTOCOL -8 /* Failed to meet protocol. */
-
-/*
- * PPP IOCTL commands.
- */
-/*
- * Get the up status - 0 for down, non-zero for up. The argument must
- * point to an int.
- */
-#define PPPCTLG_UPSTATUS 100 /* Get the up status - 0 down else up */
-#define PPPCTLS_ERRCODE 101 /* Set the error code */
-#define PPPCTLG_ERRCODE 102 /* Get the error code */
-#define PPPCTLG_FD 103 /* Get the fd associated with the ppp */
-
-/************************
-*** PUBLIC DATA TYPES ***
-************************/
-
-/*
- * The following struct gives the addresses of procedures to call
- * for a particular protocol.
- */
-struct protent {
- u_short protocol; /* PPP protocol number */
- /* Initialization procedure */
- void (*init) (int unit);
- /* Process a received packet */
- void (*input) (int unit, u_char *pkt, int len);
- /* Process a received protocol-reject */
- void (*protrej) (int unit);
- /* Lower layer has come up */
- void (*lowerup) (int unit);
- /* Lower layer has gone down */
- void (*lowerdown) (int unit);
- /* Open the protocol */
- void (*open) (int unit);
- /* Close the protocol */
- void (*close) (int unit, char *reason);
-#if 0
- /* Print a packet in readable form */
- int (*printpkt) (u_char *pkt, int len,
- void (*printer) (void *, char *, ...),
- void *arg);
- /* Process a received data packet */
- void (*datainput) (int unit, u_char *pkt, int len);
-#endif
- int enabled_flag; /* 0 iff protocol is disabled */
- char *name; /* Text name of protocol */
-#if 0
- /* Check requested options, assign defaults */
- void (*check_options) (u_long);
- /* Configure interface for demand-dial */
- int (*demand_conf) (int unit);
- /* Say whether to bring up link for this pkt */
- int (*active_pkt) (u_char *pkt, int len);
-#endif
-};
-
-/*
- * The following structure records the time in seconds since
- * the last NP packet was sent or received.
- */
-struct ppp_idle {
- u_short xmit_idle; /* seconds since last NP packet sent */
- u_short recv_idle; /* seconds since last NP packet received */
-};
-
-struct ppp_settings {
-
- u_int disable_defaultip : 1; /* Don't use hostname for default IP addrs */
- u_int auth_required : 1; /* Peer is required to authenticate */
- u_int explicit_remote : 1; /* remote_name specified with remotename opt */
- u_int refuse_pap : 1; /* Don't wanna auth. ourselves with PAP */
- u_int refuse_chap : 1; /* Don't wanna auth. ourselves with CHAP */
- u_int usehostname : 1; /* Use hostname for our_name */
- u_int usepeerdns : 1; /* Ask peer for DNS adds */
-
- u_short idle_time_limit; /* Shut down link if idle for this long */
- int maxconnect; /* Maximum connect time (seconds) */
-
- char user[MAXNAMELEN + 1];/* Username for PAP */
- char passwd[MAXSECRETLEN + 1]; /* Password for PAP, secret for CHAP */
- char our_name[MAXNAMELEN + 1]; /* Our name for authentication purposes */
- char remote_name[MAXNAMELEN + 1]; /* Peer's name for authentication */
-};
-
-struct ppp_addrs {
- struct ip_addr our_ipaddr, his_ipaddr, netmask, dns1, dns2;
-};
-
-/*****************************
-*** PUBLIC DATA STRUCTURES ***
-*****************************/
-/* Buffers for outgoing packets. */
-extern u_char outpacket_buf[NUM_PPP][PPP_MRU+PPP_HDRLEN];
-
-extern struct ppp_settings ppp_settings;
-
-extern struct protent *ppp_protocols[];/* Table of pointers to supported protocols */
-
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-
-/* Initialize the PPP subsystem. */
-void pppInit(void);
-
-/* Warning: Using PPPAUTHTYPE_ANY might have security consequences.
- * RFC 1994 says:
- *
- * In practice, within or associated with each PPP server, there is a
- * database which associates "user" names with authentication
- * information ("secrets"). It is not anticipated that a particular
- * named user would be authenticated by multiple methods. This would
- * make the user vulnerable to attacks which negotiate the least secure
- * method from among a set (such as PAP rather than CHAP). If the same
- * secret was used, PAP would reveal the secret to be used later with
- * CHAP.
- *
- * Instead, for each user name there should be an indication of exactly
- * one method used to authenticate that user name. If a user needs to
- * make use of different authentication methods under different
- * circumstances, then distinct user names SHOULD be employed, each of
- * which identifies exactly one authentication method.
- *
- */
-enum pppAuthType {
- PPPAUTHTYPE_NONE,
- PPPAUTHTYPE_ANY,
- PPPAUTHTYPE_PAP,
- PPPAUTHTYPE_CHAP
-};
-
-void pppSetAuth(enum pppAuthType authType, const char *user, const char *passwd);
-
-/*
- * Open a new PPP connection using the given I/O device.
- * This initializes the PPP control block but does not
- * attempt to negotiate the LCP session.
- * Return a new PPP connection descriptor on success or
- * an error code (negative) on failure.
- */
-int pppOpen(sio_fd_t fd, void (*linkStatusCB)(void *ctx, int errCode, void *arg), void *linkStatusCtx);
-
-/*
- * Close a PPP connection and release the descriptor.
- * Any outstanding packets in the queues are dropped.
- * Return 0 on success, an error code on failure.
- */
-int pppClose(int pd);
-
-/*
- * Indicate to the PPP process that the line has disconnected.
- */
-void pppSigHUP(int pd);
-
-/*
- * Get and set parameters for the given connection.
- * Return 0 on success, an error code on failure.
- */
-int pppIOCtl(int pd, int cmd, void *arg);
-
-/*
- * Return the Maximum Transmission Unit for the given PPP connection.
- */
-u_int pppMTU(int pd);
-
-/*
- * Write n characters to a ppp link.
- * RETURN: >= 0 Number of characters written
- * -1 Failed to write to device
- */
-int pppWrite(int pd, const u_char *s, int n);
-
-void pppMainWakeup(int pd);
-
-/* Configure i/f transmit parameters */
-void ppp_send_config (int, int, u32_t, int, int);
-/* Set extended transmit ACCM */
-void ppp_set_xaccm (int, ext_accm *);
-/* Configure i/f receive parameters */
-void ppp_recv_config (int, int, u32_t, int, int);
-/* Find out how long link has been idle */
-int get_idle_time (int, struct ppp_idle *);
-
-/* Configure VJ TCP header compression */
-int sifvjcomp (int, int, int, int);
-/* Configure i/f down (for IP) */
-int sifup (int);
-/* Set mode for handling packets for proto */
-int sifnpmode (int u, int proto, enum NPmode mode);
-/* Configure i/f down (for IP) */
-int sifdown (int);
-/* Configure IP addresses for i/f */
-int sifaddr (int, u32_t, u32_t, u32_t, u32_t, u32_t);
-/* Reset i/f IP addresses */
-int cifaddr (int, u32_t, u32_t);
-/* Create default route through i/f */
-int sifdefaultroute (int, u32_t, u32_t);
-/* Delete default route through i/f */
-int cifdefaultroute (int, u32_t, u32_t);
-
-/* Get appropriate netmask for address */
-u32_t GetMask (u32_t);
-
-#endif /* PPP_SUPPORT */
-
-#endif /* PPP_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/pppdebug.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/pppdebug.h
deleted file mode 100644
index de1478c..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/pppdebug.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*****************************************************************************
-* pppdebug.h - System debugging utilities.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* portions Copyright (c) 1998 Global Election Systems Inc.
-* portions Copyright (c) 2001 by Cognizant Pty Ltd.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY (please don't use tabs!)
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 98-07-29 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Original.
-*
-*****************************************************************************
-*/
-#ifndef PPPDEBUG_H
-#define PPPDEBUG_H
-
-/************************
-*** PUBLIC DATA TYPES ***
-************************/
-/* Trace levels. */
-typedef enum {
- LOG_CRITICAL = 0,
- LOG_ERR = 1,
- LOG_NOTICE = 2,
- LOG_WARNING = 3,
- LOG_INFO = 5,
- LOG_DETAIL = 6,
- LOG_DEBUG = 7
-} LogCodes;
-
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-/*
- * ppp_trace - a form of printf to send tracing information to stderr
- */
-void ppp_trace(int level, const char *format,...);
-
-#if PPP_DEBUG > 0
-
-#define AUTHDEBUG(a) ppp_trace a
-#define IPCPDEBUG(a) ppp_trace a
-#define UPAPDEBUG(a) ppp_trace a
-#define LCPDEBUG(a) ppp_trace a
-#define FSMDEBUG(a) ppp_trace a
-#define CHAPDEBUG(a) ppp_trace a
-#define PPPDEBUG(a) ppp_trace a
-
-#define TRACELCP 1
-
-#else
-
-#define AUTHDEBUG(a)
-#define IPCPDEBUG(a)
-#define UPAPDEBUG(a)
-#define LCPDEBUG(a)
-#define FSMDEBUG(a)
-#define CHAPDEBUG(a)
-
-#define PPPDEBUG(a)
-
-#define TRACELCP 0
-
-#endif
-
-#endif /* PPPDEBUG_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/randm.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/randm.c
deleted file mode 100644
index 05eeb44..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/randm.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*****************************************************************************
-* randm.c - Random number generator program file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* Copyright (c) 1998 by Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 98-06-03 Guy Lancaster <lancasterg at acm.org>, Global Election Systems Inc.
-* Extracted from avos.
-*****************************************************************************/
-
-#include "ppp.h"
-#if PPP_SUPPORT > 0
-#include "md5.h"
-#include "randm.h"
-
-#include "pppdebug.h"
-
-
-#if MD5_SUPPORT>0 /* this module depends on MD5 */
-#define RANDPOOLSZ 16 /* Bytes stored in the pool of randomness. */
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-static char randPool[RANDPOOLSZ]; /* Pool of randomness. */
-static long randCount = 0; /* Pseudo-random incrementer */
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-/*
- * Initialize the random number generator.
- *
- * Since this is to be called on power up, we don't have much
- * system randomess to work with. Here all we use is the
- * real-time clock. We'll accumulate more randomness as soon
- * as things start happening.
- */
-void avRandomInit()
-{
- avChurnRand(NULL, 0);
-}
-
-/*
- * Churn the randomness pool on a random event. Call this early and often
- * on random and semi-random system events to build randomness in time for
- * usage. For randomly timed events, pass a null pointer and a zero length
- * and this will use the system timer and other sources to add randomness.
- * If new random data is available, pass a pointer to that and it will be
- * included.
- *
- * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427
- */
-void avChurnRand(char *randData, u32_t randLen)
-{
- MD5_CTX md5;
-
-/* ppp_trace(LOG_INFO, "churnRand: %u@%P\n", randLen, randData); */
- MD5Init(&md5);
- MD5Update(&md5, (u_char *)randPool, sizeof(randPool));
- if (randData)
- MD5Update(&md5, (u_char *)randData, randLen);
- else {
- struct {
- /* INCLUDE fields for any system sources of randomness */
- char foobar;
- } sysData;
-
- /* Load sysData fields here. */
- ;
- MD5Update(&md5, (u_char *)&sysData, sizeof(sysData));
- }
- MD5Final((u_char *)randPool, &md5);
-/* ppp_trace(LOG_INFO, "churnRand: -> 0\n"); */
-}
-
-/*
- * Use the random pool to generate random data. This degrades to pseudo
- * random when used faster than randomness is supplied using churnRand().
- * Note: It's important that there be sufficient randomness in randPool
- * before this is called for otherwise the range of the result may be
- * narrow enough to make a search feasible.
- *
- * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427
- *
- * XXX Why does he not just call churnRand() for each block? Probably
- * so that you don't ever publish the seed which could possibly help
- * predict future values.
- * XXX Why don't we preserve md5 between blocks and just update it with
- * randCount each time? Probably there is a weakness but I wish that
- * it was documented.
- */
-void avGenRand(char *buf, u32_t bufLen)
-{
- MD5_CTX md5;
- u_char tmp[16];
- u32_t n;
-
- while (bufLen > 0) {
- n = LWIP_MIN(bufLen, RANDPOOLSZ);
- MD5Init(&md5);
- MD5Update(&md5, (u_char *)randPool, sizeof(randPool));
- MD5Update(&md5, (u_char *)&randCount, sizeof(randCount));
- MD5Final(tmp, &md5);
- randCount++;
- memcpy(buf, tmp, n);
- buf += n;
- bufLen -= n;
- }
-}
-
-/*
- * Return a new random number.
- */
-u32_t avRandom()
-{
- u32_t newRand;
-
- avGenRand((char *)&newRand, sizeof(newRand));
-
- return newRand;
-}
-
-#else /* MD5_SUPPORT */
-
-
-/*****************************/
-/*** LOCAL DATA STRUCTURES ***/
-/*****************************/
-static int avRandomized = 0; /* Set when truely randomized. */
-static u32_t avRandomSeed = 0; /* Seed used for random number generation. */
-
-
-/***********************************/
-/*** PUBLIC FUNCTION DEFINITIONS ***/
-/***********************************/
-/*
- * Initialize the random number generator.
- *
- * Here we attempt to compute a random number seed but even if
- * it isn't random, we'll randomize it later.
- *
- * The current method uses the fields from the real time clock,
- * the idle process counter, the millisecond counter, and the
- * hardware timer tick counter. When this is invoked
- * in startup(), then the idle counter and timer values may
- * repeat after each boot and the real time clock may not be
- * operational. Thus we call it again on the first random
- * event.
- */
-void avRandomInit()
-{
-#if 0
- /* Get a pointer into the last 4 bytes of clockBuf. */
- u32_t *lptr1 = (u32_t *)((char *)&clockBuf[3]);
-
- /*
- * Initialize our seed using the real-time clock, the idle
- * counter, the millisecond timer, and the hardware timer
- * tick counter. The real-time clock and the hardware
- * tick counter are the best sources of randomness but
- * since the tick counter is only 16 bit (and truncated
- * at that), the idle counter and millisecond timer
- * (which may be small values) are added to help
- * randomize the lower 16 bits of the seed.
- */
- readClk();
- avRandomSeed += *(u32_t *)clockBuf + *lptr1 + OSIdleCtr
- + ppp_mtime() + ((u32_t)TM1 << 16) + TM1;
-#else
- avRandomSeed += sys_jiffies(); /* XXX */
-#endif
-
- /* Initialize the Borland random number generator. */
- srand((unsigned)avRandomSeed);
-}
-
-/*
- * Randomize our random seed value. Here we use the fact that
- * this function is called at *truely random* times by the polling
- * and network functions. Here we only get 16 bits of new random
- * value but we use the previous value to randomize the other 16
- * bits.
- */
-void avRandomize(void)
-{
- static u32_t last_jiffies;
-
- if (!avRandomized) {
- avRandomized = !0;
- avRandomInit();
- /* The initialization function also updates the seed. */
- } else {
-/* avRandomSeed += (avRandomSeed << 16) + TM1; */
- avRandomSeed += (sys_jiffies() - last_jiffies); /* XXX */
- }
- last_jiffies = sys_jiffies();
-}
-
-/*
- * Return a new random number.
- * Here we use the Borland rand() function to supply a pseudo random
- * number which we make truely random by combining it with our own
- * seed which is randomized by truely random events.
- * Thus the numbers will be truely random unless there have been no
- * operator or network events in which case it will be pseudo random
- * seeded by the real time clock.
- */
-u32_t avRandom()
-{
- return ((((u32_t)rand() << 16) + rand()) + avRandomSeed);
-}
-
-
-
-#endif /* MD5_SUPPORT */
-#endif /* PPP_SUPPORT */
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/randm.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/randm.h
deleted file mode 100644
index baa42f0..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/randm.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*****************************************************************************
-* randm.h - Random number generator header file.
-*
-* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
-* Copyright (c) 1998 Global Election Systems Inc.
-*
-* The authors hereby grant permission to use, copy, modify, distribute,
-* and license this software and its documentation for any purpose, provided
-* that existing copyright notices are retained in all copies and that this
-* notice and the following disclaimer are included verbatim in any
-* distributions. No written agreement, license, or royalty fee is required
-* for any of the authorized uses.
-*
-* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
-* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-******************************************************************************
-* REVISION HISTORY
-*
-* 03-01-01 Marc Boucher <marc at mbsi.ca>
-* Ported to lwIP.
-* 98-05-29 Guy Lancaster <glanca at gesn.com>, Global Election Systems Inc.
-* Extracted from avos.
-*****************************************************************************/
-
-#ifndef RANDM_H
-#define RANDM_H
-
-/***********************
-*** PUBLIC FUNCTIONS ***
-***********************/
-/*
- * Initialize the random number generator.
- */
-void avRandomInit(void);
-
-/*
- * Churn the randomness pool on a random event. Call this early and often
- * on random and semi-random system events to build randomness in time for
- * usage. For randomly timed events, pass a null pointer and a zero length
- * and this will use the system timer and other sources to add randomness.
- * If new random data is available, pass a pointer to that and it will be
- * included.
- */
-void avChurnRand(char *randData, u32_t randLen);
-
-/*
- * Randomize our random seed value. To be called for truely random events
- * such as user operations and network traffic.
- */
-#if MD5_SUPPORT
-#define avRandomize() avChurnRand(NULL, 0)
-#else
-void avRandomize(void);
-#endif
-
-/*
- * Use the random pool to generate random data. This degrades to pseudo
- * random when used faster than randomness is supplied using churnRand().
- * Thus it's important to make sure that the results of this are not
- * published directly because one could predict the next result to at
- * least some degree. Also, it's important to get a good seed before
- * the first use.
- */
-void avGenRand(char *buf, u32_t bufLen);
-
-/*
- * Return a new random number.
- */
-u32_t avRandom(void);
-
-
-#endif /* RANDM_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/vj.c b/src/VBox/Devices/Network/lwip/src/netif/ppp/vj.c
deleted file mode 100644
index 0636ee1..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/vj.c
+++ /dev/null
@@ -1,633 +0,0 @@
-/*
- * Routines to compress and uncompess tcp packets (for transmission
- * over low speed serial lines.
- *
- * Copyright (c) 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Van Jacobson (van at helios.ee.lbl.gov), Dec 31, 1989:
- * - Initial distribution.
- *
- * Modified June 1993 by Paul Mackerras, paulus at cs.anu.edu.au,
- * so that the entire packet being decompressed doesn't have
- * to be in contiguous memory (just the compressed header).
- *
- * Modified March 1998 by Guy Lancaster, glanca at gesn.com,
- * for a 16 bit processor.
- */
-
-#include <string.h>
-
-#include "ppp.h"
-#include "vj.h"
-#include "pppdebug.h"
-
-#if VJ_SUPPORT > 0
-
-#if LINK_STATS
-#define INCR(counter) ++comp->stats.counter
-#else
-#define INCR(counter)
-#endif
-
-#if defined(NO_CHAR_BITFIELDS)
-#define getip_hl(base) ((base).ip_hl_v&0xf)
-#define getth_off(base) (((base).th_x2_off&0xf0)>>4)
-#else
-#define getip_hl(base) ((base).ip_hl)
-#define getth_off(base) ((base).th_off)
-#endif
-
-void vj_compress_init(struct vjcompress *comp)
-{
- register u_int i;
- register struct cstate *tstate = comp->tstate;
-
-#if MAX_SLOTS == 0
- memset((char *)comp, 0, sizeof(*comp));
-#endif
- comp->maxSlotIndex = MAX_SLOTS - 1;
- comp->compressSlot = 0; /* Disable slot ID compression by default. */
- for (i = MAX_SLOTS - 1; i > 0; --i) {
- tstate[i].cs_id = i;
- tstate[i].cs_next = &tstate[i - 1];
- }
- tstate[0].cs_next = &tstate[MAX_SLOTS - 1];
- tstate[0].cs_id = 0;
- comp->last_cs = &tstate[0];
- comp->last_recv = 255;
- comp->last_xmit = 255;
- comp->flags = VJF_TOSS;
-}
-
-
-/* ENCODE encodes a number that is known to be non-zero. ENCODEZ
- * checks for zero (since zero has to be encoded in the long, 3 byte
- * form).
- */
-#define ENCODE(n) { \
- if ((u_short)(n) >= 256) { \
- *cp++ = 0; \
- cp[1] = (n); \
- cp[0] = (n) >> 8; \
- cp += 2; \
- } else { \
- *cp++ = (n); \
- } \
-}
-#define ENCODEZ(n) { \
- if ((u_short)(n) >= 256 || (u_short)(n) == 0) { \
- *cp++ = 0; \
- cp[1] = (n); \
- cp[0] = (n) >> 8; \
- cp += 2; \
- } else { \
- *cp++ = (n); \
- } \
-}
-
-#define DECODEL(f) { \
- if (*cp == 0) {\
- u32_t tmp = ntohl(f) + ((cp[1] << 8) | cp[2]); \
- (f) = htonl(tmp); \
- cp += 3; \
- } else { \
- u32_t tmp = ntohl(f) + (u32_t)*cp++; \
- (f) = htonl(tmp); \
- } \
-}
-
-#define DECODES(f) { \
- if (*cp == 0) {\
- u_short tmp = ntohs(f) + (((u_short)cp[1] << 8) | cp[2]); \
- (f) = htons(tmp); \
- cp += 3; \
- } else { \
- u_short tmp = ntohs(f) + (u_short)*cp++; \
- (f) = htons(tmp); \
- } \
-}
-
-#define DECODEU(f) { \
- if (*cp == 0) {\
- (f) = htons(((u_short)cp[1] << 8) | cp[2]); \
- cp += 3; \
- } else { \
- (f) = htons((u_short)*cp++); \
- } \
-}
-
-/*
- * vj_compress_tcp - Attempt to do Van Jacobsen header compression on a
- * packet. This assumes that nb and comp are not null and that the first
- * buffer of the chain contains a valid IP header.
- * Return the VJ type code indicating whether or not the packet was
- * compressed.
- */
-u_int vj_compress_tcp(
- struct vjcompress *comp,
- struct pbuf *pb
-)
-{
- register struct ip *ip = (struct ip *)pb->payload;
- register struct cstate *cs = comp->last_cs->cs_next;
- register u_short hlen = getip_hl(*ip);
- register struct tcphdr *oth;
- register struct tcphdr *th;
- register u_short deltaS, deltaA;
- register u_long deltaL;
- register u_int changes = 0;
- u_char new_seq[16];
- register u_char *cp = new_seq;
-
- /*
- * Check that the packet is IP proto TCP.
- */
- if (ip->ip_p != IPPROTO_TCP)
- return (TYPE_IP);
-
- /*
- * Bail if this is an IP fragment or if the TCP packet isn't
- * `compressible' (i.e., ACK isn't set or some other control bit is
- * set).
- */
- if ((ip->ip_off & htons(0x3fff)) || pb->tot_len < 40)
- return (TYPE_IP);
- th = (struct tcphdr *)&((long *)ip)[hlen];
- if ((th->th_flags & (TCP_SYN|TCP_FIN|TCP_RST|TCP_ACK)) != TCP_ACK)
- return (TYPE_IP);
-
- /*
- * Packet is compressible -- we're going to send either a
- * COMPRESSED_TCP or UNCOMPRESSED_TCP packet. Either way we need
- * to locate (or create) the connection state. Special case the
- * most recently used connection since it's most likely to be used
- * again & we don't have to do any reordering if it's used.
- */
- INCR(vjs_packets);
- if (ip->ip_src.s_addr != cs->cs_ip.ip_src.s_addr
- || ip->ip_dst.s_addr != cs->cs_ip.ip_dst.s_addr
- || *(long *)th != ((long *)&cs->cs_ip)[getip_hl(cs->cs_ip)]) {
- /*
- * Wasn't the first -- search for it.
- *
- * States are kept in a circularly linked list with
- * last_cs pointing to the end of the list. The
- * list is kept in lru order by moving a state to the
- * head of the list whenever it is referenced. Since
- * the list is short and, empirically, the connection
- * we want is almost always near the front, we locate
- * states via linear search. If we don't find a state
- * for the datagram, the oldest state is (re-)used.
- */
- register struct cstate *lcs;
- register struct cstate *lastcs = comp->last_cs;
-
- do {
- lcs = cs; cs = cs->cs_next;
- INCR(vjs_searches);
- if (ip->ip_src.s_addr == cs->cs_ip.ip_src.s_addr
- && ip->ip_dst.s_addr == cs->cs_ip.ip_dst.s_addr
- && *(long *)th == ((long *)&cs->cs_ip)[getip_hl(cs->cs_ip)])
- goto found;
- } while (cs != lastcs);
-
- /*
- * Didn't find it -- re-use oldest cstate. Send an
- * uncompressed packet that tells the other side what
- * connection number we're using for this conversation.
- * Note that since the state list is circular, the oldest
- * state points to the newest and we only need to set
- * last_cs to update the lru linkage.
- */
- INCR(vjs_misses);
- comp->last_cs = lcs;
- hlen += getth_off(*th);
- hlen <<= 2;
- /* Check that the IP/TCP headers are contained in the first buffer. */
- if (hlen > pb->len)
- return (TYPE_IP);
- goto uncompressed;
-
- found:
- /*
- * Found it -- move to the front on the connection list.
- */
- if (cs == lastcs)
- comp->last_cs = lcs;
- else {
- lcs->cs_next = cs->cs_next;
- cs->cs_next = lastcs->cs_next;
- lastcs->cs_next = cs;
- }
- }
-
- oth = (struct tcphdr *)&((long *)&cs->cs_ip)[hlen];
- deltaS = hlen;
- hlen += getth_off(*th);
- hlen <<= 2;
- /* Check that the IP/TCP headers are contained in the first buffer. */
- if (hlen > pb->len) {
- PPPDEBUG((LOG_INFO, "vj_compress_tcp: header len %d spans buffers\n",
- hlen));
- return (TYPE_IP);
- }
-
- /*
- * Make sure that only what we expect to change changed. The first
- * line of the `if' checks the IP protocol version, header length &
- * type of service. The 2nd line checks the "Don't fragment" bit.
- * The 3rd line checks the time-to-live and protocol (the protocol
- * check is unnecessary but costless). The 4th line checks the TCP
- * header length. The 5th line checks IP options, if any. The 6th
- * line checks TCP options, if any. If any of these things are
- * different between the previous & current datagram, we send the
- * current datagram `uncompressed'.
- */
- if (((u_short *)ip)[0] != ((u_short *)&cs->cs_ip)[0]
- || ((u_short *)ip)[3] != ((u_short *)&cs->cs_ip)[3]
- || ((u_short *)ip)[4] != ((u_short *)&cs->cs_ip)[4]
- || getth_off(*th) != getth_off(*oth)
- || (deltaS > 5 && BCMP(ip + 1, &cs->cs_ip + 1, (deltaS - 5) << 2))
- || (getth_off(*th) > 5 && BCMP(th + 1, oth + 1, (getth_off(*th) - 5) << 2)))
- goto uncompressed;
-
- /*
- * Figure out which of the changing fields changed. The
- * receiver expects changes in the order: urgent, window,
- * ack, seq (the order minimizes the number of temporaries
- * needed in this section of code).
- */
- if (th->th_flags & TCP_URG) {
- deltaS = ntohs(th->th_urp);
- ENCODEZ(deltaS);
- changes |= NEW_U;
- } else if (th->th_urp != oth->th_urp)
- /* argh! URG not set but urp changed -- a sensible
- * implementation should never do this but RFC793
- * doesn't prohibit the change so we have to deal
- * with it. */
- goto uncompressed;
-
- if ((deltaS = (u_short)(ntohs(th->th_win) - ntohs(oth->th_win))) != 0) {
- ENCODE(deltaS);
- changes |= NEW_W;
- }
-
- if ((deltaL = ntohl(th->th_ack) - ntohl(oth->th_ack)) != 0) {
- if (deltaL > 0xffff)
- goto uncompressed;
- deltaA = (u_short)deltaL;
- ENCODE(deltaA);
- changes |= NEW_A;
- }
-
- if ((deltaL = ntohl(th->th_seq) - ntohl(oth->th_seq)) != 0) {
- if (deltaL > 0xffff)
- goto uncompressed;
- deltaS = (u_short)deltaL;
- ENCODE(deltaS);
- changes |= NEW_S;
- }
-
- switch(changes) {
-
- case 0:
- /*
- * Nothing changed. If this packet contains data and the
- * last one didn't, this is probably a data packet following
- * an ack (normal on an interactive connection) and we send
- * it compressed. Otherwise it's probably a retransmit,
- * retransmitted ack or window probe. Send it uncompressed
- * in case the other side missed the compressed version.
- */
- if (ip->ip_len != cs->cs_ip.ip_len &&
- ntohs(cs->cs_ip.ip_len) == hlen)
- break;
-
- /* (fall through) */
-
- case SPECIAL_I:
- case SPECIAL_D:
- /*
- * actual changes match one of our special case encodings --
- * send packet uncompressed.
- */
- goto uncompressed;
-
- case NEW_S|NEW_A:
- if (deltaS == deltaA && deltaS == ntohs(cs->cs_ip.ip_len) - hlen) {
- /* special case for echoed terminal traffic */
- changes = SPECIAL_I;
- cp = new_seq;
- }
- break;
-
- case NEW_S:
- if (deltaS == ntohs(cs->cs_ip.ip_len) - hlen) {
- /* special case for data xfer */
- changes = SPECIAL_D;
- cp = new_seq;
- }
- break;
- }
-
- deltaS = (u_short)(ntohs(ip->ip_id) - ntohs(cs->cs_ip.ip_id));
- if (deltaS != 1) {
- ENCODEZ(deltaS);
- changes |= NEW_I;
- }
- if (th->th_flags & TCP_PSH)
- changes |= TCP_PUSH_BIT;
- /*
- * Grab the cksum before we overwrite it below. Then update our
- * state with this packet's header.
- */
- deltaA = ntohs(th->th_sum);
- BCOPY(ip, &cs->cs_ip, hlen);
-
- /*
- * We want to use the original packet as our compressed packet.
- * (cp - new_seq) is the number of bytes we need for compressed
- * sequence numbers. In addition we need one byte for the change
- * mask, one for the connection id and two for the tcp checksum.
- * So, (cp - new_seq) + 4 bytes of header are needed. hlen is how
- * many bytes of the original packet to toss so subtract the two to
- * get the new packet size.
- */
- deltaS = (u_short)(cp - new_seq);
- if (!comp->compressSlot || comp->last_xmit != cs->cs_id) {
- comp->last_xmit = cs->cs_id;
- hlen -= deltaS + 4;
- pbuf_header(pb, -hlen);
- cp = (u_char *)pb->payload;
- *cp++ = changes | NEW_C;
- *cp++ = cs->cs_id;
- } else {
- hlen -= deltaS + 3;
- pbuf_header(pb, -hlen);
- cp = (u_char *)pb->payload;
- *cp++ = changes;
- }
- *cp++ = deltaA >> 8;
- *cp++ = deltaA;
- BCOPY(new_seq, cp, deltaS);
- INCR(vjs_compressed);
- return (TYPE_COMPRESSED_TCP);
-
- /*
- * Update connection state cs & send uncompressed packet (that is,
- * a regular ip/tcp packet but with the 'conversation id' we hope
- * to use on future compressed packets in the protocol field).
- */
-uncompressed:
- BCOPY(ip, &cs->cs_ip, hlen);
- ip->ip_p = cs->cs_id;
- comp->last_xmit = cs->cs_id;
- return (TYPE_UNCOMPRESSED_TCP);
-}
-
-/*
- * Called when we may have missed a packet.
- */
-void vj_uncompress_err(struct vjcompress *comp)
-{
- comp->flags |= VJF_TOSS;
- INCR(vjs_errorin);
-}
-
-/*
- * "Uncompress" a packet of type TYPE_UNCOMPRESSED_TCP.
- * Return 0 on success, -1 on failure.
- */
-int vj_uncompress_uncomp(
- struct pbuf *nb,
- struct vjcompress *comp
-)
-{
- register u_int hlen;
- register struct cstate *cs;
- register struct ip *ip;
-
- ip = (struct ip *)nb->payload;
- hlen = getip_hl(*ip) << 2;
- if (ip->ip_p >= MAX_SLOTS
- || hlen + sizeof(struct tcphdr) > nb->len
- || (hlen += getth_off(*((struct tcphdr *)&((char *)ip)[hlen])) << 2)
- > nb->len
- || hlen > MAX_HDR) {
- PPPDEBUG((LOG_INFO, "vj_uncompress_uncomp: bad cid=%d, hlen=%d buflen=%d\n",
- ip->ip_p, hlen, nb->len));
- comp->flags |= VJF_TOSS;
- INCR(vjs_errorin);
- return -1;
- }
- cs = &comp->rstate[comp->last_recv = ip->ip_p];
- comp->flags &=~ VJF_TOSS;
- ip->ip_p = IPPROTO_TCP;
- BCOPY(ip, &cs->cs_ip, hlen);
- cs->cs_hlen = hlen;
- INCR(vjs_uncompressedin);
- return 0;
-}
-
-/*
- * Uncompress a packet of type TYPE_COMPRESSED_TCP.
- * The packet is composed of a buffer chain and the first buffer
- * must contain an accurate chain length.
- * The first buffer must include the entire compressed TCP/IP header.
- * This procedure replaces the compressed header with the uncompressed
- * header and returns the length of the VJ header.
- */
-int vj_uncompress_tcp(
- struct pbuf **nb,
- struct vjcompress *comp
-)
-{
- u_char *cp;
- struct tcphdr *th;
- struct cstate *cs;
- u_short *bp;
- struct pbuf *n0 = *nb;
- u32_t tmp;
- u_int vjlen, hlen, changes;
-
- INCR(vjs_compressedin);
- cp = (u_char *)n0->payload;
- changes = *cp++;
- if (changes & NEW_C) {
- /*
- * Make sure the state index is in range, then grab the state.
- * If we have a good state index, clear the 'discard' flag.
- */
- if (*cp >= MAX_SLOTS) {
- PPPDEBUG((LOG_INFO, "vj_uncompress_tcp: bad cid=%d\n", *cp));
- goto bad;
- }
-
- comp->flags &=~ VJF_TOSS;
- comp->last_recv = *cp++;
- } else {
- /*
- * this packet has an implicit state index. If we've
- * had a line error since the last time we got an
- * explicit state index, we have to toss the packet.
- */
- if (comp->flags & VJF_TOSS) {
- PPPDEBUG((LOG_INFO, "vj_uncompress_tcp: tossing\n"));
- INCR(vjs_tossed);
- return (-1);
- }
- }
- cs = &comp->rstate[comp->last_recv];
- hlen = getip_hl(cs->cs_ip) << 2;
- th = (struct tcphdr *)&((u_char *)&cs->cs_ip)[hlen];
- th->th_sum = htons((*cp << 8) | cp[1]);
- cp += 2;
- if (changes & TCP_PUSH_BIT)
- th->th_flags |= TCP_PSH;
- else
- th->th_flags &=~ TCP_PSH;
-
- switch (changes & SPECIALS_MASK) {
- case SPECIAL_I:
- {
- register u32_t i = ntohs(cs->cs_ip.ip_len) - cs->cs_hlen;
- /* some compilers can't nest inline assembler.. */
- tmp = ntohl(th->th_ack) + i;
- th->th_ack = htonl(tmp);
- tmp = ntohl(th->th_seq) + i;
- th->th_seq = htonl(tmp);
- }
- break;
-
- case SPECIAL_D:
- /* some compilers can't nest inline assembler.. */
- tmp = ntohl(th->th_seq) + ntohs(cs->cs_ip.ip_len) - cs->cs_hlen;
- th->th_seq = htonl(tmp);
- break;
-
- default:
- if (changes & NEW_U) {
- th->th_flags |= TCP_URG;
- DECODEU(th->th_urp);
- } else
- th->th_flags &=~ TCP_URG;
- if (changes & NEW_W)
- DECODES(th->th_win);
- if (changes & NEW_A)
- DECODEL(th->th_ack);
- if (changes & NEW_S)
- DECODEL(th->th_seq);
- break;
- }
- if (changes & NEW_I) {
- DECODES(cs->cs_ip.ip_id);
- } else {
- cs->cs_ip.ip_id = ntohs(cs->cs_ip.ip_id) + 1;
- cs->cs_ip.ip_id = htons(cs->cs_ip.ip_id);
- }
-
- /*
- * At this point, cp points to the first byte of data in the
- * packet. Fill in the IP total length and update the IP
- * header checksum.
- */
- vjlen = (u_short)(cp - (u_char*)n0->payload);
- if (n0->len < vjlen) {
- /*
- * We must have dropped some characters (crc should detect
- * this but the old slip framing won't)
- */
- PPPDEBUG((LOG_INFO, "vj_uncompress_tcp: head buffer %d too short %d\n",
- n0->len, vjlen));
- goto bad;
- }
-
-#if BYTE_ORDER == LITTLE_ENDIAN
- tmp = n0->tot_len - vjlen + cs->cs_hlen;
- cs->cs_ip.ip_len = htons(tmp);
-#else
- cs->cs_ip.ip_len = htons(n0->tot_len - vjlen + cs->cs_hlen);
-#endif
-
- /* recompute the ip header checksum */
- bp = (u_short *) &cs->cs_ip;
- cs->cs_ip.ip_sum = 0;
- for (tmp = 0; hlen > 0; hlen -= 2)
- tmp += *bp++;
- tmp = (tmp & 0xffff) + (tmp >> 16);
- tmp = (tmp & 0xffff) + (tmp >> 16);
- cs->cs_ip.ip_sum = (u_short)(~tmp);
-
- /* Remove the compressed header and prepend the uncompressed header. */
- pbuf_header(n0, -vjlen);
-
- if(MEM_ALIGN(n0->payload) != n0->payload) {
- struct pbuf *np, *q;
- u8_t *bufptr;
-
- np = pbuf_alloc(PBUF_RAW, n0->len + cs->cs_hlen, PBUF_POOL);
- if(!np) {
- PPPDEBUG((LOG_WARNING, "vj_uncompress_tcp: realign failed\n"));
- *nb = NULL;
- goto bad;
- }
-
- pbuf_header(np, -cs->cs_hlen);
-
- bufptr = n0->payload;
- for(q = np; q != NULL; q = q->next) {
- memcpy(q->payload, bufptr, q->len);
- bufptr += q->len;
- }
-
- if(n0->next) {
- pbuf_chain(np, n0->next);
- pbuf_dechain(n0);
- }
- pbuf_free(n0);
- n0 = np;
- }
-
- if(pbuf_header(n0, cs->cs_hlen)) {
- struct pbuf *np;
-
- LWIP_ASSERT("vj_uncompress_tcp: cs->cs_hlen <= PBUF_POOL_BUFSIZE", cs->cs_hlen <= PBUF_POOL_BUFSIZE);
- np = pbuf_alloc(PBUF_RAW, cs->cs_hlen, PBUF_POOL);
- if(!np) {
- PPPDEBUG((LOG_WARNING, "vj_uncompress_tcp: prepend failed\n"));
- *nb = NULL;
- goto bad;
- }
- pbuf_cat(np, n0);
- n0 = np;
- }
- LWIP_ASSERT("n0->len >= cs->cs_hlen", n0->len >= cs->cs_hlen);
- memcpy(n0->payload, &cs->cs_ip, cs->cs_hlen);
-
- *nb = n0;
-
- return vjlen;
-
-bad:
- comp->flags |= VJF_TOSS;
- INCR(vjs_errorin);
- return (-1);
-}
-
-#endif
-
-
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/vj.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/vj.h
deleted file mode 100644
index b7374b3..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/vj.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Definitions for tcp compression routines.
- *
- * $Id: vj.h $
- *
- * Copyright (c) 1989 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * Van Jacobson (van at helios.ee.lbl.gov), Dec 31, 1989:
- * - Initial distribution.
- */
-
-#ifndef VJ_H
-#define VJ_H
-
-#include "vjbsdhdr.h"
-
-#define MAX_SLOTS 16 /* must be > 2 and < 256 */
-#define MAX_HDR 128
-
-/*
- * Compressed packet format:
- *
- * The first octet contains the packet type (top 3 bits), TCP
- * 'push' bit, and flags that indicate which of the 4 TCP sequence
- * numbers have changed (bottom 5 bits). The next octet is a
- * conversation number that associates a saved IP/TCP header with
- * the compressed packet. The next two octets are the TCP checksum
- * from the original datagram. The next 0 to 15 octets are
- * sequence number changes, one change per bit set in the header
- * (there may be no changes and there are two special cases where
- * the receiver implicitly knows what changed -- see below).
- *
- * There are 5 numbers which can change (they are always inserted
- * in the following order): TCP urgent pointer, window,
- * acknowlegement, sequence number and IP ID. (The urgent pointer
- * is different from the others in that its value is sent, not the
- * change in value.) Since typical use of SLIP links is biased
- * toward small packets (see comments on MTU/MSS below), changes
- * use a variable length coding with one octet for numbers in the
- * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the
- * range 256 - 65535 or 0. (If the change in sequence number or
- * ack is more than 65535, an uncompressed packet is sent.)
- */
-
-/*
- * Packet types (must not conflict with IP protocol version)
- *
- * The top nibble of the first octet is the packet type. There are
- * three possible types: IP (not proto TCP or tcp with one of the
- * control flags set); uncompressed TCP (a normal IP/TCP packet but
- * with the 8-bit protocol field replaced by an 8-bit connection id --
- * this type of packet syncs the sender & receiver); and compressed
- * TCP (described above).
- *
- * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and
- * is logically part of the 4-bit "changes" field that follows. Top
- * three bits are actual packet type. For backward compatibility
- * and in the interest of conserving bits, numbers are chosen so the
- * IP protocol version number (4) which normally appears in this nibble
- * means "IP packet".
- */
-
-/* packet types */
-#define TYPE_IP 0x40
-#define TYPE_UNCOMPRESSED_TCP 0x70
-#define TYPE_COMPRESSED_TCP 0x80
-#define TYPE_ERROR 0x00
-
-/* Bits in first octet of compressed packet */
-#define NEW_C 0x40 /* flag bits for what changed in a packet */
-#define NEW_I 0x20
-#define NEW_S 0x08
-#define NEW_A 0x04
-#define NEW_W 0x02
-#define NEW_U 0x01
-
-/* reserved, special-case values of above */
-#define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */
-#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */
-#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U)
-
-#define TCP_PUSH_BIT 0x10
-
-
-/*
- * "state" data for each active tcp conversation on the wire. This is
- * basically a copy of the entire IP/TCP header from the last packet
- * we saw from the conversation together with a small identifier
- * the transmit & receive ends of the line use to locate saved header.
- */
-struct cstate {
- struct cstate *cs_next; /* next most recently used state (xmit only) */
- u_short cs_hlen; /* size of hdr (receive only) */
- u_char cs_id; /* connection # associated with this state */
- u_char cs_filler;
- union {
- char csu_hdr[MAX_HDR];
- struct ip csu_ip; /* ip/tcp hdr from most recent packet */
- } vjcs_u;
-};
-#define cs_ip vjcs_u.csu_ip
-#define cs_hdr vjcs_u.csu_hdr
-
-
-struct vjstat {
- unsigned long vjs_packets; /* outbound packets */
- unsigned long vjs_compressed; /* outbound compressed packets */
- unsigned long vjs_searches; /* searches for connection state */
- unsigned long vjs_misses; /* times couldn't find conn. state */
- unsigned long vjs_uncompressedin; /* inbound uncompressed packets */
- unsigned long vjs_compressedin; /* inbound compressed packets */
- unsigned long vjs_errorin; /* inbound unknown type packets */
- unsigned long vjs_tossed; /* inbound packets tossed because of error */
-};
-
-/*
- * all the state data for one serial line (we need one of these per line).
- */
-struct vjcompress {
- struct cstate *last_cs; /* most recently used tstate */
- u_char last_recv; /* last rcvd conn. id */
- u_char last_xmit; /* last sent conn. id */
- u_short flags;
- u_char maxSlotIndex;
- u_char compressSlot; /* Flag indicating OK to compress slot ID. */
-#if LINK_STATS
- struct vjstat stats;
-#endif
- struct cstate tstate[MAX_SLOTS]; /* xmit connection states */
- struct cstate rstate[MAX_SLOTS]; /* receive connection states */
-};
-
-/* flag values */
-#define VJF_TOSS 1U /* tossing rcvd frames because of input err */
-
-extern void vj_compress_init (struct vjcompress *comp);
-extern u_int vj_compress_tcp (struct vjcompress *comp, struct pbuf *pb);
-extern void vj_uncompress_err (struct vjcompress *comp);
-extern int vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp);
-extern int vj_uncompress_tcp(struct pbuf **nb, struct vjcompress *comp);
-
-#endif /* VJ_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/ppp/vjbsdhdr.h b/src/VBox/Devices/Network/lwip/src/netif/ppp/vjbsdhdr.h
deleted file mode 100644
index a089352..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/ppp/vjbsdhdr.h
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef VJBSDHDR_H
-#define VJBSDHDR_H
-
-#include "lwip/tcp.h"
-
-
-/*
- * Structure of an internet header, naked of options.
- *
- * We declare ip_len and ip_off to be short, rather than u_short
- * pragmatically since otherwise unsigned comparisons can result
- * against negative integers quite easily, and fail in subtle ways.
- */
-PACK_STRUCT_BEGIN
-struct ip
-{
-#if defined(NO_CHAR_BITFIELDS)
- u_char ip_hl_v; /* bug in GCC for mips means the bitfield stuff will sometimes break - so we use a char for both and get round it with macro's instead... */
-#else
-#if BYTE_ORDER == LITTLE_ENDIAN
- unsigned ip_hl:4, /* header length */
- ip_v:4; /* version */
-#elif BYTE_ORDER == BIG_ENDIAN
- unsigned ip_v:4, /* version */
- ip_hl:4; /* header length */
-#else
- COMPLAIN - NO BYTE ORDER SELECTED!
-#endif
-#endif
- u_char ip_tos; /* type of service */
- u_short ip_len; /* total length */
- u_short ip_id; /* identification */
- u_short ip_off; /* fragment offset field */
-#define IP_DF 0x4000 /* dont fragment flag */
-#define IP_MF 0x2000 /* more fragments flag */
-#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
- u_char ip_ttl; /* time to live */
- u_char ip_p; /* protocol */
- u_short ip_sum; /* checksum */
- struct in_addr ip_src,ip_dst; /* source and dest address */
-};
-PACK_STRUCT_END
-
-typedef u32_t tcp_seq;
-
-/*
- * TCP header.
- * Per RFC 793, September, 1981.
- */
-PACK_STRUCT_BEGIN
-struct tcphdr
-{
- u_short th_sport; /* source port */
- u_short th_dport; /* destination port */
- tcp_seq th_seq; /* sequence number */
- tcp_seq th_ack; /* acknowledgement number */
-#if defined(NO_CHAR_BITFIELDS)
- u_char th_x2_off;
-#else
-#if BYTE_ORDER == LITTLE_ENDIAN
- unsigned th_x2:4, /* (unused) */
- th_off:4; /* data offset */
-#endif
-#if BYTE_ORDER == BIG_ENDIAN
- unsigned th_off:4, /* data offset */
- th_x2:4; /* (unused) */
-#endif
-#endif
- u_char th_flags;
- u_short th_win; /* window */
- u_short th_sum; /* checksum */
- u_short th_urp; /* urgent pointer */
-};
-PACK_STRUCT_END
-
-#endif /* VJBSDHDR_H */
diff --git a/src/VBox/Devices/Network/lwip/src/netif/slipif.c b/src/VBox/Devices/Network/lwip/src/netif/slipif.c
deleted file mode 100644
index dd8db20..0000000
--- a/src/VBox/Devices/Network/lwip/src/netif/slipif.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. Neither the name of the Institute nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * This file is built upon the file: src/arch/rtxc/netif/sioslip.c
- *
- * Author: Magnus Ivarsson <magnus.ivarsson(at)volvo.com>
- */
-
-/*
- * This is an arch independent SLIP netif. The specific serial hooks must be
- * provided by another file. They are sio_open, sio_recv and sio_send
- */
-
-#include "netif/slipif.h"
-#include "lwip/opt.h"
-#include "lwip/def.h"
-#include "lwip/pbuf.h"
-#include "lwip/sys.h"
-#include "lwip/stats.h"
-#include "lwip/sio.h"
-
-#define SLIP_END 0300
-#define SLIP_ESC 0333
-#define SLIP_ESC_END 0334
-#define SLIP_ESC_ESC 0335
-
-#define MAX_SIZE 1500
-
-/**
- * Send a pbuf doing the necessary SLIP encapsulation
- *
- * Uses the serial layer's sio_send()
- */
-err_t
-slipif_output(struct netif *netif, struct pbuf *p, struct ip_addr *ipaddr)
-{
- struct pbuf *q;
- u16_t i;
- u8_t c;
-
- /* Send pbuf out on the serial I/O device. */
- sio_send(SLIP_END, netif->state);
-
- for (q = p; q != NULL; q = q->next) {
- for (i = 0; i < q->len; i++) {
- c = ((u8_t *)q->payload)[i];
- switch (c) {
- case SLIP_END:
- sio_send(SLIP_ESC, netif->state);
- sio_send(SLIP_ESC_END, netif->state);
- break;
- case SLIP_ESC:
- sio_send(SLIP_ESC, netif->state);
- sio_send(SLIP_ESC_ESC, netif->state);
- break;
- default:
- sio_send(c, netif->state);
- break;
- }
- }
- }
- sio_send(SLIP_END, netif->state);
- return 0;
-}
-
-/**
- * Handle the incoming SLIP stream character by character
- *
- * Poll the serial layer by calling sio_recv()
- *
- * @return The IP packet when SLIP_END is received
- */
-static struct pbuf *
-slipif_input(struct netif *netif)
-{
- u8_t c;
- struct pbuf *p, *q;
- u16_t recved;
- u16_t i;
-
- q = p = NULL;
- recved = i = 0;
- c = 0;
-
- while (1) {
- c = sio_recv(netif->state);
- switch (c) {
- case SLIP_END:
- if (recved > 0) {
- /* Received whole packet. */
- pbuf_realloc(q, recved);
-
- LINK_STATS_INC(link.recv);
-
- LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet\n"));
- return q;
- }
- break;
-
- case SLIP_ESC:
- c = sio_recv(netif->state);
- switch (c) {
- case SLIP_ESC_END:
- c = SLIP_END;
- break;
- case SLIP_ESC_ESC:
- c = SLIP_ESC;
- break;
- }
- /* FALLTHROUGH */
-
- default:
- if (p == NULL) {
- LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n"));
- p = pbuf_alloc(PBUF_LINK, PBUF_POOL_BUFSIZE, PBUF_POOL);
-
- if (p == NULL) {
- LINK_STATS_INC(link.drop);
- LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n"));
- }
-
- if (q != NULL) {
- pbuf_cat(q, p);
- } else {
- q = p;
- }
- }
- if (p != NULL && recved < MAX_SIZE) {
- ((u8_t *)p->payload)[i] = c;
- recved++;
- i++;
- if (i >= p->len) {
- i = 0;
- if (p->next != NULL && p->next->len > 0)
- p = p->next;
- else
- p = NULL;
- }
- }
- break;
- }
-
- }
- return NULL;
-}
-
-/**
- * The SLIP input thread.
- *
- * Feed the IP layer with incoming packets
- */
-static void
-slipif_loop(void *nf)
-{
- struct pbuf *p;
- struct netif *netif = (struct netif *)nf;
-
- while (1) {
- p = slipif_input(netif);
- netif->input(p, netif);
- }
-}
-
-/**
- * SLIP netif initialization
- *
- * Call the arch specific sio_open and remember
- * the opened device in the state field of the netif.
- */
-err_t
-slipif_init(struct netif *netif)
-{
-
- LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)netif->num));
-
- netif->name[0] = 's';
- netif->name[1] = 'l';
- netif->output = slipif_output;
- netif->mtu = 1500;
- netif->flags = NETIF_FLAG_POINTTOPOINT;
-
- netif->state = sio_open(netif->num);
- if (!netif->state)
- return ERR_IF;
-
- sys_thread_new(slipif_loop, netif, SLIPIF_THREAD_PRIO);
- return ERR_OK;
-}
diff --git a/src/VBox/Devices/Network/lwip/vbox/include/arch/bpstruct.h b/src/VBox/Devices/Network/lwip/vbox/include/arch/bpstruct.h
deleted file mode 100644
index 1d81e3f..0000000
--- a/src/VBox/Devices/Network/lwip/vbox/include/arch/bpstruct.h
+++ /dev/null
@@ -1 +0,0 @@
-#pragma pack(push,1)
diff --git a/src/VBox/Devices/Network/lwip/vbox/include/arch/cc.h b/src/VBox/Devices/Network/lwip/vbox/include/arch/cc.h
deleted file mode 100644
index f03b84f..0000000
--- a/src/VBox/Devices/Network/lwip/vbox/include/arch/cc.h
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef VBOX_ARCH_CC_H_
-#define VBOX_ARCH_CC_H_
-
-#ifndef LOG_GROUP
-#define LOG_GROUP LOG_GROUP_DRV_LWIP
-#endif
-#include <VBox/log.h>
-#include <iprt/stdint.h>
-#include <iprt/cdefs.h>
-#include <iprt/assert.h>
-
-typedef uint8_t u8_t;
-typedef int8_t s8_t;
-typedef uint16_t u16_t;
-typedef int16_t s16_t;
-typedef uint32_t u32_t;
-typedef int32_t s32_t;
-
-typedef uintptr_t mem_ptr_t;
-
-#ifdef _MSC_VER
-# define PACK_STRUCT_FIELD(x) x
-# define PACK_STRUCT_STRUCT
-# define PACK_STRUCT_USE_INCLUDES
-# define LWIP_PROVIDE_ERRNO
-# pragma warning (disable: 4103)
-#elif defined(__GNUC__)
-# define PACK_STRUCT_FIELD(x) x
-# define PACK_STRUCT_STRUCT __attribute__((__packed__))
-# define PACK_STRUCT_BEGIN
-# define PACK_STRUCT_END
-# include <errno.h>
-#else
-# error This header file has not been ported yet for this compiler.
-#endif
-
-/* Provide byte order hint. */
-#undef BYTE_ORDER
-#define BYTE_ORDER LITTLE_ENDIAN
-
-#ifdef DEBUG
-#define LWIP_PLATFORM_DIAG(x) Log(x)
-#else /* !DEBUG */
-#define LWIP_PLATFORM_DIAG(x) LogRel(x)
-#endif /* !DEBUG */
-#define LWIP_PLATFORM_ASSERT(x) AssertReleaseMsgFailed((x))
-
-#endif /* !VBOX_ARCH_CC_H_ */
diff --git a/src/VBox/Devices/Network/lwip/vbox/include/arch/epstruct.h b/src/VBox/Devices/Network/lwip/vbox/include/arch/epstruct.h
deleted file mode 100644
index 65898b5..0000000
--- a/src/VBox/Devices/Network/lwip/vbox/include/arch/epstruct.h
+++ /dev/null
@@ -1 +0,0 @@
-#pragma pack(pop)
diff --git a/src/VBox/Devices/Network/lwip/vbox/include/arch/perf.h b/src/VBox/Devices/Network/lwip/vbox/include/arch/perf.h
deleted file mode 100644
index 5b364db..0000000
--- a/src/VBox/Devices/Network/lwip/vbox/include/arch/perf.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef VBOX_ARCH_PERF_H_
-#define VBOX_ARCH_PERF_H_
-
-#define PERF_START
-#define PERF_STOP(x)
-
-#endif /* !VBOX_ARCH_PERF_H_ */
diff --git a/src/VBox/Devices/Network/lwip/vbox/include/arch/sys_arch.h b/src/VBox/Devices/Network/lwip/vbox/include/arch/sys_arch.h
deleted file mode 100644
index 199c459..0000000
--- a/src/VBox/Devices/Network/lwip/vbox/include/arch/sys_arch.h
+++ /dev/null
@@ -1,33 +0,0 @@
-#ifndef VBOX_ARCH_SYS_ARCH_H_
-#define VBOX_ARCH_SYS_ARCH_H_
-
-#include <iprt/semaphore.h>
-#include <iprt/thread.h>
-#ifdef RT_OS_DARWIN
-#include <sys/time.h>
-#endif
-
-/** NULL value for a mbox. */
-#define SYS_MBOX_NULL NULL
-
-/** NULL value for a mutex semaphore. */
-#define SYS_SEM_NULL NIL_RTSEMEVENT
-
-/** The IPRT event semaphore ID just works fine for this type. */
-typedef RTSEMEVENT sys_sem_t;
-
-/** Forward declaration of the actual mbox type. */
-struct sys_mbox;
-
-/** The opaque type of a mbox. */
-typedef struct sys_mbox *sys_mbox_t;
-
-/** The IPRT thread ID just works fine for this type. */
-typedef RTTHREAD sys_thread_t;
-
-#if SYS_LIGHTWEIGHT_PROT
-/** This is just a dummy. The implementation doesn't need anything. */
-typedef void *sys_prot_t;
-#endif
-
-#endif /* !VBOX_ARCH_SYS_ARCH_H_ */
diff --git a/src/VBox/Devices/Network/lwip/vbox/include/lwipopts.h b/src/VBox/Devices/Network/lwip/vbox/include/lwipopts.h
deleted file mode 100644
index 0d405df..0000000
--- a/src/VBox/Devices/Network/lwip/vbox/include/lwipopts.h
+++ /dev/null
@@ -1,300 +0,0 @@
-#ifndef VBOX_LWIP_OPTS_H_
-#define VBOX_LWIP_OPTS_H_
-
-#include <iprt/mem.h>
-#include <iprt/alloca.h> /* This may include malloc.h (msc), which is something that has
- * to be done before redefining any of the functions therein. */
-
-/* lwip/sockets.h assumes that if FD_SET is defined (in case of Innotek GCC
- * its definition is dragged through iprt/types.h) then struct timeval is
- * defined as well, but it's not the case. So include it manually. */
-#ifdef RT_OS_OS2
-# include <sys/time.h>
-#endif
-
-/** Make lwIP use the libc malloc, or more precisely (see below) the IPRT
- * memory allocation functions. */
-#define MEM_LIBC_MALLOC 1
-
-/** Set proper memory alignment. */
-#if HC_ARCH_BITS == 64
-# define MEM_ALIGNMENT 8
-#else
-#define MEM_ALIGNMENT 4
-#endif
-
-/** Increase number of PBUF buffers. */
-#define PBUF_POOL_SIZE 128
-
-/** Increase PBUF buffer size. */
-#define PBUF_POOL_BUFSIZE 1536
-
-/** Increase maximum TCP window size. */
-#define TCP_WND 32768
-
-/** Increase TCP maximum segment size. */
-#define TCP_MSS 1400
-
-/** Enable queueing of out-of-order segments. */
-#define TCP_QUEUE_OOSEQ 1
-
-/** TCP send buffer space. */
-#define TCP_SND_BUF 32768
-
-/** TCP send buffer space (in pbufs). */
-#define TCP_SND_QUEUELEN 2*TCP_SND_BUF/TCP_MSS
-
-/** Increase maximum pool size for PBUF. */
-#define MEMP_NUM_PBUF 64
-
-/** Increase maximum pool size for TCPIP messages. Default of 8 is too low. */
-#define MEMP_NUM_TCPIP_MSG 32
-
-/** Increase maximum number of queued TCP segments. Needed for large sends. */
-#define MEMP_NUM_TCP_SEG 255
-
-/** Turn on support for lightweight critical region protection. Leaving this
- * off uses synchronization code in pbuf.c which is totally polluted with
- * races. All the other lwip source files would fall back to semaphore-based
- * synchronization, but pbuf.c is just broken, leading to incorrect allocation
- * and as a result to assertions due to buffers being double freed. */
-#define SYS_LIGHTWEIGHT_PROT 1
-
-/** Attempt to get rid of htons etc. macro issues. */
-#define LWIP_PREFIX_BYTEORDER_FUNCS
-
-/* Debugging stuff. */
-#ifdef DEBUG
-#define LWIP_DEBUG
-#define DBG_TYPES_ON (DBG_ON | DBG_TRACE | DBG_STATE | DBG_FRESH | DBG_HALT)
-#define DBG_MIN_LEVEL 0
-
-#define ETHARP_DEBUG DBG_ON
-#define NETIF_DEBUG DBG_ON
-#define PBUF_DEBUG DBG_ON
-#define API_LIB_DEBUG DBG_ON
-#define API_MSG_DEBUG DBG_ON
-#define SOCKETS_DEBUG DBG_ON
-#define ICMP_DEBUG DBG_ON
-#define INET_DEBUG DBG_ON
-#define IP_DEBUG DBG_ON
-#define IP_REASS_DEBUG DBG_ON
-#define RAW_DEBUG DBG_ON
-#define MEM_DEBUG DBG_ON
-#define MEMP_DEBUG DBG_ON
-#define SYS_DEBUG DBG_ON
-#define TCP_DEBUG DBG_ON
-#define TCP_INPUT_DEBUG DBG_ON
-#define TCP_FR_DEBUG DBG_ON
-#define TCP_RTO_DEBUG DBG_ON
-#define TCP_REXMIT_DEBUG DBG_ON
-#define TCP_CWND_DEBUG DBG_ON
-#define TCP_WND_DEBUG DBG_ON
-#define TCP_OUTPUT_DEBUG DBG_ON
-#define TCP_RST_DEBUG DBG_ON
-#define TCP_QLEN_DEBUG DBG_ON
-#define UDP_DEBUG DBG_ON
-#define TCPIP_DEBUG DBG_ON
-#define DHCP_DEBUG DBG_ON
-
-#endif /* DEBUG */
-
-/* printf formatter definitions */
-#define U16_F "hu"
-#define S16_F "hd"
-#define X16_F "hx"
-#define U32_F "lu"
-#define S32_F "ld"
-#define X32_F "lx"
-
-/* Redirect libc memory alloc functions to IPRT. */
-#define malloc(x) RTMemAlloc(x)
-#define realloc(x,y) RTMemRealloc((x), (y))
-#define free(x) RTMemFree(x)
-
-/* Hack to avoid function name collisions with slirp or any other code. */
-#define api_msg_input lwip_api_msg_input
-#define api_msg_post lwip_api_msg_post
-#define etharp_arp_input lwip_etharp_arp_input
-#define etharp_find_addr lwip_etharp_find_addr
-#define etharp_init lwip_etharp_init
-#define etharp_ip_input lwip_etharp_ip_input
-#define etharp_output lwip_etharp_output
-#define etharp_query lwip_etharp_query
-#define etharp_request lwip_etharp_request
-#define etharp_tmr lwip_etharp_tmr
-#define icmp_dest_unreach lwip_icmp_dest_unreach
-#define icmp_input lwip_icmp_input
-#define inet_addr lwip_inet_addr
-#define inet_aton lwip_inet_aton
-#define inet_chksum lwip_inet_chksum
-#define inet_chksum_pbuf lwip_inet_chksum_pbuf
-#define inet_chksum_pseudo lwip_inet_chksum_pseudo
-#define inet_ntoa lwip_inet_ntoa
-#define ip_addr_any lwip_ip_addr_any
-#define ip_addr_broadcast lwip_ip_addr_broadcast
-#define ip_addr_isbroadcast lwip_ip_addr_isbroadcast /* problematic */
-#define ip_frag lwip_ip_frag
-#define ip_frag_init lwip_ip_frag_init
-#define ip_init lwip_ip_init
-#define ip_input lwip_ip_input
-#define ip_output lwip_ip_output
-#define ip_output_if lwip_ip_output_if
-#define ip_reass lwip_ip_reass
-#define ip_reass_tmr lwip_ip_reass_tmr
-#define ip_route lwip_ip_route
-#define netbuf_alloc lwip_netbuf_alloc
-#define netbuf_chain lwip_netbuf_chain
-#define netbuf_copy lwip_netbuf_copy
-#define netbuf_copy_partial lwip_netbuf_copy_partial
-#define netbuf_data lwip_netbuf_data
-#define netbuf_delete lwip_netbuf_delete
-#define netbuf_first lwip_netbuf_first
-#define netbuf_free lwip_netbuf_free
-#define netbuf_fromaddr lwip_netbuf_fromaddr
-#define netbuf_fromport lwip_netbuf_fromport
-#define netbuf_len lwip_netbuf_len
-#define netbuf_new lwip_netbuf_new
-#define netbuf_next lwip_netbuf_next
-#define netbuf_ref lwip_netbuf_ref
-#define netconn_accept lwip_netconn_accept
-#define netconn_addr lwip_netconn_addr
-#define netconn_bind lwip_netconn_bind
-#define netconn_close lwip_netconn_close
-#define netconn_connect lwip_netconn_connect
-#define netconn_delete lwip_netconn_delete
-#define netconn_disconnect lwip_netconn_disconnect
-#define netconn_err lwip_netconn_err
-#define netconn_listen lwip_netconn_listen
-#define netconn_new lwip_netconn_new
-#define netconn_new_with_callback lwip_netconn_new_with_callback
-#define netconn_new_with_proto_and_callback lwip_netconn_new_with_proto_and_callback
-#define netconn_peer lwip_netconn_peer
-#define netconn_recv lwip_netconn_recv
-#define netconn_send lwip_netconn_send
-#define netconn_type lwip_netconn_type
-#define netconn_write lwip_netconn_write
-#define netif_add lwip_netif_add
-#define netif_default lwip_netif_default
-#define netif_find lwip_netif_find
-#define netif_init lwip_netif_init
-#define netif_is_up lwip_netif_is_up
-#define netif_list lwip_netif_list
-#define netif_remove lwip_netif_remove
-#define netif_set_addr lwip_netif_set_addr
-#define netif_set_default lwip_netif_set_default
-#define netif_set_down lwip_netif_set_down
-#define netif_set_gw lwip_netif_set_gw
-#define netif_set_ipaddr lwip_netif_set_ipaddr
-#define netif_set_netmask lwip_netif_set_netmask
-#define netif_set_up lwip_netif_set_up
-#if MEM_LIBC_MALLOC == 0
-#define mem_free lwip_mem_free
-#define mem_init lwip_mem_init
-#define mem_malloc lwip_mem_malloc
-#define mem_realloc lwip_mem_realloc
-#endif
-#define memp_free lwip_memp_free
-#define memp_init lwip_memp_init
-#define memp_malloc lwip_memp_malloc
-#define pbuf_alloc lwip_pbuf_alloc
-#define pbuf_cat lwip_pbuf_cat
-#define pbuf_chain lwip_pbuf_chain
-#define pbuf_clen lwip_pbuf_clen
-#define pbuf_dechain lwip_pbuf_dechain
-#define pbuf_dequeue lwip_pbuf_dequeue
-#define pbuf_free lwip_pbuf_free
-#define pbuf_header lwip_pbuf_header
-#define pbuf_init lwip_pbuf_init
-#define pbuf_queue lwip_pbuf_queue
-#define pbuf_realloc lwip_pbuf_realloc
-#define pbuf_ref lwip_pbuf_ref
-#define pbuf_take lwip_pbuf_take
-#define raw_bind lwip_raw_bind
-#define raw_connect lwip_raw_connect
-#define raw_init lwip_raw_init
-#define raw_input lwip_raw_input
-#define raw_new lwip_raw_new
-#define raw_recv lwip_raw_recv
-#define raw_remove lwip_raw_remove
-#define raw_send lwip_raw_send
-#define raw_sendto lwip_raw_sendto
-#define stats_init lwip_stats_init
-#define sys_arch_mbox_fetch lwip_sys_arch_mbox_fetch
-#define sys_arch_protect lwip_sys_arch_protect
-#define sys_arch_sem_wait lwip_sys_arch_sem_wait
-#define sys_arch_timeouts lwip_sys_arch_timeouts
-#define sys_arch_unprotect lwip_sys_arch_unprotect
-#define sys_init lwip_sys_init
-#define sys_mbox_fetch lwip_sys_mbox_fetch
-#define sys_mbox_free lwip_sys_mbox_free
-#define sys_mbox_new lwip_sys_mbox_new
-#define sys_mbox_post lwip_sys_mbox_post
-#define sys_sem_free lwip_sys_sem_free
-#define sys_sem_new lwip_sys_sem_new
-#define sys_sem_signal lwip_sys_sem_signal
-#define sys_thread_new lwip_sys_thread_new
-#define sys_msleep lwip_sys_msleep
-#define sys_sem_wait lwip_sys_sem_wait
-#define sys_sem_wait_timeout lwip_sys_sem_wait_timeout
-#define sys_timeout lwip_sys_timeout
-#define sys_untimeout lwip_sys_untimeout
-#define tcp_abort lwip_tcp_abort
-#define tcp_accept lwip_tcp_accept
-#define tcp_active_pcbs lwip_tcp_active_pcbs
-#define tcp_alloc lwip_tcp_alloc
-#define tcp_arg lwip_tcp_arg
-#define tcp_backoff lwip_tcp_backoff
-#define tcp_bind lwip_tcp_bind
-#define tcp_close lwip_tcp_close
-#define tcp_connect lwip_tcp_connect
-#define tcp_enqueue lwip_tcp_enqueue
-#define tcp_err lwip_tcp_err
-#define tcp_fasttmr lwip_tcp_fasttmr
-#define tcp_init lwip_tcp_init
-#define tcp_input lwip_tcp_input
-#define tcp_input_pcb lwip_tcp_input_pcb
-#define tcp_keepalive lwip_tcp_keepalive
-#define tcp_listen lwip_tcp_listen
-#define tcp_listen_pcbs lwip_tcp_listen_pcbs
-#define tcp_new lwip_tcp_new
-#define tcp_next_iss lwip_tcp_next_iss
-#define tcp_output lwip_tcp_output
-#define tcp_pcb_purge lwip_tcp_pcb_purge
-#define tcp_pcb_remove lwip_tcp_pcb_remove
-#define tcp_poll lwip_tcp_poll
-#define tcp_recv lwip_tcp_recv
-#define tcp_recved lwip_tcp_recved
-#define tcp_rexmit lwip_tcp_rexmit
-#define tcp_rexmit_rto lwip_tcp_rexmit_rto
-#define tcp_rst lwip_tcp_rst
-#define tcp_seg_copy lwip_tcp_seg_copy
-#define tcp_seg_free lwip_tcp_seg_free
-#define tcp_segs_free lwip_tcp_segs_free
-#define tcp_send_ctrl lwip_tcp_send_ctrl
-#define tcp_sent lwip_tcp_sent
-#define tcp_setprio lwip_tcp_setprio
-#define tcp_slowtmr lwip_tcp_slowtmr
-#define tcp_ticks lwip_tcp_ticks
-#define tcp_timer_needed lwip_tcp_timer_needed
-#define tcp_tmp_pcb lwip_tcp_tmp_pcb
-#define tcp_tmr lwip_tcp_tmr
-#define tcp_tw_pcbs lwip_tcp_tw_pcbs
-#define tcp_write lwip_tcp_write
-#define tcpip_apimsg lwip_tcpip_apimsg
-#define tcpip_callback lwip_tcpip_callback
-#define tcpip_init lwip_tcpip_init
-#define tcpip_input lwip_tcpip_input
-#define udp_bind lwip_udp_bind
-#define udp_connect lwip_udp_connect
-#define udp_disconnect lwip_udp_disconnect
-#define udp_init lwip_udp_init
-#define udp_input lwip_udp_input
-#define udp_new lwip_udp_new
-#define udp_pcbs lwip_udp_pcbs
-#define udp_recv lwip_udp_recv
-#define udp_remove lwip_udp_remove
-#define udp_send lwip_udp_send
-#define udp_sendto lwip_udp_sendto
-
-#endif
diff --git a/src/VBox/Devices/Network/lwip/vbox/sys_arch.c b/src/VBox/Devices/Network/lwip/vbox/sys_arch.c
deleted file mode 100644
index 573b02c..0000000
--- a/src/VBox/Devices/Network/lwip/vbox/sys_arch.c
+++ /dev/null
@@ -1,445 +0,0 @@
-/** $Id: sys_arch.c $ */
-/** @file
- * System dependent parts of lwIP, implemented with IPRT.
- */
-
-/*
- * Copyright (C) 2007-2012 Oracle Corporation
- *
- * This file is part of VirtualBox Open Source Edition (OSE), as
- * available from http://www.virtualbox.org. This file is free software;
- * you can redistribute it and/or modify it under the terms of the GNU
- * General Public License (GPL) as published by the Free Software
- * Foundation, in version 2 as it comes in the "COPYING" file of the
- * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
- */
-
-
-#include <lwip/sys.h>
-
-#include <iprt/assert.h>
-#include <iprt/err.h>
-#include <iprt/mem.h>
-#include <iprt/string.h>
-#include <iprt/critsect.h>
-#include <iprt/thread.h>
-#include <iprt/time.h>
-
-/** @todo during my tests on Debian Lenny 64 bit I ran into trouble using
- * mutex semaphores (crash deep down in the pthreads lib). Using the write
- * case of rw semaphores also gives mutual exclusion, and didn't show those
- * crashes. Should be investigated, because this "fix" might be just covering
- * the symptoms of a bug elsewhere. */
-#if HC_ARCH_BITS == 64 && defined RT_ARCH_LINUX
-#define LWIPMUTEXTYPE RTSEMRW
-#define LWIPMutexCreate RTSemRWCreate
-#define LWIPMutexDestroy RTSemRWDestroy
-#define LWIPMutexRequest RTSemRWRequestWrite
-#define LWIPMutexRelease RTSemRWReleaseWrite
-#else
-#define LWIPMUTEXTYPE RTSEMMUTEX
-#define LWIPMutexCreate RTSemMutexCreate
-#define LWIPMutexDestroy RTSemMutexDestroy
-#define LWIPMutexRequest RTSemMutexRequest
-#define LWIPMutexRelease RTSemMutexRelease
-#endif
-
-/** Maximum number of threads lwIP is allowed to create. */
-#define THREADS_MAX 5
-
-/** Maximum number of mbox entries needed for reasonable performance. */
-#define MBOX_ENTRIES_MAX 128
-
-/** Data type for slots in TLS. */
-typedef struct
-{
- RTTHREAD tid;
- void (* thread)(void *arg);
- void *arg;
- struct sys_timeouts timeouts;
-} THREADLOCALSTORAGE;
-
-/** Actual declaration of the mbox type. */
-struct sys_mbox
-{
- LWIPMUTEXTYPE mutex;
- RTSEMEVENTMULTI nonempty, nonfull;
- void *apvEntries[MBOX_ENTRIES_MAX];
- u32_t head, tail;
-};
-
-#if SYS_LIGHTWEIGHT_PROT
-/** Critical section variable for short term synchronization. */
-static RTCRITSECT g_ProtCritSect;
-#else
-/** Synchronization for thread creation handling. */
-static RTSEMEVENT g_ThreadSem;
-#endif
-
-/** Number of threads currently created by lwIP. */
-static u32_t g_cThreads = 0;
-
-/** The simulated thread local storage for lwIP things. */
-static THREADLOCALSTORAGE g_aTLS[THREADS_MAX];
-
-/**
- * Initialize the port to IPRT.
- */
-void sys_init(void)
-{
- int rc;
- unsigned i;
-#if SYS_LIGHTWEIGHT_PROT
- rc = RTCritSectInit(&g_ProtCritSect);
- AssertRC(rc);
-#else
- rc = RTSemEventCreate(&g_ThreadSem);
- AssertRC(rc);
- rc = RTSemEventSignal(g_ThreadSem);
- AssertRC(rc);
-#endif
- for (i = 0; i < THREADS_MAX; i++)
- g_aTLS[i].tid = NIL_RTTHREAD;
-}
-
-/**
- * Create a new (binary) semaphore.
- */
-sys_sem_t sys_sem_new(u8_t count)
-{
- int rc;
- RTSEMEVENT sem;
-
- Assert(count <= 1);
- rc = RTSemEventCreate(&sem);
- AssertRC(rc);
- if (count == 1)
- {
- rc = RTSemEventSignal(sem);
- AssertRC(rc);
- }
- return sem;
-}
-
-/**
- * Destroy a (binary) semaphore.
- */
-void sys_sem_free(sys_sem_t sem)
-{
- int rc;
- rc = RTSemEventDestroy(sem);
- AssertRC(rc);
-}
-
-/**
- * Signal a (binary) semaphore.
- */
-void sys_sem_signal(sys_sem_t sem)
-{
- int rc;
- rc = RTSemEventSignal(sem);
- AssertRC(rc);
-}
-
-/**
- * Wait for a (binary) semaphore.
- */
-u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
-{
- int rc;
- RTMSINTERVAL cMillies;
- uint64_t tsStart, tsEnd;
-
- tsStart = RTTimeMilliTS();
- if (timeout == 0)
- cMillies = RT_INDEFINITE_WAIT;
- else
- cMillies = timeout;
- rc = RTSemEventWait(sem, cMillies);
- if (rc == VERR_TIMEOUT)
- return SYS_ARCH_TIMEOUT;
- AssertRC(rc);
- tsEnd = RTTimeMilliTS();
- return tsEnd - tsStart;
-}
-
-/**
- * Create new mbox.
- */
-sys_mbox_t sys_mbox_new(void)
-{
- int rc;
- struct sys_mbox *mbox;
-
- mbox = RTMemAllocZ(sizeof(*mbox));
- Assert(mbox != NULL);
- if (!mbox)
- return mbox;
- rc = LWIPMutexCreate(&mbox->mutex);
- AssertRC(rc);
- if (RT_FAILURE(rc))
- {
- RTMemFree(mbox);
- return NULL;
- }
- rc = RTSemEventMultiCreate(&mbox->nonempty);
- AssertRC(rc);
- if (RT_FAILURE(rc))
- {
- rc = LWIPMutexDestroy(mbox->mutex);
- AssertRC(rc);
- RTMemFree(mbox);
- return NULL;
- }
- rc = RTSemEventMultiCreate(&mbox->nonfull);
- AssertRC(rc);
- if (RT_FAILURE(rc))
- {
- rc = RTSemEventMultiDestroy(mbox->nonempty);
- AssertRC(rc);
- rc = LWIPMutexDestroy(mbox->mutex);
- AssertRC(rc);
- RTMemFree(mbox);
- return NULL;
- }
- return mbox;
-}
-
-/**
- * Free an mbox.
- */
-void sys_mbox_free(sys_mbox_t mbox)
-{
- Assert(mbox != NULL);
- LWIPMutexDestroy(mbox->mutex);
- RTSemEventMultiDestroy(mbox->nonempty);
- RTSemEventMultiDestroy(mbox->nonfull);
- RTMemFree(mbox);
-}
-
-/**
- * Place an entry in an mbox.
- */
-void sys_mbox_post(sys_mbox_t mbox, void *msg)
-{
- int rc;
-
- Assert(mbox != NULL);
- rc = LWIPMutexRequest(mbox->mutex, RT_INDEFINITE_WAIT);
- AssertRC(rc);
- while ((mbox->head + 1) % MBOX_ENTRIES_MAX == mbox->tail)
- {
- /* mbox is full, have to wait until a slot becomes available. */
- rc = LWIPMutexRelease(mbox->mutex);
- AssertRC(rc);
- rc = RTSemEventMultiWait(mbox->nonfull, RT_INDEFINITE_WAIT);
- AssertRC(rc);
- rc = LWIPMutexRequest(mbox->mutex, RT_INDEFINITE_WAIT);
- AssertRC(rc);
- }
- if (mbox->head == mbox->tail)
- {
- rc = RTSemEventMultiSignal(mbox->nonempty);
- AssertRC(rc);
- }
- mbox->apvEntries[mbox->head] = msg;
- mbox->head++;
- mbox->head %= MBOX_ENTRIES_MAX;
- if ((mbox->head + 1) % MBOX_ENTRIES_MAX == mbox->tail)
- {
- rc = RTSemEventMultiReset(mbox->nonfull);
- AssertRC(rc);
- }
- rc = LWIPMutexRelease(mbox->mutex);
- AssertRC(rc);
-}
-
-/**
- * Get an entry from an mbox.
- */
-u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
-{
- int rc;
- RTMSINTERVAL cMillies;
- uint64_t tsStart, tsEnd;
-
- Assert(mbox != NULL);
- tsStart = RTTimeMilliTS();
- if (timeout == 0)
- cMillies = RT_INDEFINITE_WAIT;
- else
- cMillies = timeout;
- rc = LWIPMutexRequest(mbox->mutex, cMillies);
- if (rc == VERR_TIMEOUT)
- return SYS_ARCH_TIMEOUT;
- AssertRC(rc);
- while (mbox->head == mbox->tail)
- {
- /* mbox is empty, have to wait until a slot is filled. */
- rc = LWIPMutexRelease(mbox->mutex);
- AssertRC(rc);
- if (timeout != 0)
- {
- tsEnd = RTTimeMilliTS();
- if (tsEnd - tsStart >= cMillies)
- return SYS_ARCH_TIMEOUT;
- cMillies -= tsEnd - tsStart;
- }
- rc = RTSemEventMultiWait(mbox->nonempty, cMillies);
- if (rc == VERR_TIMEOUT)
- return SYS_ARCH_TIMEOUT;
- AssertRC(rc);
- if (timeout != 0)
- {
- tsEnd = RTTimeMilliTS();
- if (tsEnd - tsStart >= cMillies)
- return SYS_ARCH_TIMEOUT;
- cMillies -= tsEnd - tsStart;
- }
- rc = LWIPMutexRequest(mbox->mutex, cMillies);
- if (rc == VERR_TIMEOUT)
- return SYS_ARCH_TIMEOUT;
- AssertRC(rc);
- }
- if ((mbox->head + 1) % MBOX_ENTRIES_MAX == mbox->tail)
- {
- rc = RTSemEventMultiSignal(mbox->nonfull);
- AssertRC(rc);
- }
- if (msg != NULL)
- *msg = mbox->apvEntries[mbox->tail];
- mbox->tail++;
- mbox->tail %= MBOX_ENTRIES_MAX;
- rc = RTSemEventMultiSignal(mbox->nonfull);
- if (mbox->head == mbox->tail)
- {
- rc = RTSemEventMultiReset(mbox->nonempty);
- AssertRC(rc);
- }
- rc = LWIPMutexRelease(mbox->mutex);
- AssertRC(rc);
- tsEnd = RTTimeMilliTS();
- return tsEnd - tsStart;
-}
-
-/**
- * Grab the pointer to this thread's timeouts from TLS.
- */
-struct sys_timeouts *sys_arch_timeouts(void)
-{
- unsigned i;
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_DECL_PROTECT(old_level);
-#endif
- RTTHREAD myself;
- struct sys_timeouts *to = NULL;
-
- myself = RTThreadSelf();
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_PROTECT(old_level);
-#else
- RTSemEventWait(g_ThreadSem, RT_INDEFINITE_WAIT);
-#endif
- for (i = 0; i < g_cThreads; i++)
- {
- if (g_aTLS[i].tid == myself)
- {
- to = &g_aTLS[i].timeouts;
- break;
- }
- }
- /* Auto-adopt new threads which use lwIP as they pop up. */
- if (!to)
- {
- unsigned id;
- id = g_cThreads;
- g_cThreads++;
- Assert(g_cThreads <= THREADS_MAX);
- g_aTLS[id].tid = myself;
- to = &g_aTLS[id].timeouts;
- }
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_UNPROTECT(old_level);
-#else
- RTSemEventSignal(g_ThreadSem);
-#endif
- return to;
-}
-
-/**
- * Internal: thread main function adapter, dropping the first parameter. Needed
- * to make lwip thread main function compatible with IPRT thread main function.
- */
-static int sys_thread_adapter(RTTHREAD ThreadSelf, void *pvUser)
-{
- THREADLOCALSTORAGE *tls = (THREADLOCALSTORAGE *)pvUser;
- tls->thread(tls->arg);
- return 0;
-}
-
-/**
- * Create new thread.
- */
-sys_thread_t sys_thread_new(void (* thread)(void *arg), void *arg, int prio)
-{
- int rc;
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_DECL_PROTECT(old_level);
-#endif
- unsigned id;
- RTTHREAD tid;
-
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_PROTECT(old_level);
-#else
- RTSemEventWait(g_ThreadSem, RT_INDEFINITE_WAIT);
-#endif
- id = g_cThreads;
- g_cThreads++;
- Assert(g_cThreads <= THREADS_MAX);
- g_aTLS[id].thread = thread;
- g_aTLS[id].arg = arg;
- rc = RTThreadCreateF(&tid, sys_thread_adapter, &g_aTLS[id], 0,
- RTTHREADTYPE_IO, 0, "lwIP%u", id);
- if (RT_FAILURE(rc))
- {
- g_cThreads--;
- tid = NIL_RTTHREAD;
- }
- else
- g_aTLS[id].tid = tid;
-#if SYS_LIGHTWEIGHT_PROT
- SYS_ARCH_UNPROTECT(old_level);
-#else
- RTSemEventSignal(g_ThreadSem);
-#endif
- AssertRC(rc);
- return tid;
-}
-
-#if SYS_LIGHTWEIGHT_PROT
-/**
- * Start a short critical section.
- */
-sys_prot_t sys_arch_protect(void)
-{
- int rc;
- rc = RTCritSectEnter(&g_ProtCritSect);
- AssertRC(rc);
- return NULL;
-}
-#endif
-
-#if SYS_LIGHTWEIGHT_PROT
-/**
- * End a short critical section.
- */
-void sys_arch_unprotect(sys_prot_t pval)
-{
- int rc;
- (void)pval;
- rc = RTCritSectLeave(&g_ProtCritSect);
- AssertRC(rc);
-}
-#endif
diff --git a/src/VBox/Devices/Network/slirp/libalias/alias_dns.c b/src/VBox/Devices/Network/slirp/libalias/alias_dns.c
index d451d9c..eb213f9 100644
--- a/src/VBox/Devices/Network/slirp/libalias/alias_dns.c
+++ b/src/VBox/Devices/Network/slirp/libalias/alias_dns.c
@@ -250,7 +250,6 @@ protohandler(struct libalias *la, struct ip *pIp, struct alias_data *ah)
&& !LIST_EMPTY(&la->pData->DNSMapHead))
alterHostentWithDataFromDNSMap(la->pData, pHostent);
#endif
- fprintf(stderr, "pszCname:%s\n", pszCname);
doanswer(pHdr, meta, qw_qname, pIp, pHostent);
}
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
index febccb0..2f4e68c 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.asm
@@ -983,7 +983,7 @@ section CONST progbits vstart=0xb0 align=1 ; size=0xce0 class=DATA group=DGROUP
section CONST2 progbits vstart=0xd90 align=1 ; size=0x400 class=DATA group=DGROUP
_bios_cvs_version_string: ; 0xf0d90 LB 0x18
- db 'VirtualBox 5.0.0_BETA2', 000h, 000h
+ db 'VirtualBox 5.0.0_BETA3', 000h, 000h
_bios_prefix_string: ; 0xf0da8 LB 0x8
db 'BIOS: ', 000h, 000h
_isotag: ; 0xf0db0 LB 0x6
@@ -16348,4 +16348,4 @@ dummy_iret: ; 0xfff53 LB 0x9d
db 'XM'
cpu_reset: ; 0xffff0 LB 0x10
jmp far 0f000h:0e05bh ; ea 5b e0 00 f0
- db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 03eh
+ db 030h, 036h, 02fh, 032h, 033h, 02fh, 039h, 039h, 000h, 0fch, 03dh
diff --git a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
index 11364c2..c72f06d 100644
--- a/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
+++ b/src/VBox/Devices/PC/BIOS/VBoxBiosAlternative.md5sum
@@ -1 +1 @@
-dada536c6edc89409a8ebf3822aedeb9 *VBoxPcBios.rom
+003f27adc76ad5bd0a18ee4c57ced666 *VBoxPcBios.rom
diff --git a/src/VBox/Devices/Storage/DevAHCI.cpp b/src/VBox/Devices/Storage/DevAHCI.cpp
index d4a9080..1baf315 100644
--- a/src/VBox/Devices/Storage/DevAHCI.cpp
+++ b/src/VBox/Devices/Storage/DevAHCI.cpp
@@ -6474,7 +6474,7 @@ static AHCITXDIR ahciProcessCmd(PAHCIPort pAhciPort, PAHCIREQ pAhciReq, uint8_t
pAhciReq->uATARegStatus = ATA_STAT_READY | ATA_STAT_ERR;
break;
default: /* For debugging purposes. */
- AssertMsgFailed(("Unknown command issued\n"));
+ AssertMsgFailed(("Unknown command issued (%#x)\n", pCmdFis[AHCI_CMDFIS_CMD]));
pAhciReq->uATARegError = ABRT_ERR;
pAhciReq->uATARegStatus = ATA_STAT_READY | ATA_STAT_ERR;
}
diff --git a/src/VBox/Devices/Storage/DevFdc.cpp b/src/VBox/Devices/Storage/DevFdc.cpp
index 01f10d2..6579f7e 100644
--- a/src/VBox/Devices/Storage/DevFdc.cpp
+++ b/src/VBox/Devices/Storage/DevFdc.cpp
@@ -248,6 +248,7 @@ static int fd_sector(fdrive_t *drv)
* returns 2 if track is invalid
* returns 3 if sector is invalid
* returns 4 if seek is disabled
+ * returns 5 if no media in drive
*/
static int fd_seek(fdrive_t *drv, uint8_t head, uint8_t track, uint8_t sect,
int enable_seek)
@@ -255,6 +256,12 @@ static int fd_seek(fdrive_t *drv, uint8_t head, uint8_t track, uint8_t sect,
int sector;
int ret;
+ if (!drv->last_sect) {
+ FLOPPY_DPRINTF("no disk in drive (max=%d %d %02x %02x)\n",
+ 1, (drv->flags & FDISK_DBL_SIDES) == 0 ? 0 : 1,
+ drv->max_track, drv->last_sect);
+ return 5;
+ }
if (track > drv->max_track ||
(head != 0 && (drv->flags & FDISK_DBL_SIDES) == 0)) {
FLOPPY_DPRINTF("try to read %d %02x %02x (max=%d %d %02x %02x)\n",
@@ -341,6 +348,7 @@ static fd_format_t fd_formats[] = {
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 14, 80, 1, FDRIVE_RATE_250K, "1.12 MB 3\"1/2", },
/* 1.2 MB 5"1/4 floppy disks */
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 15, 80, 1, FDRIVE_RATE_500K, "1.2 MB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 16, 80, 1, FDRIVE_RATE_500K, "1.28 MB 5\"1/4", }, /* CP Backup 5.25" HD */
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 80, 1, FDRIVE_RATE_500K, "1.44 MB 5\"1/4", },
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 82, 1, FDRIVE_RATE_500K, "1.48 MB 5\"1/4", },
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 18, 83, 1, FDRIVE_RATE_500K, "1.49 MB 5\"1/4", },
@@ -351,63 +359,66 @@ static fd_format_t fd_formats[] = {
/* 360 kB 5"1/4 floppy disks (newer 9-sector formats) */
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 40, 1, FDRIVE_RATE_300K, "360 kB 5\"1/4", },
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 9, 40, 0, FDRIVE_RATE_300K, "180 kB 5\"1/4", },
+ { FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 40, 1, FDRIVE_RATE_300K, "400 kB 5\"1/4", }, /* CP Backup 5.25" DD */
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 41, 1, FDRIVE_RATE_300K, "410 kB 5\"1/4", },
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 10, 42, 1, FDRIVE_RATE_300K, "420 kB 5\"1/4", },
/* 320 kB 5"1/4 floppy disks (old 8-sector formats) */
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 8, 40, 1, FDRIVE_RATE_300K, "320 kB 5\"1/4", },
{ FDRIVE_DRV_120, FDRIVE_DISK_288, 8, 40, 0, FDRIVE_RATE_300K, "160 kB 5\"1/4", },
/* 1.2 MB and low density 3"1/2 floppy 'aliases' */
- { FDRIVE_DRV_144, FDRIVE_DISK_144, 15, 80, 1, FDRIVE_RATE_500K, " 1.2 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 15, 80, 1, FDRIVE_RATE_500K, "1.2 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_144, 16, 80, 1, FDRIVE_RATE_500K, "1.28 MB 3\"1/2", },
+ { FDRIVE_DRV_144, FDRIVE_DISK_720, 10, 40, 1, FDRIVE_RATE_300K, "400 kB 3\"1/2", }, /* CP Backup 5.25" DD */
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 9, 40, 1, FDRIVE_RATE_300K, "360 kB 3\"1/2", },
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 9, 40, 0, FDRIVE_RATE_300K, "180 kB 3\"1/2", },
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 8, 40, 1, FDRIVE_RATE_300K, "320 kB 3\"1/2", },
{ FDRIVE_DRV_144, FDRIVE_DISK_720, 8, 40, 0, FDRIVE_RATE_300K, "160 kB 3\"1/2", },
#ifdef VBOX /* For larger than real life floppy images (see DrvBlock.cpp). */
/* 15.6 MB fake floppy disk (just need something big). */
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_USER, 63, 255, 1, FDRIVE_RATE_1M, "15.6 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 36, 80, 1, FDRIVE_RATE_1M, "2.88 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 39, 80, 1, FDRIVE_RATE_1M, "3.12 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 40, 80, 1, FDRIVE_RATE_1M, "3.2 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 44, 80, 1, FDRIVE_RATE_1M, "3.52 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 48, 80, 1, FDRIVE_RATE_1M, "3.84 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 18, 80, 1, FDRIVE_RATE_500K, "1.44 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 20, 80, 1, FDRIVE_RATE_500K, "1.6 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 21, 80, 1, FDRIVE_RATE_500K, "1.68 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 21, 82, 1, FDRIVE_RATE_500K, "1.72 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 21, 83, 1, FDRIVE_RATE_500K, "1.74 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 22, 80, 1, FDRIVE_RATE_500K, "1.76 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 23, 80, 1, FDRIVE_RATE_500K, "1.84 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 24, 80, 1, FDRIVE_RATE_500K, "1.92 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 9, 80, 1, FDRIVE_RATE_250K, "720 kB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 10, 80, 1, FDRIVE_RATE_250K, "800 kB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 10, 82, 1, FDRIVE_RATE_250K, "820 kB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 10, 83, 1, FDRIVE_RATE_250K, "830 kB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 13, 80, 1, FDRIVE_RATE_250K, "1.04 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 14, 80, 1, FDRIVE_RATE_250K, "1.12 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 9, 80, 0, FDRIVE_RATE_250K, "360 kB 3\"1/2", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_USER, 63, 255, 1, FDRIVE_RATE_1M, "15.6 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 36, 80, 1, FDRIVE_RATE_1M, "2.88 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 39, 80, 1, FDRIVE_RATE_1M, "3.12 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 40, 80, 1, FDRIVE_RATE_1M, "3.2 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 44, 80, 1, FDRIVE_RATE_1M, "3.52 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_288, 48, 80, 1, FDRIVE_RATE_1M, "3.84 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 18, 80, 1, FDRIVE_RATE_500K, "1.44 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 20, 80, 1, FDRIVE_RATE_500K, "1.6 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 21, 80, 1, FDRIVE_RATE_500K, "1.68 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 21, 82, 1, FDRIVE_RATE_500K, "1.72 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 21, 83, 1, FDRIVE_RATE_500K, "1.74 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 22, 80, 1, FDRIVE_RATE_500K, "1.76 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 23, 80, 1, FDRIVE_RATE_500K, "1.84 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_144, 24, 80, 1, FDRIVE_RATE_500K, "1.92 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 9, 80, 1, FDRIVE_RATE_250K, "720 kB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 10, 80, 1, FDRIVE_RATE_250K, "800 kB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 10, 82, 1, FDRIVE_RATE_250K, "820 kB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 10, 83, 1, FDRIVE_RATE_250K, "830 kB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 13, 80, 1, FDRIVE_RATE_250K, "1.04 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 14, 80, 1, FDRIVE_RATE_250K, "1.12 MB fake 15.6", },
+ { FDRIVE_DRV_FAKE_15_6, FDRIVE_DISK_720, 9, 80, 0, FDRIVE_RATE_250K, "360 kB fake 15.6", },
/* 63.5 MB fake floppy disk (just need something big). */
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_USER, 255, 255, 1, FDRIVE_RATE_1M, "63.5 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_USER, 63, 255, 1, FDRIVE_RATE_1M, "15.6 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 36, 80, 1, FDRIVE_RATE_1M, "2.88 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 39, 80, 1, FDRIVE_RATE_1M, "3.12 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 40, 80, 1, FDRIVE_RATE_1M, "3.2 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 44, 80, 1, FDRIVE_RATE_1M, "3.52 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 48, 80, 1, FDRIVE_RATE_1M, "3.84 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 18, 80, 1, FDRIVE_RATE_500K, "1.44 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 20, 80, 1, FDRIVE_RATE_500K, "1.6 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 21, 80, 1, FDRIVE_RATE_500K, "1.68 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 21, 82, 1, FDRIVE_RATE_500K, "1.72 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 21, 83, 1, FDRIVE_RATE_500K, "1.74 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 22, 80, 1, FDRIVE_RATE_500K, "1.76 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 23, 80, 1, FDRIVE_RATE_500K, "1.84 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 24, 80, 1, FDRIVE_RATE_500K, "1.92 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 9, 80, 1, FDRIVE_RATE_250K, "720 kB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 10, 80, 1, FDRIVE_RATE_250K, "800 kB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 10, 82, 1, FDRIVE_RATE_250K, "820 kB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 10, 83, 1, FDRIVE_RATE_250K, "830 kB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 13, 80, 1, FDRIVE_RATE_250K, "1.04 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 14, 80, 1, FDRIVE_RATE_250K, "1.12 MB 3\"1/2", },
- { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 9, 80, 0, FDRIVE_RATE_250K, "360 kB 3\"1/2", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_USER, 255, 255, 1, FDRIVE_RATE_1M, "63.5 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_USER, 63, 255, 1, FDRIVE_RATE_1M, "15.6 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 36, 80, 1, FDRIVE_RATE_1M, "2.88 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 39, 80, 1, FDRIVE_RATE_1M, "3.12 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 40, 80, 1, FDRIVE_RATE_1M, "3.2 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 44, 80, 1, FDRIVE_RATE_1M, "3.52 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_288, 48, 80, 1, FDRIVE_RATE_1M, "3.84 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 18, 80, 1, FDRIVE_RATE_500K, "1.44 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 20, 80, 1, FDRIVE_RATE_500K, "1.6 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 21, 80, 1, FDRIVE_RATE_500K, "1.68 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 21, 82, 1, FDRIVE_RATE_500K, "1.72 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 21, 83, 1, FDRIVE_RATE_500K, "1.74 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 22, 80, 1, FDRIVE_RATE_500K, "1.76 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 23, 80, 1, FDRIVE_RATE_500K, "1.84 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_144, 24, 80, 1, FDRIVE_RATE_500K, "1.92 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 9, 80, 1, FDRIVE_RATE_250K, "720 kB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 10, 80, 1, FDRIVE_RATE_250K, "800 kB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 10, 82, 1, FDRIVE_RATE_250K, "820 kB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 10, 83, 1, FDRIVE_RATE_250K, "830 kB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 13, 80, 1, FDRIVE_RATE_250K, "1.04 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 14, 80, 1, FDRIVE_RATE_250K, "1.12 MB fake 63.5", },
+ { FDRIVE_DRV_FAKE_63_5, FDRIVE_DISK_720, 9, 80, 0, FDRIVE_RATE_250K, "360 kB fake 63.5", },
#endif
/* end */
{ FDRIVE_DRV_NONE, FDRIVE_DISK_NONE, (uint8_t)-1, (uint8_t)-1, 0, (fdrive_rate_t)0, NULL, },
@@ -1263,6 +1274,14 @@ static void fdctrl_start_transfer(fdctrl_t *fdctrl, int direction)
fdctrl->fifo[4] = kh;
fdctrl->fifo[5] = ks;
return;
+ case 5:
+ /* No disk in drive */
+ ///@todo: This is wrong! Command should not complete.
+ fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM | 0x08, /*FD_SR1_MA |*/ FD_SR1_ND, 0x00);
+ fdctrl->fifo[3] = kt;
+ fdctrl->fifo[4] = kh;
+ fdctrl->fifo[5] = ks;
+ return;
case 1:
did_seek = 1;
break;
@@ -1388,6 +1407,13 @@ static void fdctrl_start_format(fdctrl_t *fdctrl)
fdctrl->fifo[4] = kh;
fdctrl->fifo[5] = ks;
return;
+ case 5:
+ /* No disk in drive */
+ fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM, FD_SR1_MA, 0x00);
+ fdctrl->fifo[3] = kt;
+ fdctrl->fifo[4] = kh;
+ fdctrl->fifo[5] = ks;
+ return;
case 1:
break;
default:
@@ -1740,9 +1766,8 @@ static uint32_t fdctrl_read_data(fdctrl_t *fdctrl)
FLOPPY_ERROR("controller not ready for reading\n");
return 0;
}
- pos = fdctrl->data_pos;
+ pos = fdctrl->data_pos % FD_SECTOR_LEN;
if (fdctrl->msr & FD_MSR_NONDMA) {
- pos %= FD_SECTOR_LEN;
if (pos == 0) {
if (fdctrl->data_pos != 0)
if (!fdctrl_seek_to_next_sect(fdctrl, cur_drv)) {
@@ -1820,6 +1845,13 @@ static void fdctrl_format_sector(fdctrl_t *fdctrl)
fdctrl->fifo[4] = kh;
fdctrl->fifo[5] = ks;
return;
+ case 5:
+ /* No disk in drive */
+ fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM, FD_SR1_MA, 0x00);
+ fdctrl->fifo[3] = kt;
+ fdctrl->fifo[4] = kh;
+ fdctrl->fifo[5] = ks;
+ return;
case 1:
fdctrl->data_state |= FD_STATE_SEEK;
break;
@@ -1964,7 +1996,7 @@ static void fdctrl_handle_readid(fdctrl_t *fdctrl, int direction)
FLOPPY_DPRINTF("CMD:%02x SEL:%02x\n", fdctrl->fifo[0], fdctrl->fifo[1]);
- /* XXX: should set main status register to busy */
+ fdctrl->msr &= ~FD_MSR_RQM;
cur_drv->head = (fdctrl->fifo[1] >> 2) & 1;
#ifdef VBOX
TMTimerSetMillies(fdctrl->result_timer, 1000 / 50);
@@ -2284,7 +2316,7 @@ static void fdctrl_write_data(fdctrl_t *fdctrl, uint32_t value)
}
FLOPPY_DPRINTF("%s: %02x\n", __FUNCTION__, value);
- fdctrl->fifo[fdctrl->data_pos++] = value;
+ fdctrl->fifo[fdctrl->data_pos++ % FD_SECTOR_LEN] = value;
if (fdctrl->data_pos == fdctrl->data_len) {
/* We now have all parameters
* and will be able to treat the command
@@ -2316,6 +2348,7 @@ static void fdctrl_result_timer(void *opaque)
#ifdef VBOX
if (!cur_drv->max_track) {
FLOPPY_DPRINTF("read id when no disk in drive\n");
+ ///@todo: This is wrong! Command should not complete.
fdctrl_stop_transfer(fdctrl, FD_SR0_ABNTERM, FD_SR1_MA | FD_SR1_ND, FD_SR2_MD);
} else if ((fdctrl->dsr & FD_DSR_DRATEMASK) != cur_drv->media_rate) {
FLOPPY_DPRINTF("read id rate mismatch (fdc=%d, media=%d)\n",
diff --git a/src/VBox/Devices/Storage/DrvHostFloppy.cpp b/src/VBox/Devices/Storage/DrvHostFloppy.cpp
index ba53e80..2a23e87 100644
--- a/src/VBox/Devices/Storage/DrvHostFloppy.cpp
+++ b/src/VBox/Devices/Storage/DrvHostFloppy.cpp
@@ -1,3 +1,4 @@
+/* $Id: DrvHostFloppy.cpp $ */
/** @file
*
* VBox storage devices:
diff --git a/src/VBox/Devices/Storage/DrvVD.cpp b/src/VBox/Devices/Storage/DrvVD.cpp
index db3918b..93882cc 100644
--- a/src/VBox/Devices/Storage/DrvVD.cpp
+++ b/src/VBox/Devices/Storage/DrvVD.cpp
@@ -45,7 +45,7 @@ RT_C_DECLS_BEGIN
#include <lwip/inet.h>
#include <lwip/tcp.h>
#include <lwip/sockets.h>
-# ifdef VBOX_WITH_NEW_LWIP
+# if LWIP_IPV6
# include <lwip/inet6.h>
# endif
RT_C_DECLS_END
@@ -165,7 +165,7 @@ typedef struct VBOXDISK
/** Flag whether boot acceleration is currently active. */
bool fBootAccelActive;
/** Size of the disk, used for read truncation. */
- size_t cbDisk;
+ uint64_t cbDisk;
/** Size of the configured buffer. */
size_t cbBootAccelBuffer;
/** Start offset for which the buffer holds data. */
@@ -710,7 +710,7 @@ typedef union INIPSOCKADDRUNION
{
struct sockaddr Addr;
struct sockaddr_in Ipv4;
-#ifdef VBOX_WITH_NEW_LWIP
+#if LWIP_IPV6
struct sockaddr_in6 Ipv6;
#endif
} INIPSOCKADDRUNION;
@@ -762,7 +762,7 @@ static DECLCALLBACK(int) drvvdINIPClientConnect(VDSOCKET Sock, const char *pszAd
PINIPSOCKET pSocketInt = (PINIPSOCKET)Sock;
int iInetFamily = PF_INET;
struct in_addr ip;
-#ifdef VBOX_WITH_NEW_LWIP
+#if LWIP_IPV6
ip6_addr_t ip6;
#endif
@@ -776,7 +776,7 @@ static DECLCALLBACK(int) drvvdINIPClientConnect(VDSOCKET Sock, const char *pszAd
}
/* Resolve hostname. As there is no standard resolver for lwIP yet,
* just accept numeric IP addresses for now. */
-#ifdef VBOX_WITH_NEW_LWIP
+#if LWIP_IPV6
if (inet6_aton(pszAddress, &ip6))
iInetFamily = PF_INET6;
else /* concatination with if */
@@ -800,7 +800,7 @@ static DECLCALLBACK(int) drvvdINIPClientConnect(VDSOCKET Sock, const char *pszAd
InAddr.sin_len = sizeof(InAddr);
pSockAddr = (struct sockaddr *)&InAddr;
}
-#ifdef VBOX_WITH_NEW_LWIP
+#if LWIP_IPV6
else
{
struct sockaddr_in6 In6Addr = {0};
@@ -1006,7 +1006,7 @@ static DECLCALLBACK(int) drvvdINIPGetLocalAddress(VDSOCKET Sock, PRTNETADDR pAdd
pAddr->uPort = RT_N2H_U16(u.Ipv4.sin_port);
pAddr->uAddr.IPv4.u = u.Ipv4.sin_addr.s_addr;
}
-#ifdef VBOX_WITH_NEW_LWIP
+#if LWIP_IPV6
else if ( cbAddr == sizeof(struct sockaddr_in6)
&& u.Addr.sa_family == AF_INET6)
{
@@ -1043,7 +1043,7 @@ static DECLCALLBACK(int) drvvdINIPGetPeerAddress(VDSOCKET Sock, PRTNETADDR pAddr
pAddr->uPort = RT_N2H_U16(u.Ipv4.sin_port);
pAddr->uAddr.IPv4.u = u.Ipv4.sin_addr.s_addr;
}
-#ifdef VBOX_WITH_NEW_LWIP
+#if LWIP_IPV6
else if ( cbAddr == sizeof(struct sockaddr_in6)
&& u.Addr.sa_family == AF_INET6)
{
@@ -3109,7 +3109,7 @@ static DECLCALLBACK(int) drvvdConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, uint
{
rc = PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS,
N_("Failed to open image '%s' in %s mode"), pszName,
- (uOpenFlags & VD_OPEN_FLAGS_READONLY) ? "read-only" : "read-write", rc);
+ (uOpenFlags & VD_OPEN_FLAGS_READONLY) ? "read-only" : "read-write");
break;
}
diff --git a/src/VBox/Devices/Storage/PIIX3ATABmDma.h b/src/VBox/Devices/Storage/PIIX3ATABmDma.h
index af7059a..6565441 100644
--- a/src/VBox/Devices/Storage/PIIX3ATABmDma.h
+++ b/src/VBox/Devices/Storage/PIIX3ATABmDma.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
*
* VBox storage devices:
diff --git a/src/VBox/Devices/Storage/UsbMsd.cpp b/src/VBox/Devices/Storage/UsbMsd.cpp
index ac1c61b..c9ba11a 100644
--- a/src/VBox/Devices/Storage/UsbMsd.cpp
+++ b/src/VBox/Devices/Storage/UsbMsd.cpp
@@ -2021,7 +2021,7 @@ static DECLCALLBACK(PCPDMUSBDESCCACHE) usbMsdUsbGetDescriptorCache(PPDMUSBINS pU
LogFlow(("usbMsdUsbGetDescriptorCache/#%u:\n", pUsbIns->iInstance));
if (pThis->pUsbIns->enmSpeed == VUSB_SPEED_SUPER)
return &g_UsbMsdDescCacheSS;
- else if (pThis->pUsbIns->enmSpeed == VUSB_SPEED_SUPER)
+ else if (pThis->pUsbIns->enmSpeed == VUSB_SPEED_HIGH)
return &g_UsbMsdDescCacheHS;
else
return &g_UsbMsdDescCacheFS;
diff --git a/src/VBox/Devices/Storage/swab.h b/src/VBox/Devices/Storage/swab.h
index 32c80a2..b61e9f2 100644
--- a/src/VBox/Devices/Storage/swab.h
+++ b/src/VBox/Devices/Storage/swab.h
@@ -1,3 +1,4 @@
+/* $Id: swab.h $ */
/** @file
*
* VBox storage devices:
diff --git a/src/VBox/Devices/USB/DevOHCI.cpp b/src/VBox/Devices/USB/DevOHCI.cpp
index f31e4d6..df8b2ca 100644
--- a/src/VBox/Devices/USB/DevOHCI.cpp
+++ b/src/VBox/Devices/USB/DevOHCI.cpp
@@ -2763,7 +2763,9 @@ static bool ohciServiceTd(POHCI pThis, VUSBXFERTYPE enmType, PCOHCIED pEd, uint3
Log(("%s: ohciServiceTd: submitting TdAddr=%#010x EdAddr=%#010x cbData=%#x\n",
pUrb->pszDesc, TdAddr, EdAddr, pUrb->cbData));
+ RTCritSectLeave(&pThis->CritSect);
int rc = VUSBIRhSubmitUrb(pThis->RootHub.pIRhConn, pUrb, &pThis->RootHub.Led);
+ RTCritSectEnter(&pThis->CritSect);
if (RT_SUCCESS(rc))
return true;
@@ -2927,7 +2929,9 @@ static bool ohciServiceTdMultiple(POHCI pThis, VUSBXFERTYPE enmType, PCOHCIED pE
ohci_in_flight_add_urb(pThis, pUrb);
Log(("%s: ohciServiceTdMultiple: submitting cbData=%#x EdAddr=%#010x cTds=%d TdAddr0=%#010x\n",
pUrb->pszDesc, pUrb->cbData, EdAddr, cTds, TdAddr));
+ RTCritSectLeave(&pThis->CritSect);
int rc = VUSBIRhSubmitUrb(pThis->RootHub.pIRhConn, pUrb, &pThis->RootHub.Led);
+ RTCritSectEnter(&pThis->CritSect);
if (RT_SUCCESS(rc))
return true;
@@ -3151,7 +3155,9 @@ static bool ohciServiceIsochronousTd(POHCI pThis, POHCIITD pITd, uint32_t ITdAdd
ohci_in_flight_add_urb(pThis, pUrb);
Log(("%s: ohciServiceIsochronousTd: submitting cbData=%#x cIsocPkts=%d EdAddr=%#010x TdAddr=%#010x SF=%#x (%#x)\n",
pUrb->pszDesc, pUrb->cbData, pUrb->cIsocPkts, EdAddr, ITdAddr, pITd->HwInfo & ITD_HWINFO_SF, pThis->HcFmNumber));
+ RTCritSectLeave(&pThis->CritSect);
int rc = VUSBIRhSubmitUrb(pThis->RootHub.pIRhConn, pUrb, &pThis->RootHub.Led);
+ RTCritSectEnter(&pThis->CritSect);
if (RT_SUCCESS(rc))
return true;
diff --git a/src/VBox/Devices/USB/VUSBDevice.cpp b/src/VBox/Devices/USB/VUSBDevice.cpp
index fa39f43..ac2d53f 100644
--- a/src/VBox/Devices/USB/VUSBDevice.cpp
+++ b/src/VBox/Devices/USB/VUSBDevice.cpp
@@ -1046,6 +1046,7 @@ static DECLCALLBACK(int) vusbDevCancelAllUrbsWorker(PVUSBDEV pDev, bool fDetachi
/*
* Iterate the URBs and cancel them.
*/
+ RTCritSectEnter(&pDev->CritSectAsyncUrbs);
PVUSBURB pUrb = pDev->pAsyncUrbHead;
while (pUrb)
{
@@ -1118,7 +1119,7 @@ static DECLCALLBACK(int) vusbDevCancelAllUrbsWorker(PVUSBDEV pDev, bool fDetachi
pUrb = pNext;
}
}
-
+ RTCritSectLeave(&pDev->CritSectAsyncUrbs);
return VINF_SUCCESS;
}
diff --git a/src/VBox/Devices/VMMDev/VMMDev.cpp b/src/VBox/Devices/VMMDev/VMMDev.cpp
index 683776c..42e1c84 100644
--- a/src/VBox/Devices/VMMDev/VMMDev.cpp
+++ b/src/VBox/Devices/VMMDev/VMMDev.cpp
@@ -408,7 +408,7 @@ static DECLCALLBACK(void) vmmDevHeartBeatCheckTimer(PPDMDEVINS pDevIns, PTMTIMER
uint64_t uIntervalNs = TMTimerGetNano(pTimer) - pThis->uLastHBTime;
if (!pThis->fHasMissedHB && uIntervalNs >= pThis->u64HeartbeatInterval)
{
- LogRel(("VMMDev: HeartBeatCheckTimer: Guest seems to be unresponsive. Last heartbeat received %RU64 sec ago\n",
+ LogRel(("VMMDev: HeartBeatCheckTimer: Guest seems to be unresponsive. Last heartbeat received %RU64 seconds ago\n",
uIntervalNs / RT_NS_1SEC_64));
ASMAtomicWriteBool(&pThis->fHasMissedHB, true);
}
@@ -439,11 +439,8 @@ static int vmmDevReqHandler_HeartbeatConfigure(PVMMDEV pThis, VMMDevRequestHeade
/* set first timer explicitly */
rc = vmmDevHeartbeatTimerReset(pThis);
if (RT_SUCCESS(rc))
- {
- /** @todo r=ramshankar: Why are we using 500000000 here? The comment in
- * u64HeartbeatInterval doesn't indicate anything special. */
- LogRel(("VMMDev: Heartbeat checking timer set to trigger every %RU64 sec\n", pThis->u64HeartbeatInterval / 500000000));
- }
+ LogRel(("VMMDev: Heartbeat checking timer set to trigger every %RU64 milliseconds\n",
+ pThis->u64HeartbeatTimeout / RT_NS_1MS));
else
LogRel(("VMMDev: Cannot create heartbeat check timer, rc=%Rrc\n", rc));
}
@@ -3873,6 +3870,8 @@ static DECLCALLBACK(int) vmmdevConstruct(PPDMDEVINS pDevIns, int iInstance, PCFG
"GuestCoreDumpEnabled|"
"GuestCoreDumpDir|"
"GuestCoreDumpCount|"
+ "HeartbeatInterval|"
+ "HeartbeatTimeout|"
"TestingEnabled|"
"TestingMMIO|"
"TestintXmlOutputFile"
@@ -3932,11 +3931,17 @@ static DECLCALLBACK(int) vmmdevConstruct(PPDMDEVINS pDevIns, int iInstance, PCFG
if (RT_FAILURE(rc))
return PDMDEV_SET_ERROR(pDevIns, rc,
N_("Configuration error: Failed querying \"HeartbeatInterval\" as a 64-bit unsigned integer"));
+ if (pThis->u64HeartbeatInterval < RT_NS_100MS/2)
+ return PDMDEV_SET_ERROR(pDevIns, rc,
+ N_("Configuration error: Heartbeat interval \"HeartbeatInterval\" too small"));
rc = CFGMR3QueryU64Def(pCfg, "HeartbeatTimeout", &pThis->u64HeartbeatTimeout, pThis->u64HeartbeatInterval * 2);
if (RT_FAILURE(rc))
return PDMDEV_SET_ERROR(pDevIns, rc,
N_("Configuration error: Failed querying \"HeartbeatTimeout\" as a 64-bit unsigned integer"));
+ if (pThis->u64HeartbeatTimeout < RT_NS_100MS)
+ return PDMDEV_SET_ERROR(pDevIns, rc,
+ N_("Configuration error: Heartbeat timeout timer interval \"HeartbeatTimeout\" too small"));
#ifndef VBOX_WITHOUT_TESTING_FEATURES
rc = CFGMR3QueryBoolDef(pCfg, "TestingEnabled", &pThis->fTestingEnabled, false);
diff --git a/src/VBox/Disassembler/DisasmFormatYasm.cpp b/src/VBox/Disassembler/DisasmFormatYasm.cpp
index e8abc50..e0e9f38 100644
--- a/src/VBox/Disassembler/DisasmFormatYasm.cpp
+++ b/src/VBox/Disassembler/DisasmFormatYasm.cpp
@@ -873,30 +873,46 @@ DISDECL(size_t) DISFormatYasmEx(PCDISSTATE pDis, char *pszBuf, size_t cchBuf, ui
off2 = 0;
}
- if (fBase || (fUse & DISUSE_INDEX))
+ int64_t off3 = off2;
+ if (fBase || (fUse & (DISUSE_INDEX | DISUSE_RIPDISPLACEMENT32)))
{
- PUT_C(off2 >= 0 ? '+' : '-');
- if (off2 < 0)
- off2 = -off2;
+ PUT_C(off3 >= 0 ? '+' : '-');
+ if (off3 < 0)
+ off3 = -off3;
}
if (fUse & DISUSE_DISPLACEMENT8)
- PUT_NUM_8( off2);
+ PUT_NUM_8( off3);
else if (fUse & DISUSE_DISPLACEMENT16)
- PUT_NUM_16(off2);
+ PUT_NUM_16(off3);
else if (fUse & DISUSE_DISPLACEMENT32)
- PUT_NUM_32(off2);
+ PUT_NUM_32(off3);
else if (fUse & DISUSE_DISPLACEMENT64)
- PUT_NUM_64(off2);
+ PUT_NUM_64(off3);
else
{
- PUT_NUM_32(off2);
- PUT_SZ(" wrt rip"); //??
+ PUT_NUM_32(off3);
+ PUT_SZ(" wrt rip (");
+ off2 += pDis->uInstrAddr + pDis->cbInstr;
+ PUT_NUM_64(off2);
+ if (pfnGetSymbol)
+ PUT_SYMBOL((pDis->fPrefix & DISPREFIX_SEG)
+ ? DIS_FMT_SEL_FROM_REG(pDis->idxSegPrefix)
+ : DIS_FMT_SEL_FROM_REG(DISSELREG_DS),
+ pDis->uAddrMode == DISCPUMODE_64BIT
+ ? (uint64_t)off2
+ : pDis->uAddrMode == DISCPUMODE_32BIT
+ ? (uint32_t)off2
+ : (uint16_t)off2,
+ " = ",
+ ')');
+ else
+ PUT_C(')');
}
}
if (DISUSE_IS_EFFECTIVE_ADDR(fUse))
{
- if (pfnGetSymbol && !fBase && !(fUse & DISUSE_INDEX) && off2 != 0)
+ if (pfnGetSymbol && !fBase && !(fUse & (DISUSE_INDEX | DISUSE_RIPDISPLACEMENT32)) && off2 != 0)
PUT_SYMBOL((pDis->fPrefix & DISPREFIX_SEG)
? DIS_FMT_SEL_FROM_REG(pDis->idxSegPrefix)
: DIS_FMT_SEL_FROM_REG(DISSELREG_DS),
@@ -905,7 +921,8 @@ DISDECL(size_t) DISFormatYasmEx(PCDISSTATE pDis, char *pszBuf, size_t cchBuf, ui
: pDis->uAddrMode == DISCPUMODE_32BIT
? (uint32_t)off2
: (uint16_t)off2,
- " (=", ')');
+ " (=",
+ ')');
PUT_C(']');
}
break;
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/mkdemo.pl b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/demo/mkdemo.pl
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/funcs/tst.index.d.out b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/funcs/tst.index.d.out
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/funcs/tst.substr.d.out b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/funcs/tst.substr.d.out
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4localtcp.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4localtcp.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4localudp.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4remotetcp.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4remotetcp.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4remoteudp.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.ipv4remoteudp.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.localtcpstate.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.localtcpstate.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.remotetcpstate.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/ip/tst.remotetcpstate.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_MACRO_UNDEF.invalidargs.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_MACRO_UNDEF.invalidargs.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_OP_LVAL.rdonly.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_OP_LVAL.rdonly.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_OP_WRITE.usepidmacro.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_OP_WRITE.usepidmacro.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_SYNTAX.inval.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_SYNTAX.inval.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_SYNTAX.pid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/err.D_SYNTAX.pid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.arg0.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.arg0.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.assign.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.assign.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.basic.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.basic.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.egid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.egid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.euid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.euid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.gid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.gid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.pgid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.pgid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.pid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.pid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.ppid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.ppid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.projid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.projid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.quite.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.quite.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.sid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.sid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.taskid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.taskid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.trace.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.trace.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.uid.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/scripting/tst.uid.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithBreakPoint.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithBreakPoint.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithChill.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithChill.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithCopyOut.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithCopyOut.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithCopyOutStr.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithCopyOutStr.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithPanic.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithPanic.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithRaise.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithRaise.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithStop.d b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/speculation/err.D_ACT_SPEC.SpeculateWithStop.d
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/usdt/tst.corruptenv.ksh b/src/VBox/ExtPacks/VBoxDTrace/onnv/cmd/dtrace/test/tst/common/usdt/tst.corruptenv.ksh
old mode 100644
new mode 100755
diff --git a/src/VBox/ExtPacks/VBoxDTrace/onnv/lib/libdtrace/common/mkerrtags.sh b/src/VBox/ExtPacks/VBoxDTrace/onnv/lib/libdtrace/common/mkerrtags.sh
old mode 100644
new mode 100755
diff --git a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
index 3d68879..aebc450 100644
--- a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
+++ b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -127,17 +127,19 @@ private:
};
/**
- * Handler for global events.
+ * Handler for machine events.
*/
-class VirtualBoxEventListener
+class ConsoleEventListener
{
public:
- VirtualBoxEventListener()
+ ConsoleEventListener() :
+ mLastVRDEPort(-1),
+ m_fIgnorePowerOffEvents(false),
+ m_fNoLoggedInUsers(true)
{
- mfNoLoggedInUsers = true;
}
- virtual ~VirtualBoxEventListener()
+ virtual ~ConsoleEventListener()
{
}
@@ -154,6 +156,88 @@ public:
{
switch (aType)
{
+ case VBoxEventType_OnMouseCapabilityChanged:
+ {
+
+ ComPtr<IMouseCapabilityChangedEvent> mccev = aEvent;
+ Assert(!mccev.isNull());
+
+ BOOL fSupportsAbsolute = false;
+ mccev->COMGETTER(SupportsAbsolute)(&fSupportsAbsolute);
+
+ /* Emit absolute mouse event to actually enable the host mouse cursor. */
+ if (fSupportsAbsolute && gConsole)
+ {
+ ComPtr<IMouse> mouse;
+ gConsole->COMGETTER(Mouse)(mouse.asOutParam());
+ if (mouse)
+ {
+ mouse->PutMouseEventAbsolute(-1, -1, 0, 0 /* Horizontal wheel */, 0);
+ }
+ }
+ break;
+ }
+ case VBoxEventType_OnStateChanged:
+ {
+ ComPtr<IStateChangedEvent> scev = aEvent;
+ Assert(scev);
+
+ MachineState_T machineState;
+ scev->COMGETTER(State)(&machineState);
+
+ /* Terminate any event wait operation if the machine has been
+ * PoweredDown/Saved/Aborted. */
+ if (machineState < MachineState_Running && !m_fIgnorePowerOffEvents)
+ {
+ g_fTerminateFE = true;
+ gEventQ->interruptEventQueueProcessing();
+ }
+
+ break;
+ }
+ case VBoxEventType_OnVRDEServerInfoChanged:
+ {
+ ComPtr<IVRDEServerInfoChangedEvent> rdicev = aEvent;
+ Assert(rdicev);
+
+ if (gConsole)
+ {
+ ComPtr<IVRDEServerInfo> info;
+ gConsole->COMGETTER(VRDEServerInfo)(info.asOutParam());
+ if (info)
+ {
+ LONG port;
+ info->COMGETTER(Port)(&port);
+ if (port != mLastVRDEPort)
+ {
+ if (port == -1)
+ RTPrintf("VRDE server is inactive.\n");
+ else if (port == 0)
+ RTPrintf("VRDE server failed to start.\n");
+ else
+ RTPrintf("VRDE server is listening on port %d.\n", port);
+
+ mLastVRDEPort = port;
+ }
+ }
+ }
+ break;
+ }
+ case VBoxEventType_OnCanShowWindow:
+ {
+ ComPtr<ICanShowWindowEvent> cswev = aEvent;
+ Assert(cswev);
+ cswev->AddVeto(NULL);
+ break;
+ }
+ case VBoxEventType_OnShowWindow:
+ {
+ ComPtr<IShowWindowEvent> swev = aEvent;
+ Assert(swev);
+ /* Ignore the event, WinId is either still zero or some other listener assigned it. */
+ NOREF(swev); /* swev->COMSETTER(WinId)(0); */
+ break;
+ }
case VBoxEventType_OnGuestPropertyChanged:
{
ComPtr<IGuestPropertyChangedEvent> pChangedEvent = aEvent;
@@ -165,16 +249,8 @@ public:
if (gConsole)
{
hrc = gConsole->COMGETTER(Machine)(pMachine.asOutParam());
- if (SUCCEEDED(hrc) && pMachine)
- {
- Bstr gpMachineId, machineId;
- hrc = pMachine->COMGETTER(Id)(gpMachineId.asOutParam());
- AssertComRC(hrc);
- hrc = pChangedEvent->COMGETTER(MachineId)(machineId.asOutParam());
- AssertComRC(hrc);
- if (gpMachineId != machineId)
- hrc = VBOX_E_OBJECT_NOT_FOUND;
- }
+ if (FAILED(hrc) || !pMachine)
+ hrc = VBOX_E_OBJECT_NOT_FOUND;
}
else
hrc = VBOX_E_INVALID_VM_STATE;
@@ -215,32 +291,32 @@ public:
LogRelFlow(("VRDE: hrc=%Rhrc: Host %s disconnecting clients (current host state known: %s)\n",
hrc, fProcessDisconnectOnGuestLogout ? "will handle" : "does not handle",
- mfNoLoggedInUsers ? "No users logged in" : "Users logged in"));
+ m_fNoLoggedInUsers ? "No users logged in" : "Users logged in"));
if (fProcessDisconnectOnGuestLogout)
{
bool fDropConnection = false;
- if (!mfNoLoggedInUsers) /* Only if the property really changes. */
+ if (!m_fNoLoggedInUsers) /* Only if the property really changes. */
{
if ( utf8Value == "true"
/* Guest property got deleted due to reset,
* so it has no value anymore. */
|| utf8Value.isEmpty())
{
- mfNoLoggedInUsers = true;
+ m_fNoLoggedInUsers = true;
fDropConnection = true;
}
}
else if (utf8Value == "false")
- mfNoLoggedInUsers = false;
+ m_fNoLoggedInUsers = false;
/* Guest property got deleted due to reset,
- * take the shortcut without touching the mfNoLoggedInUsers
+ * take the shortcut without touching the m_fNoLoggedInUsers
* state. */
else if (utf8Value.isEmpty())
fDropConnection = true;
- LogRelFlow(("VRDE: szNoLoggedInUsers=%s, mfNoLoggedInUsers=%RTbool, fDropConnection=%RTbool\n",
- utf8Value.c_str(), mfNoLoggedInUsers, fDropConnection));
+ LogRelFlow(("VRDE: szNoLoggedInUsers=%s, m_fNoLoggedInUsers=%RTbool, fDropConnection=%RTbool\n",
+ utf8Value.c_str(), m_fNoLoggedInUsers, fDropConnection));
if (fDropConnection)
{
@@ -282,128 +358,6 @@ public:
default:
AssertFailed();
}
-
- return S_OK;
- }
-
-private:
-
- bool mfNoLoggedInUsers;
-};
-
-/**
- * Handler for machine events.
- */
-class ConsoleEventListener
-{
-public:
- ConsoleEventListener() :
- mLastVRDEPort(-1),
- m_fIgnorePowerOffEvents(false)
- {
- }
-
- virtual ~ConsoleEventListener()
- {
- }
-
- HRESULT init()
- {
- return S_OK;
- }
-
- void uninit()
- {
- }
-
- STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent *aEvent)
- {
- switch (aType)
- {
- case VBoxEventType_OnMouseCapabilityChanged:
- {
-
- ComPtr<IMouseCapabilityChangedEvent> mccev = aEvent;
- Assert(!mccev.isNull());
-
- BOOL fSupportsAbsolute = false;
- mccev->COMGETTER(SupportsAbsolute)(&fSupportsAbsolute);
-
- /* Emit absolute mouse event to actually enable the host mouse cursor. */
- if (fSupportsAbsolute && gConsole)
- {
- ComPtr<IMouse> mouse;
- gConsole->COMGETTER(Mouse)(mouse.asOutParam());
- if (mouse)
- {
- mouse->PutMouseEventAbsolute(-1, -1, 0, 0 /* Horizontal wheel */, 0);
- }
- }
- break;
- }
- case VBoxEventType_OnStateChanged:
- {
- ComPtr<IStateChangedEvent> scev = aEvent;
- Assert(scev);
-
- MachineState_T machineState;
- scev->COMGETTER(State)(&machineState);
-
- /* Terminate any event wait operation if the machine has been
- * PoweredDown/Saved/Aborted. */
- if (machineState < MachineState_Running && !m_fIgnorePowerOffEvents)
- {
- g_fTerminateFE = true;
- gEventQ->interruptEventQueueProcessing();
- }
-
- break;
- }
- case VBoxEventType_OnVRDEServerInfoChanged:
- {
- ComPtr<IVRDEServerInfoChangedEvent> rdicev = aEvent;
- Assert(rdicev);
-
- if (gConsole)
- {
- ComPtr<IVRDEServerInfo> info;
- gConsole->COMGETTER(VRDEServerInfo)(info.asOutParam());
- if (info)
- {
- LONG port;
- info->COMGETTER(Port)(&port);
- if (port != mLastVRDEPort)
- {
- if (port == -1)
- RTPrintf("VRDE server is inactive.\n");
- else if (port == 0)
- RTPrintf("VRDE server failed to start.\n");
- else
- RTPrintf("VRDE server is listening on port %d.\n", port);
-
- mLastVRDEPort = port;
- }
- }
- }
- break;
- }
- case VBoxEventType_OnCanShowWindow:
- {
- ComPtr<ICanShowWindowEvent> cswev = aEvent;
- Assert(cswev);
- cswev->AddVeto(NULL);
- break;
- }
- case VBoxEventType_OnShowWindow:
- {
- ComPtr<IShowWindowEvent> swev = aEvent;
- Assert(swev);
- swev->COMSETTER(WinId)(0);
- break;
- }
- default:
- AssertFailed();
- }
return S_OK;
}
@@ -416,14 +370,13 @@ private:
long mLastVRDEPort;
bool m_fIgnorePowerOffEvents;
+ bool m_fNoLoggedInUsers;
};
typedef ListenerImpl<VirtualBoxClientEventListener> VirtualBoxClientEventListenerImpl;
-typedef ListenerImpl<VirtualBoxEventListener> VirtualBoxEventListenerImpl;
typedef ListenerImpl<ConsoleEventListener> ConsoleEventListenerImpl;
VBOX_LISTENER_DECLARE(VirtualBoxClientEventListenerImpl)
-VBOX_LISTENER_DECLARE(VirtualBoxEventListenerImpl)
VBOX_LISTENER_DECLARE(ConsoleEventListenerImpl)
#ifdef VBOX_WITH_SAVESTATE_ON_SIGNAL
@@ -1056,6 +1009,7 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
eventTypes.push_back(VBoxEventType_OnVRDEServerInfoChanged);
eventTypes.push_back(VBoxEventType_OnCanShowWindow);
eventTypes.push_back(VBoxEventType_OnShowWindow);
+ eventTypes.push_back(VBoxEventType_OnGuestPropertyChanged);
CHECK_ERROR(es, RegisterListener(consoleListener, ComSafeArrayAsInParam(eventTypes), true));
}
@@ -1206,26 +1160,6 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
}
}
- /* VirtualBox events registration. */
- {
- ComPtr<IEventSource> es;
- CHECK_ERROR(virtualBox, COMGETTER(EventSource)(es.asOutParam()));
- ComObjPtr<VirtualBoxEventListenerImpl> listener;
- listener.createObject();
- listener->init(new VirtualBoxEventListener());
- vboxListener = listener;
- com::SafeArray<VBoxEventType_T> eventTypes;
- eventTypes.push_back(VBoxEventType_OnGuestPropertyChanged);
-
- /**
- * @todo Set the notification pattern to "/VirtualBox/GuestInfo/OS/ *Logged*"
- * to not cause too much load. The current API is broken as
- * IMachine::GuestPropertyNotificationPatterns() would change the
- * filter for _all_ clients. This is not what we want!
- */
- CHECK_ERROR(es, RegisterListener(vboxListener, ComSafeArrayAsInParam(eventTypes), true));
- }
-
#ifdef VBOX_WITH_SAVESTATE_ON_SIGNAL
signal(SIGINT, SaveState);
signal(SIGTERM, SaveState);
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManage.h b/src/VBox/Frontends/VBoxManage/VBoxManage.h
index 7c22052..4d13493 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManage.h
+++ b/src/VBox/Frontends/VBoxManage/VBoxManage.h
@@ -110,20 +110,20 @@
/** @} */
#ifdef VBOX_WITH_GUEST_CONTROL
-# define USAGE_GSTCTRL_EXEC RT_BIT(0)
-# define USAGE_GSTCTRL_COPYFROM RT_BIT(1)
-# define USAGE_GSTCTRL_COPYTO RT_BIT(2)
-# define USAGE_GSTCTRL_CREATEDIR RT_BIT(3)
-# define USAGE_GSTCTRL_REMOVEDIR RT_BIT(4)
-# define USAGE_GSTCTRL_REMOVEFILE RT_BIT(5)
-# define USAGE_GSTCTRL_RENAME RT_BIT(6)
-# define USAGE_GSTCTRL_CREATETEMP RT_BIT(7)
-# define USAGE_GSTCTRL_LIST RT_BIT(8)
-# define USAGE_GSTCTRL_PROCESS RT_BIT(9)
-# define USAGE_GSTCTRL_KILL RT_BIT(10)
-# define USAGE_GSTCTRL_SESSION RT_BIT(11)
+# define USAGE_GSTCTRL_RUN RT_BIT(0)
+# define USAGE_GSTCTRL_START RT_BIT(1)
+# define USAGE_GSTCTRL_COPYFROM RT_BIT(2)
+# define USAGE_GSTCTRL_COPYTO RT_BIT(3)
+# define USAGE_GSTCTRL_MKDIR RT_BIT(4)
+# define USAGE_GSTCTRL_RMDIR RT_BIT(5)
+# define USAGE_GSTCTRL_RM RT_BIT(6)
+# define USAGE_GSTCTRL_MV RT_BIT(7)
+# define USAGE_GSTCTRL_MKTEMP RT_BIT(8)
+# define USAGE_GSTCTRL_LIST RT_BIT(9)
+# define USAGE_GSTCTRL_CLOSEPROCESS RT_BIT(10)
+# define USAGE_GSTCTRL_CLOSESESSION RT_BIT(11)
# define USAGE_GSTCTRL_STAT RT_BIT(12)
-# define USAGE_GSTCTRL_UPDATEADDS RT_BIT(13)
+# define USAGE_GSTCTRL_UPDATEGA RT_BIT(13)
# define USAGE_GSTCTRL_WATCH RT_BIT(14)
#endif
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp
index 4e79b9e..20084c9 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageAppliance.cpp
@@ -1218,7 +1218,10 @@ int handleExportAppliance(HandlerArg *a)
RTEXITCODE rcExit = readPasswordFromConsole(&strPassword, "Password ID %s:", Utf8Str(bstrId).c_str());
if (rcExit == RTEXITCODE_FAILURE)
+ {
+ RTStrFree(pszAbsFilePath);
return rcExit;
+ }
bstrPassword = strPassword;
bstrPassword.detachTo(&aPasswords[idxId]);
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp
index 7c66eac..ce2fd5b 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2010-2013 Oracle Corporation
+ * Copyright (C) 2010-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -45,6 +45,7 @@
#include <iprt/path.h>
#include <iprt/process.h> /* For RTProcSelf(). */
#include <iprt/thread.h>
+#include <iprt/vfs.h>
#include <map>
#include <vector>
@@ -62,10 +63,48 @@
using namespace com;
+/*******************************************************************************
+* Defined Constants And Macros *
+*******************************************************************************/
+#define GCTLCMD_COMMON_OPT_USER 999 /**< The --username option number. */
+#define GCTLCMD_COMMON_OPT_PASSWORD 998 /**< The --password option number. */
+#define GCTLCMD_COMMON_OPT_PASSWORD_FILE 997 /**< The --password-file option number. */
+#define GCTLCMD_COMMON_OPT_DOMAIN 996 /**< The --domain option number. */
+/** Common option definitions. */
+#define GCTLCMD_COMMON_OPTION_DEFS() \
+ { "--username", GCTLCMD_COMMON_OPT_USER, RTGETOPT_REQ_STRING }, \
+ { "--passwordfile", GCTLCMD_COMMON_OPT_PASSWORD_FILE, RTGETOPT_REQ_STRING }, \
+ { "--password", GCTLCMD_COMMON_OPT_PASSWORD, RTGETOPT_REQ_STRING }, \
+ { "--domain", GCTLCMD_COMMON_OPT_DOMAIN, RTGETOPT_REQ_STRING }, \
+ { "--quiet", 'q', RTGETOPT_REQ_NOTHING }, \
+ { "--verbose", 'v', RTGETOPT_REQ_NOTHING },
+
+/** Handles common options in the typical option parsing switch. */
+#define GCTLCMD_COMMON_OPTION_CASES(a_pCtx, a_ch, a_pValueUnion) \
+ case 'v': \
+ case 'q': \
+ case GCTLCMD_COMMON_OPT_USER: \
+ case GCTLCMD_COMMON_OPT_DOMAIN: \
+ case GCTLCMD_COMMON_OPT_PASSWORD: \
+ case GCTLCMD_COMMON_OPT_PASSWORD_FILE: \
+ { \
+ RTEXITCODE rcExitCommon = gctlCtxSetOption(a_pCtx, a_ch, a_pValueUnion); \
+ if (RT_UNLIKELY(rcExitCommon != RTEXITCODE_SUCCESS)) \
+ return rcExitCommon; \
+ } break
+
+
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
/** Set by the signal handler when current guest control
* action shall be aborted. */
static volatile bool g_fGuestCtrlCanceled = false;
+
+/*******************************************************************************
+* Structures and Typedefs *
+*******************************************************************************/
/**
* Listener declarations.
*/
@@ -74,35 +113,63 @@ VBOX_LISTENER_DECLARE(GuestProcessEventListenerImpl)
VBOX_LISTENER_DECLARE(GuestSessionEventListenerImpl)
VBOX_LISTENER_DECLARE(GuestEventListenerImpl)
+
/**
- * Command context flags.
+ * Definition of a guestcontrol command, with handler and various flags.
+ */
+typedef struct GCTLCMDDEF
+{
+ /** The command name. */
+ const char *pszName;
+
+ /**
+ * Actual command handler callback.
+ *
+ * @param pCtx Pointer to command context to use.
+ */
+ DECLR3CALLBACKMEMBER(RTEXITCODE, pfnHandler, (struct GCTLCMDCTX *pCtx, int argc, char **argv));
+
+ /** The command usage flags. */
+ uint32_t fCmdUsage;
+ /** Command context flags (GCTLCMDCTX_F_XXX). */
+ uint32_t fCmdCtx;
+} GCTLCMD;
+/** Pointer to a const guest control command definition. */
+typedef GCTLCMDDEF const *PCGCTLCMDDEF;
+
+/** @name GCTLCMDCTX_F_XXX - Command context flags.
+ * @{
*/
/** No flags set. */
-#define CTLCMDCTX_FLAGS_NONE 0
+#define GCTLCMDCTX_F_NONE 0
/** Don't install a signal handler (CTRL+C trap). */
-#define CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER RT_BIT(0)
+#define GCTLCMDCTX_F_NO_SIGNAL_HANDLER RT_BIT(0)
/** No guest session needed. */
-#define CTLCMDCTX_FLAGS_SESSION_ANONYMOUS RT_BIT(1)
-/** Detach the guest session. That is, don't close the
- * guest session automatically on exit. */
-#define CTLCMDCTX_FLAGS_SESSION_DETACH RT_BIT(2)
+#define GCTLCMDCTX_F_SESSION_ANONYMOUS RT_BIT(1)
+/** @} */
/**
* Context for handling a specific command.
*/
typedef struct GCTLCMDCTX
{
- HandlerArg handlerArg;
- /** Command-specific argument count. */
- int iArgc;
- /** Command-specific argument vector. */
- char **ppaArgv;
- /** First argv to start parsing with. */
- int iFirstArgc;
- /** Command context flags. */
- uint32_t uFlags;
- /** Verbose flag. */
- bool fVerbose;
+ HandlerArg *pArg;
+
+ /** Pointer to the command definition. */
+ PCGCTLCMDDEF pCmdDef;
+ /** The VM name or UUID. */
+ const char *pszVmNameOrUuid;
+
+ /** Whether we've done the post option parsing init already. */
+ bool fPostOptionParsingInited;
+ /** Whether we've locked the VM session. */
+ bool fLockedVmSession;
+ /** Whether to detach (@c true) or close the session. */
+ bool fDetachGuestSession;
+ /** Set if we've installed the signal handler. */
+ bool fInstalledSignalHandler;
+ /** The verbosity level. */
+ uint32_t cVerbose;
/** User name. */
Utf8Str strUsername;
/** Password. */
@@ -118,16 +185,6 @@ typedef struct GCTLCMDCTX
} GCTLCMDCTX, *PGCTLCMDCTX;
-typedef struct GCTLCMD
-{
- /**
- * Actual command handler callback.
- *
- * @param pCtx Pointer to command context to use.
- */
- DECLR3CALLBACKMEMBER(RTEXITCODE, pfnHandler, (PGCTLCMDCTX pCtx));
-
-} GCTLCMD, *PGCTLCMD;
typedef struct COPYCONTEXT
{
@@ -217,34 +274,6 @@ typedef struct DESTFILEENTRY
typedef std::map< Utf8Str, std::vector<DESTFILEENTRY> > DESTDIRMAP, *PDESTDIRMAP;
typedef std::map< Utf8Str, std::vector<DESTFILEENTRY> >::iterator DESTDIRMAPITER, *PDESTDIRMAPITER;
-/**
- * Special exit codes for returning errors/information of a
- * started guest process to the command line VBoxManage was started from.
- * Useful for e.g. scripting.
- *
- * @note These are frozen as of 4.1.0.
- */
-enum EXITCODEEXEC
-{
- EXITCODEEXEC_SUCCESS = RTEXITCODE_SUCCESS,
- /* Process exited normally but with an exit code <> 0. */
- EXITCODEEXEC_CODE = 16,
- EXITCODEEXEC_FAILED = 17,
- EXITCODEEXEC_TERM_SIGNAL = 18,
- EXITCODEEXEC_TERM_ABEND = 19,
- EXITCODEEXEC_TIMEOUT = 20,
- EXITCODEEXEC_DOWN = 21,
- EXITCODEEXEC_CANCELED = 22
-};
-
-/*
- * Common getopt definitions, starting at 1000.
- * Specific command definitions will start all at 2000.
- */
-enum GETOPTDEF_COMMON
-{
- GETOPTDEF_COMMON_PASSWORD = 1000
-};
/**
* RTGetOpt-IDs for the guest execution control command line.
@@ -261,166 +290,161 @@ enum GETOPTDEF_EXEC
GETOPTDEF_EXEC_WAITFORSTDERR
};
-enum GETOPTDEF_COPY
-{
- GETOPTDEF_COPY_DRYRUN = 1000,
- GETOPTDEF_COPY_FOLLOW,
- GETOPTDEF_COPY_TARGETDIR
-};
-
-enum GETOPTDEF_MKDIR
-{
-};
-
-enum GETOPTDEF_RM
+enum kStreamTransform
{
+ kStreamTransform_None = 0,
+ kStreamTransform_Dos2Unix,
+ kStreamTransform_Unix2Dos
};
-enum GETOPTDEF_RMDIR
-{
-};
-
-enum GETOPTDEF_SESSIONCLOSE
-{
- GETOPTDEF_SESSIONCLOSE_ALL = 2000
-};
-enum GETOPTDEF_STAT
-{
-};
+/*******************************************************************************
+* Internal Functions *
+*******************************************************************************/
+static int gctlCopyDirExists(PCOPYCONTEXT pContext, bool bGuest, const char *pszDir, bool *fExists);
-enum OUTPUTTYPE
-{
- OUTPUTTYPE_UNDEFINED = 0,
- OUTPUTTYPE_DOS2UNIX = 10,
- OUTPUTTYPE_UNIX2DOS = 20
-};
+#endif /* VBOX_ONLY_DOCS */
-static int ctrlCopyDirExists(PCOPYCONTEXT pContext, bool bGuest, const char *pszDir, bool *fExists);
-#endif /* VBOX_ONLY_DOCS */
void usageGuestControl(PRTSTREAM pStrm, const char *pcszSep1, const char *pcszSep2, uint32_t uSubCmd)
{
- RTStrmPrintf(pStrm,
- "%s guestcontrol %s <uuid|vmname>\n%s",
- pcszSep1, pcszSep2,
- uSubCmd == ~0U ? "\n" : "");
- if (uSubCmd & USAGE_GSTCTRL_EXEC)
- RTStrmPrintf(pStrm,
- " exec[ute]\n"
- " --image <path to program> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose] [--timeout <msec>]\n"
- " [--environment \"<NAME>=<VALUE> [<NAME>=<VALUE>]\"]\n"
- " [--wait-exit] [--wait-stdout] [--wait-stderr]\n"
- " [--dos2unix] [--unix2dos]\n"
- " [-- [<argument1>] ... [<argumentN>]]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_COPYFROM)
+ const uint32_t fAnonSubCmds = USAGE_GSTCTRL_CLOSESESSION
+ | USAGE_GSTCTRL_LIST
+ | USAGE_GSTCTRL_CLOSEPROCESS
+ | USAGE_GSTCTRL_CLOSESESSION
+ | USAGE_GSTCTRL_UPDATEGA
+ | USAGE_GSTCTRL_WATCH;
+
+ /* 0 1 2 3 4 5 6 7 8XXXXXXXXXX */
+ /* 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 */
+ if (~fAnonSubCmds & uSubCmd)
RTStrmPrintf(pStrm,
- " copyfrom\n"
- " <guest source> <host dest> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- " [--dryrun] [--follow] [--recursive]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_COPYTO)
+ "%s guestcontrol %s <uuid|vmname> [--verbose|-v] [--quiet|-q]\n"
+ " [--username <name>] [--domain <domain>]\n"
+ " [--passwordfile <file> | --password <password>]\n%s",
+ pcszSep1, pcszSep2, uSubCmd == ~0U ? "\n" : "");
+ if (uSubCmd & USAGE_GSTCTRL_RUN)
RTStrmPrintf(pStrm,
- " copyto|cp\n"
- " <host source> <guest dest> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- " [--dryrun] [--follow] [--recursive]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_CREATEDIR)
+ " run [common-options]\n"
+ " [--exe <path to executable>] [--timeout <msec>]\n"
+ " [-E|--putenv <NAME>[=<VALUE>]] [--unquoted-args]\n"
+ " [--ignore-operhaned-processes] [--no-profile]\n"
+ " [--no-wait-stdout|--wait-stdout]\n"
+ " [--no-wait-stderr|--wait-stderr]\n"
+ " [--dos2unix] [--unix2dos]\n"
+ " -- <program/arg0> [argument1] ... [argumentN]]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_START)
RTStrmPrintf(pStrm,
- " createdir[ectory]|mkdir|md\n"
- " <guest directory>... --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- " [--parents] [--mode <mode>]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_REMOVEDIR)
+ " start [common-options]\n"
+ " [--exe <path to executable>] [--timeout <msec>]\n"
+ " [-E|--putenv <NAME>[=<VALUE>]] [--unquoted-args]\n"
+ " [--ignore-operhaned-processes] [--no-profile]\n"
+ " -- <program/arg0> [argument1] ... [argumentN]]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_COPYFROM)
RTStrmPrintf(pStrm,
- " removedir[ectory]|rmdir\n"
- " <guest directory>... --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- " [--recursive|-R|-r]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_REMOVEFILE)
+ " copyfrom [common-options]\n"
+ " [--dryrun] [--follow] [-R|--recursive]\n"
+ " <guest-src0> [guest-src1 [...]] <host-dst>\n"
+ "\n"
+ " copyfrom [common-options]\n"
+ " [--dryrun] [--follow] [-R|--recursive]\n"
+ " [--target-directory <host-dst-dir>]\n"
+ " <guest-src0> [guest-src1 [...]]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_COPYTO)
RTStrmPrintf(pStrm,
- " removefile|rm\n"
- " <guest file>... --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_RENAME)
+ " copyto [common-options]\n"
+ " [--dryrun] [--follow] [-R|--recursive]\n"
+ " <host-src0> [host-src1 [...]] <guest-dst>\n"
+ "\n"
+ " copyto [common-options]\n"
+ " [--dryrun] [--follow] [-R|--recursive]\n"
+ " [--target-directory <guest-dst>]\n"
+ " <host-src0> [host-src1 [...]]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_MKDIR)
RTStrmPrintf(pStrm,
- " ren[ame]|mv\n"
- " <source>... <dest> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_CREATETEMP)
+ " mkdir|createdir[ectory] [common-options]\n"
+ " [--parents] [--mode <mode>]\n"
+ " <guest directory> [...]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_RMDIR)
RTStrmPrintf(pStrm,
- " createtemp[orary]|mktemp\n"
- " <template> --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--directory] [--secure] [--tmpdir <directory>]\n"
- " [--domain <domain>] [--mode <mode>] [--verbose]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_LIST)
+ " rmdir|removedir[ectory] [common-options]\n"
+ " [-R|--recursive]\n"
+ " <guest directory> [...]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_RM)
RTStrmPrintf(pStrm,
- " list <all|sessions|processes|files> [--verbose]\n"
- "\n");
- /** @todo Add an own help group for "session" and "process" sub commands. */
- if (uSubCmd & USAGE_GSTCTRL_PROCESS)
- RTStrmPrintf(pStrm,
- " process kill --session-id <ID>\n"
- " | --session-name <name or pattern>\n"
- " [--verbose]\n"
- " <PID> ... <PID n>\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_KILL)
+ " removefile|rm [common-options] [-f|--force]\n"
+ " <guest file> [...]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_MV)
RTStrmPrintf(pStrm,
- " [p[s]]kill --session-id <ID>\n"
- " | --session-name <name or pattern>\n"
- " [--verbose]\n"
- " <PID> ... <PID n>\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_SESSION)
+ " mv|move|ren[ame] [common-options]\n"
+ " <source> [source1 [...]] <dest>\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_MKTEMP)
RTStrmPrintf(pStrm,
- " session close --session-id <ID>\n"
- " | --session-name <name or pattern>\n"
- " | --all\n"
- " [--verbose]\n"
- "\n");
+ " mktemp|createtemp[orary] [common-options]\n"
+ " [--secure] [--mode <mode>] [--tmpdir <directory>]\n"
+ " <template>\n"
+ "\n");
if (uSubCmd & USAGE_GSTCTRL_STAT)
RTStrmPrintf(pStrm,
- " stat\n"
- " <file>... --username <name>\n"
- " [--passwordfile <file> | --password <password>]\n"
- " [--domain <domain>] [--verbose]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_UPDATEADDS)
- RTStrmPrintf(pStrm,
- " updateadditions\n"
- " [--source <guest additions .ISO>] [--verbose]\n"
- " [--wait-start]\n"
- " [-- [<argument1>] ... [<argumentN>]]\n"
- "\n");
- if (uSubCmd & USAGE_GSTCTRL_WATCH)
+ " stat [common-options]\n"
+ " <file> [...]\n"
+ "\n");
+
+ /*
+ * Command not requiring authentication.
+ */
+ if (fAnonSubCmds & uSubCmd)
+ {
+ /* 0 1 2 3 4 5 6 7 8XXXXXXXXXX */
+ /* 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 */
RTStrmPrintf(pStrm,
- " watch [--verbose]\n"
- "\n");
+ "%s guestcontrol %s <uuid|vmname> [--verbose|-v] [--quiet|-q]\n%s",
+ pcszSep1, pcszSep2, uSubCmd == ~0U ? "\n" : "");
+ if (uSubCmd & USAGE_GSTCTRL_LIST)
+ RTStrmPrintf(pStrm,
+ " list <all|sessions|processes|files> [common-opts]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_CLOSEPROCESS)
+ RTStrmPrintf(pStrm,
+ " closeprocess [common-options]\n"
+ " < --session-id <ID>\n"
+ " | --session-name <name or pattern>\n"
+ " <PID1> [PID1 [...]]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_CLOSESESSION)
+ RTStrmPrintf(pStrm,
+ " closesession [common-options]\n"
+ " < --all | --session-id <ID>\n"
+ " | --session-name <name or pattern> >\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_UPDATEGA)
+ RTStrmPrintf(pStrm,
+ " updatega|updateguestadditions|updateadditions\n"
+ " [--source <guest additions .ISO>]\n"
+ " [--wait-start] [common-options]\n"
+ " [-- [<argument1>] ... [<argumentN>]]\n"
+ "\n");
+ if (uSubCmd & USAGE_GSTCTRL_WATCH)
+ RTStrmPrintf(pStrm,
+ " watch [common-options]\n"
+ "\n");
+ }
}
#ifndef VBOX_ONLY_DOCS
+
#ifdef RT_OS_WINDOWS
-static BOOL WINAPI guestCtrlSignalHandler(DWORD dwCtrlType)
+static BOOL WINAPI gctlSignalHandler(DWORD dwCtrlType)
{
bool fEventHandled = FALSE;
switch (dwCtrlType)
@@ -448,41 +472,45 @@ static BOOL WINAPI guestCtrlSignalHandler(DWORD dwCtrlType)
* a thread dedicated to delivering this signal. Don't do anything
* unnecessary here.
*/
-static void guestCtrlSignalHandler(int iSignal)
+static void gctlSignalHandler(int iSignal)
{
NOREF(iSignal);
ASMAtomicWriteBool(&g_fGuestCtrlCanceled, true);
}
#endif
+
/**
* Installs a custom signal handler to get notified
* whenever the user wants to intercept the program.
*
- ** @todo Make this handler available for all VBoxManage modules?
+ * @todo Make this handler available for all VBoxManage modules?
*/
-static int ctrlSignalHandlerInstall(void)
+static int gctlSignalHandlerInstall(void)
{
+ g_fGuestCtrlCanceled = false;
+
int rc = VINF_SUCCESS;
#ifdef RT_OS_WINDOWS
- if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)guestCtrlSignalHandler, TRUE /* Add handler */))
+ if (!SetConsoleCtrlHandler((PHANDLER_ROUTINE)gctlSignalHandler, TRUE /* Add handler */))
{
rc = RTErrConvertFromWin32(GetLastError());
RTMsgError("Unable to install console control handler, rc=%Rrc\n", rc);
}
#else
- signal(SIGINT, guestCtrlSignalHandler);
+ signal(SIGINT, gctlSignalHandler);
# ifdef SIGBREAK
- signal(SIGBREAK, guestCtrlSignalHandler);
+ signal(SIGBREAK, gctlSignalHandler);
# endif
#endif
return rc;
}
+
/**
* Uninstalls a previously installed signal handler.
*/
-static int ctrlSignalHandlerUninstall(void)
+static int gctlSignalHandlerUninstall(void)
{
int rc = VINF_SUCCESS;
#ifdef RT_OS_WINDOWS
@@ -500,11 +528,11 @@ static int ctrlSignalHandlerUninstall(void)
return rc;
}
+
/**
- * Translates a process status to a human readable
- * string.
+ * Translates a process status to a human readable string.
*/
-const char *ctrlProcessStatusToText(ProcessStatus_T enmStatus)
+const char *gctlProcessStatusToText(ProcessStatus_T enmStatus)
{
switch (enmStatus)
{
@@ -536,54 +564,10 @@ const char *ctrlProcessStatusToText(ProcessStatus_T enmStatus)
return "unknown";
}
-static int ctrlExecProcessStatusToExitCode(ProcessStatus_T enmStatus, ULONG uExitCode)
-{
- int vrc = EXITCODEEXEC_SUCCESS;
- switch (enmStatus)
- {
- case ProcessStatus_Starting:
- vrc = EXITCODEEXEC_SUCCESS;
- break;
- case ProcessStatus_Started:
- vrc = EXITCODEEXEC_SUCCESS;
- break;
- case ProcessStatus_Paused:
- vrc = EXITCODEEXEC_SUCCESS;
- break;
- case ProcessStatus_Terminating:
- vrc = EXITCODEEXEC_SUCCESS;
- break;
- case ProcessStatus_TerminatedNormally:
- vrc = !uExitCode ? EXITCODEEXEC_SUCCESS : EXITCODEEXEC_CODE;
- break;
- case ProcessStatus_TerminatedSignal:
- vrc = EXITCODEEXEC_TERM_SIGNAL;
- break;
- case ProcessStatus_TerminatedAbnormally:
- vrc = EXITCODEEXEC_TERM_ABEND;
- break;
- case ProcessStatus_TimedOutKilled:
- vrc = EXITCODEEXEC_TIMEOUT;
- break;
- case ProcessStatus_TimedOutAbnormally:
- vrc = EXITCODEEXEC_TIMEOUT;
- break;
- case ProcessStatus_Down:
- /* Service/OS is stopping, process was killed, so
- * not exactly an error of the started process ... */
- vrc = EXITCODEEXEC_DOWN;
- break;
- case ProcessStatus_Error:
- vrc = EXITCODEEXEC_FAILED;
- break;
- default:
- AssertMsgFailed(("Unknown exit code (%u) from guest process returned!\n", enmStatus));
- break;
- }
- return vrc;
-}
-
-const char *ctrlProcessWaitResultToText(ProcessWaitResult_T enmWaitResult)
+/**
+ * Translates a guest process wait result to a human readable string.
+ */
+const char *gctlProcessWaitResultToText(ProcessWaitResult_T enmWaitResult)
{
switch (enmWaitResult)
{
@@ -612,10 +596,9 @@ const char *ctrlProcessWaitResultToText(ProcessWaitResult_T enmWaitResult)
}
/**
- * Translates a guest session status to a human readable
- * string.
+ * Translates a guest session status to a human readable string.
*/
-const char *ctrlSessionStatusToText(GuestSessionStatus_T enmStatus)
+const char *gctlGuestSessionStatusToText(GuestSessionStatus_T enmStatus)
{
switch (enmStatus)
{
@@ -642,10 +625,9 @@ const char *ctrlSessionStatusToText(GuestSessionStatus_T enmStatus)
}
/**
- * Translates a guest file status to a human readable
- * string.
+ * Translates a guest file status to a human readable string.
*/
-const char *ctrlFileStatusToText(FileStatus_T enmStatus)
+const char *gctlFileStatusToText(FileStatus_T enmStatus)
{
switch (enmStatus)
{
@@ -667,7 +649,7 @@ const char *ctrlFileStatusToText(FileStatus_T enmStatus)
return "unknown";
}
-static int ctrlPrintError(com::ErrorInfo &errorInfo)
+static int gctlPrintError(com::ErrorInfo &errorInfo)
{
if ( errorInfo.isFullAvailable()
|| errorInfo.isBasicAvailable())
@@ -687,13 +669,13 @@ static int ctrlPrintError(com::ErrorInfo &errorInfo)
VERR_INVALID_PARAMETER);
}
-static int ctrlPrintError(IUnknown *pObj, const GUID &aIID)
+static int gctlPrintError(IUnknown *pObj, const GUID &aIID)
{
com::ErrorInfo ErrInfo(pObj, aIID);
- return ctrlPrintError(ErrInfo);
+ return gctlPrintError(ErrInfo);
}
-static int ctrlPrintProgressError(ComPtr<IProgress> pProgress)
+static int gctlPrintProgressError(ComPtr<IProgress> pProgress)
{
int vrc = VINF_SUCCESS;
HRESULT rc;
@@ -709,7 +691,7 @@ static int ctrlPrintProgressError(ComPtr<IProgress> pProgress)
if (FAILED(rcProc))
{
com::ProgressErrorInfo ErrInfo(pProgress);
- vrc = ctrlPrintError(ErrInfo);
+ vrc = gctlPrintError(ErrInfo);
}
}
@@ -720,402 +702,568 @@ static int ctrlPrintProgressError(ComPtr<IProgress> pProgress)
return vrc;
}
+
+
+/*
+ *
+ *
+ * Guest Control Command Context
+ * Guest Control Command Context
+ * Guest Control Command Context
+ * Guest Control Command Context
+ *
+ *
+ *
+ */
+
+
/**
- * Un-initializes the VM after guest control usage.
- * @param pCmdCtx Pointer to command context.
- * @param uFlags Command context flags.
+ * Initializes a guest control command context structure.
+ *
+ * @returns RTEXITCODE_SUCCESS on success, RTEXITCODE_FAILURE on failure (after
+ * informing the user of course).
+ * @param pCtx The command context to init.
+ * @param pArg The handle argument package.
*/
-static void ctrlUninitVM(PGCTLCMDCTX pCtx, uint32_t uFlags)
+static RTEXITCODE gctrCmdCtxInit(PGCTLCMDCTX pCtx, HandlerArg *pArg)
{
- AssertPtrReturnVoid(pCtx);
+ RT_ZERO(*pCtx);
+ pCtx->pArg = pArg;
- if (!(pCtx->uFlags & CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER))
- ctrlSignalHandlerUninstall();
+ /*
+ * The user name defaults to the host one, if we can get at it.
+ */
+ char szUser[1024];
+ int rc = RTProcQueryUsername(RTProcSelf(), szUser, sizeof(szUser), NULL);
+ if ( RT_SUCCESS(rc)
+ && RTStrIsValidEncoding(szUser)) /* paranoia required on posix */
+ {
+ try
+ {
+ pCtx->strUsername = szUser;
+ }
+ catch (std::bad_alloc &)
+ {
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Out of memory");
+ }
+ }
+ /* else: ignore this failure. */
- HRESULT rc;
+ return RTEXITCODE_SUCCESS;
+}
- do
+
+/**
+ * Worker for GCTLCMD_COMMON_OPTION_CASES.
+ *
+ * @returns RTEXITCODE_SUCCESS if the option was handled successfully. If not,
+ * an error message is printed and an appropriate failure exit code is
+ * returned.
+ * @param pCtx The guest control command context.
+ * @param ch The option char or ordinal.
+ * @param pValueUnion The option value union.
+ */
+static RTEXITCODE gctlCtxSetOption(PGCTLCMDCTX pCtx, int ch, PRTGETOPTUNION pValueUnion)
+{
+ RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
+ switch (ch)
{
- if (!pCtx->pGuestSession.isNull())
- {
- if ( !(pCtx->uFlags & CTLCMDCTX_FLAGS_SESSION_ANONYMOUS)
- && !(pCtx->uFlags & CTLCMDCTX_FLAGS_SESSION_DETACH))
- {
- if (pCtx->fVerbose)
- RTPrintf("Closing guest session ...\n");
+ case GCTLCMD_COMMON_OPT_USER: /* User name */
+ if (!pCtx->pCmdDef || !(pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_SESSION_ANONYMOUS))
+ pCtx->strUsername = pValueUnion->psz;
+ else
+ RTMsgWarning("The --username|-u option is ignored by '%s'", pCtx->pCmdDef->pszName);
+ break;
- CHECK_ERROR(pCtx->pGuestSession, Close());
- /* Keep going - don't break here. Try to unlock the
- * machine down below. */
+ case GCTLCMD_COMMON_OPT_PASSWORD: /* Password */
+ if (!pCtx->pCmdDef || !(pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_SESSION_ANONYMOUS))
+ {
+ if (pCtx->strPassword.isNotEmpty())
+ RTMsgWarning("Password is given more than once.");
+ pCtx->strPassword = pValueUnion->psz;
}
- else if ( (pCtx->uFlags & CTLCMDCTX_FLAGS_SESSION_DETACH)
- && pCtx->fVerbose)
- RTPrintf("Guest session detached\n");
+ else
+ RTMsgWarning("The --password option is ignored by '%s'", pCtx->pCmdDef->pszName);
+ break;
- pCtx->pGuestSession.setNull();
- }
+ case GCTLCMD_COMMON_OPT_PASSWORD_FILE: /* Password file */
+ if (!pCtx->pCmdDef || !(pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_SESSION_ANONYMOUS))
+ rcExit = readPasswordFile(pValueUnion->psz, &pCtx->strPassword);
+ else
+ RTMsgWarning("The --password-file|-p option is ignored by '%s'", pCtx->pCmdDef->pszName);
+ break;
- if (pCtx->handlerArg.session)
- CHECK_ERROR(pCtx->handlerArg.session, UnlockMachine());
+ case GCTLCMD_COMMON_OPT_DOMAIN: /* domain */
+ if (!pCtx->pCmdDef || !(pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_SESSION_ANONYMOUS))
+ pCtx->strDomain = pValueUnion->psz;
+ else
+ RTMsgWarning("The --domain option is ignored by '%s'", pCtx->pCmdDef->pszName);
+ break;
- } while (0);
+ case 'v': /* --verbose */
+ pCtx->cVerbose++;
+ break;
- for (int i = 0; i < pCtx->iArgc; i++)
- RTStrFree(pCtx->ppaArgv[i]);
- RTMemFree(pCtx->ppaArgv);
- pCtx->iArgc = 0;
+ case 'q': /* --quiet */
+ if (pCtx->cVerbose)
+ pCtx->cVerbose--;
+ break;
+
+ default:
+ AssertFatalMsgFailed(("ch=%d (%c)\n", ch, ch));
+ }
+ return rcExit;
}
+
/**
- * Initializes the VM for IGuest operations.
+ * Initializes the VM for IGuest operation.
*
- * That is, checks whether it's up and running, if it can be locked (shared
- * only) and returns a valid IGuest pointer on success. Also, it does some
- * basic command line processing and opens a guest session, if required.
+ * This opens a shared session to a running VM and gets hold of IGuest.
*
- * @return RTEXITCODE status code.
- * @param pArg Pointer to command line argument structure.
- * @param pCmdCtx Pointer to command context.
- * @param uFlags Command context flags.
+ * @returns RTEXITCODE_SUCCESS on success. RTEXITCODE_FAILURE and user message
+ * on failure.
+ * @param pCtx The guest control command context.
+ * GCTLCMDCTX::pGuest will be set on success.
*/
-static RTEXITCODE ctrlInitVM(HandlerArg *pArg,
- PGCTLCMDCTX pCtx, uint32_t uFlags, uint32_t uUsage)
+static RTEXITCODE gctlCtxInitVmSession(PGCTLCMDCTX pCtx)
{
- AssertPtrReturn(pArg, RTEXITCODE_FAILURE);
- AssertReturn(pArg->argc > 1, RTEXITCODE_FAILURE);
- AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
-
-#ifdef DEBUG_andy
- RTPrintf("Original argv:\n");
- for (int i=0; i<pArg->argc;i++)
- RTPrintf("\targv[%d]=%s\n", i, pArg->argv[i]);
-#endif
-
- RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
-
- const char *pszNameOrId = pArg->argv[0];
- const char *pszCmd = pArg->argv[1];
+ HRESULT rc;
+ AssertPtr(pCtx);
+ AssertPtr(pCtx->pArg);
- /* Lookup VM. */
+ /*
+ * Find the VM and check if it's running.
+ */
ComPtr<IMachine> machine;
- /* Assume it's an UUID. */
- HRESULT rc;
- CHECK_ERROR(pArg->virtualBox, FindMachine(Bstr(pszNameOrId).raw(),
- machine.asOutParam()));
+ CHECK_ERROR(pCtx->pArg->virtualBox, FindMachine(Bstr(pCtx->pszVmNameOrUuid).raw(), machine.asOutParam()));
if (SUCCEEDED(rc))
{
- /* Machine is running? */
- MachineState_T machineState;
- CHECK_ERROR(machine, COMGETTER(State)(&machineState));
+ MachineState_T enmMachineState;
+ CHECK_ERROR(machine, COMGETTER(State)(&enmMachineState));
if ( SUCCEEDED(rc)
- && (machineState != MachineState_Running))
- rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Machine \"%s\" is not running (currently %s)!\n",
- pszNameOrId, machineStateToName(machineState, false));
+ && enmMachineState == MachineState_Running)
+ {
+ /*
+ * It's running. So, open a session to it and get the IGuest interface.
+ */
+ CHECK_ERROR(machine, LockMachine(pCtx->pArg->session, LockType_Shared));
+ if (SUCCEEDED(rc))
+ {
+ pCtx->fLockedVmSession = true;
+ ComPtr<IConsole> ptrConsole;
+ CHECK_ERROR(pCtx->pArg->session, COMGETTER(Console)(ptrConsole.asOutParam()));
+ if (SUCCEEDED(rc))
+ {
+ CHECK_ERROR(ptrConsole, COMGETTER(Guest)(pCtx->pGuest.asOutParam()));
+ if (SUCCEEDED(rc))
+ return RTEXITCODE_SUCCESS;
+ }
+ }
+ }
+ else if(SUCCEEDED(rc))
+ RTMsgError("Machine \"%s\" is not running (currently %s)!\n",
+ pCtx->pszVmNameOrUuid, machineStateToName(enmMachineState, false));
}
- else
- rcExit = RTEXITCODE_FAILURE;
+ return RTEXITCODE_FAILURE;
+}
- if (rcExit == RTEXITCODE_SUCCESS)
+
+/**
+ * Creates a guest session with the VM.
+ *
+ * @retval RTEXITCODE_SUCCESS on success.
+ * @retval RTEXITCODE_FAILURE and user message on failure.
+ * @param pCtx The guest control command context.
+ * GCTCMDCTX::pGuestSession and GCTLCMDCTX::uSessionID
+ * will be set.
+ */
+static RTEXITCODE gctlCtxInitGuestSession(PGCTLCMDCTX pCtx)
+{
+ HRESULT rc;
+ AssertPtr(pCtx);
+ Assert(!(pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_SESSION_ANONYMOUS));
+ Assert(pCtx->pGuest.isNotNull());
+
+ /*
+ * Build up a reasonable guest session name. Useful for identifying
+ * a specific session when listing / searching for them.
+ */
+ char *pszSessionName;
+ if (RTStrAPrintf(&pszSessionName,
+ "[%RU32] VBoxManage Guest Control [%s] - %s",
+ RTProcSelf(), pCtx->pszVmNameOrUuid, pCtx->pCmdDef->pszName) < 0)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "No enough memory for session name");
+
+ /*
+ * Create a guest session.
+ */
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Creating guest session as user '%s'...\n", pCtx->strUsername.c_str());
+ try
+ {
+ CHECK_ERROR(pCtx->pGuest, CreateSession(Bstr(pCtx->strUsername).raw(),
+ Bstr(pCtx->strPassword).raw(),
+ Bstr(pCtx->strDomain).raw(),
+ Bstr(pszSessionName).raw(),
+ pCtx->pGuestSession.asOutParam()));
+ }
+ catch (std::bad_alloc &)
+ {
+ RTMsgError("Out of memory setting up IGuest::CreateSession call");
+ rc = E_OUTOFMEMORY;
+ }
+ if (SUCCEEDED(rc))
{
/*
- * Process standard options which are served by all commands.
+ * Wait for guest session to start.
*/
- static const RTGETOPTDEF s_aOptions[] =
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Waiting for guest session to start...\n");
+ GuestSessionWaitResult_T enmWaitResult;
+ try
{
- { "--username", 'u', RTGETOPT_REQ_STRING },
- { "--passwordfile", 'p', RTGETOPT_REQ_STRING },
- { "--password", GETOPTDEF_COMMON_PASSWORD, RTGETOPT_REQ_STRING },
- { "--domain", 'd', RTGETOPT_REQ_STRING },
- { "--verbose", 'v', RTGETOPT_REQ_NOTHING }
- };
-
- /*
- * Allocate per-command argv. This then only contains the specific arguments
- * the command needs.
- */
- pCtx->ppaArgv = (char**)RTMemAlloc(pArg->argc * sizeof(char*) + 1);
- if (!pCtx->ppaArgv)
+ com::SafeArray<GuestSessionWaitForFlag_T> aSessionWaitFlags;
+ aSessionWaitFlags.push_back(GuestSessionWaitForFlag_Start);
+ CHECK_ERROR(pCtx->pGuestSession, WaitForArray(ComSafeArrayAsInParam(aSessionWaitFlags),
+ /** @todo Make session handling timeouts configurable. */
+ 30 * 1000, &enmWaitResult));
+ }
+ catch (std::bad_alloc &)
{
- rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Not enough memory for per-command argv\n");
+ RTMsgError("Out of memory setting up IGuestSession::WaitForArray call");
+ rc = E_OUTOFMEMORY;
}
- else
+ if (SUCCEEDED(rc))
{
- pCtx->iArgc = 0;
-
- int iArgIdx = 2; /* Skip VM name and guest control command */
- int ch;
- RTGETOPTUNION ValueUnion;
- RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pArg->argc, pArg->argv,
- s_aOptions, RT_ELEMENTS(s_aOptions),
- iArgIdx, 0);
-
- while ( (ch = RTGetOpt(&GetState, &ValueUnion))
- && (rcExit == RTEXITCODE_SUCCESS))
+ /* The WaitFlagNotSupported result may happen with GAs older than 4.3. */
+ if ( enmWaitResult == GuestSessionWaitResult_Start
+ || enmWaitResult == GuestSessionWaitResult_WaitFlagNotSupported)
{
- /* For options that require an argument, ValueUnion has received the value. */
- switch (ch)
+ /*
+ * Get the session ID and we're ready to rumble.
+ */
+ CHECK_ERROR(pCtx->pGuestSession, COMGETTER(Id)(&pCtx->uSessionID));
+ if (SUCCEEDED(rc))
{
- case 'u': /* User name */
- if (!(uFlags & CTLCMDCTX_FLAGS_SESSION_ANONYMOUS))
- pCtx->strUsername = ValueUnion.psz;
- iArgIdx = GetState.iNext;
- break;
-
- case GETOPTDEF_COMMON_PASSWORD: /* Password */
- if (!(uFlags & CTLCMDCTX_FLAGS_SESSION_ANONYMOUS))
- {
- if (pCtx->strPassword.isEmpty())
- pCtx->strPassword = ValueUnion.psz;
- }
- iArgIdx = GetState.iNext;
- break;
-
- case 'p': /* Password file */
- {
- if (!(uFlags & CTLCMDCTX_FLAGS_SESSION_ANONYMOUS))
- rcExit = readPasswordFile(ValueUnion.psz, &pCtx->strPassword);
- iArgIdx = GetState.iNext;
- break;
- }
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Successfully started guest session (ID %RU32)\n", pCtx->uSessionID);
+ RTStrFree(pszSessionName);
+ return RTEXITCODE_SUCCESS;
+ }
+ }
+ else
+ {
+ GuestSessionStatus_T enmSessionStatus;
+ CHECK_ERROR(pCtx->pGuestSession, COMGETTER(Status)(&enmSessionStatus));
+ RTMsgError("Error starting guest session (current status is: %s)\n",
+ SUCCEEDED(rc) ? gctlGuestSessionStatusToText(enmSessionStatus) : "<unknown>");
+ }
+ }
+ }
- case 'd': /* domain */
- if (!(uFlags & CTLCMDCTX_FLAGS_SESSION_ANONYMOUS))
- pCtx->strDomain = ValueUnion.psz;
- iArgIdx = GetState.iNext;
- break;
+ RTStrFree(pszSessionName);
+ return RTEXITCODE_FAILURE;
+}
- case 'v': /* Verbose */
- pCtx->fVerbose = true;
- iArgIdx = GetState.iNext;
- break;
- case 'h': /* Help */
- errorGetOptEx(USAGE_GUESTCONTROL, uUsage, ch, &ValueUnion);
- return RTEXITCODE_SYNTAX;
+/**
+ * Completes the guest control context initialization after parsing arguments.
+ *
+ * Will validate common arguments, open a VM session, and if requested open a
+ * guest session and install the CTRL-C signal handler.
+ *
+ * It is good to validate all the options and arguments you can before making
+ * this call. However, the VM session, IGuest and IGuestSession interfaces are
+ * not availabe till after this call, so take care.
+ *
+ * @retval RTEXITCODE_SUCCESS on success.
+ * @retval RTEXITCODE_FAILURE and user message on failure.
+ * @param pCtx The guest control command context.
+ * GCTCMDCTX::pGuestSession and GCTLCMDCTX::uSessionID
+ * will be set.
+ * @remarks Can safely be called multiple times, will only do work once.
+ */
+static RTEXITCODE gctlCtxPostOptionParsingInit(PGCTLCMDCTX pCtx)
+{
+ if (pCtx->fPostOptionParsingInited)
+ return RTEXITCODE_SUCCESS;
- default:
- /* Simply skip; might be handled in a specific command
- * handler later. */
- break;
+ /*
+ * Check that the user name isn't empty when we need it.
+ */
+ RTEXITCODE rcExit;
+ if ( (pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_SESSION_ANONYMOUS)
+ || pCtx->strUsername.isNotEmpty())
+ {
+ /*
+ * Open the VM session and if required, a guest session.
+ */
+ rcExit = gctlCtxInitVmSession(pCtx);
+ if ( rcExit == RTEXITCODE_SUCCESS
+ && !(pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_SESSION_ANONYMOUS))
+ rcExit = gctlCtxInitGuestSession(pCtx);
+ if (rcExit == RTEXITCODE_SUCCESS)
+ {
+ /*
+ * Install signal handler if requested (errors are ignored).
+ */
+ if (!(pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_NO_SIGNAL_HANDLER))
+ {
+ int rc = gctlSignalHandlerInstall();
+ pCtx->fInstalledSignalHandler = RT_SUCCESS(rc);
+ }
+ }
+ }
+ else
+ rcExit = errorSyntaxEx(USAGE_GUESTCONTROL, pCtx->pCmdDef->fCmdUsage, "No user name specified!");
- } /* switch */
+ pCtx->fPostOptionParsingInited = rcExit == RTEXITCODE_SUCCESS;
+ return rcExit;
+}
- int iArgDiff = GetState.iNext - iArgIdx;
- if (iArgDiff)
- {
-#ifdef DEBUG_andy
- RTPrintf("Not handled (iNext=%d, iArgsCur=%d):\n", GetState.iNext, iArgIdx);
-#endif
- for (int i = iArgIdx; i < GetState.iNext; i++)
- {
- char *pszArg = RTStrDup(pArg->argv[i]);
- if (!pszArg)
- {
- rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE,
- "Not enough memory for command line handling\n");
- break;
- }
- pCtx->ppaArgv[pCtx->iArgc] = pszArg;
- pCtx->iArgc++;
-#ifdef DEBUG_andy
- RTPrintf("\targv[%d]=%s\n", i, pArg->argv[i]);
-#endif
- }
- iArgIdx = GetState.iNext;
- }
+/**
+ * Cleans up the context when the command returns.
+ *
+ * This will close any open guest session, unless the DETACH flag is set.
+ * It will also close any VM session that may be been established. Any signal
+ * handlers we've installed will also be removed.
+ *
+ * Un-initializes the VM after guest control usage.
+ * @param pCmdCtx Pointer to command context.
+ */
+static void gctlCtxTerm(PGCTLCMDCTX pCtx)
+{
+ HRESULT rc;
+ AssertPtr(pCtx);
- } /* while RTGetOpt */
- }
+ /*
+ * Uninstall signal handler.
+ */
+ if (pCtx->fInstalledSignalHandler)
+ {
+ gctlSignalHandlerUninstall();
+ pCtx->fInstalledSignalHandler = false;
}
/*
- * Check for mandatory stuff.
+ * Close, or at least release, the guest session.
*/
- if (rcExit == RTEXITCODE_SUCCESS)
+ if (pCtx->pGuestSession.isNotNull())
{
-#if 0
- RTPrintf("argc=%d\n", pCtx->iArgc);
- for (int i = 0; i < pCtx->iArgc; i++)
- RTPrintf("argv[%d]=%s\n", i, pCtx->ppaArgv[i]);
-#endif
- if (!(uFlags & CTLCMDCTX_FLAGS_SESSION_ANONYMOUS))
+ if ( !(pCtx->pCmdDef->fCmdCtx & GCTLCMDCTX_F_SESSION_ANONYMOUS)
+ && !pCtx->fDetachGuestSession)
{
- if (pCtx->strUsername.isEmpty())
- rcExit = errorSyntaxEx(USAGE_GUESTCONTROL, uUsage, "No user name specified!");
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Closing guest session ...\n");
+
+ CHECK_ERROR(pCtx->pGuestSession, Close());
}
+ else if ( pCtx->fDetachGuestSession
+ && pCtx->cVerbose > 1)
+ RTPrintf("Guest session detached\n");
+
+ pCtx->pGuestSession.setNull();
}
- if (rcExit == RTEXITCODE_SUCCESS)
+ /*
+ * Close the VM session.
+ */
+ if (pCtx->fLockedVmSession)
{
- /*
- * Build up a reasonable guest session name. Useful for identifying
- * a specific session when listing / searching for them.
- */
- char *pszSessionName;
- if (0 >= RTStrAPrintf(&pszSessionName,
- "[%RU32] VBoxManage Guest Control [%s] - %s",
- RTProcSelf(), pszNameOrId, pszCmd))
- return RTMsgErrorExit(RTEXITCODE_FAILURE, "No enough memory for session name\n");
+ Assert(pCtx->pArg->session.isNotNull());
+ CHECK_ERROR(pCtx->pArg->session, UnlockMachine());
+ pCtx->fLockedVmSession = false;
+ }
+}
- do
- {
- /* Open a session for the VM. */
- CHECK_ERROR_BREAK(machine, LockMachine(pArg->session, LockType_Shared));
- /* Get the associated console. */
- ComPtr<IConsole> console;
- CHECK_ERROR_BREAK(pArg->session, COMGETTER(Console)(console.asOutParam()));
- /* ... and session machine. */
- ComPtr<IMachine> sessionMachine;
- CHECK_ERROR_BREAK(pArg->session, COMGETTER(Machine)(sessionMachine.asOutParam()));
- /* Get IGuest interface. */
- CHECK_ERROR_BREAK(console, COMGETTER(Guest)(pCtx->pGuest.asOutParam()));
- if (!(uFlags & CTLCMDCTX_FLAGS_SESSION_ANONYMOUS))
- {
- if (pCtx->fVerbose)
- RTPrintf("Opening guest session as user '%s' ...\n", pCtx->strUsername.c_str());
- /* Open a guest session. */
- Assert(!pCtx->pGuest.isNull());
- CHECK_ERROR_BREAK(pCtx->pGuest, CreateSession(Bstr(pCtx->strUsername).raw(),
- Bstr(pCtx->strPassword).raw(),
- Bstr(pCtx->strDomain).raw(),
- Bstr(pszSessionName).raw(),
- pCtx->pGuestSession.asOutParam()));
- /*
- * Wait for guest session to start.
- */
- if (pCtx->fVerbose)
- RTPrintf("Waiting for guest session to start ...\n");
-
- com::SafeArray<GuestSessionWaitForFlag_T> aSessionWaitFlags;
- aSessionWaitFlags.push_back(GuestSessionWaitForFlag_Start);
- GuestSessionWaitResult_T sessionWaitResult;
- CHECK_ERROR_BREAK(pCtx->pGuestSession, WaitForArray(ComSafeArrayAsInParam(aSessionWaitFlags),
- /** @todo Make session handling timeouts configurable. */
- 30 * 1000, &sessionWaitResult));
-
- if ( sessionWaitResult == GuestSessionWaitResult_Start
- /* Note: This might happen when Guest Additions < 4.3 are installed which don't
- * support dedicated guest sessions. */
- || sessionWaitResult == GuestSessionWaitResult_WaitFlagNotSupported)
- {
- CHECK_ERROR_BREAK(pCtx->pGuestSession, COMGETTER(Id)(&pCtx->uSessionID));
- if (pCtx->fVerbose)
- RTPrintf("Guest session (ID %RU32) has been started\n", pCtx->uSessionID);
- }
- else
- {
- GuestSessionStatus_T sessionStatus;
- CHECK_ERROR_BREAK(pCtx->pGuestSession, COMGETTER(Status)(&sessionStatus));
- rcExit = RTMsgErrorExit(RTEXITCODE_FAILURE, "Error starting guest session (current status is: %s)\n",
- ctrlSessionStatusToText(sessionStatus));
- break;
- }
- }
- if ( SUCCEEDED(rc)
- && !(uFlags & CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER))
- {
- ctrlSignalHandlerInstall();
- }
- } while (0);
+/*
+ *
+ *
+ * Guest Control Command Handling.
+ * Guest Control Command Handling.
+ * Guest Control Command Handling.
+ * Guest Control Command Handling.
+ * Guest Control Command Handling.
+ *
+ *
+ */
+
+
+/** @name EXITCODEEXEC_XXX - Special run exit codes.
+ *
+ * Special exit codes for returning errors/information of a started guest
+ * process to the command line VBoxManage was started from. Useful for e.g.
+ * scripting.
+ *
+ * ASSUMING that all platforms have at least 7-bits for the exit code we can do
+ * the following mapping:
+ * - Guest exit code 0 is mapped to 0 on the host.
+ * - Guest exit codes 1 thru 93 (0x5d) are displaced by 32, so that 1
+ * becomes 33 (0x21) on the host and 93 becomes 125 (0x7d) on the host.
+ * - Guest exit codes 94 (0x5e) and above are mapped to 126 (0x5e).
+ *
+ * We ASSUME that all VBoxManage status codes are in the range 0 thru 32.
+ *
+ * @note These are frozen as of 4.1.0.
+ * @note The guest exit code mappings was introduced with 5.0 and the 'run'
+ * command, they are/was not supported by 'exec'.
+ * @sa gctlRunCalculateExitCode
+ */
+/** Process exited normally but with an exit code <> 0. */
+#define EXITCODEEXEC_CODE ((RTEXITCODE)16)
+#define EXITCODEEXEC_FAILED ((RTEXITCODE)17)
+#define EXITCODEEXEC_TERM_SIGNAL ((RTEXITCODE)18)
+#define EXITCODEEXEC_TERM_ABEND ((RTEXITCODE)19)
+#define EXITCODEEXEC_TIMEOUT ((RTEXITCODE)20)
+#define EXITCODEEXEC_DOWN ((RTEXITCODE)21)
+/** Execution was interrupt by user (ctrl-c). */
+#define EXITCODEEXEC_CANCELED ((RTEXITCODE)22)
+/** The first mapped guest (non-zero) exit code. */
+#define EXITCODEEXEC_MAPPED_FIRST 33
+/** The last mapped guest (non-zero) exit code value (inclusive). */
+#define EXITCODEEXEC_MAPPED_LAST 125
+/** The number of exit codes from EXITCODEEXEC_MAPPED_FIRST to
+ * EXITCODEEXEC_MAPPED_LAST. This is also the highest guest exit code number
+ * we're able to map. */
+#define EXITCODEEXEC_MAPPED_RANGE (93)
+/** The guest exit code displacement value. */
+#define EXITCODEEXEC_MAPPED_DISPLACEMENT 32
+/** The guest exit code was too big to be mapped. */
+#define EXITCODEEXEC_MAPPED_BIG ((RTEXITCODE)126)
+/** @} */
+
+/**
+ * Calculates the exit code of VBoxManage.
+ *
+ * @returns The exit code to return.
+ * @param enmStatus The guest process status.
+ * @param uExitCode The associated guest process exit code (where
+ * applicable).
+ * @param fReturnExitCodes Set if we're to use the 32-126 range for guest
+ * exit codes.
+ */
+static RTEXITCODE gctlRunCalculateExitCode(ProcessStatus_T enmStatus, ULONG uExitCode, bool fReturnExitCodes)
+{
+ int vrc = RTEXITCODE_SUCCESS;
+ switch (enmStatus)
+ {
+ case ProcessStatus_TerminatedNormally:
+ if (uExitCode == 0)
+ return RTEXITCODE_SUCCESS;
+ if (!fReturnExitCodes)
+ return EXITCODEEXEC_CODE;
+ if (uExitCode <= EXITCODEEXEC_MAPPED_RANGE)
+ return (RTEXITCODE) (uExitCode + EXITCODEEXEC_MAPPED_DISPLACEMENT);
+ return EXITCODEEXEC_MAPPED_BIG;
- if (FAILED(rc))
- rcExit = RTEXITCODE_FAILURE;
+ case ProcessStatus_TerminatedAbnormally:
+ return EXITCODEEXEC_TERM_ABEND;
+ case ProcessStatus_TerminatedSignal:
+ return EXITCODEEXEC_TERM_SIGNAL;
- RTStrFree(pszSessionName);
- }
+#if 0 /* see caller! */
+ case ProcessStatus_TimedOutKilled:
+ return EXITCODEEXEC_TIMEOUT;
+ case ProcessStatus_Down:
+ return EXITCODEEXEC_DOWN; /* Service/OS is stopping, process was killed. */
+ case ProcessStatus_Error:
+ return EXITCODEEXEC_FAILED;
- if (rcExit == RTEXITCODE_SUCCESS)
- {
- pCtx->handlerArg = *pArg;
- pCtx->uFlags = uFlags;
- }
- else /* Clean up on failure. */
- ctrlUninitVM(pCtx, uFlags);
+ /* The following is probably for detached? */
+ case ProcessStatus_Starting:
+ return RTEXITCODE_SUCCESS;
+ case ProcessStatus_Started:
+ return RTEXITCODE_SUCCESS;
+ case ProcessStatus_Paused:
+ return RTEXITCODE_SUCCESS;
+ case ProcessStatus_Terminating:
+ return RTEXITCODE_SUCCESS; /** @todo ???? */
+#endif
- return rcExit;
+ default:
+ AssertMsgFailed(("Unknown exit status (%u/%u) from guest process returned!\n", enmStatus, uExitCode));
+ return RTEXITCODE_FAILURE;
+ }
}
+
/**
- * Prints the desired guest output to a stream.
+ * Pumps guest output to the host.
*
* @return IPRT status code.
* @param pProcess Pointer to appropriate process object.
- * @param pStrmOutput Where to write the data.
+ * @param hVfsIosDst Where to write the data.
* @param uHandle Handle where to read the data from.
- * @param uTimeoutMS Timeout (in ms) to wait for the operation to complete.
+ * @param cMsTimeout Timeout (in ms) to wait for the operation to
+ * complete.
*/
-static int ctrlExecPrintOutput(IProcess *pProcess, PRTSTREAM pStrmOutput,
- ULONG uHandle, ULONG uTimeoutMS)
+static int gctlRunPumpOutput(IProcess *pProcess, RTVFSIOSTREAM hVfsIosDst, ULONG uHandle, RTMSINTERVAL cMsTimeout)
{
AssertPtrReturn(pProcess, VERR_INVALID_POINTER);
- AssertPtrReturn(pStrmOutput, VERR_INVALID_POINTER);
+ Assert(hVfsIosDst != NIL_RTVFSIOSTREAM);
- int vrc = VINF_SUCCESS;
+ int vrc;
SafeArray<BYTE> aOutputData;
- HRESULT rc = pProcess->Read(uHandle, _64K, uTimeoutMS,
- ComSafeArrayAsOutParam(aOutputData));
- if (FAILED(rc))
- vrc = ctrlPrintError(pProcess, COM_IIDOF(IProcess));
- else
+ HRESULT hrc = pProcess->Read(uHandle, _64K, RT_MAX(cMsTimeout, 1), ComSafeArrayAsOutParam(aOutputData));
+ if (SUCCEEDED(hrc))
{
size_t cbOutputData = aOutputData.size();
- if (cbOutputData > 0)
+ if (cbOutputData == 0)
+ vrc = VINF_SUCCESS;
+ else
{
- BYTE *pBuf = aOutputData.raw();
- AssertPtr(pBuf);
- pBuf[cbOutputData - 1] = 0; /* Properly terminate buffer. */
+ BYTE const *pbBuf = aOutputData.raw();
+ AssertPtr(pbBuf);
- /** @todo implement the dos2unix/unix2dos conversions */
+ vrc = RTVfsIoStrmWrite(hVfsIosDst, pbBuf, cbOutputData, true /*fBlocking*/, NULL);
+ if (RT_FAILURE(vrc))
+ RTMsgError("Unable to write output, rc=%Rrc\n", vrc);
+ }
+ }
+ else
+ vrc = gctlPrintError(pProcess, COM_IIDOF(IProcess));
+ return vrc;
+}
- /*
- * If aOutputData is text data from the guest process' stdout or stderr,
- * it has a platform dependent line ending. So standardize on
- * Unix style, as RTStrmWrite does the LF -> CR/LF replacement on
- * Windows. Otherwise we end up with CR/CR/LF on Windows.
- */
- char *pszBufUTF8;
- vrc = RTStrCurrentCPToUtf8(&pszBufUTF8, (const char*)aOutputData.raw());
- if (RT_SUCCESS(vrc))
+/**
+ * Configures a host handle for pumping guest bits.
+ *
+ * @returns true if enabled and we successfully configured it.
+ * @param fEnabled Whether pumping this pipe is configured.
+ * @param enmHandle The IPRT standard handle designation.
+ * @param pszName The name for user messages.
+ * @param enmTransformation The transformation to apply.
+ * @param phVfsIos Where to return the resulting I/O stream handle.
+ */
+static bool gctlRunSetupHandle(bool fEnabled, RTHANDLESTD enmHandle, const char *pszName,
+ kStreamTransform enmTransformation, PRTVFSIOSTREAM phVfsIos)
+{
+ if (fEnabled)
+ {
+ int vrc = RTVfsIoStrmFromStdHandle(enmHandle, 0, true /*fLeaveOpen*/, phVfsIos);
+ if (RT_SUCCESS(vrc))
+ {
+ if (enmTransformation != kStreamTransform_None)
{
- cbOutputData = strlen(pszBufUTF8);
-
- ULONG cbOutputDataPrint = cbOutputData;
- for (char *s = pszBufUTF8, *d = s;
- s - pszBufUTF8 < (ssize_t)cbOutputData;
- s++, d++)
- {
- if (*s == '\r')
- {
- /* skip over CR, adjust destination */
- d--;
- cbOutputDataPrint--;
- }
- else if (s != d)
- *d = *s;
- }
-
- vrc = RTStrmWrite(pStrmOutput, pszBufUTF8, cbOutputDataPrint);
- if (RT_FAILURE(vrc))
- RTMsgError("Unable to write output, rc=%Rrc\n", vrc);
-
- RTStrFree(pszBufUTF8);
+ RTMsgWarning("Unsupported %s line ending conversion", pszName);
+ /** @todo Implement dos2unix and unix2dos stream filters. */
}
- else
- RTMsgError("Unable to convert output, rc=%Rrc\n", vrc);
+ return true;
}
+ RTMsgWarning("Error getting %s handle: %Rrc", pszName, vrc);
}
-
- return vrc;
+ return false;
}
+
/**
* Returns the remaining time (in ms) based on the start time and a set
* timeout value. Returns RT_INDEFINITE_WAIT if no timeout was specified.
@@ -1124,7 +1272,7 @@ static int ctrlExecPrintOutput(IProcess *pProcess, PRTSTREAM pStrmOutput,
* @param u64StartMs Start time (in ms).
* @param cMsTimeout Timeout value (in ms).
*/
-inline RTMSINTERVAL ctrlExecGetRemainingTime(uint64_t u64StartMs, RTMSINTERVAL cMsTimeout)
+static RTMSINTERVAL gctlRunGetRemainingTime(uint64_t u64StartMs, RTMSINTERVAL cMsTimeout)
{
if (!cMsTimeout || cMsTimeout == RT_INDEFINITE_WAIT) /* If no timeout specified, wait forever. */
return RT_INDEFINITE_WAIT;
@@ -1136,49 +1284,73 @@ inline RTMSINTERVAL ctrlExecGetRemainingTime(uint64_t u64StartMs, RTMSINTERVAL c
return cMsTimeout - (RTMSINTERVAL)u64ElapsedMs;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
+/**
+ * Common handler for the 'run' and 'start' commands.
+ *
+ * @returns Command exit code.
+ * @param pCtx Guest session context.
+ * @param argc The argument count.
+ * @param argv The argument vector for this command.
+ * @param fRunCmd Set if it's 'run' clear if 'start'.
+ * @param fHelp The help flag for the command.
+ */
+static RTEXITCODE gctlHandleRunCommon(PGCTLCMDCTX pCtx, int argc, char **argv, bool fRunCmd, uint32_t fHelp)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
/*
* Parse arguments.
*/
+ enum kGstCtrlRunOpt
+ {
+ kGstCtrlRunOpt_IgnoreOrphanedProcesses = 1000,
+ kGstCtrlRunOpt_NoProfile,
+ kGstCtrlRunOpt_Dos2Unix,
+ kGstCtrlRunOpt_Unix2Dos,
+ kGstCtrlRunOpt_WaitForStdOut,
+ kGstCtrlRunOpt_NoWaitForStdOut,
+ kGstCtrlRunOpt_WaitForStdErr,
+ kGstCtrlRunOpt_NoWaitForStdErr
+ };
static const RTGETOPTDEF s_aOptions[] =
{
- { "--dos2unix", GETOPTDEF_EXEC_DOS2UNIX, RTGETOPT_REQ_NOTHING },
- { "--environment", 'e', RTGETOPT_REQ_STRING },
- { "--flags", 'f', RTGETOPT_REQ_STRING },
- { "--ignore-operhaned-processes", GETOPTDEF_EXEC_IGNOREORPHANEDPROCESSES, RTGETOPT_REQ_NOTHING },
- { "--image", 'i', RTGETOPT_REQ_STRING },
- { "--no-profile", GETOPTDEF_EXEC_NO_PROFILE, RTGETOPT_REQ_NOTHING },
+ GCTLCMD_COMMON_OPTION_DEFS()
+ { "--putenv", 'E', RTGETOPT_REQ_STRING },
+ { "--exe", 'e', RTGETOPT_REQ_STRING },
{ "--timeout", 't', RTGETOPT_REQ_UINT32 },
- { "--unix2dos", GETOPTDEF_EXEC_UNIX2DOS, RTGETOPT_REQ_NOTHING },
- { "--wait-exit", GETOPTDEF_EXEC_WAITFOREXIT, RTGETOPT_REQ_NOTHING },
- { "--wait-stdout", GETOPTDEF_EXEC_WAITFORSTDOUT, RTGETOPT_REQ_NOTHING },
- { "--wait-stderr", GETOPTDEF_EXEC_WAITFORSTDERR, RTGETOPT_REQ_NOTHING }
+ { "--unquoted-args", 'u', RTGETOPT_REQ_NOTHING },
+ { "--ignore-operhaned-processes", kGstCtrlRunOpt_IgnoreOrphanedProcesses, RTGETOPT_REQ_NOTHING },
+ { "--no-profile", kGstCtrlRunOpt_NoProfile, RTGETOPT_REQ_NOTHING },
+ /* run only: 6 - options */
+ { "--dos2unix", kGstCtrlRunOpt_Dos2Unix, RTGETOPT_REQ_NOTHING },
+ { "--unix2dos", kGstCtrlRunOpt_Unix2Dos, RTGETOPT_REQ_NOTHING },
+ { "--no-wait-stdout", kGstCtrlRunOpt_NoWaitForStdOut, RTGETOPT_REQ_NOTHING },
+ { "--wait-stdout", kGstCtrlRunOpt_WaitForStdOut, RTGETOPT_REQ_NOTHING },
+ { "--no-wait-stderr", kGstCtrlRunOpt_NoWaitForStdErr, RTGETOPT_REQ_NOTHING },
+ { "--wait-stderr", kGstCtrlRunOpt_WaitForStdErr, RTGETOPT_REQ_NOTHING },
};
-#ifdef DEBUG_andy
- RTPrintf("first=%d\n", pCtx->iFirstArgc);
- for (int i=0; i<pCtx->iArgc;i++)
- RTPrintf("\targv[%d]=%s\n", i, pCtx->ppaArgv[i]);
-#endif
+ /** @todo stdin handling. */
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv, s_aOptions, RT_ELEMENTS(s_aOptions),
- pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
-
- Utf8Str strCmd;
- com::SafeArray<ProcessCreateFlag_T> aCreateFlags;
- com::SafeArray<ProcessWaitForFlag_T> aWaitFlags;
- com::SafeArray<IN_BSTR> aArgs;
- com::SafeArray<IN_BSTR> aEnv;
- RTMSINTERVAL cMsTimeout = 0;
- OUTPUTTYPE eOutputType = OUTPUTTYPE_UNDEFINED;
- bool fDetached = true;
- int vrc = VINF_SUCCESS;
+ size_t cOptions =
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions) - (fRunCmd ? 0 : 6),
+ 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+
+ com::SafeArray<ProcessCreateFlag_T> aCreateFlags;
+ com::SafeArray<ProcessWaitForFlag_T> aWaitFlags;
+ com::SafeArray<IN_BSTR> aArgs;
+ com::SafeArray<IN_BSTR> aEnv;
+ const char * pszImage = NULL;
+ bool fWaitForStdOut = fRunCmd;
+ bool fWaitForStdErr = fRunCmd;
+ RTVFSIOSTREAM hVfsStdOut = NIL_RTVFSIOSTREAM;
+ RTVFSIOSTREAM hVfsStdErr = NIL_RTVFSIOSTREAM;
+ enum kStreamTransform enmStdOutTransform = kStreamTransform_None;
+ enum kStreamTransform enmStdErrTransform = kStreamTransform_None;
+ RTMSINTERVAL cMsTimeout = 0;
try
{
@@ -1186,45 +1358,35 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
* when relying on its overall exit code. */
aWaitFlags.push_back(ProcessWaitForFlag_Start);
- while ( (ch = RTGetOpt(&GetState, &ValueUnion))
- && RT_SUCCESS(vrc))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
- case GETOPTDEF_EXEC_DOS2UNIX:
- if (eOutputType != OUTPUTTYPE_UNDEFINED)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
- "More than one output type (dos2unix/unix2dos) specified!");
- eOutputType = OUTPUTTYPE_DOS2UNIX;
- break;
-
- case 'e': /* Environment */
- {
- char **papszArg;
- int cArgs;
-
- vrc = RTGetOptArgvFromString(&papszArg, &cArgs, ValueUnion.psz, NULL);
- if (RT_FAILURE(vrc))
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
- "Failed to parse environment value, rc=%Rrc", vrc);
- for (int j = 0; j < cArgs; j++)
- aEnv.push_back(Bstr(papszArg[j]).raw());
-
- RTGetOptArgvFree(papszArg);
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
+ case 'E':
+ if ( ValueUnion.psz[0] == '\0'
+ || ValueUnion.psz[0] == '=')
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RUN,
+ "Invalid argument variable[=value]: '%s'", ValueUnion.psz);
+ aEnv.push_back(Bstr(ValueUnion.psz).raw());
break;
- }
- case GETOPTDEF_EXEC_IGNOREORPHANEDPROCESSES:
+ case kGstCtrlRunOpt_IgnoreOrphanedProcesses:
aCreateFlags.push_back(ProcessCreateFlag_IgnoreOrphanedProcesses);
break;
- case GETOPTDEF_EXEC_NO_PROFILE:
+ case kGstCtrlRunOpt_NoProfile:
aCreateFlags.push_back(ProcessCreateFlag_NoProfile);
break;
- case 'i':
- strCmd = ValueUnion.psz;
+ case 'e':
+ pszImage = ValueUnion.psz;
+ break;
+
+ case 'u':
+ aCreateFlags.push_back(ProcessCreateFlag_UnquotedArguments);
break;
/** @todo Add a hidden flag. */
@@ -1233,153 +1395,157 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
cMsTimeout = ValueUnion.u32;
break;
- case GETOPTDEF_EXEC_UNIX2DOS:
- if (eOutputType != OUTPUTTYPE_UNDEFINED)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
- "More than one output type (dos2unix/unix2dos) specified!");
- eOutputType = OUTPUTTYPE_UNIX2DOS;
+ /* run only options: */
+ case kGstCtrlRunOpt_Dos2Unix:
+ Assert(fRunCmd);
+ enmStdErrTransform = enmStdOutTransform = kStreamTransform_Dos2Unix;
break;
-
- case GETOPTDEF_EXEC_WAITFOREXIT:
- aWaitFlags.push_back(ProcessWaitForFlag_Terminate);
- fDetached = false;
+ case kGstCtrlRunOpt_Unix2Dos:
+ Assert(fRunCmd);
+ enmStdErrTransform = enmStdOutTransform = kStreamTransform_Unix2Dos;
break;
- case GETOPTDEF_EXEC_WAITFORSTDOUT:
- aCreateFlags.push_back(ProcessCreateFlag_WaitForStdOut);
- aWaitFlags.push_back(ProcessWaitForFlag_StdOut);
- fDetached = false;
+ case kGstCtrlRunOpt_WaitForStdOut:
+ Assert(fRunCmd);
+ fWaitForStdOut = true;
+ break;
+ case kGstCtrlRunOpt_NoWaitForStdOut:
+ Assert(fRunCmd);
+ fWaitForStdOut = false;
break;
- case GETOPTDEF_EXEC_WAITFORSTDERR:
- aCreateFlags.push_back(ProcessCreateFlag_WaitForStdErr);
- aWaitFlags.push_back(ProcessWaitForFlag_StdErr);
- fDetached = false;
+ case kGstCtrlRunOpt_WaitForStdErr:
+ Assert(fRunCmd);
+ fWaitForStdErr = true;
+ break;
+ case kGstCtrlRunOpt_NoWaitForStdErr:
+ Assert(fRunCmd);
+ fWaitForStdErr = false;
break;
case VINF_GETOPT_NOT_OPTION:
- if (aArgs.size() == 0 && strCmd.isEmpty())
- strCmd = ValueUnion.psz;
- else
- aArgs.push_back(Bstr(ValueUnion.psz).raw());
+ aArgs.push_back(Bstr(ValueUnion.psz).raw());
+ if (!pszImage)
+ {
+ Assert(aArgs.size() == 1);
+ pszImage = ValueUnion.psz;
+ }
break;
default:
- /* Note: Necessary for handling non-options (after --) which
- * contain a single dash, e.g. "-- foo.exe -s". */
- if (GetState.argc == GetState.iNext)
- aArgs.push_back(Bstr(ValueUnion.psz).raw());
- else
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC, ch, &ValueUnion);
- break;
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RUN, ch, &ValueUnion);
} /* switch */
} /* while RTGetOpt */
+
+ /* Must have something to execute. */
+ if (!pszImage || !*pszImage)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RUN, "No executable specified!");
+
+ /*
+ * Finalize process creation and wait flags and input/output streams.
+ */
+ if (!fRunCmd)
+ {
+ aCreateFlags.push_back(ProcessCreateFlag_WaitForProcessStartOnly);
+ Assert(!fWaitForStdOut);
+ Assert(!fWaitForStdErr);
+ }
+ else
+ {
+ aWaitFlags.push_back(ProcessWaitForFlag_Terminate);
+ fWaitForStdOut = gctlRunSetupHandle(fWaitForStdOut, RTHANDLESTD_OUTPUT, "stdout", enmStdOutTransform, &hVfsStdOut);
+ if (fWaitForStdOut)
+ {
+ aCreateFlags.push_back(ProcessCreateFlag_WaitForStdOut);
+ aWaitFlags.push_back(ProcessWaitForFlag_StdOut);
+ }
+ fWaitForStdErr = gctlRunSetupHandle(fWaitForStdErr, RTHANDLESTD_ERROR, "stderr", enmStdErrTransform, &hVfsStdErr);
+ if (fWaitForStdErr)
+ {
+ aCreateFlags.push_back(ProcessCreateFlag_WaitForStdErr);
+ aWaitFlags.push_back(ProcessWaitForFlag_StdErr);
+ }
+ }
}
catch (std::bad_alloc &)
{
- vrc = VERR_NO_MEMORY;
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "VERR_NO_MEMORY\n");
}
- if (RT_FAILURE(vrc))
- return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to initialize, rc=%Rrc\n", vrc);
-
- if (strCmd.isEmpty())
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
- "No command to execute specified!");
-
- /** @todo Any output conversion not supported yet! */
- if (eOutputType != OUTPUTTYPE_UNDEFINED)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_EXEC,
- "Output conversion not implemented yet!");
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
- RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
HRESULT rc;
try
{
do
{
- /* Adjust process creation flags if we don't want to wait for process termination. */
- if (fDetached)
- aCreateFlags.push_back(ProcessCreateFlag_WaitForProcessStartOnly);
-
/* Get current time stamp to later calculate rest of timeout left. */
- uint64_t u64StartMS = RTTimeMilliTS();
+ uint64_t msStart = RTTimeMilliTS();
- if (pCtx->fVerbose)
+ /*
+ * Create the process.
+ */
+ if (pCtx->cVerbose > 1)
{
if (cMsTimeout == 0)
RTPrintf("Starting guest process ...\n");
else
RTPrintf("Starting guest process (within %ums)\n", cMsTimeout);
}
-
- /*
- * Execute the process.
- */
ComPtr<IGuestProcess> pProcess;
- CHECK_ERROR_BREAK(pCtx->pGuestSession, ProcessCreate(Bstr(strCmd).raw(),
+ CHECK_ERROR_BREAK(pCtx->pGuestSession, ProcessCreate(Bstr(pszImage).raw(),
ComSafeArrayAsInParam(aArgs),
ComSafeArrayAsInParam(aEnv),
ComSafeArrayAsInParam(aCreateFlags),
- ctrlExecGetRemainingTime(u64StartMS, cMsTimeout),
+ gctlRunGetRemainingTime(msStart, cMsTimeout),
pProcess.asOutParam()));
/*
- * Explicitly wait for the guest process to be in a started
- * state.
+ * Explicitly wait for the guest process to be in a started state.
*/
com::SafeArray<ProcessWaitForFlag_T> aWaitStartFlags;
aWaitStartFlags.push_back(ProcessWaitForFlag_Start);
ProcessWaitResult_T waitResult;
CHECK_ERROR_BREAK(pProcess, WaitForArray(ComSafeArrayAsInParam(aWaitStartFlags),
- ctrlExecGetRemainingTime(u64StartMS, cMsTimeout), &waitResult));
- bool fCompleted = false;
+ gctlRunGetRemainingTime(msStart, cMsTimeout), &waitResult));
ULONG uPID = 0;
CHECK_ERROR_BREAK(pProcess, COMGETTER(PID)(&uPID));
- if (!fDetached && pCtx->fVerbose)
- {
- RTPrintf("Process '%s' (PID %RU32) started\n",
- strCmd.c_str(), uPID);
- }
- else if (fDetached) /** @todo Introduce a --quiet option for not printing this. */
+ if (fRunCmd && pCtx->cVerbose > 1)
+ RTPrintf("Process '%s' (PID %RU32) started\n", pszImage, uPID);
+ else if (!fRunCmd && pCtx->cVerbose)
{
/* Just print plain PID to make it easier for scripts
* invoking VBoxManage. */
RTPrintf("[%RU32 - Session %RU32]\n", uPID, pCtx->uSessionID);
}
- vrc = RTStrmSetMode(g_pStdOut, 1 /* Binary mode */, -1 /* Code set, unchanged */);
- if (RT_FAILURE(vrc))
- RTMsgError("Unable to set stdout's binary mode, rc=%Rrc\n", vrc);
- vrc = RTStrmSetMode(g_pStdErr, 1 /* Binary mode */, -1 /* Code set, unchanged */);
- if (RT_FAILURE(vrc))
- RTMsgError("Unable to set stderr's binary mode, rc=%Rrc\n", vrc);
-
- /* Wait for process to exit ... */
- RTMSINTERVAL cMsTimeLeft = 1; /* Will be calculated. */
- bool fReadStdOut, fReadStdErr;
- fReadStdOut = fReadStdErr = false;
+ /*
+ * Wait for process to exit/start...
+ */
+ RTMSINTERVAL cMsTimeLeft = 1; /* Will be calculated. */
+ bool fReadStdOut = false;
+ bool fReadStdErr = false;
+ bool fCompleted = false;
+ bool fCompletedStartCmd = false;
+ int vrc = VINF_SUCCESS;
while ( !fCompleted
- && !fDetached
- && cMsTimeLeft != 0)
+ && cMsTimeLeft > 0)
{
- cMsTimeLeft = ctrlExecGetRemainingTime(u64StartMS, cMsTimeout);
+ cMsTimeLeft = gctlRunGetRemainingTime(msStart, cMsTimeout);
CHECK_ERROR_BREAK(pProcess, WaitForArray(ComSafeArrayAsInParam(aWaitFlags),
- 500 /* ms */, &waitResult));
+ RT_MIN(500 /*ms*/, RT_MAX(cMsTimeLeft, 1 /*ms*/)),
+ &waitResult));
switch (waitResult)
{
case ProcessWaitResult_Start:
- {
- /* We're done here if we don't want to wait for termination. */
- if (fDetached)
- fCompleted = true;
-
+ fCompletedStartCmd = fCompleted = !fRunCmd; /* Only wait for startup if the 'start' command. */
break;
- }
case ProcessWaitResult_StdOut:
fReadStdOut = true;
break;
@@ -1387,94 +1553,135 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
fReadStdErr = true;
break;
case ProcessWaitResult_Terminate:
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Process terminated\n");
/* Process terminated, we're done. */
fCompleted = true;
break;
case ProcessWaitResult_WaitFlagNotSupported:
- {
/* The guest does not support waiting for stdout/err, so
* yield to reduce the CPU load due to busy waiting. */
- RTThreadYield(); /* Optional, don't check rc. */
-
- /* Try both, stdout + stderr. */
+ RTThreadYield();
fReadStdOut = fReadStdErr = true;
break;
- }
case ProcessWaitResult_Timeout:
- /* Fall through is intentional. */
- default:
- /* Ignore all other results, let the timeout expire */
+ {
+ /** @todo It is really unclear whether we will get stuck with the timeout
+ * result here if the guest side times out the process and fails to
+ * kill the process... To be on the save side, double the IPC and
+ * check the process status every time we time out. */
+ ProcessStatus_T enmProcStatus;
+ CHECK_ERROR_BREAK(pProcess, COMGETTER(Status)(&enmProcStatus));
+ if ( enmProcStatus == ProcessStatus_TimedOutKilled
+ || enmProcStatus == ProcessStatus_TimedOutAbnormally)
+ fCompleted = true;
+ fReadStdOut = fReadStdErr = true;
+ break;
+ }
+ case ProcessWaitResult_Status:
+ /* ignore. */
+ break;
+ case ProcessWaitResult_Error:
+ /* waitFor is dead in the water, I think, so better leave the loop. */
+ vrc = VERR_CALLBACK_RETURN;
break;
+
+ case ProcessWaitResult_StdIn: AssertFailed(); /* did ask for this! */ break;
+ case ProcessWaitResult_None: AssertFailed(); /* used. */ break;
+ default: AssertFailed(); /* huh? */ break;
}
if (g_fGuestCtrlCanceled)
break;
- if (fReadStdOut) /* Do we need to fetch stdout data? */
+ /*
+ * Pump output as needed.
+ */
+ if (fReadStdOut)
{
- cMsTimeLeft = ctrlExecGetRemainingTime(u64StartMS, cMsTimeout);
- vrc = ctrlExecPrintOutput(pProcess, g_pStdOut,
- 1 /* StdOut */, cMsTimeLeft);
+ cMsTimeLeft = gctlRunGetRemainingTime(msStart, cMsTimeout);
+ int vrc2 = gctlRunPumpOutput(pProcess, hVfsStdOut, 1 /* StdOut */, cMsTimeLeft);
+ if (RT_FAILURE(vrc2) && RT_SUCCESS(vrc))
+ vrc = vrc2;
fReadStdOut = false;
}
-
- if (fReadStdErr) /* Do we need to fetch stdout data? */
+ if (fReadStdErr)
{
- cMsTimeLeft = ctrlExecGetRemainingTime(u64StartMS, cMsTimeout);
- vrc = ctrlExecPrintOutput(pProcess, g_pStdErr,
- 2 /* StdErr */, cMsTimeLeft);
+ cMsTimeLeft = gctlRunGetRemainingTime(msStart, cMsTimeout);
+ int vrc2 = gctlRunPumpOutput(pProcess, hVfsStdErr, 2 /* StdErr */, cMsTimeLeft);
+ if (RT_FAILURE(vrc2) && RT_SUCCESS(vrc))
+ vrc = vrc2;
fReadStdErr = false;
}
-
if ( RT_FAILURE(vrc)
|| g_fGuestCtrlCanceled)
break;
- /* Did we run out of time? */
- if ( cMsTimeout
- && RTTimeMilliTS() - u64StartMS > cMsTimeout)
- break;
-
+ /*
+ * Process events before looping.
+ */
NativeEventQueue::getMainEventQueue()->processEventQueue(0);
-
} /* while */
- if (!fDetached)
+ /*
+ * Report status back to the user.
+ */
+ if (g_fGuestCtrlCanceled)
{
- /* Report status back to the user. */
- if ( fCompleted
- && !g_fGuestCtrlCanceled)
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Process execution aborted!\n");
+ rcExit = EXITCODEEXEC_CANCELED;
+ }
+ else if (fCompletedStartCmd)
+ {
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Process successfully started!\n");
+ rcExit = RTEXITCODE_SUCCESS;
+ }
+ else if (fCompleted)
+ {
+ ProcessStatus_T procStatus;
+ CHECK_ERROR_BREAK(pProcess, COMGETTER(Status)(&procStatus));
+ if ( procStatus == ProcessStatus_TerminatedNormally
+ || procStatus == ProcessStatus_TerminatedAbnormally
+ || procStatus == ProcessStatus_TerminatedSignal)
{
+ LONG lExitCode;
+ CHECK_ERROR_BREAK(pProcess, COMGETTER(ExitCode)(&lExitCode));
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Exit code=%u (Status=%u [%s])\n",
+ lExitCode, procStatus, gctlProcessStatusToText(procStatus));
- {
- ProcessStatus_T procStatus;
- CHECK_ERROR_BREAK(pProcess, COMGETTER(Status)(&procStatus));
- if ( procStatus == ProcessStatus_TerminatedNormally
- || procStatus == ProcessStatus_TerminatedAbnormally
- || procStatus == ProcessStatus_TerminatedSignal)
- {
- LONG exitCode;
- CHECK_ERROR_BREAK(pProcess, COMGETTER(ExitCode)(&exitCode));
- if (pCtx->fVerbose)
- RTPrintf("Exit code=%u (Status=%u [%s])\n",
- exitCode, procStatus, ctrlProcessStatusToText(procStatus));
-
- rcExit = (RTEXITCODE)ctrlExecProcessStatusToExitCode(procStatus, exitCode);
- }
- else if (pCtx->fVerbose)
- RTPrintf("Process now is in status [%s]\n", ctrlProcessStatusToText(procStatus));
- }
+ rcExit = gctlRunCalculateExitCode(procStatus, lExitCode, true /*fReturnExitCodes*/);
+ }
+ else if ( procStatus == ProcessStatus_TimedOutKilled
+ || procStatus == ProcessStatus_TimedOutAbnormally)
+ {
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Process timed out (guest side) and\n",
+ procStatus == ProcessStatus_TimedOutAbnormally
+ ? " failed to terminate so far" : " was terminated");
+ rcExit = EXITCODEEXEC_TIMEOUT;
}
else
{
- if (pCtx->fVerbose)
- RTPrintf("Process execution aborted!\n");
-
- rcExit = (RTEXITCODE)EXITCODEEXEC_TERM_ABEND;
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Process now is in status [%s] (unexpected)\n", gctlProcessStatusToText(procStatus));
+ rcExit = RTEXITCODE_FAILURE;
}
}
+ else if (RT_FAILURE_NP(vrc))
+ {
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Process monitor loop quit with vrc=%Rrc\n", vrc);
+ rcExit = RTEXITCODE_FAILURE;
+ }
+ else
+ {
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Process monitor loop timed out\n");
+ rcExit = EXITCODEEXEC_TIMEOUT;
+ }
} while (0);
}
@@ -1484,46 +1691,51 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
}
/*
- * Decide what to do with the guest session. If we started a
- * detached guest process (that is, without waiting for it to exit),
- * don't close the guest session it is part of.
+ * Decide what to do with the guest session.
+ *
+ * If it's the 'start' command where detach the guest process after
+ * starting, don't close the guest session it is part of, except on
+ * failure or ctrl-c.
+ *
+ * For the 'run' command the guest process quits with us.
*/
- bool fCloseSession = false;
- if (SUCCEEDED(rc))
- {
- /*
- * Only close the guest session if we waited for the guest
- * process to exit. Otherwise we wouldn't have any chance to
- * access and/or kill detached guest process lateron.
- */
- fCloseSession = !fDetached;
+ if (!fRunCmd && SUCCEEDED(rc) && !g_fGuestCtrlCanceled)
+ pCtx->fDetachGuestSession = true;
- /*
- * If execution was aborted from the host side (signal handler),
- * close the guest session in any case.
- */
- if (g_fGuestCtrlCanceled)
- fCloseSession = true;
- }
- else /* Close session on error. */
- fCloseSession = true;
+ /* Make sure we return failure on failure. */
+ if (FAILED(rc) && rcExit == RTEXITCODE_SUCCESS)
+ rcExit = RTEXITCODE_FAILURE;
+ return rcExit;
+}
- if (!fCloseSession)
- pCtx->uFlags |= CTLCMDCTX_FLAGS_SESSION_DETACH;
- if ( rcExit == RTEXITCODE_SUCCESS
- && FAILED(rc))
- {
- /* Make sure an appropriate exit code is set on error. */
- rcExit = RTEXITCODE_FAILURE;
- }
+static DECLCALLBACK(RTEXITCODE) gctlHandleRun(PGCTLCMDCTX pCtx, int argc, char **argv)
+{
+ return gctlHandleRunCommon(pCtx, argc, argv, true /*fRunCmd*/, USAGE_GSTCTRL_RUN);
+}
- return rcExit;
+
+static DECLCALLBACK(RTEXITCODE) gctlHandleStart(PGCTLCMDCTX pCtx, int argc, char **argv)
+{
+ return gctlHandleRunCommon(pCtx, argc, argv, false /*fRunCmd*/, USAGE_GSTCTRL_START);
}
+
+/** bird: This is just a code conversion tool, flags are better defined by
+ * the preprocessor, in general. But the code was using obsoleted
+ * main flags for internal purposes (in a uint32_t) without passing them
+ * along, or it seemed that way. Enum means compiler checks types. */
+enum gctlCopyFlags
+{
+ kGctlCopyFlags_None = 0,
+ kGctlCopyFlags_Recursive = RT_BIT(1),
+ kGctlCopyFlags_FollowLinks = RT_BIT(2)
+};
+
+
/**
* Creates a copy context structure which then can be used with various
- * guest control copy functions. Needs to be free'd with ctrlCopyContextFree().
+ * guest control copy functions. Needs to be free'd with gctlCopyContextFree().
*
* @return IPRT status code.
* @param pCtx Pointer to command context.
@@ -1533,7 +1745,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessExec(PGCTLCMDCTX pCtx)
* @param strSessionName Session name (only for identification purposes).
* @param ppContext Pointer which receives the allocated copy context.
*/
-static int ctrlCopyContextCreate(PGCTLCMDCTX pCtx, bool fDryRun, bool fHostToGuest,
+static int gctlCopyContextCreate(PGCTLCMDCTX pCtx, bool fDryRun, bool fHostToGuest,
const Utf8Str &strSessionName,
PCOPYCONTEXT *ppContext)
{
@@ -1563,7 +1775,7 @@ static int ctrlCopyContextCreate(PGCTLCMDCTX pCtx, bool fDryRun, bool fHostToGue
*
* @param pContext Pointer to copy context to free.
*/
-static void ctrlCopyContextFree(PCOPYCONTEXT pContext)
+static void gctlCopyContextFree(PCOPYCONTEXT pContext)
{
if (pContext)
delete pContext;
@@ -1583,7 +1795,7 @@ static void ctrlCopyContextFree(PCOPYCONTEXT pContext)
* @param ppszTranslated Pointer to the allocated, translated destination
* path. Must be free'd with RTStrFree().
*/
-static int ctrlCopyTranslatePath(const char *pszSourceRoot, const char *pszSource,
+static int gctlCopyTranslatePath(const char *pszSourceRoot, const char *pszSource,
const char *pszDest, char **ppszTranslated)
{
AssertPtrReturn(pszSourceRoot, VERR_INVALID_POINTER);
@@ -1677,7 +1889,7 @@ static int tstTranslatePath()
aTests[iTest].pszSourceRoot, aTests[iTest].pszSource, aTests[iTest].pszDest);
char *pszTranslated = NULL;
- int iResult = ctrlCopyTranslatePath(aTests[iTest].pszSourceRoot, aTests[iTest].pszSource,
+ int iResult = gctlCopyTranslatePath(aTests[iTest].pszSourceRoot, aTests[iTest].pszSource,
aTests[iTest].pszDest, &pszTranslated);
if (iResult != aTests[iTest].iResult)
{
@@ -1710,17 +1922,17 @@ static int tstTranslatePath()
* @param pContext Pointer to current copy control context.
* @param pszDir Directory to create.
*/
-static int ctrlCopyDirCreate(PCOPYCONTEXT pContext, const char *pszDir)
+static int gctlCopyDirCreate(PCOPYCONTEXT pContext, const char *pszDir)
{
AssertPtrReturn(pContext, VERR_INVALID_POINTER);
AssertPtrReturn(pszDir, VERR_INVALID_POINTER);
bool fDirExists;
- int vrc = ctrlCopyDirExists(pContext, pContext->fHostToGuest, pszDir, &fDirExists);
+ int vrc = gctlCopyDirExists(pContext, pContext->fHostToGuest, pszDir, &fDirExists);
if ( RT_SUCCESS(vrc)
&& fDirExists)
{
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
RTPrintf("Directory \"%s\" already exists\n", pszDir);
return VINF_SUCCESS;
}
@@ -1730,7 +1942,7 @@ static int ctrlCopyDirCreate(PCOPYCONTEXT pContext, const char *pszDir)
if (RT_FAILURE(vrc))
return vrc;
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
RTPrintf("Creating directory \"%s\" ...\n", pszDir);
if (pContext->fDryRun)
@@ -1743,7 +1955,7 @@ static int ctrlCopyDirCreate(PCOPYCONTEXT pContext, const char *pszDir)
HRESULT rc = pContext->pCmdCtx->pGuestSession->DirectoryCreate(Bstr(pszDir).raw(),
0700, ComSafeArrayAsInParam(dirCreateFlags));
if (FAILED(rc))
- vrc = ctrlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
+ vrc = gctlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
}
else /* ... or on the host. */
{
@@ -1765,7 +1977,7 @@ static int ctrlCopyDirCreate(PCOPYCONTEXT pContext, const char *pszDir)
* @param fExists Pointer which receives the result if the
* given directory exists or not.
*/
-static int ctrlCopyDirExists(PCOPYCONTEXT pContext, bool fOnGuest,
+static int gctlCopyDirExists(PCOPYCONTEXT pContext, bool fOnGuest,
const char *pszDir, bool *fExists)
{
AssertPtrReturn(pContext, false);
@@ -1776,11 +1988,11 @@ static int ctrlCopyDirExists(PCOPYCONTEXT pContext, bool fOnGuest,
if (fOnGuest)
{
BOOL fDirExists = FALSE;
- HRESULT rc = pContext->pCmdCtx->pGuestSession->DirectoryExists(Bstr(pszDir).raw(), &fDirExists);
- if (FAILED(rc))
- vrc = ctrlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
+ HRESULT rc = pContext->pCmdCtx->pGuestSession->DirectoryExists(Bstr(pszDir).raw(), FALSE /*followSymlinks*/, &fDirExists);
+ if (SUCCEEDED(rc))
+ *fExists = fDirExists != FALSE;
else
- *fExists = fDirExists ? true : false;
+ vrc = gctlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
}
else
*fExists = RTDirExists(pszDir);
@@ -1797,10 +2009,10 @@ static int ctrlCopyDirExists(PCOPYCONTEXT pContext, bool fOnGuest,
* @param fExists Pointer which receives the result if the
* given directory exists or not.
*/
-static int ctrlCopyDirExistsOnDest(PCOPYCONTEXT pContext, const char *pszDir,
+static int gctlCopyDirExistsOnDest(PCOPYCONTEXT pContext, const char *pszDir,
bool *fExists)
{
- return ctrlCopyDirExists(pContext, pContext->fHostToGuest,
+ return gctlCopyDirExists(pContext, pContext->fHostToGuest,
pszDir, fExists);
}
@@ -1814,10 +2026,10 @@ static int ctrlCopyDirExistsOnDest(PCOPYCONTEXT pContext, const char *pszDir,
* @param fExists Pointer which receives the result if the
* given directory exists or not.
*/
-static int ctrlCopyDirExistsOnSource(PCOPYCONTEXT pContext, const char *pszDir,
+static int gctlCopyDirExistsOnSource(PCOPYCONTEXT pContext, const char *pszDir,
bool *fExists)
{
- return ctrlCopyDirExists(pContext, !pContext->fHostToGuest,
+ return gctlCopyDirExists(pContext, !pContext->fHostToGuest,
pszDir, fExists);
}
@@ -1832,7 +2044,7 @@ static int ctrlCopyDirExistsOnSource(PCOPYCONTEXT pContext, const char *pszDir,
* @param fExists Pointer which receives the result if the
* given file exists or not.
*/
-static int ctrlCopyFileExists(PCOPYCONTEXT pContext, bool bOnGuest,
+static int gctlCopyFileExists(PCOPYCONTEXT pContext, bool bOnGuest,
const char *pszFile, bool *fExists)
{
AssertPtrReturn(pContext, false);
@@ -1843,11 +2055,11 @@ static int ctrlCopyFileExists(PCOPYCONTEXT pContext, bool bOnGuest,
if (bOnGuest)
{
BOOL fFileExists = FALSE;
- HRESULT rc = pContext->pCmdCtx->pGuestSession->FileExists(Bstr(pszFile).raw(), &fFileExists);
- if (FAILED(rc))
- vrc = ctrlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
+ HRESULT rc = pContext->pCmdCtx->pGuestSession->FileExists(Bstr(pszFile).raw(), FALSE /*followSymlinks*/, &fFileExists);
+ if (SUCCEEDED(rc))
+ *fExists = fFileExists != FALSE;
else
- *fExists = fFileExists ? true : false;
+ vrc = gctlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
}
else
*fExists = RTFileExists(pszFile);
@@ -1864,10 +2076,10 @@ static int ctrlCopyFileExists(PCOPYCONTEXT pContext, bool bOnGuest,
* @param fExists Pointer which receives the result if the
* given file exists or not.
*/
-static int ctrlCopyFileExistsOnDest(PCOPYCONTEXT pContext, const char *pszFile,
+static int gctlCopyFileExistsOnDest(PCOPYCONTEXT pContext, const char *pszFile,
bool *fExists)
{
- return ctrlCopyFileExists(pContext, pContext->fHostToGuest,
+ return gctlCopyFileExists(pContext, pContext->fHostToGuest,
pszFile, fExists);
}
@@ -1881,10 +2093,10 @@ static int ctrlCopyFileExistsOnDest(PCOPYCONTEXT pContext, const char *pszFile,
* @param fExists Pointer which receives the result if the
* given file exists or not.
*/
-static int ctrlCopyFileExistsOnSource(PCOPYCONTEXT pContext, const char *pszFile,
+static int gctlCopyFileExistsOnSource(PCOPYCONTEXT pContext, const char *pszFile,
bool *fExists)
{
- return ctrlCopyFileExists(pContext, !pContext->fHostToGuest,
+ return gctlCopyFileExists(pContext, !pContext->fHostToGuest,
pszFile, fExists);
}
@@ -1895,18 +2107,18 @@ static int ctrlCopyFileExistsOnSource(PCOPYCONTEXT pContext, const char *pszFile
* @param pContext Pointer to current copy control context.
* @param pszFileSource Source file to copy to the destination.
* @param pszFileDest Name of copied file on the destination.
- * @param fFlags Copy flags. No supported at the moment and needs
- * to be set to 0.
+ * @param enmFlags Copy flags. No supported at the moment and
+ * needs to be set to 0.
*/
-static int ctrlCopyFileToDest(PCOPYCONTEXT pContext, const char *pszFileSource,
- const char *pszFileDest, uint32_t fFlags)
+static int gctlCopyFileToDest(PCOPYCONTEXT pContext, const char *pszFileSource,
+ const char *pszFileDest, gctlCopyFlags enmFlags)
{
AssertPtrReturn(pContext, VERR_INVALID_POINTER);
AssertPtrReturn(pszFileSource, VERR_INVALID_POINTER);
AssertPtrReturn(pszFileDest, VERR_INVALID_POINTER);
- AssertReturn(!fFlags, VERR_INVALID_POINTER); /* No flags supported yet. */
+ AssertReturn(enmFlags == kGctlCopyFlags_None, VERR_INVALID_PARAMETER); /* No flags supported yet. */
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
RTPrintf("Copying \"%s\" to \"%s\" ...\n",
pszFileSource, pszFileDest);
@@ -1918,32 +2130,32 @@ static int ctrlCopyFileToDest(PCOPYCONTEXT pContext, const char *pszFileSource,
HRESULT rc;
if (pContext->fHostToGuest)
{
- SafeArray<CopyFileFlag_T> copyFlags;
- rc = pContext->pCmdCtx->pGuestSession->CopyTo(Bstr(pszFileSource).raw(), Bstr(pszFileDest).raw(),
- ComSafeArrayAsInParam(copyFlags),
- pProgress.asOutParam());
+ SafeArray<FileCopyFlag_T> copyFlags;
+ rc = pContext->pCmdCtx->pGuestSession->FileCopyToGuest(Bstr(pszFileSource).raw(), Bstr(pszFileDest).raw(),
+ ComSafeArrayAsInParam(copyFlags),
+ pProgress.asOutParam());
}
else
{
- SafeArray<CopyFileFlag_T> copyFlags;
- rc = pContext->pCmdCtx->pGuestSession->CopyFrom(Bstr(pszFileSource).raw(), Bstr(pszFileDest).raw(),
- ComSafeArrayAsInParam(copyFlags),
- pProgress.asOutParam());
+ SafeArray<FileCopyFlag_T> copyFlags;
+ rc = pContext->pCmdCtx->pGuestSession->FileCopyFromGuest(Bstr(pszFileSource).raw(), Bstr(pszFileDest).raw(),
+ ComSafeArrayAsInParam(copyFlags),
+ pProgress.asOutParam());
}
if (FAILED(rc))
{
- vrc = ctrlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
+ vrc = gctlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
}
else
{
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
rc = showProgress(pProgress);
else
rc = pProgress->WaitForCompletion(-1 /* No timeout */);
if (SUCCEEDED(rc))
CHECK_PROGRESS_ERROR(pProgress, ("File copy failed"));
- vrc = ctrlPrintProgressError(pProgress);
+ vrc = gctlPrintProgressError(pProgress);
}
return vrc;
@@ -1957,13 +2169,13 @@ static int ctrlCopyFileToDest(PCOPYCONTEXT pContext, const char *pszFileSource,
* @param pszSource Source directory on the host to copy to the guest.
* @param pszFilter DOS-style wildcard filter (?, *). Optional.
* @param pszDest Destination directory on the guest.
- * @param fFlags Copy flags, such as recursive copying.
+ * @param enmFlags Copy flags, such as recursive copying.
* @param pszSubDir Current sub directory to handle. Needs to NULL and only
* is needed for recursion.
*/
-static int ctrlCopyDirToGuest(PCOPYCONTEXT pContext,
+static int gctlCopyDirToGuest(PCOPYCONTEXT pContext,
const char *pszSource, const char *pszFilter,
- const char *pszDest, uint32_t fFlags,
+ const char *pszDest, enum gctlCopyFlags enmFlags,
const char *pszSubDir /* For recursion. */)
{
AssertPtrReturn(pContext, VERR_INVALID_POINTER);
@@ -1980,7 +2192,7 @@ static int ctrlCopyDirToGuest(PCOPYCONTEXT pContext,
if (RT_SUCCESS(vrc) && pszSubDir)
vrc = RTPathAppend(szCurDir, sizeof(szCurDir), pszSubDir);
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
RTPrintf("Processing host directory: %s\n", szCurDir);
/* Flag indicating whether the current directory was created on the
@@ -2025,10 +2237,10 @@ static int ctrlCopyDirToGuest(PCOPYCONTEXT pContext,
|| !strcmp(DirEntry.szName, ".."))
break;
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
RTPrintf("Directory: %s\n", DirEntry.szName);
- if (fFlags & CopyFileFlag_Recursive)
+ if (enmFlags & kGctlCopyFlags_Recursive)
{
char *pszNewSub = NULL;
if (pszSubDir)
@@ -2041,9 +2253,9 @@ static int ctrlCopyDirToGuest(PCOPYCONTEXT pContext,
if (pszNewSub)
{
- vrc = ctrlCopyDirToGuest(pContext,
+ vrc = gctlCopyDirToGuest(pContext,
pszSource, pszFilter,
- pszDest, fFlags, pszNewSub);
+ pszDest, enmFlags, pszNewSub);
RTStrFree(pszNewSub);
}
else
@@ -2053,8 +2265,8 @@ static int ctrlCopyDirToGuest(PCOPYCONTEXT pContext,
}
case RTDIRENTRYTYPE_SYMLINK:
- if ( (fFlags & CopyFileFlag_Recursive)
- && (fFlags & CopyFileFlag_FollowLinks))
+ if ( (enmFlags & kGctlCopyFlags_Recursive)
+ && (enmFlags & kGctlCopyFlags_FollowLinks))
{
/* Fall through to next case is intentional. */
}
@@ -2069,17 +2281,17 @@ static int ctrlCopyDirToGuest(PCOPYCONTEXT pContext,
break; /* Filter does not match. */
}
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
RTPrintf("File: %s\n", DirEntry.szName);
if (!fDirCreated)
{
char *pszDestDir;
- vrc = ctrlCopyTranslatePath(pszSource, szCurDir,
+ vrc = gctlCopyTranslatePath(pszSource, szCurDir,
pszDest, &pszDestDir);
if (RT_SUCCESS(vrc))
{
- vrc = ctrlCopyDirCreate(pContext, pszDestDir);
+ vrc = gctlCopyDirCreate(pContext, pszDestDir);
RTStrFree(pszDestDir);
fDirCreated = true;
@@ -2092,12 +2304,12 @@ static int ctrlCopyDirToGuest(PCOPYCONTEXT pContext,
if (pszFileSource)
{
char *pszFileDest;
- vrc = ctrlCopyTranslatePath(pszSource, pszFileSource,
+ vrc = gctlCopyTranslatePath(pszSource, pszFileSource,
pszDest, &pszFileDest);
if (RT_SUCCESS(vrc))
{
- vrc = ctrlCopyFileToDest(pContext, pszFileSource,
- pszFileDest, 0 /* Flags */);
+ vrc = gctlCopyFileToDest(pContext, pszFileSource,
+ pszFileDest, kGctlCopyFlags_None);
RTStrFree(pszFileDest);
}
RTStrFree(pszFileSource);
@@ -2126,13 +2338,13 @@ static int ctrlCopyDirToGuest(PCOPYCONTEXT pContext,
* @param pszSource Source directory on the guest to copy to the host.
* @param pszFilter DOS-style wildcard filter (?, *). Optional.
* @param pszDest Destination directory on the host.
- * @param fFlags Copy flags, such as recursive copying.
+ * @param enmFlags Copy flags, such as recursive copying.
* @param pszSubDir Current sub directory to handle. Needs to NULL and only
* is needed for recursion.
*/
-static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
+static int gctlCopyDirToHost(PCOPYCONTEXT pContext,
const char *pszSource, const char *pszFilter,
- const char *pszDest, uint32_t fFlags,
+ const char *pszDest, gctlCopyFlags enmFlags,
const char *pszSubDir /* For recursion. */)
{
AssertPtrReturn(pContext, VERR_INVALID_POINTER);
@@ -2152,7 +2364,7 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
if (RT_FAILURE(vrc))
return vrc;
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
RTPrintf("Processing guest directory: %s\n", szCurDir);
/* Flag indicating whether the current directory was created on the
@@ -2164,7 +2376,7 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
ComSafeArrayAsInParam(dirOpenFlags),
pDirectory.asOutParam());
if (FAILED(rc))
- return ctrlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
+ return gctlPrintError(pContext->pCmdCtx->pGuestSession, COM_IIDOF(IGuestSession));
ComPtr<IFsObjInfo> dirEntry;
while (true)
{
@@ -2189,13 +2401,13 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
|| !strName.compare(Bstr("..")))
break;
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
{
Utf8Str strDir(strName);
RTPrintf("Directory: %s\n", strDir.c_str());
}
- if (fFlags & CopyFileFlag_Recursive)
+ if (enmFlags & kGctlCopyFlags_Recursive)
{
Utf8Str strDir(strName);
char *pszNewSub = NULL;
@@ -2208,9 +2420,9 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
}
if (pszNewSub)
{
- vrc = ctrlCopyDirToHost(pContext,
+ vrc = gctlCopyDirToHost(pContext,
pszSource, pszFilter,
- pszDest, fFlags, pszNewSub);
+ pszDest, enmFlags, pszNewSub);
RTStrFree(pszNewSub);
}
else
@@ -2220,8 +2432,8 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
}
case FsObjType_Symlink:
- if ( (fFlags & CopyFileFlag_Recursive)
- && (fFlags & CopyFileFlag_FollowLinks))
+ if ( (enmFlags & kGctlCopyFlags_Recursive)
+ && (enmFlags & kGctlCopyFlags_FollowLinks))
{
/* Fall through to next case is intentional. */
}
@@ -2239,17 +2451,17 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
break; /* Filter does not match. */
}
- if (pContext->pCmdCtx->fVerbose)
+ if (pContext->pCmdCtx->cVerbose > 1)
RTPrintf("File: %s\n", strFile.c_str());
if (!fDirCreated)
{
char *pszDestDir;
- vrc = ctrlCopyTranslatePath(pszSource, szCurDir,
+ vrc = gctlCopyTranslatePath(pszSource, szCurDir,
pszDest, &pszDestDir);
if (RT_SUCCESS(vrc))
{
- vrc = ctrlCopyDirCreate(pContext, pszDestDir);
+ vrc = gctlCopyDirCreate(pContext, pszDestDir);
RTStrFree(pszDestDir);
fDirCreated = true;
@@ -2262,12 +2474,12 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
if (pszFileSource)
{
char *pszFileDest;
- vrc = ctrlCopyTranslatePath(pszSource, pszFileSource,
+ vrc = gctlCopyTranslatePath(pszSource, pszFileSource,
pszDest, &pszFileDest);
if (RT_SUCCESS(vrc))
{
- vrc = ctrlCopyFileToDest(pContext, pszFileSource,
- pszFileDest, 0 /* Flags */);
+ vrc = gctlCopyFileToDest(pContext, pszFileSource,
+ pszFileDest, kGctlCopyFlags_None);
RTStrFree(pszFileDest);
}
RTStrFree(pszFileSource);
@@ -2304,7 +2516,7 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
}
default:
- vrc = ctrlPrintError(pDirectory, COM_IIDOF(IGuestDirectory));
+ vrc = gctlPrintError(pDirectory, COM_IIDOF(IGuestDirectory));
break;
}
}
@@ -2312,7 +2524,7 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
HRESULT rc2 = pDirectory->Close();
if (FAILED(rc2))
{
- int vrc2 = ctrlPrintError(pDirectory, COM_IIDOF(IGuestDirectory));
+ int vrc2 = gctlPrintError(pDirectory, COM_IIDOF(IGuestDirectory));
if (RT_SUCCESS(vrc))
vrc = vrc2;
}
@@ -2332,17 +2544,17 @@ static int ctrlCopyDirToHost(PCOPYCONTEXT pContext,
* @param pszFilter DOS-style wildcard filter (?, *). Optional.
* @param pszDest Destination directory where to copy in the source
* source directory.
- * @param fFlags Copy flags, such as recursive copying.
+ * @param enmFlags Copy flags, such as recursive copying.
*/
-static int ctrlCopyDirToDest(PCOPYCONTEXT pContext,
+static int gctlCopyDirToDest(PCOPYCONTEXT pContext,
const char *pszSource, const char *pszFilter,
- const char *pszDest, uint32_t fFlags)
+ const char *pszDest, enum gctlCopyFlags enmFlags)
{
if (pContext->fHostToGuest)
- return ctrlCopyDirToGuest(pContext, pszSource, pszFilter,
- pszDest, fFlags, NULL /* Sub directory, only for recursion. */);
- return ctrlCopyDirToHost(pContext, pszSource, pszFilter,
- pszDest, fFlags, NULL /* Sub directory, only for recursion. */);
+ return gctlCopyDirToGuest(pContext, pszSource, pszFilter,
+ pszDest, enmFlags, NULL /* Sub directory, only for recursion. */);
+ return gctlCopyDirToHost(pContext, pszSource, pszFilter,
+ pszDest, enmFlags, NULL /* Sub directory, only for recursion. */);
}
/**
@@ -2351,9 +2563,9 @@ static int ctrlCopyDirToDest(PCOPYCONTEXT pContext,
* @return IPRT status code.
* @param pszSource Source to create source root for.
* @param ppszSourceRoot Pointer that receives the allocated source root. Needs
- * to be free'd with ctrlCopyFreeSourceRoot().
+ * to be free'd with gctlCopyFreeSourceRoot().
*/
-static int ctrlCopyCreateSourceRoot(const char *pszSource, char **ppszSourceRoot)
+static int gctlCopyCreateSourceRoot(const char *pszSource, char **ppszSourceRoot)
{
AssertPtrReturn(pszSource, VERR_INVALID_POINTER);
AssertPtrReturn(ppszSourceRoot, VERR_INVALID_POINTER);
@@ -2397,12 +2609,12 @@ static int ctrlCopyCreateSourceRoot(const char *pszSource, char **ppszSourceRoot
* @return IPRT status code.
* @param pszSourceRoot Source root to free.
*/
-static void ctrlCopyFreeSourceRoot(char *pszSourceRoot)
+static void gctlCopyFreeSourceRoot(char *pszSourceRoot)
{
RTStrFree(pszSourceRoot);
}
-static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
+static RTEXITCODE gctlHandleCopy(PGCTLCMDCTX pCtx, int argc, char **argv, bool fHostToGuest)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
@@ -2420,8 +2632,15 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
* what and how to implement the file enumeration/recursive lookup, like VBoxManage
* does in here.
*/
+ enum GETOPTDEF_COPY
+ {
+ GETOPTDEF_COPY_DRYRUN = 1000,
+ GETOPTDEF_COPY_FOLLOW,
+ GETOPTDEF_COPY_TARGETDIR
+ };
static const RTGETOPTDEF s_aOptions[] =
{
+ GCTLCMD_COMMON_OPTION_DEFS()
{ "--dryrun", GETOPTDEF_COPY_DRYRUN, RTGETOPT_REQ_NOTHING },
{ "--follow", GETOPTDEF_COPY_FOLLOW, RTGETOPT_REQ_NOTHING },
{ "--recursive", 'R', RTGETOPT_REQ_NOTHING },
@@ -2431,12 +2650,11 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- s_aOptions, RT_ELEMENTS(s_aOptions), pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
Utf8Str strSource;
- Utf8Str strDest;
- uint32_t fFlags = CopyFileFlag_None;
+ const char *pszDst = NULL;
+ enum gctlCopyFlags enmFlags = kGctlCopyFlags_None;
bool fCopyRecursive = false;
bool fDryRun = false;
uint32_t uUsage = fHostToGuest ? USAGE_GSTCTRL_COPYTO : USAGE_GSTCTRL_COPYFROM;
@@ -2444,44 +2662,48 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
SOURCEVEC vecSources;
int vrc = VINF_SUCCESS;
- while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case GETOPTDEF_COPY_DRYRUN:
fDryRun = true;
break;
case GETOPTDEF_COPY_FOLLOW:
- fFlags |= CopyFileFlag_FollowLinks;
+ enmFlags = (enum gctlCopyFlags)((uint32_t)enmFlags | kGctlCopyFlags_FollowLinks);
break;
case 'R': /* Recursive processing */
- fFlags |= CopyFileFlag_Recursive;
+ enmFlags = (enum gctlCopyFlags)((uint32_t)enmFlags | kGctlCopyFlags_Recursive);
break;
case GETOPTDEF_COPY_TARGETDIR:
- strDest = ValueUnion.psz;
+ pszDst = ValueUnion.psz;
break;
case VINF_GETOPT_NOT_OPTION:
- {
/* Last argument and no destination specified with
* --target-directory yet? Then use the current
* (= last) argument as destination. */
- if ( pCtx->iArgc == GetState.iNext
- && strDest.isEmpty())
- {
- strDest = ValueUnion.psz;
- }
+ if ( pCtx->pArg->argc == GetState.iNext
+ && pszDst == NULL)
+ pszDst = ValueUnion.psz;
else
{
- /* Save the source directory. */
- vecSources.push_back(SOURCEFILEENTRY(ValueUnion.psz));
+ try
+ { /* Save the source directory. */
+ vecSources.push_back(SOURCEFILEENTRY(ValueUnion.psz));
+ }
+ catch (std::bad_alloc &)
+ {
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Out of memory");
+ }
}
break;
- }
default:
return errorGetOptEx(USAGE_GUESTCONTROL, uUsage, ch, &ValueUnion);
@@ -2489,17 +2711,19 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
}
if (!vecSources.size())
- return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage,
- "No source(s) specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage, "No source(s) specified!");
- if (strDest.isEmpty())
- return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage,
- "No destination specified!");
+ if (pszDst == NULL)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, uUsage, "No destination specified!");
+
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
/*
* Done parsing arguments, do some more preparations.
*/
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
{
if (fHostToGuest)
RTPrintf("Copying from host to guest ...\n");
@@ -2512,7 +2736,7 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
/* Create the copy context -- it contains all information
* the routines need to know when handling the actual copying. */
PCOPYCONTEXT pContext = NULL;
- vrc = ctrlCopyContextCreate(pCtx, fDryRun, fHostToGuest,
+ vrc = gctlCopyContextCreate(pCtx, fDryRun, fHostToGuest,
fHostToGuest
? "VBoxManage Guest Control - Copy to guest"
: "VBoxManage Guest Control - Copy from guest", &pContext);
@@ -2522,8 +2746,6 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
return RTEXITCODE_FAILURE;
}
- /* If the destination is a path, (try to) create it. */
- const char *pszDest = strDest.c_str();
/** @todo r=bird: RTPathFilename and RTPathStripFilename won't work
* correctly on non-windows hosts when the guest is from the DOS world (Windows,
* OS/2, DOS). The host doesn't know about DOS slashes, only UNIX slashes and
@@ -2535,20 +2757,20 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
*
* @bugref{6344}
*/
- if (!RTPathFilename(pszDest))
+ if (!RTPathFilename(pszDst))
{
- vrc = ctrlCopyDirCreate(pContext, pszDest);
+ vrc = gctlCopyDirCreate(pContext, pszDst);
}
else
{
/* We assume we got a file name as destination -- so strip
* the actual file name and make sure the appropriate
* directories get created. */
- char *pszDestDir = RTStrDup(pszDest);
- AssertPtr(pszDestDir);
- RTPathStripFilename(pszDestDir);
- vrc = ctrlCopyDirCreate(pContext, pszDestDir);
- RTStrFree(pszDestDir);
+ char *pszDstDir = RTStrDup(pszDst);
+ AssertPtr(pszDstDir);
+ RTPathStripFilename(pszDstDir);
+ vrc = gctlCopyDirCreate(pContext, pszDstDir);
+ RTStrFree(pszDstDir);
}
if (RT_SUCCESS(vrc))
@@ -2566,14 +2788,14 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
pszFilter = NULL; /* If empty filter then there's no filter :-) */
char *pszSourceRoot;
- vrc = ctrlCopyCreateSourceRoot(pszSource, &pszSourceRoot);
+ vrc = gctlCopyCreateSourceRoot(pszSource, &pszSourceRoot);
if (RT_FAILURE(vrc))
{
RTMsgError("Unable to create source root, rc=%Rrc\n", vrc);
break;
}
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Source: %s\n", pszSource);
/** @todo Files with filter?? */
@@ -2585,9 +2807,9 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
&& RTPATH_IS_SLASH(pszSource[cchSource - 1]))
{
if (pszFilter) /* Directory with filter (so use source root w/o the actual filter). */
- vrc = ctrlCopyDirExistsOnSource(pContext, pszSourceRoot, &fSourceExists);
+ vrc = gctlCopyDirExistsOnSource(pContext, pszSourceRoot, &fSourceExists);
else /* Regular directory without filter. */
- vrc = ctrlCopyDirExistsOnSource(pContext, pszSource, &fSourceExists);
+ vrc = gctlCopyDirExistsOnSource(pContext, pszSource, &fSourceExists);
if (fSourceExists)
{
@@ -2598,7 +2820,7 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
}
else
{
- vrc = ctrlCopyFileExistsOnSource(pContext, pszSource, &fSourceExists);
+ vrc = gctlCopyFileExistsOnSource(pContext, pszSource, &fSourceExists);
if ( RT_SUCCESS(vrc)
&& fSourceExists)
{
@@ -2612,28 +2834,24 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
if (fSourceIsFile)
{
/* Single file. */
- char *pszDestFile;
- vrc = ctrlCopyTranslatePath(pszSourceRoot, pszSource,
- strDest.c_str(), &pszDestFile);
+ char *pszDstFile;
+ vrc = gctlCopyTranslatePath(pszSourceRoot, pszSource, pszDst, &pszDstFile);
if (RT_SUCCESS(vrc))
{
- vrc = ctrlCopyFileToDest(pContext, pszSource,
- pszDestFile, 0 /* Flags */);
- RTStrFree(pszDestFile);
+ vrc = gctlCopyFileToDest(pContext, pszSource, pszDstFile, kGctlCopyFlags_None);
+ RTStrFree(pszDstFile);
}
else
- RTMsgError("Unable to translate path for \"%s\", rc=%Rrc\n",
- pszSource, vrc);
+ RTMsgError("Unable to translate path for \"%s\", rc=%Rrc\n", pszSource, vrc);
}
else
{
/* Directory (with filter?). */
- vrc = ctrlCopyDirToDest(pContext, pszSource, pszFilter,
- strDest.c_str(), fFlags);
+ vrc = gctlCopyDirToDest(pContext, pszSource, pszFilter, pszDst, enmFlags);
}
}
- ctrlCopyFreeSourceRoot(pszSourceRoot);
+ gctlCopyFreeSourceRoot(pszSourceRoot);
if ( RT_SUCCESS(vrc)
&& !fSourceExists)
@@ -2655,27 +2873,28 @@ static RTEXITCODE handleCtrlCopy(PGCTLCMDCTX pCtx, bool fHostToGuest)
}
}
- ctrlCopyContextFree(pContext);
+ gctlCopyContextFree(pContext);
return RT_SUCCESS(vrc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlCopyFrom(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleCopyFrom(PGCTLCMDCTX pCtx, int argc, char **argv)
{
- return handleCtrlCopy(pCtx, false /* Guest to host */);
+ return gctlHandleCopy(pCtx, argc, argv, false /* Guest to host */);
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlCopyTo(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleCopyTo(PGCTLCMDCTX pCtx, int argc, char **argv)
{
- return handleCtrlCopy(pCtx, true /* Host to guest */);
+ return gctlHandleCopy(pCtx, argc, argv, true /* Host to guest */);
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlCreateDirectory(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) handleCtrtMkDir(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
static const RTGETOPTDEF s_aOptions[] =
{
+ GCTLCMD_COMMON_OPTION_DEFS()
{ "--mode", 'm', RTGETOPT_REQ_UINT32 },
{ "--parents", 'P', RTGETOPT_REQ_NOTHING }
};
@@ -2683,18 +2902,20 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlCreateDirectory(PGCTLCMDCTX pCtx)
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- s_aOptions, RT_ELEMENTS(s_aOptions), pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 2, RTGETOPTINIT_FLAGS_OPTS_FIRST);
SafeArray<DirectoryCreateFlag_T> dirCreateFlags;
- uint32_t fDirMode = 0; /* Default mode. */
- DESTDIRMAP mapDirs;
+ uint32_t fDirMode = 0; /* Default mode. */
+ uint32_t cDirsCreated = 0;
+ RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
- while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case 'm': /* Mode */
fDirMode = ValueUnion.u32;
break;
@@ -2704,210 +2925,278 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlCreateDirectory(PGCTLCMDCTX pCtx)
break;
case VINF_GETOPT_NOT_OPTION:
- mapDirs[ValueUnion.psz]; /* Add destination directory to map. */
+ if (cDirsCreated == 0)
+ {
+ /*
+ * First non-option - no more options now.
+ */
+ rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Creating %RU32 directories...\n", argc - GetState.iNext + 1);
+ }
+ if (g_fGuestCtrlCanceled)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "mkdir was interrupted by Ctrl-C (%u left)\n",
+ argc - GetState.iNext + 1);
+
+ /*
+ * Create the specified directory.
+ *
+ * On failure we'll change the exit status to failure and
+ * continue with the next directory that needs creating. We do
+ * this because we only create new things, and because this is
+ * how /bin/mkdir works on unix.
+ */
+ cDirsCreated++;
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Creating directory \"%s\" ...\n", ValueUnion.psz);
+ try
+ {
+ HRESULT rc;
+ CHECK_ERROR(pCtx->pGuestSession, DirectoryCreate(Bstr(ValueUnion.psz).raw(),
+ fDirMode, ComSafeArrayAsInParam(dirCreateFlags)));
+ if (FAILED(rc))
+ rcExit = RTEXITCODE_FAILURE;
+ }
+ catch (std::bad_alloc &)
+ {
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Out of memory\n");
+ }
break;
default:
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATEDIR, ch, &ValueUnion);
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MKDIR, ch, &ValueUnion);
}
}
- uint32_t cDirs = mapDirs.size();
- if (!cDirs)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATEDIR,
- "No directory to create specified!");
-
- /*
- * Create the directories.
- */
- HRESULT rc = S_OK;
- if (pCtx->fVerbose && cDirs)
- RTPrintf("Creating %RU32 directories ...\n", cDirs);
-
- DESTDIRMAPITER it = mapDirs.begin();
- while ( (it != mapDirs.end())
- && !g_fGuestCtrlCanceled)
- {
- if (pCtx->fVerbose)
- RTPrintf("Creating directory \"%s\" ...\n", it->first.c_str());
-
- CHECK_ERROR_BREAK(pCtx->pGuestSession, DirectoryCreate(Bstr(it->first).raw(),
- fDirMode, ComSafeArrayAsInParam(dirCreateFlags)));
- it++;
- }
-
- return FAILED(rc) ? RTEXITCODE_FAILURE : RTEXITCODE_SUCCESS;
+ if (!cDirsCreated)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MKDIR, "No directory to create specified!");
+ return rcExit;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlRemoveDirectory(PGCTLCMDCTX pCtx)
+
+static DECLCALLBACK(RTEXITCODE) gctlHandleRmDir(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
static const RTGETOPTDEF s_aOptions[] =
{
- { "--recursive", 'R', RTGETOPT_REQ_NOTHING }
+ GCTLCMD_COMMON_OPTION_DEFS()
+ { "--recursive", 'R', RTGETOPT_REQ_NOTHING },
};
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- s_aOptions, RT_ELEMENTS(s_aOptions), pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
- bool fRecursive = false;
- DESTDIRMAP mapDirs;
+ bool fRecursive = false;
+ uint32_t cDirRemoved = 0;
+ RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
- while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case 'R':
fRecursive = true;
break;
case VINF_GETOPT_NOT_OPTION:
- mapDirs[ValueUnion.psz]; /* Add destination directory to map. */
- break;
-
- default:
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_REMOVEDIR, ch, &ValueUnion);
- }
- }
-
- uint32_t cDirs = mapDirs.size();
- if (!cDirs)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_REMOVEDIR,
- "No directory to remove specified!");
-
- /*
- * Remove the directories.
- */
- HRESULT rc = S_OK;
- if (pCtx->fVerbose && cDirs)
- RTPrintf("Removing %RU32 directories ...\n", cDirs);
-
- DESTDIRMAPITER it = mapDirs.begin();
- while ( (it != mapDirs.end())
- && !g_fGuestCtrlCanceled)
- {
- if (pCtx->fVerbose)
- RTPrintf("%s directory \"%s\" ...\n",
- fRecursive ? "Recursively removing" : "Removing",
- it->first.c_str());
- try
- {
- if (fRecursive)
{
- com::SafeArray<DirectoryRemoveRecFlag_T> aRemRecFlags;
- /** @todo Make flags configurable. */
- aRemRecFlags.push_back(DirectoryRemoveRecFlag_ContentAndDir);
-
- ComPtr<IProgress> pProgress;
- CHECK_ERROR_BREAK(pCtx->pGuestSession, DirectoryRemoveRecursive(Bstr(it->first).raw(),
- ComSafeArrayAsInParam(aRemRecFlags),
- pProgress.asOutParam()));
- if (pCtx->fVerbose)
- rc = showProgress(pProgress);
+ if (cDirRemoved == 0)
+ {
+ /*
+ * First non-option - no more options now.
+ */
+ rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Removing %RU32 directorie%ss...\n", argc - GetState.iNext + 1, fRecursive ? "trees" : "");
+ }
+ if (g_fGuestCtrlCanceled)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "rmdir was interrupted by Ctrl-C (%u left)\n",
+ argc - GetState.iNext + 1);
+
+ cDirRemoved++;
+ HRESULT rc;
+ if (!fRecursive)
+ {
+ /*
+ * Remove exactly one directory.
+ */
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Removing directory \"%s\" ...\n", ValueUnion.psz);
+ try
+ {
+ CHECK_ERROR(pCtx->pGuestSession, DirectoryRemove(Bstr(ValueUnion.psz).raw()));
+ }
+ catch (std::bad_alloc &)
+ {
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Out of memory\n");
+ }
+ }
else
- rc = pProgress->WaitForCompletion(-1 /* No timeout */);
- if (SUCCEEDED(rc))
- CHECK_PROGRESS_ERROR(pProgress, ("Directory deletion failed"));
+ {
+ /*
+ * Remove the directory and anything under it, that means files
+ * and everything. This is in the tradition of the Windows NT
+ * CMD.EXE "rmdir /s" operation, a tradition which jpsoft's TCC
+ * strongly warns against (and half-ways questions the sense of).
+ */
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Recursively removing directory \"%s\" ...\n", ValueUnion.psz);
+ try
+ {
+ /** @todo Make flags configurable. */
+ com::SafeArray<DirectoryRemoveRecFlag_T> aRemRecFlags;
+ aRemRecFlags.push_back(DirectoryRemoveRecFlag_ContentAndDir);
+
+ ComPtr<IProgress> ptrProgress;
+ CHECK_ERROR(pCtx->pGuestSession, DirectoryRemoveRecursive(Bstr(ValueUnion.psz).raw(),
+ ComSafeArrayAsInParam(aRemRecFlags),
+ ptrProgress.asOutParam()));
+ if (SUCCEEDED(rc))
+ {
+ if (pCtx->cVerbose > 1)
+ rc = showProgress(ptrProgress);
+ else
+ rc = ptrProgress->WaitForCompletion(-1 /* indefinitely */);
+ if (SUCCEEDED(rc))
+ CHECK_PROGRESS_ERROR(ptrProgress, ("Directory deletion failed"));
+ ptrProgress.setNull();
+ }
+ }
+ catch (std::bad_alloc &)
+ {
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Out of memory during recursive rmdir\n");
+ }
+ }
- pProgress.setNull();
+ /*
+ * This command returns immediately on failure since it's destructive in nature.
+ */
+ if (FAILED(rc))
+ return RTEXITCODE_FAILURE;
+ break;
}
- else
- CHECK_ERROR_BREAK(pCtx->pGuestSession, DirectoryRemove(Bstr(it->first).raw()));
- }
- catch (std::bad_alloc)
- {
- rc = E_OUTOFMEMORY;
- break;
- }
- it++;
+ default:
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RMDIR, ch, &ValueUnion);
+ }
}
- return FAILED(rc) ? RTEXITCODE_FAILURE : RTEXITCODE_SUCCESS;
+ if (!cDirRemoved)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RMDIR, "No directory to remove specified!");
+ return rcExit;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlRemoveFile(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleRm(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
+ static const RTGETOPTDEF s_aOptions[] =
+ {
+ GCTLCMD_COMMON_OPTION_DEFS()
+ { "--force", 'f', RTGETOPT_REQ_NOTHING, },
+ };
+
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- NULL /* s_aOptions */, 0 /* RT_ELEMENTS(s_aOptions) */,
- pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
- DESTDIRMAP mapDirs;
+ uint32_t cFilesDeleted = 0;
+ RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
+ bool fForce = true;
- while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case VINF_GETOPT_NOT_OPTION:
- mapDirs[ValueUnion.psz]; /* Add destination directory to map. */
+ if (cFilesDeleted == 0)
+ {
+ /*
+ * First non-option - no more options now.
+ */
+ rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Removing %RU32 file(s)...\n", argc - GetState.iNext + 1);
+ }
+ if (g_fGuestCtrlCanceled)
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "rm was interrupted by Ctrl-C (%u left)\n",
+ argc - GetState.iNext + 1);
+
+ /*
+ * Remove the specified file.
+ *
+ * On failure we will by default stop, however, the force option will
+ * by unix traditions force us to ignore errors and continue.
+ */
+ cFilesDeleted++;
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Removing file \"%s\" ...\n", ValueUnion.psz);
+ try
+ {
+ /** @todo How does IGuestSession::FsObjRemove work with read-only files? Do we
+ * need to do some chmod or whatever to better emulate the --force flag? */
+ HRESULT rc;
+ CHECK_ERROR(pCtx->pGuestSession, FsObjRemove(Bstr(ValueUnion.psz).raw()));
+ if (FAILED(rc) && !fForce)
+ return RTEXITCODE_FAILURE;
+ }
+ catch (std::bad_alloc &)
+ {
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Out of memory\n");
+ }
break;
default:
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_REMOVEFILE, ch, &ValueUnion);
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RM, ch, &ValueUnion);
}
}
- uint32_t cFiles = mapDirs.size();
- if (!cFiles)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_REMOVEFILE,
- "No file to remove specified!");
-
- /*
- * Create the directories.
- */
- HRESULT rc = S_OK;
- if (pCtx->fVerbose && cFiles)
- RTPrintf("Removing %RU32 file(s) ...\n", cFiles);
-
- DESTDIRMAPITER it = mapDirs.begin();
- while ( (it != mapDirs.end())
- && !g_fGuestCtrlCanceled)
- {
- if (pCtx->fVerbose)
- RTPrintf("Removing file \"%s\" ...\n", it->first.c_str());
-
- CHECK_ERROR_BREAK(pCtx->pGuestSession, FileRemove(Bstr(it->first).raw()));
-
- it++;
- }
-
- return FAILED(rc) ? RTEXITCODE_FAILURE : RTEXITCODE_SUCCESS;
+ if (!cFilesDeleted && !fForce)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RM, "No file to remove specified!");
+ return rcExit;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleMv(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
- static const RTGETOPTDEF s_aOptions[] = { { 0 } };
+ static const RTGETOPTDEF s_aOptions[] =
+ {
+ GCTLCMD_COMMON_OPTION_DEFS()
+ };
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- NULL /*s_aOptions*/, 0 /*RT_ELEMENTS(s_aOptions)*/, pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
int vrc = VINF_SUCCESS;
bool fDryrun = false;
std::vector< Utf8Str > vecSources;
- Utf8Str strDest;
- com::SafeArray<PathRenameFlag_T> aRenameFlags;
+ const char *pszDst = NULL;
+ com::SafeArray<FsObjRenameFlag_T> aRenameFlags;
try
{
/** @todo Make flags configurable. */
- aRenameFlags.push_back(PathRenameFlag_NoReplace);
+ aRenameFlags.push_back(FsObjRenameFlag_NoReplace);
while ( (ch = RTGetOpt(&GetState, &ValueUnion))
&& RT_SUCCESS(vrc))
@@ -2915,16 +3204,18 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
/** @todo Implement a --dryrun command. */
/** @todo Implement rename flags. */
case VINF_GETOPT_NOT_OPTION:
vecSources.push_back(Utf8Str(ValueUnion.psz));
- strDest = ValueUnion.psz;
+ pszDst = ValueUnion.psz;
break;
default:
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RENAME, ch, &ValueUnion);
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MV, ch, &ValueUnion);
}
}
}
@@ -2936,14 +3227,18 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
if (RT_FAILURE(vrc))
return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to initialize, rc=%Rrc\n", vrc);
- uint32_t cSources = vecSources.size();
+ size_t cSources = vecSources.size();
if (!cSources)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RENAME,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MV,
"No source(s) to move specified!");
if (cSources < 2)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_RENAME,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MV,
"No destination specified!");
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+
/* Delete last element, which now is the destination. */
vecSources.pop_back();
cSources = vecSources.size();
@@ -2952,74 +3247,72 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
if (cSources > 1)
{
- ComPtr<IGuestFsObjInfo> pFsObjInfo;
- rc = pCtx->pGuestSession->DirectoryQueryInfo(Bstr(strDest).raw(), pFsObjInfo.asOutParam());
- if (FAILED(rc))
+ BOOL fExists = FALSE;
+ rc = pCtx->pGuestSession->DirectoryExists(Bstr(pszDst).raw(), FALSE /*followSymlinks*/, &fExists);
+ if (FAILED(rc) || !fExists)
return RTMsgErrorExit(RTEXITCODE_FAILURE, "Destination must be a directory when specifying multiple sources\n");
}
/*
* Rename (move) the entries.
*/
- if (pCtx->fVerbose && cSources)
- RTPrintf("Renaming %RU32 %s ...\n", cSources,
- cSources > 1
- ? "entries" : "entry");
+ if (pCtx->cVerbose > 1)
+ RTPrintf("Renaming %RU32 %s ...\n", cSources, cSources > 1 ? "entries" : "entry");
std::vector< Utf8Str >::iterator it = vecSources.begin();
while ( (it != vecSources.end())
&& !g_fGuestCtrlCanceled)
{
- bool fSourceIsDirectory = false;
Utf8Str strCurSource = (*it);
- Utf8Str strCurDest = strDest;
- /** @todo Slooooow, but works for now. */
ComPtr<IGuestFsObjInfo> pFsObjInfo;
- rc = pCtx->pGuestSession->FileQueryInfo(Bstr(strCurSource).raw(), pFsObjInfo.asOutParam());
- if (FAILED(rc))
- {
- rc = pCtx->pGuestSession->DirectoryQueryInfo(Bstr(strCurSource).raw(), pFsObjInfo.asOutParam());
- fSourceIsDirectory = SUCCEEDED(rc);
- }
+ FsObjType_T enmObjType;
+ rc = pCtx->pGuestSession->FsObjQueryInfo(Bstr(strCurSource).raw(), FALSE /*followSymlinks*/, pFsObjInfo.asOutParam());
+ if (SUCCEEDED(rc))
+ rc = pFsObjInfo->COMGETTER(Type)(&enmObjType);
if (FAILED(rc))
{
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Warning: Cannot stat for element \"%s\": No such element\n",
strCurSource.c_str());
it++;
continue; /* Skip. */
}
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Renaming %s \"%s\" to \"%s\" ...\n",
- fSourceIsDirectory ? "directory" : "file",
- strCurSource.c_str(), strCurDest.c_str());
+ enmObjType == FsObjType_Directory ? "directory" : "file",
+ strCurSource.c_str(), pszDst);
if (!fDryrun)
{
- if (fSourceIsDirectory)
+ if (enmObjType == FsObjType_Directory)
{
- CHECK_ERROR_BREAK(pCtx->pGuestSession, DirectoryRename(Bstr(strCurSource).raw(),
- Bstr(strCurDest).raw(),
- ComSafeArrayAsInParam(aRenameFlags)));
+ CHECK_ERROR_BREAK(pCtx->pGuestSession, FsObjRename(Bstr(strCurSource).raw(),
+ Bstr(pszDst).raw(),
+ ComSafeArrayAsInParam(aRenameFlags)));
/* Break here, since it makes no sense to rename mroe than one source to
* the same directory. */
+/** @todo r=bird: You are being kind of windowsy (or just DOSish) about the 'sense' part here,
+ * while being totaly buggy about the behavior. 'VBoxGuest guestcontrol ren dir1 dir2 dstdir' will
+ * stop after 'dir1' and SILENTLY ignore dir2. If you tried this on Windows, you'd see an error
+ * being displayed. If you 'man mv' on a nearby unixy system, you'd see that they've made perfect
+ * sense out of any situation with more than one source. */
it = vecSources.end();
break;
}
else
- CHECK_ERROR_BREAK(pCtx->pGuestSession, FileRename(Bstr(strCurSource).raw(),
- Bstr(strCurDest).raw(),
- ComSafeArrayAsInParam(aRenameFlags)));
+ CHECK_ERROR_BREAK(pCtx->pGuestSession, FsObjRename(Bstr(strCurSource).raw(),
+ Bstr(pszDst).raw(),
+ ComSafeArrayAsInParam(aRenameFlags)));
}
it++;
}
if ( (it != vecSources.end())
- && pCtx->fVerbose)
+ && pCtx->cVerbose > 1)
{
RTPrintf("Warning: Not all sources were renamed\n");
}
@@ -3027,12 +3320,13 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlRename(PGCTLCMDCTX pCtx)
return FAILED(rc) ? RTEXITCODE_FAILURE : RTEXITCODE_SUCCESS;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlCreateTemp(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleMkTemp(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
static const RTGETOPTDEF s_aOptions[] =
{
+ GCTLCMD_COMMON_OPTION_DEFS()
{ "--mode", 'm', RTGETOPT_REQ_UINT32 },
{ "--directory", 'D', RTGETOPT_REQ_NOTHING },
{ "--secure", 's', RTGETOPT_REQ_NOTHING },
@@ -3042,8 +3336,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlCreateTemp(PGCTLCMDCTX pCtx)
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- s_aOptions, RT_ELEMENTS(s_aOptions), pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
Utf8Str strTemplate;
uint32_t fMode = 0; /* Default mode. */
@@ -3053,11 +3346,13 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlCreateTemp(PGCTLCMDCTX pCtx)
DESTDIRMAP mapDirs;
- while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case 'm': /* Mode */
fMode = ValueUnion.u32;
break;
@@ -3079,28 +3374,32 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlCreateTemp(PGCTLCMDCTX pCtx)
if (strTemplate.isEmpty())
strTemplate = ValueUnion.psz;
else
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATETEMP,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MKTEMP,
"More than one template specified!\n");
break;
}
default:
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATETEMP, ch, &ValueUnion);
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MKTEMP, ch, &ValueUnion);
}
}
if (strTemplate.isEmpty())
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATETEMP,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MKTEMP,
"No template specified!");
if (!fDirectory)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CREATETEMP,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_MKTEMP,
"Creating temporary files is currently not supported!");
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+
/*
* Create the directories.
*/
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
{
if (fDirectory && !strTempDir.isEmpty())
RTPrintf("Creating temporary directory from template '%s' in directory '%s' ...\n",
@@ -3127,17 +3426,24 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlCreateTemp(PGCTLCMDCTX pCtx)
if (SUCCEEDED(rc))
RTPrintf("Directory name: %ls\n", directory.raw());
}
- // else - temporary file not yet implemented
+ else
+ {
+ // else - temporary file not yet implemented
+ /** @todo implement temporary file creation (we fend it off above, no
+ * worries). */
+ rc = E_FAIL;
+ }
return FAILED(rc) ? RTEXITCODE_FAILURE : RTEXITCODE_SUCCESS;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlStat(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleStat(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
static const RTGETOPTDEF s_aOptions[] =
{
+ GCTLCMD_COMMON_OPTION_DEFS()
{ "--dereference", 'L', RTGETOPT_REQ_NOTHING },
{ "--file-system", 'f', RTGETOPT_REQ_NOTHING },
{ "--format", 'c', RTGETOPT_REQ_STRING },
@@ -3147,16 +3453,17 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlStat(PGCTLCMDCTX pCtx)
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- s_aOptions, RT_ELEMENTS(s_aOptions), pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
DESTDIRMAP mapObjs;
- while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case 'L': /* Dereference */
case 'f': /* File-system */
case 'c': /* Format */
@@ -3173,33 +3480,33 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlStat(PGCTLCMDCTX pCtx)
}
}
- uint32_t cObjs = mapObjs.size();
+ size_t cObjs = mapObjs.size();
if (!cObjs)
return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_STAT,
"No element(s) to check specified!");
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+
HRESULT rc;
/*
* Doing the checks.
*/
- RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
DESTDIRMAPITER it = mapObjs.begin();
while (it != mapObjs.end())
{
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Checking for element \"%s\" ...\n", it->first.c_str());
ComPtr<IGuestFsObjInfo> pFsObjInfo;
- rc = pCtx->pGuestSession->FileQueryInfo(Bstr(it->first).raw(), pFsObjInfo.asOutParam());
- if (FAILED(rc))
- rc = pCtx->pGuestSession->DirectoryQueryInfo(Bstr(it->first).raw(), pFsObjInfo.asOutParam());
-
+ rc = pCtx->pGuestSession->FsObjQueryInfo(Bstr(it->first).raw(), FALSE /*followSymlinks*/, pFsObjInfo.asOutParam());
if (FAILED(rc))
{
/* If there's at least one element which does not exist on the guest,
* drop out with exitcode 1. */
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Cannot stat for element \"%s\": No such element\n",
it->first.c_str());
rcExit = RTEXITCODE_FAILURE;
@@ -3207,7 +3514,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlStat(PGCTLCMDCTX pCtx)
else
{
FsObjType_T objType;
- pFsObjInfo->COMGETTER(Type)(&objType);
+ pFsObjInfo->COMGETTER(Type)(&objType); /** @todo What about error checking? */
switch (objType)
{
case FsObjType_File:
@@ -3236,7 +3543,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlStat(PGCTLCMDCTX pCtx)
return rcExit;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleUpdateAdditions(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
@@ -3250,6 +3557,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
static const RTGETOPTDEF s_aOptions[] =
{
+ GCTLCMD_COMMON_OPTION_DEFS()
{ "--source", 's', RTGETOPT_REQ_STRING },
{ "--wait-start", 'w', RTGETOPT_REQ_NOTHING }
};
@@ -3257,7 +3565,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv, s_aOptions, RT_ELEMENTS(s_aOptions), pCtx->iFirstArgc, 0);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
int vrc = VINF_SUCCESS;
while ( (ch = RTGetOpt(&GetState, &ValueUnion))
@@ -3265,6 +3573,8 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
{
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case 's':
strSource = ValueUnion.psz;
break;
@@ -3281,18 +3591,18 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
break;
default:
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_UPDATEADDS, ch, &ValueUnion);
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_UPDATEGA, ch, &ValueUnion);
}
}
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Updating Guest Additions ...\n");
HRESULT rc = S_OK;
while (strSource.isEmpty())
{
ComPtr<ISystemProperties> pProperties;
- CHECK_ERROR_BREAK(pCtx->handlerArg.virtualBox, COMGETTER(SystemProperties)(pProperties.asOutParam()));
+ CHECK_ERROR_BREAK(pCtx->pArg->virtualBox, COMGETTER(SystemProperties)(pProperties.asOutParam()));
Bstr strISO;
CHECK_ERROR_BREAK(pProperties, COMGETTER(DefaultAdditionsISO)(strISO.asOutParam()));
strSource = strISO;
@@ -3313,14 +3623,20 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
if (RT_SUCCESS(vrc))
{
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Using source: %s\n", strSource.c_str());
+
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+
+
com::SafeArray<AdditionsUpdateFlag_T> aUpdateFlags;
if (fWaitStartOnly)
{
aUpdateFlags.push_back(AdditionsUpdateFlag_WaitForUpdateStartOnly);
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Preparing and waiting for Guest Additions installer to start ...\n");
}
@@ -3331,19 +3647,19 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
ComSafeArrayAsInParam(aUpdateFlags),
pProgress.asOutParam()));
if (FAILED(rc))
- vrc = ctrlPrintError(pCtx->pGuest, COM_IIDOF(IGuest));
+ vrc = gctlPrintError(pCtx->pGuest, COM_IIDOF(IGuest));
else
{
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
rc = showProgress(pProgress);
else
rc = pProgress->WaitForCompletion(-1 /* No timeout */);
if (SUCCEEDED(rc))
CHECK_PROGRESS_ERROR(pProgress, ("Guest additions update failed"));
- vrc = ctrlPrintProgressError(pProgress);
+ vrc = gctlPrintProgressError(pProgress);
if ( RT_SUCCESS(vrc)
- && pCtx->fVerbose)
+ && pCtx->cVerbose > 1)
{
RTPrintf("Guest Additions update successful\n");
}
@@ -3353,59 +3669,88 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlUpdateAdditions(PGCTLCMDCTX pCtx)
return RT_SUCCESS(vrc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlList(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleList(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
- if (pCtx->iArgc < 1)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_LIST,
- "Must specify a listing category");
-
- RTEXITCODE rcExit = RTEXITCODE_SUCCESS;
+ static const RTGETOPTDEF s_aOptions[] =
+ {
+ GCTLCMD_COMMON_OPTION_DEFS()
+ };
- /** Use RTGetOpt here when handling command line args gets more complex. */
+ int ch;
+ RTGETOPTUNION ValueUnion;
+ RTGETOPTSTATE GetState;
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
- bool fListAll = false;
- bool fListSessions = false;
+ bool fSeenListArg = false;
+ bool fListAll = false;
+ bool fListSessions = false;
bool fListProcesses = false;
- bool fListFiles = false;
- if ( !RTStrICmp(pCtx->ppaArgv[0], "sessions")
- || !RTStrICmp(pCtx->ppaArgv[0], "sess"))
- fListSessions = true;
- else if ( !RTStrICmp(pCtx->ppaArgv[0], "processes")
- || !RTStrICmp(pCtx->ppaArgv[0], "procs"))
- fListSessions = fListProcesses = true; /* Showing processes implies showing sessions. */
- else if ( !RTStrICmp(pCtx->ppaArgv[0], "files"))
- fListSessions = fListFiles = true; /* Showing files implies showing sessions. */
- else if (!RTStrICmp(pCtx->ppaArgv[0], "all"))
- fListAll = true;
-
- /** @todo Handle "--verbose" using RTGetOpt. */
- /** @todo Do we need a machine-readable output here as well? */
+ bool fListFiles = false;
- if ( fListAll
- || fListSessions)
+ int vrc = VINF_SUCCESS;
+ while ( (ch = RTGetOpt(&GetState, &ValueUnion))
+ && RT_SUCCESS(vrc))
{
- HRESULT rc;
- do
+ switch (ch)
{
- size_t cTotalProcs = 0;
- size_t cTotalFiles = 0;
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
+ case VINF_GETOPT_NOT_OPTION:
+ if ( !RTStrICmp(ValueUnion.psz, "sessions")
+ || !RTStrICmp(ValueUnion.psz, "sess"))
+ fListSessions = true;
+ else if ( !RTStrICmp(ValueUnion.psz, "processes")
+ || !RTStrICmp(ValueUnion.psz, "procs"))
+ fListSessions = fListProcesses = true; /* Showing processes implies showing sessions. */
+ else if (!RTStrICmp(ValueUnion.psz, "files"))
+ fListSessions = fListFiles = true; /* Showing files implies showing sessions. */
+ else if (!RTStrICmp(ValueUnion.psz, "all"))
+ fListAll = true;
+ else
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_LIST,
+ "Unknown list: '%s'", ValueUnion.psz);
+ fSeenListArg = true;
+ break;
+
+ default:
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_UPDATEGA, ch, &ValueUnion);
+ }
+ }
- SafeIfaceArray <IGuestSession> collSessions;
- CHECK_ERROR_BREAK(pCtx->pGuest, COMGETTER(Sessions)(ComSafeArrayAsOutParam(collSessions)));
- size_t cSessions = collSessions.size();
+ if (fSeenListArg)
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_LIST, "Missing list name");
+ Assert(fListAll || fListSessions);
+
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
- if (cSessions)
- {
- RTPrintf("Active guest sessions:\n");
- /** @todo Make this output a bit prettier. No time now. */
+ /** @todo Do we need a machine-readable output here as well? */
+
+ HRESULT rc;
+ size_t cTotalProcs = 0;
+ size_t cTotalFiles = 0;
+
+ SafeIfaceArray <IGuestSession> collSessions;
+ CHECK_ERROR(pCtx->pGuest, COMGETTER(Sessions)(ComSafeArrayAsOutParam(collSessions)));
+ if (SUCCEEDED(rc))
+ {
+ size_t const cSessions = collSessions.size();
+ if (cSessions)
+ {
+ RTPrintf("Active guest sessions:\n");
+
+ /** @todo Make this output a bit prettier. No time now. */
- for (size_t i = 0; i < cSessions; i++)
+ for (size_t i = 0; i < cSessions; i++)
+ {
+ ComPtr<IGuestSession> pCurSession = collSessions[i];
+ if (!pCurSession.isNull())
{
- ComPtr<IGuestSession> pCurSession = collSessions[i];
- if (!pCurSession.isNull())
+ do
{
ULONG uID;
CHECK_ERROR_BREAK(pCurSession, COMGETTER(Id)(&uID));
@@ -3416,17 +3761,20 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlList(PGCTLCMDCTX pCtx)
GuestSessionStatus_T sessionStatus;
CHECK_ERROR_BREAK(pCurSession, COMGETTER(Status)(&sessionStatus));
RTPrintf("\n\tSession #%-3zu ID=%-3RU32 User=%-16ls Status=[%s] Name=%ls",
- i, uID, strUser.raw(), ctrlSessionStatusToText(sessionStatus), strName.raw());
+ i, uID, strUser.raw(), gctlGuestSessionStatusToText(sessionStatus), strName.raw());
+ } while (0);
- if ( fListAll
- || fListProcesses)
+ if ( fListAll
+ || fListProcesses)
+ {
+ SafeIfaceArray <IGuestProcess> collProcesses;
+ CHECK_ERROR_BREAK(pCurSession, COMGETTER(Processes)(ComSafeArrayAsOutParam(collProcesses)));
+ for (size_t a = 0; a < collProcesses.size(); a++)
{
- SafeIfaceArray <IGuestProcess> collProcesses;
- CHECK_ERROR_BREAK(pCurSession, COMGETTER(Processes)(ComSafeArrayAsOutParam(collProcesses)));
- for (size_t a = 0; a < collProcesses.size(); a++)
+ ComPtr<IGuestProcess> pCurProcess = collProcesses[a];
+ if (!pCurProcess.isNull())
{
- ComPtr<IGuestProcess> pCurProcess = collProcesses[a];
- if (!pCurProcess.isNull())
+ do
{
ULONG uPID;
CHECK_ERROR_BREAK(pCurProcess, COMGETTER(PID)(&uPID));
@@ -3436,69 +3784,67 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlList(PGCTLCMDCTX pCtx)
CHECK_ERROR_BREAK(pCurProcess, COMGETTER(Status)(&procStatus));
RTPrintf("\n\t\tProcess #%-03zu PID=%-6RU32 Status=[%s] Command=%ls",
- a, uPID, ctrlProcessStatusToText(procStatus), strExecPath.raw());
- }
+ a, uPID, gctlProcessStatusToText(procStatus), strExecPath.raw());
+ } while (0);
}
-
- cTotalProcs += collProcesses.size();
}
- if ( fListAll
- || fListFiles)
+ cTotalProcs += collProcesses.size();
+ }
+
+ if ( fListAll
+ || fListFiles)
+ {
+ SafeIfaceArray <IGuestFile> collFiles;
+ CHECK_ERROR_BREAK(pCurSession, COMGETTER(Files)(ComSafeArrayAsOutParam(collFiles)));
+ for (size_t a = 0; a < collFiles.size(); a++)
{
- SafeIfaceArray <IGuestFile> collFiles;
- CHECK_ERROR_BREAK(pCurSession, COMGETTER(Files)(ComSafeArrayAsOutParam(collFiles)));
- for (size_t a = 0; a < collFiles.size(); a++)
+ ComPtr<IGuestFile> pCurFile = collFiles[a];
+ if (!pCurFile.isNull())
{
- ComPtr<IGuestFile> pCurFile = collFiles[a];
- if (!pCurFile.isNull())
+ do
{
- CHECK_ERROR_BREAK(pCurFile, COMGETTER(Id)(&uID));
+ ULONG idFile;
+ CHECK_ERROR_BREAK(pCurFile, COMGETTER(Id)(&idFile));
+ Bstr strName;
CHECK_ERROR_BREAK(pCurFile, COMGETTER(FileName)(strName.asOutParam()));
FileStatus_T fileStatus;
CHECK_ERROR_BREAK(pCurFile, COMGETTER(Status)(&fileStatus));
RTPrintf("\n\t\tFile #%-03zu ID=%-6RU32 Status=[%s] Name=%ls",
- a, uID, ctrlFileStatusToText(fileStatus), strName.raw());
- }
+ a, idFile, gctlFileStatusToText(fileStatus), strName.raw());
+ } while (0);
}
-
- cTotalFiles += collFiles.size();
}
+
+ cTotalFiles += collFiles.size();
}
}
-
- RTPrintf("\n\nTotal guest sessions: %zu\n", collSessions.size());
- if (fListAll || fListProcesses)
- RTPrintf("Total guest processes: %zu\n", cTotalProcs);
- if (fListAll || fListFiles)
- RTPrintf("Total guest files: %zu\n", cTotalFiles);
}
- else
- RTPrintf("No active guest sessions found\n");
-
- } while (0);
- if (FAILED(rc))
- rcExit = RTEXITCODE_FAILURE;
+ RTPrintf("\n\nTotal guest sessions: %zu\n", collSessions.size());
+ if (fListAll || fListProcesses)
+ RTPrintf("Total guest processes: %zu\n", cTotalProcs);
+ if (fListAll || fListFiles)
+ RTPrintf("Total guest files: %zu\n", cTotalFiles);
+ }
+ else
+ RTPrintf("No active guest sessions found\n");
}
- else
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_LIST,
- "Invalid listing category '%s", pCtx->ppaArgv[0]);
+
+ if (FAILED(rc))
+ rcExit = RTEXITCODE_FAILURE;
return rcExit;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlProcessClose(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleCloseProcess(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
- if (pCtx->iArgc < 1)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
- "Must specify at least a PID to close");
-
static const RTGETOPTDEF s_aOptions[] =
{
+ GCTLCMD_COMMON_OPTION_DEFS()
{ "--session-id", 'i', RTGETOPT_REQ_UINT32 },
{ "--session-name", 'n', RTGETOPT_REQ_STRING }
};
@@ -3506,21 +3852,19 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessClose(PGCTLCMDCTX pCtx)
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- s_aOptions, RT_ELEMENTS(s_aOptions), pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
std::vector < uint32_t > vecPID;
ULONG ulSessionID = UINT32_MAX;
Utf8Str strSessionName;
- int vrc = VINF_SUCCESS;
-
- while ( (ch = RTGetOpt(&GetState, &ValueUnion))
- && RT_SUCCESS(vrc))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case 'n': /* Session name (or pattern) */
strSessionName = ValueUnion.psz;
break;
@@ -3530,47 +3874,56 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessClose(PGCTLCMDCTX pCtx)
break;
case VINF_GETOPT_NOT_OPTION:
- if (pCtx->iArgc == GetState.iNext)
+ {
+ /* Treat every else specified as a PID to kill. */
+ uint32_t uPid;
+ int rc = RTStrToUInt32Ex(ValueUnion.psz, NULL, 0, &uPid);
+ if ( RT_SUCCESS(rc)
+ && rc != VWRN_TRAILING_CHARS
+ && rc != VWRN_NUMBER_TOO_BIG
+ && rc != VWRN_NEGATIVE_UNSIGNED)
{
- /* Treat every else specified as a PID to kill. */
- try
+ if (uPid != 0)
{
- uint32_t uPID = RTStrToUInt32(ValueUnion.psz);
- if (uPID) /** @todo Is this what we want? If specifying PID 0
- this is not going to work on most systems anyway. */
- vecPID.push_back(uPID);
- else
- vrc = VERR_INVALID_PARAMETER;
- }
- catch(std::bad_alloc &)
- {
- vrc = VERR_NO_MEMORY;
+ try
+ {
+ vecPID.push_back(uPid);
+ }
+ catch (std::bad_alloc &)
+ {
+ return RTMsgErrorExit(RTEXITCODE_FAILURE, "Out of memory");
+ }
}
+ else
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS, "Invalid PID value: 0");
}
+ else
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS,
+ "Error parsing PID value: %Rrc", rc);
break;
+ }
default:
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS, ch, &ValueUnion);
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS, ch, &ValueUnion);
}
}
if (vecPID.empty())
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS,
"At least one PID must be specified to kill!");
if ( strSessionName.isEmpty()
&& ulSessionID == UINT32_MAX)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
- "No session ID specified!");
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS, "No session ID specified!");
- if ( !strSessionName.isEmpty()
+ if ( strSessionName.isNotEmpty()
&& ulSessionID != UINT32_MAX)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSEPROCESS,
"Either session ID or name (pattern) must be specified");
- if (RT_FAILURE(vrc))
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
- "Invalid parameters specified");
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
HRESULT rc = S_OK;
@@ -3633,7 +3986,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessClose(PGCTLCMDCTX pCtx)
if (fProcFound)
{
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Terminating process (PID %RU32) (session ID %RU32) ...\n",
uPID, uID);
CHECK_ERROR_BREAK(pProcess, Terminate());
@@ -3668,38 +4021,18 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlProcessClose(PGCTLCMDCTX pCtx)
return SUCCEEDED(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlProcess(PGCTLCMDCTX pCtx)
-{
- AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
-
- if (pCtx->iArgc < 1)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
- "Must specify an action");
-
- /** Use RTGetOpt here when handling command line args gets more complex. */
-
- if ( !RTStrICmp(pCtx->ppaArgv[0], "close")
- || !RTStrICmp(pCtx->ppaArgv[0], "kill")
- || !RTStrICmp(pCtx->ppaArgv[0], "terminate"))
- {
- pCtx->iFirstArgc++; /* Skip process action. */
- return handleCtrlProcessClose(pCtx);
- }
-
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_PROCESS,
- "Invalid process action '%s'", pCtx->ppaArgv[0]);
-}
-static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleCloseSession(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
- if (pCtx->iArgc < 1)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
- "Must specify at least a session to close");
-
+ enum GETOPTDEF_SESSIONCLOSE
+ {
+ GETOPTDEF_SESSIONCLOSE_ALL = 2000
+ };
static const RTGETOPTDEF s_aOptions[] =
{
+ GCTLCMD_COMMON_OPTION_DEFS()
{ "--all", GETOPTDEF_SESSIONCLOSE_ALL, RTGETOPT_REQ_NOTHING },
{ "--session-id", 'i', RTGETOPT_REQ_UINT32 },
{ "--session-name", 'n', RTGETOPT_REQ_STRING }
@@ -3708,17 +4041,18 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- s_aOptions, RT_ELEMENTS(s_aOptions), pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
ULONG ulSessionID = UINT32_MAX;
Utf8Str strSessionName;
- while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+
case 'n': /* Session name pattern */
strSessionName = ValueUnion.psz;
break;
@@ -3732,24 +4066,27 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
break;
case VINF_GETOPT_NOT_OPTION:
- /** @todo Supply a CSV list of IDs or patterns to close? */
- break;
-
+ /** @todo Supply a CSV list of IDs or patterns to close?
+ * break; */
default:
- return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION, ch, &ValueUnion);
+ return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSESESSION, ch, &ValueUnion);
}
}
if ( strSessionName.isEmpty()
&& ulSessionID == UINT32_MAX)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSESESSION,
"No session ID specified!");
if ( !strSessionName.isEmpty()
&& ulSessionID != UINT32_MAX)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
+ return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_CLOSESESSION,
"Either session ID or name (pattern) must be specified");
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+
HRESULT rc = S_OK;
do
@@ -3787,11 +4124,11 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
cSessionsHandled++;
Assert(!pSession.isNull());
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Closing guest session ID=#%RU32 \"%s\" ...\n",
uID, strNameUtf8.c_str());
CHECK_ERROR_BREAK(pSession, Close());
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Guest session successfully closed\n");
pSession.setNull();
@@ -3809,51 +4146,32 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlSessionClose(PGCTLCMDCTX pCtx)
return SUCCEEDED(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE;
}
-static DECLCALLBACK(RTEXITCODE) handleCtrlSession(PGCTLCMDCTX pCtx)
-{
- AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
-
- if (pCtx->iArgc < 1)
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
- "Must specify an action");
-
- /** Use RTGetOpt here when handling command line args gets more complex. */
- if ( !RTStrICmp(pCtx->ppaArgv[0], "close")
- || !RTStrICmp(pCtx->ppaArgv[0], "kill")
- || !RTStrICmp(pCtx->ppaArgv[0], "terminate"))
- {
- pCtx->iFirstArgc++; /* Skip session action. */
- return handleCtrlSessionClose(pCtx);
- }
-
- return errorSyntaxEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_SESSION,
- "Invalid session action '%s'", pCtx->ppaArgv[0]);
-}
-
-static DECLCALLBACK(RTEXITCODE) handleCtrlWatch(PGCTLCMDCTX pCtx)
+static DECLCALLBACK(RTEXITCODE) gctlHandleWatch(PGCTLCMDCTX pCtx, int argc, char **argv)
{
AssertPtrReturn(pCtx, RTEXITCODE_FAILURE);
/*
* Parse arguments.
*/
- static const RTGETOPTDEF s_aOptions[] = { { 0 } };
+ static const RTGETOPTDEF s_aOptions[] =
+ {
+ GCTLCMD_COMMON_OPTION_DEFS()
+ };
int ch;
RTGETOPTUNION ValueUnion;
RTGETOPTSTATE GetState;
- RTGetOptInit(&GetState, pCtx->iArgc, pCtx->ppaArgv,
- NULL /*s_aOptions*/, 0 /*RT_ELEMENTS(s_aOptions)*/, pCtx->iFirstArgc, RTGETOPTINIT_FLAGS_OPTS_FIRST);
+ RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
- while ((ch = RTGetOpt(&GetState, &ValueUnion)))
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
{
/* For options that require an argument, ValueUnion has received the value. */
switch (ch)
{
- case VINF_GETOPT_NOT_OPTION:
- break;
+ GCTLCMD_COMMON_OPTION_CASES(pCtx, ch, &ValueUnion);
+ case VINF_GETOPT_NOT_OPTION:
default:
return errorGetOptEx(USAGE_GUESTCONTROL, USAGE_GSTCTRL_WATCH, ch, &ValueUnion);
}
@@ -3862,6 +4180,10 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlWatch(PGCTLCMDCTX pCtx)
/** @todo Specify categories to watch for. */
/** @todo Specify a --timeout for waiting only for a certain amount of time? */
+ RTEXITCODE rcExit = gctlCtxPostOptionParsingInit(pCtx);
+ if (rcExit != RTEXITCODE_SUCCESS)
+ return rcExit;
+
HRESULT rc;
try
@@ -3886,7 +4208,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlWatch(PGCTLCMDCTX pCtx)
} while (0);
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Waiting for events ...\n");
while (!g_fGuestCtrlCanceled)
@@ -3895,7 +4217,7 @@ static DECLCALLBACK(RTEXITCODE) handleCtrlWatch(PGCTLCMDCTX pCtx)
RTThreadSleep(10);
}
- if (pCtx->fVerbose)
+ if (pCtx->cVerbose > 1)
RTPrintf("Signal caught, exiting ...\n");
if (!pGuestListener.isNull())
@@ -3931,134 +4253,115 @@ int handleGuestControl(HandlerArg *pArg)
return RTEXITCODE_FAILURE;
#endif
- /* pArg->argv[0] contains the VM name. */
- /* pArg->argv[1] contains the guest control command. */
- if (pArg->argc < 2)
- return errorSyntax(USAGE_GUESTCONTROL, "No sub command specified!");
-
- uint32_t uCmdCtxFlags = 0;
- uint32_t uUsage;
- GCTLCMD gctlCmd;
- if ( !RTStrICmp(pArg->argv[1], "exec")
- || !RTStrICmp(pArg->argv[1], "execute"))
- {
- gctlCmd.pfnHandler = handleCtrlProcessExec;
- uUsage = USAGE_GSTCTRL_EXEC;
- }
- else if (!RTStrICmp(pArg->argv[1], "copyfrom"))
- {
- gctlCmd.pfnHandler = handleCtrlCopyFrom;
- uUsage = USAGE_GSTCTRL_COPYFROM;
- }
- else if ( !RTStrICmp(pArg->argv[1], "copyto")
- || !RTStrICmp(pArg->argv[1], "cp"))
- {
- gctlCmd.pfnHandler = handleCtrlCopyTo;
- uUsage = USAGE_GSTCTRL_COPYTO;
- }
- else if ( !RTStrICmp(pArg->argv[1], "createdirectory")
- || !RTStrICmp(pArg->argv[1], "createdir")
- || !RTStrICmp(pArg->argv[1], "mkdir")
- || !RTStrICmp(pArg->argv[1], "md"))
- {
- gctlCmd.pfnHandler = handleCtrlCreateDirectory;
- uUsage = USAGE_GSTCTRL_CREATEDIR;
- }
- else if ( !RTStrICmp(pArg->argv[1], "removedirectory")
- || !RTStrICmp(pArg->argv[1], "removedir")
- || !RTStrICmp(pArg->argv[1], "rmdir"))
- {
- gctlCmd.pfnHandler = handleCtrlRemoveDirectory;
- uUsage = USAGE_GSTCTRL_REMOVEDIR;
- }
- else if ( !RTStrICmp(pArg->argv[1], "rm")
- || !RTStrICmp(pArg->argv[1], "removefile"))
- {
- gctlCmd.pfnHandler = handleCtrlRemoveFile;
- uUsage = USAGE_GSTCTRL_REMOVEFILE;
- }
- else if ( !RTStrICmp(pArg->argv[1], "ren")
- || !RTStrICmp(pArg->argv[1], "rename")
- || !RTStrICmp(pArg->argv[1], "mv"))
- {
- gctlCmd.pfnHandler = handleCtrlRename;
- uUsage = USAGE_GSTCTRL_RENAME;
- }
- else if ( !RTStrICmp(pArg->argv[1], "createtemporary")
- || !RTStrICmp(pArg->argv[1], "createtemp")
- || !RTStrICmp(pArg->argv[1], "mktemp"))
- {
- gctlCmd.pfnHandler = handleCtrlCreateTemp;
- uUsage = USAGE_GSTCTRL_CREATETEMP;
- }
- else if ( !RTStrICmp(pArg->argv[1], "kill") /* Linux. */
- || !RTStrICmp(pArg->argv[1], "pkill") /* Solaris / *BSD. */
- || !RTStrICmp(pArg->argv[1], "pskill")) /* SysInternals version. */
- {
- /** @todo What about "taskkill" on Windows? */
- uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
- | CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
- gctlCmd.pfnHandler = handleCtrlProcessClose;
- uUsage = USAGE_GSTCTRL_KILL;
- }
- /** @todo Implement "killall"? */
- else if ( !RTStrICmp(pArg->argv[1], "stat"))
- {
- gctlCmd.pfnHandler = handleCtrlStat;
- uUsage = USAGE_GSTCTRL_STAT;
- }
- else if ( !RTStrICmp(pArg->argv[1], "updateadditions")
- || !RTStrICmp(pArg->argv[1], "updateadds"))
- {
- uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
- | CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
- gctlCmd.pfnHandler = handleCtrlUpdateAdditions;
- uUsage = USAGE_GSTCTRL_UPDATEADDS;
- }
- else if ( !RTStrICmp(pArg->argv[1], "list"))
- {
- uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
- | CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
- gctlCmd.pfnHandler = handleCtrlList;
- uUsage = USAGE_GSTCTRL_LIST;
- }
- else if ( !RTStrICmp(pArg->argv[1], "session"))
- {
- uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
- | CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
- gctlCmd.pfnHandler = handleCtrlSession;
- uUsage = USAGE_GSTCTRL_SESSION;
- }
- else if ( !RTStrICmp(pArg->argv[1], "process"))
- {
- uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
- | CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
- gctlCmd.pfnHandler = handleCtrlProcess;
- uUsage = USAGE_GSTCTRL_PROCESS;
- }
- else if ( !RTStrICmp(pArg->argv[1], "watch"))
+ /*
+ * Command definitions.
+ */
+ static const GCTLCMDDEF s_aCmdDefs[] =
{
- uCmdCtxFlags = CTLCMDCTX_FLAGS_SESSION_ANONYMOUS
- | CTLCMDCTX_FLAGS_NO_SIGNAL_HANDLER;
- gctlCmd.pfnHandler = handleCtrlWatch;
- uUsage = USAGE_GSTCTRL_WATCH;
- }
- else
- return errorSyntax(USAGE_GUESTCONTROL, "Unknown sub command '%s' specified!", pArg->argv[1]);
-
- GCTLCMDCTX cmdCtx;
- RT_ZERO(cmdCtx);
+ { "run", gctlHandleRun, USAGE_GSTCTRL_RUN, 0, },
+ { "start", gctlHandleStart, USAGE_GSTCTRL_START, 0, },
+ { "copyfrom", gctlHandleCopyFrom, USAGE_GSTCTRL_COPYFROM, 0, },
+ { "copyto", gctlHandleCopyTo, USAGE_GSTCTRL_COPYTO, 0, },
+
+ { "mkdir", handleCtrtMkDir, USAGE_GSTCTRL_MKDIR, 0, },
+ { "md", handleCtrtMkDir, USAGE_GSTCTRL_MKDIR, 0, },
+ { "createdirectory", handleCtrtMkDir, USAGE_GSTCTRL_MKDIR, 0, },
+ { "createdir", handleCtrtMkDir, USAGE_GSTCTRL_MKDIR, 0, },
+
+ { "rmdir", gctlHandleRmDir, USAGE_GSTCTRL_RMDIR, 0, },
+ { "removedir", gctlHandleRmDir, USAGE_GSTCTRL_RMDIR, 0, },
+ { "removedirectory", gctlHandleRmDir, USAGE_GSTCTRL_RMDIR, 0, },
+
+ { "rm", gctlHandleRm, USAGE_GSTCTRL_RM, 0, },
+ { "removefile", gctlHandleRm, USAGE_GSTCTRL_RM, 0, },
+ { "erase", gctlHandleRm, USAGE_GSTCTRL_RM, 0, },
+ { "del", gctlHandleRm, USAGE_GSTCTRL_RM, 0, },
+ { "delete", gctlHandleRm, USAGE_GSTCTRL_RM, 0, },
+
+ { "mv", gctlHandleMv, USAGE_GSTCTRL_MV, 0, },
+ { "move", gctlHandleMv, USAGE_GSTCTRL_MV, 0, },
+ { "ren", gctlHandleMv, USAGE_GSTCTRL_MV, 0, },
+ { "rename", gctlHandleMv, USAGE_GSTCTRL_MV, 0, },
+
+ { "mktemp", gctlHandleMkTemp, USAGE_GSTCTRL_MKTEMP, 0, },
+ { "createtemp", gctlHandleMkTemp, USAGE_GSTCTRL_MKTEMP, 0, },
+ { "createtemporary", gctlHandleMkTemp, USAGE_GSTCTRL_MKTEMP, 0, },
+
+ { "stat", gctlHandleStat, USAGE_GSTCTRL_STAT, 0, },
+
+ { "closeprocess", gctlHandleCloseProcess, USAGE_GSTCTRL_CLOSEPROCESS, GCTLCMDCTX_F_SESSION_ANONYMOUS | GCTLCMDCTX_F_NO_SIGNAL_HANDLER, },
+ { "closesession", gctlHandleCloseSession, USAGE_GSTCTRL_CLOSESESSION, GCTLCMDCTX_F_SESSION_ANONYMOUS | GCTLCMDCTX_F_NO_SIGNAL_HANDLER, },
+ { "list", gctlHandleList, USAGE_GSTCTRL_LIST, GCTLCMDCTX_F_SESSION_ANONYMOUS | GCTLCMDCTX_F_NO_SIGNAL_HANDLER, },
+ { "watch", gctlHandleWatch, USAGE_GSTCTRL_WATCH, GCTLCMDCTX_F_SESSION_ANONYMOUS | GCTLCMDCTX_F_NO_SIGNAL_HANDLER, },
+
+ {"updateguestadditions",gctlHandleUpdateAdditions, USAGE_GSTCTRL_UPDATEGA, GCTLCMDCTX_F_SESSION_ANONYMOUS | GCTLCMDCTX_F_NO_SIGNAL_HANDLER, },
+ { "updateadditions", gctlHandleUpdateAdditions, USAGE_GSTCTRL_UPDATEGA, GCTLCMDCTX_F_SESSION_ANONYMOUS | GCTLCMDCTX_F_NO_SIGNAL_HANDLER, },
+ { "updatega", gctlHandleUpdateAdditions, USAGE_GSTCTRL_UPDATEGA, GCTLCMDCTX_F_SESSION_ANONYMOUS | GCTLCMDCTX_F_NO_SIGNAL_HANDLER, },
+ };
- RTEXITCODE rcExit = ctrlInitVM(pArg, &cmdCtx, uCmdCtxFlags, uUsage);
+ /*
+ * VBoxManage guestcontrol [common-options] <VM> [common-options] <sub-command> ...
+ *
+ * Parse common options and VM name until we find a sub-command. Allowing
+ * the user to put the user and password related options before the
+ * sub-command makes it easier to edit the command line when doing several
+ * operations with the same guest user account. (Accidentally, it also
+ * makes the syntax diagram shorter and easier to read.)
+ */
+ GCTLCMDCTX CmdCtx;
+ RTEXITCODE rcExit = gctrCmdCtxInit(&CmdCtx, pArg);
if (rcExit == RTEXITCODE_SUCCESS)
{
- /* Kick off the actual command handler. */
- rcExit = gctlCmd.pfnHandler(&cmdCtx);
+ static const RTGETOPTDEF s_CommonOptions[] = { GCTLCMD_COMMON_OPTION_DEFS() };
- ctrlUninitVM(&cmdCtx, cmdCtx.uFlags);
- return rcExit;
- }
+ int ch;
+ RTGETOPTUNION ValueUnion;
+ RTGETOPTSTATE GetState;
+ RTGetOptInit(&GetState, pArg->argc, pArg->argv, s_CommonOptions, RT_ELEMENTS(s_CommonOptions), 0, 0 /* No sorting! */);
+
+ while ((ch = RTGetOpt(&GetState, &ValueUnion)) != 0)
+ {
+ switch (ch)
+ {
+ GCTLCMD_COMMON_OPTION_CASES(&CmdCtx, ch, &ValueUnion);
+
+ case VINF_GETOPT_NOT_OPTION:
+ /* First comes the VM name or UUID. */
+ if (!CmdCtx.pszVmNameOrUuid)
+ CmdCtx.pszVmNameOrUuid = ValueUnion.psz;
+ /*
+ * The sub-command is next. Look it up and invoke it.
+ * Note! Currently no warnings about user/password options (like we'll do later on)
+ * for GCTLCMDCTX_F_SESSION_ANONYMOUS commands. No reason to be too pedantic.
+ */
+ else
+ {
+ const char *pszCmd = ValueUnion.psz;
+ uint32_t iCmd;
+ for (iCmd = 0; iCmd < RT_ELEMENTS(s_aCmdDefs); iCmd++)
+ if (strcmp(s_aCmdDefs[iCmd].pszName, pszCmd) == 0)
+ {
+ CmdCtx.pCmdDef = &s_aCmdDefs[iCmd];
+
+ rcExit = s_aCmdDefs[iCmd].pfnHandler(&CmdCtx, pArg->argc - GetState.iNext + 1,
+ &pArg->argv[GetState.iNext - 1]);
+
+ gctlCtxTerm(&CmdCtx);
+ return rcExit;
+ }
+ return errorSyntax(USAGE_GUESTCONTROL, "Unknown sub-command: '%s'", pszCmd);
+ }
+ break;
+ default:
+ return errorGetOpt(USAGE_GUESTCONTROL, ch, &ValueUnion);
+ }
+ }
+ if (CmdCtx.pszVmNameOrUuid)
+ rcExit = errorSyntax(USAGE_GUESTCONTROL, "Missing sub-command");
+ else
+ rcExit = errorSyntax(USAGE_GUESTCONTROL, "Missing VM name and sub-command");
+ }
return rcExit;
}
#endif /* !VBOX_ONLY_DOCS */
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.h b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.h
index e172f38..e40722a 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.h
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2013 Oracle Corporation
+ * Copyright (C) 2013-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -28,9 +28,9 @@
#include <map>
-const char *ctrlFileStatusToText(FileStatus_T enmStatus);
-const char *ctrlProcessStatusToText(ProcessStatus_T enmStatus);
-const char *ctrlSessionStatusToText(GuestSessionStatus_T enmStatus);
+const char *gctlFileStatusToText(FileStatus_T enmStatus);
+const char *gctlProcessStatusToText(ProcessStatus_T enmStatus);
+const char *gctlGuestSessionStatusToText(GuestSessionStatus_T enmStatus);
using namespace com;
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrlListener.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrlListener.cpp
index 04c5c57..91e0a70 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrlListener.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrlListener.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2013 Oracle Corporation
+ * Copyright (C) 2013-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -33,6 +33,14 @@
#include <map>
#include <vector>
+
+
+/*
+ * GuestListenerBase
+ * GuestListenerBase
+ * GuestListenerBase
+ */
+
GuestListenerBase::GuestListenerBase(void)
: mfVerbose(false)
{
@@ -49,6 +57,13 @@ HRESULT GuestListenerBase::init(bool fVerbose)
}
+
+/*
+ * GuestFileEventListener
+ * GuestFileEventListener
+ * GuestFileEventListener
+ */
+
GuestFileEventListener::GuestFileEventListener(void)
{
}
@@ -85,8 +100,7 @@ STDMETHODIMP GuestFileEventListener::HandleEvent(VBoxEventType_T aType, IEvent *
CHECK_ERROR_BREAK(pProcess, COMGETTER(Id)(&uID));
RTPrintf("File ID=%RU32 \"%s\" changed status to [%s]\n",
- uID, Utf8Str(strPath).c_str(),
- ctrlFileStatusToText(fileSts));
+ uID, Utf8Str(strPath).c_str(), gctlFileStatusToText(fileSts));
} while (0);
break;
@@ -99,6 +113,13 @@ STDMETHODIMP GuestFileEventListener::HandleEvent(VBoxEventType_T aType, IEvent *
return S_OK;
}
+
+/*
+ * GuestProcessEventListener
+ * GuestProcessEventListener
+ * GuestProcessEventListener
+ */
+
GuestProcessEventListener::GuestProcessEventListener(void)
{
}
@@ -135,8 +156,7 @@ STDMETHODIMP GuestProcessEventListener::HandleEvent(VBoxEventType_T aType, IEven
CHECK_ERROR_BREAK(pProcess, COMGETTER(PID)(&uPID));
RTPrintf("Process PID=%RU32 \"%s\" changed status to [%s]\n",
- uPID, Utf8Str(strPath).c_str(),
- ctrlProcessStatusToText(procSts));
+ uPID, Utf8Str(strPath).c_str(), gctlProcessStatusToText(procSts));
} while (0);
break;
@@ -149,6 +169,13 @@ STDMETHODIMP GuestProcessEventListener::HandleEvent(VBoxEventType_T aType, IEven
return S_OK;
}
+
+/*
+ * GuestSessionEventListener
+ * GuestSessionEventListener
+ * GuestSessionEventListener
+ */
+
GuestSessionEventListener::GuestSessionEventListener(void)
{
}
@@ -355,8 +382,7 @@ STDMETHODIMP GuestSessionEventListener::HandleEvent(VBoxEventType_T aType, IEven
CHECK_ERROR_BREAK(pSession, COMGETTER(Name)(strName.asOutParam()));
RTPrintf("Session ID=%RU32 \"%s\" changed status to [%s]\n",
- uID, Utf8Str(strName).c_str(),
- ctrlSessionStatusToText(sessSts));
+ uID, Utf8Str(strName).c_str(), gctlGuestSessionStatusToText(sessSts));
} while (0);
break;
@@ -369,6 +395,13 @@ STDMETHODIMP GuestSessionEventListener::HandleEvent(VBoxEventType_T aType, IEven
return S_OK;
}
+
+/*
+ * GuestEventListener
+ * GuestEventListener
+ * GuestEventListener
+ */
+
GuestEventListener::GuestEventListener(void)
{
}
@@ -480,5 +513,6 @@ STDMETHODIMP GuestEventListener::HandleEvent(VBoxEventType_T aType, IEvent *aEve
return S_OK;
}
+
#endif /* !VBOX_ONLY_DOCS */
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
index 2a05a8e..0cc866e 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp
@@ -188,7 +188,7 @@ void printUsage(USAGECATEGORY fCategory, uint32_t fSubCategory, PRTSTREAM pStrm)
" [--vtxux on|off]\n"
" [--pae on|off]\n"
" [--longmode on|off]\n"
- " [--synthcpu on|off]\n"
+ " [--cpuid-portability-level <0..3>\n"
" [--cpuidset <leaf> <eax> <ebx> <ecx> <edx>]\n"
" [--cpuidremove <leaf>]\n"
" [--cpuidremoveall]\n"
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
index aafa967..719a776 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp
@@ -557,7 +557,7 @@ HRESULT showVMInfo(ComPtr<IVirtualBox> pVirtualBox,
SHOW_ULONG_PROP( machine, CPUCount, "cpus", "Number of CPUs", "");
SHOW_BOOLEAN_METHOD( machine, GetCPUProperty(CPUPropertyType_PAE, &f), "pae", "PAE");
SHOW_BOOLEAN_METHOD( machine, GetCPUProperty(CPUPropertyType_LongMode, &f), "longmode", "Long Mode");
- SHOW_BOOLEAN_METHOD( machine, GetCPUProperty(CPUPropertyType_Synthetic, &f), "synthcpu", "Synthetic CPU");
+ SHOW_ULONG_PROP( machine, CPUIDPortabilityLevel, "cpuid-portability-level", "CPUID Portability Level", "");
if (details != VMINFO_MACHINEREADABLE)
RTPrintf("CPUID overrides: ");
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
index b48f0a8..5fb0f31 100644
--- a/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
+++ b/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp
@@ -59,7 +59,7 @@ enum
MODIFYVM_IOAPIC,
MODIFYVM_PAE,
MODIFYVM_LONGMODE,
- MODIFYVM_SYNTHCPU,
+ MODIFYVM_CPUID_PORTABILITY,
MODIFYVM_TFRESET,
MODIFYVM_PARAVIRTPROVIDER,
MODIFYVM_HWVIRTEX,
@@ -224,7 +224,7 @@ static const RTGETOPTDEF g_aModifyVMOptions[] =
{ "--ioapic", MODIFYVM_IOAPIC, RTGETOPT_REQ_BOOL_ONOFF },
{ "--pae", MODIFYVM_PAE, RTGETOPT_REQ_BOOL_ONOFF },
{ "--longmode", MODIFYVM_LONGMODE, RTGETOPT_REQ_BOOL_ONOFF },
- { "--synthcpu", MODIFYVM_SYNTHCPU, RTGETOPT_REQ_BOOL_ONOFF },
+ { "--cpuid-portability-level", MODIFYVM_CPUID_PORTABILITY, RTGETOPT_REQ_UINT32 },
{ "--triplefaultreset", MODIFYVM_TFRESET, RTGETOPT_REQ_BOOL_ONOFF },
{ "--paravirtprovider", MODIFYVM_PARAVIRTPROVIDER, RTGETOPT_REQ_STRING },
{ "--hwvirtex", MODIFYVM_HWVIRTEX, RTGETOPT_REQ_BOOL_ONOFF },
@@ -637,9 +637,9 @@ int handleModifyVM(HandlerArg *a)
break;
}
- case MODIFYVM_SYNTHCPU:
+ case MODIFYVM_CPUID_PORTABILITY:
{
- CHECK_ERROR(sessionMachine, SetCPUProperty(CPUPropertyType_Synthetic, ValueUnion.f));
+ CHECK_ERROR(sessionMachine, COMSETTER(CPUIDPortabilityLevel)(ValueUnion.u32));
break;
}
diff --git a/src/VBox/Frontends/VBoxSDL/Framebuffer.cpp b/src/VBox/Frontends/VBoxSDL/Framebuffer.cpp
index 6f97a5b..10aa78b 100644
--- a/src/VBox/Frontends/VBoxSDL/Framebuffer.cpp
+++ b/src/VBox/Frontends/VBoxSDL/Framebuffer.cpp
@@ -1,3 +1,4 @@
+/* $Id: Framebuffer.cpp $ */
/** @file
*
* VBox frontends: VBoxSDL (simple frontend based on SDL):
diff --git a/src/VBox/Frontends/VBoxSDL/Framebuffer.h b/src/VBox/Frontends/VBoxSDL/Framebuffer.h
index fd60517..a2b09c9 100644
--- a/src/VBox/Frontends/VBoxSDL/Framebuffer.h
+++ b/src/VBox/Frontends/VBoxSDL/Framebuffer.h
@@ -1,3 +1,4 @@
+/* $Id: Framebuffer.h $ */
/** @file
*
* VBox frontends: VBoxSDL (simple frontend based on SDL):
diff --git a/src/VBox/Frontends/VBoxSDL/Helper.cpp b/src/VBox/Frontends/VBoxSDL/Helper.cpp
index 5750d0f..9500129 100644
--- a/src/VBox/Frontends/VBoxSDL/Helper.cpp
+++ b/src/VBox/Frontends/VBoxSDL/Helper.cpp
@@ -1,3 +1,4 @@
+/* $Id: Helper.cpp $ */
/** @file
*
* VBox frontends: VBoxSDL (simple frontend based on SDL):
diff --git a/src/VBox/Frontends/VBoxSDL/Helper.h b/src/VBox/Frontends/VBoxSDL/Helper.h
index 6b72520..94475ae 100644
--- a/src/VBox/Frontends/VBoxSDL/Helper.h
+++ b/src/VBox/Frontends/VBoxSDL/Helper.h
@@ -1,3 +1,4 @@
+/* $Id: Helper.h $ */
/** @file
*
* VBox frontends: VBoxSDL (simple frontend based on SDL):
diff --git a/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp b/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
index afea255..d0c37fb 100644
--- a/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
+++ b/src/VBox/Frontends/VBoxSDL/VBoxSDL.cpp
@@ -1,3 +1,4 @@
+/* $Id: VBoxSDL.cpp $ */
/** @file
* VBox frontends: VBoxSDL (simple frontend based on SDL):
* Main code
@@ -527,6 +528,8 @@ public:
SDL_VERSION(&info.version);
if (!SDL_GetWMInfo(&info))
pCSWEv->AddVeto(NULL);
+ else
+ pCSWEv->AddApproval(NULL);
#endif
break;
}
@@ -535,6 +538,10 @@ public:
{
ComPtr<IShowWindowEvent> pSWEv = aEvent;
Assert(pSWEv);
+ LONG64 winId = 0;
+ pSWEv->COMGETTER(WinId)(&winId);
+ if (winId != 0)
+ break; /* WinId already set by some other listener. */
#ifndef RT_OS_DARWIN
SDL_SysWMinfo info;
SDL_VERSION(&info.version);
diff --git a/src/VBox/Frontends/VBoxSDL/VBoxSDL.h b/src/VBox/Frontends/VBoxSDL/VBoxSDL.h
index 0dd471b..24170e2 100644
--- a/src/VBox/Frontends/VBoxSDL/VBoxSDL.h
+++ b/src/VBox/Frontends/VBoxSDL/VBoxSDL.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxSDL.h $ */
/** @file
*
* VBox frontends: VBoxSDL (simple frontend based on SDL):
diff --git a/src/VBox/Frontends/VBoxSDL/VBoxSDLMain-darwin.h b/src/VBox/Frontends/VBoxSDL/VBoxSDLMain-darwin.h
index 4683df5..ef9c104 100644
--- a/src/VBox/Frontends/VBoxSDL/VBoxSDLMain-darwin.h
+++ b/src/VBox/Frontends/VBoxSDL/VBoxSDLMain-darwin.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
Initial Version: Darrell Walisser <dwaliss1 at purdue.edu>
Non-NIB-Code & other changes: Max Horn <max at quendi.de>
diff --git a/src/VBox/Frontends/VBoxSDL/VBoxSDLTest.cpp b/src/VBox/Frontends/VBoxSDL/VBoxSDLTest.cpp
index 159266a..1cb0b5a 100644
--- a/src/VBox/Frontends/VBoxSDL/VBoxSDLTest.cpp
+++ b/src/VBox/Frontends/VBoxSDL/VBoxSDLTest.cpp
@@ -1,3 +1,4 @@
+/* $Id: VBoxSDLTest.cpp $ */
/** @file
*
* VBox frontends: VBoxSDL (simple frontend based on SDL):
diff --git a/src/VBox/Frontends/VirtualBox/Makefile.kmk b/src/VBox/Frontends/VirtualBox/Makefile.kmk
index 59d340d..1f4c744 100644
--- a/src/VBox/Frontends/VirtualBox/Makefile.kmk
+++ b/src/VBox/Frontends/VirtualBox/Makefile.kmk
@@ -152,6 +152,7 @@ VBOX_GUI_INC_DIRS = \
./src/extradata \
./src/globals \
./src/medium \
+ ./src/objects \
./src/platform \
./src/platform/darwin \
./src/platform/win \
@@ -578,6 +579,7 @@ VirtualBox_SOURCES = \
src/medium/UIMedium.cpp \
src/medium/UIMediumEnumerator.cpp \
src/medium/UIMediumManager.cpp \
+ src/objects/UIRichTextString.cpp \
src/runtime/UIActionPoolRuntime.cpp \
src/runtime/UIAddDiskEncryptionPasswordDialog.cpp \
src/runtime/UIConsoleEventHandler.cpp \
diff --git a/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc b/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc
index b5d6c0e..a232ac6 100644
--- a/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc
+++ b/src/VBox/Frontends/VirtualBox/VirtualBox1.qrc
@@ -279,5 +279,6 @@
<file alias="os_turbolinux_64.png">images/os_turbolinux_64.png</file>
<file alias="os_type_16px.png">images/os_type_16px.png</file>
<file alias="os_ubuntu.png">images/os_ubuntu.png</file>
+ <file alias="os_ubuntu_64.png">images/os_ubuntu_64.png</file>
</qresource>
</RCC>
diff --git a/src/VBox/Frontends/VirtualBox/VirtualBox1_hidpi.qrc b/src/VBox/Frontends/VirtualBox/VirtualBox1_hidpi.qrc
index 89e4674..715cdce 100644
--- a/src/VBox/Frontends/VirtualBox/VirtualBox1_hidpi.qrc
+++ b/src/VBox/Frontends/VirtualBox/VirtualBox1_hidpi.qrc
@@ -259,5 +259,15 @@
<file alias="os_oracle_64_hidpi.png">images/hidpi/os_oracle_64_hidpi.png</file>
<file alias="os_oracle_hidpi.png">images/hidpi/os_oracle_hidpi.png</file>
<file alias="os_oraclesolaris_64_hidpi.png">images/hidpi/os_oraclesolaris_64_hidpi.png</file>
+ <file alias="os_oraclesolaris_hidpi.png">images/hidpi/os_oraclesolaris_hidpi.png</file>
+ <file alias="os_os2_other_hidpi.png">images/hidpi/os_os2_other_hidpi.png</file>
+ <file alias="os_os2ecs_hidpi.png">images/hidpi/os_os2ecs_hidpi.png</file>
+ <file alias="os_os2warp3_hidpi.png">images/hidpi/os_os2warp3_hidpi.png</file>
+ <file alias="os_os2warp45_hidpi.png">images/hidpi/os_os2warp45_hidpi.png</file>
+ <file alias="os_os2warp4_hidpi.png">images/hidpi/os_os2warp4_hidpi.png</file>
+ <file alias="os_other_64_hidpi.png">images/hidpi/os_other_64_hidpi.png</file>
+ <file alias="os_other_hidpi.png">images/hidpi/os_other_hidpi.png</file>
+ <file alias="os_qnx_hidpi.png">images/hidpi/os_qnx_hidpi.png</file>
+ <file alias="os_redhat_64_hidpi.png">images/hidpi/os_redhat_64_hidpi.png</file>
</qresource>
</RCC>
diff --git a/src/VBox/Frontends/VirtualBox/VirtualBox2.qrc b/src/VBox/Frontends/VirtualBox/VirtualBox2.qrc
index cbf91c7..bd47d16 100644
--- a/src/VBox/Frontends/VirtualBox/VirtualBox2.qrc
+++ b/src/VBox/Frontends/VirtualBox/VirtualBox2.qrc
@@ -1,6 +1,5 @@
<RCC>
<qresource prefix="/">
- <file alias="os_ubuntu_64.png">images/os_ubuntu_64.png</file>
<file alias="os_win10.png">images/os_win10.png</file>
<file alias="os_win10_64.png">images/os_win10_64.png</file>
<file alias="os_win2k.png">images/os_win2k.png</file>
@@ -52,6 +51,7 @@
<file alias="progress_poweroff_90px.png">images/progress_poweroff_90px.png</file>
<file alias="progress_reading_appliance_90px.png">images/progress_reading_appliance_90px.png</file>
<file alias="progress_refresh_90px.png">images/progress_refresh_90px.png</file>
+ <file alias="progress_settings_90px.png">images/progress_settings_90px.png</file>
<file alias="progress_snapshot_create_90px.png">images/progress_snapshot_create_90px.png</file>
<file alias="progress_snapshot_discard_90px.png">images/progress_snapshot_discard_90px.png</file>
<file alias="progress_snapshot_restore_90px.png">images/progress_snapshot_restore_90px.png</file>
diff --git a/src/VBox/Frontends/VirtualBox/VirtualBox2_hidpi.qrc b/src/VBox/Frontends/VirtualBox/VirtualBox2_hidpi.qrc
index 18d2232..d330d48 100644
--- a/src/VBox/Frontends/VirtualBox/VirtualBox2_hidpi.qrc
+++ b/src/VBox/Frontends/VirtualBox/VirtualBox2_hidpi.qrc
@@ -1,15 +1,5 @@
<RCC>
<qresource prefix="/">
- <file alias="os_oraclesolaris_hidpi.png">images/hidpi/os_oraclesolaris_hidpi.png</file>
- <file alias="os_os2_other_hidpi.png">images/hidpi/os_os2_other_hidpi.png</file>
- <file alias="os_os2ecs_hidpi.png">images/hidpi/os_os2ecs_hidpi.png</file>
- <file alias="os_os2warp3_hidpi.png">images/hidpi/os_os2warp3_hidpi.png</file>
- <file alias="os_os2warp45_hidpi.png">images/hidpi/os_os2warp45_hidpi.png</file>
- <file alias="os_os2warp4_hidpi.png">images/hidpi/os_os2warp4_hidpi.png</file>
- <file alias="os_other_64_hidpi.png">images/hidpi/os_other_64_hidpi.png</file>
- <file alias="os_other_hidpi.png">images/hidpi/os_other_hidpi.png</file>
- <file alias="os_qnx_hidpi.png">images/hidpi/os_qnx_hidpi.png</file>
- <file alias="os_redhat_64_hidpi.png">images/hidpi/os_redhat_64_hidpi.png</file>
<file alias="os_redhat_hidpi.png">images/hidpi/os_redhat_hidpi.png</file>
<file alias="os_solaris_64_hidpi.png">images/hidpi/os_solaris_64_hidpi.png</file>
<file alias="os_solaris_hidpi.png">images/hidpi/os_solaris_hidpi.png</file>
@@ -55,6 +45,26 @@
<file alias="preview_full_16to9_242x155px_hidpi.png">images/hidpi/preview_full_16to9_242x155px_hidpi.png</file>
<file alias="preview_full_4to3_242x192px_hidpi.png">images/hidpi/preview_full_4to3_242x192px_hidpi.png</file>
<file alias="previous_16px_hidpi.png">images/hidpi/previous_16px_hidpi.png</file>
+ <file alias="progress_clone_90px_hidpi.png">images/hidpi/progress_clone_90px_hidpi.png</file>
+ <file alias="progress_delete_90px_hidpi.png">images/hidpi/progress_delete_90px_hidpi.png</file>
+ <file alias="progress_dnd_gh_90px_hidpi.png">images/hidpi/progress_dnd_gh_90px_hidpi.png</file>
+ <file alias="progress_dnd_hg_90px_hidpi.png">images/hidpi/progress_dnd_hg_90px_hidpi.png</file>
+ <file alias="progress_export_90px_hidpi.png">images/hidpi/progress_export_90px_hidpi.png</file>
+ <file alias="progress_import_90px_hidpi.png">images/hidpi/progress_import_90px_hidpi.png</file>
+ <file alias="progress_install_guest_additions_90px_hidpi.png">images/hidpi/progress_install_guest_additions_90px_hidpi.png</file>
+ <file alias="progress_media_create_90px_hidpi.png">images/hidpi/progress_media_create_90px_hidpi.png</file>
+ <file alias="progress_media_delete_90px_hidpi.png">images/hidpi/progress_media_delete_90px_hidpi.png</file>
+ <file alias="progress_network_interface_90px_hidpi.png">images/hidpi/progress_network_interface_90px_hidpi.png</file>
+ <file alias="progress_poweroff_90px_hidpi.png">images/hidpi/progress_poweroff_90px_hidpi.png</file>
+ <file alias="progress_reading_appliance_90px_hidpi.png">images/hidpi/progress_reading_appliance_90px_hidpi.png</file>
+ <file alias="progress_refresh_90px_hidpi.png">images/hidpi/progress_refresh_90px_hidpi.png</file>
+ <file alias="progress_settings_90px_hidpi.png">images/hidpi/progress_settings_90px_hidpi.png</file>
+ <file alias="progress_snapshot_create_90px_hidpi.png">images/hidpi/progress_snapshot_create_90px_hidpi.png</file>
+ <file alias="progress_snapshot_discard_90px_hidpi.png">images/hidpi/progress_snapshot_discard_90px_hidpi.png</file>
+ <file alias="progress_snapshot_restore_90px_hidpi.png">images/hidpi/progress_snapshot_restore_90px_hidpi.png</file>
+ <file alias="progress_start_90px_hidpi.png">images/hidpi/progress_start_90px_hidpi.png</file>
+ <file alias="progress_state_restore_90px_hidpi.png">images/hidpi/progress_state_restore_90px_hidpi.png</file>
+ <file alias="progress_state_save_90px_hidpi.png">images/hidpi/progress_state_save_90px_hidpi.png</file>
<file alias="proxy_16px_hidpi.png">images/hidpi/proxy_16px_hidpi.png</file>
<file alias="proxy_24px_hidpi.png">images/hidpi/proxy_24px_hidpi.png</file>
<file alias="proxy_32px_hidpi.png">images/hidpi/proxy_32px_hidpi.png</file>
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_clone_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_clone_90px_hidpi.png
new file mode 100644
index 0000000..d3bb825
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_clone_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_delete_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_delete_90px_hidpi.png
new file mode 100644
index 0000000..b968268
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_delete_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_dnd_gh_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_dnd_gh_90px_hidpi.png
new file mode 100644
index 0000000..d15f1c0
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_dnd_gh_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_dnd_hg_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_dnd_hg_90px_hidpi.png
new file mode 100644
index 0000000..383e51d
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_dnd_hg_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_export_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_export_90px_hidpi.png
new file mode 100644
index 0000000..20c4ad3
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_export_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_import_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_import_90px_hidpi.png
new file mode 100644
index 0000000..8d68808
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_import_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_install_guest_additions_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_install_guest_additions_90px_hidpi.png
new file mode 100644
index 0000000..1d7a4e7
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_install_guest_additions_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_media_create_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_media_create_90px_hidpi.png
new file mode 100644
index 0000000..ec7171b
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_media_create_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_media_delete_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_media_delete_90px_hidpi.png
new file mode 100644
index 0000000..092c324
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_media_delete_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_network_interface_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_network_interface_90px_hidpi.png
new file mode 100644
index 0000000..a7f2ece
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_network_interface_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_poweroff_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_poweroff_90px_hidpi.png
new file mode 100644
index 0000000..798b33a
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_poweroff_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_reading_appliance_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_reading_appliance_90px_hidpi.png
new file mode 100644
index 0000000..f80b8b9
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_reading_appliance_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_refresh_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_refresh_90px_hidpi.png
new file mode 100644
index 0000000..2499fb2
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_refresh_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_settings_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_settings_90px_hidpi.png
new file mode 100644
index 0000000..0e6a36d
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_settings_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_create_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_create_90px_hidpi.png
new file mode 100644
index 0000000..2c6a59a
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_create_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_discard_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_discard_90px_hidpi.png
new file mode 100644
index 0000000..52bf30e
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_discard_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_restore_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_restore_90px_hidpi.png
new file mode 100644
index 0000000..3bfd687
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_snapshot_restore_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_start_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_start_90px_hidpi.png
new file mode 100644
index 0000000..8d06b45
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_start_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_state_restore_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_state_restore_90px_hidpi.png
new file mode 100644
index 0000000..8f5e635
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_state_restore_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/hidpi/progress_state_save_90px_hidpi.png b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_state_save_90px_hidpi.png
new file mode 100644
index 0000000..e0787f7
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/hidpi/progress_state_save_90px_hidpi.png differ
diff --git a/src/VBox/Frontends/VirtualBox/images/progress_settings_90px.png b/src/VBox/Frontends/VirtualBox/images/progress_settings_90px.png
new file mode 100644
index 0000000..4853738
Binary files /dev/null and b/src/VBox/Frontends/VirtualBox/images/progress_settings_90px.png differ
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
index c73b374..046fba8 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts
@@ -162,7 +162,7 @@
<name>QILabelPrivate</name>
<message>
<source>&Copy</source>
- <translation type="obsolete">&Копирай</translation>
+ <translation type="obsolete">&Копиране</translation>
</message>
</context>
<context>
@@ -185,7 +185,7 @@
</message>
<message>
<source>Ignore</source>
- <translation type="obsolete">Игнорирай</translation>
+ <translation type="obsolete">Игнориране</translation>
</message>
<message>
<source>&Details</source>
@@ -248,7 +248,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Без&рамков режим</translation>
+ <translation>Без&рамков режим</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -272,11 +272,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Забрана &интеграцията на мишката</translation>
+ <translation type="obsolete">Забрана &интеграцията на мишката</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Временно забранява интеграцията на показалеца на мишката от реалната машина</translation>
+ <translation type="obsolete">Временно забранява интеграцията на показалеца на мишката от реалната машина</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -288,11 +288,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Изпълнение на Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&Изпълнение на Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Изпраща комбинацията Ctrl-Alt-Del към виртуалната машина</translation>
+ <translation type="obsolete">Изпраща комбинацията Ctrl-Alt-Del към виртуалната машина</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -300,7 +300,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Изпраща комбинацията Ctrl-Alt-Backspace към виртуалната машина</translation>
+ <translation type="obsolete">Изпраща комбинацията Ctrl-Alt-Backspace към виртуалната машина</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -364,15 +364,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD устройства</translation>
+ <translation type="obsolete">&CD/DVD устройства</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Флопи устройства</translation>
+ <translation type="obsolete">&Флопи устройства</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB устройства</translation>
+ <translation type="obsolete">&USB устройства</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -423,7 +423,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&Водене на записки...</translation>
+ <translation type="obsolete">&Водене на записки...</translation>
</message>
<message>
<source>&Help</source>
@@ -501,15 +501,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Превключване в режим на &цял екран</translation>
+ <translation type="obsolete">Превключване в режим на &цял екран</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Превключване между нормален режим и на цял екран</translation>
+ <translation type="obsolete">Превключване между нормален режим и на цял екран</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Превключване в &безрамков режим</translation>
+ <translation type="obsolete">Превключване в &безрамков режим</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -517,7 +517,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Превключване в режим на &наместване</translation>
+ <translation type="obsolete">Превключване в режим на &наместване</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -597,7 +597,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Вм&ъкване на Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">Вм&ъкване на Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>&File</source>
@@ -892,172 +892,261 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Влачене и пускане</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>Запазване състоянието на виртуалната машина</translation>
</message>
<message>
<source>Power off the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>Изключване на виртуалната машина</translation>
</message>
<message>
<source>&Network Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Мрежови настройки...</translation>
</message>
<message>
<source>&Shared Folders Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Настройки на &споделени папки...</translation>
</message>
<message>
<source>R&emote Display</source>
- <translation type="unfinished"></translation>
+ <translation>Отдалечен работен п&лот</translation>
</message>
<message>
<source>Toggle remote desktop (RDP) connections to this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Позволява връзки за отдалечен работен плот (RDP) към тази машина</translation>
</message>
<message>
<source>&Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>&Видео заснемане</translation>
</message>
<message>
<source>Toggle video capture</source>
- <translation type="unfinished"></translation>
+ <translation>Превключване на видео заснемане</translation>
</message>
<message>
<source>&Video Capture Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Настройки за &видео заснемане...</translation>
</message>
<message>
<source>Configure video capture settings</source>
- <translation type="unfinished"></translation>
+ <translation>Настройване на видео заснемане</translation>
</message>
<message>
<source>Popup Menu</source>
- <translation type="unfinished"></translation>
+ <translation>Изскачащо меню</translation>
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished"></translation>
+ <translation>Показване информационния диалог на сесията</translation>
</message>
<message>
<source>&Webcams</source>
- <translation type="unfinished"></translation>
+ <translation>&Уеб камери</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished"></translation>
+ <translation>&Инсталиране на Виртуални Добавки...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished"></translation>
+ <translation>Вкарване на диска Виртуални Добавки във виртуалното устройство</translation>
</message>
<message>
<source>&VirtualBox</source>
- <translation type="unfinished"></translation>
+ <translation>&VirtualBox</translation>
</message>
<message>
<source>&Menu Bar</source>
- <translation type="unfinished"></translation>
+ <translation>&Меню лента</translation>
</message>
<message>
<source>&Menu Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Настройки на &меню лента...</translation>
</message>
<message>
<source>Opens window to configure menu-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Отваря диалог за настройка на меню лентата</translation>
</message>
<message>
<source>Show Menu &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Показване на меню &лентата</translation>
</message>
<message>
<source>Toggle menu-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Превключва видимостта на меню лентата за тази машина</translation>
</message>
<message>
<source>&Status Bar</source>
- <translation type="unfinished"></translation>
+ <translation>&Статус лента</translation>
</message>
<message>
<source>&Status Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Настройки на &статус лента...</translation>
</message>
<message>
<source>Opens window to configure status-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Отваря диалог за настройка на статус лентата</translation>
</message>
<message>
<source>Show Status &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Показване на статус &лентата</translation>
</message>
<message>
<source>Toggle status-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Превключва видимостта на статус лентата за тази машина</translation>
</message>
<message>
<source>&Input</source>
- <translation type="unfinished"></translation>
+ <translation>&Въвеждане</translation>
</message>
<message>
<source>&Keyboard</source>
- <translation type="unfinished"></translation>
+ <translation>&Клавиатура</translation>
</message>
<message>
<source>&Keyboard Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Настройки на &клавиатура...</translation>
</message>
<message>
<source>Display the global settings window to configure shortcuts</source>
- <translation type="unfinished"></translation>
+ <translation>Показване на прозореца с глобални настройки за настройка на клавишните комбинации</translation>
</message>
<message>
<source>&Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>&Мишка</translation>
</message>
<message>
<source>&Hard Drives</source>
- <translation type="unfinished"></translation>
+ <translation>&Твърди дискове</translation>
</message>
<message>
<source>&Hard Drive Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Настройки на &твърди дискове...</translation>
</message>
<message>
<source>Change the settings of hard drives</source>
- <translation type="unfinished"></translation>
+ <translation>Промяна настройките на твърдите дискове</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished">Мрежа</translation>
+ <translation>Мрежа</translation>
</message>
<message>
<source>&USB Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&USB настройки...</translation>
</message>
<message>
<source>Change the settings of USB devices</source>
- <translation type="unfinished"></translation>
+ <translation>Промяна настройките на USB устройствата</translation>
</message>
<message>
<source>&Shared Folders</source>
- <translation type="unfinished"></translation>
+ <translation>&Споделени папки</translation>
</message>
<message>
<source>Show &Log...</source>
<comment>debug action</comment>
- <translation type="unfinished">Показване на &записки...</translation>
+ <translation>Показване на &записки...</translation>
</message>
<message>
<source>E&xtra Data Manager...</source>
- <translation type="unfinished"></translation>
+ <translation>Е&кстра Данни Управление...</translation>
</message>
<message>
<source>Display the Extra Data Manager window</source>
- <translation type="unfinished"></translation>
+ <translation>Показва прозореца на Екстра Данни Управление</translation>
+ </message>
+ <message>
+ <source>&File</source>
+ <translation>&Файл</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation>&Прозорец</translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation>&Минимизиране</translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation>Минимизиране на активния прозорец на машината</translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation>&Режим на цял екран</translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation>Превключване между нормален режим и на цял екран</translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation>Ма&щабиран режим</translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation>Фактор на ма&щаба</translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation>&Вмъкване на %1</translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation>Изпращане на комбинацията %1 към виртуалната машина</translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation>Интеграция на &мишка</translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation>Позволяване интеграция на показалеца на мишката от реалната машина</translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation>&Оптични устройства</translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation>&Флопи устройства</translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation>&USB</translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation>Влачене и пускане</translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation>&Водене на записки</translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation>&Нормално стартиране</translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation>Стартиране &без изглед</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation>Стартира избраната виртуална машина във фон</translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation>Стартиране с &подвижност</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation>Стартира избраната виртуална машина с опция на по-късен етап да се премести във фон</translation>
</message>
</context>
<context>
@@ -1065,12 +1154,32 @@
<message>
<source>Enable</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished">Позволяване</translation>
+ <translation>Включване</translation>
</message>
<message>
<source>Resize to %1x%2</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>Преоразмеряване към %1x%2</translation>
+ </message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation>%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation>%1 - Криптиране на диск</translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation>
+ <numerusform>Тази виртуална машина е защитена с парола. Моля, въведете %n парола на криптирането по-долу.</numerusform>
+ <numerusform>Тази виртуална машина е защитена с парола. Моля, въведете %n пароли на криптирането по-долу.</numerusform>
+ </translation>
</message>
</context>
<context>
@@ -1232,7 +1341,7 @@
<name>UICloneVMWizardPage1</name>
<message>
<source><p>This wizard will help you to create a clone of your virtual machine.</p></source>
- <translation type="obsolete"><p>Този помощник ще ви помогне да създадете клонинг на вашата виртуална машина.</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви помогне да създадете клонинг на вашата виртуална машина.</p></translation>
</message>
<message>
<source><p>Please choose a name for the new virtual machine:</p></source>
@@ -1303,7 +1412,7 @@
</message>
<message>
<source><p>Please select the type of the clone.</p><p>If you choose <b>Full Clone</b> an exact copy (including all virtual disk images) of the original VM will be created. If you select <b>Linked Clone</b>, a new VM will be created, but the virtual disk images will point to the virtual disk images of original VM.</p></source>
- <translation type="obsolete"><p>Моля, изберете типа на клонирането.</p><p>Ако изберете <b>Пълно клониране</b>, ще бъде създадено точно копие (включващо всички изображения на виртуални дискове) на оригиналната ВМ, а ако изберете <b>Свързано клониране</b>, ще бъде създадена нова ВМ, но изображенията на виртуалните дискове ще сочат към изображенията на виртуалните дискове на оригиналната ВМ.</p></translation>
+ <translation type="obsolete"><p>Моля, изберете типа на клонирането!</p><p>Ако изберете <b>Пълно клониране</b>, ще бъде създадено точно копие (включващо всички изображения на виртуални дискове) на оригиналната ВМ, а ако изберете <b>Свързано клониране</b>, ще бъде създадена нова ВМ, но изображенията на виртуалните дискове ще сочат към изображенията на виртуалните дискове на оригиналната ВМ.</p></translation>
</message>
<message>
<source><p>Note that a new snapshot within the source VM is created in case you select <b>Linked Clone</b>.</p></source>
@@ -1892,7 +2001,7 @@
<name>UIDnDDrag</name>
<message>
<source>Retrieving data ...</source>
- <translation type="unfinished"></translation>
+ <translation>Извличане на данни ...</translation>
</message>
</context>
<context>
@@ -1978,6 +2087,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation>Статус</translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation>Парола</translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation>
+ <numerusform><nobr>Използва се от следния %n твърд диск:</nobr><br>%1</numerusform>
+ <numerusform><nobr>Използва се от следните %n твърди дискове:</nobr><br>%1</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2011,7 +2146,7 @@ p, li { white-space: pre-wrap; }
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This wizard will guide you through the process of exporting an appliance. </p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the <span style=" font-weight:600;">Next</span> button to go the next page of the wizard and the <span style=" font-weight:600;">Back</span> button to return to the previous page.</p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please select the virtual machines that you wish to the appliance. You can select more than one. Please note that these machines have to be turned off before they can be exported.</p></body></html></source>
- <translation type="obsolete"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Т [...]
+ <translation type="obsolete"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Т [...]
</message>
<message>
<source>< &Back</source>
@@ -2122,7 +2257,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>This wizard will guide you through the process of exporting an appliance.</p><p>%1</p><p>Please select the virtual machines that should be added to the appliance. You can select more than one. Please note that these machines have to be turned off before they can be exported.</p></source>
- <translation type="obsolete"><p>Този помощник ще ви води през процеса на изнасяне на приспособление.</p><p>%1</p><p>Моля, изберете виртуалните машини, които ще бъдат добавени към приспособлението. Можете да изберете повече от една. Имайте предвид, че тези машини трябва да бъдат изключени преди да бъде възможно изнасянето им.</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви води през процеса на изнасяне на приспособление.</p><p>%1</p><p>Моля, изберете виртуалните машини, които ще бъдат добавени към приспособлението. Можете да изберете повече от една. Имайте предвид, че тези машини трябва да бъдат изключени преди да бъде възможно изнасянето им.</p></translation>
</message>
</context>
<context>
@@ -2156,7 +2291,7 @@ p, li { white-space: pre-wrap; }
<name>UIExportApplianceWzdPage3</name>
<message>
<source>Please specify the target for the OVF export. You can choose between a local file system export, uploading the OVF to the Sun Cloud service or an S3 storage server.</source>
- <translation type="obsolete">Моля, укажете местоположение за изнасяне към OVF. Имате избор между изнасяне към локалната файлова система, качване на OVF към услугата Sun Cloud или S3 сървър за съхранение.</translation>
+ <translation type="obsolete">Моля, укажете местоположение за изнасяне към OVF! Имате избор между изнасяне към локалната файлова система, качване на OVF към услугата Sun Cloud или S3 сървър за съхранение.</translation>
</message>
<message>
<source>&Local Filesystem </source>
@@ -2322,7 +2457,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You have started a newly created virtual machine for the first time. This wizard will help you to perform the steps necessary for installing an operating system of your choice onto this virtual machine.</p><p>Use the <b>Next</b> button to go to the next page of the wizard and the <b>Back</b> button to return to the previous page. You can also press <b>Cancel</b> if you want to cancel the execution of this wizard.< [...]
- <translation type="obsolete"><p>Стартирали сте новосъздадена виртуална машина за пръв път. Този помощник ще ви помогне да завършите стъпките, необходими за инсталирането на операционна система според вашия избор на тази виртуална машина.</p><p>Използвайте бутона <b>Напред</b>, за да отидете към следващата страница на помощника, и бутона <b>Назад</b>, за да се върнете към предишната страница. Също така, можете да натиснете бутона <b> [...]
+ <translation type="obsolete"><p>Стартирали сте новосъздадена виртуална машина за пръв път. Този помощник ще Ви помогне да завършите стъпките, необходими за инсталирането на операционна система според вашия избор на тази виртуална машина.</p><p>Използвайте бутона <b>Напред</b>, за да отидете към следващата страница на помощника, и бутона <b>Назад</b>, за да се върнете към предишната страница. Също така, можете да натиснете бутона <b> [...]
</message>
<message>
<source>Welcome to the First Run Wizard!</source>
@@ -2386,7 +2521,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You have started a newly created virtual machine for the first time. This wizard will help you to perform the steps necessary for booting an operating system of your choice on the virtual machine.</p><p>Note that you will not be able to install an operating system into this virtual machine right now because you did not attach any hard disk to it. If this is not what you want, you can cancel the execution of this wizard, select <b>Settings</b& [...]
- <translation type="obsolete"><p>Стартирали сте новосъздадена виртуална машина за пръв път. Този помощник ще ви помогне да завършите стъпките, необходими за зареждането на операционна система според вашия избор на виртуалната машина.</p><p>Имайте предвид, че няма да можете да инсталирате операционна система на тази виртуална машина в момента, тъй като не сте закачили твърд диск към нея. Ако това не е, което искате, можете да откажете изпълнението на този помощник [...]
+ <translation type="obsolete"><p>Стартирали сте новосъздадена виртуална машина за пръв път. Този помощник ще Ви помогне да завършите стъпките, необходими за зареждането на операционна система според вашия избор на виртуалната машина.</p><p>Имайте предвид, че няма да можете да инсталирате операционна система на тази виртуална машина в момента, тъй като не сте закачили твърд диск към нея. Ако това не е, което искате, можете да откажете изпълнението на този помощник [...]
</message>
<message>
<source><p>Select the type of media you would like to use for booting an operating system.</p></source>
@@ -2420,7 +2555,7 @@ p, li { white-space: pre-wrap; }
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please note that when you close the virtual machine, the specified media will be automatically unmounted and the boot device will be set back to the first hard disk.</p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Depending on the type of the setup program, you may need to manually unmount (eject) the media after the setup program reboots the virtual machine, to prevent the installation process from starting again. You can do this by selecting the corresponding <span style=" font-weight:600;">Unmount...</span> action in the <span style=&q [...]
<translation type="obsolete"><html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; </style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:400; font-style:normal;"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ако информацията по-горе е вярна, натиснете бутона <span style=" font-weight:600;">Край</span> . След като го натиснете, избраният диск ще бъде временно монтиран [...]
+p, li { white-space: pre-wrap; </style></head><body style=" font-family:'Arial'; font-size:9pt; font-weight:400; font-style:normal;"><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ако информацията по-горе е вярна, натиснете бутона <span style=" font-weight:600;">Край</span> . След като го натиснете, избраният диск ще бъде временно монтиран [...]
</message>
<message>
<source>&Finish</source>
@@ -2442,7 +2577,7 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source><p>If the above is correct, press the <b>Finish</b> button. Once you press it, the selected media will be temporarily mounted on the virtual machine and the machine will start execution.</p><p>Please note that when you close the virtual machine, the specified media will be automatically unmounted and the boot device will be set back to the first hard disk.</p><p>Depending on the type of the setup program, you may need to manually [...]
- <translation type="obsolete"><p>Ако по-горното е вярно, натиснете бутона <b>Край</b>. След като го натиснете, избраният диск ще бъде временно монтиран във виртуалната машина и машината ще се включи.</p><p>Моля, имайте предвид, че когато затворите виртуалната машина, избраният диск ще бъде демонтиран автоматично и зареждащото устройство ще бъде зададено отново към първия твърд диск.</p><p>В зависимост от вида на инсталиращата програма, мож [...]
+ <translation type="obsolete"><p>Ако по-горното е вярно, натиснете бутона <b>Край</b>. След като го натиснете, избраният диск ще бъде временно монтиран във виртуалната машина и машината ще се включи.</p><p>Моля имайте предвид, че когато затворите виртуалната машина, избраният диск ще бъде демонтиран автоматично и зареждащото устройство ще бъде зададено отново към първия твърд диск.</p><p>В зависимост от вида на инсталиращата програма, може [...]
</message>
<message>
<source>Start</source>
@@ -2457,11 +2592,11 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source><p>You have started a newly created virtual machine for the first time. This wizard will help you to perform the steps necessary for installing an operating system of your choice onto this virtual machine.</p><p>%1</p></source>
- <translation type="obsolete"><p>Включили сте новосъздадена виртуална машина за първи път. Този помощник ще ви помогне да изпълните стъпките по инсталиране на операционна система по ваш избор в тази виртуална машина.</p><p>%1</p></translation>
+ <translation type="obsolete"><p>Включили сте новосъздадена виртуална машина за първи път. Този помощник ще Ви помогне да изпълните стъпките по инсталиране на операционна система по ваш избор в тази виртуална машина.</p><p>%1</p></translation>
</message>
<message>
<source><p>You have started a newly created virtual machine for the first time. This wizard will help you to perform the steps necessary for booting an operating system of your choice on the virtual machine.</p><p>Note that you will not be able to install an operating system into this virtual machine right now because you did not attach any hard disk to it. If this is not what you want, you can cancel the execution of this wizard, select <b>Settings</b& [...]
- <translation type="obsolete"><p>Включили сте новосъздадена виртуална машина за първи път. Този помощник ще ви помогне да изпълните стъпките, необходими за зареждането на операционна система по ваш избор във виртуалната машина.</p><p>Забележете, че няма да можете да инсталирате операционна система в тази виртуална машина в този момент, тъй като не сте закачили твърд диск към нея. Ако това не е вашето желание, можете да прекъснете изпълнението на помощника, да изб [...]
+ <translation type="obsolete"><p>Включили сте новосъздадена виртуална машина за първи път. Този помощник ще Ви помогне да изпълните стъпките, необходими за зареждането на операционна система по ваш избор във виртуалната машина.</p><p>Забележете, че няма да можете да инсталирате операционна система в тази виртуална машина в този момент, тъй като не сте закачили твърд диск към нея. Ако това не е вашето желание, можете да прекъснете изпълнението на помощника, да изб [...]
</message>
</context>
<context>
@@ -2495,7 +2630,7 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source><p>If the above is correct, press the <b>Finish</b> button. Once you press it, the selected media will be temporarily mounted on the virtual machine and the machine will start execution.</p><p>Please note that when you close the virtual machine, the specified media will be automatically unmounted and the boot device will be set back to the first hard disk.</p><p>Depending on the type of the setup program, you may need to manually [...]
- <translation type="obsolete"><p>Ако по-горното е вярно, натиснете бутона <b>Край</b>. След като го натиснете, избраният диск ще бъде временно монтиран във виртуалната машина и машината ще се включи.</p><p>Моля, имайте предвид, че когато затворите виртуалната машина, избраният диск ще бъде демонтиран автоматично и зареждащото устройство ще бъде зададено отново към първия твърд диск.</p><p>В зависимост от вида на инсталиращата програма, мож [...]
+ <translation type="obsolete"><p>Ако по-горното е вярно, натиснете бутона <b>Край</b>. След като го натиснете, избраният диск ще бъде временно монтиран във виртуалната машина и машината ще се включи.</p><p>Моля имайте предвид, че когато затворите виртуалната машина, избраният диск ще бъде демонтиран автоматично и зареждащото устройство ще бъде зададено отново към първия твърд диск.</p><p>В зависимост от вида на инсталиращата програма, може [...]
</message>
<message>
<source><p>If the above is correct, press the <b>Finish</b> button. Once you press it, the selected media will be mounted on the virtual machine and the machine will start execution.</p></source>
@@ -2525,62 +2660,62 @@ p, li { white-space: pre-wrap; </style></head><body style="
<message>
<source><b>%1</b></source>
<comment>Group item tool-tip / Group name</comment>
- <translation type="unfinished"></translation>
+ <translation><b>%1</b></translation>
</message>
<message numerus="yes">
<source>%n group(s)</source>
<comment>Group item tool-tip / Group info</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n група</numerusform>
+ <numerusform>%n групи</numerusform>
</translation>
</message>
<message>
<source><nobr>%1</nobr></source>
<comment>Group item tool-tip / Group info wrapper</comment>
- <translation type="unfinished"><nobr>%1</nobr></translation>
+ <translation><nobr>%1</nobr></translation>
</message>
<message numerus="yes">
<source>%n machine(s)</source>
<comment>Group item tool-tip / Machine info</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%n машина</numerusform>
+ <numerusform>%n машини</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n running)</source>
<comment>Group item tool-tip / Running machine info</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform>(%n включена)</numerusform>
+ <numerusform>(%n включени)</numerusform>
</translation>
</message>
<message>
<source><nobr>%1</nobr></source>
<comment>Group item tool-tip / Machine info wrapper</comment>
- <translation type="unfinished"><nobr>%1</nobr></translation>
+ <translation><nobr>%1</nobr></translation>
</message>
<message>
<source><nobr>%1 %2</nobr></source>
<comment>Group item tool-tip / Machine info wrapper, including running</comment>
- <translation type="unfinished"><nobr>%1</nobr> {1 %2<?}</translation>
+ <translation><nobr>%1 %2</nobr></translation>
</message>
<message>
<source>Collapse group</source>
- <translation type="unfinished"></translation>
+ <translation>Сгъване на група</translation>
</message>
<message>
<source>Expand group</source>
- <translation type="unfinished"></translation>
+ <translation>Разгъване на група</translation>
</message>
<message>
<source>Enter group</source>
- <translation type="unfinished"></translation>
+ <translation>Влизане в група</translation>
</message>
<message>
<source>Exit group</source>
- <translation type="unfinished"></translation>
+ <translation>Излизане от група</translation>
</message>
</context>
<context>
@@ -2655,7 +2790,7 @@ p, li { white-space: pre-wrap; </style></head><body style="
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2850,41 +2985,96 @@ p, li { white-space: pre-wrap; </style></head><body style="
<message>
<source>Video Capture File</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Файл за видео заснемане</translation>
</message>
<message>
<source>Video Capture Attributes</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Атрибути за видео заснемане</translation>
</message>
<message>
<source>Video Capture</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Видео заснемане</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Забранено</translation>
</message>
<message>
<source>NAT Network, '%1'</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>NAT мрежа, '%1'</translation>
</message>
<message>
<source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
- <translation type="unfinished"></translation>
+ <translation>Размер на кадър: %1x%2, Скорост на кадри: %3fps, Скорост на битове: %4kbps</translation>
</message>
<message>
<source>Minimal Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Минимална паравиртуализация</translation>
</message>
<message>
<source>Hyper-V Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V паравиртуализация</translation>
+ </message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation>KVM паравиртуализация</translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation>[Оптично устройство]</translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation>USB контролер</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation>Фактор на мащаба</translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation>Немащабиран HiDPI видео изход</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation>Позволен</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation>Позиция на малката лента с инструменти</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>Горе</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>Долу</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation>Малка лента с инструменти</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation>Забранена</translation>
</message>
</context>
<context>
@@ -3087,7 +3277,7 @@ p, li { white-space: pre-wrap; </style></head><body style="
<name>UIGlobalSettingsDisplay</name>
<message>
<source>Maximum Guest Screen &Size:</source>
- <translation>Максимален ра&змер на виртуалния екран</translation>
+ <translation>Максимален ра&змер на виртуалния екран:</translation>
</message>
<message>
<source>&Width:</source>
@@ -3134,15 +3324,15 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source>Machine Windows:</source>
- <translation type="unfinished"></translation>
+ <translation>Прозорци на машината:</translation>
</message>
<message>
<source>If checked, machine windows will be raised when the mouse pointer moves over them.</source>
- <translation type="unfinished"></translation>
+ <translation>Когато е избрано, прозорците на машината ще се активират, когато мишката застане върху тях.</translation>
</message>
<message>
<source>&Raise Window Under Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>&Активиране на прозорец под мишката</translation>
</message>
</context>
<context>
@@ -3189,7 +3379,7 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source>&Extension Packages</source>
- <translation type="unfinished"></translation>
+ <translation>&Пакети с разширения</translation>
</message>
</context>
<context>
@@ -3248,27 +3438,27 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">&Панел и меню лента:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Авто показване при Цял екран</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Когато е избрано, панелът и меню лентата ще се показват, когато виртуалната машина е на цял екран.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
- <translation type="unfinished"></translation>
+ <translation>&Екранен предпазител:</translation>
</message>
<message>
<source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
- <translation type="unfinished"></translation>
+ <translation>Когато е избрано, екранният предпазител на реалната машина ще бъде забранен, докато виртуалната машина е включена.</translation>
</message>
<message>
<source>Disable When Running Virtual Machines</source>
- <translation type="unfinished"></translation>
+ <translation>Забраняване, когато виртуалната машина е включена</translation>
</message>
</context>
<context>
@@ -3307,27 +3497,27 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source>Host Key Combination</source>
- <translation type="unfinished"></translation>
+ <translation>Основен клавиш за комбинации</translation>
</message>
<message>
<source>Some items have the same shortcuts assigned.</source>
- <translation type="unfinished"></translation>
+ <translation>Някои елементи имат зададени едни и същи клавиши.</translation>
</message>
<message>
<source>&VirtualBox Manager</source>
- <translation type="unfinished"></translation>
+ <translation>&VirtialBox Управление</translation>
</message>
<message>
<source>Virtual &Machine</source>
- <translation type="unfinished"></translation>
+ <translation>Виртуална &машина</translation>
</message>
<message>
<source>Lists all the available shortcuts which can be configured.</source>
- <translation type="unfinished"></translation>
+ <translation>Извежда всички клавишни комбинации, които могат да бъдат зададени.</translation>
</message>
<message>
<source>Enter a sequence to filter the shortcut list.</source>
- <translation type="unfinished"></translation>
+ <translation>Въведете израз, за да филтрирате списъка с клавиши.</translation>
</message>
</context>
<context>
@@ -3386,7 +3576,7 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source>&Interface Languages</source>
- <translation type="unfinished"></translation>
+ <translation>&Езици за екрана</translation>
</message>
</context>
<context>
@@ -3543,128 +3733,128 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source>&NAT Networks</source>
- <translation type="unfinished"></translation>
+ <translation>&NAT мрежи</translation>
</message>
<message>
<source>Lists all available NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>Извежда наличните NAT мрежи.</translation>
</message>
<message>
<source>&Host-only Networks</source>
- <translation type="unfinished"></translation>
+ <translation>&Мрежи само-хост</translation>
</message>
<message>
<source>No new name specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е зададено ново име за NAT мрежата с предишно име <b>%1</b>.</translation>
</message>
<message>
<source>No CIDR specified for the NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е указан CIDR за NAT мрежата <b>%1</b>.</translation>
</message>
<message>
<source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е указан CIDR за NAT мрежата с предишно име <b>%1</b>.</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалидно указан CIDR (<i>%1</i>) за NAT мрежата <b>%2</b>.</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалидно указан CIDR (<i>%1</i>) за NAT мрежата с предишно име <b>%2</b>.</translation>
</message>
<message>
<source>Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Име на мрежа</translation>
</message>
<message>
<source>[empty]</source>
- <translation type="unfinished"></translation>
+ <translation>[празно]</translation>
</message>
<message>
<source>%1 (renamed from %2)</source>
- <translation type="unfinished"></translation>
+ <translation>%1 (преименувана от %2)</translation>
</message>
<message>
<source>Old Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Старо име на мрежа</translation>
</message>
<message>
<source>New Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Ново име на мрежа</translation>
</message>
<message>
<source>Network CIDR</source>
- <translation type="unfinished"></translation>
+ <translation>CIDR на мрежата</translation>
</message>
<message>
<source>Supports DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>Поддържа DHCP</translation>
</message>
<message>
<source>yes</source>
- <translation type="unfinished"></translation>
+ <translation>да</translation>
</message>
<message>
<source>no</source>
- <translation type="unfinished"></translation>
+ <translation>не</translation>
</message>
<message>
<source>Supports IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>Поддържа IPv6</translation>
</message>
<message>
<source>Default IPv6 route</source>
- <translation type="unfinished"></translation>
+ <translation>Подразбиращо IPv6 рутиране</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
- <translation type="unfinished"></translation>
+ <translation>Реалният интерфейс <b>%1</b> текущо няма валиден IPv4 адрес.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
- <translation type="unfinished"></translation>
+ <translation>Реалният интерфейс <b>%1</b> текущо няма валидна IPv4 мрежова маска.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
- <translation type="unfinished"></translation>
+ <translation>Реалният интерфейс <b>%1</b> текущо няма валиден IPv6 адрес.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
- <translation type="unfinished"></translation>
+ <translation>Реалният интерфейс <b>%1</b> текущо няма валиден адрес за DHCP сървър.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
- <translation type="unfinished"></translation>
+ <translation>Реалният интерфейс <b>%1</b> текущо няма валидна маска за DHCP сървър.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>Реалният интерфейс <b>%1</b> текущо няма валидна долна адресна граница за DHCP сървъра.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>Реалният интерфейс <b>%1</b> текущо няма валидна горна адресна граница за DHCP сървъра.</translation>
</message>
<message>
<source>The name <b>%1</b> is being used for several NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>Името <b>%1</b> се използва от няколко NAT мрежи.</translation>
</message>
<message>
<source>Active</source>
<comment>NAT network</comment>
- <translation type="unfinished">Активен</translation>
+ <translation>Активна</translation>
</message>
<message>
<source>&Add NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Добавяне на NAT мрежа</translation>
</message>
<message>
<source>&Remove NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Премахване на NAT мрежа</translation>
</message>
<message>
<source>&Edit NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Редактиране на NAT мрежа</translation>
</message>
</context>
<context>
@@ -3766,177 +3956,177 @@ p, li { white-space: pre-wrap; </style></head><body style="
<name>UIGlobalSettingsNetworkDetailsHost</name>
<message>
<source>Host-only Network Details</source>
- <translation type="unfinished">Детайли на мрежа само-хост</translation>
+ <translation>Детайли на мрежа само-хост</translation>
</message>
<message>
<source>&Adapter</source>
- <translation type="unfinished">&Адаптер</translation>
+ <translation>&Адаптер</translation>
</message>
<message>
<source>Manual &Configuration</source>
- <translation type="unfinished">Ръчна &конфигурация</translation>
+ <translation>Ръчна &конфигурация</translation>
</message>
<message>
<source>Use manual configuration for this host-only network adapter.</source>
- <translation type="unfinished">Използване на ръчна конфигурация за този само-хост мрежов адаптер.</translation>
+ <translation>Използване на ръчна конфигурация за този само-хост мрежов адаптер.</translation>
</message>
<message>
<source>&IPv4 Address:</source>
- <translation type="unfinished">&IPv4 адрес:</translation>
+ <translation>&IPv4 адрес:</translation>
</message>
<message>
<source>Holds the host IPv4 address for this adapter.</source>
- <translation type="unfinished">Показва IPv4 адреса на хоста за този адаптер.</translation>
+ <translation>Задава IPv4 адреса на хоста за този адаптер.</translation>
</message>
<message>
<source>IPv4 Network &Mask:</source>
- <translation type="unfinished">IPv4 мрежова &маска:</translation>
+ <translation>IPv4 мрежова &маска:</translation>
</message>
<message>
<source>Holds the host IPv4 network mask for this adapter.</source>
- <translation type="unfinished">Показва IPv4 мрежовата маска на хоста за този адаптер.</translation>
+ <translation>Задава IPv4 мрежовата маска на хоста за този адаптер.</translation>
</message>
<message>
<source>I&Pv6 Address:</source>
- <translation type="unfinished">I&Pv6 адрес:</translation>
+ <translation>I&Pv6 адрес:</translation>
</message>
<message>
<source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">Показва IPv6 адреса на хоста за този адаптер, ако се поддържа IPv6.</translation>
+ <translation>Задава IPv6 адреса на хоста за този адаптер, ако се поддържа IPv6.</translation>
</message>
<message>
<source>IPv6 Network Mask &Length:</source>
- <translation type="unfinished">&Дължина на IPv6 мрежовата маска:</translation>
+ <translation>&Дължина на IPv6 мрежовата маска:</translation>
</message>
<message>
<source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">Показва префиксната дължина на IPv6 мрежовата маска на хоста за този адаптер, ако се поддържа IPv6.</translation>
+ <translation>Задава префиксната дължина на IPv6 мрежовата маска на хоста за този адаптер, ако се поддържа IPv6.</translation>
</message>
<message>
<source>&DHCP Server</source>
- <translation type="unfinished">&DHCP сървър</translation>
+ <translation>&DHCP сървър</translation>
</message>
<message>
<source>&Enable Server</source>
- <translation type="unfinished">&Позволяване на сървъра</translation>
+ <translation>&Позволяване на сървъра</translation>
</message>
<message>
<source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
- <translation type="unfinished">Показва дали DHCP сървърът да бъде активиран при стартирането на машината или не.</translation>
+ <translation>Показва дали DHCP сървърът да бъде активиран при стартирането на машината, или не.</translation>
</message>
<message>
<source>Server Add&ress:</source>
- <translation type="unfinished">Ад&рес на сървъра:</translation>
+ <translation>Ад&рес на сървъра:</translation>
</message>
<message>
<source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Показва адреса на DHCP сървъра, който обслужва мрежата, асоциирана с този само-хост адаптер.</translation>
+ <translation>Задава адреса на DHCP сървъра, който обслужва мрежата, асоциирана с този само-хост адаптер.</translation>
</message>
<message>
<source>Server &Mask:</source>
- <translation type="unfinished">&Маска на сървъра:</translation>
+ <translation>&Маска на сървъра:</translation>
</message>
<message>
<source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Показва мрежовата маска на DHCP сървъра, който обслужва мрежата, асоциирана с този само-хост адаптер.</translation>
+ <translation>Задава мрежовата маска на DHCP сървъра, който обслужва мрежата, асоциирана с този само-хост адаптер.</translation>
</message>
<message>
<source>&Lower Address Bound:</source>
- <translation type="unfinished">&Долна адресна граница:</translation>
+ <translation>&Долна адресна граница:</translation>
</message>
<message>
<source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Показва долната адресна граница, предлагана от DHCP сървъра, който обслужва мрежата, асоциирана с този само-хост адаптер.</translation>
+ <translation>Задава долната адресна граница, предлагана от DHCP сървъра, който обслужва мрежата, асоциирана с този само-хост адаптер.</translation>
</message>
<message>
<source>&Upper Address Bound:</source>
- <translation type="unfinished">&Горна адресна граница:</translation>
+ <translation>&Горна адресна граница:</translation>
</message>
<message>
<source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Показва горната адресна граница, предлагана от DHCP сървъра, който обслужва мрежата, асоциирана с този само-хост адаптер.</translation>
+ <translation>Задава горната адресна граница, предлагана от DHCP сървъра, който обслужва мрежата, асоциирана с този само-хост адаптер.</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsNetworkDetailsNAT</name>
<message>
<source>NAT Network Details</source>
- <translation type="unfinished"></translation>
+ <translation>Детайли на NAT мрежа</translation>
</message>
<message>
<source>&Enable Network</source>
- <translation type="unfinished"></translation>
+ <translation>&Позволяване на мрежа</translation>
</message>
<message>
<source>Enable this NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>Позволяване на тази NAT мрежа.</translation>
</message>
<message>
<source>Network &Name:</source>
- <translation type="unfinished"></translation>
+ <translation>&Име на мрежа:</translation>
</message>
<message>
<source>Holds the name for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>Задава името на тази мрежа.</translation>
</message>
<message>
<source>Network &CIDR:</source>
- <translation type="unfinished"></translation>
+ <translation>&CIDR на мрежата:</translation>
</message>
<message>
<source>Holds the CIDR for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>Задава CIDR за тази мрежа.</translation>
</message>
<message>
<source>Network Options:</source>
- <translation type="unfinished"></translation>
+ <translation>Опции на мрежата:</translation>
</message>
<message>
<source>Supports &DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>Поддръжка на &DHCP</translation>
</message>
<message>
<source>Determines whether this network supports DHCP.</source>
- <translation type="unfinished"></translation>
+ <translation>Указва дали тази мрежа поддържа DHCP.</translation>
</message>
<message>
<source>Supports &IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>Поддръжка на &IPv6</translation>
</message>
<message>
<source>Determines whether this network supports IPv6.</source>
- <translation type="unfinished"></translation>
+ <translation>Указва дали тази мрежа поддържа IPv6.</translation>
</message>
<message>
<source>Advertise Default IPv6 &Route</source>
- <translation type="unfinished"></translation>
+ <translation>IPv6 &рутиране по подразбиране</translation>
</message>
<message>
<source>Determines whether this network should be advertised as the default IPv6 route.</source>
- <translation type="unfinished"></translation>
+ <translation>Указва дали тази мрежа ще се обявява като IPv6 рутиране по подразбиране.</translation>
</message>
<message>
<source>Opens a window to manage port forwarding rules.</source>
- <translation type="unfinished">Отваря диалог за управление на правилата за пренасочване на портове.</translation>
+ <translation>Отваря диалог за управление на правилата за пренасочване на портове.</translation>
</message>
<message>
<source>&Port Forwarding</source>
- <translation type="unfinished">&Пренасочване на портове</translation>
+ <translation>&Пренасочване на портове</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsPortForwardingDlg</name>
<message>
<source>Port Forwarding Rules</source>
- <translation type="unfinished">Правила за пренасочване на портове</translation>
+ <translation>Правила за пренасочване на портове</translation>
</message>
<message>
<source>IPv4</source>
- <translation type="unfinished"></translation>
+ <translation>IPv4</translation>
</message>
<message>
<source>IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>IPv6</translation>
</message>
</context>
<context>
@@ -3991,11 +4181,11 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source>No proxy host is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо няма указан прокси адрес.</translation>
</message>
<message>
<source>No proxy port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо няма указан прокси порт.</translation>
</message>
</context>
<context>
@@ -4060,71 +4250,71 @@ p, li { white-space: pre-wrap; </style></head><body style="
<name>UIHostComboEditor</name>
<message>
<source><key_%1></source>
- <translation type="unfinished"><key_%1></translation>
+ <translation><key_%1></translation>
</message>
<message>
<source>Left </source>
- <translation type="unfinished">Лява стрелка</translation>
+ <translation>Лява стрелка</translation>
</message>
<message>
<source>Right </source>
- <translation type="unfinished">Дясна стрелка</translation>
+ <translation>Дясна стрелка</translation>
</message>
<message>
<source>Left Shift</source>
- <translation type="unfinished">Ляв Shift</translation>
+ <translation>Ляв Shift</translation>
</message>
<message>
<source>Right Shift</source>
- <translation type="unfinished">Десен Shift</translation>
+ <translation>Десен Shift</translation>
</message>
<message>
<source>Left Ctrl</source>
- <translation type="unfinished">Ляв Ctrl</translation>
+ <translation>Ляв Ctrl</translation>
</message>
<message>
<source>Right Ctrl</source>
- <translation type="unfinished">Десен Ctrl</translation>
+ <translation>Десен Ctrl</translation>
</message>
<message>
<source>Left Alt</source>
- <translation type="unfinished">Ляв Alt</translation>
+ <translation>Ляв Alt</translation>
</message>
<message>
<source>Right Alt</source>
- <translation type="unfinished">Десен Alt</translation>
+ <translation>Десен Alt</translation>
</message>
<message>
<source>Left WinKey</source>
- <translation type="unfinished">Ляв Win клавиш</translation>
+ <translation>Ляв Win клавиш</translation>
</message>
<message>
<source>Right WinKey</source>
- <translation type="unfinished">Десен Win клавиш</translation>
+ <translation>Десен Win клавиш</translation>
</message>
<message>
<source>Menu key</source>
- <translation type="unfinished">Клавиш Меню</translation>
+ <translation>Клавиш Меню</translation>
</message>
<message>
<source>Alt Gr</source>
- <translation type="unfinished">Alt Gr</translation>
+ <translation>Alt Gr</translation>
</message>
<message>
<source>Caps Lock</source>
- <translation type="unfinished">Caps Lock</translation>
+ <translation>Caps Lock</translation>
</message>
<message>
<source>Scroll Lock</source>
- <translation type="unfinished">Scroll Lock</translation>
+ <translation>Scroll Lock</translation>
</message>
<message>
<source>Host+</source>
- <translation type="unfinished"></translation>
+ <translation>Основен+</translation>
</message>
<message>
<source>None</source>
- <translation type="unfinished"></translation>
+ <translation>Няма</translation>
</message>
</context>
<context>
@@ -4311,22 +4501,22 @@ p, li { white-space: pre-wrap; </style></head><body style="
</message>
<message>
<source>Reset shortcut to default</source>
- <translation type="unfinished"></translation>
+ <translation>Връщане на комбинацията по подразбиране</translation>
</message>
<message>
<source>Unset shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>Изчистване на комбинацията</translation>
</message>
</context>
<context>
<name>UIHotKeyTableModel</name>
<message>
<source>Name</source>
- <translation type="unfinished">Име</translation>
+ <translation>Име</translation>
</message>
<message>
<source>Shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>Клавишна комбинация</translation>
</message>
</context>
<context>
@@ -4355,7 +4545,7 @@ p, li { white-space: pre-wrap; }
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This wizard will guide you through importing an appliance. </p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Use the <span style=" font-weight:600;">Next</span> button to go the next page of the wizard and the <span style=" font-weight:600;">Back</span> button to return to the previous page.</p>
<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">VirtualBox currently supports importing appliances saved in the Open Virtualization Format (OVF). To continue, select the file to import below:</p></body></html></source>
- <translation type="obsolete"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Т [...]
+ <translation type="obsolete"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body><p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Т [...]
</message>
<message>
<source>< &Back</source>
@@ -4406,7 +4596,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>This wizard will guide you through importing an appliance.</p><p>%1</p><p>VirtualBox currently supports importing appliances saved in the Open Virtualization Format (OVF). To continue, select the file to import below:</p></source>
- <translation type="obsolete"><p>Този помощник ще ви води през внасянето на приспособление.<p><p>%1</p><p>VirtualBox текущо поддържа внасяне на приспособления, запазени в Отворения Виртуализационен Формат (OVF). За да продължите, изберете файл за внасяне по-долу:</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви води през внасянето на приспособление.<p><p>%1</p><p>VirtualBox текущо поддържа внасяне на приспособления, запазени в Отворения Виртуализационен Формат (OVF). За да продължите, изберете файл за внасяне по-долу:</p></translation>
</message>
</context>
<context>
@@ -4465,12 +4655,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Показва активността на CD/DVD устройствата:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Показва активността на CD/DVD устройствата:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Показва активността на Флопи устройствата:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Показва активността на Флопи устройствата:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4563,24 +4753,34 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
- <translation type="unfinished"></translation>
+ <translation><nobr>Активност на видео запис:</nobr><br>%1</translation>
</message>
<message>
<source><nobr><b>Video capture disabled</b></nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Видео записът е забранен</b></nobr></translation>
</message>
<message>
<source><nobr><b>Video capture file:</b> %1</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Файл за видео запис:</b> %1</nobr></translation>
</message>
<message>
<source>Additional feature status:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></source>
<comment>Virtualization Stuff LED</comment>
- <translation type="unfinished"></translation>
+ <translation>Статус на допълнителни функции:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
- <translation type="unfinished"></translation>
+ <translation><p style='white-space:pre'><nobr>Показва активността на екрана:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Показва активността на оптичните устройства:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Показва активността на флопи устройствата:</nobr>%1</p></translation>
</message>
</context>
<context>
@@ -4654,19 +4854,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No Webcams Connected</source>
- <translation type="unfinished"></translation>
+ <translation>Няма свързани уеб камери</translation>
</message>
<message>
<source>No supported webcams connected to the host PC</source>
- <translation type="unfinished"></translation>
+ <translation>Няма поддържани уеб камери, свързани към реалния ПК</translation>
</message>
<message>
<source>Connect Network Adapter</source>
- <translation type="unfinished"></translation>
+ <translation>Свързване на мрежов адаптер</translation>
</message>
<message>
<source>Connect Network Adapter %1</source>
- <translation type="unfinished"></translation>
+ <translation>Свързване на мрежов адаптер %1</translation>
</message>
</context>
<context>
@@ -4824,170 +5024,178 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Video &Capture</source>
- <translation type="unfinished"></translation>
+ <translation>Видео &заснемане</translation>
</message>
<message>
<source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
- <translation type="unfinished"></translation>
+ <translation>Когато е избрано, VirtualBox ще запише сесията във виртуалната машина във видео файл.</translation>
</message>
<message>
<source>&Enable Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>&Позволяване на видео заснемане</translation>
</message>
<message>
<source>File &Path:</source>
- <translation type="unfinished"></translation>
+ <translation>Път на &файла:</translation>
</message>
<message>
<source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
- <translation type="unfinished"></translation>
+ <translation>Тази настройка указва името на файла, което VirtualBox използва за записаното съдържание.</translation>
</message>
<message>
<source>Frame &Size:</source>
- <translation type="unfinished"></translation>
+ <translation>Размер на &кадър:</translation>
</message>
<message>
<source>This setting determines the resolution (frame size) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Тази настройка указва разделителната способност (размер на кадъра) на записаното видео.</translation>
</message>
<message>
<source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Тази настройка указва <b>хоризонталната</b> разделителната способност (ширина на кадъра) на записаното видео.</translation>
</message>
<message>
<source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Тази настройка указва <b>вертикалната</b> разделителната способност (височина на кадъра) на записаното видео.</translation>
</message>
<message>
<source>&Frame Rate:</source>
- <translation type="unfinished"></translation>
+ <translation>&Скорост на кадри:</translation>
</message>
<message>
<source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Тази настройка указва максималният брой <b>кадри в секунда</b>. Допълнителните кадри ще бъдат пропускани. Намаляването на стойността ще увеличи броя пропуснати кадри и ще намали размера на файла.</translation>
</message>
<message>
<source>&Quality:</source>
- <translation type="unfinished"></translation>
+ <translation>&Качество:</translation>
</message>
<message>
<source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Тази настройка указва <b>качеството</b>. Увеличаването ѝ ще направи видеото да изглежда по-добре, но за сметка на увеличен размер на файла.</translation>
</message>
<message>
<source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Тази настройка указва скоростта на битовете в <b>килобити в секунда</b>. Увеличаването ѝ ще направи видеото да изглежда по-добре, но за сметка на увеличен размер на файла.</translation>
</message>
<message>
<source>&Screens:</source>
- <translation type="unfinished"></translation>
+ <translation>&Екрани:</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Тази виртуална машина е настроена да използва хардуерно графично ускорение. Но реалната машина текущо не поддържа това, така че няма да можете да стартирате машината.</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
- <translation type="unfinished"></translation>
+ <translation>Задали сте по-малко от <b>%1</b> за видео памет на виртуалната машина, което е минималното количество, нужно за превключването на виртуалната машина на цял екран или в безрамков режим.</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
- <translation type="unfinished"></translation>
+ <translation>Задали сте по-малко от <b>%1</b> за видео памет на виртуалната машина, което е минималното количество, нужно за ефикасното изпълнение на HD видео.</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Задали сте да се използва хардуерно графично ускорение за виртуалната машина и за тип на системата сте задали Windows Vista или по-нов. За най-добра производителност трябва да зададете за видео памет на машината поне <b>%1</b>.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
- <translation type="unfinished"></translation>
+ <translation>Задали сте използване на Ускорение на видео поток. Тъй като тази функция работи само с Windows виртуални системи, тя ще бъде забранена.</translation>
</message>
<message>
<source>The VRDE server port value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Стойността на VRDE сървърен порт текущо не е указана.</translation>
</message>
<message>
<source>The VRDE authentication timeout value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Стойността за просрочено време на VRDE автентикация текущо не е зададена.</translation>
</message>
<message>
<source>User Defined</source>
- <translation type="unfinished"></translation>
+ <translation>Зададено от потребителя</translation>
</message>
<message>
<source>%1 fps</source>
- <translation type="unfinished"></translation>
+ <translation>%1 fps</translation>
</message>
<message>
<source>fps</source>
- <translation type="unfinished"></translation>
+ <translation>fps</translation>
</message>
<message>
<source>low</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>ниско</translation>
</message>
<message>
<source>medium</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>средно</translation>
</message>
<message>
<source>high</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>високо</translation>
</message>
<message>
<source>kbps</source>
- <translation type="unfinished"></translation>
+ <translation>kbps</translation>
</message>
<message>
<source>Screen %1</source>
- <translation type="unfinished"></translation>
+ <translation>Екран %1</translation>
</message>
<message>
<source>Enable video recording for screen %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Позволяване на видео заснемане на екран %1.</translation>
</message>
<message>
<source>Machine &Window</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">&Прозорец на машината</translation>
</message>
<message>
<source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Позволява промяна на съдържанието на меню лентата на ВМ.</translation>
</message>
<message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Малка лента с инструменти:</translation>
+ <translation type="obsolete">Малка лента с инструменти:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Ако е избрано, ще се показва малка лента с инструменти при цял екран и безрамков режим.</translation>
+ <translation type="obsolete">Ако е избрано, ще се показва малка лента с инструменти при цял екран и безрамков режим.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Показване при &Цял екран/Безрамков режим</translation>
+ <translation type="obsolete">Показване при &Цял екран/Безрамков режим</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Ако е избрано, малката лента с инструменти ще се показва в горния край на екрана, вместо на стандартната ѝ позиция в долния край на екрана.</translation>
+ <translation type="obsolete">Ако е избрано, малката лента с инструменти ще се показва в горния край на екрана, вместо на стандартната ѝ позиция в долния край на екрана.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Показване &отгоре на екрана</translation>
+ <translation type="obsolete">Показване &отгоре на екрана</translation>
</message>
<message>
<source>Allows to modify VM status-bar contents.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Позволява промяна на съдържанието на статус лентата на ВМ.</translation>
</message>
<message>
<source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Отдалеченият работен плот текущо е позволен за тази виртуална машина. Но това изисква да бъде инсталиран <b>%1</b>. Моля, инсталирайте пакета с разширения от сайта на VirtualBox, иначе виртуалната машина ще бъде стратирана с изключен Отдалечен работен плот.</translation>
</message>
<message>
<source><i>About %1MB per 5 minute video</i></source>
- <translation type="unfinished"></translation>
+ <translation><i>Около %1МБ за 5 минути видео</i></translation>
+ </message>
+ <message>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <translation>Отдалеченият работен плот текущо е позволен за тази виртуална машина. Но това изисква да бъде инсталиран <b>%1</b>. Моля, инсталирайте пакета с разширения от сайта на VirtualBox, иначе виртуалната машина ще бъде стратирана с изключен Отдалечен работен плот.</translation>
+ </message>
+ <message>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
+ <translation>Задали сте да се използва хардуерно графично ускорение за виртуалната машина и за тип на системата сте задали Windows Vista или по-нов. За най-добра производителност трябва да зададете за видео памет на машината поне <b>%1</b>.</translation>
</message>
</context>
<context>
@@ -5230,11 +5438,131 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е указано име за виртуалната машина.</translation>
</message>
<message>
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Зададен е 64-битов тип на операционната система на виртуалната машина. 64-битовите системи изискват хардуерна виртуализация, така че тя ще бъде включена автоматично, ако се съгласите с промените.</translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation>&Криптиране</translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation>Когато е избрано, позволява криптиране за тази виртуална машина.</translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation>По&зволяване на криптиране</translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation>Криптиращ &шифър:</translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation>Задава шифъра, който да се използва за криптиране на дисковете на виртуалната машина.</translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation>В&ъведете нова парола:</translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation>Задава паролата, която да се зададе към виртуалната машина.</translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation>П&отвърждаване на нова парола:</translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation>Потвърждение на паролата, която да се зададе към виртуалната машина.</translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation>Опитвате се да криптирате тази виртуална машина. Но това изисква <i>%1</i> да бъде инсталиран. Моля, инсталирайте пакета с разширения от сайта на VirtualBox.</translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation>Не е указан тип на криптиращия шифър.</translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation>Криптиращата парола е празна.</translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation>Криптиращите пароли не съвпадат.</translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation>Оставяне непроменено</translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation>Позволява промяна на съдържанието на меню лентата на ВМ.</translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation>Фактор на мащаба на екрана:</translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation>Тази настройка определя фактора на мащаба за виртуалния екран.</translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation>100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation>200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation>HiDPI:</translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation>Когато е избрано, съдържанието на виртуалния екран няма да бъде мащабирано в съответствие с високата разделителна способност на реалния екран.</translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation>Използване на &немащабиран HiDPI изход</translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation>Малка лента с инструменти:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation>Ако е избрано, ще се показва малка лента с инструменти при цял екран и безрамков режим.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation>Показване при &Цял екран/Безрамков режим</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation>Ако е избрано, малката лента с инструменти ще се показва в горния край на екрана, вместо на стандартната ѝ позиция в долния край на екрана.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation>Показване &отгоре на екрана</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation>Позволява промяна на съдържанието на статус лентата на ВМ.</translation>
</message>
</context>
<context>
@@ -5342,7 +5670,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Enter any configuration settings here for the network attachment driver you will be using. The settings should be of the form <b>name=value</b> and will depend on the driver. Use <b>shift-enter</b> to add a new entry.</source>
- <translation>Въведете всички конфигурационни настройки за закачащя към мрежата драйвер, които ще използвате. Настройките трябва да са във формат <b>име=стойност</b> и ще зависят от драйвера. Използвайте <b>Shift+Enter</b>, за да добавите нова категория.</translation>
+ <translation>Въведете всички конфигурационни настройки за закачащия към мрежата драйвер, които ще използвате. Настройките трябва да са във формат <b>име=стойност</b> и ще зависят от драйвера. Използвайте <b>Shift+Enter</b>, за да добавите нова категория.</translation>
</message>
<message>
<source>no generic driver is selected</source>
@@ -5378,35 +5706,35 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No bridged network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е избран мостов мрежов адаптер.</translation>
</message>
<message>
<source>No internal network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е избрано име на вътрешна мрежа.</translation>
</message>
<message>
<source>No host-only network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е избран мрежов адаптер само-хост.</translation>
</message>
<message>
<source>No generic driver is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е избран първичен драйвер.</translation>
</message>
<message>
<source>The MAC address must be 12 hexadecimal digits long.</source>
- <translation type="unfinished"></translation>
+ <translation>MAC адресът трябва да е 12 шестнадесетични цифри.</translation>
</message>
<message>
<source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Втората цифра в MAC адреса не може да е нечетна, тъй като са позволени само unicast адреси.</translation>
</message>
<message>
<source>No NAT network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е указано име на NAT мрежа.</translation>
</message>
<message>
<source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
- <translation type="unfinished"></translation>
+ <translation>Задава името на NAT мрежата, към която тази мрежова карта ще се свърже. Можете да създавате и премахвате мрежи, като използвате глобалните мрежови настройки в прозореца за управление на виртуалните машини.</translation>
</message>
</context>
<context>
@@ -5508,23 +5836,23 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е указан IRQ.</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е указан I/O порт.</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Два или повече порта имат еднакви настройки.</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е указан път на порт.</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо има указани дублиращи се пътища на портове.</translation>
</message>
</context>
<context>
@@ -5685,7 +6013,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>When checked, the guest OS will try to automatically mount the shared folder on startup.</source>
- <translation>Когато е избрано, виртуалната OS ще опита да монтира автоматично споделената папка при стартиране.</translation>
+ <translation>Когато е избрано, виртуалната ОС ще опита да монтира автоматично споделената папка при стартиране.</translation>
</message>
<message>
<source>&Auto-mount</source>
@@ -5745,11 +6073,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Ако е избрано, проводът, който е указан в полето <b>Път до порта</b>, ще бъде създаден от виртуалната машина, когато бъде стартирана. В противен случай, виртуалната машина ще опита да използва съществуващия провод.</translation>
+ <translation type="obsolete">Ако е избрано, проводът, който е указан в полето <b>Път до порта</b>, ще бъде създаден от виртуалната машина, когато бъде стартирана. В противен случай, виртуалната машина ще опита да използва съществуващия провод.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Създаване на провод</translation>
+ <translation type="obsolete">&Създаване на провод</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5757,11 +6085,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Показва пътя до провода на този сериен порт на реалната машина, когато портът работи в режим <b>Реален провод</b>, или името на реалното серийно устройство, когато портът работи в режим <b>Реално устройство</b>.</translation>
+ <translation type="obsolete">Показва пътя до провода на този сериен порт на реалната машина, когато портът работи в режим <b>Реален провод</b>, или името на реалното серийно устройство, когато портът работи в режим <b>Реално устройство</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Път на порта/файла:</translation>
+ <translation type="obsolete">&Път на порта/файла:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5771,6 +6099,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Показва основния I/O портов адрес за този сериен порт. Валидни стойности са целочислени номера в диапазона от <tt>0</tt> до <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation>Ако е избрано, виртуалната машина ще предполага, че проводът или сокетът, указан в полето <b>Път/Адрес</b>, съществува и ще пробва да го използва. В противен случай проводът или сокетът ще бъде създаден от виртуалната машина, когато бъде стартирана.</translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation>&Свързване към съществуващ провод/сокет</translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation>&Път/Адрес:</translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation><p>В режим <b>Реален провод</b>: Указва пътя до провода на серийния порт на реалната машина. Примери: "\\.\pipe\myvbox" или "/tmp/myvbox", съответно за Windows и UNIX-подобни системи.</p><p>В режим <b>Реално устройство</b>: Указва името на реалното серийно устройство. Примери: "COM1" или "/dev/ttyS0".</p><p>В режим <b>Първичен файл</b>: Указва файловия път на реа [...]
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5788,23 +6132,23 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е указан IRQ.</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е указан I/O порт.</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Два или повече порта имат еднакви настройки.</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е указан път на порт.</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо има указани дублиращи се пътища на портове.</translation>
</message>
</context>
<context>
@@ -5887,15 +6231,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Добавяне на CD/DVD устройство</nobr></translation>
+ <translation type="obsolete"><nobr>Добавяне на CD/DVD устройство</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Добавяне на Флопи устройство</nobr></translation>
+ <translation type="obsolete"><nobr>Добавяне на Флопи устройство</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
- <translation type="unfinished">Няма избран твърд диск за <i>%1</i>.</translation>
+ <translation>Няма избран твърд диск за <i>%1</i>.</translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -5919,7 +6263,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add Floppy Controller</source>
- <translation>Добавяне на Флопи контролер</translation>
+ <translation>Добавяне на флопи контролер</translation>
</message>
<message>
<source>Remove Controller</source>
@@ -5935,11 +6279,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Добавяне на CD/DVD устройство</translation>
+ <translation type="obsolete">Добавяне на CD/DVD устройство</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Добавяне на Флопи устройство</translation>
+ <translation type="obsolete">Добавяне на флопи устройство</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6127,15 +6471,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD &устройство:</translation>
+ <translation type="obsolete">CD/DVD &устройство:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Изберете виртуален CD/DVD диск или физическо устройство, което да се използва във виртуалното устройство. Виртуалната машина ще вижда диск, вкаран в устройството, със съдържание данните от файла или от диска във физическото устройство.</translation>
+ <translation type="obsolete">Изберете виртуален CD/DVD диск или физическо устройство, което да се използва във виртуалното устройство. Виртуалната машина ще вижда диск, вкаран в устройството, със съдържание данните от файла или от диска във физическото устройство.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Настройване на виртуалното CD/DVD устройство</translation>
+ <translation type="obsolete">Настройване на виртуалното CD/DVD устройство</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6159,7 +6503,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Изберете файл с виртуален CD/DVD диск...</translation>
+ <translation type="obsolete">Изберете файл с виртуален CD/DVD диск...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6225,35 +6569,67 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Controller: %1</source>
- <translation type="unfinished"></translation>
+ <translation>Контролер: %1</translation>
</message>
<message>
<source>No name is currently specified for the controller at position <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е зададено име за контролера на позиция <b>%1</b>.</translation>
</message>
<message>
<source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Контролерът на позиция <b>%1</b> има същото име, като контролера на позиция <b>%2</b>.</translation>
</message>
<message>
<source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
- <translation type="unfinished"></translation>
+ <translation><i>%1</i> използва диск, който вече е закачен към <i>%2</i>.</translation>
</message>
<message>
<source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо машината има добавени повече контролери за съхранение, отколкото чипсет %1 поддържа. Моля, променете типа на чипсета в страницата Системна или намалете броя на следните контролери за съхранение в страницата Съхранение: %2</translation>
</message>
<message>
<source>Add USB Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Добавяне на USB контролер</translation>
</message>
<message>
<source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
- <translation type="unfinished"></translation>
+ <translation>Когато е избрано, виртуалната система ще вижда виртуалния диск като горещо сменяемо устройство.</translation>
</message>
<message>
<source>&Hot-pluggable</source>
- <translation type="unfinished"></translation>
+ <translation>&Горещо сменяемо</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation>Избор на файл с виртуален оптичен диск...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation><nobr>Добавяне на оптично устройство</nobr></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation><nobr>Добавяне на флопи устройство</nobr></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation>Добавяне на оптично устройство</translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation>Добавяне на флопи устройство</translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation>Оптично &устройство:</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation>Изберете виртуален оптичен диск или физическо устройство за използване от виртуалното устройство. Виртуалната машина ще вижда диск, вкаран в устройството, със съдържание данните във файла или на диска във физическото устройство.</translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation>Настройване на виртуалното оптично устройство</translation>
</message>
</context>
<context>
@@ -6481,55 +6857,55 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Pointing Device:</source>
- <translation type="unfinished"></translation>
+ <translation>Посочващо &устройство:</translation>
</message>
<message>
<source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
- <translation type="unfinished"></translation>
+ <translation>Указва дали емулираното посочващо устройство е стандартна PS/2 мишка, USB таблет или USB мултитъч таблет.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>Повече от <b>%1%</b> от реалната компютърна памет (<b>%2</b>) е зададена към виртуалната машина. Не остава достатъчно памет за реалната операционна система. Моля, изберете по-ниска стойност.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>Повече от <b>%1%</b> от реалната компютърна памет (<b>%2</b>) е зададена към виртуалната машина. Може да не остане достатъчно памет за реалната операционна система. Моля, обмислете избирането на по-ниска стойност.</translation>
</message>
<message>
<source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>С оглед на производителността броят на виртуалните процесори, закачени към виртуалната машина, не може да бъде повече от двойно броят на физическите процесори (<b>%1</b>). Моля, намалете броя на виртуалните процесори.</translation>
</message>
<message>
<source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>Задали сте повече виртуални процесори във виртуалната машина от броя на физическите процесори в реалната система (<b>%1</b>). Това ще намали производителността на виртуалната машина. Моля, обмислете намаляване броя на виртуалните процесори.</translation>
</message>
<message>
<source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
- <translation type="unfinished"></translation>
+ <translation>Лимитът за изпълнение на процесора е зададен твърде нисък. Това може да направи машината бавна на реакция.</translation>
</message>
<message>
<source>&Paravirtualization Interface:</source>
- <translation type="unfinished"></translation>
+ <translation>&Паравиртуализационен интерфейс:</translation>
</message>
<message>
<source>Selects the paravirtualization guest interface provider to be used by this virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Задава използване на възможността за паравиртуализационен интерфейс от тази виртуална машина.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9 you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Функцията I/O APIC текущо не е позволена в секцията Дънна платка на страницата Система. Тя е нужна за поддръжката на чипсет ICH9, какъвто сте задали за тази ВМ. Ще бъде позволена автоматично, ако потвърдите Вашите промени.</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущо не е позволена емулация на USB контролер в страницата USB. Тя е нужна за поддръжката на емулирано USB входящо устройство, каквото сте позволили за тази ВМ. Ще бъде позволена автоматично, ако потвърдите Вашите промени.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Функцията I/O APIC текущо не е позволена в секцията Дънна платка на страницата Система. Тя е нужна за поддръжката на повече от един виртуален процесор, колкото сте избрали за тази ВМ. Ще бъде позволена автоматично, ако потвърдите Вашите промени.</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Хардуерната виртуализация текущо не е позволена в секцията Ускорение на страницата Система. Тя е нужна за поддръжката на повече от един виртуален процесор, колкото сте избрани за тази ВМ. Ще бъде позволена автоматично, ако потвърдите Вашите промени.</translation>
</message>
</context>
<context>
@@ -6665,27 +7041,31 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">USB 2.0 текущо е позволен за тази виртуална машина. Но това изисква <b>%1</b> да бъде инсталиран. Моля, инсталирайте пакета с разширения от сайта на VirtualBox или забранете USB 2.0, за да можете да стартирате машината.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>Когато е избрано, позволява виртуалния USB OHCI контролер за тази машина. USB OHCI контролерът предоставя поддръжка на USB 1.0.</translation>
</message>
<message>
<source>USB &1.1 (OHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &1.1 (OHCI) контролер</translation>
</message>
<message>
<source>USB &2.0 (EHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &2.0 (EHCI) контролер</translation>
</message>
<message>
<source>When checked, enables the virtual USB xHCI controller of this machine. The USB xHCI controller provides USB 3.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>Когато е избрано, позволява виртуалния USB xHCI контролер за тази машина. USB xHCI контролерът предоставя поддръжка на USB 3.0.</translation>
</message>
<message>
<source>USB &3.0 (xHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &3.0 (xHCI) контролер</translation>
+ </message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation>USB 2.0/3.0 текущо е позволен за тази виртуална машина. Но това изисква <b>%1</b> да бъде инсталиран. Моля, инсталирайте пакета с разширения от сайта на VirtualBox или забранете USB 2.0/3.0, за да можете да стартирате машината.</translation>
</message>
</context>
<context>
@@ -6828,7 +7208,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Removing medium...</source>
- <translation type="unfinished"></translation>
+ <translation>Премахване на медия...</translation>
</message>
</context>
<context>
@@ -6850,15 +7230,23 @@ p, li { white-space: pre-wrap; }
<name>UIMenuBarEditorWidget</name>
<message>
<source>Virtual Screen Resize</source>
- <translation type="unfinished"></translation>
+ <translation>Преоразмеряване на виртуалния екран</translation>
</message>
<message>
<source>Virtual Screen Mapping</source>
- <translation type="unfinished"></translation>
+ <translation>Позициониране на виртуалния екран</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Затваряне</translation>
+ <translation>Затваряне</translation>
+ </message>
+ <message>
+ <source>Switch</source>
+ <translation>Превключване</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation>Позволяване на меню лентата</translation>
</message>
</context>
<context>
@@ -6899,75 +7287,75 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to initialize COM or to find the VirtualBox COM server. Most likely, the VirtualBox server is not running or failed to start.</p><p>The application will now terminate.</p></source>
- <translation><p>Проблем при инициализирането на COM или при намирането на VirtualBox COM сървър. Най-вероятно, VurtualBox сървърът не е включен или не може да стартира.</p><p>Програмата ще бъде изключена.</p></translation>
+ <translation><p>Неуспешно инициализиране на COM или намиране на VirtualBox COM сървър. Най-вероятно, VurtualBox сървърът не е включен или не може да стартира.</p><p>Програмата ще бъде изключена.</p></translation>
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>проблем при създаването на VirtualBox COM обект.</p><p>Програмата ще бъде изключена.</p></translation>
+ <translation type="obsolete"><p>Неуспешно създаване на VirtualBox COM обект.</p><p>Програмата ще бъде изключена.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
- <translation>Проблем при задаването на основните настройки на VirtualBox.</translation>
+ <translation>Неуспешно задаване на основните настройки на VirtualBox.</translation>
</message>
<message>
<source>Failed to access the USB subsystem.</source>
- <translation>Проблем с достъпа до USB подсистемата.</translation>
+ <translation>Неуспешен достъп до USB подсистемата.</translation>
</message>
<message>
<source>Failed to create a new virtual machine.</source>
- <translation>Проблем при създаването на нова виртуална машина.</translation>
+ <translation>Неуспешно създаване на нова виртуална машина.</translation>
</message>
<message>
<source>Failed to create a new virtual machine <b>%1</b>.</source>
- <translation type="obsolete">Проблем при създаването на нова виртуална машина <b>%1</b>.</translation>
+ <translation type="obsolete">Неуспешно създаване на нова виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to apply the settings to the virtual machine <b>%1</b>.</source>
- <translation type="obsolete">Проблем при прилагането на настройките за виртуална машина <b>%1</b>.</translation>
+ <translation type="obsolete">Неуспешно прилагане на настройките за виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to start the virtual machine <b>%1</b>.</source>
- <translation>Проблем при стартирането на виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно стартиране на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to pause the execution of the virtual machine <b>%1</b>.</source>
- <translation>Проблем при задържането на изпълнението на виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно задържане на изпълнението на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to resume the execution of the virtual machine <b>%1</b>.</source>
- <translation>проблем при продължаването на изпълнението на виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно продължаване на изпълнението на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to save the state of the virtual machine <b>%1</b>.</source>
- <translation>Проблем при запазването на състоянието на виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно запазване на състоянието на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create a snapshot of the virtual machine <b>%1</b>.</source>
- <translation>Проблем при създаването на снимка на виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно създаване на снимка на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to stop the virtual machine <b>%1</b>.</source>
- <translation>Проблем при спирането на виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно спиране на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to remove the virtual machine <b>%1</b>.</source>
- <translation>Проблем при премахването на виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно премахване на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to discard the saved state of the virtual machine <b>%1</b>.</source>
- <translation>Проблем при изчистването на запазеното състояние на виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно изчистване на запазеното състояние на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to discard the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source>
- <translation type="obsolete">Проблем при изчистването на снимка <b>%1</b> на виртуална машина <b>%2</b>.</translation>
+ <translation type="obsolete">Неуспешно изчистване на снимка <b>%1</b> на виртуална машина <b>%2</b>.</translation>
</message>
<message>
<source>Failed to discard the current state of the virtual machine <b>%1</b>.</source>
- <translation type="obsolete">Проблем при изчистването на текущото състояние на виртуална машина <b>%1</b>.</translation>
+ <translation type="obsolete">Неуспешно изчистване на текущото състояние на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to discard the current snapshot and the current state of the virtual machine <b>%1</b>.</source>
- <translation type="obsolete">Проблем при изчистването на настоящата снимка и на текущото състояние на виртуална машина <b>%1</b>.</translation>
+ <translation type="obsolete">Неуспешно изчистване на настоящата снимка и на текущото състояние на виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>There is no virtual machine named <b>%1</b>.</source>
@@ -6987,31 +7375,31 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to create a new session.</source>
- <translation>Проблем при създаването на нова сесия.</translation>
+ <translation>Неуспешно създаване на нова сесия.</translation>
</message>
<message>
<source>Failed to open a session for the virtual machine <b>%1</b>.</source>
- <translation>Проблем при отварянето на сесия за виртуална машина <b>%1</b>.</translation>
+ <translation>Неуспешно отваряне на сесия за виртуална машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to remove the host network interface <b>%1</b>.</source>
- <translation>Проблем при премахването на реален мрежов интерфейс <b>%1</b>.</translation>
+ <translation>Неуспешно премахване на реален мрежов интерфейс <b>%1</b>.</translation>
</message>
<message>
<source>Failed to attach the USB device <b>%1</b> to the virtual machine <b>%2</b>.</source>
- <translation>Проблем при закачането на USB устройство <b>%1</b> към виртуална машина <b>%2</b>.</translation>
+ <translation>Неуспешно закачване на USB устройство <b>%1</b> към виртуална машина <b>%2</b>.</translation>
</message>
<message>
<source>Failed to detach the USB device <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation>проблем при изваждането на USB устройство <b>%1</b> от виртуална машина <b>%2</b>.</translation>
+ <translation>Неуспешно изваждане на USB устройство <b>%1</b> от виртуална машина <b>%2</b>.</translation>
</message>
<message>
<source>Failed to create the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) for the virtual machine <b>%3</b>.</source>
- <translation>Проблем при създаването на споделена папка <b>%1</b> (сочеща към <nobr><b>%2</b></nobr>) за виртуална машина <b>%3</b>.</translation>
+ <translation>Неуспешно създаване на споделена папка <b>%1</b> (сочеща към <nobr><b>%2</b></nobr>) за виртуална машина <b>%3</b>.</translation>
</message>
<message>
<source>Failed to remove the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) from the virtual machine <b>%3</b>.</source>
- <translation type="obsolete">Проблем при премахването на споделена папка <b>%1</b> (сочеща към <nobr><b>%2</b></nobr>) от виртуална машина <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно премахване на споделена папка <b>%1</b> (сочеща към <nobr><b>%2</b></nobr>) от виртуална машина <b>%3</b>.</translation>
</message>
<message>
<source><p>The Virtual Machine reports that the guest OS does not support <b>mouse pointer integration</b> in the current video mode. You need to capture the mouse (by clicking over the VM display or pressing the host key) in order to use the mouse inside the guest OS.</p></source>
@@ -7109,11 +7497,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to change the snapshot folder path of the virtual machine <b>%1<b> to <nobr><b>%2</b></nobr>.</source>
- <translation type="obsolete">Проблем при смяната пътя до папката със снимки на виртуалната машина <b>%1<b> към <nobr><b>%2</b></nobr>.</translation>
+ <translation type="obsolete">Неуспешна смяна на пътя до папката със снимки на виртуалната машина <b>%1<b> към <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source><p>Failed to remove the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) from the virtual machine <b>%3</b>.</p><p>Please close all programs in the guest OS that may be using this shared folder and try again.</p></source>
- <translation><p>проблем при премахването на споделената папка <b>%1</b> (сочеща към <nobr><b>%2</b></nobr>) от виртуалната машина <b>%3</b>.</p><p>Моля, затворете всички програми във виртуалната ОС, които може би използват тази споделена папка, и опитайте отново.</p></translation>
+ <translation><p>Неуспешно премахване на споделената папка <b>%1</b> (сочеща към <nobr><b>%2</b></nobr>) от виртуалната машина <b>%3</b>.</p><p>Моля, затворете всички програми във виртуалната ОС, които може би използват тази споделена папка, и опитайте отново.</p></translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file <nobr><b>%1</b></nobr> or <nobr><b>%2</b>.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -7121,7 +7509,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to download the VirtualBox Guest Additions disk image file from <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p></source>
- <translation type="obsolete"><p>проблем при свалянето на CD изображението VirtualBox Виртуални Добавки от <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p></translation>
+ <translation type="obsolete"><p>Неуспешно сваляне на CD изображението VirtualBox Виртуални Добавки от <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p></translation>
</message>
<message>
<source><p>Are you sure you want to download the VirtualBox Guest Additions disk image file from <nobr><a href="%1">%2</a></nobr> (size %3 bytes)?</p></source>
@@ -7141,43 +7529,43 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to find license files in <nobr><b>%1</b></nobr>.</source>
- <translation type="obsolete">Проблем при намирането на лицензни файлове в <nobr><b>%1</b></nobr>.</translation>
+ <translation type="obsolete">Неуспешно намиране на лицензни файлове в <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source>
- <translation>Проблем при отварянето на лицензния файл <nobr><b>%1</b></nobr>. Проверете правата на файла.</translation>
+ <translation>Неуспешно отваряне на лицензния файл <nobr><b>%1</b></nobr>. Проверете правата на файла.</translation>
</message>
<message>
<source>Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>.</source>
- <translation>Проблем при изпращането на събитие натиснат ACPI бутон за включване към виртуалната машина <b>%1</b>.</translation>
+ <translation>Неуспешно изпращане на събитие натиснат ACPI бутон за включване към виртуалната машина <b>%1</b>.</translation>
</message>
<message>
<source><p>Congratulations! You have been successfully registered as a user of VirtualBox.</p><p>Thank you for finding time to fill out the registration form!</p></source>
- <translation type="obsolete"><p>Поздравления! Бяхте успешно регистриран като потребител на VirtualBox.</p><p>Благодарим ви за отделеното време за попълването на регистрационната форма!</p></translation>
+ <translation type="obsolete"><p>Поздравления! Бяхте успешно регистриран като потребител на VirtualBox.</p><p>Благодарим Ви за отделеното време за попълването на регистрационната форма!</p></translation>
</message>
<message>
<source><p>Failed to register the VirtualBox product</p><p>%1</p></source>
- <translation type="obsolete"><p>Проблем при регистрирането на VirtualBox</p><p>%1</p></translation>
+ <translation type="obsolete"><p>Неуспешно регистриране на VirtualBox</p><p>%1</p></translation>
</message>
<message>
<source><p>Failed to save the global VirtualBox settings to <b><nobr>%1</nobr></b>.</p></source>
- <translation type="obsolete"><p>Проблем при запазването на общите настройки на VirtualBox в <b><nobr>%1</nobr></b>.</p></translation>
+ <translation type="obsolete"><p>Неуспешно запазване на общите настройки на VirtualBox в <b><nobr>%1</nobr></b>.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration from <b><nobr>%1</nobr></b>.</p><p>The application will now terminate.</p></source>
- <translation><p>Проблем при зареждането на основната GUI конфигурация от <b><nobr>%1</nobr></b>.</p><p>Програмата ще бъде изключена.</p></translation>
+ <translation><p>Неуспешно зареждане на основната GUI конфигурация от <b><nobr>%1</nobr></b>.</p><p>Програмата ще бъде изключена.</p></translation>
</message>
<message>
<source><p>Failed to save the global GUI configuration to <b><nobr>%1</nobr></b>.</p><p>The application will now terminate.</p></source>
- <translation><p>Проблем при запазването на основната GUI конфигурация в <b><nobr>%1</nobr></b>.</p><p>Програмата ще бъде изключена.</p></translation>
+ <translation><p>Неуспешно запазване на основната GUI конфигурация в <b><nobr>%1</nobr></b>.</p><p>Програмата ще бъде изключена.</p></translation>
</message>
<message>
<source>Failed to save the settings of the virtual machine <b>%1</b> to <b><nobr>%2</nobr></b>.</source>
- <translation>Проблем при запазването на настройките на виртуалната машина <b>%1</b> в <b><nobr>%2</nobr></b>.</translation>
+ <translation>Неуспешно запазване на настройките на виртуалната машина <b>%1</b> в <b><nobr>%2</nobr></b>.</translation>
</message>
<message>
<source>Failed to load the settings of the virtual machine <b>%1</b> from <b><nobr>%2</nobr></b>.</source>
- <translation type="obsolete">Проблем при зареждането на настройките на виртуалната машина <b>%1</b> от <b><nobr>%2</nobr></b>.</translation>
+ <translation type="obsolete">Неуспешно зареждане на настройките на виртуалната машина <b>%1</b> от <b><nobr>%2</nobr></b>.</translation>
</message>
<message>
<source>Delete</source>
@@ -7260,7 +7648,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to copy file <b><nobr>%1</nobr></b> to <b><nobr>%2</nobr></b> (%3).</source>
- <translation type="obsolete">Проблем при копиране на файл <b><nobr>%1</nobr></b> в <b><nobr>%2</nobr></b> (%3).</translation>
+ <translation type="obsolete">Неуспешно копиране на файл <b><nobr>%1</nobr></b> в <b><nobr>%2</nobr></b> (%3).</translation>
</message>
<message>
<source>&Create</source>
@@ -7294,7 +7682,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The Virtual Machine reports that the guest OS supports <b>mouse pointer integration</b>. This means that you do not need to <i>capture</i> the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine's display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.</p><p>The mouse icon on the s [...]
- <translation><p>Виртуалната машина съобщава, че виртуалната ОС поддържа <b>интеграция показалеца на мишката</b>. Това означава, че не е нужно да <i>прихващате</i> показалеца на мишката, за да можете да го използвате във виртуалната ОС - всички действия на мишката, които извършите, когато показалецът на мишката е върху екрана на виртуалната машина, ще бъдат изпращани директно към виртуалната ОС. Ако мишката е прихваната в момента, тя ще бъде освобожд [...]
+ <translation><p>Виртуалната машина съобщава, че виртуалната ОС поддържа <b>интеграция показалеца на мишката</b>. Това означава, че не е нужно да <i>прихващате</i> показалеца на мишката, за да можете да го използвате във виртуалната ОС - всички действия на мишката, които извършите, когато показалецът на мишката е върху екрана на виртуалната машина, ще бъдат изпращани директно към виртуалната ОС. Ако мишката е прихваната в момента, тя ще бъде освобожд [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>. Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -7354,7 +7742,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Излязла е нова версия на VirtualBox! Версия <b>%1</b> е достъпна на <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>. Можете да изтеглите тази версия от тази директна връзка:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Излязла е нова версия на VirtualBox! Версия <b>%1</b> е достъпна на <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>. Можете да изтеглите тази версия от тази директна връзка:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7375,7 +7763,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The next dialog will let you choose whether you also want to delete the storage unit of this hard disk or keep it for later usage.</source>
- <translation type="obsolete">Следващият диалог ще ви даде избор дали наистина искате да изтриете файла на този твърд диск или искате да го запазите за последващо използване.</translation>
+ <translation type="obsolete">Следващият диалог ще Ви даде избор дали наистина искате да изтриете файла на този твърд диск или искате да го запазите за последващо използване.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to add it to the list later again.</p></source>
@@ -7392,7 +7780,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Do you want to delete the storage unit of the hard disk <nobr><b>%1</b></nobr>?</p><p>If you select <b>Delete</b> then the specified storage unit will be permanently deleted. This operation <b>cannot be undone</b>.</p><p>If you select <b>Keep</b> then the hard disk will be only removed from the list of known hard disks, but the storage unit will be left untouched which makes it po [...]
- <translation><p>Искате ли да изтриете файла на твърдия диск <nobr><b>%1</b></nobr>?</p><p>Ако изберете <b>Изтриване</b>, избраният файл ще бъде безвъзвратно изтрит. Тази операция <b>не може да бъде върната</b>.</p><p>Ако изберете <b>Запазване</b>, тогава само твърдият диск ще бъде премахнат от списъка с познати твърди дискове, но файлът му няма да бъде докосван, което ви дава възможност да д [...]
+ <translation><p>Искате ли да изтриете файла на твърдия диск <nobr><b>%1</b></nobr>?</p><p>Ако изберете <b>Изтриване</b>, избраният файл ще бъде безвъзвратно изтрит. Тази операция <b>не може да бъде върната</b>.</p><p>Ако изберете <b>Запазване</b>, тогава само твърдият диск ще бъде премахнат от списъка с познати твърди дискове, но файлът му няма да бъде докосван, което Ви дава възможност да д [...]
</message>
<message>
<source>Delete</source>
@@ -7406,7 +7794,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to delete the storage unit of the hard disk <b>%1</b>.</source>
- <translation>Проблем при изтриването файла на твърдия диск <b>%1</b>.</translation>
+ <translation>Неуспешно изтриване на файла на твърдия диск <b>%1</b>.</translation>
</message>
<message>
<source><p>There are no unused hard disks available for the newly created attachment.</p><p>Press the <b>Create</b> button to start the <i>New Virtual Disk</i> wizard and create a new hard disk, or press the <b>Select</b> if you wish to open the <i>Virtual Media Manager</i>.</p></source>
@@ -7414,39 +7802,39 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to create the hard disk storage <nobr><b>%1</b>.</nobr></source>
- <translation>Проблем при създаването файла на твърдия диск <nobr><b>%1</b>.</nobr></translation>
+ <translation>Неуспешно създаване на файла на твърдия диск <nobr><b>%1</b>.</nobr></translation>
</message>
<message>
<source>Failed to attach the hard disk <nobr><b>%1</b></nobr> to slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="obsolete">Проблем при закачането на твърдия диск <nobr><b>%1</b></nobr> към слота <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно закачване на твърдия диск <nobr><b>%1</b></nobr> към слота <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the hard disk <nobr><b>%1</b></nobr> from slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="obsolete">Проблем при разкачането на твърдия диск <nobr><b>%1</b></nobr> от слота <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно разкачване на твърдия диск <nobr><b>%1</b></nobr> от слота <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to mount the %1 <nobr><b>%2</b></nobr> on the machine <b>%3</b>.</source>
- <translation type="obsolete">Проблем при монтирането на %1 <nobr><b>%2</b></nobr> в машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно монтиране на %1 <nobr><b>%2</b></nobr> в машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to unmount the %1 <nobr><b>%2</b></nobr> from the machine <b>%3</b>.</source>
- <translation type="obsolete">Проблем при демонтирането на %1 <nobr><b>%2</b></nobr> от машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно демонтиране на %1 <nobr><b>%2</b></nobr> от машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to open the %1 <nobr><b>%2</b></nobr>.</source>
- <translation type="obsolete">Проблем при отварянето на %1 <nobr><b>%2</b></nobr>.</translation>
+ <translation type="obsolete">Неуспешно отваряне на %1 <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the %1 <nobr><b>%2</b></nobr>.</source>
- <translation type="obsolete">Проблем при затварянето на %1 <nobr><b>%2</b></nobr>.</translation>
+ <translation type="obsolete">Неуспешно затваряне на %1 <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to access the disk image file <nobr><b>%1</b></nobr>.</source>
- <translation>Проблем при установяването достъпността на диска <nobr><b>%1</b></nobr>.</translation>
+ <translation>Неуспешно установяване достъпността на диска <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source><p>Failed to connect to the VirtualBox online registration service due to the following error:</p><p><b>%1</b></p></source>
- <translation type="obsolete"><p>Проблем при свързването към услугата за онлайн регистрация на VirtualBox, поради следната грешка:</p><p><b>%1</b></p></translation>
+ <translation type="obsolete"><p>Неуспешно свързване към услугата за онлайн регистрация на VirtualBox, поради следната грешка:</p><p><b>%1</b></p></translation>
</message>
<message>
<source><p>Unable to obtain the new version information due to the following error:</p><p><b>%1</b></p></source>
@@ -7454,11 +7842,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Един или повече виртуални твърди дискове, CD/DVD или флопи дискове не са достъпни в момента. В резултат на това, няма да можете да работите с тях във виртуалните машини, които ги използват, докато не станат достъпни по-късно.</p><p>Натиснете <b>Проверка</b>, за да отворите прозореца на Управлението на виртуални дискове и да видите кои дискове са недостъпни, или натиснете <b>Игнориране</b>, за да игнорирате това съобщение.& [...]
+ <translation type="obsolete"><p>Един или повече виртуални твърди дискове, CD/DVD или флопи дискове не са достъпни в момента. В резултат на това, няма да можете да работите с тях във виртуалните машини, които ги използват, докато не станат достъпни по-късно.</p><p>Натиснете <b>Проверка</b>, за да отворите прозореца на Управлението на виртуални дискове и да видите кои дискове са недостъпни, или натиснете <b>Игнориране</b>, за да игнорирате [...]
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
- <translation type="obsolete"><p>Съществуващите ви файлове с настройки за VirtualBox са преобразувани автоматично от стария формат към новия формат, необходим за новата версия на VirtualBox.</p><p>Натиснете <b>Добре</b>, за да стартирате VirtualBox сега, или натиснете <b>Повече</b>, ако искате да получите повече информация относно това кои файлове са били преобразувани и за да достъпите допълнителни действия.</p><p>Натиснете &l [...]
+ <translation type="obsolete"><p>Съществуващите Ви файлове с настройки за VirtualBox са преобразувани автоматично от стария формат към новия формат, необходим за новата версия на VirtualBox.</p><p>Натиснете <b>Добре</b>, за да стартирате VirtualBox сега, или натиснете <b>Повече</b>, ако искате да получите повече информация относно това кои файлове са били преобразувани и за да достъпите допълнителни действия.</p><p>Натиснете &l [...]
</message>
<message>
<source>&More</source>
@@ -7485,7 +7873,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Възникна критична грешка по време изпълнението на виртуалната машина и изпълнението на машината е спряно.</p><p>За помощ, моля, погледнете секцията Общност на адрес <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> или договора ви за поддръжка. Моля, представете съдържанието на файла със записки <tt>VBox.log</tt> и картинката <tt>VBox.png</tt>, които можете да намерите в папка <nobr><b> [...]
+ <translation type="obsolete"><p>Възникна критична грешка по време изпълнението на виртуалната машина и изпълнението на машината е спряно.</p><p>За помощ, моля, погледнете секцията Общност на адрес <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> или договора Ви за поддръжка. Моля, представете съдържанието на файла със записки <tt>VBox.log</tt> и картинката <tt>VBox.png</tt>, които можете да намерите в папка < [...]
</message>
<message>
<source>hard disk</source>
@@ -7512,7 +7900,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to remove the file <b>%1</b>.<br /><br />Please try to remove the file yourself and try again.</source>
- <translation type="obsolete">Проблем при премахването на файла <b>%1</b>.<br /><br />Моля, опитайте да премахнете файла ръчно и опитайте отново.</translation>
+ <translation type="obsolete">Неуспешно премахване на файла <b>%1</b>.<br /><br />Моля, опитайте да премахнете файла ръчно и опитайте отново.</translation>
</message>
<message>
<source>You are running a prerelease version of VirtualBox. This version is not suitable for production use.</source>
@@ -7565,39 +7953,39 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to create the host-only network interface.</source>
- <translation type="obsolete">Проблем при създаването на мрежов интерфейс само-хост.</translation>
+ <translation type="obsolete">Неуспешно създаване на мрежов интерфейс само-хост.</translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files will be automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>Exit</b> if you want to terminate the VirtualBox application without any further actions.</p></source>
- <translation type="obsolete"><p>Съществуващите ви файлове с настройки за VirtualBox ще бъдат автоматично преобразувани от стария формат към новия формат, необходим за новата версия на VirtualBox.</p><p>Натиснете <b>Добре</b>, за да стартирате VirtualBox сега, или натиснете <b>Изход</b>, ако искате да изключите програмата VirtualBox без каквито и да е други действия.</p></translation>
+ <translation type="obsolete"><p>Съществуващите Ви файлове с настройки за VirtualBox ще бъдат автоматично преобразувани от стария формат към новия формат, необходим за новата версия на VirtualBox.</p><p>Натиснете <b>Добре</b>, за да стартирате VirtualBox сега, или натиснете <b>Изход</b>, ако искате да изключите програмата VirtualBox без каквито и да е други действия.</p></translation>
</message>
<message>
<source>Failed to open appliance.</source>
- <translation type="obsolete">Проблем при отварянето на приспособление.</translation>
+ <translation type="obsolete">Неуспешно отваряне на приспособление.</translation>
</message>
<message>
<source>Failed to open/interpret appliance <b>%1</b>.</source>
- <translation>Проблем при отварянето/разпознаването на приспособление <b>%1</b>.</translation>
+ <translation>Неуспешно отваряне/разпознаване на приспособление <b>%1</b>.</translation>
</message>
<message>
<source>Failed to import appliance <b>%1</b>.</source>
- <translation>Проблем при внасянето на приспособление <b>%1</b>.</translation>
+ <translation>Неуспешно внасяне на приспособление <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create appliance.</source>
- <translation type="obsolete">Проблем при създаването на приспособление.</translation>
+ <translation type="obsolete">Неуспешно създаване на приспособление.</translation>
</message>
<message>
<source>Failed to prepare the export of the appliance <b>%1</b>.</source>
- <translation>Проблем при подготовката за изнасяне на приспособлението <b>%1</b>.</translation>
+ <translation>Неуспешна подготовка за изнасяне на приспособлението <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create an appliance.</source>
- <translation type="obsolete">Проблем при създаването на приспособление.</translation>
+ <translation type="obsolete">Неуспешно създаване на приспособление.</translation>
</message>
<message>
<source>Failed to export appliance <b>%1</b>.</source>
- <translation>Проблем при изнасянето на приспособление <b>%1</b>.</translation>
+ <translation>Неуспешно изнасяне на приспособление <b>%1</b>.</translation>
</message>
<message>
<source><p>Deleting this host-only network will remove the host-only interface this network is based on. Do you want to remove the (host-only network) interface <nobr><b>%1</b>?</nobr></p><p><b>Note:</b> this interface may be in use by one or more virtual network adapters belonging to one of your VMs. After it is removed, these adapters will no longer be usable until you correct their settings by either choosing a different in [...]
@@ -7629,7 +8017,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>You seem to have the USBFS filesystem mounted at /sys/bus/usb/drivers. We strongly recommend that you change this, as it is a severe mis-configuration of your system which could cause USB devices to fail in unexpected ways.</source>
- <translation>Изглежда, че имате USBFS файлова система, монтирана в /sys/bus/usb/drivers. Силно ви препоръчваме да промените това, тъй като това е тежък пропуск в конфигурацията на системата ви, което може да доведе до грешки в USB устройството по неподозирани начини.</translation>
+ <translation>Изглежда, че имате USBFS файлова система, монтирана в /sys/bus/usb/drivers. Силно Ви препоръчваме да промените това, тъй като това е тежък пропуск в конфигурацията на системата Ви, което може да доведе до грешки в USB устройството по неподозирани начини.</translation>
</message>
<message>
<source>You are running an EXPERIMENTAL build of VirtualBox. This version is not suitable for production use.</source>
@@ -7653,11 +8041,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to restore the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source>
- <translation>Проблем при възстановяването на снимката <b>%1</b> на виртуалната машина <b>%2</b>.</translation>
+ <translation>Неуспешно възстановяване на снимката <b>%1</b> на виртуалната машина <b>%2</b>.</translation>
</message>
<message>
<source>Failed to delete the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source>
- <translation>Проблем при изтриването на снимката <b>%1</b> на виртуалната машина <b>%2</b>.</translation>
+ <translation>Неуспешно изтриване на снимката <b>%1</b> на виртуалната машина <b>%2</b>.</translation>
</message>
<message>
<source><p>There are no unused media available for the newly created attachment.</p><p>Press the <b>Create</b> button to start the <i>New Virtual Disk</i> wizard and create a new medium, or press the <b>Select</b> if you wish to open the <i>Virtual Media Manager</i>.</p></source>
@@ -7679,11 +8067,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the %1 to slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="obsolete">Проблем при свързването на %1 към слот <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно свързване на %1 към слот <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the %1 from slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="obsolete">Проблем при разкачането на %1 от слот <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно разкачване на %1 от слот <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source>Unable to insert the %1 <nobr><b>%2</b></nobr> into the machine <b>%3</b>.</source>
@@ -7707,7 +8095,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to eject the disk from the virtual drive. The drive may be locked by the guest operating system. Please check this and try again.</source>
- <translation type="obsolete">Проблем при изваждането на диска от виртуалното устройство. Устройството може да е заключено от виртуалната ОС. Моля, проверете това и опитайте отново.</translation>
+ <translation type="obsolete">Неуспешно изваждане на диска от виртуалното устройство. Устройството може да е заключено от виртуалната ОС. Моля, проверете това и опитайте отново.</translation>
</message>
<message>
<source><p>Could not insert the VirtualBox Guest Additions installer disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
@@ -7764,7 +8152,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Сигурни ли сте, че искате да изтриете CD/DVD устройството?</p><p>Няма да имате възможност да монтирате CD или ISO изображения, или да инсталирате Виртуални Добавки без него!</p></translation>
+ <translation type="obsolete"><p>Сигурни ли сте, че искате да изтриете CD/DVD устройството?</p><p>Няма да имате възможност да монтирате CD или ISO изображения, или да инсталирате Виртуални Добавки без него!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -7821,7 +8209,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to open virtual machine located in %1.</source>
- <translation>Проблем с отварянето на виртуална машина, разположена в %1.</translation>
+ <translation>Неуспешно отваряне на виртуална машина, разположена в %1.</translation>
</message>
<message>
<source>Failed to add virtual machine <b>%1</b> located in <i>%2</i> because its already present.</source>
@@ -7867,7 +8255,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Предстои да добавите ново CD/DVD устройство към контролера <b>%1</b>.</p><p>Искате ли да изберете виртуален CD/DVD диск, който да се вкара в устройството, или ще го оставите празно засега?</p></translation>
+ <translation type="obsolete"><p>Предстои да добавите ново CD/DVD устройство към контролера <b>%1</b>.</p><p>Искате ли да изберете виртуален CD/DVD диск, който да се вкара в устройството, или ще го оставите празно засега?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -7885,15 +8273,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the hard disk (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Проблем при разкачането на твърдия диск (<nobr><b>%1</b></nobr>) от слота <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation>Неуспешно разкачване на твърдия диск (<nobr><b>%1</b></nobr>) от слота <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Проблем при разкачането на CD/DVD устройството (<nobr><b>%1</b></nobr>) от слота <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно разкачване на CD/DVD устройството (<nobr><b>%1</b></nobr>) от слота <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Проблем при разкачането на флопи устройството (<nobr><b>%1</b></nobr>) от слота <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно разкачване на флопи устройството (<nobr><b>%1</b></nobr>) от слота <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -7908,15 +8296,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
- <translation>Проблем при обновяването на Виртуални Добавки. Инсталационното изображение на Виртуалните Добавки ще бъде монтирано, за да се осигури ръчна инсталация.</translation>
+ <translation>Неуспешно обновяване на Виртуални Добавки. Инсталационното изображение на Виртуалните Добавки ще бъде монтирано, за да се осигури ръчна инсталация.</translation>
</message>
<message>
<source>Failed to install the Extension Pack <b>%1</b>.</source>
- <translation>Проблем при инсталирането на пакета с разширения <b>%1</b>.</translation>
+ <translation>Неуспешно инсталиране на пакета с разширения <b>%1</b>.</translation>
</message>
<message>
<source>Failed to uninstall the Extension Pack <b>%1</b>.</source>
- <translation>Проблем при деинсталирането на пакета с разширения <b>%1</b>.</translation>
+ <translation>Неуспешно деинсталиране на пакета с разширения <b>%1</b>.</translation>
</message>
<message>
<source>You are about to remove the Extension Pack <b>%1</b>. Are you sure you want to do that?</source>
@@ -7940,15 +8328,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the hard disk (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Проблем при закачането на твърдия диск (<nobr><b>%1</b></nobr>) към слота <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation>Неуспешно закачване на твърдия диск (<nobr><b>%1</b></nobr>) към слота <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Проблем при закачането на CD/DVD устройството (<nobr><b>%1</b></nobr>) към слота <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно закачване на CD/DVD устройството (<nobr><b>%1</b></nobr>) към слота <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Проблем при закачането на флопи устройството (<nobr><b>%1</b></nobr>) към слота <i>%2</i> на машината <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешно закачване на флопи устройството (<nobr><b>%1</b></nobr>) към слота <i>%2</i> на машината <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -7977,7 +8365,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to open the Extension Pack <b>%1</b>.</source>
- <translation>Проблем при отварянето на пакета с разширения <b>%1</b>.</translation>
+ <translation>Неуспешно отваряне на пакета с разширения <b>%1</b>.</translation>
</message>
<message>
<source><p>You are about to install a VirtualBox extension pack. Extension packs complement the functionality of VirtualBox and can contain system level software that could be potentially harmful to your system. Please review the description below and only proceed if you have obtained the extension pack from a trusted source.</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name: </b></td><td>%1< [...]
@@ -8037,7 +8425,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to register the virtual machine <b>%1</b>.</source>
- <translation>Проблем пр регистрирането на виртуалната машина <b>%1</b>.</translation>
+ <translation>Неуспешно регистриране на виртуалната машина <b>%1</b>.</translation>
</message>
<message>
<source><p>The machine settings were changed while you were editing them. You currently have unsaved setting changes.</p><p>Would you like to reload the changed settings or to keep your own changes?</p></source>
@@ -8057,7 +8445,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to clone the virtual machine <b>%1</b>.</source>
- <translation>Проблем при клонирането на виртуалната машина <b>%1</b>.</translation>
+ <translation>Неуспешно клониране на виртуалната машина <b>%1</b>.</translation>
</message>
<message>
<source><p>You are about to restore snapshot <b>%1</b>.</p><p>You can create a snapshot of the current state of the virtual machine first by checking the box below; if you do not do this the current state will be permanently lost. Do you wish to proceed?</p></source>
@@ -8073,7 +8461,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Error changing disk image mode from <b>%1</b> to <b>%2</b>.</p></source>
- <translation><p>Проблем при промяната типа на медията от <b>%1</b> на <b>%2</b>.</p></translation>
+ <translation><p>Неуспешна промяна типа на медията от <b>%1</b> на <b>%2</b>.</p></translation>
</message>
<message>
<source><p>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b><nobr>%1</nobr></b> to be installed.</p><p>Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</p></source>
@@ -8202,7 +8590,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Неуспех при пропускането на данни.</translation>
+ <translation type="obsolete">Неуспех при пропускането на данни.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -8250,7 +8638,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Could not start the machine <b>%1</b> because the following physical network interfaces were not found:</p><p><b>%2</b></p><p>You can either change the machine's network settings or stop the machine.</p></source>
- <translation><p>Не може да се включи машината <b>%1</b>, защото следният физически мрежови интерфейс не е намерен:</p><p><b>%2</b></p><p>Можете или да промените мрежовите настройки на машината, или да я спрете.</p></translation>
+ <translation><p>Не може да се включи машината <b>%1</b>, защото следният физически мрежов интерфейс не е намерен:</p><p><b>%2</b></p><p>Можете или да промените мрежовите настройки на машината, или да я спрете.</p></translation>
</message>
<message>
<source>Change Network Settings</source>
@@ -8262,247 +8650,355 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>VirtualBox Управление не може да се включи, заради локални ограничения.</p><p>Приложението сега ще се изключи.</p></translation>
</message>
<message>
<source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Не може да се намери езиков файл за езика <b>%1</b> в папката <b><nobr>%2</nobr></b>.</p><p>Езикът временно ще бъде върнат към стандартния за системата. Моля, отидете в диалога <b>Предпочитания</b>, който може да бъде отворен от менюто <b>Файл</b> на основния прозорец на VirtualBox, и изберете един от съществуващите езици в страницата <b>Език</b>.</p></translation>
</message>
<message>
<source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Не може да се зареди езиковият файл <b><nobr>%1</nobr></b>. <p>Езикът временно ще бъде върнат до Английски (вграден). Моля, отидете в диалога <b>Предпочитания</b>, който може да бъде отворен от менюто <b>Файл</b> на основния прозорец на VirtualBox, и изберете един от съществуващите езици в страницата <b>Език</b>.</p></translation>
</message>
<message>
<source>There is no virtual machine with the identifier <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Няма виртуална машина с индикатора <b>%1</b>.</translation>
</message>
<message>
<source>Ignore</source>
- <translation type="unfinished"></translation>
+ <translation>Игнориране</translation>
</message>
<message>
<source>Failed to create NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно създаване на NAT мрежа.</translation>
</message>
<message>
<source>Failed to remove NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно премахване на NAT мрежа <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create DHCP server.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно създаване на DHCP сървър.</translation>
</message>
<message>
<source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно премахване на DHCP сървър от мрежов интерфейс <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create the host network interface.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно създаване на реален мрежов интерфейс.</translation>
</message>
<message>
<source>Create &new disk</source>
- <translation type="unfinished">Създаване на &нов диск</translation>
+ <translation>Създаване на &нов диск</translation>
</message>
<message>
<source>&Choose existing disk</source>
- <translation type="unfinished">&Избор на съществуващ диск</translation>
+ <translation>&Избор на съществуващ диск</translation>
</message>
<message>
<source>Leave &empty</source>
- <translation type="unfinished">&Оставяне празно</translation>
+ <translation>&Оставяне празно</translation>
</message>
<message>
<source>&Choose disk</source>
- <translation type="unfinished">&Избор на диск</translation>
+ <translation>&Избор на диск</translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Сигурни ли сте, че искате да освободите виртуалния твърд диск <nobr><b>%1</b></nobr>?</p><p>Това ще го разкачи от следните виртуални машини: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Сигурни ли сте, че искате да освободите виртуалния оптичен диск <nobr><b>%1</b></nobr>?</p><p>Това ще го разкачи от следните виртуални машини: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Сигурни ли сте, че искате да освободите виртуалния флопи диск <nobr><b>%1</b></nobr>?</p><p>Това ще го разкачи от следните виртуални машини: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Сигурни ли сте, че искате да премахнете виртуалния твърд диск <nobr><b>%1</b></nobr> от списъка с познатите дискове?</p></translation>
</message>
<message>
<source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Тъй като този твърд диск е недостъпен, неговият файл не може да бъде изтрит.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Сигурни ли сте, че искате да премахнете виртуалния оптичен диск <nobr><b>%1</b></nobr> от списъка с познатите дискове?</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Сигурни ли сте, че искате да премахнете виртуалния флопи диск <nobr><b>%1</b></nobr> от списъка с познатите дискове?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Не може да се вкара виртуалният оптичен диск <nobr><b>%1</b></nobr> във виртуалната машина <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force insertion of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Искате ли да пробвате насилствено вкарване на този диск?</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Не може да се извади виртуалният оптичен диск <nobr><b>%1</b></nobr> от машината <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force ejection of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Искате ли да пробвате насилствено изваждане на този диск?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Не може да се вкара виртуалният флопи диск <nobr><b>%1</b></nobr> във виртуалната машина <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Не може да се извади виртуалният флопи диск <nobr><b>%1</b></nobr> от машината <b>%2</b>.</p></translation>
</message>
<message>
<source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно отваряне на файла с твърд диск <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно отваряне на файла с оптичен диск <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно отваряне на файла с флопи диск <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно затваряне на файла с твърд диск <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно затваряне на файла с оптичен диск <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно затваряне на файла с флопи диск <nobr><b>%2</b></nobr>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
<comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform><p>Следната %n виртуална машина е в запазено състояние: <b>%1</b></p><p>Ако продължите, включеното състояние на изнесената машина ще бъде отменено. Други машини няма да бъдат променяни.</p></numerusform>
+ <numerusform><p>Следните %n виртуални машини са в запазено състояние: <b>%1</b></p><p>Ако продължите, включеното състояние на изнесените машини ще бъде отменено. Други машини няма да бъдат променяни.</p></numerusform>
</translation>
</message>
<message>
<source>Switch</source>
- <translation type="unfinished">Превключване</translation>
+ <translation>Превключване</translation>
</message>
<message>
<source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно позволяване на сървъра за отдалечен работен плот за виртуалната машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно забраняване на сървъра за отдалечен работен плот за виртуалната машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно позволяване на видео заснемането за виртуалната машина <b>%1</b>.</translation>
</message>
<message>
<source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно забраняване на видео заснемането за виртуалната машина <b>%1</b>.</translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Неуспешно намиране на файла с дисковото изображение <b>VirtualBox Виртуални Добавки</b>.</p><p>Искате ли да го свалите от Интернет?</p></translation>
</message>
<message>
<source>Download</source>
- <translation type="unfinished">Изтегляне</translation>
+ <translation>Изтегляне</translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Сигурни ли сте, че искате да изтеглите дисковото изображение <b>VirtualBox Виртуални Добавки</b> от <nobr><a href="%1">%1</a></nobr> (размер %2 байта)?</p></translation>
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Дисковото изображение <b>VirtualBox Виртуални Добавки</b> е свалено успешно от <nobr><a href="%1">%1</a></nobr> но не може да се запази локално в <nobr><b>%2</b>.</nobr></p><p>Моля, изберете друго местоположение за този файл!</p></translation>
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete"><p>Дисковото изображение <b>VirtualBox Виртуални Добавки</b> е свалено успешно от <nobr><a href="%1">%1</a></nobr> и запазено локално в <nobr><b>%2</b>.</nobr></p><p>Искате ли да регистрирате това дисково изображение и да го вкарате във виртуалното CD/DVD устройство?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete"><p>Не може да се вкара дисковото изображение <b>VirtualBox Виртуални Добавки</b> във виртуалната машина <b>%1</b>, тъй като машината няма CD/DVD устройства. Моля, добавете устройство, като използвате страницата Съхранение от прозореца с настройки на виртуалната машина!</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Не може да се намери <b>VirtualBox Потребителско ръководство</b> <nobr><b>%1</b>.</nobr></p><p>Искате ли да изтеглите този файл от Интернет?</p></translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Сигурни ли сте, че искате да изтеглите <b>VirtualBox Потребителско ръководство</b> от <nobr><a href="%1">%1</a></nobr> (размер %2 байта)?</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"><p>VirtualBox Потребителско ръководство е изтеглено успешно от <nobr><a href="%1">%2</a></nobr>, но не може да бъде запазено локално в <nobr><b>%3</b>.</nobr></p><p>Моля, изберете друго местоположение за този файл.</p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>VirtualBox Потребителско ръководство е изтеглено успешно от <nobr><a href="%1">%1</a></nobr>, но не може да бъде запазено локално в <nobr><b>%2</b>.</nobr></p><p>Моля, изберете друго местоположение за този файл.</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
- <translation type="unfinished"><p>VirtualBox Потребителско ръководство е изтеглено успешно от <nobr><a href="%1">%2</a></nobr> и запазено локално в <nobr><b>%3</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>VirtualBox Потребителско ръководство е изтеглено успешно от <nobr><a href="%1">%1</a></nobr> и запазено локално в <nobr><b>%2</b>.</nobr></p></translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Затваряне</translation>
+ <translation>Затваряне</translation>
</message>
<message>
<source>Ok</source>
- <translation type="unfinished">Добре</translation>
+ <translation>Добре</translation>
</message>
<message>
<source>Do not show this message again</source>
- <translation type="unfinished">Да не се показва това съобщение отново</translation>
+ <translation>Да не се показва това съобщение отново</translation>
</message>
<message>
<source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Искате ли да премахнете NAT мрежата <nobr><b>%1</b>?</nobr></p><p>Ако тази мрежа се използва от един или повече мрежови адаптери на виртуални машини, тези адаптери няма да са използваеми, докато не поправите настройките им, като изберете друга мрежа или друг тип на закачване на адаптера.</p></translation>
</message>
<message>
<source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно закачване на уеб камерата <b>%1</b> към виртуалната машина <b>%2</b>.</translation>
</message>
<message>
<source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно разкачване на уеб камерата <b>%1</b> от виртуалната машина <b>%2</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"></translation>
+ <translation><p>Виртуалните Добавки на VirtualBox за тази виртуална машина изглежда не са достъпни, а споделените папки не могат да се използват без тях. За да използвате споделени папки във виртуалната машина, моля, инсталирайте Виртуалните Добавки, ако не са инсталирани, или ги преинсталирайте, ако не работят правилно, като изберете <b>Инсталиране на Виртуални Добавки</b> от менюто <b>Устройства</b>. Ако те са инсталирани, но машината все още не е [...]
</message>
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished"></translation>
+ <translation>Вкарване</translation>
</message>
<message>
<source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Виртуалният екран текущо е зададен на <b>%1 бита</b> цветови режим. За по-добра производителност, моля, променете това към <b>%2 бита</b>. Това обикновено може да се направи от секцията <b>Екран</b> на контролния панел на виртуалната машина или системните настройки.</p></translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Rule names should be unique.</source>
- <translation type="unfinished"></translation>
+ <translation>Текущите правила за пренасочване на портове са невалидни. Имената на правилата трябва да са уникални.</translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
+ <translation>Текущите правила за пренасочване на портове са невалидни. Няколко правила имат едни и същи портове и конфликтиращи IP адреси.</translation>
+ </message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation><p>Неуспешно създаване на VirtualBoxClient COM обект.</p><p>Програмата ще бъде изключена.</p></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation>Неуспешно задаване на глобалните VirtualBox допълнителни данни за ключ <i>%1</i> към стойност <i>{%2}</i>.</translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation>Неуспешно задаване на допълнителните данни за ключ <i>%1</i> на машина <i>%2</i> към стойност <i>{%3}</i>.</translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation><p>Един или повече виртуални твърди дискове, оптични или флопи дискове не са достъпни в момента. В резултат на това, няма да можете да работите с виртуалните машини, които ги използват, докато не станат достъпни по-късно.</p><p>Натиснете <b>Проверка</b>, за да отворите прозореца на Управлението на виртуални дискове и да видите кои дискове са недостъпни, или натиснете <b>Игнориране</b>, за да игнорирате това съобщение.</p&g [...]
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation>Неуспешно запазване на настройките.</translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation><p>Предстои да добавите ново оптично устройство към контролера <b>%1</b>.</p><p>Искате ли да изберете виртуален оптичен диск, който да се вкара в устройството, или ще го оставите празно засега?</p></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation><p>Сигурни ли сте, че искате да изтриете оптичното устройство?</p><p>Няма да можете да вкарвате оптични дискове или ISO изображения, или да инсталирате Виртуални Добавки без него!</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Неуспешно закачване на оптичното устройство (<nobr><b>%1</b></nobr>) към слота <i>%2</i> на машината <b>%3</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Неуспешно закачване на флопи устройството (<nobr><b>%1</b></nobr>) към слота <i>%2</i> на машината <b>%3</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Неуспешно разкачване на оптичното устройство (<nobr><b>%1</b></nobr>) от слота <i>%2</i> на машината <b>%3</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Неуспешно разкачване на флопи устройството (<nobr><b>%1</b></nobr>) от слота <i>%2</i> на машината <b>%3</b>.</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this er [...]
+ <translation type="obsolete"><p>Възникна критична грешка по време на изпълнението на виртуалната машина и тя ще бъде спряна.</p><p>За помощ, моля, погледнете секцията Community на <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> или Вашия контакт за поддръжка. Моля, представете съдържанието на файла със записки <tt>VBox.log</tt>, който можете да намерите в папката на виртуалната машина, както и описание на това какво правех [...]
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>Неуспешно свързване на кабела на мрежовия адаптер на виртуалната машина <b>%1</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>Неуспешно откачване на кабела на мрежовия адаптер на виртуалната машина <b>%1</b>.</translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation><p>Не може да се вкара дисковото изображение <b>VirtualBox Виртуални Добавки</b> във виртуалната машина <b>%1</b>, тъй като машината няма оптични устройства. Моля, добавете устройство, като използвате страницата Съхранение от прозореца с настройки на виртуалната машина!</p></translation>
+ </message>
+ <message>
+ <source>Unable to enter password!</source>
+ <translation type="obsolete">Не може да се въведе парола!</translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation><p>Дисковото изображение <b>VirtualBox Виртуални Добавки</b> е свалено успешно от <nobr><a href="%1">%1</a></nobr> и запазено локално в <nobr><b>%2</b>.</nobr></p><p>Искате ли да регистрирате това дисково изображение и да го вкарате във виртуалното оптично устройство?</p></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation failed.</source>
+ <translation type="obsolete">Неуспешна операция по влачене и пускане.</translation>
+ </message>
+ <message>
+ <source>Failed while dropping data.</source>
+ <translation type="obsolete">Неуспешно пускане на данни.</translation>
+ </message>
+ <message>
+ <source>Unable to cancel drag and drop operation.</source>
+ <translation type="obsolete">Неуспешно прекъсване на операцията по влачене и пускане.</translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation>Грешна парола или провалена автентикация.</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation><p>Възникна критична грешка по време изпълнението на виртуалната машина и изпълнението на машината е спряно.</p><p>За помощ, моля, погледнете секцията Общност на адрес <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> или договора Ви за поддръжка. Моля, представете съдържанието на файла със записки <tt>VBox.log</tt> и картинката <tt>VBox.png</tt>, които можете да намерите в папка <nobr><b& [...]
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation><p>Възникна критична грешка по време на изпълнението на виртуалната машина и тя ще бъде спряна.</p><p>За помощ, моля, погледнете секцията Community на <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> или Вашия контакт за поддръжка. Моля, представете съдържанието на файла със записки <tt>VBox.log</tt>, който можете да намерите в папката със записки на виртуалната машина, както и описание на това какво правехте [...]
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation><p>Излязла е нова версия на VirtualBox! Версия <b>%1</b> е достъпна на <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>. Можете да изтеглите тази версия от тази директна връзка:</p><p><a href=%2>%3</a></p></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -8566,19 +9062,19 @@ p, li { white-space: pre-wrap; }
<name>UIMiniToolBar</name>
<message>
<source>Always show the toolbar</source>
- <translation type="unfinished">Показване винаги на лентата с инструменти</translation>
+ <translation>Показване винаги на лентата с инструменти</translation>
</message>
<message>
<source>Minimize Window</source>
- <translation type="unfinished">Скриване на прозореца</translation>
+ <translation>Скриване на прозореца</translation>
</message>
<message>
<source>Exit Full Screen or Seamless Mode</source>
- <translation type="unfinished">Изход от цял екран или безрамков режим</translation>
+ <translation>Изход от цял екран или безрамков режим</translation>
</message>
<message>
<source>Close VM</source>
- <translation type="unfinished">Затваряне на ВМ</translation>
+ <translation>Затваряне на ВМ</translation>
</message>
</context>
<context>
@@ -8655,7 +9151,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The network operation failed with the following error: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Мрежовата операция се провали със следната грешка: %1.</translation>
</message>
</context>
<context>
@@ -8682,27 +9178,27 @@ p, li { white-space: pre-wrap; }
<name>UINetworkReplyPrivate</name>
<message>
<source>Host not found</source>
- <translation type="unfinished"></translation>
+ <translation>Хостът не е намерен</translation>
</message>
<message>
<source>Content access denied</source>
- <translation type="unfinished"></translation>
+ <translation>Отказан достъп до съдържание</translation>
</message>
<message>
<source>Protocol failure</source>
- <translation type="unfinished"></translation>
+ <translation>Грешка в протокола</translation>
</message>
<message>
<source>Wrong SSL certificate format</source>
- <translation type="unfinished"></translation>
+ <translation>Грешен формат на SSL сертификат</translation>
</message>
<message>
<source>SSL authentication failed</source>
- <translation type="unfinished"></translation>
+ <translation>Провалена SSL автентикация</translation>
</message>
<message>
<source>Unknown reason</source>
- <translation type="unfinished"></translation>
+ <translation>Непозната причина</translation>
</message>
</context>
<context>
@@ -8773,7 +9269,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>This wizard will help you to create a new virtual hard disk for your virtual machine.</p><p>Use the <b>Next</b> button to go to the next page of the wizard and the <b>Back</b> button to return to the previous page.</p></source>
- <translation type="obsolete"><p>Този помощник ще ви помогне да създадете нов виртуален твърд диск за вашата виртуална машина.</p><p>Използвайте бутона <b>Напред</b>, за да отидете към следващата страница на помощника, и бутона <b>Назад</b>, за да се върнете към предишната страница.</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви помогне да създадете нов виртуален твърд диск за вашата виртуална машина.</p><p>Използвайте бутона <b>Напред</b>, за да отидете към следващата страница на помощника, и бутона <b>Назад</b>, за да се върнете към предишната страница.</p></translation>
</message>
<message>
<source>Hard Disk Storage Type</source>
@@ -8842,7 +9338,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>This wizard will help you to copy a virtual disk.</p></source>
- <translation type="obsolete"><p>Този помощник ще ви помогне да копирате виртуален диск.</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви помогне да копирате виртуален диск.</p></translation>
</message>
<message>
<source>Please select the virtual disk which you would like to copy if it is not already selected. You can either choose one from the list or use the folder icon beside the list to select a virtual disk file.</source>
@@ -8866,7 +9362,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>This wizard will help you to create a new virtual disk for your virtual machine.</p></source>
- <translation type="obsolete"><p>Този помощник ще ви помогне да създадете нов виртуален диск за вашата виртуална машина.</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви помогне да създадете нов виртуален диск за вашата виртуална машина.</p></translation>
</message>
<message>
<source><p>Please choose the type of file that you would like to use for the new virtual disk. If you do not need to use it with other virtualization software you can leave this setting unchanged.</p></source>
@@ -9004,7 +9500,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>This wizard will help you to create a new virtual hard disk for your virtual machine.</p><p>%1</p></source>
- <translation type="obsolete"><p>Този помощник ще ви помогне да създадете нов виртуален твърд диск за вашата виртуална машина.</p><p>%1</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви помогне да създадете нов виртуален твърд диск за вашата виртуална машина.</p><p>%1</p></translation>
</message>
<message>
<source>Virtual disk to copy</source>
@@ -9163,7 +9659,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>This wizard will guide you through the steps that are necessary to create a new virtual machine for VirtualBox.</p><p>Use the <b>Next</b> button to go the next page of the wizard and the <b>Back</b> button to return to the previous page.</p></source>
- <translation type="obsolete"><p>Този помощник ще ви води през стъпките, които са нужни за създаването на нова виртуална машина за VirtualBox.</p><p>Използвайте бутона <b>Напред</b>, за да отидете към следващата страница на помощника, и бутона <b>Назад</b>, за да се върнете към предишната страница.</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви води през стъпките, които са нужни за създаването на нова виртуална машина за VirtualBox.</p><p>Използвайте бутона <b>Напред</b>, за да отидете към следващата страница на помощника, и бутона <b>Назад</b>, за да се върнете към предишната страница.</p></translation>
</message>
<message>
<source>< &Back</source>
@@ -9247,7 +9743,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>This wizard will guide you through the steps that are necessary to create a new virtual machine for VirtualBox.</p><p>%1</p></source>
- <translation type="obsolete"><p>Този помощник ще ви води през стъпките, необходими за създаването на нова виртуална машина във VirtualBox.</p><p>%1</p></translation>
+ <translation type="obsolete"><p>Този помощник ще Ви води през стъпките, необходими за създаването на нова виртуална машина във VirtualBox.</p><p>%1</p></translation>
</message>
</context>
<context>
@@ -9384,7 +9880,7 @@ p, li { white-space: pre-wrap; }
<name>UIPopupCenter</name>
<message>
<source>Click for full details</source>
- <translation type="unfinished"></translation>
+ <translation>Клик за пълни детайли</translation>
</message>
</context>
<context>
@@ -9519,13 +10015,17 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Добре дошли във VirtualBox!</h3><p>Лявата част на този прозорец е предназначена за показване на списък с всички виртуални машини на вашия компютър. Списъкът в момента е празен, защото все още не сте създали виртуални машини.<img src=:/welcome.png align=right/></p><p>Като начало, за да създадете нова виртуална машина, натиснете бутона <b>Нова</b> в основната лента с инструменти, разположена в горната част на прозорец [...]
+ <translation type="obsolete"><h3>Добре дошли във VirtualBox!</h3><p>Лявата част на този прозорец е предназначена за показване на списък с всички виртуални машини на вашия компютър. Списъкът в момента е празен, защото все още не сте създали виртуални машини.<img src=:/welcome.png align=right/></p><p>Като начало, за да създадете нова виртуална машина, натиснете бутона <b>Нова</b> в основната лента с инструменти, разположена в горната [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Управление</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation><h3>Добре дошли във VirtualBox!</h3><p>Лявата част на този прозорец е списък с всички виртуални машини на вашия компютър. Списъкът в момента е празен, защото все още не сте създали виртуални машини.<img src=:/welcome.png align=right/></p><p>За да създадете нова виртуална машина, натиснете бутона <b>Нова</b> в основната лента с инструменти, разположена в горната част на прозореца.</p><p>Можете да натиснете кл [...]
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9558,15 +10058,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Settings</source>
- <translation>Настройки</translation>
+ <translation type="obsolete">Настройки</translation>
</message>
<message>
<source><b>%1</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation><b>%1</b> страница:</translation>
</message>
<message>
<source><b>%1: %2</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation><b>%1: %2</b> страница:</translation>
</message>
</context>
<context>
@@ -9611,6 +10111,10 @@ p, li { white-space: pre-wrap; }
<source>Display</source>
<translation>Екран</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation>Предпочитания</translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -9686,19 +10190,42 @@ p, li { white-space: pre-wrap; }
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">текущо използвате повече контролери за съхранение, отколкото чипсетът %1 поддържа. Моля, променете типа на чипсета от страницата с настройки Система или намалете броя на следните контролери за съхранение от страницата с настройки Съхранение: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation>Потребителски интерфейс</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Настройки</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation>Презареждане на настройките...</translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation>Запазване на настройките...</translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
<message>
<source><nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Клик</b> за превключване показването на индикатора.</nobr><br><nobr><b>Влачене и пускане</b> за промяна позицията на индикатора.</nobr></translation>
</message>
</context>
<context>
<name>UIStatusBarEditorWidget</name>
<message>
<source>Close</source>
- <translation type="unfinished">Затваряне</translation>
+ <translation>Затваряне</translation>
+ </message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation>Позволяване на меню лентата</translation>
</message>
</context>
<context>
@@ -9854,7 +10381,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Restore the machine state stored in the current snapshot</source>
- <translation>Възстановяване сътоянието на машината до състоянието, запазено в настоящата снимка</translation>
+ <translation>Възстановяване състоянието на машината до състоянието, запазено в настоящата снимка</translation>
</message>
<message>
<source><p>When checked, the machine will be returned to the state stored in the current snapshot after it is turned off. This is useful if you are sure that you want to discard the results of your last sessions and start again at that snapshot.</p></source>
@@ -9866,11 +10393,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Continue running in the background</source>
- <translation type="unfinished"></translation>
+ <translation>Продължаване на изпълнение във &фон</translation>
</message>
<message>
<source><p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Затваряне прозорците на виртуалната машина, но продължаване на изпълнението ѝ.</p><p>Можете да се върнете към прозореца на включена виртуална машина от VirtualBox Управление.</p></translation>
</message>
</context>
<context>
@@ -10024,19 +10551,23 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Режим влачене и пускане</translation>
+ <translation type="obsolete">Режим влачене и пускане</translation>
</message>
<message>
<source>Configuration &Details</source>
- <translation type="unfinished"></translation>
+ <translation>&Детайли на конфигурацията</translation>
</message>
<message>
<source>&Runtime Information</source>
- <translation type="unfinished"></translation>
+ <translation>Ин&формация за сесията</translation>
</message>
<message>
<source>VM Uptime</source>
- <translation type="unfinished"></translation>
+ <translation>Включена от</translation>
+ </message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation>Режим влачене и пускане</translation>
</message>
</context>
<context>
@@ -10198,19 +10729,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Expert Mode</source>
- <translation type="unfinished"></translation>
+ <translation>&Експертен режим</translation>
</message>
<message>
<source>Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users.</source>
- <translation type="unfinished"></translation>
+ <translation>Превключване към <nobr><b>Експертен режим</b></nobr>, едностраничен диалог за опитни потребители.</translation>
</message>
<message>
<source>&Guided Mode</source>
- <translation type="unfinished"></translation>
+ <translation>&Ръководен режим</translation>
</message>
<message>
<source>Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations.</source>
- <translation type="unfinished"></translation>
+ <translation>Превключване към <nobr><b>Ръководен режим</b></nobr>, диалог с подробни обяснения стъпка по стъпка.</translation>
</message>
</context>
<context>
@@ -10241,7 +10772,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Please choose the type of file that you would like to use for the new virtual hard drive. If you do not need to use it with other virtualization software you can leave this setting unchanged.</source>
- <translation>Моля, изберете типа на файла, който искате да използвате за новия виртуален диск. Ако нямате нужда да използвате този файл с друг виртуализационен софтуер, можете да оставите тази настройка непроменена.</translation>
+ <translation>Моля, изберете типа на файла, който искате да използвате за новия виртуален диск! Ако нямате нужда да използвате този файл с друг виртуализационен софтуер, можете да оставите тази настройка непроменена.</translation>
</message>
<message>
<source>Storage on physical hard drive</source>
@@ -10440,7 +10971,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Please select the virtual machines that should be added to the appliance. You can select more than one. Please note that these machines have to be turned off before they can be exported.</p></source>
- <translation><p>Моля, изберете виртуалните машини, които да се добавят към приспособлението. Можете да изберете повече от една. Моля, имате предвид, че тези машини трябва да са изключени преди да могат да бъдат изнесени.</p></translation>
+ <translation><p>Моля, изберете виртуалните машини, които да се добавят към приспособлението. Можете да изберете повече от една. Моля имате предвид, че тези машини трябва да са изключени преди да могат да бъдат изнесени.</p></translation>
</message>
<message>
<source>Appliance settings</source>
@@ -10540,39 +11071,39 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>Настройки на съхранение</translation>
</message>
<message>
<source>Please choose a file to export the virtual appliance to</source>
- <translation type="unfinished"></translation>
+ <translation>Моля, изберете файл за изнасяне на виртуално приспособление</translation>
</message>
<message>
<source>F&ormat:</source>
- <translation type="unfinished"></translation>
+ <translation>Ф&ормат:</translation>
</message>
<message>
<source>OVF 0.9</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 0.9</translation>
</message>
<message>
<source>OVF 1.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 1.0</translation>
</message>
<message>
<source>OVF 2.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 2.0</translation>
</message>
<message>
<source>Write in standard OVF 1.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>Запис в стандартен OVF 1.0 формат.</translation>
</message>
<message>
<source>Write in new experimental OVF 2.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>Запис в новия експериментален OVF 2.0 формат.</translation>
</message>
<message>
<source>&Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>Настройки на с&ъхранение</translation>
</message>
</context>
<context>
@@ -10591,14 +11122,14 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>Изберете файл за изнасяне на виртуално приспособление...</translation>
</message>
</context>
<context>
<name>UIWizardExportAppPageExpert</name>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>Изберете файл за изнасяне на виртуално приспособление...</translation>
</message>
</context>
<context>
@@ -10668,15 +11199,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Import Virtual Appliance</source>
- <translation type="unfinished"></translation>
+ <translation>Внасяне на виртуално приспособление</translation>
</message>
<message>
<source>Choose a virtual appliance file to import...</source>
- <translation type="unfinished"></translation>
+ <translation>Изберете файл за внасяне на виртуално приспособление...</translation>
</message>
<message>
<source>Please choose a virtual appliance file to import</source>
- <translation type="unfinished"></translation>
+ <translation>Моля, изберете файл за внасяне на виртуално приспособление</translation>
</message>
</context>
<context>
@@ -10699,7 +11230,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Storage on physical hard drive</source>
- <translation>Съхранение на визически твърд диск</translation>
+ <translation>Съхранение на физически твърд диск</translation>
</message>
<message>
<source>Please choose whether the new virtual hard drive file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size).</source>
@@ -11466,7 +11997,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose...</source>
- <translation type="unfinished"></translation>
+ <translation>Избор...</translation>
</message>
</context>
<context>
@@ -11525,7 +12056,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished"></translation>
+ <translation>Настоящо избраният път по подразбиране ще бъде показан, след като приемете промените и отворите този диалог отново.</translation>
</message>
</context>
<context>
@@ -11866,7 +12397,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12308,7 +12839,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><hr>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
- <translation type="obsolete"><hr>Някой от дисковете в тази верига от твърди дискове е недостъпен. Моля, използвайте Управлението на виртуални дискове в режим <b>Показване на различаващите твърди дискове</b>, за да проверите тези дискове.</translation>
+ <translation type="obsolete"><hr>Някои от файловете в тази верига от твърди дискове са недостъпни. Моля, използвайте Управлението на виртуални дискове в режим <b>Показване на различаващите твърди дискове</b>, за да проверите тези файлове.</translation>
</message>
<message>
<source>%1<hr>This base hard disk is indirectly attached using the following differencing hard disk:<br>%2%3</source>
@@ -12640,17 +13171,17 @@ p, li { white-space: pre-wrap; }
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Свързването на този твърд диск ще бъде извършено индиректно, като се използва новосъздаден различаващ твърд диск.</translation>
+ <translation type="obsolete">Свързването на този твърд диск ще бъде извършено индиректно, като се използва новосъздаден различаващ твърд диск.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation><hr>Някой от дисковете в тази верига от твърди дискове е недостъпен. Моля, използвайте Управлението на виртуални дискове в режим <b>Показване на различаващите твърди дискове</b>, за да проверите тези дискове.</translation>
+ <translation type="obsolete"><hr>Някои от файловете в тази верига от твърди дискове са недостъпни. Моля, използвайте Управлението на виртуални дискове в режим <b>Показване на различаващите твърди дискове</b>, за да проверите тези файлове.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Този основен твърд диск е свързан индиректно като се използва следният различаващ твърд диск:</translation>
+ <translation type="obsolete">Този основен твърд диск е свързан индиректно като се използва следният различаващ твърд диск:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -12696,7 +13227,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -12911,7 +13442,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Multi-attach</source>
<comment>DiskType</comment>
- <translation type="obsolete">Мулти закачане</translation>
+ <translation type="obsolete">Мулти закачване</translation>
</message>
<message>
<source>Dynamically allocated storage</source>
@@ -13016,7 +13547,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Multi-attach</source>
<comment>MediumType</comment>
- <translation>Мулти закачане</translation>
+ <translation>Мулти закачване</translation>
</message>
<message>
<source>Dynamically allocated storage</source>
@@ -13031,7 +13562,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Fixed size storage</source>
<comment>MediumVariant</comment>
- <translation>Фксиран размер памет</translation>
+ <translation>Фиксиран размер памет</translation>
</message>
<message>
<source>Dynamically allocated storage split into files of less than 2GB</source>
@@ -13258,109 +13789,208 @@ p, li { white-space: pre-wrap; }
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Позволено</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Забранено</translation>
</message>
<message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Неограничено изпълнение</translation>
</message>
<message>
<source>PS/2 Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>PS/2 мишка</translation>
</message>
<message>
<source>USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>USB мишка</translation>
</message>
<message>
<source>PS/2 and USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>PS/2 и USB мишка</translation>
</message>
<message>
<source>Unrestricted Execution</source>
- <translation type="unfinished"></translation>
+ <translation>Неограничено изпълнение</translation>
</message>
<message>
<source>USB Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>USB таблет</translation>
</message>
<message>
<source>USB Multi-Touch Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>USB мултитъч таблет</translation>
</message>
<message>
<source>NAT Network</source>
<comment>NetworkAttachmentType</comment>
- <translation type="unfinished"></translation>
+ <translation>NAT мрежа</translation>
</message>
<message>
<source>NAT network, '%1'</source>
<comment>details report (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>NAT мрежа, '%1'</translation>
</message>
<message>
<source>You can create or add disk image files in the virtual machine settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Можете да създавате или добавяте дискови изображения в настройките на виртуалната машина.</translation>
</message>
<message>
<source>USB</source>
<comment>StorageControllerType</comment>
- <translation type="unfinished">USB</translation>
+ <translation>USB</translation>
</message>
<message>
<source>USB Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished"></translation>
+ <translation>USB порт %1</translation>
</message>
<message>
<source>off</source>
<comment>guest monitor status</comment>
- <translation type="unfinished"></translation>
+ <translation>изключен</translation>
</message>
<message>
<source>Paravirtualization Interface</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Паравиртуализационен интерфейс</translation>
</message>
<message>
<source>None</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Няма</translation>
</message>
<message>
<source>Default</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished">По подразбиране</translation>
+ <translation>По подразбиране</translation>
</message>
<message>
<source>Legacy</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Остарял</translation>
</message>
<message>
<source>Minimal</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Минимален</translation>
</message>
<message>
<source>Hyper-V</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V</translation>
</message>
<message>
<source>New dynamically allocated storage</source>
<comment>MediumVariant</comment>
+ <translation>Ново динамично зададено съхранение</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>Активно</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>Неактивно</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>Активно</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>Неактивно</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>Активно</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>Неактивно</translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Създаване на снимка</translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Създаване на жива снимка</translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation>KVM</translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation>Оптично</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>OHCI</translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>EHCI</translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>xHCI</translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation>Потребителски интерфейс</translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation>(Оптично устройство)</translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation>Свързването на този твърд диск ще бъде извършено индиректно, като се използва новосъздаден различаващ твърд диск.</translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation><hr>Някои от файловете в тази верига от твърди дискове са недостъпни. Моля, използвайте Управлението на виртуални дискове, за да проверите тези файлове.</translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation>Този основен твърд диск е свързан индиректно, като се използва следният различаващ твърд диск:</translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
<translation type="unfinished"></translation>
</message>
</context>
@@ -13499,7 +14129,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Release the selected disk image file by detaching it from the machines</source>
- <translation>Освобождаване на избрания диск чрез разкачането му от машините</translation>
+ <translation>Освобождаване на избрания диск чрез разкачването му от машините</translation>
</message>
<message>
<source>Refresh the list of disk image files</source>
@@ -13669,6 +14299,10 @@ p, li { white-space: pre-wrap; }
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Създаване на нов виртуален твърд диск</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation>UUID:</translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
@@ -13755,7 +14389,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Please fill out this registration form to let us know that you use VirtualBox and, optionally, to keep you informed about VirtualBox news and updates.</p><p>Enter your full name using Latin characters and your e-mail address to the fields below. Sun Microsystems will use this information only to gather product usage statistics and to send you VirtualBox newsletters. In particular, Sun Microsystems will never pass your data to third parties. Detailed i [...]
- <translation type="obsolete"><p>Моля, попълнете тази регистрационна форма, за да ни информирате, че използвате VirtualBox и, евентуално, за да бъдете информирани за новини и обновления на VirtualBox.</p><p>Въведете цялото си име, като използвате латински букви, и вашият e-mail адрес в полетата по-долу. Моля, имайте предвид, че Sun Microsystems ще използва тази информация само за изготвяне на статистика за използваемостта на продукта и за изпращане на новинарски [...]
+ <translation type="obsolete"><p>Моля, попълнете тази регистрационна форма, за да ни информирате, че използвате VirtualBox и, евентуално, за да бъдете информирани за новини и обновления на VirtualBox.</p><p>Въведете цялото си име, като използвате латински букви, и вашият e-mail адрес в полетата по-долу. Моля имайте предвид, че Sun Microsystems ще използва тази информация само за изготвяне на статистика за използваемостта на продукта и за изпращане на новинарски б [...]
</message>
<message>
<source>Check this box if you do not want to receive mail from Sun Microsystems at the e-mail address specified above.</source>
@@ -13775,7 +14409,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Please fill out this registration form to let us know that you use VirtualBox and, optionally, to keep you informed about VirtualBox news and updates.</p><p>Please use Latin characters only to fill in the fields below. Sun Microsystems will use this information only to gather product usage statistics and to send you VirtualBox newsletters. In particular, Sun Microsystems will never pass your data to third parties. Detailed information about how we us [...]
- <translation type="obsolete"><p>Моля, попълнете тази регистрационна форма, за да ни информирате, че използвате VirtualBox и, евентуално, за да бъдете информирани за новини и обновления на VirtualBox.</p><p>Моля, използвайте само латински букви в полетата по-долу. Моля, имайте предвид, че Sun Microsystems ще използва тази информация само за изготвяне на статистика за използваемостта на продукта и за изпращане на новинарски бюлетини за VirtualBox. Освен за тези це [...]
+ <translation type="obsolete"><p>Моля, попълнете тази регистрационна форма, за да ни информирате, че използвате VirtualBox и, евентуално, за да бъдете информирани за новини и обновления на VirtualBox.</p><p>Моля, използвайте само латински букви в полетата по-долу. Моля имайте предвид, че Sun Microsystems ще използва тази информация само за изготвяне на статистика за използваемостта на продукта и за изпращане на новинарски бюлетини за VirtualBox. Освен за тези цел [...]
</message>
<message>
<source>I &already have a Sun Online account:</source>
@@ -14282,7 +14916,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Restore the virtual machine state from the state stored in the current snapshot</source>
- <translation type="obsolete">Възстановяване сътоянието на виртуалната машина до състоянието, запазено в настоящата снимка</translation>
+ <translation type="obsolete">Възстановяване състоянието на виртуалната машина до състоянието, запазено в настоящата снимка</translation>
</message>
<message>
<source>Discard the current snapshot and revert the machine to the state it had before the snapshot was taken</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
index db4f301..8f37e11 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts
@@ -296,7 +296,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Mode f&luid</translation>
+ <translation type="unfinished">Mode f&luid</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -320,11 +320,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Desactiva la integració del &punter</translation>
+ <translation type="obsolete">Desactiva la integració del &punter</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Desactiva temporalment la integració del punter de l'amfitrió</translation>
+ <translation type="obsolete">Desactiva temporalment la integració del punter de l'amfitrió</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -336,11 +336,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Insereix Ctrl+Alt+Supr</translation>
+ <translation type="obsolete">&Insereix Ctrl+Alt+Supr</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Envia la seqüència Ctrl+Alt+Supr a la màquina virtual</translation>
+ <translation type="obsolete">Envia la seqüència Ctrl+Alt+Supr a la màquina virtual</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -348,7 +348,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Envia la seqüència Ctrl+Alt+Retrocés a la màquina virtua</translation>
+ <translation type="obsolete">Envia la seqüència Ctrl+Alt+Retrocés a la màquina virtua</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -420,15 +420,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Dispositius &CD/DVD</translation>
+ <translation type="obsolete">Dispositius &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Dis&queteres</translation>
+ <translation type="obsolete">Dis&queteres</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Dispositius &USB</translation>
+ <translation type="obsolete">Dispositius &USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -479,7 +479,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&S'està connectant...</translation>
+ <translation type="obsolete">&S'està connectant...</translation>
</message>
<message>
<source>&Help</source>
@@ -557,15 +557,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Canvia al mode de pantalla com&pleta</translation>
+ <translation type="obsolete">Canvia al mode de pantalla com&pleta</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Canvia entre el mode normal i a pantalla completa</translation>
+ <translation type="obsolete">Canvia entre el mode normal i a pantalla completa</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Canvia al mode f&luid</translation>
+ <translation type="obsolete">Canvia al mode f&luid</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -573,7 +573,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Canvia al mode e&scalat</translation>
+ <translation type="obsolete">Canvia al mode e&scalat</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -653,7 +653,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Ins&ereix Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">Ins&ereix Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>&File</source>
@@ -948,7 +948,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Arrosega i deixa anar</translation>
+ <translation type="obsolete">Arrosega i deixa anar</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -1115,6 +1115,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Fitxer</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1128,6 +1217,27 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -2025,6 +2135,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2718,7 +2855,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Controller</source>
@@ -2944,6 +3081,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Controlador USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3318,18 +3510,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Inhabilita el protector de pantalla de l'a&mfitrió</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4542,12 +4722,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica l'activitat dels dispositius de CD/DVD:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica l'activitat dels dispositius de CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica l'activitat dels dispositius de disquetera:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica l'activitat dels dispositius de disquetera:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4655,6 +4835,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4968,10 +5158,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -5023,43 +5209,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Barra d'eines mini:</translation>
+ <translation type="obsolete">Barra d'eines mini:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Si està marcat, mostra la barra d'eines mini als modes fluid i de pantalla completa.</translation>
+ <translation type="obsolete">Si està marcat, mostra la barra d'eines mini als modes fluid i de pantalla completa.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Mostra en pantalla completa/&fluid</translation>
+ <translation type="obsolete">Mostra en pantalla completa/&fluid</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Si està marcat, mostra una barra d'eines petita a la part de dalt de la pantalla en lloc de a la posició per defecte a la part de sota.</translation>
+ <translation type="obsolete">Si està marcat, mostra una barra d'eines petita a la part de dalt de la pantalla en lloc de a la posició per defecte a la part de sota.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Mostra a la par&t de dalt de la pantalla</translation>
+ <translation type="obsolete">Mostra a la par&t de dalt de la pantalla</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5314,15 +5492,135 @@ p, li { white-space: pre-wrap; }
<translation>Arrosega i &deixa anar:</translation>
</message>
<message>
- <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>Selecciona quines dades es copiaran entre el client i l'amfitrió mitjançant arrossegar i deixar anar. Aquesta característica requereix tenir instal·lades les guest additions al sistema client.</translation>
+ <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation>Selecciona quines dades es copiaran entre el client i l'amfitrió mitjançant arrossegar i deixar anar. Aquesta característica requereix tenir instal·lades les guest additions al sistema client.</translation>
+ </message>
+ <message>
+ <source>No name specified for the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Barra d'eines mini:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Si està marcat, mostra la barra d'eines mini als modes fluid i de pantalla completa.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Mostra en pantalla completa/&fluid</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Si està marcat, mostra una barra d'eines petita a la part de dalt de la pantalla en lloc de a la posició per defecte a la part de sota.</translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Mostra a la par&t de dalt de la pantalla</translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -6020,11 +6318,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Si està marcat, el conducte especificat al camp <b>Camí del port</b> es crearà per la màquina virtual quan s'iniciï. En altre cas, la màquina virtual provarà de fer servir el conducte existent.</translation>
+ <translation type="obsolete">Si està marcat, el conducte especificat al camp <b>Camí del port</b> es crearà per la màquina virtual quan s'iniciï. En altre cas, la màquina virtual provarà de fer servir el conducte existent.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Crea un conducte</translation>
+ <translation type="obsolete">&Crea un conducte</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -6032,11 +6330,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Mostra el camí al conducte del port en sèrie a l'amfitrió quan el port treballa en el mode <b>Conducte amfitrió</b>, o al dispositiu sèrie de l'amfitrió quan el port treballa en el mode <b>Dispositiu Amfitrió</b>.</translation>
+ <translation type="obsolete">Mostra el camí al conducte del port en sèrie a l'amfitrió quan el port treballa en el mode <b>Conducte amfitrió</b>, o al dispositiu sèrie de l'amfitrió quan el port treballa en el mode <b>Dispositiu Amfitrió</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Camí al &port/fitxer:</translation>
+ <translation type="obsolete">Camí al &port/fitxer:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -6046,6 +6344,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Mostra l'adreça base d'E/S d'aquest port en sèrie. Valors vàlids són nombres enter amb un rang entre <tt>0</tt> i <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6174,11 +6488,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Afegeix dispositiu CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Afegeix dispositiu CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Afegeix disquetera</nobr></translation>
+ <translation type="obsolete"><nobr>Afegeix disquetera</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -6222,11 +6536,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Afegeix dispositiu CD/DVD</translation>
+ <translation type="obsolete">Afegeix dispositiu CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Afegeix disquetera</translation>
+ <translation type="obsolete">Afegeix disquetera</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6414,15 +6728,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&Dispositiu CD/DVD:</translation>
+ <translation type="obsolete">&Dispositiu CD/DVD:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Seleccioneu un disc CD/DVD virtual o una unitat física que s'utilitzarà al dispositiu virtual. La màquina virtual veurà el disc inserit a la unitat amb les dades al fitxer o al disc a la unitat física i els seus continguts.</translation>
+ <translation type="obsolete">Seleccioneu un disc CD/DVD virtual o una unitat física que s'utilitzarà al dispositiu virtual. La màquina virtual veurà el disc inserit a la unitat amb les dades al fitxer o al disc a la unitat física i els seus continguts.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Configura la unitat de CD/DVD virtual</translation>
+ <translation type="obsolete">Configura la unitat de CD/DVD virtual</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6446,7 +6760,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Selecciona un fitxer de CD/DVD virtual...</translation>
+ <translation type="obsolete">Selecciona un fitxer de CD/DVD virtual...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6542,6 +6856,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Seleccioneu un fitxer de disc òptic virtual...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6947,10 +7293,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">L'USB 2.0 es troba activat per a aquesta màquina virtual. Tot i així, això requereix la instal·lació de <b>%1</b>. Instal·leu el paquet d'extensions des del lloc web de baixades del VirtualBox. Una vegada fet això, haureu de tornar a activar l'USB 2.0. Mentrestant es desactivarà a no ser que cancel·leu els canvis dels paràmetres actuals.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6970,6 +7312,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7143,6 +7489,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Tanca</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Canvia</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7421,7 +7775,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>No s'ha pogut crear l'objecte VirtualBox COM.</p><p>Ara es tancarà l'aplicació.</p></translation>
+ <translation type="obsolete"><p>No s'ha pogut crear l'objecte VirtualBox COM.</p><p>Ara es tancarà l'aplicació.</p></translation>
</message>
<message>
<source><p>Failed to download the VirtualBox Guest Additions disk image file from <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p></source>
@@ -7794,7 +8148,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><b>S'ha publicat una nova versió del VirtualBox! La versió <b>%1</b> és disponible a <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Podeu baixar-la directament des d'aquest enllaç: </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><b>S'ha publicat una nova versió del VirtualBox! La versió <b>%1</b> és disponible a <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Podeu baixar-la directament des d'aquest enllaç: </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7964,7 +8318,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>No es pot accedir a un o més dels discos, CD/DVD o disquet virtuals. Com a resultat, no podreu operar amb les màquines virtuals que els facin servir fins que estiguin accessibles.</p><p>Premeu <b>Comprova</b> per obrir el gestor de discos virtuals i veure a quins suports no s'hi pot accedir, o premeu <b>Ignora</b> per ignorar aquest missatge.</p></translation>
+ <translation type="obsolete"><p>No es pot accedir a un o més dels discos, CD/DVD o disquet virtuals. Com a resultat, no podreu operar amb les màquines virtuals que els facin servir fins que estiguin accessibles.</p><p>Premeu <b>Comprova</b> per obrir el gestor de discos virtuals i veure a quins suports no s'hi pot accedir, o premeu <b>Ignora</b> per ignorar aquest missatge.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files will be automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>Exit</b> if you want to terminate the VirtualBox application without any further actions.</p></source>
@@ -8003,7 +8357,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>S'ha produït un error crític mentre s'executava la màquina virtual, que s'ha aturat.</p><p>Per obtenir ajuda, visiteu la secció Community a <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> o al vostre contracte de suport. Afegiu el contingut del fitxer de registre <tt>VBox.log</tt> i el fitxer d'imatge <tt>VBox.png</tt>,que podreu trobar al directori <nobr><b>%1&l [...]
+ <translation type="obsolete"><p>S'ha produït un error crític mentre s'executava la màquina virtual, que s'ha aturat.</p><p>Per obtenir ajuda, visiteu la secció Community a <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> o al vostre contracte de suport. Afegiu el contingut del fitxer de registre <tt>VBox.log</tt> i el fitxer d'imatge <tt>VBox.png</tt>,que podreu trobar al directori <nobr& [...]
</message>
<message>
<source>Failed to open appliance.</source>
@@ -8209,7 +8563,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Segur que voleu eliminar el dispositiu de CD/DVD?</p><p>No podreu muntar cap CD o imatges iso ni tampoc instal·lar les Guest Additions sense ell.</p></translation>
+ <translation type="obsolete"><p>Segur que voleu eliminar el dispositiu de CD/DVD?</p><p>No podreu muntar cap CD o imatges iso ni tampoc instal·lar les Guest Additions sense ell.</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8312,7 +8666,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Ara afegireu un CD/DVD al controlador <b>%1</b>.</p><p>Voleu seleccionar un disc CD/DVD virtual per posar-lo a la unitat o voleu deixar-lo buit per ara?</p></translation>
+ <translation type="obsolete"><p>Ara afegireu un CD/DVD al controlador <b>%1</b>.</p><p>Voleu seleccionar un disc CD/DVD virtual per posar-lo a la unitat o voleu deixar-lo buit per ara?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8334,11 +8688,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>No s'ha pogut desconnectar el dispositiu CD/DVD (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
+ <translation type="obsolete">No s'ha pogut desconnectar el dispositiu CD/DVD (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>No s'ha pogut desconnectar el disquet (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
+ <translation type="obsolete">No s'ha pogut desconnectar el disquet (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -8390,11 +8744,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>No s'ha pogut connectar el dispositiu CD/DVD (<nobr><b>%1</b></nobr>) a la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
+ <translation type="obsolete">No s'ha pogut connectar el dispositiu CD/DVD (<nobr><b>%1</b></nobr>) a la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>No s'ha pogut connectar el disquet (<nobr><b>%1</b></nobr>) a la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
+ <translation type="obsolete">No s'ha pogut connectar el disquet (<nobr><b>%1</b></nobr>) a la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8645,7 +8999,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>No s'han pogut eliminar les dades.</translation>
+ <translation type="obsolete">No s'han pogut eliminar les dades.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -8881,14 +9235,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8949,6 +9295,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -10169,13 +10603,17 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Benvingut a VirtualBox!</h3><p>A la part esquerra d'aquesta finestra es mostra un llistat de totes les màquines virtuals a l'ordinador. Aquest llistat és buit actualment perquè encara no heu creat cap màquina virtual.<img src=:/welcome.png align=right/></p><p>Per crear una nova màquina virtual, premeu sobre el botó <b>Nova</b> a la barra principal que es troba a la part de dalt d'aquesta finestra.< [...]
+ <translation type="obsolete"><h3>Benvingut a VirtualBox!</h3><p>A la part esquerra d'aquesta finestra es mostra un llistat de totes les màquines virtuals a l'ordinador. Aquest llistat és buit actualment perquè encara no heu creat cap màquina virtual.<img src=:/welcome.png align=right/></p><p>Per crear una nova màquina virtual, premeu sobre el botó <b>Nova</b> a la barra principal que es troba a la part de dalt d'aques [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Gestor</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -10208,7 +10646,7 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
</message>
<message>
<source>Settings</source>
- <translation>Paràmetres</translation>
+ <translation type="obsolete">Paràmetres</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -10261,6 +10699,10 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
<source>Display</source>
<translation>Pantalla</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10336,6 +10778,25 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">actualment esteu fent servir més controlador d'emmagatzematge que els xips %1 suporten. Canvieu el tipus de xip a la pàgina de paràmetres del sistema o reduïu el nombre dels següents controladors d'emmagatzematge a la pàgina de paràmetres d'emmagatzematge: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Paràmetres</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -10350,6 +10811,10 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
<source>Close</source>
<translation type="unfinished">Tanca</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10750,7 +11215,7 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Mode d'arrossega i deixa d'anar</translation>
+ <translation type="obsolete">Mode d'arrossega i deixa d'anar</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -10764,6 +11229,10 @@ pas i connectar discos durs més endavant, fent servir el diàleg de configuraci
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -13130,7 +13599,7 @@ Versió %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -13984,17 +14453,17 @@ Versió %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Si connecteu aquest disc dur es millorarà de forma indirecta fent servir un nou disc dur diferenciat.</translation>
+ <translation type="obsolete">Si connecteu aquest disc dur es millorarà de forma indirecta fent servir un nou disc dur diferenciat.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Alguns dels suports d'aquest disc dur no són accessibles. Feu servir el Gestor virtual de suports en el mode <b>Mostra els discos durs diferenciats</b> per inspeccionar aquests suports.</translation>
+ <translation type="obsolete">Alguns dels suports d'aquest disc dur no són accessibles. Feu servir el Gestor virtual de suports en el mode <b>Mostra els discos durs diferenciats</b> per inspeccionar aquests suports.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Aquest disc dur base es connecta indirectament fent servir el disc dur diferenciat següent:</translation>
+ <translation type="obsolete">Aquest disc dur base es connecta indirectament fent servir el disc dur diferenciat següent:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -14046,7 +14515,7 @@ Versió %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -14606,16 +15075,6 @@ Versió %1</translation>
<translation>Trieu una ubicació per al fitxer de disc virtual nou</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -14713,6 +15172,105 @@ Versió %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Actiu</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Actiu</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Actiu</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -15559,6 +16117,10 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Crea un disc virtual nou</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
index 4e5b391..54fa78d 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts
@@ -296,7 +296,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Mode f&luid</translation>
+ <translation type="unfinished">Mode f&luid</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -320,11 +320,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Desactiva la integració del &punter</translation>
+ <translation type="obsolete">Desactiva la integració del &punter</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Desactiva temporalment la integració del punter de l'amfitrió</translation>
+ <translation type="obsolete">Desactiva temporalment la integració del punter de l'amfitrió</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -336,11 +336,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Insereix Ctrl+Alt+Supr</translation>
+ <translation type="obsolete">&Insereix Ctrl+Alt+Supr</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Envia la seqüència Ctrl+Alt+Supr a la màquina virtual</translation>
+ <translation type="obsolete">Envia la seqüència Ctrl+Alt+Supr a la màquina virtual</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -348,7 +348,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Envia la seqüència Ctrl+Alt+Retrocés a la màquina virtua</translation>
+ <translation type="obsolete">Envia la seqüència Ctrl+Alt+Retrocés a la màquina virtua</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -420,15 +420,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Dispositius &CD/DVD</translation>
+ <translation type="obsolete">Dispositius &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Dis&queteres</translation>
+ <translation type="obsolete">Dis&queteres</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Dispositius &USB</translation>
+ <translation type="obsolete">Dispositius &USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -479,7 +479,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&S'està connectant...</translation>
+ <translation type="obsolete">&S'està connectant...</translation>
</message>
<message>
<source>&Help</source>
@@ -557,15 +557,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Canvia al mode de pantalla com&pleta</translation>
+ <translation type="obsolete">Canvia al mode de pantalla com&pleta</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Canvia entre el mode normal i a pantalla completa</translation>
+ <translation type="obsolete">Canvia entre el mode normal i a pantalla completa</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Canvia al mode f&luid</translation>
+ <translation type="obsolete">Canvia al mode f&luid</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -573,7 +573,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Canvia al mode e&scalat</translation>
+ <translation type="obsolete">Canvia al mode e&scalat</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -653,7 +653,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Ins&ereix Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">Ins&ereix Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>&File</source>
@@ -948,7 +948,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Arrosega i deixa anar</translation>
+ <translation type="obsolete">Arrosega i deixa anar</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -1115,6 +1115,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Fitxer</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1128,6 +1217,27 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -2025,6 +2135,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2718,7 +2855,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Controller</source>
@@ -2944,6 +3081,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Controlador USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3318,18 +3510,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Inhabilita el protector de pantalla de l'a&mfitrió</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4542,12 +4722,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica l'activitat dels dispositius de CD/DVD:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica l'activitat dels dispositius de CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica l'activitat dels dispositius de disquetera:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica l'activitat dels dispositius de disquetera:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4655,6 +4835,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4968,10 +5158,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -5023,43 +5209,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Barra d'eines mini:</translation>
+ <translation type="obsolete">Barra d'eines mini:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Si està marcat, mostra la barra d'eines mini als modes fluid i de pantalla completa.</translation>
+ <translation type="obsolete">Si està marcat, mostra la barra d'eines mini als modes fluid i de pantalla completa.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Mostra en pantalla completa/&fluid</translation>
+ <translation type="obsolete">Mostra en pantalla completa/&fluid</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Si està marcat, mostra una barra d'eines petita a la part de dalt de la pantalla en lloc d'a la posició per defecte a la part de sota.</translation>
+ <translation type="obsolete">Si està marcat, mostra una barra d'eines petita a la part de dalt de la pantalla en lloc d'a la posició per defecte a la part de sota.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Mostra a la par&t de dalt de la pantalla</translation>
+ <translation type="obsolete">Mostra a la par&t de dalt de la pantalla</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5314,15 +5492,135 @@ p, li { white-space: pre-wrap; }
<translation>Arrosega i &deixa anar:</translation>
</message>
<message>
- <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>Selecciona quines dades es copiaran entre el client i l'amfitrió mitjançant arrossegar i deixar anar. Esta característica requereix tindre instal·lades les guest additions al sistema client.</translation>
+ <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation>Selecciona quines dades es copiaran entre el client i l'amfitrió mitjançant arrossegar i deixar anar. Esta característica requereix tindre instal·lades les guest additions al sistema client.</translation>
+ </message>
+ <message>
+ <source>No name specified for the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Barra d'eines mini:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Si està marcat, mostra la barra d'eines mini als modes fluid i de pantalla completa.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Mostra en pantalla completa/&fluid</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Si està marcat, mostra una barra d'eines petita a la part de dalt de la pantalla en lloc d'a la posició per defecte a la part de sota.</translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Mostra a la par&t de dalt de la pantalla</translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -6020,11 +6318,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Si està marcat, el conducte especificat al camp <b>Camí del port</b> es crearà per la màquina virtual quan s'inicie. En altre cas, la màquina virtual provarà de fer servir el conducte existent.</translation>
+ <translation type="obsolete">Si està marcat, el conducte especificat al camp <b>Camí del port</b> es crearà per la màquina virtual quan s'inicie. En altre cas, la màquina virtual provarà de fer servir el conducte existent.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Crea un conducte</translation>
+ <translation type="obsolete">&Crea un conducte</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -6032,11 +6330,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Mostra el camí al conducte del port en sèrie a l'amfitrió quan el port treballa en el mode <b>Conducte amfitrió</b>, o al dispositiu sèrie de l'amfitrió quan el port treballa en el mode <b>Dispositiu Amfitrió</b>.</translation>
+ <translation type="obsolete">Mostra el camí al conducte del port en sèrie a l'amfitrió quan el port treballa en el mode <b>Conducte amfitrió</b>, o al dispositiu sèrie de l'amfitrió quan el port treballa en el mode <b>Dispositiu Amfitrió</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Camí al &port/fitxer:</translation>
+ <translation type="obsolete">Camí al &port/fitxer:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -6046,6 +6344,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Mostra l'adreça base d'E/S d'este port en sèrie. Valors vàlids són nombres enter amb un rang entre <tt>0</tt> i <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6174,11 +6488,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Afig dispositiu CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Afig dispositiu CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Afig disquetera</nobr></translation>
+ <translation type="obsolete"><nobr>Afig disquetera</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -6222,11 +6536,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Afig dispositiu CD/DVD</translation>
+ <translation type="obsolete">Afig dispositiu CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Afig disquetera</translation>
+ <translation type="obsolete">Afig disquetera</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6414,15 +6728,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&Dispositiu CD/DVD:</translation>
+ <translation type="obsolete">&Dispositiu CD/DVD:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Seleccioneu un disc CD/DVD virtual o una unitat física que s'utilitzarà al dispositiu virtual. La màquina virtual veurà el disc inserit a la unitat amb les dades al fitxer o al disc a la unitat física i els seus continguts.</translation>
+ <translation type="obsolete">Seleccioneu un disc CD/DVD virtual o una unitat física que s'utilitzarà al dispositiu virtual. La màquina virtual veurà el disc inserit a la unitat amb les dades al fitxer o al disc a la unitat física i els seus continguts.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Configura la unitat de CD/DVD virtual</translation>
+ <translation type="obsolete">Configura la unitat de CD/DVD virtual</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6446,7 +6760,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Selecciona un fitxer de CD/DVD virtual...</translation>
+ <translation type="obsolete">Selecciona un fitxer de CD/DVD virtual...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6542,6 +6856,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Seleccioneu un fitxer de disc òptic virtual...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6947,10 +7293,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">L'USB 2.0 es troba activat per a esta màquina virtual. Tot i així, això requereix la instal·lació de <b>%1</b>. Instal·leu el paquet d'extensions des del lloc web de baixades del VirtualBox. Una vegada fet això, haureu de tornar a activar l'USB 2.0. Mentrestant es desactivarà a no ser que cancel·leu els canvis dels paràmetres actuals.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6970,6 +7312,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7143,6 +7489,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Tanca</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Canvia</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7421,7 +7775,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>No s'ha pogut crear l'objecte VirtualBox COM.</p><p>Ara es tancarà l'aplicació.</p></translation>
+ <translation type="obsolete"><p>No s'ha pogut crear l'objecte VirtualBox COM.</p><p>Ara es tancarà l'aplicació.</p></translation>
</message>
<message>
<source><p>Failed to download the VirtualBox Guest Additions disk image file from <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p></source>
@@ -7794,7 +8148,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><b>S'ha publicat una nova versió del VirtualBox! La versió <b>%1</b> és disponible a <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Podeu baixar-la directament des d'este enllaç: </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><b>S'ha publicat una nova versió del VirtualBox! La versió <b>%1</b> és disponible a <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Podeu baixar-la directament des d'este enllaç: </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7964,7 +8318,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>No es pot accedir a un o més dels discos, CD/DVD o disquet virtuals. Com a resultat, no podreu operar amb les màquines virtuals que els facen servir fins que estiguen accessibles.</p><p>Premeu <b>Comprova</b> per obrir el gestor de discos virtuals i veure a quins suports no s'hi pot accedir, o premeu <b>Ignora</b> per ignorar este missatge.</p></translation>
+ <translation type="obsolete"><p>No es pot accedir a un o més dels discos, CD/DVD o disquet virtuals. Com a resultat, no podreu operar amb les màquines virtuals que els facen servir fins que estiguen accessibles.</p><p>Premeu <b>Comprova</b> per obrir el gestor de discos virtuals i veure a quins suports no s'hi pot accedir, o premeu <b>Ignora</b> per ignorar este missatge.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files will be automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>Exit</b> if you want to terminate the VirtualBox application without any further actions.</p></source>
@@ -8003,7 +8357,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>S'ha produït un error crític mentre s'executava la màquina virtual, que s'ha aturat.</p><p>Per obtindre ajuda, visiteu la secció Community a <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> o al vostre contracte de suport. Afegiu el contingut del fitxer de registre <tt>VBox.log</tt> i el fitxer d'imatge <tt>VBox.png</tt>,que podreu trobar al directori <nobr><b>%1& [...]
+ <translation type="obsolete"><p>S'ha produït un error crític mentre s'executava la màquina virtual, que s'ha aturat.</p><p>Per obtindre ajuda, visiteu la secció Community a <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> o al vostre contracte de suport. Afegiu el contingut del fitxer de registre <tt>VBox.log</tt> i el fitxer d'imatge <tt>VBox.png</tt>,que podreu trobar al directori <nobr [...]
</message>
<message>
<source>Failed to open appliance.</source>
@@ -8209,7 +8563,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Segur que voleu eliminar el dispositiu de CD/DVD?</p><p>No podreu muntar cap CD o imatges iso ni tampoc instal·lar les Guest Additions sense ell.</p></translation>
+ <translation type="obsolete"><p>Segur que voleu eliminar el dispositiu de CD/DVD?</p><p>No podreu muntar cap CD o imatges iso ni tampoc instal·lar les Guest Additions sense ell.</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8312,7 +8666,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Ara afegireu un CD/DVD al controlador <b>%1</b>.</p><p>Voleu seleccionar un disc CD/DVD virtual per posar-lo a la unitat o voleu deixar-lo buit per ara?</p></translation>
+ <translation type="obsolete"><p>Ara afegireu un CD/DVD al controlador <b>%1</b>.</p><p>Voleu seleccionar un disc CD/DVD virtual per posar-lo a la unitat o voleu deixar-lo buit per ara?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8334,11 +8688,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>No s'ha pogut desconnectar el dispositiu CD/DVD (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
+ <translation type="obsolete">No s'ha pogut desconnectar el dispositiu CD/DVD (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>No s'ha pogut desconnectar el disquet (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
+ <translation type="obsolete">No s'ha pogut desconnectar el disquet (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -8390,11 +8744,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>No s'ha pogut connectar el dispositiu CD/DVD (<nobr><b>%1</b></nobr>) a la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
+ <translation type="obsolete">No s'ha pogut connectar el dispositiu CD/DVD (<nobr><b>%1</b></nobr>) a la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>No s'ha pogut connectar el disquet (<nobr><b>%1</b></nobr>) a la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
+ <translation type="obsolete">No s'ha pogut connectar el disquet (<nobr><b>%1</b></nobr>) a la ranura <i>%2</i> de la màquina <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8645,7 +8999,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>No s'han pogut eliminar les dades.</translation>
+ <translation type="obsolete">No s'han pogut eliminar les dades.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -8881,14 +9235,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8949,6 +9295,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -10169,13 +10603,17 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Benvingut a VirtualBox!</h3><p>A la part esquerra d'esta finestra es mostra un llistat de totes les màquines virtuals a l'ordinador. Este llistat és buit actualment perquè encara no heu creat cap màquina virtual.<img src=:/welcome.png align=right/></p><p>Per crear una nova màquina virtual, premeu sobre el botó <b>Nova</b> a la barra principal que es troba a la part de dalt d'esta finestra.</p>&l [...]
+ <translation type="obsolete"><h3>Benvingut a VirtualBox!</h3><p>A la part esquerra d'esta finestra es mostra un llistat de totes les màquines virtuals a l'ordinador. Este llistat és buit actualment perquè encara no heu creat cap màquina virtual.<img src=:/welcome.png align=right/></p><p>Per crear una nova màquina virtual, premeu sobre el botó <b>Nova</b> a la barra principal que es troba a la part de dalt d'esta fines [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Gestor</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -10208,7 +10646,7 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
</message>
<message>
<source>Settings</source>
- <translation>Paràmetres</translation>
+ <translation type="obsolete">Paràmetres</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -10261,6 +10699,10 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
<source>Display</source>
<translation>Pantalla</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10336,6 +10778,25 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">actualment esteu fent servir més controlador d'emmagatzematge que els xips %1 suporten. Canvieu el tipus de xip a la pàgina de paràmetres del sistema o reduïu el nombre dels següents controladors d'emmagatzematge a la pàgina de paràmetres d'emmagatzematge: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Paràmetres</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -10350,6 +10811,10 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
<source>Close</source>
<translation type="unfinished">Tanca</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10750,7 +11215,7 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Mode d'arrossega i deixa d'anar</translation>
+ <translation type="obsolete">Mode d'arrossega i deixa d'anar</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -10764,6 +11229,10 @@ pas i connectar discos durs més avant, fent servir el diàleg de configuració
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -13130,7 +13599,7 @@ Versió %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -13984,17 +14453,17 @@ Versió %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Si connecteu este disc dur es millorarà de forma indirecta fent servir un nou disc dur diferenciat.</translation>
+ <translation type="obsolete">Si connecteu este disc dur es millorarà de forma indirecta fent servir un nou disc dur diferenciat.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Alguns dels suports d'este disc dur no són accessibles. Feu servir el Gestor virtual de suports en el mode <b>Mostra els discos durs diferenciats</b> per inspeccionar estos suports.</translation>
+ <translation type="obsolete">Alguns dels suports d'este disc dur no són accessibles. Feu servir el Gestor virtual de suports en el mode <b>Mostra els discos durs diferenciats</b> per inspeccionar estos suports.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Este disc dur base es connecta indirectament fent servir el disc dur diferenciat següent:</translation>
+ <translation type="obsolete">Este disc dur base es connecta indirectament fent servir el disc dur diferenciat següent:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -14046,7 +14515,7 @@ Versió %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -14606,16 +15075,6 @@ Versió %1</translation>
<translation>Trieu una ubicació per al fitxer de disc virtual nou</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -14713,6 +15172,105 @@ Versió %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Actiu</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Actiu</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Actiu</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -15559,6 +16117,10 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Crea un disc virtual nou</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
index 6d03975..186063a 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts
@@ -300,7 +300,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">&Bezešvý režim</translation>
+ <translation type="unfinished">&Bezešvý režim</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -324,11 +324,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Zákazat integraci &myši</translation>
+ <translation type="obsolete">Zákazat integraci &myši</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Dočasně zakáže integraci hostitelské myši</translation>
+ <translation type="obsolete">Dočasně zakáže integraci hostitelské myši</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -340,11 +340,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Vložit Ctrl-Alt-&Del</translation>
+ <translation type="obsolete">Vložit Ctrl-Alt-&Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Pošle sekvenci Ctrl-Alt-Del virtuálnímu počítači</translation>
+ <translation type="obsolete">Pošle sekvenci Ctrl-Alt-Del virtuálnímu počítači</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -352,7 +352,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Pošle sekvenci Ctrl-Alt-Backspace virtuálnímu počítači</translation>
+ <translation type="obsolete">Pošle sekvenci Ctrl-Alt-Backspace virtuálnímu počítači</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -424,15 +424,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD zařízení</translation>
+ <translation type="obsolete">&CD/DVD zařízení</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Disketové mechaniky</translation>
+ <translation type="obsolete">&Disketové mechaniky</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB zařízení</translation>
+ <translation type="obsolete">&USB zařízení</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -483,7 +483,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>&Logování...</translation>
+ <translation type="obsolete">&Logování...</translation>
</message>
<message>
<source>&Help</source>
@@ -512,15 +512,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Přepnout do režimu &celé obrazovky</translation>
+ <translation type="obsolete">Přepnout do režimu &celé obrazovky</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Přepíná mezi klasickým režimem a režimem celé obrazovky</translation>
+ <translation type="obsolete">Přepíná mezi klasickým režimem a režimem celé obrazovky</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Přepnout do &bezešvého režimu</translation>
+ <translation type="obsolete">Přepnout do &bezešvého režimu</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -528,7 +528,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Přepnout do &přizpůsobivého režimu</translation>
+ <translation type="obsolete">Přepnout do &přizpůsobivého režimu</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -739,7 +739,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Vlož&it Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">Vlož&it Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>Sort List</source>
@@ -959,7 +959,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Táhni a pusť</translation>
+ <translation type="obsolete">Táhni a pusť</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -1122,6 +1122,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Soubor</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1135,6 +1224,11 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -1144,6 +1238,22 @@
</message>
</context>
<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIApplianceEditorWidget</name>
<message>
<source>Virtual System %1</source>
@@ -2052,6 +2162,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2733,7 +2870,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2964,6 +3101,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3396,15 +3588,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>&Dokování a nástrojová lišta:</translation>
+ <translation type="obsolete">&Dokování a nástrojová lišta:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>Automaticky zobrazit v celoobrazovkovém režimu</translation>
+ <translation type="obsolete">Automaticky zobrazit v celoobrazovkovém režimu</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>Je-li zatrženo, ikona dokování a nabídka bude automaticky zobrazena v celoobrazovkovém režimu.</translation>
+ <translation type="obsolete">Je-li zatrženo, ikona dokování a nabídka bude automaticky zobrazena v celoobrazovkovém režimu.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -4495,12 +4687,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indikuje aktivitu CD/DVD zařízení:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indikuje aktivitu CD/DVD zařízení:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indikuje aktivitu disketových mechanik:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indikuje aktivitu disketových mechanik:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4612,6 +4804,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4926,7 +5128,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>Virtuální počítač je nastaven aby používal grafickou akceleraci je nainstalován operační systém Vindows Vista nebo pozdější. Pro lepší výkon je potřeba virtuálnímu počítači přiřadit minimálně <b>%1</b> video paměti.</translation>
+ <translation type="obsolete">Virtuální počítač je nastaven aby používal grafickou akceleraci je nainstalován operační systém Vindows Vista nebo pozdější. Pro lepší výkon je potřeba virtuálnímu počítači přiřadit minimálně <b>%1</b> video paměti.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -4980,43 +5182,35 @@ p, li { white-space: pre-wrap; }
<translation>Povolí nahrávání videa pro obrazovku %1.</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Mini nástrojová lišta:</translation>
+ <translation type="obsolete">Mini nástrojová lišta:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Je-li zatrženo, bude se v celoobrazovkovém a bezešvém režimu zobrazovat malá nástrojová lišta.</translation>
+ <translation type="obsolete">Je-li zatrženo, bude se v celoobrazovkovém a bezešvém režimu zobrazovat malá nástrojová lišta.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Zobrazit v &celoobrazovkovém/bezešvém režimu</translation>
+ <translation type="obsolete">Zobrazit v &celoobrazovkovém/bezešvém režimu</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Je-li zatrženo, bude se mini nabídková lišta zobrazovat nahoře na obrazovce místo na výchozí pozici dole na obrazovce.</translation>
+ <translation type="obsolete">Je-li zatrženo, bude se mini nabídková lišta zobrazovat nahoře na obrazovce místo na výchozí pozici dole na obrazovce.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Zobrazit na&hoře na obrazovce</translation>
+ <translation type="obsolete">Zobrazit na&hoře na obrazovce</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5282,6 +5476,126 @@ p, li { white-space: pre-wrap; }
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation>Operační systém virtuálního počítače byl nastaven do 64bitového režimu. Ten vyžaduje pro svůj běh podporu hradwarové virtualizace, po odsouhlasení bude atuomaticky povolena.</translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Mini nástrojová lišta:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Je-li zatrženo, bude se v celoobrazovkovém a bezešvém režimu zobrazovat malá nástrojová lišta.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Zobrazit v &celoobrazovkovém/bezešvém režimu</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Je-li zatrženo, bude se mini nabídková lišta zobrazovat nahoře na obrazovce místo na výchozí pozici dole na obrazovce.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Zobrazit na&hoře na obrazovce</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5977,11 +6291,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Je-li zatrženo, roura uvedená v políčku <b>Cesta portu</b> bude vytvořena virtuálním počítačem po spuštění. Jinak se virtuální počítač pokusí použít existující rouru.</translation>
+ <translation type="obsolete">Je-li zatrženo, roura uvedená v políčku <b>Cesta portu</b> bude vytvořena virtuálním počítačem po spuštění. Jinak se virtuální počítač pokusí použít existující rouru.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>Vytvořit r&ouru</translation>
+ <translation type="obsolete">Vytvořit r&ouru</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5989,11 +6303,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Zobrazuje cestu k rouře sériového portu na hostitelovi, když port pracuje v režimu <b>Roura hostitele</b>, nebo název sériového zařízení, když port pracuje v režimnu <b>Hostitelovo zařízení</b>.</translation>
+ <translation type="obsolete">Zobrazuje cestu k rouře sériového portu na hostitelovi, když port pracuje v režimu <b>Roura hostitele</b>, nebo název sériového zařízení, když port pracuje v režimnu <b>Hostitelovo zařízení</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Port/Cesta k sou&boru:</translation>
+ <translation type="obsolete">Port/Cesta k sou&boru:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -6003,6 +6317,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Zobrazuje základní adresu I/O portu tohoto sériového portu. Platné hodnoty jsou celá čísla v rozsahu od <tt>0</tt> do <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6131,11 +6461,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Přidat CD/DVD zařízení</nobr></translation>
+ <translation type="obsolete"><nobr>Přidat CD/DVD zařízení</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Přidat disketovou mechaniku</nobr></translation>
+ <translation type="obsolete"><nobr>Přidat disketovou mechaniku</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -6179,11 +6509,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Přidat CD/DVD mechaniku</translation>
+ <translation type="obsolete">Přidat CD/DVD mechaniku</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Přidat disketovou mechaniku</translation>
+ <translation type="obsolete">Přidat disketovou mechaniku</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6371,15 +6701,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&CD/DVD zařízení:</translation>
+ <translation type="obsolete">&CD/DVD zařízení:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Výběr virtuálního CD/DVD disku nebo fyzického zařízení pro virtuální počítač. Virtuální počítač uvidí obsah disku vloženého do této fyzické jednotky nebo v tomto souboru jako data a soubory.</translation>
+ <translation type="obsolete">Výběr virtuálního CD/DVD disku nebo fyzického zařízení pro virtuální počítač. Virtuální počítač uvidí obsah disku vloženého do této fyzické jednotky nebo v tomto souboru jako data a soubory.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Nastaví virtuální CD/DVD mechaniku</translation>
+ <translation type="obsolete">Nastaví virtuální CD/DVD mechaniku</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6403,7 +6733,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Vybrat soubor s obrazem virtuálního CD/DVD...</translation>
+ <translation type="obsolete">Vybrat soubor s obrazem virtuálního CD/DVD...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6499,6 +6829,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Vybrat soubor s virtuálním diskem...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6917,7 +7279,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>Pro tento virtuální počítač je povolena podpora USB 2.0. Je ale potřeba doinstalovat <b>%1</b>. Prosíme doinstalujte rozšíření z webových stránek aplikace VirtualBox. Po instalaci bude možno použít USB 2.0, která je nyní do změny nastavení zakázána.</translation>
+ <translation type="obsolete">Pro tento virtuální počítač je povolena podpora USB 2.0. Je ale potřeba doinstalovat <b>%1</b>. Prosíme doinstalujte rozšíření z webových stránek aplikace VirtualBox. Po instalaci bude možno použít USB 2.0, která je nyní do změny nastavení zakázána.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
@@ -6939,6 +7301,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7112,6 +7478,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Zavřít</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Přepnout</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7155,7 +7529,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Nepodařilo se vytvořit COM objekt VirtualBoxu.</p><p>Aplikace bude ukončena</p></translation>
+ <translation type="obsolete"><p>Nepodařilo se vytvořit COM objekt VirtualBoxu.</p><p>Aplikace bude ukončena</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -7799,7 +8173,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Byla vydána nová verze aplikace VirtualBox! Na stránce <a href="http://www.virtualbox.org/">virtualbox.org</a> je verze <b>%1</b>.</p><p>Tuto verzi si můžete stáhnout přímo zde: </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Byla vydána nová verze aplikace VirtualBox! Na stránce <a href="http://www.virtualbox.org/">virtualbox.org</a> je verze <b>%1</b>.</p><p>Tuto verzi si můžete stáhnout přímo zde: </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7968,7 +8342,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Jeden nebo více virtuálních pevných disků, CD/DVD mechanik nebo disket jsou momentálně nedostupné. Nebudete tak moci použít virtuální počítače, které je používají, dokud nebudou opět dostupné.</p><p>Stiskněte <b>Zkontrolovat</b> pro otevření okna Správce virtuálních médií a podívejte se, která média jsou nedostupná, nebo stiskněte <b>Ignorovat</b> a ignorujte tuto zprávu.</p></translation>
+ <translation type="obsolete"><p>Jeden nebo více virtuálních pevných disků, CD/DVD mechanik nebo disket jsou momentálně nedostupné. Nebudete tak moci použít virtuální počítače, které je používají, dokud nebudou opět dostupné.</p><p>Stiskněte <b>Zkontrolovat</b> pro otevření okna Správce virtuálních médií a podívejte se, která média jsou nedostupná, nebo stiskněte <b>Ignorovat</b> a ignorujte tuto zprávu.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files will be automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>Exit</b> if you want to terminate the VirtualBox application without any further actions.</p></source>
@@ -8007,7 +8381,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Při běhu virtuálního počítače se vyskytla kritická chyba a provádění počítače bylo zastaveno.</p><p>Pro pomoc se prosím podívejte do sekce Community na <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> nebo na smlouvu o podpoře. Prosím poskytněte obsah log souboru <tt>VBox.log</tt> a obrázek <tt>VBox.png</tt>, který najdete v adresáři <nobr><b>%1</b></nobr>, společně s popi [...]
+ <translation type="obsolete"><p>Při běhu virtuálního počítače se vyskytla kritická chyba a provádění počítače bylo zastaveno.</p><p>Pro pomoc se prosím podívejte do sekce Community na <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> nebo na smlouvu o podpoře. Prosím poskytněte obsah log souboru <tt>VBox.log</tt> a obrázek <tt>VBox.png</tt>, který najdete v adresáři <nobr><b>%1</b></nobr>, [...]
</message>
<message>
<source>hard disk</source>
@@ -8180,7 +8554,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Opravdu chcete smazat CD/DVD zařízení?</p><p>Bez něj nebudete moci připojit žádný CD nebo DVD obraz ani nainstalovat přídavky pro hosta!</p></translation>
+ <translation type="obsolete"><p>Opravdu chcete smazat CD/DVD zařízení?</p><p>Bez něj nebudete moci připojit žádný CD nebo DVD obraz ani nainstalovat přídavky pro hosta!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8283,7 +8657,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Chystáte se přidat CD/DVD mechaniku k řadiči <b>%1</b>. </p><p>Chcete vybrat virtuální CD/DVD disk a vložit ho do mechaniky nebo nechat mechaniku prázdnou?</p></translation>
+ <translation type="obsolete"><p>Chystáte se přidat CD/DVD mechaniku k řadiči <b>%1</b>. </p><p>Chcete vybrat virtuální CD/DVD disk a vložit ho do mechaniky nebo nechat mechaniku prázdnou?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8305,11 +8679,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nepodařilo se odpojit CD/DVD zařízení (<nobr><b>%1</b></nobr>) ze slotu zařízení <i>%2</i> počítače <b>%3</b>.</translation>
+ <translation type="obsolete">Nepodařilo se odpojit CD/DVD zařízení (<nobr><b>%1</b></nobr>) ze slotu zařízení <i>%2</i> počítače <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nepodařilo se odpojit disketovou mechaniku (<nobr><b>%1</b></nobr>) ze slotu zařízení <i>%2</i> počítače <b>%3</b>.</translation>
+ <translation type="obsolete">Nepodařilo se odpojit disketovou mechaniku (<nobr><b>%1</b></nobr>) ze slotu zařízení <i>%2</i> počítače <b>%3</b>.</translation>
</message>
<message numerus="yes">
<source><p>The virtual machine(s) <b>%1</b> are currently in a saved state.</p><p>If you continue the runtime state of the exported machine(s) will be discarded. Note that the existing machine(s) are not changed.</p></source>
@@ -8353,11 +8727,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nepodařilo se připojit CD/DVD zařízení (<nobr><b>%1</b></nobr>) ke slotu zařízení <i>%2</i> počítače <b>%3</b>.</translation>
+ <translation type="obsolete">Nepodařilo se připojit CD/DVD zařízení (<nobr><b>%1</b></nobr>) ke slotu zařízení <i>%2</i> počítače <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nepodařilo se připojit disketovou mechaniku (<nobr><b>%1</b></nobr>) ke slotu zařízení <i>%2</i> počítače <b>%3</b>.</translation>
+ <translation type="obsolete">Nepodařilo se připojit disketovou mechaniku (<nobr><b>%1</b></nobr>) ke slotu zařízení <i>%2</i> počítače <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8603,7 +8977,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Selhalo uložení dat.</translation>
+ <translation type="obsolete">Selhalo uložení dat.</translation>
</message>
<message>
<source><p>Failed to initialize COM because the VirtualBox global configuration directory <b><nobr>%1</nobr></b> is not accessible. Please check the permissions of this directory and of its parent directory.</p><p>The application will now terminate.</p></source>
@@ -8869,11 +9243,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p>Obraz s <b>Přídavky pro hosta</b> byl úspěšně stažen z <nobr><a href="%1">%1</a></nobr> a uložen lokálně jako <nobr><b>%2</b>.</nobr></p><p>Chcete zaregistrovat tento soubor s obrazem a připojit ho do virtuální CD/DVD mechaniky?</p></translation>
+ <translation type="obsolete"><p>Obraz s <b>Přídavky pro hosta</b> byl úspěšně stažen z <nobr><a href="%1">%1</a></nobr> a uložen lokálně jako <nobr><b>%2</b>.</nobr></p><p>Chcete zaregistrovat tento soubor s obrazem a připojit ho do virtuální CD/DVD mechaniky?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>Nepodařilo se připojit soubor s obrazem <b>Přídavků pro hosta</b>aplikace VirtualBox do virtuálního počítače <b>%1</b> protože nemá CD/DVD zařízení. Přidejte prosím zařízení na záložce uložiště ve vlastnostech virtuálního počítače.</p></translation>
+ <translation type="obsolete"><p>Nepodařilo se připojit soubor s obrazem <b>Přídavků pro hosta</b>aplikace VirtualBox do virtuálního počítače <b>%1</b> protože nemá CD/DVD zařízení. Přidejte prosím zařízení na záložce uložiště ve vlastnostech virtuálního počítače.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
@@ -8936,6 +9310,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -10168,13 +10630,17 @@ krok a připojit pevné disky později použitím dialogu Nastavení VM.</p&g
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Vítejte ve VirtualBoxu!</h3><p>Levá část tohoto okna je určena pro zobrazení seznamu všech virtuálních počítačů na vašem počítači. Seznam je teď prázdný, protože jste ještě žádný nevytvořili.<img src=:/welcome.png align=right/></p><p>Pro vytvoření nového virtuálního počítače stiskněte tlačítko <b>Nový</b> v horní části hlavního okna.</p><p>Pro okamžitou nápovědu stiskněte klávesu <b>%1</b> ne [...]
+ <translation type="obsolete"><h3>Vítejte ve VirtualBoxu!</h3><p>Levá část tohoto okna je určena pro zobrazení seznamu všech virtuálních počítačů na vašem počítači. Seznam je teď prázdný, protože jste ještě žádný nevytvořili.<img src=:/welcome.png align=right/></p><p>Pro vytvoření nového virtuálního počítače stiskněte tlačítko <b>Nový</b> v horní části hlavního okna.</p><p>Pro okamžitou nápovědu stiskněte klávesu <b> [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Správce</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -10207,7 +10673,7 @@ krok a připojit pevné disky později použitím dialogu Nastavení VM.</p&g
</message>
<message>
<source>Settings</source>
- <translation>Nastavení</translation>
+ <translation type="obsolete">Nastavení</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -10260,6 +10726,10 @@ krok a připojit pevné disky později použitím dialogu Nastavení VM.</p&g
<source>Display</source>
<translation>Obrazovka</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10335,6 +10805,25 @@ krok a připojit pevné disky později použitím dialogu Nastavení VM.</p&g
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">používáte nyní více řadičů než čipová sada %1 podporuje. Změňte prosím typ čipové sady na záložce Nastavení systému nebo zmenšete následující počet řadičů na záložce Nastavení řadiče: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Nastavení</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -10349,6 +10838,10 @@ krok a připojit pevné disky později použitím dialogu Nastavení VM.</p&g
<source>Close</source>
<translation type="unfinished">Zavřít</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10693,7 +11186,7 @@ krok a připojit pevné disky později použitím dialogu Nastavení VM.</p&g
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Režim Táhni a pusť</translation>
+ <translation type="obsolete">Režim Táhni a pusť</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -10707,6 +11200,10 @@ krok a připojit pevné disky později použitím dialogu Nastavení VM.</p&g
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -13083,7 +13580,7 @@ Verze %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -13897,19 +14394,9 @@ Verze %1</translation>
<translation type="obsolete">Obrazy můžete vytvořit pomocí správce virtuální medií.</translation>
</message>
<message>
- <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Některé části souboru s diskem jsou nedostupné. Použijte prosím Správce virtuálních medií v režimu <b>Zobrazení rozdílových disků</b> pro zjištění souvislostí.</translation>
- </message>
- <message>
- <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Některé části souboru s diskem jsou nedostupné. Použijte prosím Správce virtuálních medií v režimu <b>Zobrazení rozdílových disků</b> pro zjištění souvislostí.</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -13961,7 +14448,7 @@ Verze %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Screens</source>
@@ -14518,12 +15005,12 @@ Verze %1</translation>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Povoleno</translation>
+ <translation type="obsolete">Povoleno</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Zakázáno</translation>
+ <translation type="obsolete">Zakázáno</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -14633,6 +15120,105 @@ Verze %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Aktivní</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Aktivní</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Aktivní</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -15202,6 +15788,10 @@ na výchozí jazyk systému.</qt>
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Vytvoří nový virtuální pevný disk</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
index 7b7841b..a5dff38 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts
@@ -251,7 +251,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Ingen vinduesramme</translation>
+ <translation type="unfinished">Ingen vinduesramme</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -275,11 +275,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Slå integration af &mus fra</translation>
+ <translation type="obsolete">Slå integration af &mus fra</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Slå integration af mus fra midlertidigt</translation>
+ <translation type="obsolete">Slå integration af mus fra midlertidigt</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -291,11 +291,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Send Ctrl-Alt-Del</translation>
+ <translation type="obsolete">Send Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Send Ctrl-Alt-Del til den virtuelle maskine</translation>
+ <translation type="obsolete">Send Ctrl-Alt-Del til den virtuelle maskine</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -303,7 +303,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Send Ctrl-Alt-Backspace til den virtuelle maskine</translation>
+ <translation type="obsolete">Send Ctrl-Alt-Backspace til den virtuelle maskine</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -375,15 +375,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD drev</translation>
+ <translation type="obsolete">&CD/DVD drev</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Diskettedrev</translation>
+ <translation type="obsolete">Diskettedrev</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB enheder</translation>
+ <translation type="obsolete">&USB enheder</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -434,7 +434,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&Logger...</translation>
+ <translation type="obsolete">&Logger...</translation>
</message>
<message>
<source>&Help</source>
@@ -512,15 +512,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Skift til &fuldskærm</translation>
+ <translation type="obsolete">Skift til &fuldskærm</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Skift mellem normalt vindue og fuldskærm</translation>
+ <translation type="obsolete">Skift mellem normalt vindue og fuldskærm</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Skift ti&l rammefri tilstand</translation>
+ <translation type="obsolete">Skift ti&l rammefri tilstand</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -528,7 +528,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Skift til &skaleret tilstand</translation>
+ <translation type="obsolete">Skift til &skaleret tilstand</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -608,7 +608,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>S&end Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">S&end Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>&File</source>
@@ -902,10 +902,6 @@
<translation>Delt udklipsholder</translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -1070,6 +1066,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Fil</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1083,6 +1168,26 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1957,6 +2062,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2642,7 +2773,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2873,6 +3004,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB-styreenhed</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3250,18 +3436,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">&Slå værtens pauseskærm fra</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4476,12 +4650,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Viser aktiviteten på CD/DVD-drev:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Viser aktiviteten på CD/DVD-drev:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Viser aktiviteten på diskettedrev:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Viser aktiviteten på diskettedrev:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4593,6 +4767,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4906,10 +5090,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4961,43 +5141,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Miniværktøjslinje:</translation>
+ <translation type="obsolete">Miniværktøjslinje:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Hvis markeret, vises mini-værktøjslinjen i Fuldskærm og Rammefri tilstand.</translation>
+ <translation type="obsolete">Hvis markeret, vises mini-værktøjslinjen i Fuldskærm og Rammefri tilstand.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Vis i &Fuldskærm/Rammefri tilstand</translation>
+ <translation type="obsolete">Vis i &Fuldskærm/Rammefri tilstand</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Hvis markeret, vises mini-værktøjslinjen i toppen af skærmen fremfor som standard i bunden af skærmen.</translation>
+ <translation type="obsolete">Hvis markeret, vises mini-værktøjslinjen i toppen af skærmen fremfor som standard i bunden af skærmen.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Vis i &toppen af skærm</translation>
+ <translation type="obsolete">Vis i &toppen af skærm</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5081,19 +5253,139 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Du har valgt et 64-bit gæsteoperativsystem til denne VM. Da denne type gæst kræver hardware-virtualisering (VT-x/AMD-V) er dette automatisk blevet slået til.</translation>
</message>
<message>
- <source>D&rag'n'Drop:</source>
- <translation>Træk og slip:</translation>
+ <source>D&rag'n'Drop:</source>
+ <translation>Træk og slip:</translation>
+ </message>
+ <message>
+ <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation>Vælger hvilke data der kopieres mellem gæst- og værtsoperativsystem via træk og slip. Denne funktion kræver at Gæstetilføjelser er installeret i gæsteoperativsystemet.</translation>
+ </message>
+ <message>
+ <source>No name specified for the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Miniværktøjslinje:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Hvis markeret, vises mini-værktøjslinjen i Fuldskærm og Rammefri tilstand.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Vis i &Fuldskærm/Rammefri tilstand</translation>
</message>
<message>
- <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>Vælger hvilke data der kopieres mellem gæst- og værtsoperativsystem via træk og slip. Denne funktion kræver at Gæstetilføjelser er installeret i gæsteoperativsystemet.</translation>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Hvis markeret, vises mini-værktøjslinjen i toppen af skærmen fremfor som standard i bunden af skærmen.</translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Vis i &toppen af skærm</translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5606,19 +5898,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Hvis markeret, vil røret angivet i feltet<b>Sti til port</b> blive oprettet, når den virtuelle maskine starter. Ellers vil den virtuelle maskine forsøge at bruge et eksisterende rør.</translation>
+ <translation type="obsolete">Hvis markeret, vil røret angivet i feltet<b>Sti til port</b> blive oprettet, når den virtuelle maskine starter. Ellers vil den virtuelle maskine forsøge at bruge et eksisterende rør.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>Opret rør</translation>
+ <translation type="obsolete">Opret rør</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Viser stien til serielportens rør på værten, hvis porten er i <b>Rør</b>-tilstand eller stien til serielportens enhedsfil, når porten er i <b>Enhed</b>-tilstand.</translation>
+ <translation type="obsolete">Viser stien til serielportens rør på værten, hvis porten er i <b>Rør</b>-tilstand eller stien til serielportens enhedsfil, når porten er i <b>Enhed</b>-tilstand.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Port/Filsti:</translation>
+ <translation type="obsolete">&Port/Filsti:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5628,6 +5920,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Viser serielportens I/O-adresse. Gyldige værdier er heltal fra <tt>0</tt> til <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5744,11 +6052,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Tilføj CD/DVD-drev</nobr></translation>
+ <translation type="obsolete"><nobr>Tilføj CD/DVD-drev</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Tilføj diskettedrev</nobr></translation>
+ <translation type="obsolete"><nobr>Tilføj diskettedrev</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -5792,11 +6100,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Tilføj CD/DVD-drev</translation>
+ <translation type="obsolete">Tilføj CD/DVD-drev</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Tilføj diskettedrev</translation>
+ <translation type="obsolete">Tilføj diskettedrev</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5984,16 +6292,16 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD &drev:</translation>
+ <translation type="obsolete">CD/DVD &drev:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translatorcomment>Dårligt engelsk...</translatorcomment>
- <translation>Vælg den virtuelle CD/DVD eller fysiske drev, der skal sættes i det virtuelle drev. Den virtuelle maskine vil se en disk isat indeholdende data fra filen eller det fysiske drev.</translation>
+ <translation type="obsolete">Vælg den virtuelle CD/DVD eller fysiske drev, der skal sættes i det virtuelle drev. Den virtuelle maskine vil se en disk isat indeholdende data fra filen eller det fysiske drev.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Tilpas det virtuelle CD/DVD drev</translation>
+ <translation type="obsolete">Tilpas det virtuelle CD/DVD drev</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6017,7 +6325,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Vælg en virtuel CD/DVD-fil...</translation>
+ <translation type="obsolete">Vælg en virtuel CD/DVD-fil...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6113,6 +6421,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Vælg en virtuel optisk disk-fil...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6518,10 +6858,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">USB 2.0 er pt aktiveret i denne virtuelle maskine. Dette kræver at <b>%1</b> installeres - denne udvidelsespakke kan hentes fra VirtualBox' hjemmeside. Derefter kan du reaktivere USB 2.0. USB 2.0 vil blive deaktiveret nu, medmindre du annullerer de nuværende ændringer.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6541,6 +6877,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6715,6 +7055,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Luk</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Skift</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6758,7 +7106,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Kunne ikke oprette VirtualBox' COM-objekt.</p><p>Applikationen afsluttes.</p></translation>
+ <translation type="obsolete"><p>Kunne ikke oprette VirtualBox' COM-objekt.</p><p>Applikationen afsluttes.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7206,7 +7554,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>En ny version af VirtualBox er på gaden! Version <b>%1</b> er tilgængelig fra <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Du kan hente denne version her: </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>En ny version af VirtualBox er på gaden! Version <b>%1</b> er tilgængelig fra <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Du kan hente denne version her: </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7306,7 +7654,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>En eller flere virtuelle harddiske, CD/DVD- eller diskette-drev er ikke tilgængelige for øjeblikket. Du vil ikke kunne starte virtuelle maskiner, som benytter disse enheder indtil de bliver gjort tilgængelige</p><p>Tryk <b>Undersøg</b> for at åbne Virtuel diskhåndtering og se hvilke enheder der er utilgængelige eller tryk <b>Ignorer</b> for at ignorere denne meddelelse.</p></translation>
+ <translation type="obsolete"><p>En eller flere virtuelle harddiske, CD/DVD- eller diskette-drev er ikke tilgængelige for øjeblikket. Du vil ikke kunne starte virtuelle maskiner, som benytter disse enheder indtil de bliver gjort tilgængelige</p><p>Tryk <b>Undersøg</b> for at åbne Virtuel diskhåndtering og se hvilke enheder der er utilgængelige eller tryk <b>Ignorer</b> for at ignorere denne meddelelse.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -7337,7 +7685,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Der opstod en alvorlig fejl under afviklingen af den virtuelle maskine og afviklingen er stoppet.</p><p>For hjælp med dette, se under <i>Community</i>-sektionen på <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> eller din support-kontrakt. Hav en kopi af logfilen <tt>VBox.log</tt> og billedfilen <tt>VBox.png</tt>, som du finder i kataloget <nobr><b>%1</b></nobr&g [...]
+ <translation type="obsolete"><p>Der opstod en alvorlig fejl under afviklingen af den virtuelle maskine og afviklingen er stoppet.</p><p>For hjælp med dette, se under <i>Community</i>-sektionen på <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> eller din support-kontrakt. Hav en kopi af logfilen <tt>VBox.log</tt> og billedfilen <tt>VBox.png</tt>, som du finder i kataloget <nobr><b>%1</ [...]
</message>
<message>
<source>hard disk</source>
@@ -7613,7 +7961,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Er du sikker på at du vil fjerne CD/DVD-drevet?</p><p>Du vil ikke kunne montere CD/ISO-aftryk eller installere Gæstetilføjelserne uden det!</p></translation>
+ <translation type="obsolete"><p>Er du sikker på at du vil fjerne CD/DVD-drevet?</p><p>Du vil ikke kunne montere CD/ISO-aftryk eller installere Gæstetilføjelserne uden det!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -7716,7 +8064,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Du er ved at tilføje et nyt CD/DVD-drev til styreenheden <b>%1</b>.</p><p>Vil du vælge en virtuel CD/DVD-disk til at sætte i drevet eller lade det være tomt?</p></translation>
+ <translation type="obsolete"><p>Du er ved at tilføje et nyt CD/DVD-drev til styreenheden <b>%1</b>.</p><p>Vil du vælge en virtuel CD/DVD-disk til at sætte i drevet eller lade det være tomt?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -7738,11 +8086,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Kunne ikke afmontere CD/DVD-enheden <nobr><b>%1</b></nobr> fra udvidelsespladsen <i>%2</i> i maskinen <b>%3</b>.</translation>
+ <translation type="obsolete">Kunne ikke afmontere CD/DVD-enheden <nobr><b>%1</b></nobr> fra udvidelsespladsen <i>%2</i> i maskinen <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Kunne ikke afmontere disketten <nobr><b>%1</b></nobr> fra udvidelsespladsen <i>%2</i> i maskinen <b>%3</b>.</translation>
+ <translation type="obsolete">Kunne ikke afmontere disketten <nobr><b>%1</b></nobr> fra udvidelsespladsen <i>%2</i> i maskinen <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -7794,11 +8142,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Kunne ikke montere CD/DVD-enheden <nobr><b>%1</b></nobr> på udvidelsespladsen <i>%2</i> i maskinen <b>%3</b>.</translation>
+ <translation type="obsolete">Kunne ikke montere CD/DVD-enheden <nobr><b>%1</b></nobr> på udvidelsespladsen <i>%2</i> i maskinen <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Kunne ikke montere disketten <nobr><b>%1</b></nobr> på udvidelsespladsen <i>%2</i> i maskinen <b>%3</b>.</translation>
+ <translation type="obsolete">Kunne ikke montere disketten <nobr><b>%1</b></nobr> på udvidelsespladsen <i>%2</i> i maskinen <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8052,7 +8400,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Kunne ikke kassere data.</translation>
+ <translation type="obsolete">Kunne ikke kassere data.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -8287,14 +8635,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8355,6 +8695,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -9369,13 +9797,17 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Velkommen til VirtualBox!</h3><p>Den venstre side af dette vindue viser alle virtuelle maskiner på din computer. Lige nu er listen tom, fordi du ikke har oprettet nogle virtuelle maskiner endnu.<img src=:/welcome.png align=right/></p><p>For at oprette en virtuel maskine, klik på knappen <b>Ny</b> i værktøjslinjen øverst i vinduet.</p><p>Du kan også trykke <b>%1</b> for at få hjælp eller besøg [...]
+ <translation type="obsolete"><h3>Velkommen til VirtualBox!</h3><p>Den venstre side af dette vindue viser alle virtuelle maskiner på din computer. Lige nu er listen tom, fordi du ikke har oprettet nogle virtuelle maskiner endnu.<img src=:/welcome.png align=right/></p><p>For at oprette en virtuel maskine, klik på knappen <b>Ny</b> i værktøjslinjen øverst i vinduet.</p><p>Du kan også trykke <b>%1</b> for at få h [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Håndtering</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9408,7 +9840,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Settings</source>
- <translation>Indstillinger</translation>
+ <translation type="obsolete">Indstillinger</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -9462,6 +9894,10 @@ p, li { white-space: pre-wrap; }
<source>Display</source>
<translation>Skærm</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -9538,6 +9974,25 @@ p, li { white-space: pre-wrap; }
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">du bruger netop nu flere lager-styreenheder end et %1 chipset understøtter. Tilpas chipset-typen under System-indstillinger eller formindsk antallet af de følgende lager-styreenheder under Lager-indstillinger: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Indstillinger</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -9552,6 +10007,10 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Luk</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -9877,7 +10336,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Træk og slip-tilstand</translation>
+ <translation type="obsolete">Træk og slip-tilstand</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -9891,6 +10350,10 @@ p, li { white-space: pre-wrap; }
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11697,7 +12160,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12464,17 +12927,17 @@ p, li { white-space: pre-wrap; }
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Tilslutning af denne harddisk vil blive gjort indirekte via en nyoprettet Ændrings-harddisk.</translation>
+ <translation type="obsolete">Tilslutning af denne harddisk vil blive gjort indirekte via en nyoprettet Ændrings-harddisk.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Nogle af enhederne i harddisk-kæden er utilgængelige. Brug funktionen <b>Vis ændrings-harddiske</b> i Virtuel diskhåndtering for at undersøge problemet nærmere.</translation>
+ <translation type="obsolete">Nogle af enhederne i harddisk-kæden er utilgængelige. Brug funktionen <b>Vis ændrings-harddiske</b> i Virtuel diskhåndtering for at undersøge problemet nærmere.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Denne harddisk er indirekte tilsluttet gennem ændrings-harddisken:</translation>
+ <translation type="obsolete">Denne harddisk er indirekte tilsluttet gennem ændrings-harddisken:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -12520,7 +12983,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -13076,16 +13539,6 @@ p, li { white-space: pre-wrap; }
<translation>Angiv placeringen af den nye virtuelle disk-fil</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -13183,6 +13636,105 @@ p, li { white-space: pre-wrap; }
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13489,6 +14041,10 @@ p, li { white-space: pre-wrap; }
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Opret en ny virtuel harddisk</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
index 9c9ab01..570a842 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts
@@ -172,23 +172,23 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>&Mauszeiger-Integration deaktivieren</translation>
+ <translation type="obsolete">&Mauszeiger-Integration deaktivieren</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Integration des Mauszeigers vorübergehend deaktivieren</translation>
+ <translation type="obsolete">Integration des Mauszeigers vorübergehend deaktivieren</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Sende Strg-Alt-Entf</translation>
+ <translation type="obsolete">&Sende Strg-Alt-Entf</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Sendet die Sequenz Strg-Alt-Entf (Affengriff) an die virtuelle Maschine</translation>
+ <translation type="obsolete">Sendet die Sequenz Strg-Alt-Entf (Affengriff) an die virtuelle Maschine</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Sendet die Sequenz Strg-Alt-Rücktaste an die virtuelle Maschine</translation>
+ <translation type="obsolete">Sendet die Sequenz Strg-Alt-Rücktaste an die virtuelle Maschine</translation>
</message>
<message>
<source>Take a snapshot of the virtual machine</source>
@@ -240,15 +240,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD-Laufwerke</translation>
+ <translation type="obsolete">&CD/DVD-Laufwerke</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Diskettenlaufwerke</translation>
+ <translation type="obsolete">&Diskettenlaufwerke</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB-Geräte</translation>
+ <translation type="obsolete">&USB-Geräte</translation>
</message>
<message>
<source>Change the settings of network adapters</source>
@@ -298,15 +298,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>&Vollbildmodus einschalten</translation>
+ <translation type="obsolete">&Vollbildmodus einschalten</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Schaltet in den Vollbildmodus bzw zurück</translation>
+ <translation type="obsolete">Schaltet in den Vollbildmodus bzw zurück</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>&Nahtlosen Modus einschalten</translation>
+ <translation type="obsolete">&Nahtlosen Modus einschalten</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -314,7 +314,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>&Skalierten Modus einschalten</translation>
+ <translation type="obsolete">&Skalierten Modus einschalten</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -390,7 +390,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Sende Strg-Alt-&Rücktaste</translation>
+ <translation type="obsolete">Sende Strg-Alt-&Rücktaste</translation>
</message>
<message>
<source>&File</source>
@@ -541,7 +541,7 @@
</message>
<message>
<source>&VirtualBox Web Site...</source>
- <translation>Webseite von &VirtualBox...</translation>
+ <translation>&VirtualBox-Webseite...</translation>
</message>
<message>
<source>&Reset All Warnings</source>
@@ -653,7 +653,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Drag'n'Drop</translation>
+ <translation type="obsolete">Drag'n'Drop</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -665,7 +665,7 @@
</message>
<message>
<source>&Network Settings...</source>
- <translation>&Netzwerkeinstellungen...</translation>
+ <translation>&Einstellungen für Netzwerk...</translation>
</message>
<message>
<source>&Shared Folders Settings...</source>
@@ -698,7 +698,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>&Logging...</translation>
+ <translation type="obsolete">&Logging...</translation>
</message>
<message>
<source>Popup Menu</source>
@@ -706,124 +706,229 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished"></translation>
+ <translation>Zeigt einen Dialog mit Sitzungsinformationen</translation>
</message>
<message>
<source>&Webcams</source>
- <translation type="unfinished"></translation>
+ <translation>&Webcams</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished"></translation>
+ <translation>&Gasterweiterungen einlegen...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished"></translation>
+ <translation>Legt das Medium mit den Gasterweiterungen in das virtuelle CD/DVD-Laufwerk</translation>
</message>
<message>
<source>&VirtualBox</source>
- <translation type="unfinished"></translation>
+ <translation>&VirtualBox</translation>
</message>
<message>
<source>&Menu Bar</source>
- <translation type="unfinished"></translation>
+ <translation>&Menüleiste</translation>
</message>
<message>
<source>&Menu Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Einstelungen...</translation>
</message>
<message>
<source>Opens window to configure menu-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Öffnet einen Dialog für die Konfiguration der Menüzeile</translation>
</message>
<message>
<source>Show Menu &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Zeigt die &Menüleiste</translation>
</message>
<message>
<source>Toggle menu-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Menüzeile für diese virtuelle Maschine ein-/ausschalten</translation>
</message>
<message>
<source>&Status Bar</source>
- <translation type="unfinished"></translation>
+ <translation>&Statusleiste</translation>
</message>
<message>
<source>&Status Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Einstellungen für Statusleiste...</translation>
</message>
<message>
<source>Opens window to configure status-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Öffnet ein Fenster zum Konfigurieren der Statuszeile</translation>
</message>
<message>
<source>Show Status &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Zeige &Statuszeile</translation>
</message>
<message>
<source>Toggle status-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Statuszeile für diese virtuelle Maschine ein-/ausschalten</translation>
</message>
<message>
<source>&Input</source>
- <translation type="unfinished"></translation>
+ <translation>&Eingabe</translation>
</message>
<message>
<source>&Keyboard</source>
- <translation type="unfinished"></translation>
+ <translation>&Tastatur</translation>
</message>
<message>
<source>&Keyboard Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Einstellungen für Tastatur...</translation>
</message>
<message>
<source>Display the global settings window to configure shortcuts</source>
- <translation type="unfinished"></translation>
+ <translation>Öffnet das Fenster zum Konfigurieren der Tastenkombinationen</translation>
</message>
<message>
<source>&Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>&Maus</translation>
</message>
<message>
<source>&Hard Drives</source>
- <translation type="unfinished"></translation>
+ <translation>&Festplatten</translation>
</message>
<message>
<source>&Hard Drive Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Einstellungen für Festplatten...</translation>
</message>
<message>
<source>Change the settings of hard drives</source>
- <translation type="unfinished"></translation>
+ <translation>Einstellungen für Festplatten ändern</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished">Netzwerk</translation>
+ <translation>Netzwerk</translation>
</message>
<message>
<source>&USB Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Einstellungen für USB...</translation>
</message>
<message>
<source>Change the settings of USB devices</source>
- <translation type="unfinished"></translation>
+ <translation>Einstellungen für USB-Geräte ändern</translation>
</message>
<message>
<source>&Shared Folders</source>
- <translation type="unfinished"></translation>
+ <translation>&Gemeinsame Ordner</translation>
</message>
<message>
<source>Show &Log...</source>
<comment>debug action</comment>
- <translation type="unfinished">Zeige &Log...</translation>
+ <translation>Zeige &Log...</translation>
</message>
<message>
<source>E&xtra Data Manager...</source>
- <translation type="unfinished"></translation>
+ <translation>Manager für &Extradata...</translation>
</message>
<message>
<source>Display the Extra Data Manager window</source>
- <translation type="unfinished"></translation>
+ <translation>Zeigt den Manager für Extradata an</translation>
+ </message>
+ <message>
+ <source>&File</source>
+ <translation>&Datei</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation>&Fenster</translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation>&Minimieren</translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation>Minimiert das aktive Fenster</translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation>&Vollbildmodus</translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation>Wechselt zwischen normalem Modus und Vollbildmodus</translation>
+ </message>
+ <message>
+ <source>Seam&less Mode</source>
+ <translation>&Nahtloser Modus</translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation>&Skalierter Modus</translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation>Skalierungs&faktor</translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation>&Einfügen %1</translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation>Sendet %1 an die virtuelle Maschine</translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation>&Mauszeiger-Integration</translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation>Aktiviert die Mauszeiger-Integration</translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation>&Optische Laufwerke</translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation>&Diskettenlaufwerke</translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation>Drag und Drop</translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation>&Logging</translation>
+ </message>
+ <message>
+ <source>&Default Start</source>
+ <translation type="obsolete">&Normaler Start</translation>
+ </message>
+ <message>
+ <source>S&eparate Start</source>
+ <translation type="obsolete">&Abgekoppelter Start</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with detachable GUI</source>
+ <translation type="obsolete">Startet die virtuelle Maschine und erlaubt das Abkoppeln der GUI</translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation>&Normal starten</translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation>&Ohne GUI starten</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation>Startet die ausgewählten virtuellen Maschinen im Hintergrund</translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation>&Abkoppelbarer Start</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation>Startet die ausgewählten virtuellen Maschinen mit der Möglichkeit, diese im Hintergrund laufen zu lassen</translation>
</message>
</context>
<context>
@@ -831,12 +936,32 @@
<message>
<source>Enable</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>Aktivieren</translation>
</message>
<message>
<source>Resize to %1x%2</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>Ändern nach %1x%2</translation>
+ </message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation></translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation>%1 - Festplattenverschlüsselung</translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation>
+ <numerusform>Diese virtuelle Maschine ist passwortgeschützt. Bitte geben Sie das Passwort zum Entsperren ein.</numerusform>
+ <numerusform></numerusform>
+ </translation>
</message>
</context>
<context>
@@ -976,7 +1101,7 @@
<name>UIDnDDrag</name>
<message>
<source>Retrieving data ...</source>
- <translation type="unfinished"></translation>
+ <translation>Empfange Daten ...</translation>
</message>
</context>
<context>
@@ -1038,6 +1163,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation>Passwort</translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation>
+ <numerusform><nobr>Von der folgenden Festplatte benutzt:</nobr><br>%1</numerusform>
+ <numerusform><nobr>Von den folgenden % Festplatten benutzt:</nobr><br>%1</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIGChooserItemGroup</name>
<message>
<source><b>%1</b></source>
@@ -1170,11 +1321,6 @@
<translation>deaktiviert</translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation></translation>
- </message>
- <message>
<source>Controller</source>
<comment>details (audio)</comment>
<translation>Controller</translation>
@@ -1366,12 +1512,67 @@
<message>
<source>Minimal Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>minimale Virtualisierung</translation>
</message>
<message>
<source>Hyper-V Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V-Virtualisierung</translation>
+ </message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation>KVM-Paravirtualisierung</translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation>[DVD]</translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation>USB-Controller</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation>Skalierungsfaktor</translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation>Nicht skalierte HiDPI-Auflösung</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation>aktiviert</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation>Position der Mini-Toolbar</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>oben</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>unten</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation>Mini-Toolbar</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation>deaktiviert</translation>
</message>
</context>
<context>
@@ -1456,15 +1657,15 @@
</message>
<message>
<source>Machine Windows:</source>
- <translation type="unfinished"></translation>
+ <translation>VM-Fenster:</translation>
</message>
<message>
<source>If checked, machine windows will be raised when the mouse pointer moves over them.</source>
- <translation type="unfinished"></translation>
+ <translation>Holt das Fenster der virtuellen Maschine unter der Maus hervor, wenn der Mauszeiger über das Fenster fährt.</translation>
</message>
<message>
<source>&Raise Window Under Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>&Fenster unter Mauszeiger hervorholen</translation>
</message>
</context>
<context>
@@ -1530,15 +1731,15 @@
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>&Dock und Menübar:</translation>
+ <translation type="obsolete">&Dock und Menübar:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>Automatisch im Vollbildmodus</translation>
+ <translation type="obsolete">Automatisch im Vollbildmodus</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>Das Host-Dock und die Menüleiste wird gezeigt, wenn sich die VM im Vollbildmodus befindet.</translation>
+ <translation type="obsolete">Das Host-Dock und die Menüleiste wird gezeigt, wenn sich die VM im Vollbildmodus befindet.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -2283,12 +2484,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Zeigt die Aktivität der CD/DVD-Laufwerke:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Zeigt die Aktivität der CD/DVD-Laufwerke:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Zeigt die Aktivität der Diskettenlaufwerke:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Zeigt die Aktivität der Diskettenlaufwerke:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -2372,7 +2573,17 @@
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
- <translation type="unfinished"></translation>
+ <translation><p style='white-space:pre'><nobr>Zeigt die Aktivität der Gastanzeige:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Zeigt die optischen Laufwerke:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Zeigt die Aktivität der Diskettenlaufwerke:</nobr>%1</p></translation>
</message>
</context>
<context>
@@ -2406,19 +2617,19 @@
</message>
<message>
<source>No Webcams Connected</source>
- <translation type="unfinished"></translation>
+ <translation>Keine Webcam angeschlossen</translation>
</message>
<message>
<source>No supported webcams connected to the host PC</source>
- <translation type="unfinished"></translation>
+ <translation>Keine unterstützen Webcams am PC angeschlossen</translation>
</message>
<message>
<source>Connect Network Adapter</source>
- <translation type="unfinished"></translation>
+ <translation>Netzwerkadapter verbinden</translation>
</message>
<message>
<source>Connect Network Adapter %1</source>
- <translation type="unfinished"></translation>
+ <translation>Netzwerkadapter %1 verbinden</translation>
</message>
</context>
<context>
@@ -2620,7 +2831,7 @@
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>In den Video-Einstellungen wurde hardwarebeschleunigtes 3D aktiviert, und der Typ des Gastes wurde als Windows Vista oder später eingestellt. Für beste Performance sollte der Grafikspeicher auf mindestens <b>%1</b> eingestellt werden.</translation>
+ <translation type="obsolete">In den Video-Einstellungen wurde hardwarebeschleunigtes 3D aktiviert, und der Typ des Gastes wurde als Windows Vista oder später eingestellt. Für beste Performance sollte der Grafikspeicher auf mindestens <b>%1</b> eingestellt werden.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -2674,44 +2885,36 @@
<translation>Videoaufzeichnung für Bildschirm %1 aktivieren.</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Mini-Toolbar:</translation>
+ <translation type="obsolete">Mini-Toolbar:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Falls aktiviert wird die Mini-Toolbar im Vollbildmodus und im nahtlosen Modus gezeigt.</translation>
+ <translation type="obsolete">Falls aktiviert wird die Mini-Toolbar im Vollbildmodus und im nahtlosen Modus gezeigt.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">im &Vollbild-/Seamless-Modus zeigen</translation>
+ <translation type="obsolete">im &Vollbild-/Seamless-Modus zeigen</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Zeigt die Mini-Toolbar am oberen Rand des Bildschirms wenn ausgewählt, sonst am unteren Rand.</translation>
+ <translation type="obsolete">Zeigt die Mini-Toolbar am oberen Rand des Bildschirms wenn ausgewählt, sonst am unteren Rand.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">am &oberen Bildschirmrand zeigen</translation>
+ <translation type="obsolete">am &oberen Bildschirmrand zeigen</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
- <translation type="unfinished"></translation>
+ <source><i>About %1MB per 5 minute video</i></source>
+ <translation><i>Ungefährt %1 MB pro Videominute</i></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
- <translation type="unfinished"></translation>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <translation>Die Fernsteuerung wurde für diese virtuelle Maschine aktiviert. Dafür ist allerdings die Installation des <i>%1</i> notwendig. Bitte installieren Sie dieses Zusatzpaket von der VirtualBox-Webseite oder ihre VM wird ohne Fernsteuerung gestartet.</translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
- <translation type="unfinished"></translation>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
+ <translation>In den Video-Einstellungen wurde hardwarebeschleunigtes 3D aktiviert, und der Typ des Gastes wurde als Windows Vista oder später eingestellt. Für beste Performance sollte der Grafikspeicher auf mindestens <b>%1</b> eingestellt werden.</translation>
</message>
</context>
<context>
@@ -2796,6 +2999,126 @@
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation>Der Typ des Gastsystems erlaubt 64-Bit-Gäste. Dafür wird Hardware-Virtualisierung benötigt. Diese Einstellung wird daher beim Bestätigen automatisch aktiviert.</translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation>&Verschlüsselung</translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation>Aktiviert Verschlüsselung für diese virtuelle Maschine.</translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation>&Verschlüsselung aktivieren</translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation>Verschlüsselungs-C&hiffre:</translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation>Chiffre, die zur Verschlüsselung der virtuellen Festplatten benutzt wird.</translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation>Neues Passwort &eingeben:</translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation>Passwort für diese virtuelle Maschine.</translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation>Neues Passwort &bestätigen:</translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation>Bestätigt das Passwort für diese virtuelle Maschine.</translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation>Sie möchten diese virtuelle Maschine verschlüsseln. Diese Funktion benötigt die Installation des <i>%1</i>. Bitte installieren Sie dieses Zusatzpaket von der VirtualBox-Webseite.</translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation>Verschlüsselungs-Chiffre nicht ausgewählt.</translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation>Verschlüsselungspasswort nicht gesetzt.</translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation>Verschlüsselungspasswörter stimmen nicht überein.</translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation>nicht verändern</translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation>Ändern der Menüzeile des VM-Fensters.</translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation>Skalierungsfaktor:</translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation>Verhindert die Skalierung des Gast-Bildschirminhaltes, die normalerweise für die Anpassung an hohe Auflösung des Host-Bildschirmes vorgenommen wird.</translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation>&Nicht-skalierte HiDPI-Ausgabe</translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation>Mini-Toolbar:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation>Falls aktiviert wird die Mini-Toolbar im Vollbildmodus und im nahtlosen Modus gezeigt.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation>im &Vollbild-/Seamless-Modus zeigen</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation>Zeigt die Mini-Toolbar am oberen Rand des Bildschirms wenn ausgewählt, sonst am unteren Rand.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation>am &oberen Bildschirmrand zeigen</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation>Ändern der Statuszeile des VM-Fensters.</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -3198,19 +3521,19 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Wenn diese Box ausgewählt wurde, dann wird die Pipe im <b>Portpfad</b> von der virtuellen Maschine erzeugt, wenn diese startet. Anderenfalls versucht die virtuelle Maschine, sich an eine vorhandene Pipe zu anzuschließen.</translation>
+ <translation type="obsolete">Wenn diese Box ausgewählt wurde, dann wird die Pipe im <b>Portpfad</b> von der virtuellen Maschine erzeugt, wenn diese startet. Anderenfalls versucht die virtuelle Maschine, sich an eine vorhandene Pipe zu anzuschließen.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>Erzeuge &Pipe</translation>
+ <translation type="obsolete">Erzeuge &Pipe</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Zeigt den Pfad zur seriellen Port-Pipe des Hostes wenn der Port im Modus <b>Host-Pipe</b> arbeitet oder den Namen der seriellen Schnittstelle des Hostes im Modus <b>Host-Schnittstelle</b>.</translation>
+ <translation type="obsolete">Zeigt den Pfad zur seriellen Port-Pipe des Hostes wenn der Port im Modus <b>Host-Pipe</b> arbeitet oder den Namen der seriellen Schnittstelle des Hostes im Modus <b>Host-Schnittstelle</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Port/Datei-&Pfad:</translation>
+ <translation type="obsolete">Port/Datei-&Pfad:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -3220,6 +3543,22 @@
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Zeigt die Basis-Portadresse dieser seriellen Schnittstelle. Zulässige Werte sind ganze Zahlen im Bereich von <tt>0</tt> bis <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation>Mit Pipe/Socket &verbinden</translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation>&Pfad/Adresse:</translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -3260,11 +3599,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>CD/DVD-Laufwerk hinzufügen</nobr></translation>
+ <translation type="obsolete"><nobr>CD/DVD-Laufwerk hinzufügen</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Diskettenlaufwerk hinzufügen</nobr></translation>
+ <translation type="obsolete"><nobr>Diskettenlaufwerk hinzufügen</nobr></translation>
</message>
<message>
<source>Add Controller</source>
@@ -3300,11 +3639,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>CD/DVD-Laufwerk hinzufügen</translation>
+ <translation type="obsolete">CD/DVD-Laufwerk hinzufügen</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Diskettenlaufwerk hinzufügen</translation>
+ <translation type="obsolete">Diskettenlaufwerk hinzufügen</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -3436,15 +3775,15 @@
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD-&Laufwerk:</translation>
+ <translation type="obsolete">CD/DVD-&Laufwerk:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Wählen Sie ein virtuelles CD/DVD-Abbild oder ein physisches Laufwerk am Host aus. Der Gast kann auf diese Daten als Medium im virtuellen Laufwerk zugreifen.</translation>
+ <translation type="obsolete">Wählen Sie ein virtuelles CD/DVD-Abbild oder ein physisches Laufwerk am Host aus. Der Gast kann auf diese Daten als Medium im virtuellen Laufwerk zugreifen.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Virtuelles CD/DVD-Laufwerk aufsetzen</translation>
+ <translation type="obsolete">Virtuelles CD/DVD-Laufwerk aufsetzen</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -3468,7 +3807,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Datei für virtuelles CD/DVD-Medium auswählen...</translation>
+ <translation type="obsolete">Datei für virtuelles CD/DVD-Medium auswählen...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -3542,7 +3881,7 @@
</message>
<message>
<source>Add USB Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB-Controller hinzufügen</translation>
</message>
<message>
<source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
@@ -3550,7 +3889,39 @@
</message>
<message>
<source>&Hot-pluggable</source>
- <translation type="unfinished"></translation>
+ <translation>&Hotplug-fähig</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation>Wählen Sie ein virtuelles optisches Medium...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation><nobr>Optisches Laufwerk hinzufügen</nobr></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation><nobr>Floppy-Laufwerk hinzufügen</nobr></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation>Optisches Laufwerk hinzufügen</translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation>Diskettenlaufwerk hinzufügen</translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation>&Optisches Laufwerk:</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation>Wählen Sie ein virtuelles Abbild eines optischen Mediums oder ein physisches Laufwerk am Host aus. Der Gast kann auf diese Daten als Medium im virtuellen Laufwerk zugreifen.</translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation>Virtuelles optisches Laufwerk aufsetzen</translation>
</message>
</context>
<context>
@@ -3753,27 +4124,27 @@
</message>
<message>
<source>&Paravirtualization Interface:</source>
- <translation type="unfinished"></translation>
+ <translation>&Paravirtualisierung:</translation>
</message>
<message>
<source>Selects the paravirtualization guest interface provider to be used by this virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Wählt die Art der Paravirtualisierung für diese virtuelle Maschine aus.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9 you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Der I/O-APIC wurde in den System-Einstellungen nicht aktiviert. Der ICH9-Chipsatz erfordert die Emulation von I/O-APICs. Diese Einstellung wird daher beim Bestätigen automatisch aktiviert.</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Die USB-Controller-Emulation wurde nicht aktiviert. Ein USB-Controller wird für das USB-Zeigergerät benötigt. Diese Einstellung wird daher beim Bestätigen automatisch aktiviert.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Der I/O-APIC ist in den Systemeinstellungen deaktiviert. Für Multi-CPU-Gäste ist ein I/O-APIC erforderlich. Diese Einstellung wird daher beim Bestätigen automatisch aktiviert.</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Hardware-Virtualisierung ist in den Systemeinstellungen deaktiviert. Für Multi-CPU-Gäste muss diese Einstellung aber aktiviert sein. Diese Einstellung wird daher beim Bestätigen automatisch aktiviert.</translation>
</message>
</context>
<context>
@@ -3901,7 +4272,7 @@
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>USB-2.0-Unterstützung wurde für diese virtuelle Maschine aktiviert. Dafür ist allerdings die Installation des <b>%1</b> notwendig. Bitte installieren Sie dieses Zusatzpaket von der VirtualBox-Webseite oder deaktivieren Sie die USB-2.0-Unterstützung zum Starten der Maschine.</translation>
+ <translation type="obsolete">USB-2.0-Unterstützung wurde für diese virtuelle Maschine aktiviert. Dafür ist allerdings die Installation des <b>%1</b> notwendig. Bitte installieren Sie dieses Zusatzpaket von der VirtualBox-Webseite oder deaktivieren Sie die USB-2.0-Unterstützung zum Starten der Maschine.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
@@ -3909,19 +4280,23 @@
</message>
<message>
<source>USB &1.1 (OHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB-&1.1-Controller (OHCI)</translation>
</message>
<message>
<source>USB &2.0 (EHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB-&2.0-Controller (EHCI)</translation>
</message>
<message>
<source>When checked, enables the virtual USB xHCI controller of this machine. The USB xHCI controller provides USB 3.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>Aktiviert den virtuellen xHCI-USB-Controller. Dieser implementiert Unterstützung für USB-3.0-Geräte.</translation>
</message>
<message>
<source>USB &3.0 (xHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB-&3.0-Controller (xHCI)</translation>
+ </message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation>USB-2.0/3.0-Unterstützung wurde für diese virtuelle Maschine aktiviert. Dafür ist allerdings die Installation des <i>%1</i> notwendig. Bitte installieren Sie dieses Zusatzpaket von der VirtualBox-Webseite oder deaktivieren Sie die USB-2.0/3.0-Unterstützung zum Starten der Maschine.</translation>
</message>
</context>
<context>
@@ -4052,7 +4427,7 @@
</message>
<message>
<source>Removing medium...</source>
- <translation type="unfinished"></translation>
+ <translation>Entferne Medium...</translation>
</message>
</context>
<context>
@@ -4074,15 +4449,23 @@
<name>UIMenuBarEditorWidget</name>
<message>
<source>Virtual Screen Resize</source>
- <translation type="unfinished"></translation>
+ <translation>Größe virtueller Bildschirme</translation>
</message>
<message>
<source>Virtual Screen Mapping</source>
- <translation type="unfinished"></translation>
+ <translation>Zuordnungen virtueller Bildschirme</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Schließen</translation>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Switch</source>
+ <translation>Einschalten</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation>Menüzeile anzeigen</translation>
</message>
</context>
<context>
@@ -4135,7 +4518,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Das COM-Objekt für VirtualBox konnte nicht erzeugt werden.</p><p>Die Anwendung wird nun beendet.</p></translation>
+ <translation type="obsolete"><p>Das COM-Objekt für VirtualBox konnte nicht erzeugt werden.</p><p>Die Anwendung wird nun beendet.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -4377,7 +4760,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Eine neue Version von VirtualBox ist verfügbar! Version <b>%1</b> ist auf <a href="http://www.virtualbox.org/">virtualbox.org</a> verfügbar.</p><p>Sie können diese Version von der folgenden Adresse herunterladen:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Eine neue Version von VirtualBox ist verfügbar! Version <b>%1</b> ist auf <a href="http://www.virtualbox.org/">virtualbox.org</a> verfügbar.</p><p>Sie können diese Version von der folgenden Adresse herunterladen:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source>Release</source>
@@ -4421,11 +4804,11 @@
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Eine oder mehrere virtuelle Festplatten, CD/DVDs oder Diskettenmedien sind momentan nicht zugreifbar. Virtuelle Maschinen, die diese Medien benutzen, können so lange nicht benutzt werden, bis die Medien wieder zugreifbar werden.</p><p>Wählen Sie <b>Überprüfen</b> um den Manager für virtuelle Medien zu öffnen oder wählen Sie <b>Ignorieren</b>, um dieses Problem zu ignorieren.</p></translation>
+ <translation type="obsolete"><p>Eine oder mehrere virtuelle Festplatten, CD/DVDs oder Diskettenmedien sind momentan nicht zugreifbar. Virtuelle Maschinen, die diese Medien benutzen, können so lange nicht benutzt werden, bis die Medien wieder zugreifbar werden.</p><p>Wählen Sie <b>Überprüfen</b> um den Manager für virtuelle Medien zu öffnen oder wählen Sie <b>Ignorieren</b>, um dieses Problem zu ignorieren.</p></translation>
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Ein schwerwiegender Fehler ist aufgetreten, und die Ausführung der virtuellen Maschine wurde unterbrochen.</p><p>Zusätzliche Informationen zu diesem Fehler suchen Sie bitte in der Community-Sektion auf <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> bzw. handeln Sie gemäß Ihres Supportvertrages. Bitte geben Sie die Logdatei <tt>VBox.log</tt>, den Screenshot <tt>VBox.png</tt>, den Sie im Verzeich [...]
+ <translation type="obsolete"><p>Ein schwerwiegender Fehler ist aufgetreten, und die Ausführung der virtuellen Maschine wurde unterbrochen.</p><p>Zusätzliche Informationen zu diesem Fehler suchen Sie bitte in der Community-Sektion auf <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> bzw. handeln Sie gemäß Ihres Supportvertrages. Bitte geben Sie die Logdatei <tt>VBox.log</tt>, den Screenshot <tt>VBox.png</tt>, den [...]
</message>
<message>
<source>You are trying to shut down the guest with the ACPI power button. This is currently not possible because the guest does not support software shutdown.</source>
@@ -4509,7 +4892,7 @@
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Möchten Sie wirklich das CD/DVD-Laufwerk löschen?</p><p>Ohne CD/DVD-Laufwerk können Sie keine CDs oder CD-Abbilder einbinden und die Gast-Erweiterungen nicht installieren!</p></translation>
+ <translation type="obsolete"><p>Möchten Sie wirklich das CD/DVD-Laufwerk löschen?</p><p>Ohne CD/DVD-Laufwerk können Sie keine CDs oder CD-Abbilder einbinden und die Gast-Erweiterungen nicht installieren!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -4570,7 +4953,7 @@
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Sie sind dabei, ein neues CD/DVD-Gerät an den Controller <b>%1</b> anzuschließen.</p><p>Möchten Sie ein Medium an das Laufwerk binden oder soll das Laufwerk jetzt kein Medium enthalten?</p></translation>
+ <translation type="obsolete"><p>Sie sind dabei, ein neues CD/DVD-Gerät an den Controller <b>%1</b> anzuschließen.</p><p>Möchten Sie ein Medium an das Laufwerk binden oder soll das Laufwerk jetzt kein Medium enthalten?</p></translation>
</message>
<message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
@@ -4598,11 +4981,11 @@
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Das CD/DVD-Laufwerk <nobr><b>%1</b></nobr> konnte nicht vom Slot <i>%2</i> der VM <b>%3</b> entfernt werden.</translation>
+ <translation type="obsolete">Das CD/DVD-Laufwerk <nobr><b>%1</b></nobr> konnte nicht vom Slot <i>%2</i> der VM <b>%3</b> entfernt werden.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Das Diskettenlaufwerk <nobr><b>%1</b></nobr> konnte nicht vom Slot <i>%2</i> der VM <b>%3</b> entfernt werden.</translation>
+ <translation type="obsolete">Das Diskettenlaufwerk <nobr><b>%1</b></nobr> konnte nicht vom Slot <i>%2</i> der VM <b>%3</b> entfernt werden.</translation>
</message>
<message>
<source>Failed to attach the hard disk (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
@@ -4610,11 +4993,11 @@
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Das CD/DVD-Laufwerk <nobr><b>%1</b></nobr> konnte nicht an den Slot <i>%2</i> der VM <b>%3</b> gebunden werden.</translation>
+ <translation type="obsolete">Das CD/DVD-Laufwerk <nobr><b>%1</b></nobr> konnte nicht an den Slot <i>%2</i> der VM <b>%3</b> gebunden werden.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Das Diskettenlaufwerk <nobr><b>%1</b></nobr> konnte nicht an den Slot <i>%2</i> der VM <b>%3</b> gebunden werden.</translation>
+ <translation type="obsolete">Das Diskettenlaufwerk <nobr><b>%1</b></nobr> konnte nicht an den Slot <i>%2</i> der VM <b>%3</b> gebunden werden.</translation>
</message>
<message>
<source>Failed to open the Extension Pack <b>%1</b>.</source>
@@ -4813,7 +5196,7 @@
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Daten konnten nicht kopiert werden.</translation>
+ <translation type="obsolete">Daten konnten nicht kopiert werden.</translation>
</message>
<message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
@@ -5041,11 +5424,11 @@
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p>Das CD-Abbild mit den <b>VirtualBox-Gasterweiterungen</b> wurde erfolgreich von <nobr><a href="%1">%1</a></nobr> heruntergeladen und auf der lokalen Festplatte unter <nobr><b>%2</b></nobr>gespeichert.</p><p>Möchten Sie dieses Abbild in VirtualBox registrieren und in das virtuelle CD/DVD-Laufwerk einlegen?</p></translation>
+ <translation type="obsolete"><p>Das CD-Abbild mit den <b>VirtualBox-Gasterweiterungen</b> wurde erfolgreich von <nobr><a href="%1">%1</a></nobr> heruntergeladen und auf der lokalen Festplatte unter <nobr><b>%2</b></nobr>gespeichert.</p><p>Möchten Sie dieses Abbild in VirtualBox registrieren und in das virtuelle CD/DVD-Laufwerk einlegen?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>Das virtuelle Medium mit den <b>VirtualBox-Gasterweiterungen</b> konnte in kein Laufwerk der virtuellen Machine <b>%1</b> eingelegt werden, da diese keine CD/DVD-Laufwerke besitzt. Bitte fügen Sie ein solches Laufwerk in den Einstellungen zu Massenspeichern ein.</p></translation>
+ <translation type="obsolete"><p>Das virtuelle Medium mit den <b>VirtualBox-Gasterweiterungen</b> konnte in kein Laufwerk der virtuellen Machine <b>%1</b> eingelegt werden, da diese keine CD/DVD-Laufwerke besitzt. Bitte fügen Sie ein solches Laufwerk in den Einstellungen zu Massenspeichern ein.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
@@ -5085,20 +5468,20 @@
</message>
<message>
<source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Webcam <b>%1</b> konnte nicht an die virtuelle Maschine <b>%2</b> angeschlossen werden.</translation>
</message>
<message>
<source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Die Webcam <b>%1</b> konnte nicht von der virtuellen Maschine <b>%2</b> getrennt werden.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"></translation>
+ <translation><p>Die VirtualBox-Gasterweiterungen sind anscheinend für diese VM nicht verfügbar, sind aber Vorrausetzung für Gemeinsame Ordner. Um diesen Dienst zu nutzen müssen Sie daher die Gasterweiterungen installieren oder diese, falls sie nicht richtig funktionieren, neu installieren. Dies können Sie durch Auswahl von <b>Gasterweiterungen einlegen...</b> im Menü <b>Geräte</b> erreichen. Beachten Sie, dass Gemeinsame Ordner erst benutzt werden kö [...]
</message>
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished"></translation>
+ <translation>Einlegen</translation>
</message>
<message>
<source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
@@ -5112,6 +5495,98 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation><p>Das COM-Objekt für VirtualBox konnte nicht erzeugt werden.</p><p>Die Anwendung wird nun beendet.</p></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation>Der Extradata-Schlüssel <i>%1</i> der Maschine <i>%2</i> konnte nicht auf den Wert <i>{%3}</i> gesetzt werden.</translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation><p>Eine oder mehrere virtuelle Festplatten, optische Medien oder Diskettenmedien sind momentan nicht zugreifbar. Virtuelle Maschinen, die diese Medien benutzen, können so lange nicht benutzt werden, bis die Medien wieder zugreifbar werden.</p><p>Wählen Sie <b>Überprüfen</b> um den Manager für virtuelle Medien zu öffnen oder wählen Sie <b>Ignorieren</b>, um dieses Problem zu ignorieren.</p></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation>Die Einstellungen konnten nicht gesichert werden.</translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation><p>Sie sind dabei, ein neues optisches Laufwerk an den Controller <b>%1</b> anzuschließen.</p><p>Möchten Sie ein virtuelle Medium in das Laufwerk einlegen oder soll das Laufwerk jetzt kein Medium enthalten?</p></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation><p>Möchten Sie wirklich das optische Laufwerk löschen?</p><p>Ohne optisches Laufwerk können Sie keine CDs oder CD-Abbilder einbinden und die Gast-Erweiterungen nicht installieren!</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Das optische Laufwerk <nobr><b>%1</b></nobr> konnte nicht an den Slot <i>%2</i> der VM <b>%3</b> angeschlossen werden.</translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Das Diskettenlaufwerk (<nobr><b>%1</b></nobr>) konnte nicht an den Slot <i>%2</i> der VM <b>%3</b> angeschlossen werden.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Das optische Laufwerk <nobr><b>%1</b></nobr> konnte nicht vom Slot <i>%2</i> der VM <b>%3</b> entfernt werden.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Das Diskettenlaufwerk (<nobr><b>%1</b></nobr>) konnte nicht vom Slot <i>%2</i> der VM <b>%3</b> entfernt werden.</translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>Die virtuelle Maschine <b>%1</b> konnte nicht an das virtuelle Netzwerkkabel angeschlossen werden.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>Die virtuelle Maschine <b>%1</b> konnte nicht vom virtuellen Netzwerkkabel getrennt werden.</translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to enter password!</source>
+ <translation type="obsolete">Das Passwort konnte nicht eingegeben werden!</translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation><p>Das CD-Abbild mit den <b>VirtualBox-Gasterweiterungen</b> wurde erfolgreich von <nobr><a href="%1">%1</a></nobr> heruntergeladen und auf der lokalen Festplatte unter <nobr><b>%2</b></nobr>gespeichert.</p><p>Möchten Sie dieses Abbild in VirtualBox registrieren und in das virtuelle optische Laufwerk einlegen?</p></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation>Falsches Passwort und/oder Anmeldung nicht möglich.</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation><p>Ein schwerwiegender Fehler ist aufgetreten, und die Ausführung der virtuellen Maschine wurde unterbrochen.</p><p>Zusätzliche Informationen zu diesem Fehler suchen Sie bitte in der Community-Sektion auf <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> bzw. handeln Sie gemäß Ihres Supportvertrages. Bitte geben Sie die Logdatei <tt>VBox.log</tt>, den Screenshot <tt>VBox.png</tt>, den Sie im Verzei [...]
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation><p>Ein schwerwiegender Fehler ist aufgetreten, und die Ausführung der virtuellen Maschine wurde unterbrochen.</p><p>Zusätzliche Informationen zu diesem Fehler suchen Sie bitte in der Community-Sektion auf <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> bzw. handeln Sie gemäß Ihres Supportvertrages. Bitte geben Sie die Logdatei <tt>VBox.log</tt> sowie eine Beschreibung der Maßnahmen, die zu diesem Fehler führ [...]
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation><p>Eine neue Version von VirtualBox ist verfügbar! Version <b>%1</b> ist auf <a href="https://www.virtualbox.org/">virtualbox.org</a> verfügbar.</p><p>Sie können diese Version von der folgenden Adresse herunterladen:</p><p><a href=%2>%3</a></p></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation>Die Drag-und-Drop-Operation vom Host zum Gast ist fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation>Die Drag-und-Drop-Operation kann nicht abgebrochen werden.</translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation>Die Drag-und-Drop-Operation vom Gast zum Host ist fehlgeschlagen.</translation>
+ </message>
</context>
<context>
<name>UIMiniToolBar</name>
@@ -5335,13 +5810,17 @@
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Willkommen zu VirtualBox!</h3><p>Der linke Teil dieses Fensters zeigt eine Liste aller virtuellen Maschinen auf Ihrem Computer. Diese Liste ist momentan leer, da Sie noch keine virtuelle Maschine erstellt haben.<img src=:/welcome.png align=right/></p><p>Um eine virtuelle Maschine anzulegen, wählen Sie <b>Neu</b> in der Symbolleiste am oberen Rand des Fensters.</p><p>Die Taste <b>%1</b> öffnet [...]
+ <translation type="obsolete"><h3>Willkommen zu VirtualBox!</h3><p>Der linke Teil dieses Fensters zeigt eine Liste aller virtuellen Maschinen auf Ihrem Computer. Diese Liste ist momentan leer, da Sie noch keine virtuelle Maschine erstellt haben.<img src=:/welcome.png align=right/></p><p>Um eine virtuelle Maschine anzulegen, wählen Sie <b>Neu</b> in der Symbolleiste am oberen Rand des Fensters.</p><p>Die Taste <b>%1& [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Manager</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation><h3>Willkommen zu VirtualBox!</h3><p>Der linke Teil dieses Fensters zeigt eine Liste aller virtuellen Maschinen auf Ihrem Computer. Diese Liste ist momentan leer, da Sie noch keine virtuelle Maschine erstellt haben.<img src=:/welcome.png align=right/></p><p>Um eine virtuelle Maschine anzulegen, wählen Sie <b>Neu</b> in der Symbolleiste am oberen Rand des Fensters.</p><p>Die Taste <b>%1</b> öffnet [...]
+ </message>
</context>
<context>
<name>UISession</name>
@@ -5358,7 +5837,7 @@
</message>
<message>
<source>Settings</source>
- <translation>Ändern</translation>
+ <translation type="obsolete">Ändern</translation>
</message>
<message>
<source><i>Select a settings category from the list on the left-hand side and move the mouse over a settings item to get more information.</i></source>
@@ -5411,6 +5890,10 @@
<source>Display</source>
<translation>Anzeige</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation>Einstellungen</translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -5462,6 +5945,25 @@
<source>%1 - %2</source>
<translation></translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation>Benutzerschnittstelle</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Einstellungen</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation>Einstellungen laden...</translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation>Einstellungen sichern...</translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -5474,7 +5976,11 @@
<name>UIStatusBarEditorWidget</name>
<message>
<source>Close</source>
- <translation type="unfinished">Schließen</translation>
+ <translation>Schließen</translation>
+ </message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation>Statusleiste anzeigen</translation>
</message>
</context>
<context>
@@ -5602,11 +6108,11 @@
</message>
<message>
<source>&Continue running in the background</source>
- <translation type="unfinished"></translation>
+ <translation>die virtuelle Maschine im Hintergrund &weiterlaufen lassen</translation>
</message>
<message>
<source><p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Schließt das Fenster der virtuellen Maschine, beendet aber die virtuelle Maschine nicht.</p><p>Sie können sich mit Hilfe des VirtualBox-Managers wieder mit der virtuellen Maschine verbinden.</p></translation>
</message>
</context>
<context>
@@ -5670,7 +6176,7 @@
</message>
<message>
<source>Guest Additions</source>
- <translation>Gast-Erweiterungen</translation>
+ <translation>Gasterweiterungen</translation>
</message>
<message>
<source>Guest OS Type</source>
@@ -5703,7 +6209,7 @@
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Drag'n'Drop</translation>
+ <translation type="obsolete">Drag'n'Drop</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -5715,7 +6221,11 @@
</message>
<message>
<source>VM Uptime</source>
- <translation type="unfinished"></translation>
+ <translation>VM-Laufzeit</translation>
+ </message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation>Drag-und-Drop-Modus</translation>
</message>
</context>
<context>
@@ -5814,19 +6324,19 @@
</message>
<message>
<source>&Expert Mode</source>
- <translation type="unfinished"></translation>
+ <translation>&Expert-Modus</translation>
</message>
<message>
<source>Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users.</source>
- <translation type="unfinished"></translation>
+ <translation>Schaltet in den <nobr><b>Experten-Modus</b></nobr>, ein übersichtlicher Dialog für erfahrene Benutzer.</translation>
</message>
<message>
<source>&Guided Mode</source>
- <translation type="unfinished"></translation>
+ <translation>&Geführter Modus</translation>
</message>
<message>
<source>Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations.</source>
- <translation type="unfinished"></translation>
+ <translation>Schaltet in den <nobr><b>geführten Modus</b></nobr> mit Schritt-für-Schritt-Dialogen mit ausführlichen Erklärungen.</translation>
</message>
</context>
<context>
@@ -6491,7 +7001,7 @@
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished"></translation>
+ <translation>Der Standardpfad wird nach Bestätigen der Änderungen und erneutes Öffnen dieses Dialogs angezeigt.</translation>
</message>
</context>
<context>
@@ -6694,7 +7204,7 @@
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -7268,17 +7778,17 @@
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Diese Festplatte wird indirekt mittels einer neu erzeugten Differenzdatei angeschlossen.</translation>
+ <translation type="obsolete">Diese Festplatte wird indirekt mittels einer neu erzeugten Differenzdatei angeschlossen.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Einige der zu dieser virtuellen Festplatte gehörigen Dateien sind nicht zugreifbar. Bitte verwenden Sie den Manager für virtuelle Medien im Modus <b>Zeige Differenz-Abbilder</b> um diese Dateien anzuzeigen.</translation>
+ <translation type="obsolete">Einige der zu dieser virtuellen Festplatte gehörigen Dateien sind nicht zugreifbar. Bitte verwenden Sie den Manager für virtuelle Medien im Modus <b>Zeige Differenz-Abbilder</b> um diese Dateien anzuzeigen.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Diese Basisfestplatte ist indirekt über die folgenden Differenzfestplatten eingebunden:</translation>
+ <translation type="obsolete">Diese Basisfestplatte ist indirekt über die folgenden Differenzfestplatten eingebunden:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -7324,7 +7834,7 @@
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -7768,12 +8278,12 @@
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>aktiviert</translation>
+ <translation type="obsolete">aktiviert</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>deaktiviert</translation>
+ <translation type="obsolete">deaktiviert</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -7826,53 +8336,152 @@
<message>
<source>USB</source>
<comment>StorageControllerType</comment>
- <translation type="unfinished">USB</translation>
+ <translation>USB</translation>
</message>
<message>
<source>USB Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished"></translation>
+ <translation>USB Port %1</translation>
</message>
<message>
<source>off</source>
<comment>guest monitor status</comment>
- <translation type="unfinished"></translation>
+ <translation>aus</translation>
</message>
<message>
<source>Paravirtualization Interface</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Paravirtualisierung</translation>
</message>
<message>
<source>None</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>kein</translation>
</message>
<message>
<source>Default</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished">Voreingestellt</translation>
+ <translation>voreingestellt</translation>
</message>
<message>
<source>Legacy</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>legacy</translation>
</message>
<message>
<source>Minimal</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>minimal</translation>
</message>
<message>
<source>Hyper-V</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V</translation>
</message>
<message>
<source>New dynamically allocated storage</source>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>inaktiv</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>inaktiv</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>inaktiv</translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Erstelle Sicherungspunkt</translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Erstelle Online-Sicherungspunkt</translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation>DVD</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation>Benutzerschnittstelle</translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation>(opt. Laufwerk)</translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation>Diese Festplatte wird indirekt mittels einer neu erzeugten Differenzdatei angeschlossen.</translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation>Einige der zu dieser virtuellen Festplatte gehörigen Dateien sind nicht zugreifbar. Bitte verwenden Sie den Manager für virtuelle Medien um diese Dateien anzuzeigen.</translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation>Diese Basisfestplatte ist indirekt über die folgenden Differenzfestplatten eingebunden:</translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation>verschlüsselt</translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -8003,6 +8612,10 @@
<source>Modify the attributes of the selected disk image file</source>
<translation>Ändert die Attribute des ausgewählten Mediums</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation></translation>
+ </message>
</context>
<context>
<name>VBoxScreenshotViewer</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts
index f41ae21..95cdafb 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_en.ts
@@ -17,11 +17,19 @@
<message numerus="yes">
<source>Used by the following %n hard drive(s):<br>%1</source>
<comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
- <translation type="unfinished">
+ <translation type="obsolete">
<numerusform>Used by the following hard drive:<br>%1</numerusform>
<numerusform>Used by the following hard drives:<br>%1</numerusform>
</translation>
</message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIGChooserItemGroup</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
index 2a0be67..6c4a29b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts
@@ -315,7 +315,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Modo f&luído</translation>
+ <translation type="unfinished">Modo f&luído</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -339,11 +339,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Inhabilitar integración del &ratón</translation>
+ <translation type="obsolete">Inhabilitar integración del &ratón</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Inhabilita temporalmente la integración el ratón del sistema anfitrión</translation>
+ <translation type="obsolete">Inhabilita temporalmente la integración el ratón del sistema anfitrión</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -355,11 +355,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Insertar Ctrl-Alt-Supr</translation>
+ <translation type="obsolete">&Insertar Ctrl-Alt-Supr</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Enviar la secuencia Ctrl-Alt-Supr a la máquina virtual</translation>
+ <translation type="obsolete">Enviar la secuencia Ctrl-Alt-Supr a la máquina virtual</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -367,7 +367,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Enviar la secuencia Ctrl-Alt-Retroceso a la máquina virtual</translation>
+ <translation type="obsolete">Enviar la secuencia Ctrl-Alt-Retroceso a la máquina virtual</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -435,15 +435,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Dispositivos &CD/DVD</translation>
+ <translation type="obsolete">Dispositivos &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Dispositivos de &disquete</translation>
+ <translation type="obsolete">Dispositivos de &disquete</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Dispositivos &USB</translation>
+ <translation type="obsolete">Dispositivos &USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -494,7 +494,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>&Trazas...</translation>
+ <translation type="obsolete">&Trazas...</translation>
</message>
<message>
<source>&Help</source>
@@ -572,15 +572,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Cambiar a pantalla &completa</translation>
+ <translation type="obsolete">Cambiar a pantalla &completa</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Cambiar entre modo normal y pantalla completa</translation>
+ <translation type="obsolete">Cambiar entre modo normal y pantalla completa</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Cambiar a modo &fluído</translation>
+ <translation type="obsolete">Cambiar a modo &fluído</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -588,7 +588,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Cambiar a modo &ajustado</translation>
+ <translation type="obsolete">Cambiar a modo &ajustado</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -668,7 +668,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Ins&ertar Ctrl-Alt-Retroceso </translation>
+ <translation type="obsolete">Ins&ertar Ctrl-Alt-Retroceso </translation>
</message>
<message>
<source>&File</source>
@@ -991,7 +991,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Arrastrar y soltar</translation>
+ <translation type="obsolete">Arrastrar y soltar</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -1158,6 +1158,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Archivo</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1171,6 +1260,11 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -1180,6 +1274,21 @@
</message>
</context>
<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIApplianceEditorWidget</name>
<message>
<source>Virtual System %1</source>
@@ -2112,6 +2221,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2819,7 +2954,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -3040,6 +3175,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Controlador USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">Habilitado</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">Inhabilitado</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3416,15 +3606,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>&Dock y barra de menú:</translation>
+ <translation type="obsolete">&Dock y barra de menú:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>Automostrar en pantalla completa</translation>
+ <translation type="obsolete">Automostrar en pantalla completa</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>Seleccionado, el dock anfitrión y la barra de menú serán mostrados cuando la máquina virtual esté en el modo a pantalla completa.</translation>
+ <translation type="obsolete">Seleccionado, el dock anfitrión y la barra de menú serán mostrados cuando la máquina virtual esté en el modo a pantalla completa.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -4651,12 +4841,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica la actividad de los dispositivos de CD/DVD:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica la actividad de los dispositivos de CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica la actividad de los dispositivos de disquete:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica la actividad de los dispositivos de disquete:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4773,6 +4963,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -5162,50 +5362,42 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>La máquina virtual está configurada para usar el hardware de aceleración gráfica y el sistema operativo está establecido a Windows Vista o posterior. Para el mejor rendimiento debería establecer una memoria de vídeo de la máquina de al menos <b>%1</b>.</translation>
+ <translation type="obsolete">La máquina virtual está configurada para usar el hardware de aceleración gráfica y el sistema operativo está establecido a Windows Vista o posterior. Para el mejor rendimiento debería establecer una memoria de vídeo de la máquina de al menos <b>%1</b>.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation>La máquina virtual usará aceleración de transferencia de vídeo. Como esta característica solo funciona con sistemas invitados Windows será deshabilitada.</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Mini barra herramientas:</translation>
+ <translation type="obsolete">Mini barra herramientas:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Seleccionado, muestra la mini barra de herramientas en los modos pantalla completa y fuído.</translation>
+ <translation type="obsolete">Seleccionado, muestra la mini barra de herramientas en los modos pantalla completa y fuído.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Mostrar a pantalla &completa/fluído</translation>
+ <translation type="obsolete">Mostrar a pantalla &completa/fluído</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Seleccionado, muestra la mini barra de herramientas en la parte superior de la pantalla, en vez de en su posición predeterminada en la parte inferior de la pantalla.</translation>
+ <translation type="obsolete">Seleccionado, muestra la mini barra de herramientas en la parte superior de la pantalla, en vez de en su posición predeterminada en la parte inferior de la pantalla.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Mostrar en la parte &superior de la pantalla</translation>
+ <translation type="obsolete">Mostrar en la parte &superior de la pantalla</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5391,6 +5583,126 @@ p, li { white-space: pre-wrap; }
<source>Show at &Top of Screen</source>
<translation type="obsolete">Mostrar en la parte &superior de la pantalla</translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Mini barra herramientas:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Seleccionado, muestra la mini barra de herramientas en los modos pantalla completa y fuído.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Mostrar a pantalla &completa/fluído</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Seleccionado, muestra la mini barra de herramientas en la parte superior de la pantalla, en vez de en su posición predeterminada en la parte inferior de la pantalla.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Mostrar en la parte &superior de la pantalla</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5981,19 +6293,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Seleccionado, la tubería especificada en el campo <b>Ruta de puerto</b> será creada por la máquina virtual cuando se inicie. Sino, la máquina virtual tratará de usar la tubería existente.</translation>
+ <translation type="obsolete">Seleccionado, la tubería especificada en el campo <b>Ruta de puerto</b> será creada por la máquina virtual cuando se inicie. Sino, la máquina virtual tratará de usar la tubería existente.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Crear tubería</translation>
+ <translation type="obsolete">&Crear tubería</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Contiene la ruta de la tubería del puerto serie en la máquina anfitrión cuando el puerto trabaja en modo <b>Tubería anfitrión</b> o muestra el nombre del dispositivo serie cuando trabaja en modo <b>Dispositivo anfitrión</b>.</translation>
+ <translation type="obsolete">Contiene la ruta de la tubería del puerto serie en la máquina anfitrión cuando el puerto trabaja en modo <b>Tubería anfitrión</b> o muestra el nombre del dispositivo serie cuando trabaja en modo <b>Dispositivo anfitrión</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Ruta de puerto/archivo:</translation>
+ <translation type="obsolete">&Ruta de puerto/archivo:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>IO APIC</b> setting is enabled for this virtual machine.</source>
@@ -6011,6 +6323,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
<translation>Contiene el número IRQ de este puerto serie. Este debería ser un número entero entre <tt>0</tt> y <tt>255</tt>. Valores más grandes que <tt>15</tt> solo deberían ser usardos si la preferencia <b>I/O APIC</b> está habilitada para esta máquina virtual.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6131,11 +6459,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Agregar dispositivo CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Agregar dispositivo CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Agregar unidad de disquete</nobr></translation>
+ <translation type="obsolete"><nobr>Agregar unidad de disquete</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -6179,11 +6507,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Agregar dispositivo CD/DVD</translation>
+ <translation type="obsolete">Agregar dispositivo CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Agregar unidad de disquete</translation>
+ <translation type="obsolete">Agregar unidad de disquete</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6371,15 +6699,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&Unidad CD/DVD:</translation>
+ <translation type="obsolete">&Unidad CD/DVD:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Seleccione un disco virtual de CD/DVD o una unidad física a usar con la unidad virtual. La máquina virtual verá un disco insertado en la unidad con los datos en el archivo o en el disco de la unidad física virtual como sus contenidos.</translation>
+ <translation type="obsolete">Seleccione un disco virtual de CD/DVD o una unidad física a usar con la unidad virtual. La máquina virtual verá un disco insertado en la unidad con los datos en el archivo o en el disco de la unidad física virtual como sus contenidos.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Configurar la unidad virtual de CD/DVD</translation>
+ <translation type="obsolete">Configurar la unidad virtual de CD/DVD</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6403,7 +6731,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Seleccionar un archivo de disco virtual de CD/DVD...</translation>
+ <translation type="obsolete">Seleccionar un archivo de disco virtual de CD/DVD...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6507,6 +6835,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Seleccionar un archivo de disco óptico virtual...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6949,7 +7309,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>USB 2.0 está habilitado actualmente para esta máquina virtual. Sin embargo, esto require que <b>%1</b> esté instalado. Instale el paquete de extensiones desde el sitio de descargas de VirtualBox o deshabilite USB 2.0 para iniciar la máquina.</translation>
+ <translation type="obsolete">USB 2.0 está habilitado actualmente para esta máquina virtual. Sin embargo, esto require que <b>%1</b> esté instalado. Instale el paquete de extensiones desde el sitio de descargas de VirtualBox o deshabilite USB 2.0 para iniciar la máquina.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
@@ -6971,6 +7331,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7152,6 +7516,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Cerrar</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Cambiar</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7195,7 +7567,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Fallo al crear el objeto COM de VirtualBox.</p><p>La aplicación se cerrará.</p></translation>
+ <translation type="obsolete"><p>Fallo al crear el objeto COM de VirtualBox.</p><p>La aplicación se cerrará.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -7816,7 +8188,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>¡Hay una nueva versión de VirtualBox! La versión <b>%1</b> se encuentra disponible en <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Puede descargar dicha versión directamente desde el siguiente enlace:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>¡Hay una nueva versión de VirtualBox! La versión <b>%1</b> se encuentra disponible en <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Puede descargar dicha versión directamente desde el siguiente enlace:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -8016,7 +8388,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Ha ocurrido un error crítico durante la ejecución de la máquina virtual y ha sido parada.</p><p>Para obtener ayuda, vaya a la sección «Community» en <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> o su contrato de soporte. Proporcione los contenidos de los archivos de log <tt>VBox.log</tt> y el archivo de imagen <tt>VBox.png</tt>, que puede encontrar en el directorio <nobr><b>%1</ [...]
+ <translation type="obsolete"><p>Ha ocurrido un error crítico durante la ejecución de la máquina virtual y ha sido parada.</p><p>Para obtener ayuda, vaya a la sección «Community» en <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> o su contrato de soporte. Proporcione los contenidos de los archivos de log <tt>VBox.log</tt> y el archivo de imagen <tt>VBox.png</tt>, que puede encontrar en el directorio <nobr> [...]
</message>
<message>
<source>hard disk</source>
@@ -8297,7 +8669,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Está a punto de agregar una nueva unidad de CD/DVD al controlador <b>%1</b>.</p><p>¿Desea seleccionar un disco virtual de CD/DVD a poner en la unidad o desea dejarla vacía por ahora?</p></translation>
+ <translation type="obsolete"><p>Está a punto de agregar una nueva unidad de CD/DVD al controlador <b>%1</b>.</p><p>¿Desea seleccionar un disco virtual de CD/DVD a poner en la unidad o desea dejarla vacía por ahora?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8319,11 +8691,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Fallo al desconectar el dispositivo CD /DVD (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la máquina <b>%3</b>.</translation>
+ <translation type="obsolete">Fallo al desconectar el dispositivo CD /DVD (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la máquina <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Fallo al desconectar el dispositivo de disquete (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la máquina <b>%3</b>.</translation>
+ <translation type="obsolete">Fallo al desconectar el dispositivo de disquete (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la máquina <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -8374,11 +8746,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Fallo al conectar el dispositivo CD/DVD (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la máquina <b>%3</b>.</translation>
+ <translation type="obsolete">Fallo al conectar el dispositivo CD/DVD (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la máquina <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Fallo al conectar el dispositivo de disquete (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la máquina <b>%3</b>.</translation>
+ <translation type="obsolete">Fallo al conectar el dispositivo de disquete (<nobr><b>%1</b></nobr>) de la ranura <i>%2</i> de la máquina <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8633,7 +9005,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Fallo al descartar datos.</translation>
+ <translation type="obsolete">Fallo al descartar datos.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions CD image file.</nobr></p><p>Do you wish to download this CD image from the Internet?</p></source>
@@ -8921,7 +9293,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Uno o más discos duros virtuales, CD/DVD o archivo de imagen de disquete no está accesible. Como resultado, no se pueden operar las máquinas virtuales que usen estos archivos hasta que estén accesibles.</p><p>Presione <b>Comprobar</b> para abrir la ventana del Administrador de medios virtuales y ver que medios están inaccesibles o presione <b>Ignorar</b> para ignorar este mensaje.</p></translation>
+ <translation type="obsolete"><p>Uno o más discos duros virtuales, CD/DVD o archivo de imagen de disquete no está accesible. Como resultado, no se pueden operar las máquinas virtuales que usen estos archivos hasta que estén accesibles.</p><p>Presione <b>Comprobar</b> para abrir la ventana del Administrador de medios virtuales y ver que medios están inaccesibles o presione <b>Ignorar</b> para ignorar este mensaje.</p></translation>
</message>
<message>
<source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
@@ -8929,7 +9301,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>¿Está seguro de que quiere eliminar el dispositivo CD/DVD?</p><p>No podrá insertar ningún CD o imagen ISO ni instalar las «Guest Additions» sin él.</p></translation>
+ <translation type="obsolete"><p>¿Está seguro de que quiere eliminar el dispositivo CD/DVD?</p><p>No podrá insertar ningún CD o imagen ISO ni instalar las «Guest Additions» sin él.</p></translation>
</message>
<message>
<source><p>Error changing disk image mode from <b>%1</b> to <b>%2</b>.</p></source>
@@ -9002,11 +9374,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p>El archivo de imagen de las <b>«Guest Additions» de VirtualBox</b> ha sido descargado correctamente de <nobr><a href="%1">%1</a></nobr> y guardado localmente como <nobr><b>%2</b>.</nobr></p><p>¿Desea registrar este archivo de imagen de disco e insertarlo en la unidad virtual de CD/DVD?</p></translation>
+ <translation type="obsolete"><p>El archivo de imagen de las <b>«Guest Additions» de VirtualBox</b> ha sido descargado correctamente de <nobr><a href="%1">%1</a></nobr> y guardado localmente como <nobr><b>%2</b>.</nobr></p><p>¿Desea registrar este archivo de imagen de disco e insertarlo en la unidad virtual de CD/DVD?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>No se puede insertar el archivo de imagen de las <b>«Guest Additions» de VirtualBox</b> en la máquina virtual <b>%1</b> dado que la máquina no tiene unidades CD/DVD. Agregue una unidad usando la página de almacenamiento de la ventana de preferencias de la máquina virtual.</p></translation>
+ <translation type="obsolete"><p>No se puede insertar el archivo de imagen de las <b>«Guest Additions» de VirtualBox</b> en la máquina virtual <b>%1</b> dado que la máquina no tiene unidades CD/DVD. Agregue una unidad usando la página de almacenamiento de la ventana de preferencias de la máquina virtual.</p></translation>
</message>
<message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
@@ -9045,6 +9417,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -10299,13 +10759,17 @@ este paso y luego conectar los Discos Duros desde el diálogo de Configuración
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>¡Bienvenido a VirtualBox!</h3><p>La parte izquierda de esta ventana está destinada a mostrar la lista de máquinas virtuales de su computadora. En este momento esta lista está vacía porque todavía no se ha creado ninguna máquina virtual.<img src=:/welcome.png align=right/></p><p>Para crear una nueva máquina virtual presione el botón <b>Nueva</b> en la barra de herramientas principal localizada en la parte superior de [...]
+ <translation type="obsolete"><h3>¡Bienvenido a VirtualBox!</h3><p>La parte izquierda de esta ventana está destinada a mostrar la lista de máquinas virtuales de su computadora. En este momento esta lista está vacía porque todavía no se ha creado ninguna máquina virtual.<img src=:/welcome.png align=right/></p><p>Para crear una nueva máquina virtual presione el botón <b>Nueva</b> en la barra de herramientas principal localizada en la p [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Administrador</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -10338,7 +10802,7 @@ este paso y luego conectar los Discos Duros desde el diálogo de Configuración
</message>
<message>
<source>Settings</source>
- <translation>Configuración</translation>
+ <translation type="obsolete">Configuración</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -10391,6 +10855,10 @@ este paso y luego conectar los Discos Duros desde el diálogo de Configuración
<source>Display</source>
<translation>Pantalla</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10466,6 +10934,25 @@ este paso y luego conectar los Discos Duros desde el diálogo de Configuración
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">está usando más controladores de almacenamiento de los que un chipset %1 soporta. Cambie el tipo de chipset en la página de la configuración del sistema o reduzca el número de los siguientes controladores de almacenamiento en la página de la configuración de almacenamiento: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Configuración</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -10480,6 +10967,10 @@ este paso y luego conectar los Discos Duros desde el diálogo de Configuración
<source>Close</source>
<translation type="unfinished">Cerrar</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10824,7 +11315,7 @@ este paso y luego conectar los Discos Duros desde el diálogo de Configuración
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Modo de arrastrar y soltar</translation>
+ <translation type="obsolete">Modo de arrastrar y soltar</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -10838,6 +11329,10 @@ este paso y luego conectar los Discos Duros desde el diálogo de Configuración
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -14223,7 +14718,7 @@ Versión %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>La conexión de este disco duro será realizada indirectamente usando un nuevo disco duro diferenciado.</translation>
+ <translation type="obsolete">La conexión de este disco duro será realizada indirectamente usando un nuevo disco duro diferenciado.</translation>
</message>
<message>
<source>Some of the media in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these media.</source>
@@ -14233,7 +14728,7 @@ Versión %1</translation>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Este disco duro base está indirectamente conectado usando el siguiente disco duro diferenciado:</translation>
+ <translation type="obsolete">Este disco duro base está indirectamente conectado usando el siguiente disco duro diferenciado:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -14279,7 +14774,7 @@ Versión %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -14843,12 +15338,12 @@ Versión %1</translation>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Habilitado</translation>
+ <translation type="obsolete">Habilitado</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Inhabilitado</translation>
+ <translation type="obsolete">Inhabilitado</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -14897,7 +15392,7 @@ Versión %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>USB Tablet</source>
@@ -14956,7 +15451,7 @@ Versión %1</translation>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Algunos de los archivos en esta cadena de discos duros son inaccesibles. Use el Administrador de medios virtuales en el modo <b>Mostrar discos duros diferenciados</b> para inspeccionar estos archivos.</translation>
+ <translation type="obsolete">Algunos de los archivos en esta cadena de discos duros son inaccesibles. Use el Administrador de medios virtuales en el modo <b>Mostrar discos duros diferenciados</b> para inspeccionar estos archivos.</translation>
</message>
<message>
<source>USB</source>
@@ -15008,6 +15503,105 @@ Versión %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Activo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Activo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Activo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -15893,6 +16487,10 @@ volver al idioma por omisión del sistema.</qt>
<source>Refresh the list of disk image files</source>
<translation>Actualizar la lista de archivos de imagen de disco</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
index 15e297e..b25df8b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts
@@ -247,7 +247,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Gardenta&sun Modua</translation>
+ <translation type="unfinished">Gardenta&sun Modua</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -271,11 +271,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>&Sagu Integrazioa ezgaitu</translation>
+ <translation type="obsolete">&Sagu Integrazioa ezgaitu</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Aldirako ezgaitu sagu markatzaile integrazioa</translation>
+ <translation type="obsolete">Aldirako ezgaitu sagu markatzaile integrazioa</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -287,11 +287,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>B&idali Ktrl-Alt-Ezab</translation>
+ <translation type="obsolete">B&idali Ktrl-Alt-Ezab</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Ktrl+Alt+Ezab sekuentzia bidali makina birtualera</translation>
+ <translation type="obsolete">Ktrl+Alt+Ezab sekuentzia bidali makina birtualera</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -299,7 +299,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Ktrl-Alt-Atzera-tekla sekuentzia bidali makina birtualera</translation>
+ <translation type="obsolete">Ktrl-Alt-Atzera-tekla sekuentzia bidali makina birtualera</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -362,16 +362,8 @@
<translation>&Gailuak</translation>
</message>
<message>
- <source>&CD/DVD Devices</source>
- <translation></translation>
- </message>
- <message>
- <source>&Floppy Devices</source>
- <translation></translation>
- </message>
- <message>
<source>&USB Devices</source>
- <translation>&USB Gailuak</translation>
+ <translation type="obsolete">&USB Gailuak</translation>
</message>
<message>
<source>Change the settings of network adapters</source>
@@ -428,26 +420,10 @@
<translation></translation>
</message>
<message>
- <source>Switch to &Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch between normal and fullscreen mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch to Seam&less Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and seamless desktop integration mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Switch to &Scaled Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and scaled mode</source>
<translation type="unfinished"></translation>
</message>
@@ -516,10 +492,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">&Fitxategia</translation>
@@ -791,10 +763,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -835,11 +803,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Logging...</source>
- <comment>debug action</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Popup Menu</source>
<translation type="unfinished"></translation>
</message>
@@ -964,6 +927,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Fitxategia</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -977,6 +1029,25 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1512,6 +1583,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Cancel</source>
@@ -1828,11 +1924,6 @@
<translation type="unfinished">Ezgaiturik</translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Ez erantsia</translation>
@@ -2036,6 +2127,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">Gaiturik</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">Ezgaiturik</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2314,18 +2460,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -3237,16 +3371,6 @@
<translation></translation>
</message>
<message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
- <comment>CD/DVD tooltip</comment>
- <translation></translation>
- </message>
- <message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
- <comment>FD tooltip</comment>
- <translation></translation>
- </message>
- <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
<comment>Network adapters tooltip</comment>
<translation></translation>
@@ -3334,6 +3458,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -3583,10 +3717,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -3638,43 +3768,15 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Mini ToolBar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Show at &Top of Screen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -3804,6 +3906,126 @@
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -4279,26 +4501,38 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation type="unfinished">Markaturik badago, <b>Ataka Bidean</b> ezarritako kanalizazioa sortuko da makina birtualean abiaraztean. Bestela makina birtuala dagoen kanalizazioa erabiltzen saiatuko da.</translation>
+ <translation type="obsolete">Markaturik badago, <b>Ataka Bidean</b> ezarritako kanalizazioa sortuko da makina birtualean abiaraztean. Bestela makina birtuala dagoen kanalizazioa erabiltzen saiatuko da.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation type="unfinished">&Sortu Kanalizazioa</translation>
+ <translation type="obsolete">&Sortu Kanalizazioa</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation type="unfinished">Ostalarian Serial atakarako kanalizazioaren bidea erakusten du ataka <b>Ostalari Kanalizazio</b> moduan funtzionatzean, edo serie ataka izena atakak <b>Ostalari Gailua</b> moduan funtzinoatzean.</translation>
+ <translation type="obsolete">Ostalarian Serial atakarako kanalizazioaren bidea erakusten du ataka <b>Ostalari Kanalizazio</b> moduan funtzionatzean, edo serie ataka izena atakak <b>Ostalari Gailua</b> moduan funtzinoatzean.</translation>
</message>
<message>
- <source>Port/File &Path:</source>
+ <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
+ <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
<translation type="unfinished"></translation>
</message>
</context>
@@ -4348,14 +4582,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><nobr>Add CD/DVD Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><nobr>Add Floppy Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Add Controller</source>
<translation type="unfinished"></translation>
</message>
@@ -4388,14 +4614,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add CD/DVD Device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Add Floppy Device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove Attachment</source>
<translation type="unfinished"></translation>
</message>
@@ -4524,18 +4742,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Set up the virtual CD/DVD drive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Floppy &Drive:</source>
<translation type="unfinished"></translation>
</message>
@@ -4556,10 +4762,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove disk from virtual drive</source>
<translation type="unfinished"></translation>
</message>
@@ -4622,23 +4824,55 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add USB Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Hot-pluggable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <source>Add Floppy Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add USB Controller</source>
+ <source>Optical &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Hot-pluggable</source>
+ <source>Set up the virtual optical drive</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4969,10 +5203,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -4992,6 +5222,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -5153,6 +5387,14 @@
<source>Close</source>
<translation type="unfinished">Itxi</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -5196,7 +5438,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Huts VirtualBox COM elementua sortzerakoan.</p><p>Aplikazioa itxi egingo da orain,</p></translation>
+ <translation type="obsolete"><p>Huts VirtualBox COM elementua sortzerakoan.</p><p>Aplikazioa itxi egingo da orain,</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -5682,10 +5924,6 @@
<translation type="obsolete">Ezabatutako abisu eta mezu guztiak berriz agertzea eragien du</translation>
</message>
<message>
- <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
<translation type="unfinished"></translation>
</message>
@@ -5762,19 +6000,11 @@
<translation type="obsolete"><p>Hautaturiko <nobr><b>%1</b></nobr> sare interfazea ezabatu nahi al duzu? </p><p><b>Oharra:</b> Interfaze hau erabilia egon daiteke sare moldagailu bat edo gehiagorengatik beste MB batetan. Ezabatu ondoren sare moldagailu horiek ez dute funtzionatuko ezarpen horiek aldatu arte edo beste interfaze izen bat hautatuz o moldagailu eranste modu ezberdin bat hautatuaz.</p></translation>
</message>
<message>
- <source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>E&xit</source>
<comment>warnAboutAutoConvertedSettings message box</comment>
<translation type="obsolete">I&rten</translation>
</message>
<message>
- <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>hard disk</source>
<comment>failed to close ...</comment>
<translation type="obsolete">disko gogorra</translation>
@@ -5868,10 +6098,6 @@
<translation type="obsolete">disko gogorra</translation>
</message>
<message>
- <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Remove</source>
<comment>medium</comment>
<translation type="unfinished"></translation>
@@ -5921,10 +6147,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -5933,14 +6155,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -5969,14 +6183,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -6172,10 +6378,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -6403,14 +6605,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -6471,6 +6665,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -7184,13 +7466,17 @@ gogorrak erantsi ditzakezu.</p></translation>
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Ongietorri VirtualBox-era!</h3><p>Leiho honen ezkerreko zatian ordenagailu honetako makina birtual guztiak daude. Zerrenda orain hutsik dago oraindik ez duzu makina birtualik sortu eta.<img src=:/welcome.png align=right/></p><p>Makina berri bat sortzeko sakatu <b>Berria</b> botoia leihoaren goialdeko tresna-barran nagusian.</p><p><b>%1</b> tekla sakatu dezakezu laguntza esku [...]
+ <translation type="obsolete"><h3>Ongietorri VirtualBox-era!</h3><p>Leiho honen ezkerreko zatian ordenagailu honetako makina birtual guztiak daude. Zerrenda orain hutsik dago oraindik ez duzu makina birtualik sortu eta.<img src=:/welcome.png align=right/></p><p>Makina berri bat sortzeko sakatu <b>Berria</b> botoia leihoaren goialdeko tresna-barran nagusian.</p><p><b>%1</b> tekla sakatu dezakezu laguntza eskura [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -7211,7 +7497,7 @@ gogorrak erantsi ditzakezu.</p></translation>
</message>
<message>
<source>Settings</source>
- <translation type="unfinished">Ezarpenak</translation>
+ <translation type="obsolete">Ezarpenak</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -7264,6 +7550,10 @@ gogorrak erantsi ditzakezu.</p></translation>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -7315,6 +7605,25 @@ gogorrak erantsi ditzakezu.</p></translation>
<source>%1 - %2</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Ezarpenak</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -7329,6 +7638,10 @@ gogorrak erantsi ditzakezu.</p></translation>
<source>Close</source>
<translation type="unfinished">Itxi</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -7593,10 +7906,6 @@ gogorrak erantsi ditzakezu.</p></translation>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -7608,6 +7917,10 @@ gogorrak erantsi ditzakezu.</p></translation>
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -9896,7 +10209,7 @@ gogorrak erantsi ditzakezu.</p></translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation type="unfinished">CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Network</source>
@@ -10312,21 +10625,6 @@ gogorrak erantsi ditzakezu.</p></translation>
<comment>medium</comment>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
@@ -10364,10 +10662,6 @@ gogorrak erantsi ditzakezu.</p></translation>
</translation>
</message>
<message>
- <source>(CD/DVD)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Screens</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -10823,12 +11117,12 @@ gogorrak erantsi ditzakezu.</p></translation>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Gaiturik</translation>
+ <translation type="obsolete">Gaiturik</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Ezgaiturik</translation>
+ <translation type="obsolete">Ezgaiturik</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -10938,6 +11232,105 @@ gogorrak erantsi ditzakezu.</p></translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -11556,6 +11949,10 @@ sistemako lehenetsiriko hizkuntza berrezartzeko.</qt>
<source>Modify the attributes of the selected disk image file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxNIList</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
index f3dcce2..0d1ce1f 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fa_IR.ts
@@ -197,23 +197,23 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>غیرفعال سازی یکپارچگ&ی ماوس</translation>
+ <translation type="obsolete">غیرفعال سازی یکپارچگ&ی ماوس</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>غیرفعالسازی موقت یکپارچگی نشانگر ماوس میزبان</translation>
+ <translation type="obsolete">غیرفعالسازی موقت یکپارچگی نشانگر ماوس میزبان</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&فشاردادن Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&فشاردادن Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>ارسال توالی Ctrl-Alt-Del به ماشین مجازی</translation>
+ <translation type="obsolete">ارسال توالی Ctrl-Alt-Del به ماشین مجازی</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>ارسال توالی Ctrl-Alt-Backspace به ماشین مجازی</translation>
+ <translation type="obsolete">ارسال توالی Ctrl-Alt-Backspace به ماشین مجازی</translation>
</message>
<message>
<source>Take a snapshot of the virtual machine</source>
@@ -265,15 +265,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&دستگاه سی دی/دی وی دی</translation>
+ <translation type="obsolete">&دستگاه سی دی/دی وی دی</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>دست&گاه فلاپی</translation>
+ <translation type="obsolete">دست&گاه فلاپی</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>دستگاه یو& اِس بی</translation>
+ <translation type="obsolete">دستگاه یو& اِس بی</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -340,15 +340,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>رفتن به حالت تما&م صفحه</translation>
+ <translation type="obsolete">رفتن به حالت تما&م صفحه</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>تعویض بین حالت معمولی و تمام صفحه</translation>
+ <translation type="obsolete">تعویض بین حالت معمولی و تمام صفحه</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>رفتن &به حالت یکپارچه</translation>
+ <translation type="obsolete">رفتن &به حالت یکپارچه</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -356,7 +356,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>رفتن به &حالت مقیاس</translation>
+ <translation type="obsolete">رفتن به &حالت مقیاس</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -432,7 +432,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>&قراردادن Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">&قراردادن Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>&File</source>
@@ -699,7 +699,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>کشیدن 'و' رهاکردن</translation>
+ <translation type="obsolete">کشیدن 'و' رهاکردن</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -742,11 +742,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Logging...</source>
- <comment>debug action</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Popup Menu</source>
<translation type="unfinished"></translation>
</message>
@@ -871,6 +866,99 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&فایل</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Seam&less Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -884,6 +972,25 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1391,6 +1498,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIGChooserItemGroup</name>
<message>
<source><b>%1</b></source>
@@ -1522,7 +1654,7 @@
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[سی دی/دی وی دی]</translation>
+ <translation type="obsolete">[سی دی/دی وی دی]</translation>
</message>
<message>
<source>Controller</source>
@@ -1723,6 +1855,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">کنترلر یو اِس بی</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">فعال شده</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">غیرفعال شده</translation>
+ </message>
</context>
<context>
<name>UIGMachinePreview</name>
@@ -1903,18 +2090,6 @@
<translation type="obsolete">غیر&فعالسازی محافظ صفحه نمایش میزبان</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -2892,12 +3067,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>فعالیت های دستگاه سی دی/دی وی دی را نشان میدهد:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>فعالیت های دستگاه سی دی/دی وی دی را نشان میدهد:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>فعالیت دستگاه فلاپی را نشان میدهد:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>فعالیت دستگاه فلاپی را نشان میدهد:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -2996,6 +3171,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -3277,10 +3462,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -3332,43 +3513,35 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">نوارابزار کوچک:</translation>
+ <translation type="obsolete">نوارابزار کوچک:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">اگر انتخاب شده،نوار ابزار کوچک را در حالت تمام صفحه یا یکپارچه نشان میدهد.</translation>
+ <translation type="obsolete">اگر انتخاب شده،نوار ابزار کوچک را در حالت تمام صفحه یا یکپارچه نشان میدهد.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">نمایش &در تمام صفحه/یکپارچه</translation>
+ <translation type="obsolete">نمایش &در تمام صفحه/یکپارچه</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">اگر انتخاب شده، نوارابزار کوچک را در بالای صفحه نشان میدهد،بجای موقعیت پیش فرض آن در پایین صفحه.</translation>
+ <translation type="obsolete">اگر انتخاب شده، نوارابزار کوچک را در بالای صفحه نشان میدهد،بجای موقعیت پیش فرض آن در پایین صفحه.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">نمایش در &بالای صفحه</translation>
+ <translation type="obsolete">نمایش در &بالای صفحه</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -3458,6 +3631,126 @@
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">سه بعدی {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">سه بعدی {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">نوارابزار کوچک:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">اگر انتخاب شده،نوار ابزار کوچک را در حالت تمام صفحه یا یکپارچه نشان میدهد.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">نمایش &در تمام صفحه/یکپارچه</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">اگر انتخاب شده، نوارابزار کوچک را در بالای صفحه نشان میدهد،بجای موقعیت پیش فرض آن در پایین صفحه.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">نمایش در &بالای صفحه</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -3896,19 +4189,19 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>اگر انتخاب شده، میله مشخص شده در فیلد <b>مسیر پورت</b> توسط ماشین مجازی حین شروع آن ایجاد خواهد شد. در غیراینصورت، ماشین مجازی فرض میکند که میله موجود است و سعی میکند که از آن استفاده کند.</translation>
+ <translation type="obsolete">اگر انتخاب شده، میله مشخص شده در فیلد <b>مسیر پورت</b> توسط ماشین مجازی حین شروع آن ایجاد خواهد شد. در غیراینصورت، ماشین مجازی فرض میکند که میله موجود است و سعی میکند که از آن استفاده کند.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>ایجاد &میله</translation>
+ <translation type="obsolete">ایجاد &میله</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>مسیر را به میله پورت سریال در میزبان را وقتیکه پورت در حالت <b>میله میزبان</b> کار میکند را نشان میدهد، یا نام دستگاه سریال میزبان را وقتیکه پورت در حالت <b>دستگاه میزبان</b> در حال کار است را نشان میدهد.</translation>
+ <translation type="obsolete">مسیر را به میله پورت سریال در میزبان را وقتیکه پورت در حالت <b>میله میزبان</b> کار میکند را نشان میدهد، یا نام دستگاه سریال میزبان را وقتیکه پورت در حالت <b>دستگاه میزبان</b> در حال کار است را نشان میدهد.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>مسیر پور&ت/فایل:</translation>
+ <translation type="obsolete">مسیر پور&ت/فایل:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -3918,6 +4211,22 @@
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>آدرس پورت ورودی/خروجی پایه را برای این پورت سریال را نشان میدهد. مقادیر معتبر اعداد صحیح در محدوده ای از <tt>0</tt> به <tt>0xFFFF</tt> هستند.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -3970,11 +4279,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>افزودن دستگاه سی دی/دی وی دی</nobr></translation>
+ <translation type="obsolete"><nobr>افزودن دستگاه سی دی/دی وی دی</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>افزودن دستگاه فلاپی</nobr></translation>
+ <translation type="obsolete"><nobr>افزودن دستگاه فلاپی</nobr></translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -4014,11 +4323,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>افزودن دستگاه سی دی/دی وی دی</translation>
+ <translation type="obsolete">افزودن دستگاه سی دی/دی وی دی</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>افزودن دستگاه فلاپی</translation>
+ <translation type="obsolete">افزودن دستگاه فلاپی</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -4170,15 +4479,15 @@
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>درایو سی دی/دی &وی دی:</translation>
+ <translation type="obsolete">درایو سی دی/دی &وی دی:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>یک دیسک مجازی سی دی/دی وی دی یا یک درایو فیزیکی برای استفاده با درایو مجازی انتخاب کنید. ماشین مجازی دیسک قرارداده شده در درایو را با داده در فایل یا در درایو فیزیکی بعنوان محتویات دیسک میبیند.</translation>
+ <translation type="obsolete">یک دیسک مجازی سی دی/دی وی دی یا یک درایو فیزیکی برای استفاده با درایو مجازی انتخاب کنید. ماشین مجازی دیسک قرارداده شده در درایو را با داده در فایل یا در درایو فیزیکی بعنوان محتویات دیسک میبیند.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>تنظیم درایو مجازی سی دی/دی وی دی</translation>
+ <translation type="obsolete">تنظیم درایو مجازی سی دی/دی وی دی</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -4202,7 +4511,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>یک فایل دیسک سی دی/دی وی دی مجازی انتخاب کنید...</translation>
+ <translation type="obsolete">یک فایل دیسک سی دی/دی وی دی مجازی انتخاب کنید...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -4302,6 +4611,38 @@
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">یک فایل دیسک نوری مجازی انتخاب کنید...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -4682,10 +5023,6 @@
<translation type="obsolete">اکنون یو اِس بی 2.0 برای این ماشین فعال شده است. هرچند، این نیاز دارد که <b>%1</b> نصب شده باشد. لطفا بسته افزونه را از سایت ویرچوال باکس دانلود کنید. بعداز این شما قادر به فعال کردن مجدد یو اِس بی 2.0 هستید. آن در این فاصله غیرفعال شده است بجز اینکه شما تغییرات تنظیمات فعلی را لغو کنید.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -4705,6 +5042,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -4878,6 +5219,14 @@
<source>Close</source>
<translation type="unfinished">بستن</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">تعویض</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -4921,7 +5270,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>موفق به ایجاد شی کام ویرچوال باکس نشد.</p><p>برنامه حالا بسته خواهد شد.</p></translation>
+ <translation type="obsolete"><p>موفق به ایجاد شی کام ویرچوال باکس نشد.</p><p>برنامه حالا بسته خواهد شد.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -5218,7 +5567,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>نسخه جدید ویرچوال باکس منتشر شده است! نسخه <b>%1</b> موجود است در <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>میتوانید این نسخه را توسط این لینک دانلود کنید:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>نسخه جدید ویرچوال باکس منتشر شده است! نسخه <b>%1</b> موجود است در <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>میتوانید این نسخه را توسط این لینک دانلود کنید:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -5290,11 +5639,11 @@
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>یک یا تعداد بیشتری دیسک سخت مجازی، سی دی/دی وی دی یا رسانه فلاپی اکنون قابل دسترسی نیستند. درنتیجه، تا زمانیکه این رسانه ها قابل دسترسی نباشد شما قادر به استفاده از ماشین مجازی نیستید.</p><p>دکمه <b>بررسی</b> را برای بازکردن پنجره مدیر رسانه مجازی فشار دهید و مشاهده کنید کدام رسانه ها قابل دسترسی نیستند، یا دکمه <b>چشمپوشی</b> را برای نادیده گرفتن این پیام فشار دهید.</p></translation>
+ <translation type="obsolete"><p>یک یا تعداد بیشتری دیسک سخت مجازی، سی دی/دی وی دی یا رسانه فلاپی اکنون قابل دسترسی نیستند. درنتیجه، تا زمانیکه این رسانه ها قابل دسترسی نباشد شما قادر به استفاده از ماشین مجازی نیستید.</p><p>دکمه <b>بررسی</b> را برای بازکردن پنجره مدیر رسانه مجازی فشار دهید و مشاهده کنید کدام رسانه ها قابل دسترسی نیستند، یا دکمه <b>چشمپوشی</b> را برای نادیده گرفتن این پیام فشار دهید.</p></translation>
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>یک خطای خطرناک حین اِجرای ماشین مجازی رخ داده و اِجرای ماشین متوقف شده است.</p><p>برای راهنمایی، لطفا بخش انجمن را در <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ببینید یا با پشتیبانی تماس بگیرید. لطفا محتویات فایل وقایع <tt>VBox.log</tt> و فایل ایمیج <tt>VBox.png</tt> را ارئه دهید، که میتوانید آنها را در دایرکتوری <nobr><b>%1</b></nobr> پیدا کنید، همچنین توضیح دهید ک [...]
+ <translation type="obsolete"><p>یک خطای خطرناک حین اِجرای ماشین مجازی رخ داده و اِجرای ماشین متوقف شده است.</p><p>برای راهنمایی، لطفا بخش انجمن را در <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ببینید یا با پشتیبانی تماس بگیرید. لطفا محتویات فایل وقایع <tt>VBox.log</tt> و فایل ایمیج <tt>VBox.png</tt> را ارئه دهید، که میتوانید آنها را در دایرکتوری <nobr><b>%1</b></nobr> پیدا کنید، همچ [...]
</message>
<message>
<source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
@@ -5476,7 +5825,7 @@
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>آیا میخواهید دستگاه سی دی/دی وی دی رام را حذف کنید؟</p><p>شما قادر به بارگیری سی دی یا ایمیج ایزو یا نصب افزونه مهمان بدون آن نیستید!</p></translation>
+ <translation type="obsolete"><p>آیا میخواهید دستگاه سی دی/دی وی دی رام را حذف کنید؟</p><p>شما قادر به بارگیری سی دی یا ایمیج ایزو یا نصب افزونه مهمان بدون آن نیستید!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -5563,7 +5912,7 @@
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>شما درصدد افزودن درایو سی دی/دی وی دی به کنترلر <b>%1</b> هستید؟</p><p>آیا میخواهید دیسک مجازی سی دی/دی وی دی برای قراردادن در درایو انتخاب کنید یا آن را خالی بگذارید؟</p></translation>
+ <translation type="obsolete"><p>شما درصدد افزودن درایو سی دی/دی وی دی به کنترلر <b>%1</b> هستید؟</p><p>آیا میخواهید دیسک مجازی سی دی/دی وی دی برای قراردادن در درایو انتخاب کنید یا آن را خالی بگذارید؟</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -5585,11 +5934,11 @@
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>موفق به جداکردن دستگاه سی دی/دی وی دی (<nobr><b>%1</b></nobr>) از شکاف <i>%2</i> از ماشین <b>%3</b> نشد.</translation>
+ <translation type="obsolete">موفق به جداکردن دستگاه سی دی/دی وی دی (<nobr><b>%1</b></nobr>) از شکاف <i>%2</i> از ماشین <b>%3</b> نشد.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>موفق به جداکردن دستگاه فلاپی (<nobr><b>%1</b></nobr>) از شکاف <i>%2</i> از ماشین <b>%3</b> نشد.</translation>
+ <translation type="obsolete">موفق به جداکردن دستگاه فلاپی (<nobr><b>%1</b></nobr>) از شکاف <i>%2</i> از ماشین <b>%3</b> نشد.</translation>
</message>
<message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
@@ -5621,11 +5970,11 @@
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>موفق به ضمیمه دستگاه سی دی/دی وی دی (<nobr><b>%1</b></nobr>) به شکاف <i>%2</i> از ماشین <b>%3</b> نشد.</translation>
+ <translation type="obsolete">موفق به ضمیمه دستگاه سی دی/دی وی دی (<nobr><b>%1</b></nobr>) به شکاف <i>%2</i> از ماشین <b>%3</b> نشد.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>موفق به ضمیمه دستگاه (<nobr><b>%1</b></nobr>) به شکاف <i>%2</i> از ماشین <b>%3</b> نشد.</translation>
+ <translation type="obsolete">موفق به ضمیمه دستگاه (<nobr><b>%1</b></nobr>) به شکاف <i>%2</i> از ماشین <b>%3</b> نشد.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -5862,7 +6211,7 @@
</message>
<message>
<source>Failed to drop data.</source>
- <translation>موفق به رها کردن داده نشد.</translation>
+ <translation type="obsolete">موفق به رها کردن داده نشد.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -6100,14 +6449,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -6164,6 +6505,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniToolBar</name>
@@ -6391,13 +6820,17 @@
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>به ویرچوال باکس خوش آمدید!</h3><p>بخش راست این پنجره لیستی از همه ماشین های مجازی روی رایانه شما هست. حالا لیست خالی هست زیرا شما هنوز هیچگونه ماشین مجازی ایجاد نکرده اید.</p><p>بمنظور ایجاد ماشین مجازی جدید، دکمه <b>جدید</b> را از نوارابزار اصلی قرارگرفته در بالای پنجره فشار دهید.</p><p> میتوانید کلید <b>%1</b> برای دریافت راهنمای فوری فشاردهید، یا از سایت <a href=http://www.virtualbox.org>و [...]
+ <translation type="obsolete"><h3>به ویرچوال باکس خوش آمدید!</h3><p>بخش راست این پنجره لیستی از همه ماشین های مجازی روی رایانه شما هست. حالا لیست خالی هست زیرا شما هنوز هیچگونه ماشین مجازی ایجاد نکرده اید.</p><p>بمنظور ایجاد ماشین مجازی جدید، دکمه <b>جدید</b> را از نوارابزار اصلی قرارگرفته در بالای پنجره فشار دهید.</p><p> میتوانید کلید <b>%1</b> برای دریافت راهنمای فوری فشاردهید، یا از سایت <a href=http://www.vir [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>مدیر</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -6426,7 +6859,7 @@
</message>
<message>
<source>Settings</source>
- <translation>تنظیمات</translation>
+ <translation type="obsolete">تنظیمات</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -6479,6 +6912,10 @@
<source>Display</source>
<translation>نمایش</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -6530,6 +6967,25 @@
<source>%1 - %2</source>
<translation>%1 - %2</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">تنظیمات</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -6544,6 +7000,10 @@
<source>Close</source>
<translation type="unfinished">بستن</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -6783,7 +7243,7 @@
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>حالت کشیدن 'و' رهاکردن</translation>
+ <translation type="obsolete">حالت کشیدن 'و' رهاکردن</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -6797,6 +7257,10 @@
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -7834,7 +8298,7 @@
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>سی دی/دی وی دی-رام</translation>
+ <translation type="obsolete">سی دی/دی وی دی-رام</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -8432,17 +8896,17 @@
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>ضمیمه کردن این دیسک سخت بطور غیرمستقیم توسط یک دیسک سخت متفاوت ایجاد شده جدید اِجرا شده است.</translation>
+ <translation type="obsolete">ضمیمه کردن این دیسک سخت بطور غیرمستقیم توسط یک دیسک سخت متفاوت ایجاد شده جدید اِجرا شده است.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>برخی از رسانه ها در این زنجیره دیسک سخت غیرقابل دسترسی است. لطفا از مدیر رسانه مجازی در حالت <b>نمایش دیسک سخت متفاوت </b> برای بررسی این رسانه ها استفاده کنید.</translation>
+ <translation type="obsolete">برخی از رسانه ها در این زنجیره دیسک سخت غیرقابل دسترسی است. لطفا از مدیر رسانه مجازی در حالت <b>نمایش دیسک سخت متفاوت </b> برای بررسی این رسانه ها استفاده کنید.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>این دیسک سخت پایه غیرمستقیم ضمیمه شده توسط دیسک سخت متفاوت زیر:</translation>
+ <translation type="obsolete">این دیسک سخت پایه غیرمستقیم ضمیمه شده توسط دیسک سخت متفاوت زیر:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -8482,7 +8946,7 @@
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(سی دی/دی وی دی)</translation>
+ <translation type="obsolete">(سی دی/دی وی دی)</translation>
</message>
<message>
<source>Screens</source>
@@ -8931,12 +9395,12 @@
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">فعال شده</translation>
+ <translation type="obsolete">فعال شده</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">غیرفعال شده</translation>
+ <translation type="obsolete">غیرفعال شده</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -9046,6 +9510,105 @@
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">فعال</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">فعال</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">فعال</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -9196,6 +9759,10 @@
<source>Create a new virtual hard drive</source>
<translation type="obsolete">ایجاد یک درایو سخت مجازی جدید</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
index 3a56249..a2d3b1f 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts
@@ -278,7 +278,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Saumato&n tila</translation>
+ <translation type="unfinished">Saumato&n tila</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -302,11 +302,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Poista &hiirituki käytöstä</translation>
+ <translation type="obsolete">Poista &hiirituki käytöstä</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Poista väliaikaisesti käytöstä isäntätietokoneen hiiren kohdistime tuki</translation>
+ <translation type="obsolete">Poista väliaikaisesti käytöstä isäntätietokoneen hiiren kohdistime tuki</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -318,11 +318,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Lähetä Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&Lähetä Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Lähetä Ctrl-Alt-Del-näppäinyhdistelmä virtuaalikoneelle</translation>
+ <translation type="obsolete">Lähetä Ctrl-Alt-Del-näppäinyhdistelmä virtuaalikoneelle</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -330,7 +330,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Lähetä Ctrl-Alt-Backspace-näppäinyhdistelmä virtuaalikoneelle</translation>
+ <translation type="obsolete">Lähetä Ctrl-Alt-Backspace-näppäinyhdistelmä virtuaalikoneelle</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -397,16 +397,8 @@
<translation>&Laitteet</translation>
</message>
<message>
- <source>&CD/DVD Devices</source>
- <translation></translation>
- </message>
- <message>
- <source>&Floppy Devices</source>
- <translation></translation>
- </message>
- <message>
<source>&USB Devices</source>
- <translation>&USB-laitteet</translation>
+ <translation type="obsolete">&USB-laitteet</translation>
</message>
<message>
<source>Change the settings of network adapters</source>
@@ -449,7 +441,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&Lokitus...</translation>
+ <translation type="obsolete">&Lokitus...</translation>
</message>
<message>
<source>&Help</source>
@@ -468,26 +460,10 @@
<translation></translation>
</message>
<message>
- <source>Switch to &Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch between normal and fullscreen mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch to Seam&less Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and seamless desktop integration mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Switch to &Scaled Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and scaled mode</source>
<translation type="unfinished"></translation>
</message>
@@ -556,10 +532,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">&Tiedosto</translation>
@@ -831,10 +803,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -999,6 +967,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Tiedosto</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1012,6 +1069,26 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1614,6 +1691,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2076,11 +2179,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished">Ei käytössä</translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Ei liitetty</translation>
@@ -2289,6 +2387,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">Käytössä</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">Ei käytössä</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2622,18 +2775,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">&Näytä ilmoitusalueen kuvake</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -3792,16 +3933,6 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
- <comment>CD/DVD tooltip</comment>
- <translation></translation>
- </message>
- <message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
- <comment>FD tooltip</comment>
- <translation></translation>
- </message>
- <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
<comment>Network adapters tooltip</comment>
<translation></translation>
@@ -3893,6 +4024,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4150,10 +4291,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4205,43 +4342,15 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Mini ToolBar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Show at &Top of Screen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4467,6 +4576,126 @@ p, li { white-space: pre-wrap; }
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5126,11 +5355,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Jos asetettu, kentässä <b>Portin polku</b> määritelty putki luodaan virtuaalikoneen käynnistyessä. Muussa tapauksessa virtuaalikone yrittää käyttää olemassaolevaa putkea.</translation>
+ <translation type="obsolete">Jos asetettu, kentässä <b>Portin polku</b> määritelty putki luodaan virtuaalikoneen käynnistyessä. Muussa tapauksessa virtuaalikone yrittää käyttää olemassaolevaa putkea.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Luo putki</translation>
+ <translation type="obsolete">&Luo putki</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5138,18 +5367,30 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Näyttää polun sarjaportin putkitiedostoon, kun portti on <b>Isännän putki</b>-tilassa, tai isäntäkoneen sarjaportin laitenimen, kun portti on <b>Isäntälaite</b>-tilassa.</translation>
+ <translation type="obsolete">Näyttää polun sarjaportin putkitiedostoon, kun portti on <b>Isännän putki</b>-tilassa, tai isäntäkoneen sarjaportin laitenimen, kun portti on <b>Isäntälaite</b>-tilassa.</translation>
+ </message>
+ <message>
+ <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Port/File &Path:</source>
+ <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
<translation type="unfinished"></translation>
</message>
</context>
@@ -5271,14 +5512,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><nobr>Add CD/DVD Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><nobr>Add Floppy Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Add Controller</source>
<translation type="unfinished"></translation>
</message>
@@ -5311,14 +5544,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add CD/DVD Device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Add Floppy Device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove Attachment</source>
<translation type="unfinished">Poista liitos</translation>
</message>
@@ -5447,18 +5672,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Set up the virtual CD/DVD drive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Floppy &Drive:</source>
<translation type="unfinished"></translation>
</message>
@@ -5479,10 +5692,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove disk from virtual drive</source>
<translation type="unfinished"></translation>
</message>
@@ -5525,43 +5734,75 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Controller: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No name is currently specified for the controller at position <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No hard disk is selected for <i>%1</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add USB Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Controller: %1</source>
+ <source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No name is currently specified for the controller at position <b>%1</b>.</source>
+ <source>Choose a virtual optical disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
+ <source><nobr>Add Optical Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No hard disk is selected for <i>%1</i>.</source>
+ <source><nobr>Add Floppy Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <source>Add Optical Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <source>Add Floppy Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add USB Controller</source>
+ <source>Optical &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Hot-pluggable</source>
+ <source>Set up the virtual optical drive</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5908,10 +6149,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><nobr>Tila: %1</nobr></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -5931,6 +6168,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6100,6 +6341,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Sulje</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Vaihda</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6159,7 +6408,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>VirtualBoxin COM-oliota ei voitu luoda.</p><p>Ohjelma lopetataan nyt.</p></translation>
+ <translation type="obsolete"><p>VirtualBoxin COM-oliota ei voitu luoda.</p><p>Ohjelma lopetataan nyt.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -6719,7 +6968,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Uusi versio VirtualBoxista on julkaistu! Versio <b>%1</b> on saatavilla sivulta <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Voit noutaa tämän version seuraavasta linkistä: </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Uusi versio VirtualBoxista on julkaistu! Versio <b>%1</b> on saatavilla sivulta <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Voit noutaa tämän version seuraavasta linkistä: </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6841,7 +7090,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Yksi tai useampi kiintolevyistä, CD/DVD- tai levykemedioista ei ole tällä hetkellä saatavilla. Tästä johtuen et voi käyttää virtuaalikoneita, jotka käyttävät näitä taltioita, kunnes ne ovat taas saatavilla</p><p>Paina nappia <b>Tarkista</b>, jos haluat avata virtuaalimedioiden hallinnan ja selvittää mitkä taltiot eivät ole saatavilla, tai paina nappia <b>Älä huomioi</b> jos haluat jättää tämän viestin huomioimatta.</p&g [...]
+ <translation type="obsolete"><p>Yksi tai useampi kiintolevyistä, CD/DVD- tai levykemedioista ei ole tällä hetkellä saatavilla. Tästä johtuen et voi käyttää virtuaalikoneita, jotka käyttävät näitä taltioita, kunnes ne ovat taas saatavilla</p><p>Paina nappia <b>Tarkista</b>, jos haluat avata virtuaalimedioiden hallinnan ja selvittää mitkä taltiot eivät ole saatavilla, tai paina nappia <b>Älä huomioi</b> jos haluat jättää tämän viestin huomi [...]
</message>
<message>
<source><p>Your existing VirtualBox settings files will be automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>Exit</b> if you want to terminate the VirtualBox application without any further actions.</p></source>
@@ -6876,7 +7125,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Tapahtui kriittinen virhe suoritettaessa virtuaalikonetta, ja virtuaalikoneen suoritus on keskeytetty.</p><p>Jos tarvitset apua ongelmassa, lue lisää yhteisöosiosta sivulta <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> tai etsi yhteystiedot tukisopimuksestasi. Toimita vikaraportin mukana lokitiedostosi sisältö <tt>VBox.log</tt> sekä levykuvatiedosto <tt>VBox.png</tt>, jotka löydät kansiosta &l [...]
+ <translation type="obsolete"><p>Tapahtui kriittinen virhe suoritettaessa virtuaalikonetta, ja virtuaalikoneen suoritus on keskeytetty.</p><p>Jos tarvitset apua ongelmassa, lue lisää yhteisöosiosta sivulta <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> tai etsi yhteystiedot tukisopimuksestasi. Toimita vikaraportin mukana lokitiedostosi sisältö <tt>VBox.log</tt> sekä levykuvatiedosto <tt>VBox.png</tt>, jotka löy [...]
</message>
<message>
<source>hard disk</source>
@@ -6977,10 +7226,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">kiintolevy</translation>
</message>
<message>
- <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Remove</source>
<comment>medium</comment>
<translation type="unfinished"></translation>
@@ -7030,10 +7275,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7042,14 +7283,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -7078,14 +7311,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7291,10 +7516,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7523,14 +7744,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7591,6 +7804,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8402,13 +8703,17 @@ Kaikki VirtualBoxin komponentit käyttävät sitä koneen tunnistukseen.</p&g
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Tervetuloa VirtualBoxiin!</h3><p>Oikealla olevasta tilasta näet kaikki tällä tietokoneella olevat virtuaalikoneet. Luettelo on nyt tyhjä, koska et ole vielä luonut yhtäkään virtuaalikonetta.<img src=:/welcome.png align=right/></p><p>Jos haluat luoda uuden virtuaalikoneen, napsauta nappia <b>Uusi</b> ikkunan yläosassa olevasta työkalupalkista.</p><p>Voit lukea ohjeita painamalla <b> [...]
+ <translation type="obsolete"><h3>Tervetuloa VirtualBoxiin!</h3><p>Oikealla olevasta tilasta näet kaikki tällä tietokoneella olevat virtuaalikoneet. Luettelo on nyt tyhjä, koska et ole vielä luonut yhtäkään virtuaalikonetta.<img src=:/welcome.png align=right/></p><p>Jos haluat luoda uuden virtuaalikoneen, napsauta nappia <b>Uusi</b> ikkunan yläosassa olevasta työkalupalkista.</p><p>Voit lukea ohjeita painamalla <b>% [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8437,7 +8742,7 @@ Kaikki VirtualBoxin komponentit käyttävät sitä koneen tunnistukseen.</p&g
</message>
<message>
<source>Settings</source>
- <translation type="unfinished">Asetukset</translation>
+ <translation type="obsolete">Asetukset</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -8490,6 +8795,10 @@ Kaikki VirtualBoxin komponentit käyttävät sitä koneen tunnistukseen.</p&g
<source>Display</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8541,6 +8850,25 @@ Kaikki VirtualBoxin komponentit käyttävät sitä koneen tunnistukseen.</p&g
<source>%1 - %2</source>
<translation type="unfinished">%1 - %2</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Asetukset</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -8555,6 +8883,10 @@ Kaikki VirtualBoxin komponentit käyttävät sitä koneen tunnistukseen.</p&g
<source>Close</source>
<translation type="unfinished">Sulje</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -8889,10 +9221,6 @@ Kaikki VirtualBoxin komponentit käyttävät sitä koneen tunnistukseen.</p&g
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -8904,6 +9232,10 @@ Kaikki VirtualBoxin komponentit käyttävät sitä koneen tunnistukseen.</p&g
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -10996,7 +11328,7 @@ Version %1</source>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -11778,21 +12110,6 @@ Version %1</source>
<comment>medium</comment>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
@@ -11836,10 +12153,6 @@ Version %1</source>
</translation>
</message>
<message>
- <source>(CD/DVD)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Screens</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -12295,12 +12608,12 @@ Version %1</source>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Käytössä</translation>
+ <translation type="obsolete">Käytössä</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Ei käytössä</translation>
+ <translation type="obsolete">Ei käytössä</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -12410,6 +12723,105 @@ Version %1</source>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13003,6 +13415,10 @@ Version %1</source>
<source>Modify the attributes of the selected disk image file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
index 774213d..fad00ff 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts
@@ -229,11 +229,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Désactiver l'intégration &souris</translation>
+ <translation type="obsolete">Désactiver l'intégration &souris</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Désactiver temporairement l'intégration de la souris</translation>
+ <translation type="obsolete">Désactiver temporairement l'intégration de la souris</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -245,11 +245,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Insérer Ctrl-Alt-&Suppr</translation>
+ <translation type="obsolete">Insérer Ctrl-Alt-&Suppr</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Envoie la séquence Ctrl-Alt-Suppr à la machine virtuelle</translation>
+ <translation type="obsolete">Envoie la séquence Ctrl-Alt-Suppr à la machine virtuelle</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -257,7 +257,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Envoie la séquence Ctrl-Alt-Retour à la machine virtuelle</translation>
+ <translation type="obsolete">Envoie la séquence Ctrl-Alt-Retour à la machine virtuelle</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -329,15 +329,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&Lecteurs CD/DVD</translation>
+ <translation type="obsolete">&Lecteurs CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Lecteurs de &disquette</translation>
+ <translation type="obsolete">Lecteurs de &disquette</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&Périphériques USB</translation>
+ <translation type="obsolete">&Périphériques USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -453,15 +453,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Passer en mode &plein écran</translation>
+ <translation type="obsolete">Passer en mode &plein écran</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Permuter entre mode normal et plein écran</translation>
+ <translation type="obsolete">Permuter entre mode normal et plein écran</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Utiliser le &bureau intégré</translation>
+ <translation type="obsolete">Utiliser le &bureau intégré</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -469,7 +469,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Passer en mode &redimensionné</translation>
+ <translation type="obsolete">Passer en mode &redimensionné</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -717,7 +717,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>&Insérer Ctrl-Alt-Supprime</translation>
+ <translation type="obsolete">&Insérer Ctrl-Alt-Supprime</translation>
</message>
<message>
<source>&Group</source>
@@ -861,7 +861,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Glisser-Déposer</translation>
+ <translation type="obsolete">Glisser-Déposer</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -904,11 +904,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Logging...</source>
- <comment>debug action</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Popup Menu</source>
<translation type="unfinished"></translation>
</message>
@@ -1033,6 +1028,99 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Fichier</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Seam&less Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1046,6 +1134,26 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1928,6 +2036,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Appliance Export Wizard</source>
@@ -2362,7 +2496,7 @@
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2593,6 +2727,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Contrôleur USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2902,18 +3091,6 @@
<translation type="obsolete">Désactiver l'é&conomiseur d'écran hôte</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4075,12 +4252,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indique l'activité des lecteurs CD/DVD :</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indique l'activité des lecteurs CD/DVD :</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indique l'activité des lecteurs de disquette :</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indique l'activité des lecteurs de disquette :</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4192,6 +4369,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4502,10 +4689,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4557,43 +4740,35 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Barre d'outils compacte :</translation>
+ <translation type="obsolete">Barre d'outils compacte :</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Si cette case est cochée la barre d'outils compacte sera affichée en modes plein écran et intégré.</translation>
+ <translation type="obsolete">Si cette case est cochée la barre d'outils compacte sera affichée en modes plein écran et intégré.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">A&fficher en plein écran/mode intégré</translation>
+ <translation type="obsolete">A&fficher en plein écran/mode intégré</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Si cette case est cochée la barre d'outils compacte sera affichée en haut de l'écran, plutôt qu'en bas comme par défaut.</translation>
+ <translation type="obsolete">Si cette case est cochée la barre d'outils compacte sera affichée en haut de l'écran, plutôt qu'en bas comme par défaut.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Afficher en hau&t de l'écran</translation>
+ <translation type="obsolete">Afficher en hau&t de l'écran</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4676,19 +4851,139 @@
<translation type="obsolete">vous avez choisi un système de type 64 bit pour cette machine virtuelle. Comme la virtualisation matérielle de l'hôte (VT-x/AMD-V) est nécessaire pour un tel invité, elle sera automatiquement activée.</translation>
</message>
<message>
- <source>D&rag'n'Drop:</source>
- <translation>&Glisser-Déposer :</translation>
+ <source>D&rag'n'Drop:</source>
+ <translation>&Glisser-Déposer :</translation>
+ </message>
+ <message>
+ <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation>Définit quelles données seront copiées entre l'invité et l'hôte par glisser-déposer. Cette fonctionnalité nécessite que les additions invités soient installées sur le SE invité.</translation>
+ </message>
+ <message>
+ <source>No name specified for the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Barre d'outils compacte :</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Si cette case est cochée la barre d'outils compacte sera affichée en modes plein écran et intégré.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">A&fficher en plein écran/mode intégré</translation>
</message>
<message>
- <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>Définit quelles données seront copiées entre l'invité et l'hôte par glisser-déposer. Cette fonctionnalité nécessite que les additions invités soient installées sur le SE invité.</translation>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Si cette case est cochée la barre d'outils compacte sera affichée en haut de l'écran, plutôt qu'en bas comme par défaut.</translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Afficher en hau&t de l'écran</translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5138,15 +5433,15 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Si cette case est cochée le tube spécifié dans le champ <b>Chemin du port</b> sera créé lors du lancement de la machine virtuelle ; sinon elle essaiera de l'utiliser comme s'il existait.</translation>
+ <translation type="obsolete">Si cette case est cochée le tube spécifié dans le champ <b>Chemin du port</b> sera créé lors du lancement de la machine virtuelle ; sinon elle essaiera de l'utiliser comme s'il existait.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Créer le tube</translation>
+ <translation type="obsolete">&Créer le tube</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Affiche le chemin vers le tube de l'hôte pour le port série (quand il fonctionne en mode <b>tube hôte</b>) ou le nom du périphérique série (quand il fonctionne en mode <b>périphérique hôte</b>). </translation>
+ <translation type="obsolete">Affiche le chemin vers le tube de l'hôte pour le port série (quand il fonctionne en mode <b>tube hôte</b>) ou le nom du périphérique série (quand il fonctionne en mode <b>périphérique hôte</b>). </translation>
</message>
<message>
<source>I/O Po&rt:</source>
@@ -5154,7 +5449,7 @@
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Port/Chemin :</translation>
+ <translation type="obsolete">&Port/Chemin :</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5164,6 +5459,22 @@
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Affiche l'adresse E/S de ce port série. Celle-ci doit être un nombre entier compris entre <tt>0</tt> et <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5220,11 +5531,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Ajouter lecteur CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Ajouter lecteur CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Ajouter lecteur de disquettes</nobr></translation>
+ <translation type="obsolete"><nobr>Ajouter lecteur de disquettes</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -5268,11 +5579,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Ajouter un lecteur CD/DVD</translation>
+ <translation type="obsolete">Ajouter un lecteur CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Ajouter un lecteur de disquettes</translation>
+ <translation type="obsolete">Ajouter un lecteur de disquettes</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5460,15 +5771,15 @@
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&Lecteur CD/DVD :</translation>
+ <translation type="obsolete">&Lecteur CD/DVD :</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Choisissez un disque CD/DVD virtuel ou un lecteur physique pour utiliser avec le lecteur virtuel. La machine virtuelle vera un disque inséré dans le lecteur avec comme contenu les données dans le fichier ou sur le disque.</translation>
+ <translation type="obsolete">Choisissez un disque CD/DVD virtuel ou un lecteur physique pour utiliser avec le lecteur virtuel. La machine virtuelle vera un disque inséré dans le lecteur avec comme contenu les données dans le fichier ou sur le disque.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Configuration dulecteur de CD/DVD virtuel</translation>
+ <translation type="obsolete">Configuration dulecteur de CD/DVD virtuel</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -5492,7 +5803,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Choisissez un fichier de CD/DVD virtuel...</translation>
+ <translation type="obsolete">Choisissez un fichier de CD/DVD virtuel...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -5589,6 +5900,38 @@
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Choisissez un fichier de disque optique virtuel...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -5978,10 +6321,6 @@
<translation type="obsolete">USB 2.0 est activée pour cette machine virtuelle, mais ceci nécessite que l'extension <b>%1</b> soit installée. Veuillez installer l'extension à partir du site de téléchargement VirtualBox. Vous pourrez alors réactiver USB 2.0. En attendant, la fonctionnalité sera désactivée si vous n'annulez pas les changements actuels.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6001,6 +6340,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6174,6 +6517,14 @@
<source>Close</source>
<translation type="unfinished">Fermer</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Basculer</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6217,7 +6568,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Échec de la création de l'objet COM de VirtualBox.</p><p>Le programme va s'arrêter.</p></translation>
+ <translation type="obsolete"><p>Échec de la création de l'objet COM de VirtualBox.</p><p>Le programme va s'arrêter.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -6640,7 +6991,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Une nouvelle version de VirtualBox est disponible ! La version <b>%1</b> est disponible sur <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Vous pouvez télécharger cette version en utilisant le lien suivant : </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Une nouvelle version de VirtualBox est disponible ! La version <b>%1</b> est disponible sur <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Vous pouvez télécharger cette version en utilisant le lien suivant : </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6720,11 +7071,11 @@
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Un ou plusieurs disques durs virtuels, CD, DVD, ou disquettes ne sont pas pas accessibles pour l'instant. Vous ne pourrez démarrer de machines virtuelles qui les utilisent tant qu'ils ne seront pas accessibles.</p><p>Cliquez sur <b>Ouvrir</b> pour ouvrir le Gestionnaire de médias virtuels et voir quels médias sont inaccessibles, ou bien sur <b>Ignorer</b> pour ignorer ce message.</p></translation>
+ <translation type="obsolete"><p>Un ou plusieurs disques durs virtuels, CD, DVD, ou disquettes ne sont pas pas accessibles pour l'instant. Vous ne pourrez démarrer de machines virtuelles qui les utilisent tant qu'ils ne seront pas accessibles.</p><p>Cliquez sur <b>Ouvrir</b> pour ouvrir le Gestionnaire de médias virtuels et voir quels médias sont inaccessibles, ou bien sur <b>Ignorer</b> pour ignorer ce message.</p></translation>
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Une erreur critique est survenue pendant l'exécution de la machine virtuelle et cette dernière a été arrêtée.</p><p>Pour obtenir de l'aide vous pouvez vous rendre dans la section Community de <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ou consulter votre contrat de support. Postez le fichier journal <tt>VBox.log</tt> et le fichier image <tt>VBox.png</tt> que vous trouverez dans le [...]
+ <translation type="obsolete"><p>Une erreur critique est survenue pendant l'exécution de la machine virtuelle et cette dernière a été arrêtée.</p><p>Pour obtenir de l'aide vous pouvez vous rendre dans la section Community de <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ou consulter votre contrat de support. Postez le fichier journal <tt>VBox.log</tt> et le fichier image <tt>VBox.png</tt> que vous tr [...]
</message>
<message>
<source>Could not access USB on the host system, because neither the USB file system (usbfs) nor the DBus and hal services are currently available. If you wish to use host USB devices inside guest systems, you must correct this and restart VirtualBox.</source>
@@ -6981,7 +7332,7 @@
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Voulez-vous vraiment supprimer le lecteur CD/DVD ?</p><p>Sans lecteur vous ne pourrez ni utiliser les lecteurs physiques ou des disques CD/DVD virtuels ni installer les Additions invité dans la machine virtuelle.</p></translation>
+ <translation type="obsolete"><p>Voulez-vous vraiment supprimer le lecteur CD/DVD ?</p><p>Sans lecteur vous ne pourrez ni utiliser les lecteurs physiques ou des disques CD/DVD virtuels ni installer les Additions invité dans la machine virtuelle.</p></translation>
</message>
<message>
<source><p>VT-x/AMD-V hardware acceleration is not available on your system. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.</source>
@@ -7079,7 +7430,7 @@
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Vous êtes sur le point d'ajouter un nouveau lecteur CD/DVD au contrôleur <b>%1</b>.</p><p>Voulez-vous choisir un CD/DVD virtuel à insérer dans le lecteur ou bien le laisser vide pour le moment ?</p></translation>
+ <translation type="obsolete"><p>Vous êtes sur le point d'ajouter un nouveau lecteur CD/DVD au contrôleur <b>%1</b>.</p><p>Voulez-vous choisir un CD/DVD virtuel à insérer dans le lecteur ou bien le laisser vide pour le moment ?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -7101,11 +7452,11 @@
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Impossible d'détacher le lecteur CD/DVD (<nobr><b>%1</b></nobr>) de l'emplacement <i>%2</i> de la machine <b>%3</b>.</translation>
+ <translation type="obsolete">Impossible d'détacher le lecteur CD/DVD (<nobr><b>%1</b></nobr>) de l'emplacement <i>%2</i> de la machine <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Impossible de détacher le lecteur disquettes (<nobr><b>%1</b></nobr>) de l'emplacement <i>%2</i> de la machine <b>%3</b>.</translation>
+ <translation type="obsolete">Impossible de détacher le lecteur disquettes (<nobr><b>%1</b></nobr>) de l'emplacement <i>%2</i> de la machine <b>%3</b>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
@@ -7148,11 +7499,11 @@
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Impossible d'attacher le lecteur CD/DVD (<nobr><b>%1</b></nobr>) à l'emplacement <i>%2</i> de la machine <b>%3</b>.</translation>
+ <translation type="obsolete">Impossible d'attacher le lecteur CD/DVD (<nobr><b>%1</b></nobr>) à l'emplacement <i>%2</i> de la machine <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Impossible d'attacher le lecteur disquettes (<nobr><b>%1</b></nobr>) à l'emplacement <i>%2</i> de la machine <b>%3</b>.</translation>
+ <translation type="obsolete">Impossible d'attacher le lecteur disquettes (<nobr><b>%1</b></nobr>) à l'emplacement <i>%2</i> de la machine <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -7407,7 +7758,7 @@
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Echec de l'abandon de données.</translation>
+ <translation type="obsolete">Echec de l'abandon de données.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -7642,14 +7993,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7710,6 +8053,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8445,13 +8876,17 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Bienvenue dans VirtualBox !</h3><p>La partie gauche de cette fenêtre affiche la liste des machines virtuelles de votre ordinateur. Cette liste est vide car vous n'avez pas encore créé de machine virtuelle.<img src=:/welcome.png align=right/></p><p>Pour créer une nouvelle machine virtuelle cliquez sur le bouton <b>Créer</b> en haut de cette liste.</p><p>Vous pouvez appuyer sur <b>%1</b> p [...]
+ <translation type="obsolete"><h3>Bienvenue dans VirtualBox !</h3><p>La partie gauche de cette fenêtre affiche la liste des machines virtuelles de votre ordinateur. Cette liste est vide car vous n'avez pas encore créé de machine virtuelle.<img src=:/welcome.png align=right/></p><p>Pour créer une nouvelle machine virtuelle cliquez sur le bouton <b>Créer</b> en haut de cette liste.</p><p>Vous pouvez appuyer sur <b&g [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>- Gestionnaire de machines</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8484,7 +8919,7 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>Settings</source>
- <translation>Paramètres</translation>
+ <translation type="obsolete">Paramètres</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -8537,6 +8972,10 @@ And the size is not necessarily "in megabytes", the slider chooses the
<source>Display</source>
<translation>Affichage</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8612,6 +9051,25 @@ And the size is not necessarily "in megabytes", the slider chooses the
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">Vous utilisez plus de contrôleurs de stockage qu'un chipset %1 ne supporte. Veuillez changer le type du chipset sur la page Système des paramètres de la machine ou bien reduire en nombre les contrôleurs de stockage suivants sur la page Stockage: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Paramètres</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -8626,6 +9084,10 @@ And the size is not necessarily "in megabytes", the slider chooses the
<source>Close</source>
<translation type="unfinished">Fermer</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -8912,7 +9374,7 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Mode du Glisser-Deposer</translation>
+ <translation type="obsolete">Mode du Glisser-Deposer</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -8926,6 +9388,10 @@ And the size is not necessarily "in megabytes", the slider chooses the
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -10121,7 +10587,7 @@ And the size is not necessarily "in megabytes", the slider chooses the
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>Disque CD/DVD</translation>
+ <translation type="obsolete">Disque CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -10847,17 +11313,17 @@ And the size is not necessarily "in megabytes", the slider chooses the
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Ce disque sera connecté indirectement, en créant un nouveau disque dur différentiel.</translation>
+ <translation type="obsolete">Ce disque sera connecté indirectement, en créant un nouveau disque dur différentiel.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Certains des médias dans cette chaîne de disques durs sont inaccessibles. Utilisez le gestionnaire de médias virtuels en mode <b>Montrer les disques durs différentiels</b> pour voir ces médias.</translation>
+ <translation type="obsolete">Certains des médias dans cette chaîne de disques durs sont inaccessibles. Utilisez le gestionnaire de médias virtuels en mode <b>Montrer les disques durs différentiels</b> pour voir ces médias.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Ce disque dur de base est connecté indirectement à travers le disque dur différentiel suivant :</translation>
+ <translation type="obsolete">Ce disque dur de base est connecté indirectement à travers le disque dur différentiel suivant :</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -10903,7 +11369,7 @@ And the size is not necessarily "in megabytes", the slider chooses the
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -11463,16 +11929,6 @@ And the size is not necessarily "in megabytes", the slider chooses the
<translation>Choisissez un emplacement pour le nouveau fichier de disque dur virtuel</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -11570,6 +12026,105 @@ And the size is not necessarily "in megabytes", the slider chooses the
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Active</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Active</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Active</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -11865,6 +12420,10 @@ And the size is not necessarily "in megabytes", the slider chooses the
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Crée un nouveau disque dur virtuel</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
index 3e6836c..7dba5d5 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts
@@ -241,7 +241,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Modo f&luído</translation>
+ <translation type="unfinished">Modo f&luído</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -265,11 +265,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Desactivar a integración do &rato</translation>
+ <translation type="obsolete">Desactivar a integración do &rato</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Desactivar temporalmente a integración do punteiro do rato do anfitrión</translation>
+ <translation type="obsolete">Desactivar temporalmente a integración do punteiro do rato do anfitrión</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -281,11 +281,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Inserir Ctrl-Alt-Supr</translation>
+ <translation type="obsolete">&Inserir Ctrl-Alt-Supr</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Enviar a orde Ctrl-Alt-Supr a máquina virtual</translation>
+ <translation type="obsolete">Enviar a orde Ctrl-Alt-Supr a máquina virtual</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -293,7 +293,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Enviar a secuencia Ctrl-Alt-Retroceso á máquina virtual</translation>
+ <translation type="obsolete">Enviar a secuencia Ctrl-Alt-Retroceso á máquina virtual</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -364,16 +364,8 @@
<translation>&Dispositivos</translation>
</message>
<message>
- <source>&CD/DVD Devices</source>
- <translation></translation>
- </message>
- <message>
- <source>&Floppy Devices</source>
- <translation></translation>
- </message>
- <message>
<source>&USB Devices</source>
- <translation>Dispositivos &USB</translation>
+ <translation type="obsolete">Dispositivos &USB</translation>
</message>
<message>
<source>Change the settings of network adapters</source>
@@ -420,7 +412,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">Re&xistro...</translation>
+ <translation type="obsolete">Re&xistro...</translation>
</message>
<message>
<source>&Help</source>
@@ -439,26 +431,10 @@
<translation></translation>
</message>
<message>
- <source>Switch to &Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch between normal and fullscreen mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch to Seam&less Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and seamless desktop integration mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Switch to &Scaled Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and scaled mode</source>
<translation type="unfinished"></translation>
</message>
@@ -527,10 +503,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">&Ficheiro</translation>
@@ -802,10 +774,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -970,6 +938,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Ficheiro</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -983,6 +1040,26 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1603,6 +1680,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2240,11 +2343,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished">Desactivado</translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Sen conexión</translation>
@@ -2463,6 +2561,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Controlador USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">Activado</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">Desactivado</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2796,18 +2949,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Previsualización en tempo real &da icona ancorada</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -3966,16 +4107,6 @@ p, li { white-space: pre-wrap; }
<translation></translation>
</message>
<message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
- <comment>CD/DVD tooltip</comment>
- <translation></translation>
- </message>
- <message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
- <comment>FD tooltip</comment>
- <translation></translation>
- </message>
- <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
<comment>Network adapters tooltip</comment>
<translation></translation>
@@ -4072,6 +4203,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4329,10 +4470,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4384,43 +4521,27 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Barra de ferramentas pequena:</translation>
+ <translation type="obsolete">Barra de ferramentas pequena:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Se está marcada, mostra a barra de ferramentas pequena nos modos fluído e de pantalla completa.</translation>
+ <translation type="obsolete">Se está marcada, mostra a barra de ferramentas pequena nos modos fluído e de pantalla completa.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Mostrar en modo de &Pantalla completa/Fluído</translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Show at &Top of Screen</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Mostrar en modo de &Pantalla completa/Fluído</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4510,6 +4631,126 @@ p, li { white-space: pre-wrap; }
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Barra de ferramentas pequena:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Se está marcada, mostra a barra de ferramentas pequena nos modos fluído e de pantalla completa.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Mostrar en modo de &Pantalla completa/Fluído</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -4999,19 +5240,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Se está marcada, ao iniciarse a máquina virtual crearase a canalización especificada no campo <b>camiño do porto</b>. Noutro caso, a máquina virtual tentará empregar unha canalización existente.</translation>
+ <translation type="obsolete">Se está marcada, ao iniciarse a máquina virtual crearase a canalización especificada no campo <b>camiño do porto</b>. Noutro caso, a máquina virtual tentará empregar unha canalización existente.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Crear canalización</translation>
+ <translation type="obsolete">&Crear canalización</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Mostra o camiño da canalización do porto serie no anfitrión cando o porto traballa no modo <b>canalización no anfitrión</b>, ou o nome do dispositivo serie no anfitrión cando o porto traballa no modo <b>dispositivo no anfitrión</b>.</translation>
+ <translation type="obsolete">Mostra o camiño da canalización do porto serie no anfitrión cando o porto traballa no modo <b>canalización no anfitrión</b>, ou o nome do dispositivo serie no anfitrión cando o porto traballa no modo <b>dispositivo no anfitrión</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Camiño do &porto/ficheiro:</translation>
+ <translation type="obsolete">Camiño do &porto/ficheiro:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5021,6 +5262,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5136,14 +5393,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><nobr>Add CD/DVD Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><nobr>Add Floppy Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Add Controller</source>
<translation type="unfinished"></translation>
</message>
@@ -5176,14 +5425,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add CD/DVD Device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Add Floppy Device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove Attachment</source>
<translation type="unfinished"></translation>
</message>
@@ -5312,18 +5553,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Set up the virtual CD/DVD drive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Floppy &Drive:</source>
<translation type="unfinished"></translation>
</message>
@@ -5344,10 +5573,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove disk from virtual drive</source>
<translation type="unfinished"></translation>
</message>
@@ -5390,43 +5615,75 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Controller: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No name is currently specified for the controller at position <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No hard disk is selected for <i>%1</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add USB Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Controller: %1</source>
+ <source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No name is currently specified for the controller at position <b>%1</b>.</source>
+ <source>Choose a virtual optical disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
+ <source><nobr>Add Optical Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No hard disk is selected for <i>%1</i>.</source>
+ <source><nobr>Add Floppy Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <source>Add Optical Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <source>Add Floppy Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add USB Controller</source>
+ <source>Optical &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Hot-pluggable</source>
+ <source>Set up the virtual optical drive</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5802,10 +6059,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><nobr>Estado: %1</nobr></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -5825,6 +6078,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -5994,6 +6251,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Pechar</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Cambiar</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6037,7 +6302,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Produciuse un fallo ao crear o obxeto COM de VirtualBox.</p><p>O aplicativo terminará agora.</p></translation>
+ <translation type="obsolete"><p>Produciuse un fallo ao crear o obxeto COM de VirtualBox.</p><p>O aplicativo terminará agora.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -6484,7 +6749,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Unha nova versión de VirtualBox foi publicada! A versión <b>%1</b> está dispoñíbel en <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Pode descargar esta versión directamente desde esta ligazón:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Unha nova versión de VirtualBox foi publicada! A versión <b>%1</b> está dispoñíbel en <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Pode descargar esta versión directamente desde esta ligazón:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6584,7 +6849,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Un ou máis medios virtuais (disco ríxido, CD/DVD ou disqueteira) non están accesíbeis actualmente. Polo tanto, non poderá traballar coas máquinas virtuais que empreguen estes medios ata que sexan accesíbeis.</p><p>Prema en <b>Comprobar</b> para abrir o xanela do xestor de medios virtuais e consulte que medios están inaccesíbeis, ou prema en <b>Ignorar</b> para ignorar esta mensaxe.</p></translation>
+ <translation type="obsolete"><p>Un ou máis medios virtuais (disco ríxido, CD/DVD ou disqueteira) non están accesíbeis actualmente. Polo tanto, non poderá traballar coas máquinas virtuais que empreguen estes medios ata que sexan accesíbeis.</p><p>Prema en <b>Comprobar</b> para abrir o xanela do xestor de medios virtuais e consulte que medios están inaccesíbeis, ou prema en <b>Ignorar</b> para ignorar esta mensaxe.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -6615,7 +6880,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Ocorreu un erro crítico mentres se executaba a máquina virtual e se detivo a súa execución.</p><p>Para obter axuda, consulte a sección Comunidade en <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ou ao servizo de asistencia que teña contratado. Proporcione os contidos do ficheiro de rexistro <tt>VBox.log</tt> e o ficheiro de imaxe <tt>VBox.png</tt>, os cales pode localizar no cartafol <nobr& [...]
+ <translation type="obsolete"><p>Ocorreu un erro crítico mentres se executaba a máquina virtual e se detivo a súa execución.</p><p>Para obter axuda, consulte a sección Comunidade en <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ou ao servizo de asistencia que teña contratado. Proporcione os contidos do ficheiro de rexistro <tt>VBox.log</tt> e o ficheiro de imaxe <tt>VBox.png</tt>, os cales pode localizar no ca [...]
</message>
<message>
<source>hard disk</source>
@@ -6821,10 +7086,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">disco ríxido</translation>
</message>
<message>
- <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Remove</source>
<comment>medium</comment>
<translation type="unfinished"></translation>
@@ -6874,10 +7135,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -6886,14 +7143,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -6922,14 +7171,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7135,10 +7376,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7367,14 +7604,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7435,6 +7664,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8153,13 +8470,17 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Dámoslle a benvida a VirtualBox.</h3><p>A parte esquerda desta xanela destínase a mostrar unha lista de todas as máquinas virtuais do seu computador. Neste intre a lista está baleira porque aínda non creou ningunha máquina virtual.<img src=:/welcome.png align=right/></p><p>Para crear unha nova máquina virtual prema no botón <b>Novo</b> da barra de ferramentas localizada na parte superior da xanela [...]
+ <translation type="obsolete"><h3>Dámoslle a benvida a VirtualBox.</h3><p>A parte esquerda desta xanela destínase a mostrar unha lista de todas as máquinas virtuais do seu computador. Neste intre a lista está baleira porque aínda non creou ningunha máquina virtual.<img src=:/welcome.png align=right/></p><p>Para crear unha nova máquina virtual prema no botón <b>Novo</b> da barra de ferramentas localizada na parte superior da xanela pr [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8188,7 +8509,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Settings</source>
- <translation type="unfinished">Configuracións</translation>
+ <translation type="obsolete">Configuracións</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -8241,6 +8562,10 @@ p, li { white-space: pre-wrap; }
<source>Display</source>
<translation type="unfinished">Pantalla</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8296,6 +8621,25 @@ p, li { white-space: pre-wrap; }
<source>you have selected a 64-bit guest OS type for this VM. As such guests require hardware virtualization (VT-x/AMD-V), this feature will be enabled automatically.</source>
<translation type="obsolete">seleccionou un sistema operativo convidado de tipo 64-bit para esta máquina virtual. Tales convidados requiren hardware de virtualización (VT-x/AMD-V) co que esta característica activarase automaticamente.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Configuracións</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -8310,6 +8654,10 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Pechar</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -8628,10 +8976,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -8643,6 +8987,10 @@ p, li { white-space: pre-wrap; }
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -10225,7 +10573,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -10944,21 +11292,6 @@ p, li { white-space: pre-wrap; }
<comment>medium</comment>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
@@ -11002,10 +11335,6 @@ p, li { white-space: pre-wrap; }
</translation>
</message>
<message>
- <source>(CD/DVD)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Screens</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -11461,12 +11790,12 @@ p, li { white-space: pre-wrap; }
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Activado</translation>
+ <translation type="obsolete">Activado</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Desactivado</translation>
+ <translation type="obsolete">Desactivado</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -11576,6 +11905,105 @@ p, li { white-space: pre-wrap; }
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -11862,6 +12290,10 @@ p, li { white-space: pre-wrap; }
<source>Modify the attributes of the selected disk image file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
index 8ce385c..be070a4 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts
@@ -297,7 +297,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Aszta&l-integráció</translation>
+ <translation type="unfinished">Aszta&l-integráció</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -321,11 +321,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>&Egér-integráció letiltása</translation>
+ <translation type="obsolete">&Egér-integráció letiltása</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Átmenetileg letiltja a gazdagép egerének átvételét</translation>
+ <translation type="obsolete">Átmenetileg letiltja a gazdagép egerének átvételét</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -337,11 +337,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Ctrl-Alt-Del &küldése</translation>
+ <translation type="obsolete">Ctrl-Alt-Del &küldése</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Ctrl-Alt-Del küldése a virtuális gépnek</translation>
+ <translation type="obsolete">Ctrl-Alt-Del küldése a virtuális gépnek</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -349,7 +349,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Ctrl-Alt-Backspace küldése a virtuális gépnek</translation>
+ <translation type="obsolete">Ctrl-Alt-Backspace küldése a virtuális gépnek</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -421,15 +421,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD eszközök</translation>
+ <translation type="obsolete">&CD/DVD eszközök</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Floppy</translation>
+ <translation type="obsolete">&Floppy</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB eszközök</translation>
+ <translation type="obsolete">&USB eszközök</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -480,7 +480,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">Nap&lózás...</translation>
+ <translation type="obsolete">Nap&lózás...</translation>
</message>
<message>
<source>&Help</source>
@@ -558,15 +558,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Teljes &képernyőre váltás</translation>
+ <translation type="obsolete">Teljes &képernyőre váltás</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Váltás a normál és teljes képernyős mód között</translation>
+ <translation type="obsolete">Váltás a normál és teljes képernyős mód között</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Aszta&l-integrációs módba váltás</translation>
+ <translation type="obsolete">Aszta&l-integrációs módba váltás</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -574,7 +574,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Átméretezhető módba váltá&s</translation>
+ <translation type="obsolete">Átméretezhető módba váltá&s</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -654,7 +654,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Ctrl-Alt-Backspace küldés&e</translation>
+ <translation type="obsolete">Ctrl-Alt-Backspace küldés&e</translation>
</message>
<message>
<source>&File</source>
@@ -949,7 +949,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Fogd és vidd</translation>
+ <translation type="obsolete">Fogd és vidd</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -1116,6 +1116,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Fájl</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1129,6 +1218,25 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -2064,6 +2172,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2760,11 +2893,6 @@ p, li { white-space: pre-wrap; }
<translation>Letiltva</translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation></translation>
- </message>
- <message>
<source>Controller</source>
<comment>details (audio)</comment>
<translation>Vezérlő</translation>
@@ -2988,6 +3116,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB vezérlő</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">Engedélyezve</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">Letiltva</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3384,18 +3567,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Gazda képernyővédőjének kikapc&solása</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4580,12 +4751,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space: pre'><nobr>Jelzi a CD/DVD aktivitását:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space: pre'><nobr>Jelzi a CD/DVD aktivitását:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space: pre'><nobr>Jelzi a floppy aktivitását:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space: pre'><nobr>Jelzi a floppy aktivitását:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4693,6 +4864,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -5007,10 +5188,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -5062,43 +5239,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Mini eszköztár:</translation>
+ <translation type="obsolete">Mini eszköztár:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Ha engedélyezed, a Mini eszköztár meg fog jelenni teljes képernyős és asztal-integrációs módban.</translation>
+ <translation type="obsolete">Ha engedélyezed, a Mini eszköztár meg fog jelenni teljes képernyős és asztal-integrációs módban.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Jelenjen meg &teljes képernyőn</translation>
+ <translation type="obsolete">Jelenjen meg &teljes képernyőn</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Ha engedélyezed, a Mini ToolBar a képernyő tetején fog megjelenni, és nem az alján, ahol alapértelmezetten megjelenik.</translation>
+ <translation type="obsolete">Ha engedélyezed, a Mini ToolBar a képernyő tetején fog megjelenni, és nem az alján, ahol alapértelmezetten megjelenik.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Legyen a képernyő &tetején</translation>
+ <translation type="obsolete">Legyen a képernyő &tetején</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5326,19 +5495,139 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">egy 64 bites vendégrendszert választottál ehhez a géphez. Ezek a rendszerek igényik a hardvervirtualizációt (VT-x/AMD-V), így ez a tulajdonság automatikusan engedélyezve lesz.</translation>
</message>
<message>
- <source>D&rag'n'Drop:</source>
- <translation>Fog&d és vidd:</translation>
+ <source>D&rag'n'Drop:</source>
+ <translation>Fog&d és vidd:</translation>
+ </message>
+ <message>
+ <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation>A Fogd és vidd használatának módját állíthatod be, hogy a gazda és a vendég rendszer között milyen adat másolódjon át. Ez a virtuális gépen az Integrációs szolgáltatások telepítését igényli.</translation>
+ </message>
+ <message>
+ <source>No name specified for the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Mini eszköztár:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Ha engedélyezed, a Mini eszköztár meg fog jelenni teljes képernyős és asztal-integrációs módban.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Jelenjen meg &teljes képernyőn</translation>
</message>
<message>
- <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>A Fogd és vidd használatának módját állíthatod be, hogy a gazda és a vendég rendszer között milyen adat másolódjon át. Ez a virtuális gépen az Integrációs szolgáltatások telepítését igényli.</translation>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Ha engedélyezed, a Mini ToolBar a képernyő tetején fog megjelenni, és nem az alján, ahol alapértelmezetten megjelenik.</translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Legyen a képernyő &tetején</translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5939,11 +6228,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Ha engedélyezed, egy cső fog létrejönni a <b>Port útvonal</b> mezőben megadott helyen a virtuális gép indulásakor. Egyébként a virtuális gép megpróbálja felhasználni a már létező csövet.</translation>
+ <translation type="obsolete">Ha engedélyezed, egy cső fog létrejönni a <b>Port útvonal</b> mezőben megadott helyen a virtuális gép indulásakor. Egyébként a virtuális gép megpróbálja felhasználni a már létező csövet.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Cső készítése</translation>
+ <translation type="obsolete">&Cső készítése</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5951,11 +6240,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>A port útvonala, ha a port <b>Gazda cső</b> üzemmódban működik, vagy a gazda soros portjának neve ha a port <b>Gazda eszköz</b> üzemmódban működik.</translation>
+ <translation type="obsolete">A port útvonala, ha a port <b>Gazda cső</b> üzemmódban működik, vagy a gazda soros portjának neve ha a port <b>Gazda eszköz</b> üzemmódban működik.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Port/fájl útvonala:</translation>
+ <translation type="obsolete">&Port/fájl útvonala:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5965,6 +6254,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>A soros port I/O báziscíme. Bármely cím érvényes <tt>0</tt> és <tt>0xFFFF</tt> között.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6085,11 +6390,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>CD/DVD hozzáadása</nobr></translation>
+ <translation type="obsolete"><nobr>CD/DVD hozzáadása</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Floppy hozzáadása</nobr></translation>
+ <translation type="obsolete"><nobr>Floppy hozzáadása</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -6133,11 +6438,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>CD/DVD hozzáadása</translation>
+ <translation type="obsolete">CD/DVD hozzáadása</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Floppy hozzáadása</translation>
+ <translation type="obsolete">Floppy hozzáadása</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6327,15 +6632,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD &meghajtó:</translation>
+ <translation type="obsolete">CD/DVD &meghajtó:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Válassz egy virtuális meghajtóként használandó virtuális CD/DVD lemezt vagy fizikai meghajtót. A virtuális gép létni fogja a meghajtóba vagy a fizikai meghajtóba helyezett lemez tartalmát.</translation>
+ <translation type="obsolete">Válassz egy virtuális meghajtóként használandó virtuális CD/DVD lemezt vagy fizikai meghajtót. A virtuális gép létni fogja a meghajtóba vagy a fizikai meghajtóba helyezett lemez tartalmát.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>A virtuális CD/DVD meghajtó beállítása</translation>
+ <translation type="obsolete">A virtuális CD/DVD meghajtó beállítása</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6359,7 +6664,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Virtuális CD/DVD választása...</translation>
+ <translation type="obsolete">Virtuális CD/DVD választása...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6455,6 +6760,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Virtuális optikai lemez választása...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6864,10 +7201,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Az USB 2.0 jelenleg be van kapcsolva a virtuális gépen. Azonban ehhez a következőnek telepítve kell lennie: <b><nobr>%1</nobr></b>.</p><p>A VirtualBox oldaláról letöltve telepítsd fel a Kiterjesztő csomagot. Ezután újra be engedélyezni tudod az USB 2.0-t. Addig ki lesz kapcsolva, hacsak meg nem szakítod a beállítások módosítását.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6887,6 +7220,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7060,6 +7397,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Bezárás</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Átváltás</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7103,7 +7448,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>A VirtualBox COM feladat létrehozása sikertelen.</p><p>Az alkalmazás most bezáródik.</p></translation>
+ <translation type="obsolete"><p>A VirtualBox COM feladat létrehozása sikertelen.</p><p>Az alkalmazás most bezáródik.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7591,7 +7936,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Elérhető a VirtualBox egy újabb verziója! A(z) <b>%1</b> -s verzió elérhető a <a href="http://www.virtualbox.org/">virtualbox.org</a> weboldalon.</p><p>Közvetlenül pedig erről a linkről töltheted le:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Elérhető a VirtualBox egy újabb verziója! A(z) <b>%1</b> -s verzió elérhető a <a href="http://www.virtualbox.org/">virtualbox.org</a> weboldalon.</p><p>Közvetlenül pedig erről a linkről töltheted le:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7691,7 +8036,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Egy vagy több virtuális merevlemez, CD/DVD vagy floppy jelenleg nem érhető el. Ennek eredményeképp, nem leszel képes olyan műveletek végrehajtására, melyek ezt a médiumot használnák, amíg az újra elérhető nem lesz.</p><p>Az <b>Ellenőrzés</b> gombbal nyisd meg a Virtuális médiakezelő ablakot és láthatod az elérhetetlen médiát, vagy a <b>Kihagy</b> gombbal figyelmen kívül hagyod ezt az üzenetet.</p></translation>
+ <translation type="obsolete"><p>Egy vagy több virtuális merevlemez, CD/DVD vagy floppy jelenleg nem érhető el. Ennek eredményeképp, nem leszel képes olyan műveletek végrehajtására, melyek ezt a médiumot használnák, amíg az újra elérhető nem lesz.</p><p>Az <b>Ellenőrzés</b> gombbal nyisd meg a Virtuális médiakezelő ablakot és láthatod az elérhetetlen médiát, vagy a <b>Kihagy</b> gombbal figyelmen kívül hagyod ezt az üzenetet.</p></tr [...]
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -7722,7 +8067,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Kritikus hiba lépett fel a virtuális gép futása során és a gép leállt.</p><p>Segítségért látogass el a <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> közösségi részlegébe vagy a támogatási oldalra. Mellékeld a <tt>VBox.log</tt> naplófájl tartalmát és a <tt>VBox.png</tt> képet, melyeket a(z) <nobr><b>%1</b></nobr> mappában megtalálsz, ahogy annak a leírását is, mit csinál [...]
+ <translation type="obsolete"><p>Kritikus hiba lépett fel a virtuális gép futása során és a gép leállt.</p><p>Segítségért látogass el a <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> közösségi részlegébe vagy a támogatási oldalra. Mellékeld a <tt>VBox.log</tt> naplófájl tartalmát és a <tt>VBox.png</tt> képet, melyeket a(z) <nobr><b>%1</b></nobr> mappában megtalálsz, ahogy annak a leírásá [...]
</message>
<message>
<source>hard disk</source>
@@ -8005,7 +8350,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Biztos, hogy törlöd ezt a CD/DVD eszközt?</p><p>Enélkül nem leszel képes CD-t vagy ISO képmást csatolni, illetve az integrációs szolgáltatásokat telepíteni!</p></translation>
+ <translation type="obsolete"><p>Biztos, hogy törlöd ezt a CD/DVD eszközt?</p><p>Enélkül nem leszel képes CD-t vagy ISO képmást csatolni, illetve az integrációs szolgáltatásokat telepíteni!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8108,7 +8453,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>>Virtuális CD/DVD meghajtót adsz hozzá a vezérlőhöz: <b>%1</b>.</p><p>Szeretnél egy virtuális CD/DVD lemezt a meghajtóba tenni vagy még maradjon üresen?</p></translation>
+ <translation type="obsolete"><p>>Virtuális CD/DVD meghajtót adsz hozzá a vezérlőhöz: <b>%1</b>.</p><p>Szeretnél egy virtuális CD/DVD lemezt a meghajtóba tenni vagy még maradjon üresen?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8130,11 +8475,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nem sikerült a CD/DVD eszközt (<nobr><b>%1</b></nobr>) leválasztani a(z) <i>%2</i> foglalatról, ezen a virtuális gépen: <b>%3</b>.</translation>
+ <translation type="obsolete">Nem sikerült a CD/DVD eszközt (<nobr><b>%1</b></nobr>) leválasztani a(z) <i>%2</i> foglalatról, ezen a virtuális gépen: <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nem sikerült a floppy eszközt (<nobr><b>%1</b></nobr>) leválasztani a(z) <i>%2</i> foglalatról, ezen a virtuális gépen: <b>%3</b>.</translation>
+ <translation type="obsolete">Nem sikerült a floppy eszközt (<nobr><b>%1</b></nobr>) leválasztani a(z) <i>%2</i> foglalatról, ezen a virtuális gépen: <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -8184,11 +8529,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nem sikerült a CD/DVD eszközt (<nobr><b>%1</b></nobr>) a(z) <i>%2</i> foglalathoz társítani ezen a virtuális gépen: <b>%3</b>.</translation>
+ <translation type="obsolete">Nem sikerült a CD/DVD eszközt (<nobr><b>%1</b></nobr>) a(z) <i>%2</i> foglalathoz társítani ezen a virtuális gépen: <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nem sikerült a floppy eszközt (<nobr><b>%1</b></nobr>) a(z) <i>%2</i> foglalathoz társítani ezen a virtuális gépen: <b>%3</b>.</translation>
+ <translation type="obsolete">Nem sikerült a floppy eszközt (<nobr><b>%1</b></nobr>) a(z) <i>%2</i> foglalathoz társítani ezen a virtuális gépen: <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8442,7 +8787,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>Failed to drop data.</source>
<translatorcomment>CHECKIT: DnD operation "drop" state failed. See UIDnDHandler.</translatorcomment>
- <translation>Az adatok fogadása sikertelen.</translation>
+ <translation type="obsolete">Az adatok fogadása sikertelen.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -8676,14 +9021,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8744,6 +9081,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -9928,13 +10353,17 @@ esetleg a <b>Létező</b> gombbal a Virtuális lemezkezelőből.<
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Üdvözöl a VirtualBox!</h3><p>Az ablak bal oldali részében a virtuális gépeid listáját látod. Ez jelenleg üres, mivel még nem készítettél egyetlen virtuális gépet sem.<img src=:/welcome.png align=right/></p><p>Új virtuális gép létrehozásához kattints az <b>Új</b> gombra az eszköztáron, az ablak tetején.</p><p>Az <b>%1</b> billentyű megnyomásával azonnali segítséget kérhetsz, vagy látogass el a [...]
+ <translation type="obsolete"><h3>Üdvözöl a VirtualBox!</h3><p>Az ablak bal oldali részében a virtuális gépeid listáját látod. Ez jelenleg üres, mivel még nem készítettél egyetlen virtuális gépet sem.<img src=:/welcome.png align=right/></p><p>Új virtuális gép létrehozásához kattints az <b>Új</b> gombra az eszköztáron, az ablak tetején.</p><p>Az <b>%1</b> billentyű megnyomásával azonnali segítséget kérhetsz, va [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Kezelő</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9967,7 +10396,7 @@ esetleg a <b>Létező</b> gombbal a Virtuális lemezkezelőből.<
</message>
<message>
<source>Settings</source>
- <translation>Beállítások</translation>
+ <translation type="obsolete">Beállítások</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -10020,6 +10449,10 @@ esetleg a <b>Létező</b> gombbal a Virtuális lemezkezelőből.<
<source>Display</source>
<translation>Képernyő</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10095,6 +10528,25 @@ esetleg a <b>Létező</b> gombbal a Virtuális lemezkezelőből.<
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">jelenleg több vezérlőt használsz, mint amit a(z) %1 lapkakészlet támogat. Válassz másik lapkakészlet-típust a beállítások Rendszer lapján vagy csökkentsd a vezérlők számát a beállítások Tároló lapján: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Beállítások</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -10109,6 +10561,10 @@ esetleg a <b>Létező</b> gombbal a Virtuális lemezkezelőből.<
<source>Close</source>
<translation type="unfinished">Bezárás</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10457,7 +10913,7 @@ esetleg a <b>Létező</b> gombbal a Virtuális lemezkezelőből.<
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Fogd és vidd mód</translation>
+ <translation type="obsolete">Fogd és vidd mód</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -10471,6 +10927,10 @@ esetleg a <b>Létező</b> gombbal a Virtuális lemezkezelőből.<
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -12864,7 +13324,7 @@ Verzió %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -13735,17 +14195,17 @@ Verzió %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Ezen merevlemez csatlakoztatása egy új különbözeti lemez készítését fogja okozni.</translation>
+ <translation type="obsolete">Ezen merevlemez csatlakoztatása egy új különbözeti lemez készítését fogja okozni.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Valamelyik média ebben a merevlemez-láncban elérhetetlen. Kérlek, használd a Virtuális médiakezelőt <b>Különbözeti merevlemezek mutatása</b> módban a probléma felderítéséhez.</translation>
+ <translation type="obsolete">Valamelyik média ebben a merevlemez-láncban elérhetetlen. Kérlek, használd a Virtuális médiakezelőt <b>Különbözeti merevlemezek mutatása</b> módban a probléma felderítéséhez.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Ez az alap merevlemez a következő különbözeti lemezzel lesz csatlakoztatva:</translation>
+ <translation type="obsolete">Ez az alap merevlemez a következő különbözeti lemezzel lesz csatlakoztatva:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -13785,7 +14245,7 @@ Verzió %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -14348,12 +14808,12 @@ Verzió %1</translation>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Engedélyezve</translation>
+ <translation type="obsolete">Engedélyezve</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Letiltva</translation>
+ <translation type="obsolete">Letiltva</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -14463,6 +14923,105 @@ Verzió %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Aktív</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Aktív</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Aktív</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -15114,6 +15673,10 @@ to the system default language.</qt>
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Új virtuális merevlemez készítése</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
index f361668..cd00a3c 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts
@@ -281,7 +281,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Mode Seam&less</translation>
+ <translation type="unfinished">Mode Seam&less</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -305,11 +305,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Matikan Integrasi &Mouse</translation>
+ <translation type="obsolete">Matikan Integrasi &Mouse</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Mematikan sementara integrasi mouse pointer pada host</translation>
+ <translation type="obsolete">Mematikan sementara integrasi mouse pointer pada host</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -321,11 +321,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Insert Ctrl+Alt+Del</translation>
+ <translation type="obsolete">&Insert Ctrl+Alt+Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Kirim sekuens Ctrl+Alt+Del pada mesin virtual</translation>
+ <translation type="obsolete">Kirim sekuens Ctrl+Alt+Del pada mesin virtual</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -333,7 +333,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Kirim sekuens Ctrl+Alt+Backspace pada mesin virtual</translation>
+ <translation type="obsolete">Kirim sekuens Ctrl+Alt+Backspace pada mesin virtual</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -404,16 +404,8 @@
<translation>&Device</translation>
</message>
<message>
- <source>&CD/DVD Devices</source>
- <translation></translation>
- </message>
- <message>
- <source>&Floppy Devices</source>
- <translation></translation>
- </message>
- <message>
<source>&USB Devices</source>
- <translation>Device &USB</translation>
+ <translation type="obsolete">Device &USB</translation>
</message>
<message>
<source>Change the settings of network adapters</source>
@@ -456,7 +448,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">Pencatatan &Log...</translation>
+ <translation type="obsolete">Pencatatan &Log...</translation>
</message>
<message>
<source>&Help</source>
@@ -485,15 +477,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Beralih ke &Fullscreen</translation>
+ <translation type="obsolete">Beralih ke &Fullscreen</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Bertukar antara mode normal dan fullscreen</translation>
+ <translation type="obsolete">Bertukar antara mode normal dan fullscreen</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Beralih ke Mode Seam&less</translation>
+ <translation type="obsolete">Beralih ke Mode Seam&less</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -501,7 +493,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Beralih ke Mode &Skala</translation>
+ <translation type="obsolete">Beralih ke Mode &Skala</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -576,10 +568,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">&File</translation>
@@ -871,10 +859,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -1039,6 +1023,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&File</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1052,6 +1125,25 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1884,6 +1976,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Appliance Export Wizard</source>
@@ -2342,11 +2459,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Tidak terpasang</translation>
@@ -2575,6 +2687,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Pengendali USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2945,18 +3112,6 @@
<translation type="obsolete">Matikan &ScreenSaver Host</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4099,12 +4254,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Mengindikasikan aktifitas media CD/DVD:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Mengindikasikan aktifitas media CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Mengindikasikan aktifitas media floppy:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Mengindikasikan aktifitas media floppy:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4207,6 +4362,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4496,10 +4661,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4551,43 +4712,35 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">ToolBar Mini:</translation>
+ <translation type="obsolete">ToolBar Mini:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Bila ditandai, menampilkan ToolBar Mini dalam mode Fullscreen dan Seamless.</translation>
+ <translation type="obsolete">Bila ditandai, menampilkan ToolBar Mini dalam mode Fullscreen dan Seamless.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Tampilkan Dalam &Fullscreen/Seamless</translation>
+ <translation type="obsolete">Tampilkan Dalam &Fullscreen/Seamless</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Bila ditandai, menampilkan ToolBar Mini di puncak layar, bukan di posisi default di dasar layar.</translation>
+ <translation type="obsolete">Bila ditandai, menampilkan ToolBar Mini di puncak layar, bukan di posisi default di dasar layar.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">&Tampilkan Di Puncak Layar</translation>
+ <translation type="obsolete">&Tampilkan Di Puncak Layar</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4754,7 +4907,127 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">ToolBar Mini:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Bila ditandai, menampilkan ToolBar Mini dalam mode Fullscreen dan Seamless.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Tampilkan Dalam &Fullscreen/Seamless</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Bila ditandai, menampilkan ToolBar Mini di puncak layar, bukan di posisi default di dasar layar.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">&Tampilkan Di Puncak Layar</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5287,19 +5560,19 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>BIla ditandai, pipa yang disebutkan dalam field <b>Path Port</b> akan diciptakan oleh mesin virtual saat ia mulai menyala. Jika tidak, mesin virtual akan menganggap pipa ada dan mencoba menggunakannya.</translation>
+ <translation type="obsolete">BIla ditandai, pipa yang disebutkan dalam field <b>Path Port</b> akan diciptakan oleh mesin virtual saat ia mulai menyala. Jika tidak, mesin virtual akan menganggap pipa ada dan mencoba menggunakannya.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Ciptakan Pipa</translation>
+ <translation type="obsolete">&Ciptakan Pipa</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Tampilkan path ke pipa port serial pada host saat port bekerja pada mode <b>Pipa Host</a>, atau nama device serial host saat port bekerja pada mode <b>Device Host</b>.</translation>
+ <translation type="obsolete">Tampilkan path ke pipa port serial pada host saat port bekerja pada mode <b>Pipa Host</a>, atau nama device serial host saat port bekerja pada mode <b>Device Host</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Path Port/File:</translation>
+ <translation type="obsolete">&Path Port/File:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5309,6 +5582,22 @@
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Tampilkan alamat dasar port I/O dari port paralel ini. Nilai yang valid adalah bilangan bulat dalam jangkauan <tt>0</tt> hingga <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5389,11 +5678,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Tambah Device CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Tambah Device CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Tambah Device Floppy</nobr></translation>
+ <translation type="obsolete"><nobr>Tambah Device Floppy</nobr></translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -5433,11 +5722,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Tambah Device CD/DVD</translation>
+ <translation type="obsolete">Tambah Device CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Tambah Device Floppy</translation>
+ <translation type="obsolete">Tambah Device Floppy</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5589,15 +5878,15 @@
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&Drive CD/DVD:</translation>
+ <translation type="obsolete">&Drive CD/DVD:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Pilih disk CD/DVD virtual atau drive fisik untuk dipakai dengan drive virtual. Mesin virtual akan melihat suatu disk disisipkan ke dalam drive dengan data dalam file atau pada disk dalam drive fisik sebagai isinya.</translation>
+ <translation type="obsolete">Pilih disk CD/DVD virtual atau drive fisik untuk dipakai dengan drive virtual. Mesin virtual akan melihat suatu disk disisipkan ke dalam drive dengan data dalam file atau pada disk dalam drive fisik sebagai isinya.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Set up drive CD/DVD virtual</translation>
+ <translation type="obsolete">Set up drive CD/DVD virtual</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -5621,7 +5910,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Pilih sebuah file CD/DVD virtual...</translation>
+ <translation type="obsolete">Pilih sebuah file CD/DVD virtual...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -5721,6 +6010,38 @@
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6101,10 +6422,6 @@
<translation type="obsolete">USB 2.0 kini diaktifkan bagi mesin virtual ini. Namun, ini memerlukan instalasi <b>%1</b>. Silakan instal Extension Pack dari situs download VirtualBox. Setelah ini Anda akan dapat mengaktifkan ulang USB 2.0. Ini akan dimatikan sementara kecuali Anda membatalkan perubahan pengaturan kini.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6124,6 +6441,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6297,6 +6618,14 @@
<source>Close</source>
<translation type="unfinished">Tutup</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Beralih</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6340,7 +6669,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Gagal menciptakan obyek COM VirtualBox.</p><p>Aplikasi sekarang akan ditutup.</p></translation>
+ <translation type="obsolete"><p>Gagal menciptakan obyek COM VirtualBox.</p><p>Aplikasi sekarang akan ditutup.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -6944,7 +7273,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Sebuah versi baru VirtualBox telah dirlis! Versi <b>%1</b> tersedia di <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Anda dapat mendownload versi ini memakai taut:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Sebuah versi baru VirtualBox telah dirlis! Versi <b>%1</b> tersedia di <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Anda dapat mendownload versi ini memakai taut:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7020,7 +7349,7 @@
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Satu atau lebih hard disk virtual, CD/DVD, atau media floppy kini tak dapat diakses. Akibatnya, Anda tak akan bisa mengoperasikan mesin virtual yang memakai media tersebut sampai mereka menjadi bisa diakses nanti.</p><p>Tekan <b>Periksa</b> untuk membuka window Manajer Media Virtual dan melihat media apa yang tak dapat diakses, atau tekan <b>Abaikan</b> untuk mengabaikan pesan ini.</p></translation>
+ <translation type="obsolete"><p>Satu atau lebih hard disk virtual, CD/DVD, atau media floppy kini tak dapat diakses. Akibatnya, Anda tak akan bisa mengoperasikan mesin virtual yang memakai media tersebut sampai mereka menjadi bisa diakses nanti.</p><p>Tekan <b>Periksa</b> untuk membuka window Manajer Media Virtual dan melihat media apa yang tak dapat diakses, atau tekan <b>Abaikan</b> untuk mengabaikan pesan ini.</p></translation>
</message>
<message>
<source>E&xit</source>
@@ -7029,7 +7358,7 @@
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Kesalahan kritikal telah terjadi saat menjalankan mesin virtual dan eksekusi mesin telah dihentikan.</p><p>Untuk bantuan, silakan kunjungi bagian Community pada <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> atau kontrak pendukung Anda. Mohon sediakan isi dari file log <tt>VBox.log</tt> dan file image <tt>VBox.png</tt>, yang dapat Anda temukan pada direktori <nobr><b>%1</b>< [...]
+ <translation type="obsolete"><p>Kesalahan kritikal telah terjadi saat menjalankan mesin virtual dan eksekusi mesin telah dihentikan.</p><p>Untuk bantuan, silakan kunjungi bagian Community pada <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> atau kontrak pendukung Anda. Mohon sediakan isi dari file log <tt>VBox.log</tt> dan file image <tt>VBox.png</tt>, yang dapat Anda temukan pada direktori <nobr><b> [...]
</message>
<message>
<source>hard disk</source>
@@ -7250,7 +7579,7 @@
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Apakah Anda yakin hendak menghapus device CD/DVD?</p><p>Anda tak akan bisa me-mount image CD atau ISO atau menginstall Guest Addition tanpanya!</p></translation>
+ <translation type="obsolete"><p>Apakah Anda yakin hendak menghapus device CD/DVD?</p><p>Anda tak akan bisa me-mount image CD atau ISO atau menginstall Guest Addition tanpanya!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -7354,7 +7683,7 @@
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Anda akan menambahkan sebuah drive CD/DVD baru ke pengendali <b>%1</b>.</p><p>Apakah Anda ingin memilih suatu disk CD/DVD virtual untuk diletakkan di dalam drive atau membiarkannya kosong untuk saat ini?</p></translation>
+ <translation type="obsolete"><p>Anda akan menambahkan sebuah drive CD/DVD baru ke pengendali <b>%1</b>.</p><p>Apakah Anda ingin memilih suatu disk CD/DVD virtual untuk diletakkan di dalam drive atau membiarkannya kosong untuk saat ini?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -7376,11 +7705,11 @@
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Gagal mencopot device CD/DVD (<nobr><b>%1</b></nobr>) dari slot <i>%2</i> mesin <b>%3</b>.</translation>
+ <translation type="obsolete">Gagal mencopot device CD/DVD (<nobr><b>%1</b></nobr>) dari slot <i>%2</i> mesin <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Gagal mencopot device floppy (<nobr><b>%1</b></nobr>) dari slot <i>%2</i> mesin <b>%3</b>.</translation>
+ <translation type="obsolete">Gagal mencopot device floppy (<nobr><b>%1</b></nobr>) dari slot <i>%2</i> mesin <b>%3</b>.</translation>
</message>
<message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
@@ -7412,11 +7741,11 @@
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Gagal mencantol device CD/DVD (<nobr><b>%1</b></nobr>) ke slot <i>%2</i> mesin <b>%3</b>.</translation>
+ <translation type="obsolete">Gagal mencantol device CD/DVD (<nobr><b>%1</b></nobr>) ke slot <i>%2</i> mesin <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Gagal mencantol device floppy (<nobr><b>%1</b></nobr>) ke slot <i>%2</i> mesin <b>%3</b>.</translation>
+ <translation type="obsolete">Gagal mencantol device floppy (<nobr><b>%1</b></nobr>) ke slot <i>%2</i> mesin <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -7665,10 +7994,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7896,14 +8221,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7964,6 +8281,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8938,13 +9343,17 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Selamat datang di VirtualBox!</h3><p>Bagian kiri dari jendela ini ditujukan untuk menampilkan daftar dari semua mesin virtual dalam komputer Anda. Daftar ini saat ini kosong karena Anda belum menciptakan mesin virtual apapun.<img src=:/welcome.png align=right/></p><p>Untuk menciptakan mesin virtual baru, tekan tombol <b>Baru</b> pada toolbar utama yang terletak di bagian atas jendela.</p>< [...]
+ <translation type="obsolete"><h3>Selamat datang di VirtualBox!</h3><p>Bagian kiri dari jendela ini ditujukan untuk menampilkan daftar dari semua mesin virtual dalam komputer Anda. Daftar ini saat ini kosong karena Anda belum menciptakan mesin virtual apapun.<img src=:/welcome.png align=right/></p><p>Untuk menciptakan mesin virtual baru, tekan tombol <b>Baru</b> pada toolbar utama yang terletak di bagian atas jendela.</p><p& [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished">- Manajer</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8977,7 +9386,7 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
</message>
<message>
<source>Settings</source>
- <translation>Setting</translation>
+ <translation type="obsolete">Setting</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -9030,6 +9439,10 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<source>Display</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -9081,6 +9494,25 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<source>%1 - %2</source>
<translation>%1 - %2</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Setting</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -9095,6 +9527,10 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<source>Close</source>
<translation type="unfinished">Tutup</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -9400,10 +9836,6 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -9415,6 +9847,10 @@ langkah ini dan memasang hard disk pada waktu lain menggunakan dialog Setting Me
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11500,7 +11936,7 @@ Versi %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12311,17 +12747,17 @@ Versi %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Pencantolan hard disk ini akan dilakukan secara tidak langsung menggunakan hard disk pembeda yang baru dibuat.</translation>
+ <translation type="obsolete">Pencantolan hard disk ini akan dilakukan secara tidak langsung menggunakan hard disk pembeda yang baru dibuat.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Beberapa media dalam rangkaian hard disk ini tak dapat diakses. Silakan pakai Manajer Media Virtual dalam mode <b>Tampilkan Hard Disk Pembeda</b> untuk memeriksa media tersebut.</translation>
+ <translation type="obsolete">Beberapa media dalam rangkaian hard disk ini tak dapat diakses. Silakan pakai Manajer Media Virtual dalam mode <b>Tampilkan Hard Disk Pembeda</b> untuk memeriksa media tersebut.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Hard disk dasar ini dicantolkan secara tidak langsung memakai hard disk pembeda berikut:</translation>
+ <translation type="obsolete">Hard disk dasar ini dicantolkan secara tidak langsung memakai hard disk pembeda berikut:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -12361,7 +12797,7 @@ Versi %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Screens</source>
@@ -12902,16 +13338,6 @@ Versi %1</translation>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -13009,6 +13435,105 @@ Versi %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Aktif</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Aktif</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Aktif</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13860,6 +14385,10 @@ ke nilai awal bahasa sistem.</qt>
<source>C&lose</source>
<translation type="obsolete">&Tutup</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
index 94f9549..761c6b7 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts
@@ -304,19 +304,19 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Disabilita l'integrazione &mouse (MI)</translation>
+ <translation type="obsolete">Disabilita l'integrazione &mouse (MI)</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Disabilita temporaneamente l'integrazione con il puntatore del mouse</translation>
+ <translation type="obsolete">Disabilita temporaneamente l'integrazione con il puntatore del mouse</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Invia Ctrl-Alt-Canc</translation>
+ <translation type="obsolete">&Invia Ctrl-Alt-Canc</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Invia la sequenza Ctrl-Alt-Canc alla macchina virtuale</translation>
+ <translation type="obsolete">Invia la sequenza Ctrl-Alt-Canc alla macchina virtuale</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -324,7 +324,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Invia la sequenza Ctrl-Alt-Backspace alla macchina virtuale</translation>
+ <translation type="obsolete">Invia la sequenza Ctrl-Alt-Backspace alla macchina virtuale</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -335,8 +335,8 @@
<translation>Crea un'istantanea della macchina virtuale</translation>
</message>
<message>
- <source>Show Session Information Dialog</source>
- <translation type="obsolete">Visualizza la finestra Informazioni di sessione</translation>
+ <source>Show Session Information Window</source>
+ <translation>Mostra la finestra Informazioni di sessione</translation>
</message>
<message>
<source>&Pause</source>
@@ -380,15 +380,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Dispositivi &CD/DVD</translation>
+ <translation type="obsolete">Dispositivi &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Dispositivi &floppy</translation>
+ <translation type="obsolete">Dispositivi &floppy</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Dispositivi &USB</translation>
+ <translation type="obsolete">Dispositivi &USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -407,12 +407,12 @@
<translation>Apri la finestra per gestire le cartelle condivise</translation>
</message>
<message>
- <source>&Install Guest Additions...</source>
- <translation type="obsolete">&Installa Guest Additions...</translation>
+ <source>&Insert Guest Additions CD image...</source>
+ <translation>&Inserisci l'immagine del CD delle Guest Additions...</translation>
</message>
<message>
- <source>Mount the Guest Additions installation image</source>
- <translation type="obsolete">Monta l'immagine per l'installazione delle Guest Additions</translation>
+ <source>Insert the Guest Additions disk file into the virtual drive</source>
+ <translation>Inserisci il file del disco delle Guest Additions nel lettore virtuale</translation>
</message>
<message>
<source>De&bug</source>
@@ -455,15 +455,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Passa a sc&hermo intero</translation>
+ <translation type="obsolete">Passa a sc&hermo intero</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Passa da schermo normale a schermo intero</translation>
+ <translation type="obsolete">Passa da schermo normale a schermo intero</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Passa a&lla modalità trasparente</translation>
+ <translation type="obsolete">Passa a&lla modalità trasparente</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -471,7 +471,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Passa alla modalità &scalata</translation>
+ <translation type="obsolete">Passa alla modalità &scalata</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -507,7 +507,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Moda&lità trasparente</translation>
+ <translation>Moda&lità trasparente</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -548,7 +548,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>&Registrazione...</translation>
+ <translation type="obsolete">&Registrazione...</translation>
</message>
<message>
<source>Enter &Fullscreen Mode</source>
@@ -786,7 +786,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Invia Ctrl-Alt-Backspac&e</translation>
+ <translation type="obsolete">Invia Ctrl-Alt-Backspac&e</translation>
</message>
<message>
<source>Sort List</source>
@@ -1070,7 +1070,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Trascina e rilascia</translation>
+ <translation type="obsolete">Trascina e rilascia</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -1113,138 +1113,230 @@
<translation>Menu a comparsa</translation>
</message>
<message>
- <source>Show Session Information Window</source>
- <translation type="unfinished"></translation>
+ <source>&Insert Guest Additions CD image...</source>
+ <comment>new</comment>
+ <translation type="obsolete">&Installa Guest Additions...</translation>
</message>
<message>
- <source>&Webcams</source>
- <translation type="unfinished"></translation>
+ <source>Insert the Guest Additions disk file into the virtual drive</source>
+ <comment>new</comment>
+ <translation type="obsolete">Monta l'immagine per l'installazione delle Guest Additions</translation>
</message>
<message>
- <source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished"></translation>
+ <source>&Webcams</source>
+ <translation>&Webcam</translation>
</message>
<message>
- <source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished"></translation>
+ <source>Network</source>
+ <translation>Rete</translation>
</message>
<message>
<source>&VirtualBox</source>
- <translation type="unfinished"></translation>
+ <translation>&VirtualBox</translation>
+ </message>
+ <message>
+ <source>&File</source>
+ <translation>&File</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation>&Finestra</translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation>&Minimizza</translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation>Minimizza la finestra della macchina attiva</translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation>Modalità scher&mo intero</translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation>Passa dalla modalità normale a quella a schermo intero</translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation>Modalità s&calata</translation>
</message>
<message>
<source>&Menu Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Barra dei &menu</translation>
</message>
<message>
<source>&Menu Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Impostazioni barra dei &menu...</translation>
</message>
<message>
<source>Opens window to configure menu-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Apre la finestra per configurare la barra dei menu</translation>
</message>
<message>
<source>Show Menu &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Mostra &barra dei menu</translation>
</message>
<message>
<source>Toggle menu-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Commuta la visibilità della barra dei menu per questa macchina</translation>
</message>
<message>
<source>&Status Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Barra di &stato</translation>
</message>
<message>
<source>&Status Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Impostazioni barra di &stato...</translation>
</message>
<message>
<source>Opens window to configure status-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Apre la finestra per configurare la barra di stato</translation>
</message>
<message>
<source>Show Status &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Mostra &barra di stato</translation>
</message>
<message>
<source>Toggle status-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Commuta la visibilità della barra di stato per questa macchina</translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation>Fattore di s&cala</translation>
</message>
<message>
<source>&Input</source>
- <translation type="unfinished"></translation>
+ <translation>&Inserimento</translation>
</message>
<message>
<source>&Keyboard</source>
- <translation type="unfinished">&Tastiera</translation>
+ <translation>&Tastiera</translation>
</message>
<message>
<source>&Keyboard Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Impostazio&ni della tastiera...</translation>
</message>
<message>
<source>Display the global settings window to configure shortcuts</source>
- <translation type="unfinished"></translation>
+ <translation>Visualizza la finestra delle impostazioni globali per configurare le scorciatoie</translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation>&Inserisci %1</translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation>Invia la sequenza %1 alla macchina virtuale</translation>
</message>
<message>
<source>&Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>&Mouse</translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation>Integrazione &mouse</translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation>Abilita l'integrazione con il puntatore del mouse dell'host</translation>
</message>
<message>
<source>&Hard Drives</source>
- <translation type="unfinished"></translation>
+ <translation>&Dischi fissi</translation>
</message>
<message>
<source>&Hard Drive Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Impostazioni dei &dischi fissi...</translation>
</message>
<message>
<source>Change the settings of hard drives</source>
- <translation type="unfinished"></translation>
+ <translation>Cambia le impostazioni dei dischi fissi</translation>
</message>
<message>
- <source>Network</source>
- <translation type="unfinished">Rete</translation>
+ <source>&Optical Drives</source>
+ <translation>Lettori &ottici</translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation>Lettori &floppy</translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation>&USB</translation>
</message>
<message>
<source>&USB Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Impostazioni &USB...</translation>
</message>
<message>
<source>Change the settings of USB devices</source>
- <translation type="unfinished"></translation>
+ <translation>Cambia le impostazioni dei dispositivi USB</translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation>Trascinamento e rilascio</translation>
</message>
<message>
<source>&Shared Folders</source>
- <translation type="unfinished"></translation>
+ <translation>Cartelle condivi&se</translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation>&Registrazione</translation>
</message>
<message>
<source>Show &Log...</source>
<comment>debug action</comment>
- <translation type="unfinished">Mostra &log...</translation>
+ <translation>Mostra &log...</translation>
</message>
<message>
<source>E&xtra Data Manager...</source>
- <translation type="unfinished"></translation>
+ <translation>Ge&store dati aggiuntivi...</translation>
</message>
<message>
<source>Display the Extra Data Manager window</source>
- <translation type="unfinished"></translation>
+ <translation>Mostra la finestra del Gestore dati aggiuntivi</translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation>Avvio &normale</translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished">Avvio senza &testa</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation>Avvia le macchine virtuali selezionate sullo sfondo</translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished">Avvio sgancia&bile</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation>Avvia le macchine virtuali selezionate con la possibilità di proseguire l'esecuzione sullo sfondo</translation>
</message>
</context>
<context>
<name>UIActionPoolRuntime</name>
<message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation>%1%</translation>
+ </message>
+ <message>
<source>Enable</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished">Abilita</translation>
+ <translation>Abilita</translation>
</message>
<message>
<source>Resize to %1x%2</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>Ridimensiona a %1x%2</translation>
</message>
</context>
<context>
@@ -1255,6 +1347,21 @@
</message>
</context>
<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation>%1 - Cifratura del disco</translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation>
+ <numerusform>Questa macchina virtuale è protetta da password. Digita la password di cifratura di seguito.</numerusform>
+ <numerusform>Questa macchina virtuale è protetta da password. Digita le %n password di cifratura di seguito.</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIApplianceEditorWidget</name>
<message>
<source>Virtual System %1</source>
@@ -2063,7 +2170,7 @@
<name>UIDnDDrag</name>
<message>
<source>Retrieving data ...</source>
- <translation type="unfinished"></translation>
+ <translation>Recupero dei dati in corso...</translation>
</message>
</context>
<context>
@@ -2189,6 +2296,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation>Stato</translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation>Password</translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation>
+ <numerusform><nobr>Utilizzato dal seguente disco fisso:</nobr><br>%1</numerusform>
+ <numerusform><nobr>Utilizzato dai seguenti %n dischi fissi:</nobr><br>%1</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Appliance Export Wizard</source>
@@ -2922,7 +3055,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -3166,12 +3299,67 @@ p, li { white-space: pre-wrap; }
<message>
<source>Minimal Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Paravirtualizzazione minimale</translation>
</message>
<message>
<source>Hyper-V Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Paravirtualizzazione Hyper-V</translation>
+ </message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation>Paravirtualizzazione KVM</translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation>[Lettori ottici]</translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation>Controller USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation>Fattore di scala</translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation>Uscita video HiDPI non scalata</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation>Abilitata</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation>Posizione barra degli strumenti piccola</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>Alto</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>Basso</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation>Barra degli strumenti piccola</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation>Disabilitata</translation>
</message>
</context>
<context>
@@ -3571,15 +3759,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Machine Windows:</source>
- <translation type="unfinished"></translation>
+ <translation>Finestre delle macchine:</translation>
</message>
<message>
<source>If checked, machine windows will be raised when the mouse pointer moves over them.</source>
- <translation type="unfinished"></translation>
+ <translation>Se marcata, le finestre delle macchine saranno alzate quando il puntatore del mouse le sorvola.</translation>
</message>
<message>
<source>&Raise Window Under Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>Alza la finest&ra sotto il mouse</translation>
</message>
</context>
<context>
@@ -3689,15 +3877,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>&Pannello e barra dei menu:</translation>
+ <translation type="obsolete">&Pannello e barra dei menu:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>Mostra automaticamente a schermo intero</translation>
+ <translation type="obsolete">Mostra automaticamente a schermo intero</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>Se marcata, il pannello e la barra dei menu dell'host saranno mostrati quando la macchina virtuale è in modalità a schermo intero.</translation>
+ <translation type="obsolete">Se marcata, il pannello e la barra dei menu dell'host saranno mostrati quando la macchina virtuale è in modalità a schermo intero.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -4912,12 +5100,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica l'attività dei dispositivi CD/DVD:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica l'attività dei dispositivi CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica l'attività dei dispositivi floppy:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica l'attività dei dispositivi floppy:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -5022,8 +5210,18 @@ p, li { white-space: pre-wrap; }
<translation>Stato delle funzionalità aggiuntive:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></translation>
</message>
<message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Indica l'attività dei lettori ottici:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Indica l'attività dei lettori di floppy:</nobr>%1</p></translation>
+ </message>
+ <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
- <translation type="unfinished"></translation>
+ <translation><p style='white-space:pre'><nobr>Indica l'attività dello schermo:</nobr>%1</p></translation>
</message>
</context>
<context>
@@ -5093,19 +5291,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No Webcams Connected</source>
- <translation type="unfinished"></translation>
+ <translation>Nessuna webcam connessa</translation>
</message>
<message>
<source>No supported webcams connected to the host PC</source>
- <translation type="unfinished"></translation>
+ <translation>Nessuna webcam supportata è connessa al PC host</translation>
</message>
<message>
<source>Connect Network Adapter</source>
- <translation type="unfinished"></translation>
+ <translation>Connetti scheda di rete</translation>
</message>
<message>
<source>Connect Network Adapter %1</source>
- <translation type="unfinished"></translation>
+ <translation>Connetti scheda di rete %1</translation>
</message>
</context>
<context>
@@ -5335,7 +5533,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>La macchina virtuale è configurata per utilizzare l'accelerazione grafica hardware e il sistema operativo è impostato a Windows Vista o successivo. Per migliori prestazioni, dovresti impostare la memoria video della macchina almeno a <b>%1</b>.</translation>
+ <translation type="obsolete">La macchina virtuale è configurata per utilizzare l'accelerazione grafica hardware e il sistema operativo è impostato a Windows Vista o successivo. Per migliori prestazioni, dovresti impostare la memoria video della macchina almeno a <b>%1</b>.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -5389,44 +5587,20 @@ p, li { white-space: pre-wrap; }
<translation>Abilita la registrazione video per lo schermo %1.</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Mini ToolBar:</source>
- <translation type="unfinished">Barra degli strumenti piccola:</translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Se marcata, mostra la barra degli strumenti piccola nelle modalità a schermo intero e trasparente.</translation>
- </message>
- <message>
- <source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Mostra a scher&mo intero/trasparente</translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Se selezionata, mostra la barra degli strumenti piccola nella parte superiore dello schermo, invece che nella posizione predefinita (in basso).</translation>
- </message>
- <message>
- <source>Show at &Top of Screen</source>
- <translation type="unfinished">Most&ra nella parte alta dello schermo</translation>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <translation type="obsolete">Lo schermo remoto è attualmente abilitato per questa macchina virtuale. Tuttavia, ciò richiede che <b>%1</b> sia installato. Installa l'Extension Pack scaricabile dal sito di VirtualBox altrimenti la MV sarà avviata senza schermo remoto.</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
- <translation type="unfinished"></translation>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <translation>Lo schermo remoto è attualmente abilitato per questa macchina virtuale. Tuttavia, ciò richiede che <b>%1</b> sia installato. Installa l'Extension Pack scaricabile dal sito di VirtualBox altrimenti la MV sarà avviata senza schermo remoto.</translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
- <translation type="unfinished"></translation>
+ <source><i>About %1MB per 5 minute video</i></source>
+ <translation><i>Circa %1MB per 5 minuti di video</i></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
- <translation type="unfinished"></translation>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
+ <translation>La macchina virtuale è configurata per utilizzare l'accelerazione grafica hardware e il sistema operativo è impostato a Windows Vista o successivo. Per avere le prestazioni migliori, dovresti impostare la memoria video della macchina almeno a <b>%1</b>.</translation>
</message>
</context>
<context>
@@ -5436,8 +5610,8 @@ p, li { white-space: pre-wrap; }
<translation>Visualizza il percorso dove saranno archiviate le istantanee di questa macchina virtuale. Nota che le istantanee possono occupare molto spazio.</translation>
</message>
<message>
- <source>Basi&c</source>
- <translation>&Base</translation>
+ <source>&Basic</source>
+ <translation type="obsolete">&Base</translation>
</message>
<message>
<source>&Name:</source>
@@ -5448,8 +5622,8 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Mostra il nome della macchina virtuale.</translation>
</message>
<message>
- <source>A&dvanced</source>
- <translation>&Avanzate</translation>
+ <source>&Advanced</source>
+ <translation type="obsolete">&Avanzate</translation>
</message>
<message>
<source>&Shared Clipboard:</source>
@@ -5464,8 +5638,8 @@ p, li { white-space: pre-wrap; }
<translation>Cartella ista&ntanee:</translation>
</message>
<message>
- <source>D&escription</source>
- <translation>&Descrizione</translation>
+ <source>&Description</source>
+ <translation type="obsolete">&Descrizione</translation>
</message>
<message>
<source>Holds the description of the virtual machine. The description field is useful for commenting on configuration details of the installed guest OS.</source>
@@ -5672,8 +5846,8 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Abilita pa&ginazione nidificata</translation>
</message>
<message>
- <source>D&rag'n'Drop:</source>
- <translation>Trasci&na e rilascia:</translation>
+ <source>&Drag'n'Drop:</source>
+ <translation type="obsolete">Trasci&na e rilascia:</translation>
</message>
<message>
<source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
@@ -5687,65 +5861,201 @@ p, li { white-space: pre-wrap; }
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation>Il sistema operativo della macchina virtuale è impostato a 64 bit. I sistemi guest a 64 bit richiedono la virtualizzazione hardware, che sarà abilitata se confermi le modifiche.</translation>
</message>
-</context>
-<context>
- <name>UIMachineSettingsNetwork</name>
<message>
- <source>When checked, plugs this virtual network adapter into the virtual machine.</source>
- <translation>Se marcata, connette questa scheda di rete virtuale alla macchina virtuale.</translation>
+ <source>Basi&c</source>
+ <translation>&Base</translation>
</message>
<message>
- <source>&Enable Network Adapter</source>
- <translation>Abilita sch&eda di rete</translation>
+ <source>A&dvanced</source>
+ <translation>A&vanzate</translation>
</message>
<message>
- <source>Selects the type of the virtual network adapter. Depending on this value, VirtualBox will provide different network hardware to the virtual machine.</source>
- <translation>Seleziona il tipo della scheda di rete virtuale. A seconda di questo valore, VirtualBox fornirà hardware di rete diverso alla macchina virtuale.</translation>
+ <source>D&rag'n'Drop:</source>
+ <translation>Trasci&na e rilascia:</translation>
</message>
<message>
- <source>&Attached to:</source>
- <translation>Conness&a a:</translation>
+ <source>D&escription</source>
+ <translation>D&escrizione</translation>
</message>
<message>
- <source>Controls how this virtual adapter is attached to the real network of the Host OS.</source>
- <translation>Controlla il modo in cui questa scheda di rete virtuale è collegata alla rete reale del sistema host.</translation>
+ <source>Enc&ryption</source>
+ <translation>Cif&ratura</translation>
</message>
<message>
- <source>Adapter &Type:</source>
- <translation>&Tipo di scheda:</translation>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation>Se marcata, abilita la cifratura per questa macchina virtuale.</translation>
</message>
<message>
- <source>no bridged network adapter is selected</source>
- <translation type="obsolete">non è selezionata alcuna scheda di rete con bridge</translation>
+ <source>En&able Encryption</source>
+ <translation>&Abilita cifratura</translation>
</message>
<message>
- <source>no internal network name is specified</source>
- <translation type="obsolete">non è specificato alcun nome di rete</translation>
+ <source>Encryption C&ipher:</source>
+ <translation>C&ifrario:</translation>
</message>
<message>
- <source>no host-only network adapter is selected</source>
- <translation type="obsolete">non è selezionata alcuna scheda di rete solo host</translation>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation>Contiene il cifrario che deve essere utilizzato per cifrare i dischi della macchina virtuale.</translation>
</message>
<message>
- <source>Not selected</source>
- <comment>network adapter name</comment>
- <translation>Non selezionata</translation>
+ <source>E&nter New Password:</source>
+ <translation>Digita la &nuova password:</translation>
</message>
<message>
- <source>&Name:</source>
- <translation>&Nome:</translation>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation>Contiene la password che deve essere assegnata alla macchina virtuale.</translation>
</message>
<message>
- <source>A&dvanced</source>
- <translation>A&vanzate</translation>
+ <source>C&onfirm New Password:</source>
+ <translation>C&onferma la nuova password:</translation>
</message>
<message>
- <source>Shows or hides additional network adapter options.</source>
- <translation>Mostra o nasconde le opzioni aggiuntive della scheda di rete.</translation>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation>Conferma la password che devono essere assegnate alla macchina virtuale.</translation>
</message>
<message>
- <source>&Mac Address:</source>
- <translation type="obsolete">Indirizzo &MAC:</translation>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation>Stai tentando di cifrare questa macchina virtuale. Tuttavia, ciò richiede che <b>%1</b> sia installato. Installa l'Extension Pack scaricabile dal sito di VirtualBox.</translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation>Tipo di cifrario non specificato.</translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation>La password di cifratura è vuota.</translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation>Le password di cifratura non coincidono.</translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation>Lascia inalterato</translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation>Consente la modifica dei contenuti della barra dei menu della MV.</translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation>Fattore di scala dello schermo:</translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation>Questa impostazione determina il fattore di scala dello schermo del guest.</translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation>100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation>200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation>HiDPI:</translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation>Se marcata, il contenuto dello schermo del guest non sarà scalato per compensare in caso di alte risoluzioni dello schermo dell'host.</translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation>&Usa uscita HiDPI non scalata</translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation>Barra degli strumenti piccola:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation>Se marcata, mostra la barra degli strumenti piccola nelle modalità a schermo intero e trasparente.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation>Mostra a scher&mo intero/trasparente</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation>Se selezionata, mostra la barra degli strumenti piccola nella parte superiore dello schermo, invece che nella posizione predefinita (in basso).</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation>Most&ra nella parte alta dello schermo</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation>Consente la modifica dei contenuti della barra di stato della MV.</translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsNetwork</name>
+ <message>
+ <source>When checked, plugs this virtual network adapter into the virtual machine.</source>
+ <translation>Se marcata, connette questa scheda di rete virtuale alla macchina virtuale.</translation>
+ </message>
+ <message>
+ <source>&Enable Network Adapter</source>
+ <translation>Abilita sch&eda di rete</translation>
+ </message>
+ <message>
+ <source>Selects the type of the virtual network adapter. Depending on this value, VirtualBox will provide different network hardware to the virtual machine.</source>
+ <translation>Seleziona il tipo della scheda di rete virtuale. A seconda di questo valore, VirtualBox fornirà hardware di rete diverso alla macchina virtuale.</translation>
+ </message>
+ <message>
+ <source>&Attached to:</source>
+ <translation>Conness&a a:</translation>
+ </message>
+ <message>
+ <source>Controls how this virtual adapter is attached to the real network of the Host OS.</source>
+ <translation>Controlla il modo in cui questa scheda di rete virtuale è collegata alla rete reale del sistema host.</translation>
+ </message>
+ <message>
+ <source>Adapter &Type:</source>
+ <translation>&Tipo di scheda:</translation>
+ </message>
+ <message>
+ <source>no bridged network adapter is selected</source>
+ <translation type="obsolete">non è selezionata alcuna scheda di rete con bridge</translation>
+ </message>
+ <message>
+ <source>no internal network name is specified</source>
+ <translation type="obsolete">non è specificato alcun nome di rete</translation>
+ </message>
+ <message>
+ <source>no host-only network adapter is selected</source>
+ <translation type="obsolete">non è selezionata alcuna scheda di rete solo host</translation>
+ </message>
+ <message>
+ <source>Not selected</source>
+ <comment>network adapter name</comment>
+ <translation>Non selezionata</translation>
+ </message>
+ <message>
+ <source>&Name:</source>
+ <translation>&Nome:</translation>
+ </message>
+ <message>
+ <source>A&dvanced</source>
+ <translation>A&vanzate</translation>
+ </message>
+ <message>
+ <source>Shows or hides additional network adapter options.</source>
+ <translation>Mostra o nasconde le opzioni aggiuntive della scheda di rete.</translation>
+ </message>
+ <message>
+ <source>&Mac Address:</source>
+ <translation type="obsolete">Indirizzo &MAC:</translation>
</message>
<message>
<source>Holds the MAC address of this adapter. It contains exactly 12 characters chosen from {0-9,A-F}. Note that the second character must be an even digit.</source>
@@ -6332,6 +6642,10 @@ p, li { white-space: pre-wrap; }
<source>If checked, this shared folder will be permanent.</source>
<translation>Se marcata, la cartella condivisa sarà permanente.</translation>
</message>
+ <message>
+ <source>Window</source>
+ <translation type="obsolete">Finestra</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerial</name>
@@ -6374,19 +6688,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Se marcata, la pipe specificata nel campo <b>Percorso porta</b> sarà creata dalla macchina virtuale all'avvio. In caso contrario, la macchina virtuale proverà ad utilizzare la pipe esistente.</translation>
+ <translation type="obsolete">Se marcata, la pipe specificata nel campo <b>Percorso porta</b> sarà creata dalla macchina virtuale all'avvio. In caso contrario, la macchina virtuale proverà ad utilizzare la pipe esistente.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Crea pipe</translation>
+ <translation type="obsolete">&Crea pipe</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Visualizza il percorso della pipe per la porta seriale nel sistema host quando la porta lavora in modalità <b>Pipe host</b>, o il nome del dispositivo seriale dell'host quando la porta è in modalità <b>Dispositivo host</b>.</translation>
+ <translation type="obsolete">Visualizza il percorso della pipe per la porta seriale nel sistema host quando la porta lavora in modalità <b>Pipe host</b>, o il nome del dispositivo seriale dell'host quando la porta è in modalità <b>Dispositivo host</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Porta/&Percorso file:</translation>
+ <translation type="obsolete">Porta/&Percorso file:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -6408,6 +6722,22 @@ p, li { white-space: pre-wrap; }
<source>Port &Path:</source>
<translation type="obsolete">&Percorso porta:</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation>Se marcata, la macchina virtuale assumerà che la pipe o il socket specificato nel campo <b>Percorso/Indirizzo</b> esista e proverà a utilizzarla.Altrimenti, la pipe o il socket saranno creati dalla macchina virtuale al suo avvio.</translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation>&Connetti alla pipe/socket esistente</translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation>&Percorso/Indirizzo:</translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation><p>Nella modalità <b>Pipe host</b>: contiene il percorso della pipe della porta seriale sull'host. Esempi: "\\.\pipe\myvbox" o "/tmp/myvbox", rispettivamente per Windows e sistemi di tipo UNIX.</p><p>Nella modalità <b>Dispositivo host</b>: contiene il nomde del dispositivo seriale dell'host. Esempi: "COM1" o "/dev/ttyS0".</p><p>Nella modalità <b>File raw</ [...]
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6460,11 +6790,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Aggiungi dispositivo CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Aggiungi dispositivo CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Aggiungi dispositivo floppy</nobr></translation>
+ <translation type="obsolete"><nobr>Aggiungi dispositivo floppy</nobr></translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -6504,11 +6834,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Aggiungi dispositivo CD/DVD</translation>
+ <translation type="obsolete">Aggiungi dispositivo CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Aggiungi dispositivo floppy</translation>
+ <translation type="obsolete">Aggiungi dispositivo floppy</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6660,15 +6990,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>Lettore C&D/DVD:</translation>
+ <translation type="obsolete">Lettore C&D/DVD:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Scegli un disco CD/DVD virtuale o un lettore fisico da utilizzare come lettore virtuale. La macchina virtuale vedrà il contenuto di un disco inserito nel lettore con i dati nel file o nel disco che si trova nel lettore fisico.</translation>
+ <translation type="obsolete">Scegli un disco CD/DVD virtuale o un lettore fisico da utilizzare come lettore virtuale. La macchina virtuale vedrà il contenuto di un disco inserito nel lettore con i dati nel file o nel disco che si trova nel lettore fisico.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Configura il lettore CD/DVD virtuale</translation>
+ <translation type="obsolete">Configura il lettore CD/DVD virtuale</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6692,7 +7022,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Scegli un file di disco CD/DVD virtuale...</translation>
+ <translation type="obsolete">Scegli un file di disco CD/DVD virtuale...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6889,16 +7219,48 @@ p, li { white-space: pre-wrap; }
<translation>La macchina attualmente ha più controller di archiviazione assegnati di quanti ne supporta il chipset %1. Cambia il tipo di chipset nella pagina delle impostazioni Sistema o riduci il seguente numero dei controller di archiviazione nella pagina delle impostazioni Archiviazione: %2</translation>
</message>
<message>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <translation>Se marcata, il sistema guest vedrà il disco virtuale come un dispositivo collegabile a caldo.</translation>
+ </message>
+ <message>
+ <source>&Hot-pluggable</source>
+ <translation>Collega&bile a caldo</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation>Scegli un file di disco ottico virtuale...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation><nobr>Aggiungi lettore ottico</nobr></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation><nobr>Aggiungi lettore floppy</nobr></translation>
+ </message>
+ <message>
<source>Add USB Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Aggiungi controller USB</translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
- <translation type="unfinished"></translation>
+ <source>Add Optical Drive</source>
+ <translation>Aggiungi lettore ottico</translation>
</message>
<message>
- <source>&Hot-pluggable</source>
- <translation type="unfinished"></translation>
+ <source>Add Floppy Drive</source>
+ <translation>Aggiungi lettore floppy</translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation>Lettore &ottico:</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation>Scegli un disco ottico virtuale o un lettore fisico per utilizzare questo lettore virtuale. La macchina virtuale vedrà un disco inserito nel lettore con i dati nel file o sul disco nel lettore virtuale come il suo contenuto.</translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation>Configura il lettore ottico virtuale</translation>
</message>
</context>
<context>
@@ -7170,27 +7532,27 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Paravirtualization Interface:</source>
- <translation type="unfinished"></translation>
+ <translation>Interfaccia di ¶virtualizzazione:</translation>
</message>
<message>
<source>Selects the paravirtualization guest interface provider to be used by this virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Seleziona il fornitore dell'interfaccia di paravirtualizzazione del guest che deve essere utilizzato da questa macchina virtuale.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9 you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>La funzionalità I/O APIC non è attualmente abilitata nella sezione Scheda madre della pagina Sistema. Questa funzionalità è richiesta per supportare un chipset di tipo ICH9 che hai abilitato per questa MV. Sarà abilitata automaticamente se confermi le modifiche.</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>L'emulazione del controller USB non è attualmente abilitata nella pagina USB. Questa funzionalità è richiesta per supportare un dispositivo di inserimento USB emulato. Sarà abilitata automaticamente se confermi le modifiche.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>La funzionalità I/O APIC non è attualmente abilitata nella sezione Scheda madre della pagina Sistema. Questa funzionalità è richiesta per supportare più di un processore virtuale che hai scelto per questa MV. Sarà attivata automaticamente se confermi le modifiche.</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>La virtualizzazione hardware non è attualmente abilitata nella sezione Accelerazione della pagina Sistema. Questa funzionalità è richiesta per supportare più di un processore virtuale che hai scelto per questa MV. Sarà abilitata automaticamente se confermi le modifiche.</translation>
</message>
</context>
<context>
@@ -7326,27 +7688,31 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>USB 2.0 è attualmente abilitato per questa macchina virtuale. Ciò richiedere che <b>%1</b> sia installato. Installa l'Extension Pack dal sito di VirtualBox o disabilita USB 2.0 per poter avviare la macchina.</translation>
+ <translation type="obsolete">USB 2.0 è attualmente abilitato per questa macchina virtuale. Ciò richiedere che <b>%1</b> sia installato. Installa l'Extension Pack dal sito di VirtualBox o disabilita USB 2.0 per poter avviare la macchina.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>Se marcata, abilita il controller USB OHCI virtuale di questa macchina. Il controller USB OHCI fornisce il supporto a USB 1.0.</translation>
</message>
<message>
<source>USB &1.1 (OHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Controller USB &1.1 (OHCI)</translation>
</message>
<message>
<source>USB &2.0 (EHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Controller USB &2.0 (EHCI)</translation>
</message>
<message>
<source>When checked, enables the virtual USB xHCI controller of this machine. The USB xHCI controller provides USB 3.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>Se marcata, abilita il controller USB xHCI virtuale di questa macchina. Il controller USB xHCI fornisce il supporto a USB 3.0.</translation>
</message>
<message>
<source>USB &3.0 (xHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Controller USB &3.0 (xHCI)</translation>
+ </message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation>USB 2.0/3.0 è attualmente abilitato per questa macchina virtuale. Tuttavia, ciò richiede che <b>%1</b> sia installato. Installa l'Extension Pack scaricabile dal sito di VirtualBox o disabilita USB 2.0/3.0 per poter avviare la macchina.</translation>
</message>
</context>
<context>
@@ -7489,7 +7855,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Removing medium...</source>
- <translation type="unfinished"></translation>
+ <translation>Rimozione supporto...</translation>
</message>
</context>
<context>
@@ -7511,15 +7877,23 @@ p, li { white-space: pre-wrap; }
<name>UIMenuBarEditorWidget</name>
<message>
<source>Virtual Screen Resize</source>
- <translation type="unfinished"></translation>
+ <translation>Ridimensionamento schermo virtuale</translation>
</message>
<message>
<source>Virtual Screen Mapping</source>
- <translation type="unfinished"></translation>
+ <translation>Mappatura dello schermo virtuale</translation>
+ </message>
+ <message>
+ <source>Switch</source>
+ <translation>Cambia</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Chiudi</translation>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation>Abilita barra dei menu</translation>
</message>
</context>
<context>
@@ -7564,7 +7938,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Creazione dell'oggetto COM VirtualBox non riuscita.</p><p>L'applicazione sarà chiusa immediatamente.</p></translation>
+ <translation type="obsolete"><p>Creazione dell'oggetto COM VirtualBox non riuscita.</p><p>L'applicazione sarà chiusa immediatamente.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7807,9 +8181,9 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Scarica</translation>
</message>
<message>
- <source>Mount</source>
+ <source>Insert</source>
<comment>additions</comment>
- <translation type="obsolete">Monta</translation>
+ <translation>Inserisci</translation>
</message>
<message>
<source><p>The host key is currently defined as <b>%1</b>.</p></source>
@@ -7929,7 +8303,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Una nuova versione di VirtualBox è stata rilasciata! La versione <b>%1</b> è disponibile presso <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Puoi scaricare questa versione da questo collegamento diretto:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Una nuova versione di VirtualBox è stata rilasciata! La versione <b>%1</b> è disponibile presso <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Puoi scaricare questa versione da questo collegamento diretto:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -8005,11 +8379,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Uno o più dischi fissi virtuali, CD/DVD o floppy non sono la momento accessibili. Ciò significa che non sarai in grado di operare con le macchine virtuali che utilizzano questi supporti fino a quando non ritorneranno accessibili.</p><p>Premi <b>Controlla</b> per aprire la finestra del gestore supporti virtuali e vedere quali supporti non sono accessibili, o premi <b>Ignora</b> per ignorare questo messaggio.</p></tran [...]
+ <translation type="obsolete"><p>Uno o più dischi fissi virtuali, CD/DVD o floppy non sono la momento accessibili. Ciò significa che non sarai in grado di operare con le macchine virtuali che utilizzano questi supporti fino a quando non ritorneranno accessibili.</p><p>Premi <b>Controlla</b> per aprire la finestra del gestore supporti virtuali e vedere quali supporti non sono accessibili, o premi <b>Ignora</b> per ignorare questo messaggio. [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Si è verificato un errore critico durante il funzionamento della macchina virtuale e l'esecuzione della macchina è stata fermata.</p><p>Per ottenere aiuto, vedi la sezione Community su <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> o il contratto di supporto. Fornisci il contenuto del file di log <tt>VBox.log</tt> e il file immagine <tt>VBox.png</tt>, che puoi trovare nella cartella <no [...]
+ <translation type="obsolete"><p>Si è verificato un errore critico durante il funzionamento della macchina virtuale e l'esecuzione della macchina è stata fermata.</p><p>Per ottenere aiuto, vedi la sezione Community su <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> o il contratto di supporto. Fornisci il contenuto del file di log <tt>VBox.log</tt> e il file immagine <tt>VBox.png</tt>, che puoi trovare nella [...]
</message>
<message>
<source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
@@ -8191,7 +8565,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Sei sicuro di voler eliminare il dispositivo CD/DVD?</p><p>Senza non potrai montare alcun CD o immagine ISO o installare le Guest Additions!</p></translation>
+ <translation type="obsolete"><p>Sei sicuro di voler eliminare il dispositivo CD/DVD?</p><p>Senza non potrai montare alcun CD o immagine ISO o installare le Guest Additions!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8294,7 +8668,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Stai per aggiungere un nuovo lettore CD/DVD al controller <b>%1</b>.</p><p>Vuoi scegliere un disco CD/DVD virtuale da inserire nel lettore o lasciarlo vuoto per il momento?<p></translation>
+ <translation type="obsolete"><p>Stai per aggiungere un nuovo lettore CD/DVD al controller <b>%1</b>.</p><p>Vuoi scegliere un disco CD/DVD virtuale da inserire nel lettore o lasciarlo vuoto per il momento?<p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8316,11 +8690,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Scollegamento del dispositivo CD/DVD (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
+ <translation type="obsolete">Scollegamento del dispositivo CD/DVD (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Scollegamento del dispositivo floppy (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
+ <translation type="obsolete">Scollegamento del dispositivo floppy (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
@@ -8359,19 +8733,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Collegamento del dispositivo CD/DVD (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
+ <translation type="obsolete">Collegamento del dispositivo CD/DVD (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Collegamento del dispositivo floppy (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
+ <translation type="obsolete">Collegamento del dispositivo floppy (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation><p>Nota che l'unità di archiviazione di questo supporto non sarà eliminata e che sarà possibile utilizzare in seguito.</p></translation>
</message>
<message>
- <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully started then s [...]
- <translation type="obsolete"><p>Le VirtualBox Guest Additions non sembrano essere presenti su questa macchina virtuale, e le cartelle condivise non possono essere utilizzate senza di esse. Per utilizzare le cartelle condivise nella macchina virtuale, installa le Guest Additions se non sono installate, o installale di nuovo se non funzionano correttamente, selezionando <b>Installa Guest Additions</b> dal menu <b>Dispositivi</b>. Se sono installate, ma [...]
+ <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
+ <translation><p>Le VirtualBox Guest Additions non sembrano essere presenti su questa macchina virtuale, e le cartelle condivise non possono essere utilizzate senza di esse. Per utilizzare le cartelle condivise nella macchina virtuale, installa le Guest Additions se non sono installate, o installale di nuovo se non funzionano correttamente, selezionando <b>Inserisci l'immagine del CD delle Guest Additions</b> dal menu <b>Dispositivi</b>. Se sono [...]
</message>
<message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
@@ -8667,15 +9041,15 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete"><p>La finestra della macchina virtuale verrà ora commutata alla modalità <b>schermo intero</b>. Puoi tornare indietro alla modalità finestra in qualsiasi momento premendo <b>%1</b>. Nota che la <i>host key</i> è definita attualmente come <b>%1</b>.</p></translation>
</message>
<message>
- <source><p>The VirtualBox Guest Additions installed in the Guest OS are too old: the installed version is %1, the expected version is %2. Some features that require Guest Additions (mouse integration, guest display auto-resize) will most likely stop working properly.</p><p>Please update the Guest Additions to the current version by choosing <b>Install Guest Additions</b> from the <b>Devices</b> menu.</p></source>
+ <source><p>The VirtualBox Guest Additions installed in the Guest OS are too old: the installed version is %1, the expected version is %2. Some features that require Guest Additions (mouse integration, guest display auto-resize) will most likely stop working properly.</p><p>Please update the Guest Additions to the current version by choosing <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu.</p></source>
<translation type="obsolete"><p>Le Guest Additions installate nel sistema Guest sono obsolete: la versione installata è %1, quella attesa è %2. Alcune funzionalità che richiedono Guest Additions (Integrazione mouse, auto-ridimensionamento dello schermo) probabilmente smetteranno di funzionare correttamente.</p><p>Aggiorna le Guest Additions alla versione attuale scegliendo <b>Installa Guest Additions</b> dal menu <b>Dispositivi</b>.</p [...]
</message>
<message>
- <source><p>The VirtualBox Guest Additions installed in the Guest OS are outdated: the installed version is %1, the expected version is %2. Some features that require Guest Additions (mouse integration, guest display auto-resize) may not work as expected.</p><p>It is recommended to update the Guest Additions to the current version by choosing <b>Install Guest Additions</b> from the <b>Devices</b> menu.</p></source>
+ <source><p>The VirtualBox Guest Additions installed in the Guest OS are outdated: the installed version is %1, the expected version is %2. Some features that require Guest Additions (mouse integration, guest display auto-resize) may not work as expected.</p><p>It is recommended to update the Guest Additions to the current version by choosing <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu.</p></source>
<translation type="obsolete"><p>Le Guest Additions installate nel sistema Guest non sono aggiornate: la versione installata è %1, quella attesa è %2. Alcune funzionalità che richiedono Guest Additions (Integrazione Mouse, auto-ridimensionamento dello schermo) potrebbero non funzionare come ci si aspetta.</p><p>Si consiglia di aggiornare le Guest Additions alla versione attuale scegliendo <b>Installa Guest Additions</b> dal menu <b>Dispositivi&l [...]
</message>
<message>
- <source><p>The VirtualBox Guest Additions installed in the Guest OS are too recent for this version of VirtualBox: the installed version is %1, the expected version is %2.</p><p>Using a newer version of Additions with an older version of VirtualBox is not supported. Please install the current version of the Guest Additions by choosing <b>Install Guest Additions</b> from the <b>Devices</b> menu.</p></source>
+ <source><p>The VirtualBox Guest Additions installed in the Guest OS are too recent for this version of VirtualBox: the installed version is %1, the expected version is %2.</p><p>Using a newer version of Additions with an older version of VirtualBox is not supported. Please install the current version of the Guest Additions by choosing <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu.</p></source>
<translation type="obsolete"><p>Le Guest Additions installate nel sistema Guest sono troppo recenti per questa versione di VirtualBox: la versione installata è %1, quella attesa è %2.</p><p>L'utilizzo di una versione di Additions più recente di VirtualBox non è supportato. Installa la versione corrente di Guest Additions scegliendo <b>Installa Guest Additions</b> dal menu <b>Dispositivi</b>.</p></translation>
</message>
<message>
@@ -8954,7 +9328,7 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">dispositivo floppy</translation>
</message>
<message>
- <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
+ <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully starte [...]
<translation type="obsolete"><p>Le Guest Additions di VirtualBox non sembrano essere disponibile nella macchina virtuale, e le cartelle condivise non possono essere utilizzate senza di esse. Per utilizzare le cartelle condivise nella macchina virtuale, installa le Guest Additions se non sono installate, o installale nuovamente se non funzionano correttamente, selezionando <b>Installa Guest Additions</b> dal menu <b>Macchina</b>. Se sono installate, m [...]
</message>
<message>
@@ -9025,7 +9399,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Rimozione dei dati non riuscita.</translation>
+ <translation type="obsolete">Rimozione dei dati non riuscita.</translation>
</message>
<message>
<source><p>Failed to initialize COM because the VirtualBox global configuration directory <b><nobr>%1</nobr></b> is not accessible. Please check the permissions of this directory and of its parent directory.</p><p>The application will now terminate.</p></source>
@@ -9289,11 +9663,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p>Il file dell'immagine del disco delle <b>VirtualBox Guest Additions</b> è stato scaricato correttamente da <nobr><a href="%1">%1</a></nobr> e salvato localmente come <nobr><b>%2</b>.</nobr></p><p>Vuoi registrare il file dell'immagine del disco e inserirlo nel lettore CD/DVD virtuale?</p></translation>
+ <translation type="obsolete"><p>Il file dell'immagine del disco delle <b>VirtualBox Guest Additions</b> è stato scaricato correttamente da <nobr><a href="%1">%1</a></nobr> e salvato localmente come <nobr><b>%2</b>.</nobr></p><p>Vuoi registrare il file dell'immagine del disco e inserirlo nel lettore CD/DVD virtuale?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>Impossibile inserire il file dell'immagine delle <b>VirtualBox Guest Additions</b> nella macchina virtuale<b>%1</b>, poiché la macchina non ha alcun lettore CD/DVD. Aggiungi un lettore dalla pagina di archiviazione della finestra delle impostazioni della macchina virtuale.</p></translation>
+ <translation type="obsolete"><p>Impossibile inserire il file dell'immagine delle <b>VirtualBox Guest Additions</b> nella macchina virtuale<b>%1</b>, poiché la macchina non ha alcun lettore CD/DVD. Aggiungi un lettore dalla pagina di archiviazione della finestra delle impostazioni della macchina virtuale.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
@@ -9328,32 +9702,133 @@ p, li { white-space: pre-wrap; }
<translation><p>Vuoi rimuovere la rete con NAT <nobr><b>%1</b>?</nobr></p><p>Se la rete è utilizzata da una o più schede di rete delle macchine virtuali, tali schede non saranno utilizzabili fino a quando non correggi le loro impostazioni, scegliendo un nome di rete diverso o un tipo di scheda diverso.</p></translation>
</message>
<message>
+ <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
+ <comment>new</comment>
+ <translation type="obsolete"><p>Le VirtualBox Guest Additions non sembrano essere presenti su questa macchina virtuale, e le cartelle condivise non possono essere utilizzate senza di esse. Per utilizzare le cartelle condivise nella macchina virtuale, installa le Guest Additions se non sono installate, o installale di nuovo se non funzionano correttamente, selezionando <b>Installa Guest Additions</b> dal menu <b>Dispositivi</b>. Se sono installate, ma [...]
+ </message>
+ <message>
+ <source>Insert</source>
+ <comment>additions-new</comment>
+ <translation type="obsolete">Monta</translation>
+ </message>
+ <message>
<source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Connessione della webcam <b>%1</b> alla macchina virtuale <b>%2</b> non riuscita.</translation>
</message>
<message>
<source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Disconnessione della webcam <b>%1</b> dalla macchina virtuale <b>%2</b> non riuscita.</translation>
</message>
<message>
- <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"></translation>
+ <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
+ <translation><p>Lo schermo virtuale è attualmente impostato a una modalità di colore di <b>%1 bit</b>. Per ottenere prestazioni migliori, modifica questa impostazione a <b>%2 bit</b>. Ciò normalmente può essere fatto dalla sezione <b>Schermo</b> del panello di controllo del sistema operativo del guest o da Impostazioni di sistema.</p></translation>
</message>
<message>
- <source>Insert</source>
- <comment>additions</comment>
- <translation type="unfinished"></translation>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation><p>Creazione dell'oggetto COM VirtualBoxClient non riuscita.</p><p>L'applicazione sarà chiusa immediatamente.</p></translation>
</message>
<message>
- <source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
- <translation type="unfinished"></translation>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation>Impostazione dei dati aggiuntivi globali di VirtualBox per la chiave <i>%1</i> al valore <i>{%2}</i> non riuscita.</translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation>Impostazione dei dati aggiuntivi per la chiave <i>%1</i> della macchina <i>{%2}</i>.al valore <i>{%3}</i> non riuscita.</translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation><p>Uno o più dischi fissi virtuali, file di immagini di dischi otttici o floppy non sono attualmente accessibili. Ciò significa che non sarai in grado di operare con le macchine virtuali che utilizzano questi file fino a quando non ritorneranno accessibili.</p><p>Premi <b>Controlla</b> per aprire la finestra del gestore supporti virtuali e vedere quali supporti non sono accessibili, o premi <b>Ignora</b> per ignorare questo m [...]
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation>Salvataggio delle impostazioni non riuscito.</translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation><p>Stai per aggiungere un nuovo lettore ottico al controller <b>%1</b>.</p><p>Vuoi scegliere un disco ottico virtuale da inserire nel lettore o lasciarlo vuoto per il momento?<p></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation><p>Sei sicuro di voler eliminare il lettore ottico?</p><p>Senza non potrai inserire alcun disco ottico o immagine ISO o installare le Guest Additions!</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Collegamento del lettore ottico (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Collegamento del lettore floppy (<nobr><b>%1</b></nobr>) allo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Rule names should be unique.</source>
- <translation type="unfinished"></translation>
+ <translation>Le regole attuali di inoltro delle porte non sono valide. I nomi delle regole devono essere univoci.</translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
+ <translation>Le regole attuali di inoltro delle porte non sono valide. Alcune regole hanno le stesse porte host e indirizzi IP in conflitto.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Scollegamento del lettore ottico (<nobr><b>%1</b></nobr>) dallo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Scollegamento del dispositivo floppy (<nobr><b>%1</b></nobr>) dallo slot <i>%2</i> della macchina <b>%3</b> non riuscito.</translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>Connessione del cavo della scheda di rete della macchina virtuale <b>%1</b> non riuscita.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>Disconnessione del cavo della scheda di rete della macchina virtuale <b>%1</b> non riuscita.</translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation><p>Impossibile inserire il file dell'immagine del disco delle <b>VirtualBox Guest Additions</b> nella macchina virtuale<b>%1</b>, poiché la macchina non ha alcun lettore ottico. Aggiungi un lettore dalla pagina di archiviazione della finestra delle impostazioni della macchina virtuale.</p></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation><p>Il file dell'immagine del disco delle <b>VirtualBox Guest Additions</b> è stato scaricato correttamente da <nobr><a href="%1">%1</a></nobr> e salvato localmente come <nobr><b>%2</b>.</nobr></p><p>Vuoi registrare il file dell'immagine del disco e inserirlo nel lettore ottico virtuale?</p></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation failed.</source>
+ <translation type="obsolete">L'operazione di trascinamento e rilascio non è riuscita.</translation>
+ </message>
+ <message>
+ <source>Failed while dropping data.</source>
+ <translation type="obsolete">Rilascio dei dati non riuscito.</translation>
+ </message>
+ <message>
+ <source>Unable to cancel drag and drop operation.</source>
+ <translation type="obsolete">Impossibile annullare l'operazione di trascinamento e rilascio.</translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation>Password errata o autenticazione non riuscita.</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation><p>Si è verificato un errore critico durante il funzionamento della macchina virtuale e l'esecuzione della macchina è stata fermata.</p><p>Per ottenere aiuto, vedi la sezione Community su <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> o il contratto di supporto. Fornisci il contenuto del file di log <tt>VBox.log</tt> e il file immagine <tt>VBox.png</tt>, che puoi trovare nella cartella < [...]
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation><p>Si è verificato un errore critico durante il funzionamento della macchina virtuale e l'esecuzione della macchinadovrebbe essere fermata.</p><p>Per ottenere aiuto, vedi la sezione Community su <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> o il contratto di supporto. Fornisci il contenuto del file di log <tt>VBox.log</tt> che puoi trovare nella cartella dei log della macchina virtuale, così come una [...]
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation><p>È stata rilasciata una nuova versione di VirtualBox! La versione <b>%1</b> è disponibile su <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>Puoi scaricare questa versione utilizzando il collegamento:</p><p><a href=%2>%3</a></p></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -9446,8 +9921,8 @@ p, li { white-space: pre-wrap; }
<context>
<name>UINameAndSystemEditor</name>
<message>
- <source>N&ame:</source>
- <translation>&Nome:</translation>
+ <source>&Name:</source>
+ <translation type="obsolete">&Nome:</translation>
</message>
<message>
<source>Holds the name of the virtual machine.</source>
@@ -9469,6 +9944,10 @@ p, li { white-space: pre-wrap; }
<source>Selects the operating system type that you plan to install into this virtual machine (called a guest operating system).</source>
<translation>Visualizza il tipo di sistema operativo che intendi installare nella macchina virtuale (chiamato sistema operativo Guest).</translation>
</message>
+ <message>
+ <source>N&ame:</source>
+ <translation>&Nome:</translation>
+ </message>
</context>
<context>
<name>UINetworkManager</name>
@@ -10605,13 +11084,17 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Benvenuti in VirtualBox!</h3><p>La parte sinistra di questa finestra visualizza un elenco delle macchine virtuali sul tuo computer. L'elenco al momento è vuoto perché non hai ancora creato macchine virtuali.<img src=:/welcome.png align=right/></p><p>Per creare una nuova macchina virtuale, premi il pulsante <b>Nuova</b> nella barra degli strumenti principale posizionata nella parte alta della finestra.</p> [...]
+ <translation type="obsolete"><h3>Benvenuti in VirtualBox!</h3><p>La parte sinistra di questa finestra visualizza un elenco delle macchine virtuali sul tuo computer. L'elenco al momento è vuoto perché non hai ancora creato macchine virtuali.<img src=:/welcome.png align=right/></p><p>Per creare una nuova macchina virtuale, premi il pulsante <b>Nuova</b> nella barra degli strumenti principale posizionata nella parte alta della fin [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Gestore</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation><h3>Benvenuti in VirtualBox!</h3><p>La parte sinistra di questa finestra visualizza un elenco delle macchine virtuali sul tuo computer. L'elenco al momento è vuoto perché non hai ancora creato macchine virtuali.<img src=:/welcome.png align=right/></p><p>Per creare una nuova macchina virtuale, premi il pulsante <b>Nuova</b> nella barra degli strumenti principale posizionata nella parte alta della finestra.</p> [...]
+ </message>
</context>
<context>
<name>UISession</name>
@@ -10644,7 +11127,7 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
</message>
<message>
<source>Settings</source>
- <translation>Impostazioni</translation>
+ <translation type="obsolete">Impostazioni</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -10697,6 +11180,10 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
<source>Display</source>
<translation>Schermo</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation>Preferenze</translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10772,19 +11259,42 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">stai attualmente utilizzando più controller di archiviazione di quanti un chipset %1 supporti. Cambia il tipo di chipset nella pagina delle impostazioni Sistema o riduci il numero dei seguenti controller di archiviazione nella pagina delle impostazioni Archiviazione: %2.</translation>
</message>
-</context>
-<context>
- <name>UIStatusBarEditorButton</name>
<message>
- <source><nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr></source>
- <translation type="unfinished"></translation>
+ <source>User Interface</source>
+ <translation>Interfaccia utente</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Impostazioni</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation>Caricamento impostazioni...</translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation>Salvataggio impostazioni...</translation>
+ </message>
+</context>
+<context>
+ <name>UIStatusBarEditorButton</name>
+ <message>
+ <source><nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr></source>
+ <translation><nobr>Fai <b>clic</b> per commutare la presenza dell'indicatore.</nobr><br><nobr><b>Trascina e rilascia</b> per cambiare la posizione dell'indicatore.</nobr></translation>
</message>
</context>
<context>
<name>UIStatusBarEditorWidget</name>
<message>
<source>Close</source>
- <translation type="unfinished">Chiudi</translation>
+ <translation>Chiudi</translation>
+ </message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation>Abilita barra di stato</translation>
</message>
</context>
<context>
@@ -10956,11 +11466,11 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
</message>
<message>
<source>&Continue running in the background</source>
- <translation type="unfinished"></translation>
+ <translation>&Continua l'esecuzione sullo sfondo</translation>
</message>
<message>
<source><p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Chiudi la finestra della macchina virtuale, ma mantieni la macchina in esecuzione.</p><p>Puoi utilizzare il gestore di VirtualBox per tornare a eseguire la macchina virtuale in una finestra.</p></translation>
</message>
</context>
<context>
@@ -10981,12 +11491,12 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
<translation>%1 - Informazione di sessione</translation>
</message>
<message>
- <source>&Details</source>
- <translation type="obsolete">&Dettagli</translation>
+ <source>Configuration &Details</source>
+ <translation>&Dettagli di configurazione</translation>
</message>
<message>
- <source>&Runtime</source>
- <translation type="obsolete">Esec&uzione</translation>
+ <source>&Runtime Information</source>
+ <translation>Info&rmazioni di esecuzione</translation>
</message>
<message>
<source>DMA Transfers</source>
@@ -11013,14 +11523,6 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
<translation>Dati ricevuti</translation>
</message>
<message>
- <source>Runtime Attributes</source>
- <translation>Attributi di esecuzione</translation>
- </message>
- <message>
- <source>Screen Resolution</source>
- <translation>Risoluzione dello schermo</translation>
- </message>
- <message>
<source>Not Detected</source>
<comment>guest additions</comment>
<translation>Non rilevate</translation>
@@ -11028,35 +11530,7 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
<message>
<source>Not Detected</source>
<comment>guest os type</comment>
- <translation>Non rilevato</translation>
- </message>
- <message>
- <source>Guest Additions</source>
- <translation>Guest Additions</translation>
- </message>
- <message>
- <source>Guest OS Type</source>
- <translation>Sistema operativo guest</translation>
- </message>
- <message>
- <source>No Network Adapters</source>
- <translation>Nessuna scheda di rete</translation>
- </message>
- <message>
- <source>UIVMInfoDialog</source>
- <translation type="obsolete">UIVMInfoDialog</translation>
- </message>
- <message>
- <source>Storage Statistics</source>
- <translation>Statistiche di archiviazione</translation>
- </message>
- <message>
- <source>No Storage Devices</source>
- <translation>Nessun dispositivo di archiviazione</translation>
- </message>
- <message>
- <source>Network Statistics</source>
- <translation>Statistiche di rete</translation>
+ <translation>Non rilevate</translation>
</message>
<message>
<source>Not Available</source>
@@ -11064,133 +11538,48 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
<translation>Non disponibile</translation>
</message>
<message>
- <source>Session Information Dialog</source>
- <translation type="obsolete">Finestra di Informazioni di Sessione</translation>
- </message>
- <message>
- <source>&Close</source>
- <translation type="obsolete">&Chiudi</translation>
- </message>
- <message>
- <source>Enabled</source>
- <translation type="obsolete">Abilitato</translation>
- </message>
- <message>
- <source>Disabled</source>
- <translation type="obsolete">Disabilitato</translation>
- </message>
- <message>
- <source>Hardware Virtualization</source>
- <translation type="obsolete">Virtualizzazione hardware</translation>
- </message>
- <message>
- <source>IDE Hard Disk Statistics</source>
- <translation type="obsolete">Statistiche su dischi rigidi IDE</translation>
- </message>
- <message>
- <source>CD/DVD Statistics</source>
- <translation type="obsolete">Statistiche su CD/DVD</translation>
- </message>
- <message>
- <source>Network Adapter Statistics</source>
- <translation type="obsolete">Statistiche su scheda di rete</translation>
- </message>
- <message>
- <source>Adapter 1</source>
- <translation type="obsolete">Scheda 1</translation>
- </message>
- <message>
- <source>Adapter 2</source>
- <translation type="obsolete">Scheda 2</translation>
- </message>
- <message>
- <source>Adapter 3</source>
- <translation type="obsolete">Scheda 3</translation>
- </message>
- <message>
- <source>Adapter 4</source>
- <translation type="obsolete">Scheda 4</translation>
- </message>
- <message>
- <source>Not attached</source>
- <translation type="obsolete">Non connesso</translation>
- </message>
- <message>
- <source>Hard Disks Statistics</source>
- <translation type="obsolete">Statistiche su dischi rigidi</translation>
- </message>
- <message>
- <source>Primary Master</source>
- <translation type="obsolete">Master primario</translation>
- </message>
- <message>
- <source>Primary Slave</source>
- <translation type="obsolete">Slave primario</translation>
- </message>
- <message>
- <source>Secondary Master</source>
- <translation type="obsolete">Master secondario</translation>
- </message>
- <message>
- <source>Secondary Slave</source>
- <translation type="obsolete">Slave secondario</translation>
- </message>
- <message>
- <source>Version %1.%2</source>
- <comment>guest additions</comment>
- <translation type="obsolete">Versione %1.%2</translation>
- </message>
- <message>
- <source>Hard Disk Statistics</source>
- <translation type="obsolete">Statistiche sul disco fisso</translation>
- </message>
- <message>
- <source>No Hard Disks</source>
- <translation type="obsolete">Nessun disco fisso</translation>
+ <source>Runtime Attributes</source>
+ <translation>Attributi di esecuzione</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>nested paging</comment>
- <translation type="obsolete">Abilitata</translation>
+ <source>Screen Resolution</source>
+ <translation>Risoluzione dello schermo</translation>
</message>
<message>
- <source>Disabled</source>
- <comment>nested paging</comment>
- <translation type="obsolete">Disabilitata</translation>
+ <source>VM Uptime</source>
+ <translation>Uptime della MV</translation>
</message>
<message>
- <source>Nested Paging</source>
- <translation type="obsolete">Paginazione nidificata</translation>
+ <source>Clipboard Mode</source>
+ <translation>Modalità appunti</translation>
</message>
<message>
- <source>Not Available</source>
- <comment>details report (VRDP server port)</comment>
- <translation type="obsolete">Non disponibile</translation>
+ <source>Drag and Drop Mode</source>
+ <translation>Modalità trascina e rilascia</translation>
</message>
<message>
- <source>Nested Paging</source>
- <comment>details report</comment>
- <translation type="obsolete">Paginazione nidificata</translation>
+ <source>Guest Additions</source>
+ <translation>Guest Additions</translation>
</message>
<message>
- <source>Clipboard Mode</source>
- <translation>Modalità appunti</translation>
+ <source>Guest OS Type</source>
+ <translation>Sistema operativo guest</translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation>Modalità trascina e rilascia</translation>
+ <source>Storage Statistics</source>
+ <translation>Statistiche di archiviazione</translation>
</message>
<message>
- <source>Configuration &Details</source>
- <translation>&Dettagli di configurazione</translation>
+ <source>No Storage Devices</source>
+ <translation>Nessun dispositivo di archiviazione</translation>
</message>
<message>
- <source>&Runtime Information</source>
- <translation>Info&rmazioni di esecuzione</translation>
+ <source>Network Statistics</source>
+ <translation>Statistiche di rete</translation>
</message>
<message>
- <source>VM Uptime</source>
- <translation type="unfinished"></translation>
+ <source>No Network Adapters</source>
+ <translation>Nessuna scheda di rete</translation>
</message>
</context>
<context>
@@ -11384,19 +11773,19 @@ questo passo e collegare hard disk più tardi tramite Impostazioni della MV.<
</message>
<message>
<source>&Expert Mode</source>
- <translation type="unfinished"></translation>
+ <translation>Modalità &esperta</translation>
</message>
<message>
<source>Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users.</source>
- <translation type="unfinished"></translation>
+ <translation>Passa alla<nobr><b>Modalità esperta</b></nobr>, una finestra a pagina singola per utenti avanzati.</translation>
</message>
<message>
<source>&Guided Mode</source>
- <translation type="unfinished"></translation>
+ <translation>Modalità &guidata</translation>
</message>
<message>
<source>Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations.</source>
- <translation type="unfinished"></translation>
+ <translation>Passa alla<nobr><b>Modalità guidata</b></nobr>, una procedura con più fasi con spiegazioni dettagliate.</translation>
</message>
</context>
<context>
@@ -12425,11 +12814,11 @@ Versione %1</translation>
<translation type="obsolete">Apri la finestra per gestire le cartelle condivise</translation>
</message>
<message>
- <source>&Install Guest Additions...</source>
+ <source>&Insert Guest Additions CD image...</source>
<translation type="obsolete">&Installa Guest Additions...</translation>
</message>
<message>
- <source>Mount the Guest Additions installation image</source>
+ <source>Insert the Guest Additions disk file into the virtual drive</source>
<translation type="obsolete">Monta l'immagine per l'installazione delle Guest Additions</translation>
</message>
<message>
@@ -12774,7 +13163,7 @@ Versione %1</translation>
<translation type="obsolete">Finestra I&nformazioni di sessione</translation>
</message>
<message>
- <source>Show Session Information Dialog</source>
+ <source>Show Session Information Window</source>
<translation type="obsolete">Visualizza la finestra Informazioni di sessione</translation>
</message>
<message>
@@ -13223,8 +13612,8 @@ Versione %1</translation>
<translation><ripristina valori predefiniti></translation>
</message>
<message>
- <source>The actual default path value will be displayed after accepting the changes and opening this dialog again.</source>
- <translation type="obsolete">Il valore attuale del percorso predefinito sarà visualizzato dopo aver accettato le modifiche e riaperto nuovamente la finestra.</translation>
+ <source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
+ <translation>Il valore attuale del percorso predefinito sarà visualizzato dopo aver accettato le modifiche e riaperto nuovamente questa finestra.</translation>
</message>
<message>
<source><not selected></source>
@@ -13272,7 +13661,8 @@ Versione %1</translation>
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished"></translation>
+ <comment>new</comment>
+ <translation type="obsolete">Il valore attuale del percorso predefinito sarà visualizzato dopo aver accettato le modifiche e riaperto nuovamente la finestra.</translation>
</message>
</context>
<context>
@@ -13518,7 +13908,7 @@ Versione %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -14206,17 +14596,17 @@ Versione %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Il collegamento di questo disco fisso sarà eseguito indirettamente utilizzando un nuovo disco differenziale.</translation>
+ <translation type="obsolete">Il collegamento di questo disco fisso sarà eseguito indirettamente utilizzando un nuovo disco differenziale.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Alcuni dei supporti nella catena di dischi fissi non sono accessibili. Utilizza il Gestore supporti virtuali in modalità <b>Mostra dischi fissi differenziali</b> per ispezionarli.</translation>
+ <translation type="obsolete">Alcuni dei supporti nella catena di dischi fissi non sono accessibili. Utilizza il Gestore supporti virtuali in modalità <b>Mostra dischi fissi differenziali</b> per ispezionarli.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Questo disco fisso di base è collegato indirettamente utilizzando il seguente disco differenziale:</translation>
+ <translation type="obsolete">Questo disco fisso di base è collegato indirettamente utilizzando il seguente disco differenziale:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -14262,7 +14652,7 @@ Versione %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -15129,12 +15519,12 @@ Versione %1</translation>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Abilitata</translation>
+ <translation type="obsolete">Abilitata</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Disabilitata</translation>
+ <translation type="obsolete">Disabilitata</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -15197,32 +15587,67 @@ Versione %1</translation>
<message>
<source>USB</source>
<comment>StorageControllerType</comment>
- <translation type="unfinished">USB</translation>
- </message>
- <message>
- <source>USB Port %1</source>
- <comment>StorageSlot</comment>
- <translation type="unfinished"></translation>
+ <translation>USB</translation>
</message>
<message>
<source>off</source>
<comment>guest monitor status</comment>
- <translation type="unfinished"></translation>
+ <translation>spento</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>Attivo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>Inattivo</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>Attivo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>Inattivo</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>Attivo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>Inattivo</translation>
</message>
<message>
<source>Paravirtualization Interface</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Interfaccia di paravirtualizzazione</translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Creazione istantanee</translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Creazione istantanee in linea</translation>
</message>
<message>
<source>None</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Nessuna</translation>
</message>
<message>
<source>Default</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished">Predefinita</translation>
+ <translation>Predefinita</translation>
</message>
<message>
<source>Legacy</source>
@@ -15232,16 +15657,80 @@ Versione %1</translation>
<message>
<source>Minimal</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Minimale</translation>
</message>
<message>
<source>Hyper-V</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V</translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation>KVM</translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation>Ottico</translation>
</message>
<message>
<source>New dynamically allocated storage</source>
<comment>MediumVariant</comment>
+ <translation>Nuova archiviazione allocata dinamicamente</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>OHCI</translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>EHCI</translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>xHCI</translation>
+ </message>
+ <message>
+ <source>USB Port %1</source>
+ <comment>StorageSlot</comment>
+ <translation>Porta USB %1</translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation>Interfaccia utente</translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation>(Lettore ottico)</translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation>Il collegamento di questo disco fisso sarà eseguito indirettamente utilizzando un nuovo disco differenziale.</translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation>Alcuni dei supporti nella catena di dischi fissi non sono accessibili. Utilizza il Gestore supporti virtuali in modalità per ispezionarli.</translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation>Questo disco fisso di base è collegato indirettamente utilizzando il seguente disco differenziale:</translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
<translation type="unfinished"></translation>
</message>
</context>
@@ -15508,11 +15997,11 @@ la lingua a quella predefinita di sistema.</qt>
<translation type="obsolete">Visualizza il percorso della cartella predefinita per le VDI. Questa cartella viene utilizzata, se non diversamente specificato, quando vengono aggiunti o creati hard disk virtuali.</translation>
</message>
<message>
- <source>Resets the virtual machine folder path to the default value. The actual default path will be displayed after accepting the changes and opening this dialog again.</source>
+ <source>Resets the virtual machine folder path to the default value. The actual default path will be displayed after accepting the changes and opening this window again.</source>
<translation type="obsolete">Reimposta il percorso della cartella predefinita per le macchine virtuali al valore di default. Il valore di default effettivo verrà visualizzato dopo aver accettato le modifiche ed aperto nuovamente questa finestra.</translation>
</message>
<message>
- <source>Resets the VDI folder path to the default value. The actual default path will be displayed after accepting the changes and opening this dialog again.</source>
+ <source>Resets the VDI folder path to the default value. The actual default path will be displayed after accepting the changes and opening this window again.</source>
<translation type="obsolete">Reimposta il percorso della cartella predefinita per le VDI al valore di default. Il valore di default effettivo verrà visualizzato dopo aver accettato le modifiche ed aperto nuovamente questa finestra.</translation>
</message>
<message>
@@ -15556,7 +16045,7 @@ la lingua a quella predefinita di sistema.</qt>
<translation type="obsolete">Apri una finestra per scegliere il file per l'autenticazione VRDP.</translation>
</message>
<message>
- <source>Resets the authentication library file to the default value. The actual default library file will be displayed after accepting the changes and opening this dialog again.</source>
+ <source>Resets the authentication library file to the default value. The actual default library file will be displayed after accepting the changes and opening this window again.</source>
<translation type="obsolete">Reimposta il file della libreria per l'autenticazione al valore di default. L'effettivo file di libreria di default verrà visualizzato dopo aver accettato le modifiche ed aperto nuovamente questa finestra.</translation>
</message>
<message>
@@ -16119,6 +16608,10 @@ la lingua a quella predefinita di sistema.</qt>
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Crea un nuovo disco fisso virtuale</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation>UUID:</translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
@@ -17490,6 +17983,221 @@ qualsiasi valore.</qt></translation>
</message>
</context>
<context>
+ <name>VBoxVMInformationDlg</name>
+ <message>
+ <source>%1 - Session Information</source>
+ <translation type="obsolete">%1 - Informazione di sessione</translation>
+ </message>
+ <message>
+ <source>&Details</source>
+ <translation type="obsolete">&Dettagli</translation>
+ </message>
+ <message>
+ <source>&Runtime</source>
+ <translation type="obsolete">Esec&uzione</translation>
+ </message>
+ <message>
+ <source>DMA Transfers</source>
+ <translation type="obsolete">Trasferimenti DMA</translation>
+ </message>
+ <message>
+ <source>PIO Transfers</source>
+ <translation type="obsolete">Trasferimenti PIO</translation>
+ </message>
+ <message>
+ <source>Data Read</source>
+ <translation type="obsolete">Dati letti</translation>
+ </message>
+ <message>
+ <source>Data Written</source>
+ <translation type="obsolete">Dati scritti</translation>
+ </message>
+ <message>
+ <source>Data Transmitted</source>
+ <translation type="obsolete">Dati trasmessi</translation>
+ </message>
+ <message>
+ <source>Data Received</source>
+ <translation type="obsolete">Dati ricevuti</translation>
+ </message>
+ <message>
+ <source>Runtime Attributes</source>
+ <translation type="obsolete">Attributi di esecuzione</translation>
+ </message>
+ <message>
+ <source>Screen Resolution</source>
+ <translation type="obsolete">Risoluzione dello schermo</translation>
+ </message>
+ <message>
+ <source>Not Detected</source>
+ <comment>guest additions</comment>
+ <translation type="obsolete">Non rilevate</translation>
+ </message>
+ <message>
+ <source>Not Detected</source>
+ <comment>guest os type</comment>
+ <translation type="obsolete">Non rilevato</translation>
+ </message>
+ <message>
+ <source>Guest Additions</source>
+ <translation type="obsolete">Guest Additions</translation>
+ </message>
+ <message>
+ <source>Guest OS Type</source>
+ <translation type="obsolete">Sistema operativo guest</translation>
+ </message>
+ <message>
+ <source>No Network Adapters</source>
+ <translation type="obsolete">Nessuna scheda di rete</translation>
+ </message>
+ <message>
+ <source>VBoxVMInformationDlg</source>
+ <translation type="obsolete">VBoxVMInformationDlg</translation>
+ </message>
+ <message>
+ <source>Storage Statistics</source>
+ <translation type="obsolete">Statistiche di archiviazione</translation>
+ </message>
+ <message>
+ <source>No Storage Devices</source>
+ <translation type="obsolete">Nessun dispositivo di archiviazione</translation>
+ </message>
+ <message>
+ <source>Network Statistics</source>
+ <translation type="obsolete">Statistiche di rete</translation>
+ </message>
+ <message>
+ <source>Not Available</source>
+ <comment>details report (VRDE server port)</comment>
+ <translation type="obsolete">Non disponibile</translation>
+ </message>
+ <message>
+ <source>Session Information Dialog</source>
+ <translation type="obsolete">Finestra di Informazioni di Sessione</translation>
+ </message>
+ <message>
+ <source>&Close</source>
+ <translation type="obsolete">&Chiudi</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <translation type="obsolete">Abilitato</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <translation type="obsolete">Disabilitato</translation>
+ </message>
+ <message>
+ <source>Hardware Virtualization</source>
+ <translation type="obsolete">Virtualizzazione hardware</translation>
+ </message>
+ <message>
+ <source>IDE Hard Disk Statistics</source>
+ <translation type="obsolete">Statistiche su dischi rigidi IDE</translation>
+ </message>
+ <message>
+ <source>CD/DVD Statistics</source>
+ <translation type="obsolete">Statistiche su CD/DVD</translation>
+ </message>
+ <message>
+ <source>Network Adapter Statistics</source>
+ <translation type="obsolete">Statistiche su scheda di rete</translation>
+ </message>
+ <message>
+ <source>Adapter 1</source>
+ <translation type="obsolete">Scheda 1</translation>
+ </message>
+ <message>
+ <source>Adapter 2</source>
+ <translation type="obsolete">Scheda 2</translation>
+ </message>
+ <message>
+ <source>Adapter 3</source>
+ <translation type="obsolete">Scheda 3</translation>
+ </message>
+ <message>
+ <source>Adapter 4</source>
+ <translation type="obsolete">Scheda 4</translation>
+ </message>
+ <message>
+ <source>Not attached</source>
+ <translation type="obsolete">Non connesso</translation>
+ </message>
+ <message>
+ <source>Hard Disks Statistics</source>
+ <translation type="obsolete">Statistiche su dischi rigidi</translation>
+ </message>
+ <message>
+ <source>Primary Master</source>
+ <translation type="obsolete">Master primario</translation>
+ </message>
+ <message>
+ <source>Primary Slave</source>
+ <translation type="obsolete">Slave primario</translation>
+ </message>
+ <message>
+ <source>Secondary Master</source>
+ <translation type="obsolete">Master secondario</translation>
+ </message>
+ <message>
+ <source>Secondary Slave</source>
+ <translation type="obsolete">Slave secondario</translation>
+ </message>
+ <message>
+ <source>Version %1.%2</source>
+ <comment>guest additions</comment>
+ <translation type="obsolete">Versione %1.%2</translation>
+ </message>
+ <message>
+ <source>Hard Disk Statistics</source>
+ <translation type="obsolete">Statistiche sul disco fisso</translation>
+ </message>
+ <message>
+ <source>No Hard Disks</source>
+ <translation type="obsolete">Nessun disco fisso</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>nested paging</comment>
+ <translation type="obsolete">Abilitata</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>nested paging</comment>
+ <translation type="obsolete">Disabilitata</translation>
+ </message>
+ <message>
+ <source>Nested Paging</source>
+ <translation type="obsolete">Paginazione nidificata</translation>
+ </message>
+ <message>
+ <source>Not Available</source>
+ <comment>details report (VRDP server port)</comment>
+ <translation type="obsolete">Non disponibile</translation>
+ </message>
+ <message>
+ <source>Nested Paging</source>
+ <comment>details report</comment>
+ <translation type="obsolete">Paginazione nidificata</translation>
+ </message>
+ <message>
+ <source>Clipboard Mode</source>
+ <translation type="obsolete">Modalità appunti</translation>
+ </message>
+ <message>
+ <source>Drag'n'Drop Mode</source>
+ <translation type="obsolete">Modalità trascina e rilascia</translation>
+ </message>
+ <message>
+ <source>Configuration &Details</source>
+ <translation type="obsolete">&Dettagli di configurazione</translation>
+ </message>
+ <message>
+ <source>&Runtime Information</source>
+ <translation type="obsolete">Info&rmazioni di esecuzione</translation>
+ </message>
+</context>
+<context>
<name>VBoxVMListBox</name>
<message>
<source><nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr></source>
@@ -18374,7 +19082,7 @@ questa caratteristica dopo aver installato un sistema operativo guest Windows!&l
<translation type="obsolete">Visualizza il percorso dove verranno archiviati gli snapshot di questa macchina virtuale. Nota che gli snapshot possono occupare diverso spazio.</translation>
</message>
<message>
- <source>Resets the snapshot folder path to the default value. The actual default path will be displayed after accepting the changes and opening this dialog again.</source>
+ <source>Resets the snapshot folder path to the default value. The actual default path will be displayed after accepting the changes and opening this window again.</source>
<translation type="obsolete">Reimposta il percorso alla cartella per gli snapshot al valore predefinito. Il valore predefinito effettivo verrà visualizzato dopo aver accettato la modifica e aperto nuovamente questa finestra.</translation>
</message>
<message>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
index 1d0124c..3fc8a6d 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts
@@ -300,7 +300,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">シームレスモード(&L)</translation>
+ <translation type="unfinished">シームレスモード(&L)</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -356,7 +356,7 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>マウス統合を無効化(&M)</translation>
+ <translation type="obsolete">マウス統合を無効化(&M)</translation>
</message>
<message>
<source>&Settings...</source>
@@ -388,7 +388,7 @@
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>一時的にホストマウスポインターの統合機能を無効化</translation>
+ <translation type="obsolete">一時的にホストマウスポインターの統合機能を無効化</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -400,11 +400,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Ctrl-Alt-Delを送信(&I)</translation>
+ <translation type="obsolete">Ctrl-Alt-Delを送信(&I)</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>仮想マシンにCtrl-Alt-Delシーケンスを送信する</translation>
+ <translation type="obsolete">仮想マシンにCtrl-Alt-Delシーケンスを送信する</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -412,7 +412,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>仮想マシンにCtrl-Alt-Backspaceシーケンスを送信する</translation>
+ <translation type="obsolete">仮想マシンにCtrl-Alt-Backspaceシーケンスを送信する</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -432,7 +432,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Ctrl-Alt-Backspaceを送信(&E)</translation>
+ <translation type="obsolete">Ctrl-Alt-Backspaceを送信(&E)</translation>
</message>
<message>
<source>&Pause</source>
@@ -452,15 +452,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>フルスクリーンモードに切り替える(&F)</translation>
+ <translation type="obsolete">フルスクリーンモードに切り替える(&F)</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>通常のウィンドウモードとフルスクリーンモードを切り換える</translation>
+ <translation type="obsolete">通常のウィンドウモードとフルスクリーンモードを切り換える</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>シームレスモードに切り換える(&L)</translation>
+ <translation type="obsolete">シームレスモードに切り換える(&L)</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -468,7 +468,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>スケールモードに切り換える(&S)</translation>
+ <translation type="obsolete">スケールモードに切り換える(&S)</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -524,15 +524,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>CD/DVD デバイス(&C)</translation>
+ <translation type="obsolete">CD/DVD デバイス(&C)</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>フロッピーデバイス(&F)</translation>
+ <translation type="obsolete">フロッピーデバイス(&F)</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>USB デバイス(&U)</translation>
+ <translation type="obsolete">USB デバイス(&U)</translation>
</message>
<message>
<source>&Webcams</source>
@@ -544,7 +544,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>ドラッグ&ドロップ</translation>
+ <translation type="obsolete">ドラッグ&ドロップ</translation>
</message>
<message>
<source>&Network Settings...</source>
@@ -665,7 +665,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>ログ取得(&L)...</translation>
+ <translation type="obsolete">ログ取得(&L)...</translation>
</message>
<message>
<source>Show the log files of the selected virtual machine</source>
@@ -1119,6 +1119,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">ファイル(&F)</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1132,6 +1221,11 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -1141,6 +1235,20 @@
</message>
</context>
<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIApplianceEditorWidget</name>
<message>
<source>Virtual System %1</source>
@@ -1921,6 +2029,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2599,7 +2732,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2820,6 +2953,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB コントローラー</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">有効</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">無効</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3183,15 +3371,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>ドックとメニューバー(&D):</translation>
+ <translation type="obsolete">ドックとメニューバー(&D):</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>フルスクリーン時に自動表示</translation>
+ <translation type="obsolete">フルスクリーン時に自動表示</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>フルスクリーンモードの際、クリックするとホストのドックとメニューバーが表示されます。</translation>
+ <translation type="obsolete">フルスクリーンモードの際、クリックするとホストのドックとメニューバーが表示されます。</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -4440,12 +4628,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>アクティブなCD/DVD デバイスを表示:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>アクティブなCD/DVD デバイスを表示:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>アクティブなフロッピーデバイスを表示:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>アクティブなフロッピーデバイスを表示:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4553,6 +4741,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4703,7 +4901,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>仮想マシンはハードウェアグラフィックスアクセラレーションを使用するように設定されており、かつOSのヒントがWindows Vistaかそれ以降を指定しています。ベストパフォーマンスを引き出すために、マシンのビデオメモリーを少なくとも<b>%1</b>にしてください。</translation>
+ <translation type="obsolete">仮想マシンはハードウェアグラフィックスアクセラレーションを使用するように設定されており、かつOSのヒントがWindows Vistaかそれ以降を指定しています。ベストパフォーマンスを引き出すために、マシンのビデオメモリーを少なくとも<b>%1</b>にしてください。</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -4921,43 +5119,35 @@ p, li { white-space: pre-wrap; }
<translation>スクリーン %1 のビデオを録画します。</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">ミニ ツールバー:</translation>
+ <translation type="obsolete">ミニ ツールバー:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">フルスクリーンモードまたはシームレスモード時にミニ ツールバーを表示します。</translation>
+ <translation type="obsolete">フルスクリーンモードまたはシームレスモード時にミニ ツールバーを表示します。</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">フルスクリーン/シームレスモード時に表示(&F)</translation>
+ <translation type="obsolete">フルスクリーン/シームレスモード時に表示(&F)</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">ミニ ツールバーを画面の上部に表示します。デフォルトの設定では画面の下部に表示します。</translation>
+ <translation type="obsolete">ミニ ツールバーを画面の上部に表示します。デフォルトの設定では画面の下部に表示します。</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">画面の上部に表示(&T)</translation>
+ <translation type="obsolete">画面の上部に表示(&T)</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5223,6 +5413,126 @@ p, li { white-space: pre-wrap; }
<source>Show at &Top of Screen</source>
<translation type="obsolete">画面の上部に表示(&T)</translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">ミニ ツールバー:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">フルスクリーンモードまたはシームレスモード時にミニ ツールバーを表示します。</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">フルスクリーン/シームレスモード時に表示(&F)</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">ミニ ツールバーを画面の上部に表示します。デフォルトの設定では画面の下部に表示します。</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">画面の上部に表示(&T)</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5918,11 +6228,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>オンの場合、仮想マシンの起動時に <b>[ポートパス]</b>フィールドで指定されたパイプが作成されます。そうでなければ仮想マシンは既存のパイプを使用します。</translation>
+ <translation type="obsolete">オンの場合、仮想マシンの起動時に <b>[ポートパス]</b>フィールドで指定されたパイプが作成されます。そうでなければ仮想マシンは既存のパイプを使用します。</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>パイプ作成(&C)</translation>
+ <translation type="obsolete">パイプ作成(&C)</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5930,11 +6240,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>ポートが<b>[ホストパイプ]</b>モードで動作しているとき、シリアルポートのパイプのパスを指定します。ポートが<b>[ホストデバイス]</b>モードで動作しているとき、ホストシリアルデバイス名を表示します。</translation>
+ <translation type="obsolete">ポートが<b>[ホストパイプ]</b>モードで動作しているとき、シリアルポートのパイプのパスを指定します。ポートが<b>[ホストデバイス]</b>モードで動作しているとき、ホストシリアルデバイス名を表示します。</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>ポート/ファイルパス(&P):</translation>
+ <translation type="obsolete">ポート/ファイルパス(&P):</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5944,6 +6254,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>このシリアルポートのベースI/Oポートアドレスを指定します。 有効値は<tt>0</tt>から<tt>0xFFFF</tt>の範囲の整数です。</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6080,11 +6406,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>CD/DVD デバイス の追加</nobr></translation>
+ <translation type="obsolete"><nobr>CD/DVD デバイス の追加</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>フロッピー デバイス の追加</nobr></translation>
+ <translation type="obsolete"><nobr>フロッピー デバイス の追加</nobr></translation>
</message>
<message>
<source>No name is currently specified for the controller at position <b>%1</b>.</source>
@@ -6178,11 +6504,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>CD/DVD デバイスを追加</translation>
+ <translation type="obsolete">CD/DVD デバイスを追加</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>フロッピーデバイスを追加</translation>
+ <translation type="obsolete">フロッピーデバイスを追加</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6238,15 +6564,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVDドライブ(&D):</translation>
+ <translation type="obsolete">CD/DVDドライブ(&D):</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>仮想CD/DVDディスクを選択するか、物理ドライブを仮想ドライブに割り当てます。仮想マシンはファイルのデータまたは物理的なドライブの内容が仮想ドライブに挿入されていると見なします。</translation>
+ <translation type="obsolete">仮想CD/DVDディスクを選択するか、物理ドライブを仮想ドライブに割り当てます。仮想マシンはファイルのデータまたは物理的なドライブの内容が仮想ドライブに挿入されていると見なします。</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>仮想CD/DVDドライブの設定</translation>
+ <translation type="obsolete">仮想CD/DVDドライブの設定</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6270,7 +6596,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>仮想CD/DVDディスクファイルの選択...</translation>
+ <translation type="obsolete">仮想CD/DVDディスクファイルの選択...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6440,6 +6766,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">仮想光学ディスクファイルの選択...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6741,7 +7099,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>USB 2.0がこの仮想マシンで有効です。しかし、これには <b>%1</b> のインストールが必要です。VirtualBoxダウンロードサイトから拡張パックをインストールするか、マシンを開始するのにUSB 2.0を無効にしてください。</translation>
+ <translation type="obsolete">USB 2.0がこの仮想マシンで有効です。しかし、これには <b>%1</b> のインストールが必要です。VirtualBoxダウンロードサイトから拡張パックをインストールするか、マシンを開始するのにUSB 2.0を無効にしてください。</translation>
</message>
<message>
<source>&Add Empty Filter</source>
@@ -6884,6 +7242,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7057,6 +7419,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">閉じる</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">切り替え</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7135,7 +7505,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p><b>VirtualBox Guest Additions</b> ディスクイメージを<nobr><a href="%1">%1</a></nobr>からダウンロードし、<nobr><b>%2</b>に保存しました。</nobr></p><p>ディスクイメージファイルを登録し、仮想CD/DVDドライブに挿入しますか?</p></translation>
+ <translation type="obsolete"><p><b>VirtualBox Guest Additions</b> ディスクイメージを<nobr><a href="%1">%1</a></nobr>からダウンロードし、<nobr><b>%2</b>に保存しました。</nobr></p><p>ディスクイメージファイルを登録し、仮想CD/DVDドライブに挿入しますか?</p></translation>
</message>
<message>
<source>Insert</source>
@@ -7144,7 +7514,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>仮想マシン<b>"%1"</b>にCD/DVDドライブがないので、<b>VirtualBox Guest Additions</b>のディスクイメージを仮想マシンに挿入できません。 仮想マシン設定ウィンドウのストレージページでドライブを追加してください。</p></translation>
+ <translation type="obsolete"><p>仮想マシン<b>"%1"</b>にCD/DVDドライブがないので、<b>VirtualBox Guest Additions</b>のディスクイメージを仮想マシンに挿入できません。 仮想マシン設定ウィンドウのストレージページでドライブを追加してください。</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
@@ -7185,7 +7555,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>VirtualBox COMオブジェクトの作成に失敗しました。</p><p>アプリケーションを終了します。</p></translation>
+ <translation type="obsolete"><p>VirtualBox COMオブジェクトの作成に失敗しました。</p><p>アプリケーションを終了します。</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7615,11 +7985,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>CD/DVDデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
+ <translation type="obsolete">CD/DVDデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>フロッピーデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
+ <translation type="obsolete">フロッピーデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当てに失敗しました。</translation>
</message>
<message>
<source><p>USB 2.0 is currently enabled for this virtual machine. However this requires the <b><nobr>%1</nobr></b> to be installed.</p><p>Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</p></source>
@@ -8003,7 +8373,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>VirtualBoxの新しいバージョンがリリースされました! バージョン <b>%1</b>は<a href="http://www.virtualbox.org/">virtualbox.org</a>から入手できます。</p><p>このリンクから最新バージョンをダウンロードできます。: </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>VirtualBoxの新しいバージョンがリリースされました! バージョン <b>%1</b>は<a href="http://www.virtualbox.org/">virtualbox.org</a>から入手できます。</p><p>このリンクから最新バージョンをダウンロードできます。: </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -8127,7 +8497,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>一つ以上の仮想ハードディスク、CD/DVDまたはフロッピーメディアのに現在アクセスできません。アクセス可能になるまでこれらのメディアを使用する仮想マシンを操作できません。</p><p><b>[確認]</b>ボタンをクリックして仮想メディアマネージャーを起動し、どのメディアにアクセスできないのか確認してください。または<b>[無視]</b>ボタンをクリックして、このメッセージを無視してください。</p></translation>
+ <translation type="obsolete"><p>一つ以上の仮想ハードディスク、CD/DVDまたはフロッピーメディアのに現在アクセスできません。アクセス可能になるまでこれらのメディアを使用する仮想マシンを操作できません。</p><p><b>[確認]</b>ボタンをクリックして仮想メディアマネージャーを起動し、どのメディアにアクセスできないのか確認してください。または<b>[無視]</b>ボタンをクリックして、このメッセージを無視してください。</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -8158,7 +8528,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>仮想マシン実行中に重大なエラーが発生したため、仮想マシンは停止しました。</p><p>問題の解決のため、<a href=http://www.virtualbox.org>http://www.virtualbox.org</a>のCommunityセクションを参照するか、サポートに連絡してください。あなたがエラー発生時に行った操作と共に、<nobr><b>%1</b></nobr>ディレクトリに格納されているログファイル(<tt>VBox.log</tt>)とイメージファイル(<tt>VBox.png</tt>)を提供してください。注:VirtualBoxメインウィンドウの<b>[仮想マシン]</b>メニューから[ログを参照]を選択して、上記ファイルにアクセスすることができます。</p><p>仮想マシンを電源オフするには [...]
+ <translation type="obsolete"><p>仮想マシン実行中に重大なエラーが発生したため、仮想マシンは停止しました。</p><p>問題の解決のため、<a href=http://www.virtualbox.org>http://www.virtualbox.org</a>のCommunityセクションを参照するか、サポートに連絡してください。あなたがエラー発生時に行った操作と共に、<nobr><b>%1</b></nobr>ディレクトリに格納されているログファイル(<tt>VBox.log</tt>)とイメージファイル(<tt>VBox.png</tt>)を提供してください。注:VirtualBoxメインウィンドウの<b>[仮想マシン]</b>メニューから[ログを参照]を選択して、上記ファイルにアクセスすることができます。</p><p&g [...]
</message>
<message>
<source>hard disk</source>
@@ -8312,7 +8682,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>CD/DVDドライブをコントローラー<b>"%1"</b>に追加します。</p><p>仮想CD/DVDディスクをドライブに割り当てますか?空のドライブだけ割り当てますか?</p></translation>
+ <translation type="obsolete"><p>CD/DVDドライブをコントローラー<b>"%1"</b>に追加します。</p><p>仮想CD/DVDディスクをドライブに割り当てますか?空のドライブだけ割り当てますか?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8334,11 +8704,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>CD/DVDデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
+ <translation type="obsolete">CD/DVDデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>フロッピーデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
+ <translation type="obsolete">フロッピーデバイス(<nobr><b>%1</b></nobr>)の、仮想マシン<b>"%3"</b>のスロット<i>"%2"</i> への割り当て解除に失敗しました。</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -8546,7 +8916,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>CD/DVD デバイスを削除しますか?</p><p>デバイスがない場合、CD/DVDメディアやISOイメージファイルのマウントおよびGuest Additions のインストールはできません!</p></translation>
+ <translation type="obsolete"><p>CD/DVD デバイスを削除しますか?</p><p>デバイスがない場合、CD/DVDメディアやISOイメージファイルのマウントおよびGuest Additions のインストールはできません!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8782,7 +9152,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>データのドロップに失敗しました。</translation>
+ <translation type="obsolete">データのドロップに失敗しました。</translation>
</message>
<message>
<source><p>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b><nobr>%1</nobr></b> to be installed.</p><p>Please install the Extension Pack from the VirtualBox download site. After this you will be able to re-enable USB 2.0. It will be disabled in the meantime unless you cancel the current settings changes.</p></source>
@@ -8835,6 +9205,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -9856,13 +10314,17 @@ step and attach hard disks later using the VM Settings dialog.</p></source
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>ようこそVirtualBoxへ!</h3><p>このウィンドウの左側にコンピューター上のすべての仮想マシンがリスト表示されます。しかしまだ仮想マシンが作成されていないため、リストは空です。<img src=:/welcome.png align=right/></p><p>新規仮想マシンを作成するにはウィンドウ上部にあるメインツールバーの<b>[新規]</b>ボタンをクリックしてください。</p><p><b>%1</b>キーでヘルプを表示できます。または最新情報とニュースを取得するため <a href=http://www.virtualbox.org>www.virtualbox.org</a> を訪問ください。</p></translation>
+ <translation type="obsolete"><h3>ようこそVirtualBoxへ!</h3><p>このウィンドウの左側にコンピューター上のすべての仮想マシンがリスト表示されます。しかしまだ仮想マシンが作成されていないため、リストは空です。<img src=:/welcome.png align=right/></p><p>新規仮想マシンを作成するにはウィンドウ上部にあるメインツールバーの<b>[新規]</b>ボタンをクリックしてください。</p><p><b>%1</b>キーでヘルプを表示できます。または最新情報とニュースを取得するため <a href=http://www.virtualbox.org>www.virtualbox.org</a> を訪問ください。</p></translation>
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>マネージャー</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9903,7 +10365,7 @@ step and attach hard disks later using the VM Settings dialog.</p></source
</message>
<message>
<source>Settings</source>
- <translation>設定</translation>
+ <translation type="obsolete">設定</translation>
</message>
</context>
<context>
@@ -9948,6 +10410,10 @@ step and attach hard disks later using the VM Settings dialog.</p></source
<source>VirtualBox - %1</source>
<translation>VirtualBox - %1</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10023,6 +10489,25 @@ step and attach hard disks later using the VM Settings dialog.</p></source
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">%1チップセットがサポートするより多くのストレージコントローラーを指定しています。 システムページでチップセットの種類を変更するか、ストレージページで次のストレージコントローラーの数を減らしてください: %2。</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">設定</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -10037,6 +10522,10 @@ step and attach hard disks later using the VM Settings dialog.</p></source
<source>Close</source>
<translation type="unfinished">閉じる</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10323,7 +10812,7 @@ step and attach hard disks later using the VM Settings dialog.</p></source
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>ドラッグ&ドロップモード</translation>
+ <translation type="obsolete">ドラッグ&ドロップモード</translation>
</message>
<message>
<source>Guest Additions</source>
@@ -10405,6 +10894,10 @@ step and attach hard disks later using the VM Settings dialog.</p></source
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -12715,7 +13208,7 @@ Version %1</source>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -13023,12 +13516,12 @@ Version %1</source>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>有効</translation>
+ <translation type="obsolete">有効</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>無効</translation>
+ <translation type="obsolete">無効</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -13554,7 +14047,7 @@ Version %1</source>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Not Attached</source>
@@ -14037,17 +14530,17 @@ Version %1</source>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>このハードディスクの割り当ては、新規作成された差分ハードディスクの使用により、間接的に実行されます。</translation>
+ <translation type="obsolete">このハードディスクの割り当ては、新規作成された差分ハードディスクの使用により、間接的に実行されます。</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>ハードディスクチェーン中のいくつかのメディアにアクセスできません。仮想メディアマネージャーの<b>[差分ハードディスクを表示]</b>を使用して、これらのメディアを確認してください。</translation>
+ <translation type="obsolete">ハードディスクチェーン中のいくつかのメディアにアクセスできません。仮想メディアマネージャーの<b>[差分ハードディスクを表示]</b>を使用して、これらのメディアを確認してください。</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>このベースハードディスクは以下の差分ハードディスクを使用して間接的に割り当てられます:</translation>
+ <translation type="obsolete">このベースハードディスクは以下の差分ハードディスクを使用して間接的に割り当てられます:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -14272,6 +14765,105 @@ Version %1</source>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">有効</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">有効</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">有効</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -15041,6 +15633,10 @@ USB フィルターを追加または除去するにはコンテキストメニ
<comment>VMM: Floppy Image</comment>
<translation type="obsolete">割り当て</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
index 6bfbd23..3453618 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts
@@ -208,7 +208,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">របៀបគ្មានថ្នេរ</translation>
+ <translation type="unfinished">របៀបគ្មានថ្នេរ</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -232,11 +232,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>បិទការរួមបញ្ចូលកណ្ដុរ</translation>
+ <translation type="obsolete">បិទការរួមបញ្ចូលកណ្ដុរ</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>បិទការរួមបញ្ចូលព្រួញកណ្ដុររបស់ម៉ាស៊ីនជាបណ្ដោះអាសន្ន</translation>
+ <translation type="obsolete">បិទការរួមបញ្ចូលព្រួញកណ្ដុររបស់ម៉ាស៊ីនជាបណ្ដោះអាសន្ន</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -248,11 +248,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>បញ្ជាន់ (Insert) បញ្ជា(Ctrl)-ជំនួស(Alt)-លុប(Del)</translation>
+ <translation type="obsolete">បញ្ជាន់ (Insert) បញ្ជា(Ctrl)-ជំនួស(Alt)-លុប(Del)</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>ផ្ញើលំដាប់បញ្ជា(Ctrl)-ជំនួស(Alt)-លុប(Del) ទៅកាន់ម៉ាស៊ីននិម្មិត</translation>
+ <translation type="obsolete">ផ្ញើលំដាប់បញ្ជា(Ctrl)-ជំនួស(Alt)-លុប(Del) ទៅកាន់ម៉ាស៊ីននិម្មិត</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -260,7 +260,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>ផ្ញើលំដាប់បញ្ជា(Ctrl)-ជំនួស(Alt)-លុបថយក្រោយ(Backspace) ទៅកាន់ម៉ាស៊ីននិម្មិត</translation>
+ <translation type="obsolete">ផ្ញើលំដាប់បញ្ជា(Ctrl)-ជំនួស(Alt)-លុបថយក្រោយ(Backspace) ទៅកាន់ម៉ាស៊ីននិម្មិត</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -328,15 +328,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>ឧបករណ៍ស៊ីឌី/ឌីវីឌី</translation>
+ <translation type="obsolete">ឧបករណ៍ស៊ីឌី/ឌីវីឌី</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>ឧបករណ៍ថាសទន់</translation>
+ <translation type="obsolete">ឧបករណ៍ថាសទន់</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>ឧបករណ៍ USB</translation>
+ <translation type="obsolete">ឧបករណ៍ USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -383,7 +383,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">កំពុងធ្វើកំណត់ហេតុ...</translation>
+ <translation type="obsolete">កំពុងធ្វើកំណត់ហេតុ...</translation>
</message>
<message>
<source>&Help</source>
@@ -402,26 +402,10 @@
<translation></translation>
</message>
<message>
- <source>Switch to &Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch between normal and fullscreen mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch to Seam&less Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and seamless desktop integration mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Switch to &Scaled Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and scaled mode</source>
<translation type="unfinished"></translation>
</message>
@@ -490,10 +474,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">ឯកសារ</translation>
@@ -761,10 +741,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -929,6 +905,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">ឯកសារ</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -942,6 +1007,25 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1460,6 +1544,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2064,11 +2173,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">មិនបានភ្ជាប់</translation>
@@ -2287,6 +2391,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">ឧបករណ៍បញ្ជា USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2584,18 +2743,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">បង្ហាញចតដោយស្វ័យប្រវត្តិ និងរបារម៉ឺនុយអេក្រង់ពេញ</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -3845,12 +3992,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>បង្ហាញសកម្មភាពរបស់ឧបករណ៍ស៊ីឌី/ឌីវីឌី ៖</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>បង្ហាញសកម្មភាពរបស់ឧបករណ៍ស៊ីឌី/ឌីវីឌី ៖</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>បង្ហាញសកម្មភាពរបស់ឧបករណ៍ថាសទន់ ៖</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>បង្ហាញសកម្មភាពរបស់ឧបករណ៍ថាសទន់ ៖</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -3949,6 +4096,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4238,10 +4395,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4293,43 +4446,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">របារឧបករណ៍តូច ៖</translation>
+ <translation type="obsolete">របារឧបករណ៍តូច ៖</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">ប្រសិនបើធីក បង្ហាញរបារឧបករណ៍តូចក្នុងរបៀបអេក្រង់ពេញ និងពង្រីក ។</translation>
+ <translation type="obsolete">ប្រសិនបើធីក បង្ហាញរបារឧបករណ៍តូចក្នុងរបៀបអេក្រង់ពេញ និងពង្រីក ។</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">បង្ហាញអេក្រង់ពេញ/ពង្រីក</translation>
+ <translation type="obsolete">បង្ហាញអេក្រង់ពេញ/ពង្រីក</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">ប្រសិនបើធីក បង្ហាញរបារឧបករណ៍តូចនៅផ្នែកខាងលើអេក្រង់ ជាជាងក្នុងទីតាំងលំនាំដើមនៃប៊ូតុងរបស់អេក្រង់ ។</translation>
+ <translation type="obsolete">ប្រសិនបើធីក បង្ហាញរបារឧបករណ៍តូចនៅផ្នែកខាងលើអេក្រង់ ជាជាងក្នុងទីតាំងលំនាំដើមនៃប៊ូតុងរបស់អេក្រង់ ។</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">បង្ហាញកំពូលអេក្រង់</translation>
+ <translation type="obsolete">បង្ហាញកំពូលអេក្រង់</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4427,6 +4572,126 @@ p, li { white-space: pre-wrap; }
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">របារឧបករណ៍តូច ៖</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">ប្រសិនបើធីក បង្ហាញរបារឧបករណ៍តូចក្នុងរបៀបអេក្រង់ពេញ និងពង្រីក ។</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">បង្ហាញអេក្រង់ពេញ/ពង្រីក</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">ប្រសិនបើធីក បង្ហាញរបារឧបករណ៍តូចនៅផ្នែកខាងលើអេក្រង់ ជាជាងក្នុងទីតាំងលំនាំដើមនៃប៊ូតុងរបស់អេក្រង់ ។</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">បង្ហាញកំពូលអេក្រង់</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -4880,19 +5145,35 @@ network adapter name</comment>
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>ប្រសិនបើបានគូសធីក បំពង់បានបញ្ជាក់នៅក្នុងវាល <b>ផ្លូវច្រក</b> នឹងត្រូវបានបង្កើតដោយម៉ាស៊ីននិម្មិត នៅពេលវាចាប់ផ្ដើម ។ បើមិនដូច្នេះទេ ម៉ាស៊ីននិម្មិតនឹងព្យាយាមប្រើបំពង់ដែលបានស្រាប់ ។</translation>
+ <translation type="obsolete">ប្រសិនបើបានគូសធីក បំពង់បានបញ្ជាក់នៅក្នុងវាល <b>ផ្លូវច្រក</b> នឹងត្រូវបានបង្កើតដោយម៉ាស៊ីននិម្មិត នៅពេលវាចាប់ផ្ដើម ។ បើមិនដូច្នេះទេ ម៉ាស៊ីននិម្មិតនឹងព្យាយាមប្រើបំពង់ដែលបានស្រាប់ ។</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>បង្កើតបំពង់</translation>
+ <translation type="obsolete">បង្កើតបំពង់</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>បង្ហាញផ្លូវទៅកាន់ច្រកស៊េរៀលនៅលើម៉ាស៊ីន នៅពេលច្រកដំណើការក្នុងរបៀប <b>បំពង់ម៉ាស៊ីន</b> ឬឈ្មោះឧបករណ៍ស៊េរៀលនៅពេលច្រកដំណើរការក្នុងរបៀប <b>ឧបករណ៍ម៉ាស៊ីន</b> ។</translation>
+ <translation type="obsolete">បង្ហាញផ្លូវទៅកាន់ច្រកស៊េរៀលនៅលើម៉ាស៊ីន នៅពេលច្រកដំណើការក្នុងរបៀប <b>បំពង់ម៉ាស៊ីន</b> ឬឈ្មោះឧបករណ៍ស៊េរៀលនៅពេលច្រកដំណើរការក្នុងរបៀប <b>ឧបករណ៍ម៉ាស៊ីន</b> ។</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>ផ្លូវ ច្រក/ឯកសារ ៖</translation>
+ <translation type="obsolete">ផ្លូវ ច្រក/ឯកសារ ៖</translation>
+ </message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -4950,11 +5231,11 @@ network adapter name</comment>
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>បន្ថែមឧបករណ៍ ស៊ីឌី/ឌីវឌី </nobr></translation>
+ <translation type="obsolete"><nobr>បន្ថែមឧបករណ៍ ស៊ីឌី/ឌីវឌី </nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>បន្ថែមឧបករណ៍ ថាសទន់ </nobr></translation>
+ <translation type="obsolete"><nobr>បន្ថែមឧបករណ៍ ថាសទន់ </nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -4998,11 +5279,11 @@ network adapter name</comment>
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>បន្ថែមឧបករណ៍ស៊ីឌី/ឌីវីឌី</translation>
+ <translation type="obsolete">បន្ថែមឧបករណ៍ស៊ីឌី/ឌីវីឌី</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>បន្ថែមឧបករណ៍ថាសទន់</translation>
+ <translation type="obsolete">បន្ថែមឧបករណ៍ថាសទន់</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5177,117 +5458,133 @@ network adapter name</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
+ <source>Floppy &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <source>Choose a virtual floppy disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Set up the virtual CD/DVD drive</source>
+ <source>Set up the virtual floppy drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Floppy &Drive:</source>
+ <source>Create a new hard disk...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual floppy disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <source>Choose a virtual hard disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Set up the virtual floppy drive</source>
+ <source>Remove disk from virtual drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Create a new hard disk...</source>
+ <source>Choose a virtual floppy disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual hard disk file...</source>
+ <source>When checked the virtual disk will not be removed when the guest system ejects it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
+ <source>&Live CD/DVD</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remove disk from virtual drive</source>
+ <source>When checked the guest system will see the virtual disk as a solid state device.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual floppy disk file...</source>
+ <source>&Solid-state Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the virtual disk will not be removed when the guest system ejects it.</source>
+ <source>Details:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Live CD/DVD</source>
+ <source>at most one supported</source>
+ <comment>controller</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a solid state device.</source>
+ <source>up to %1 supported</source>
+ <comment>controllers</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Port Count:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Controller: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No name is currently specified for the controller at position <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Solid-state Drive</source>
+ <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Details:</source>
+ <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>at most one supported</source>
- <comment>controller</comment>
+ <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>up to %1 supported</source>
- <comment>controllers</comment>
+ <source>Add USB Controller</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Port Count:</source>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Controller: %1</source>
+ <source>Choose a virtual optical disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No name is currently specified for the controller at position <b>%1</b>.</source>
+ <source><nobr>Add Optical Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
+ <source><nobr>Add Floppy Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <source>Add Optical Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <source>Add Floppy Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add USB Controller</source>
+ <source>Optical &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Hot-pluggable</source>
+ <source>Set up the virtual optical drive</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5664,10 +5961,6 @@ network adapter name</comment>
<translation type="unfinished"><nobr>ស្ថានភាព ៖ %1</nobr></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -5687,6 +5980,10 @@ network adapter name</comment>
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -5856,6 +6153,14 @@ network adapter name</comment>
<source>Close</source>
<translation type="unfinished">បិទ</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">ប្ដូរ</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -5899,7 +6204,7 @@ network adapter name</comment>
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>បានបរាជ័យក្នុងការបង្កើតវត្ថុ VirtualBox COM ។</p><p>កម្មវិធីនឹងបិទឥឡូវនេះ ។</p></translation>
+ <translation type="obsolete"><p>បានបរាជ័យក្នុងការបង្កើតវត្ថុ VirtualBox COM ។</p><p>កម្មវិធីនឹងបិទឥឡូវនេះ ។</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -6319,7 +6624,7 @@ network adapter name</comment>
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>កំណែថ្មីរបស់ VirtualBox ត្រូវបានចេញផ្សាយ ! គឺកំណែ <b>%1</b> ដែលអាចរកបាននៅ <a href="http://www.virtualbox.org/">virtualbox.org</a> ។</p><p>អ្នកអាចទាញយកកំណែនេះពីតំណនេះដោយផ្ទាល់ ៖</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>កំណែថ្មីរបស់ VirtualBox ត្រូវបានចេញផ្សាយ ! គឺកំណែ <b>%1</b> ដែលអាចរកបាននៅ <a href="http://www.virtualbox.org/">virtualbox.org</a> ។</p><p>អ្នកអាចទាញយកកំណែនេះពីតំណនេះដោយផ្ទាល់ ៖</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6399,11 +6704,11 @@ network adapter name</comment>
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>ថាសរឹងនិម្មិតមួយ ឬច្រើន ស៊ីឌី/ឌីវីឌី ឬមេឌៀថាសទន់បច្ចុប្បន្នមិនអាចចូលដំណើរការបានទេ ។ ជាលទ្ធផល អ្នកនឹងមិនអាចប្រតិបត្តិម៉ាស៊ីននិម្មិត ដែលប្រើមេឌៀនេះបានទេ រហូតដល់ពួកវាអាចចូលដំណើរការបាននៅពេលក្រោយ ។</p><p>ចុច <b>ពិនិត្យមើល</b> ដើម្បីប្រើបង្អួចកម្មវិធីគ្រប់គ្រងមេឌៀនិម្មិត ហើយមើលអ្វីដែលមេឌៀមិនអាចចូលដំណើរការបាន ឬចុច <b>មិនអើពើ</b> ដើម្បីមិនអើពើនឹងសារនេះ ។</p></translation>
+ <translation type="obsolete"><p>ថាសរឹងនិម្មិតមួយ ឬច្រើន ស៊ីឌី/ឌីវីឌី ឬមេឌៀថាសទន់បច្ចុប្បន្នមិនអាចចូលដំណើរការបានទេ ។ ជាលទ្ធផល អ្នកនឹងមិនអាចប្រតិបត្តិម៉ាស៊ីននិម្មិត ដែលប្រើមេឌៀនេះបានទេ រហូតដល់ពួកវាអាចចូលដំណើរការបាននៅពេលក្រោយ ។</p><p>ចុច <b>ពិនិត្យមើល</b> ដើម្បីប្រើបង្អួចកម្មវិធីគ្រប់គ្រងមេឌៀនិម្មិត ហើយមើលអ្វីដែលមេឌៀមិនអាចចូលដំណើរការបាន ឬចុច <b>មិនអើពើ</b> ដើម្បីមិនអើពើនឹងសារនេះ ។</p></translation>
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>កំហុសធ្ងន់ធ្ងរបានកើតឡើងខណៈពេលកំពុងរត់ម៉ាស៊ីននិម្មិត ហើយការប្រតិបត្តិម៉ាស៊ីនត្រូវបានបញ្ឈប់ ។</p><p>ចំពោះជំនួយ សូមមើលផ្នែកសហគមន៍នៅលើ <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ឬកិច្ចសន្យាគាំទ្ររបស់អ្នក ។ សូមផ្ដល់នូវខ្លឹមសាររបស់ឯកសារកំណត់ហេតុ <tt>VBox.log</tt> ហើយនឹងឯកសាររូបភាព <tt>VBox.png</tt> ដែលអ្នកអាចរកបាននៅក្នុងថត <nobr><b>%1</b>< [...]
+ <translation type="obsolete"><p>កំហុសធ្ងន់ធ្ងរបានកើតឡើងខណៈពេលកំពុងរត់ម៉ាស៊ីននិម្មិត ហើយការប្រតិបត្តិម៉ាស៊ីនត្រូវបានបញ្ឈប់ ។</p><p>ចំពោះជំនួយ សូមមើលផ្នែកសហគមន៍នៅលើ <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ឬកិច្ចសន្យាគាំទ្ររបស់អ្នក ។ សូមផ្ដល់នូវខ្លឹមសាររបស់ឯកសារកំណត់ហេតុ <tt>VBox.log</tt> ហើយនឹងឯកសាររូបភាព <tt>VBox.png</tt> ដែលអ្នកអាចរកបាននៅក្នុងថត <nobr><b> [...]
</message>
<message>
<source>A file named <b>%1</b> already exists. Are you sure you want to replace it?<br /><br />Replacing it will overwrite its contents.</source>
@@ -6712,7 +7017,7 @@ failed to close ...</comment>
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>តើអ្នកប្រាកដជាចង់លុបឧបករណ៍ស៊ីឌី/ឌីវីឌី-រ៉ូមឬ?</p><p>អ្នកនឹងមិនអាចម៉ោនស៊ីឌី ឬរូបភាព ISO ឬដំឡើងការបន្ថែមម៉ាស៊ីនភ្ញៀវដោយគ្មានវាបានទេ !</p></translation>
+ <translation type="obsolete"><p>តើអ្នកប្រាកដជាចង់លុបឧបករណ៍ស៊ីឌី/ឌីវីឌី-រ៉ូមឬ?</p><p>អ្នកនឹងមិនអាចម៉ោនស៊ីឌី ឬរូបភាព ISO ឬដំឡើងការបន្ថែមម៉ាស៊ីនភ្ញៀវដោយគ្មានវាបានទេ !</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -6834,10 +7139,6 @@ medium</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -6846,14 +7147,6 @@ medium</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -6882,14 +7175,6 @@ medium</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7095,10 +7380,6 @@ medium</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7326,14 +7607,6 @@ medium</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7394,6 +7667,94 @@ medium</comment>
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8104,13 +8465,17 @@ You may wish to translate this more like "Time remaining: %1"</comment
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>សូមស្វាគមន៍មកកាន់ VirtualBox !</h3><p>ផ្នែកដែលនៅសល់របស់បង្អួចនេះ គឺជាបញ្ជីម៉ាស៊ីននិម្មិតនៅក្នុងកុំព្យូទ័ររបស់អ្នក ។ បញ្ជីទទេឥឡូវនេះ ពីព្រោះអ្នកមិនបានបង្កើតម៉ាស៊ីននិម្មិតនៅឡើយទេ ។<img src=:/welcome.png align=right/></p><p>ដើម្បីបង្កើតម៉ាស៊ីននិម្មិត ចុចប៊ូតុង <b>ថ្មី</b> ក្នុងរបារឧបករណ៍ដែលមាននៅផ្នែកខាងលើនៃបង្អួច ។</p><p>អ្នកអាចចុចគ្រាប់ចុច <b> [...]
+ <translation type="obsolete"><h3>សូមស្វាគមន៍មកកាន់ VirtualBox !</h3><p>ផ្នែកដែលនៅសល់របស់បង្អួចនេះ គឺជាបញ្ជីម៉ាស៊ីននិម្មិតនៅក្នុងកុំព្យូទ័ររបស់អ្នក ។ បញ្ជីទទេឥឡូវនេះ ពីព្រោះអ្នកមិនបានបង្កើតម៉ាស៊ីននិម្មិតនៅឡើយទេ ។<img src=:/welcome.png align=right/></p><p>ដើម្បីបង្កើតម៉ាស៊ីននិម្មិត ចុចប៊ូតុង <b>ថ្មី</b> ក្នុងរបារឧបករណ៍ដែលមាននៅផ្នែកខាងលើនៃបង្អួច ។</p><p>អ្នកអាចចុចគ្រាប់ចុច <b>% [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8139,7 +8504,7 @@ You may wish to translate this more like "Time remaining: %1"</comment
</message>
<message>
<source>Settings</source>
- <translation type="unfinished">កំណត់</translation>
+ <translation type="obsolete">កំណត់</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -8192,6 +8557,10 @@ You may wish to translate this more like "Time remaining: %1"</comment
<source>Display</source>
<translation type="unfinished">បង្ហាញ</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8251,6 +8620,25 @@ You may wish to translate this more like "Time remaining: %1"</comment
<source>you have 2D Video Acceleration enabled. As 2D Video Acceleration is supported for Windows guests only, this feature will be disabled.</source>
<translation type="obsolete">អ្នកបានបើកបង្កើនល្បឿនវីដេអូទ្វេមាត្រ ។ បង្កើនល្បឿនវីដេអូទ្វេមាត្រត្រូវបានគាំទ្រសម្រាប់ម៉ាស៊ីនវីនដូតែប៉ុណ្ណោះ លក្ខណៈពិសេសនេះនឹងមិនត្រូវបានអនុញ្ញាត ។</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">កំណត់</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -8265,6 +8653,10 @@ You may wish to translate this more like "Time remaining: %1"</comment
<source>Close</source>
<translation type="unfinished">បិទ</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -8575,10 +8967,6 @@ details report (VRDP server port)</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -8590,6 +8978,10 @@ details report (VRDP server port)</comment>
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -10158,7 +10550,7 @@ Virtualization Stuff LED</comment>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>ស៊ីឌី/ឌីវីឌីរ៉ូម</translation>
+ <translation type="obsolete">ស៊ីឌី/ឌីវីឌីរ៉ូម</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -11179,7 +11571,7 @@ medium</comment>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(ស៊ីឌី/ឌីវីឌី)</translation>
+ <translation type="obsolete">(ស៊ីឌី/ឌីវីឌី)</translation>
</message>
<message>
<source>Processor(s)</source>
@@ -11239,17 +11631,17 @@ medium</comment>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation type="unfinished">ការភ្ជាប់ជាមួយនឹងថាសរឹងនេះ នឹងត្រូវបានអនុវត្តដោយប្រយោល ដោយប្រើថាសរឹងផ្សេងដែលបានបង្កើតថ្មីៗ ។</translation>
+ <translation type="obsolete">ការភ្ជាប់ជាមួយនឹងថាសរឹងនេះ នឹងត្រូវបានអនុវត្តដោយប្រយោល ដោយប្រើថាសរឹងផ្សេងដែលបានបង្កើតថ្មីៗ ។</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation type="unfinished">មេឌៀមួយចំនួននៅក្នុងស្រឡាយផ្នែករឹងនេះមិនអាចចូលដំណើរការបានទេ ។ សូមប្រើកម្មវិធីគ្រប់គ្រងមេឌៀនិម្មិតនៅក្នុងរបៀប <b>បង្ហាញថាសរឹងផ្សេងៗគ្នា</b> ដើម្បីពិនិត្យមើលមេឌៀទាំងនេះ ។</translation>
+ <translation type="obsolete">មេឌៀមួយចំនួននៅក្នុងស្រឡាយផ្នែករឹងនេះមិនអាចចូលដំណើរការបានទេ ។ សូមប្រើកម្មវិធីគ្រប់គ្រងមេឌៀនិម្មិតនៅក្នុងរបៀប <b>បង្ហាញថាសរឹងផ្សេងៗគ្នា</b> ដើម្បីពិនិត្យមើលមេឌៀទាំងនេះ ។</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation type="unfinished">ថាសរឹងមូលដ្ឋាននេះត្រូវបានភ្ជាប់ដោយប្រយោល ដោយប្រើថាសរឹងផ្សេង ៖</translation>
+ <translation type="obsolete">ថាសរឹងមូលដ្ឋាននេះត្រូវបានភ្ជាប់ដោយប្រយោល ដោយប្រើថាសរឹងផ្សេង ៖</translation>
</message>
<message>
<source>Enabled</source>
@@ -11925,16 +12317,6 @@ medium</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -12032,6 +12414,105 @@ medium</comment>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -12319,6 +12800,10 @@ VMM: Floppy Image</comment>
<source>Modify the attributes of the selected disk image file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
index 0511fa5..d1ffbfb 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts
@@ -252,7 +252,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">심리스 모드(&L)</translation>
+ <translation type="unfinished">심리스 모드(&L)</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -276,11 +276,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>마우스 통합 비활성화(&M)</translation>
+ <translation type="obsolete">마우스 통합 비활성화(&M)</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>호스트 마우스 포인터 통합을 임시적으로 비활성화시킵니다</translation>
+ <translation type="obsolete">호스트 마우스 포인터 통합을 임시적으로 비활성화시킵니다</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -292,11 +292,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Ctrl-Alt-Del 누르기(&I)</translation>
+ <translation type="obsolete">Ctrl-Alt-Del 누르기(&I)</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>가상 머신에 Ctrl-Alt-Del 키를 입력합니다</translation>
+ <translation type="obsolete">가상 머신에 Ctrl-Alt-Del 키를 입력합니다</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -304,7 +304,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>가상 머신에 Ctrl-Alt-Backspace 키를 입력합니다</translation>
+ <translation type="obsolete">가상 머신에 Ctrl-Alt-Backspace 키를 입력합니다</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -376,15 +376,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>CD/DVD 장치(&C)</translation>
+ <translation type="obsolete">CD/DVD 장치(&C)</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>플로피 장치(&F)</translation>
+ <translation type="obsolete">플로피 장치(&F)</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>USB 장치(&U)</translation>
+ <translation type="obsolete">USB 장치(&U)</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -435,7 +435,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>로그(&L)...</translation>
+ <translation type="obsolete">로그(&L)...</translation>
</message>
<message>
<source>&Help</source>
@@ -464,15 +464,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>전체 화면 모드로 전환(&F)</translation>
+ <translation type="obsolete">전체 화면 모드로 전환(&F)</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>창 모드와 전체 화면 모드를 전환합니다</translation>
+ <translation type="obsolete">창 모드와 전체 화면 모드를 전환합니다</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>심리스 모드로 전환(&L)</translation>
+ <translation type="obsolete">심리스 모드로 전환(&L)</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -480,7 +480,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>크기 조정 모드로 전환(&S)</translation>
+ <translation type="obsolete">크기 조정 모드로 전환(&S)</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -560,7 +560,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Ctrl-Alt-Backspace 누르기(&E)</translation>
+ <translation type="obsolete">Ctrl-Alt-Backspace 누르기(&E)</translation>
</message>
<message>
<source>&File</source>
@@ -883,7 +883,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>드래그 앤 드롭</translation>
+ <translation type="obsolete">드래그 앤 드롭</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -1050,6 +1050,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">파일(&F)</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1063,6 +1152,11 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -1072,6 +1166,20 @@
</message>
</context>
<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIApplianceEditorWidget</name>
<message>
<source>Virtual System %1</source>
@@ -1947,6 +2055,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2627,7 +2760,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2858,6 +2991,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB 컨트롤러</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">사용함</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">사용 안함</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3271,15 +3459,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>도크 및 메뉴 표시줄(&D):</translation>
+ <translation type="obsolete">도크 및 메뉴 표시줄(&D):</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>전체 화면에서 자동으로 보이기</translation>
+ <translation type="obsolete">전체 화면에서 자동으로 보이기</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>선택하면 가상 머신이 전체 화면일 때 호스트 도크와 메뉴 표시줄을 자동으로 표시합니다.</translation>
+ <translation type="obsolete">선택하면 가상 머신이 전체 화면일 때 호스트 도크와 메뉴 표시줄을 자동으로 표시합니다.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -4494,12 +4682,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>CD/DVD 장치의 활동 상태를 표시합니다:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>CD/DVD 장치의 활동 상태를 표시합니다:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>플로피 장치의 활동 상태를 표시합니다:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>플로피 장치의 활동 상태를 표시합니다:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4611,6 +4799,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4925,7 +5123,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>가상 머신에 하드웨어 그래픽 가속이 켜져 있으면 운영 체제 종류를 Windows Vista 이후로 선택하였습니다. 최적의 성능을 위해서 비디오 메모리를 <b>%1</b> 이상으로 설정하십시오.</translation>
+ <translation type="obsolete">가상 머신에 하드웨어 그래픽 가속이 켜져 있으면 운영 체제 종류를 Windows Vista 이후로 선택하였습니다. 최적의 성능을 위해서 비디오 메모리를 <b>%1</b> 이상으로 설정하십시오.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -4979,43 +5177,35 @@ p, li { white-space: pre-wrap; }
<translation>화면 %1의 동영상 녹화를 사용합니다.</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">작은 도구 모음:</translation>
+ <translation type="obsolete">작은 도구 모음:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">선택하면 전체 화면 및 심리스 모드에서 작은 도구 모음을 표시합니다.</translation>
+ <translation type="obsolete">선택하면 전체 화면 및 심리스 모드에서 작은 도구 모음을 표시합니다.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">전체 화면/심리스 모드에서 보이기(&F)</translation>
+ <translation type="obsolete">전체 화면/심리스 모드에서 보이기(&F)</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">선택하면 작은 도구 모음을 화면 아래 대신 위에 표시합니다.</translation>
+ <translation type="obsolete">선택하면 작은 도구 모음을 화면 아래 대신 위에 표시합니다.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">화면 위에 보이기(&T)</translation>
+ <translation type="obsolete">화면 위에 보이기(&T)</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5265,6 +5455,126 @@ p, li { white-space: pre-wrap; }
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation>가상 머신 운영 체제 종류가 64비트로 지정되었습니다. 64비트 게스트 운영 체제는 하드웨어 가상화 기능을 필요로 하므로 변경 사항을 저장하면 자동적으로 활성화될 것입니다.</translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">작은 도구 모음:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">선택하면 전체 화면 및 심리스 모드에서 작은 도구 모음을 표시합니다.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">전체 화면/심리스 모드에서 보이기(&F)</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">선택하면 작은 도구 모음을 화면 아래 대신 위에 표시합니다.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">화면 위에 보이기(&T)</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5885,11 +6195,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>만약 선택한다면 가상 머신을 시작할 때 <b>포트 경로</b>에 지정한 파이프를 만듭니다. 그렇지 않다면 가상 머신에서는 존재하는 파이프를 사용하려고 시도합니다.</translation>
+ <translation type="obsolete">만약 선택한다면 가상 머신을 시작할 때 <b>포트 경로</b>에 지정한 파이프를 만듭니다. 그렇지 않다면 가상 머신에서는 존재하는 파이프를 사용하려고 시도합니다.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>파이프 만들기(&C)</translation>
+ <translation type="obsolete">파이프 만들기(&C)</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5897,11 +6207,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation><b>호스트 파이프</b> 모드로 작동할 때는 직렬 포트의 파이프 경로를 표시하고, <b>호스트 장치</b> 모드로 작동할 때는 호스트의 직렬 장치 이름을 표시합니다.</translation>
+ <translation type="obsolete"><b>호스트 파이프</b> 모드로 작동할 때는 직렬 포트의 파이프 경로를 표시하고, <b>호스트 장치</b> 모드로 작동할 때는 호스트의 직렬 장치 이름을 표시합니다.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>포트/파일 경로(&P):</translation>
+ <translation type="obsolete">포트/파일 경로(&P):</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5911,6 +6221,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>이 직렬 포트의 기본 I/O 포트 주소를 표시합니다. 16진수 숫자<tt>0</tt>부터 <tt>0xFFFF</tt> 사이의 숫자를 사용할 수 있습니다.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6027,11 +6353,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>CD/DVD 장치 추가하기</nobr></translation>
+ <translation type="obsolete"><nobr>CD/DVD 장치 추가하기</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>플로피 장치 추가하기</nobr></translation>
+ <translation type="obsolete"><nobr>플로피 장치 추가하기</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -6075,11 +6401,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>CD/DVD 장치 추가하기</translation>
+ <translation type="obsolete">CD/DVD 장치 추가하기</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>플로피 장치 추가하기</translation>
+ <translation type="obsolete">플로피 장치 추가하기</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6267,15 +6593,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD 드라이브(&D):</translation>
+ <translation type="obsolete">CD/DVD 드라이브(&D):</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>가상 CD/DVD 디스크나 가상 드라이브처럼 사용할 실제 드라이브를 선택하십시오. 가상 머신은 드라이브 안에 있는 디스크나 파일에 있는 데이터를 가상 디스크에 있는 데이터처럼 처리합니다.</translation>
+ <translation type="obsolete">가상 CD/DVD 디스크나 가상 드라이브처럼 사용할 실제 드라이브를 선택하십시오. 가상 머신은 드라이브 안에 있는 디스크나 파일에 있는 데이터를 가상 디스크에 있는 데이터처럼 처리합니다.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>가상 CD/DVD 드라이브 설정</translation>
+ <translation type="obsolete">가상 CD/DVD 드라이브 설정</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6299,7 +6625,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>가상 CD/DVD 디스크 파일 선택...</translation>
+ <translation type="obsolete">가상 CD/DVD 디스크 파일 선택...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6395,6 +6721,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">가상 광학 디스크 파일 선택...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6821,7 +7179,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>현재 가상 머신에서 USB 2.0을 사용할 수 있으나, <b>%1</b>을(를) 설치해야 합니다. 가상 머신을 시작하려면 VirtualBox 다운로드 사이트에서 확장 기능 패키지를 설치하거나 USB 2.0을 비활성화시키십시오.</translation>
+ <translation type="obsolete">현재 가상 머신에서 USB 2.0을 사용할 수 있으나, <b>%1</b>을(를) 설치해야 합니다. 가상 머신을 시작하려면 VirtualBox 다운로드 사이트에서 확장 기능 패키지를 설치하거나 USB 2.0을 비활성화시키십시오.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
@@ -6843,6 +7201,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7016,6 +7378,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">닫기</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">전환</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7059,7 +7429,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>VirtualBox COM 개체를 만들 수 없습니다.</p><p>프로그램을 종료합니다.</p></translation>
+ <translation type="obsolete"><p>VirtualBox COM 개체를 만들 수 없습니다.</p><p>프로그램을 종료합니다.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7602,7 +7972,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>VirtualBox 새 버전이 출시되었습니다! <a href="http://www.virtualbox.org/">virtualbox.org</a> 웹 사이트에 새 버전 <b>%1</b>이(가) 올라와 있습니다.</p><p>이 링크를 사용해서 새 버전을 다운로드하십시오:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>VirtualBox 새 버전이 출시되었습니다! <a href="http://www.virtualbox.org/">virtualbox.org</a> 웹 사이트에 새 버전 <b>%1</b>이(가) 올라와 있습니다.</p><p>이 링크를 사용해서 새 버전을 다운로드하십시오:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Unable to obtain the new version information due to the following error:</p><p><b>%1</b></p></source>
@@ -7610,7 +7980,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>하나 이상의 등록된 가상 하드 디스크나, CD/DVD 또는 플로피 미디어에 접근할 수 없습니다. 접근할 수 있게 될 때까지 이들 미디어를 사용하는 가상 머신을 작동할 수 없습니다.</p><p><b>검사하기</b> 단추를 눌러서 가상 미디어 관리자를 연 다음 어떤 미디어에 접근할 수 없는가 확인하거나, <b>무시</b> 단추를 눌러서 이 메시지를 무시할 수 있습니다.</p></translation>
+ <translation type="obsolete"><p>하나 이상의 등록된 가상 하드 디스크나, CD/DVD 또는 플로피 미디어에 접근할 수 없습니다. 접근할 수 있게 될 때까지 이들 미디어를 사용하는 가상 머신을 작동할 수 없습니다.</p><p><b>검사하기</b> 단추를 눌러서 가상 미디어 관리자를 연 다음 어떤 미디어에 접근할 수 없는가 확인하거나, <b>무시</b> 단추를 눌러서 이 메시지를 무시할 수 있습니다.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -7641,7 +8011,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>가상 머신을 실행하는 중 치명적 오류가 발생하였고 가상 머신의 실행이 중단되었습니다.</p><p>도움말을 보시려면 <a href="http://www.virtualbox.org">http://www.virtualbox.org</a> 사이트의 커뮤니티 섹션을 참조하거나 지원 업체에 연락하십시오. <nobr><b>%1</b></nobr> 디렉터리에 있는 로그 파일 <tt>VBox.log</tt>와 이미지 파일 <tt>VBox.png</tt>의 내용도 같이 알려 주십시오. 이 파일의 내용은 오류가 발생했을 때 무엇을 하고 있었는지 알려 줍니다. 위 파일들은 주 VirtualBox 창의 <b>머신</b> 메뉴의 <b>로그 보기</b> 항 [...]
+ <translation type="obsolete"><p>가상 머신을 실행하는 중 치명적 오류가 발생하였고 가상 머신의 실행이 중단되었습니다.</p><p>도움말을 보시려면 <a href="http://www.virtualbox.org">http://www.virtualbox.org</a> 사이트의 커뮤니티 섹션을 참조하거나 지원 업체에 연락하십시오. <nobr><b>%1</b></nobr> 디렉터리에 있는 로그 파일 <tt>VBox.log</tt>와 이미지 파일 <tt>VBox.png</tt>의 내용도 같이 알려 주십시오. 이 파일의 내용은 오류가 발생했을 때 무엇을 하고 있었는지 알려 줍니다. 위 파일들은 주 VirtualBox 창의 <b>머신</b> 메뉴의 <b>로 [...]
</message>
<message>
<source>hard disk</source>
@@ -7924,7 +8294,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>이 CD/DVD 장치를 삭제하시겠습니까?</p><p>CD나 ISO 이미지를 마운트할 수도, 게스트 확장을 설치할 수도 없습니다!</p></translation>
+ <translation type="obsolete"><p>이 CD/DVD 장치를 삭제하시겠습니까?</p><p>CD나 ISO 이미지를 마운트할 수도, 게스트 확장을 설치할 수도 없습니다!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8027,7 +8397,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>CD/DVD 드라이브를 컨트롤러 <b>%1</b>에 추가하려고 하고 있습니다.</p><p>드라이브에 삽입할 가상 CD/DVD 디스크를 선택하거나, 나중에 추가하기 위해서 비워 두시겠습니까?</p></translation>
+ <translation type="obsolete"><p>CD/DVD 드라이브를 컨트롤러 <b>%1</b>에 추가하려고 하고 있습니다.</p><p>드라이브에 삽입할 가상 CD/DVD 디스크를 선택하거나, 나중에 추가하기 위해서 비워 두시겠습니까?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8049,11 +8419,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>CD/DVD 장치 <nobr><b>%1</b></nobr>을(를) 가상 머신 <b>%3</b>의 슬롯 <i>%2</i>에서 연결 해제할 수 없습니다.</translation>
+ <translation type="obsolete">CD/DVD 장치 <nobr><b>%1</b></nobr>을(를) 가상 머신 <b>%3</b>의 슬롯 <i>%2</i>에서 연결 해제할 수 없습니다.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>플로피 장치 <nobr><b>%1</b></nobr>을(를) 가상 머신 <b>%3</b>의 슬롯 <i>%2</i>에서 연결 해제할 수 없습니다.</translation>
+ <translation type="obsolete">플로피 장치 <nobr><b>%1</b></nobr>을(를) 가상 머신 <b>%3</b>의 슬롯 <i>%2</i>에서 연결 해제할 수 없습니다.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -8103,11 +8473,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>CD/DVD 장치 <nobr><b>%1</b></nobr>을(를) 가상 머신 <b>%3</b>의 슬롯 <i>%2</i>에 연결할 수 없습니다.</translation>
+ <translation type="obsolete">CD/DVD 장치 <nobr><b>%1</b></nobr>을(를) 가상 머신 <b>%3</b>의 슬롯 <i>%2</i>에 연결할 수 없습니다.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>플로피 장치 <nobr><b>%1</b></nobr>을(를) 가상 머신 <b>%3</b>의 슬롯 <i>%2</i>에 연결할 수 없습니다.</translation>
+ <translation type="obsolete">플로피 장치 <nobr><b>%1</b></nobr>을(를) 가상 머신 <b>%3</b>의 슬롯 <i>%2</i>에 연결할 수 없습니다.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8356,7 +8726,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>데이터를 드롭할 수 없습니다.</translation>
+ <translation type="obsolete">데이터를 드롭할 수 없습니다.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -8591,11 +8961,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p><b>VirtualBox 게스트 확장</b> 디스크 이미지 파일을 <nobr><a href="%1">%1</a></nobr>에서 다운로드했으며 <nobr><b>%2</b></nobr>에 저장했습니다.</p><p>이 디스크 이미지를 등록하고 가상 CD/DVD 드라이브에 마운트하시겠습니까?</p></translation>
+ <translation type="obsolete"><p><b>VirtualBox 게스트 확장</b> 디스크 이미지 파일을 <nobr><a href="%1">%1</a></nobr>에서 다운로드했으며 <nobr><b>%2</b></nobr>에 저장했습니다.</p><p>이 디스크 이미지를 등록하고 가상 CD/DVD 드라이브에 마운트하시겠습니까?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>가상 머신 <b>%1</b>에는 CD/DVD 드라이브가 없기 때문에 <b>VirtualBox 게스트 확장</b> 디스크 이미지를 마운트할 수 없습니다. 가상 머신 설정 대화상자에서 드라이브를 추가해 주십시오.</p></translation>
+ <translation type="obsolete"><p>가상 머신 <b>%1</b>에는 CD/DVD 드라이브가 없기 때문에 <b>VirtualBox 게스트 확장</b> 디스크 이미지를 마운트할 수 없습니다. 가상 머신 설정 대화상자에서 드라이브를 추가해 주십시오.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
@@ -8658,6 +9028,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -9597,13 +10055,17 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>VirtualBox에 오신 것을 환영합니다!</h3><p>이 창의 왼쪽 부분은 컴퓨터에 있는 모든 가상 머신 목록을 표시합니다. 아직 가상 머신을 만들지 않았기 때문에 이 목록은 현재 비어 있습니다.<img src=:/welcome.png align=right/></p><p>새 가상 머신을 만드시려면, 창 위쪽 도구 모음의 <b>새로 만들기</b> 단추를 누르십시오.</p><p><b>%1</b> 키를 누르면 상황에 맞는 도움말을 볼 수 있으며, 최근 정보와 뉴스를 보려면 <a href=http://www.virtualbox.org>www.virtualbox.org</a>를 방문하십시오.</p></translation>
+ <translation type="obsolete"><h3>VirtualBox에 오신 것을 환영합니다!</h3><p>이 창의 왼쪽 부분은 컴퓨터에 있는 모든 가상 머신 목록을 표시합니다. 아직 가상 머신을 만들지 않았기 때문에 이 목록은 현재 비어 있습니다.<img src=:/welcome.png align=right/></p><p>새 가상 머신을 만드시려면, 창 위쪽 도구 모음의 <b>새로 만들기</b> 단추를 누르십시오.</p><p><b>%1</b> 키를 누르면 상황에 맞는 도움말을 볼 수 있으며, 최근 정보와 뉴스를 보려면 <a href=http://www.virtualbox.org>www.virtualbox.org</a>를 방문하십시오.</p></translation>
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>관리자</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9636,7 +10098,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Settings</source>
- <translation>설정</translation>
+ <translation type="obsolete">설정</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -9689,6 +10151,10 @@ p, li { white-space: pre-wrap; }
<source>Display</source>
<translation>디스플레이</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -9764,6 +10230,25 @@ p, li { white-space: pre-wrap; }
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">%1 칩셋이 지원하는 개수 이상의 저장소 컨트롤러를 사용하고 있습니다. 시스템 설정 페이지에서 칩셋 종류를 바꾸거나 저장소 설정 페이지의 다음 저장소 컨트롤러의 개수를 줄이십시오: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">설정</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -9778,6 +10263,10 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">닫기</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10102,7 +10591,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>드래그 앤 드롭 모드</translation>
+ <translation type="obsolete">드래그 앤 드롭 모드</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -10116,6 +10605,10 @@ p, li { white-space: pre-wrap; }
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11975,7 +12468,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12769,17 +13262,17 @@ p, li { white-space: pre-wrap; }
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>이 하드 디스크를 추가하면 차이만 기록하는 새 하드 디스크를 추가할 것입니다.</translation>
+ <translation type="obsolete">이 하드 디스크를 추가하면 차이만 기록하는 새 하드 디스크를 추가할 것입니다.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>이 하드 디스크의 미디어 중 일부에 접근할 수 없습니다. 가상 미디어 관리자의 <b>변경 사항을 저장하는 하드 디스크 보이기</b> 모드를 사용하셔서 이 미디어를 찾아 보십시오.</translation>
+ <translation type="obsolete">이 하드 디스크의 미디어 중 일부에 접근할 수 없습니다. 가상 미디어 관리자의 <b>변경 사항을 저장하는 하드 디스크 보이기</b> 모드를 사용하셔서 이 미디어를 찾아 보십시오.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>이 기본 하드 디스크는 다음 변경 사항만 기록하는 하드 디스크를 통해서 간접적으로 추가되어 있습니다:</translation>
+ <translation type="obsolete">이 기본 하드 디스크는 다음 변경 사항만 기록하는 하드 디스크를 통해서 간접적으로 추가되어 있습니다:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -12819,7 +13312,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -13381,12 +13874,12 @@ p, li { white-space: pre-wrap; }
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>사용함</translation>
+ <translation type="obsolete">사용함</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>사용 안함</translation>
+ <translation type="obsolete">사용 안함</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -13496,6 +13989,105 @@ p, li { white-space: pre-wrap; }
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">활성화됨</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">활성화됨</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">활성화됨</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13802,6 +14394,10 @@ p, li { white-space: pre-wrap; }
<source>Create a new virtual hard drive</source>
<translation type="obsolete">새 가상 하드 드라이브 만들기</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
index bce87f3..ba0b6e6 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts
@@ -239,11 +239,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Uždrausti &pelės integravimą</translation>
+ <translation type="obsolete">Uždrausti &pelės integravimą</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Laikinai uždrausti kompiuterio pelės žymeklio integravimą</translation>
+ <translation type="obsolete">Laikinai uždrausti kompiuterio pelės žymeklio integravimą</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -255,11 +255,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Su&rinkti Vald+Alt+Šalinti</translation>
+ <translation type="obsolete">Su&rinkti Vald+Alt+Šalinti</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Mašinai nusiųsti klavišų kombinaciją Vald(Ctrl)+Alt+Šalinti(Delete)</translation>
+ <translation type="obsolete">Mašinai nusiųsti klavišų kombinaciją Vald(Ctrl)+Alt+Šalinti(Delete)</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -267,7 +267,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Mašinai nusiųsti klavišų kombinaciją Vald(Ctrl)+Alt+Naikinti(Backspace)</translation>
+ <translation type="obsolete">Mašinai nusiųsti klavišų kombinaciją Vald(Ctrl)+Alt+Naikinti(Backspace)</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -339,15 +339,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD įtaisai</translation>
+ <translation type="obsolete">&CD/DVD įtaisai</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Diskeliai</translation>
+ <translation type="obsolete">&Diskeliai</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB įtaisai</translation>
+ <translation type="obsolete">&USB įtaisai</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -465,15 +465,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Pereiti į darbą &visame ekrane</translation>
+ <translation type="obsolete">Pereiti į darbą &visame ekrane</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Pereiti į įprastą arba viso ekrano veikseną</translation>
+ <translation type="obsolete">Pereiti į įprastą arba viso ekrano veikseną</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Pereiti į &integruotą veikseną</translation>
+ <translation type="obsolete">Pereiti į &integruotą veikseną</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -481,7 +481,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Pereiti į &keičiamo lango dydžio veikseną</translation>
+ <translation type="obsolete">Pereiti į &keičiamo lango dydžio veikseną</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -702,7 +702,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished">Į&terpti Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">Į&terpti Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>Sort List</source>
@@ -893,10 +893,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -933,11 +929,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Logging...</source>
- <comment>debug action</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Popup Menu</source>
<translation type="unfinished"></translation>
</message>
@@ -1062,6 +1053,99 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Rinkmena</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Seam&less Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1075,6 +1159,27 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1938,6 +2043,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Appliance Export Wizard</source>
@@ -2375,11 +2507,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Neprijungta</translation>
@@ -2608,6 +2735,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB valdiklis</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">Įgalinta</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3004,18 +3186,6 @@
<translation>Rodo kelią iki bibliotekos, kuri pateikia nuotolinio ekrano (VRDP) klientų atpažinimo funkciją.</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4267,12 +4437,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Rodo CD/DVD įtaisų aktyvumą:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Rodo CD/DVD įtaisų aktyvumą:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Rodo diskelių įtaisų aktyvumą:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Rodo diskelių įtaisų aktyvumą:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4363,6 +4533,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4672,10 +4852,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4727,43 +4903,35 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Maža įrankinė:</translation>
+ <translation type="obsolete">Maža įrankinė:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Jei pažymėta, viso ekrano ir integruoto darbo veiksenose bus rodoma maža įrankinė.</translation>
+ <translation type="obsolete">Jei pažymėta, viso ekrano ir integruoto darbo veiksenose bus rodoma maža įrankinė.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Rodyti viso &ekrano/integravimo veiksenoje</translation>
+ <translation type="obsolete">Rodyti viso &ekrano/integravimo veiksenoje</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Jei pažymėta, maža įrankinė bus rodoma ekrano viršuje, o ne apačioje.</translation>
+ <translation type="obsolete">Jei pažymėta, maža įrankinė bus rodoma ekrano viršuje, o ne apačioje.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Rodyti &virš kitų langų</translation>
+ <translation type="obsolete">Rodyti &virš kitų langų</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4861,6 +5029,126 @@
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Maža įrankinė:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Jei pažymėta, viso ekrano ir integruoto darbo veiksenose bus rodoma maža įrankinė.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Rodyti viso &ekrano/integravimo veiksenoje</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Jei pažymėta, maža įrankinė bus rodoma ekrano viršuje, o ne apačioje.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Rodyti &virš kitų langų</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5298,25 +5586,41 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Pažymėjus, virtuali mašina pasileisdama sukurs kanalą, nurodytą laukelyje <b>Prievado kelias</b>. Priešingu atveju, virtuali mašina manys, kad kanalas jau yra ir mėgins jį naudoti.</translation>
+ <translation type="obsolete">Pažymėjus, virtuali mašina pasileisdama sukurs kanalą, nurodytą laukelyje <b>Prievado kelias</b>. Priešingu atveju, virtuali mašina manys, kad kanalas jau yra ir mėgins jį naudoti.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>Sukurti &kanalą</translation>
+ <translation type="obsolete">Sukurti &kanalą</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Prievado/rinkmenos kelias:</translation>
+ <translation type="obsolete">&Prievado/rinkmenos kelias:</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Rodo kelią iki nuosekliojo prievado kanalo pagrindiniame kompiuteryje, kai dirbama <b>Pagrindinio kompiuterio kanalo</b> veiksenoje, arba pagrindinio kompiuterio nuosekliojo įtaiso vardą, kai dirbama <b>Pagrindinio kompiuterio įtaiso</b> veiksenoje.</translation>
+ <translation type="obsolete">Rodo kelią iki nuosekliojo prievado kanalo pagrindiniame kompiuteryje, kai dirbama <b>Pagrindinio kompiuterio kanalo</b> veiksenoje, arba pagrindinio kompiuterio nuosekliojo įtaiso vardą, kai dirbama <b>Pagrindinio kompiuterio įtaiso</b> veiksenoje.</translation>
</message>
<message>
<source>Port %1</source>
<comment>serial ports</comment>
<translation>%1 prievadas</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5461,11 +5765,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Pridėti CD/DVD įtaisą</nobr></translation>
+ <translation type="obsolete"><nobr>Pridėti CD/DVD įtaisą</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Pridėti diskelių įtaisą</nobr></translation>
+ <translation type="obsolete"><nobr>Pridėti diskelių įtaisą</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -5513,11 +5817,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Pridėti CD/DVD įtaisą</translation>
+ <translation type="obsolete">Pridėti CD/DVD įtaisą</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Pridėti diskelių įtaisą</translation>
+ <translation type="obsolete">Pridėti diskelių įtaisą</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5573,15 +5877,15 @@
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&CD/DVD įtaisas:</translation>
+ <translation type="obsolete">&CD/DVD įtaisas:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Pasirinkite virtualų CD/DVD diską arba fizinį įtaisą, kurį naudosite kaip virtualų įtaisą. Virtuali mašina matys atitinkmai arba į įtaisą įdėtą diską su rinkmenoje esančiais duomenis, arba diską fiziniame įtaise su jo duomenimis.</translation>
+ <translation type="obsolete">Pasirinkite virtualų CD/DVD diską arba fizinį įtaisą, kurį naudosite kaip virtualų įtaisą. Virtuali mašina matys atitinkmai arba į įtaisą įdėtą diską su rinkmenoje esančiais duomenis, arba diską fiziniame įtaise su jo duomenimis.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Įrengti virtualų CD/DVD įtaisą</translation>
+ <translation type="obsolete">Įrengti virtualų CD/DVD įtaisą</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -5605,7 +5909,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Pasirinkti virtualaus CD/DVD disko rinkmeną...</translation>
+ <translation type="obsolete">Pasirinkti virtualaus CD/DVD disko rinkmeną...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -5701,6 +6005,38 @@
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6085,10 +6421,6 @@
<translation type="obsolete">Šioje virtualioje mašinoje įgalintas USB 2.0. Tačiau tam turi įdiegtas <b>%1</b>. Įdiegike papildinių paketą, kurį rasite VirtualBox svetainėje. Tuomet vėl galėsite įgalite USB 2.0. Iki tol ši funkcija bus uždrausta, nebent atsisakysite dabartinių nuostatų pakeitimų.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6108,6 +6440,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6281,6 +6617,14 @@
<source>Close</source>
<translation type="unfinished">Užverti</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Perjungti</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6330,7 +6674,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Nepavyko sukurti VirtualBox COM objekto.</p><p>Programa netrukus išsijungs.</p></translation>
+ <translation type="obsolete"><p>Nepavyko sukurti VirtualBox COM objekto.</p><p>Programa netrukus išsijungs.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -6769,7 +7113,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Pasirodė nauja VirtualBox versija! Versija <b>%1</b> pasiekiama <a href="http://www.virtualbox.org/">virtualbox.org</a> svetainėje.</p><p>Šią versiją galite atsisiųsti spustelėję šią nuorodą: </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Pasirodė nauja VirtualBox versija! Versija <b>%1</b> pasiekiama <a href="http://www.virtualbox.org/">virtualbox.org</a> svetainėje.</p><p>Šią versiją galite atsisiųsti spustelėję šią nuorodą: </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6853,11 +7197,11 @@
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Vienas ar keli virtualūs standieji diskai, CD/DVD ar diskelių įtaisai nebepasiekiami. Todėl negalėsite naudotis tomis virtualiomis mašinomis, kurios naudoja tas laikmenas tol, kol jos nebus pasiekiamos.</p><p>Norėdami atverti virtualių laikmenų tvarkytuvę ir pamatyti tas laikmenas, spauskite <b>Tikrinti</b>, o norėdami nekreipti dėmesio į šį pranešimą, spauskite <b>Nepaisyti</b>.</p></translation>
+ <translation type="obsolete"><p>Vienas ar keli virtualūs standieji diskai, CD/DVD ar diskelių įtaisai nebepasiekiami. Todėl negalėsite naudotis tomis virtualiomis mašinomis, kurios naudoja tas laikmenas tol, kol jos nebus pasiekiamos.</p><p>Norėdami atverti virtualių laikmenų tvarkytuvę ir pamatyti tas laikmenas, spauskite <b>Tikrinti</b>, o norėdami nekreipti dėmesio į šį pranešimą, spauskite <b>Nepaisyti</b>.</p></translation>
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Virtualios mašinos veikimo metu įvyko kritinė klaida, tad mašina sustojo.</p><p>Norėdami gauti pagalbos, žiūrėkite „Bendruomenės“ (angl. „Community“) skyrių <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> svetainėje arba palaikymo kontrakte. Prašom pateikti <tt>VBox.log</tt> žurnalo rinkmenos turinį ir <tt>VBox.png</tt> paveiksliuką, kuriuos galite rasti <nobr><b>%1</b></no [...]
+ <translation type="obsolete"><p>Virtualios mašinos veikimo metu įvyko kritinė klaida, tad mašina sustojo.</p><p>Norėdami gauti pagalbos, žiūrėkite „Bendruomenės“ (angl. „Community“) skyrių <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> svetainėje arba palaikymo kontrakte. Prašom pateikti <tt>VBox.log</tt> žurnalo rinkmenos turinį ir <tt>VBox.png</tt> paveiksliuką, kuriuos galite rasti <nobr><b>%1& [...]
</message>
<message>
<source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
@@ -7113,7 +7457,7 @@
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Tikrai pašalinti CD/DVD įtaisą?</p><p>Jei taip, negalėsite prijungti jokio CD ar ISO atvaizdžio, negalėsite įdiegti svečio papildinių!</p></translation>
+ <translation type="obsolete"><p>Tikrai pašalinti CD/DVD įtaisą?</p><p>Jei taip, negalėsite prijungti jokio CD ar ISO atvaizdžio, negalėsite įdiegti svečio papildinių!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -7272,7 +7616,7 @@
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Ketinate prie <b>%1</b> valdiklio pridėti naują CD/DVD įtaisą.</p><p>Ar norėtumėte tuo pačiu pasirinkti virtualų CD/DVD diską ir jį įdėti į įtaisą, ar šiuo metu įtaisą palikti tuščią?</p></translation>
+ <translation type="obsolete"><p>Ketinate prie <b>%1</b> valdiklio pridėti naują CD/DVD įtaisą.</p><p>Ar norėtumėte tuo pačiu pasirinkti virtualų CD/DVD diską ir jį įdėti į įtaisą, ar šiuo metu įtaisą palikti tuščią?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -7299,11 +7643,11 @@
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nepavyko atjungti CD/DVD įtaiso (<nobr><b>%1</b></nobr>) nuo <i>%2</i> lizdo mašinoje <b>%3</b>.</translation>
+ <translation type="obsolete">Nepavyko atjungti CD/DVD įtaiso (<nobr><b>%1</b></nobr>) nuo <i>%2</i> lizdo mašinoje <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nepavyko atjungti diskelio įtaiso (<nobr><b>%1</b></nobr>) nuo <i>%2</i> lizdo mašinoje <b>%3</b>.</translation>
+ <translation type="obsolete">Nepavyko atjungti diskelio įtaiso (<nobr><b>%1</b></nobr>) nuo <i>%2</i> lizdo mašinoje <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -7442,11 +7786,11 @@
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nepavyko priskirti CD/DVD įtaiso (<nobr><b>%1</b></nobr>) prie <i>%2</i> lizdo <b>%3</b> mašinoje.</translation>
+ <translation type="obsolete">Nepavyko priskirti CD/DVD įtaiso (<nobr><b>%1</b></nobr>) prie <i>%2</i> lizdo <b>%3</b> mašinoje.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Nepavyko priskirti diskelio įtaiso (<nobr><b>%1</b></nobr>) prie <i>%2</i> lizdo <b>%3</b> mašinoje.</translation>
+ <translation type="obsolete">Nepavyko priskirti diskelio įtaiso (<nobr><b>%1</b></nobr>) prie <i>%2</i> lizdo <b>%3</b> mašinoje.</translation>
</message>
<message>
<source>Result Code: </source>
@@ -7702,10 +8046,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7935,14 +8275,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8003,6 +8335,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8770,13 +9190,17 @@
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Jus sveikina VirtualBox!</h3><p>Kairėje lango pusėje pateikiamas visų Jūsų virtualių mašinų sąrašas. Kol kas šis sąrašas tuščias, kadangi dar nesukūrėte nei vienos virtualios mašinos.<img src=:/welcome.png align=right/></p><p>Norėdami sukurti naują VM, spauskite mygtuką <b>Nauja</b>, kuris yra pagrindinėje įrankių juostoje lango viršuje.</p><p>Trumpą pagalbą gausite nuspaudę <b>%1 [...]
+ <translation type="obsolete"><h3>Jus sveikina VirtualBox!</h3><p>Kairėje lango pusėje pateikiamas visų Jūsų virtualių mašinų sąrašas. Kol kas šis sąrašas tuščias, kadangi dar nesukūrėte nei vienos virtualios mašinos.<img src=:/welcome.png align=right/></p><p>Norėdami sukurti naują VM, spauskite mygtuką <b>Nauja</b>, kuris yra pagrindinėje įrankių juostoje lango viršuje.</p><p>Trumpą pagalbą gausite nuspaudę <b>%1&l [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished">Tvarkyklė</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8809,7 +9233,7 @@
</message>
<message>
<source>Settings</source>
- <translation>Nuostatos</translation>
+ <translation type="obsolete">Nuostatos</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -8862,6 +9286,10 @@
<source>Display</source>
<translation type="unfinished">Ekranas</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8937,6 +9365,25 @@
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">naudojate daugiau laikmenų valdiklių nei palaiko %1 lustų rinkinys. Todėl arba pakeiskite lustų rinkinio tipą sistemos nuostatose, arba sumažinkite laikmenų valdiklių skaičių laikmenų nuostatose: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Nuostatos</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -8951,6 +9398,10 @@
<source>Close</source>
<translation type="unfinished">Užverti</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -9247,10 +9698,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -9262,6 +9709,10 @@
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11738,7 +12189,7 @@ IPv6.</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Su šiuo standžiuoju disku bus dirbama ne tiesiogiai, o naudojant naujai sukurtą standžiojo disko vedinį.</translation>
+ <translation type="obsolete">Su šiuo standžiuoju disku bus dirbama ne tiesiogiai, o naudojant naujai sukurtą standžiojo disko vedinį.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
@@ -11749,7 +12200,7 @@ IPv6.</translation>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Šis pagrindinis standusis diskas prijungtas ne tiesiogiai, o naudojant šį jo vedinį:</translation>
+ <translation type="obsolete">Šis pagrindinis standusis diskas prijungtas ne tiesiogiai, o naudojant šį jo vedinį:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -11801,7 +12252,7 @@ IPv6.</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -11948,7 +12399,7 @@ IPv6.</translation>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Kai kurių laikmenų neavyksta rasti standžiajame diske. Tas laimenas pamatysite, jei virtualių laikmenų tvarkytuvėje pasirinksite <b>rodyti diskų vedinius</b>.</translation>
+ <translation type="obsolete">Kai kurių laikmenų neavyksta rasti standžiajame diske. Tas laimenas pamatysite, jei virtualių laikmenų tvarkytuvėje pasirinksite <b>rodyti diskų vedinius</b>.</translation>
</message>
<message>
<source>Enabled</source>
@@ -12430,7 +12881,7 @@ IPv6.</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -13171,12 +13622,7 @@ IPv6.</translation>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Įgalinta</translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Įgalinta</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -13281,6 +13727,105 @@ IPv6.</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Aktyvus</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Aktyvus</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Aktyvus</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13596,6 +14141,10 @@ IPv6.</translation>
<source>C&lose</source>
<translation type="obsolete">&Užverti</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
index c1ea779..7e35d1b 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts
@@ -224,19 +224,19 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>&Muis-integratie uitschakelen</translation>
+ <translation type="obsolete">&Muis-integratie uitschakelen</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Tijdelijk de integratie van muis met host uitschakelen</translation>
+ <translation type="obsolete">Tijdelijk de integratie van muis met host uitschakelen</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Invoegen Ctrl+Alt+Del</translation>
+ <translation type="obsolete">&Invoegen Ctrl+Alt+Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Stuur Ctrl+Alt+Del-combinatie naar de virtuele machine</translation>
+ <translation type="obsolete">Stuur Ctrl+Alt+Del-combinatie naar de virtuele machine</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -244,7 +244,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Stuur Ctrl+Alt+Backspace-combinatie naar de virtuele machine</translation>
+ <translation type="obsolete">Stuur Ctrl+Alt+Backspace-combinatie naar de virtuele machine</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -300,15 +300,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD-apparaten</translation>
+ <translation type="obsolete">&CD/DVD-apparaten</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Diskette-apparaten</translation>
+ <translation type="obsolete">&Diskette-apparaten</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB-apparaten</translation>
+ <translation type="obsolete">&USB-apparaten</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -376,15 +376,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Schakel over op Scherm&vullend</translation>
+ <translation type="obsolete">Schakel over op Scherm&vullend</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Schakel tussen Normale en Schermvullende modus</translation>
+ <translation type="obsolete">Schakel tussen Normale en Schermvullende modus</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Schakel over op Naad&loze modus</translation>
+ <translation type="obsolete">Schakel over op Naad&loze modus</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -392,7 +392,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Schakel over op &Schaalmodus</translation>
+ <translation type="obsolete">Schakel over op &Schaalmodus</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -472,7 +472,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Invo&egen Ctrl+Alt+Backspace</translation>
+ <translation type="obsolete">Invo&egen Ctrl+Alt+Backspace</translation>
</message>
<message>
<source>&File</source>
@@ -769,7 +769,7 @@
<message>
<source>Drag'n'Drop</source>
<translatorcomment>Zoals bij Mozillavertalingen</translatorcomment>
- <translation>Slepen naar</translation>
+ <translation type="obsolete">Slepen naar</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -814,7 +814,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>&Loggen...</translation>
+ <translation type="obsolete">&Loggen...</translation>
</message>
<message>
<source>Popup Menu</source>
@@ -941,6 +941,99 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Bestand</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Seam&less Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -954,6 +1047,11 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -963,6 +1061,21 @@
</message>
</context>
<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIApplianceEditorWidget</name>
<message>
<source>Virtual System %1</source>
@@ -1799,6 +1912,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Appliance Export Wizard</source>
@@ -2158,7 +2297,7 @@
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2384,6 +2523,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB-controller</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">Ingeschakeld</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">Uitgeschakeld</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2753,15 +2947,15 @@
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>&Dock en menubalk:</translation>
+ <translation type="obsolete">&Dock en menubalk:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>Automatisch tonen bij schermvullend</translation>
+ <translation type="obsolete">Automatisch tonen bij schermvullend</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>Als dit is ingesteld wordt hostdock en menubalk getoond als de virtuele machine in schermvullende modus is.</translation>
+ <translation type="obsolete">Als dit is ingesteld wordt hostdock en menubalk getoond als de virtuele machine in schermvullende modus is.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -3787,12 +3981,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Geeft activiteit van CD/DVD-apparaten weer:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Geeft activiteit van CD/DVD-apparaten weer:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Geeft activiteit van diskette-apparaten weer:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Geeft activiteit van diskette-apparaten weer:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -3892,6 +4086,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4178,7 +4382,7 @@
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>De virtuele machine is ingesteld om hardwarematige grafische accelleratie te gebruiken en os-hint staat op Windows Vista of later. Voor de beste prestaties moet u het videogeheugen van de machine op ten minste <b>%1</b> zetten.</translation>
+ <translation type="obsolete">De virtuele machine is ingesteld om hardwarematige grafische accelleratie te gebruiken en os-hint staat op Windows Vista of later. Voor de beste prestaties moet u het videogeheugen van de machine op ten minste <b>%1</b> zetten.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -4232,43 +4436,35 @@
<translation>Schakel video-opname in voor scherm %1.</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Miniwerkbalk:</translation>
+ <translation type="obsolete">Miniwerkbalk:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Als dit is ingesteld wordt de miniwerkbalk getoont in schermvullende en naadloze modi.</translation>
+ <translation type="obsolete">Als dit is ingesteld wordt de miniwerkbalk getoont in schermvullende en naadloze modi.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Toon in &Schermvullend/Naadloos</translation>
+ <translation type="obsolete">Toon in &Schermvullend/Naadloos</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Als dit is ingesteld wordt de miniwerkbalk boven in het scherm weergegeven in plaats van de standaardpositie onder aan het scherm.</translation>
+ <translation type="obsolete">Als dit is ingesteld wordt de miniwerkbalk boven in het scherm weergegeven in plaats van de standaardpositie onder aan het scherm.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Geef &boven in het scherm weer</translation>
+ <translation type="obsolete">Geef &boven in het scherm weer</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4366,6 +4562,126 @@
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation>De systeemhint voor deze virtuele machine is gezet op een 64-bittype. 64-bit Gastsystemen vereisen hardwarevirtualisatie. Hardwarevirtualisatie zal automatisch worden ingeschakeld op het moment dat u de verandering bevestigd.</translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Miniwerkbalk:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Als dit is ingesteld wordt de miniwerkbalk getoont in schermvullende en naadloze modi.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Toon in &Schermvullend/Naadloos</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Als dit is ingesteld wordt de miniwerkbalk boven in het scherm weergegeven in plaats van de standaardpositie onder aan het scherm.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Geef &boven in het scherm weer</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -4809,19 +5125,19 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Als dit is ingesteld zal de pijp gespecificeerd in het <b>Poort/bestandspad</b>-veld door de virtuele machine worden aangemaakt zodra deze opstart. Niet aangevinkt zal de virtuele machine een bestaande pijp proberen te gebruiken.</translation>
+ <translation type="obsolete">Als dit is ingesteld zal de pijp gespecificeerd in het <b>Poort/bestandspad</b>-veld door de virtuele machine worden aangemaakt zodra deze opstart. Niet aangevinkt zal de virtuele machine een bestaande pijp proberen te gebruiken.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>Maak &pijp aan</translation>
+ <translation type="obsolete">Maak &pijp aan</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Toont het pad naar de seriële poort op de host indien de poort in <b>Host pijp</b>-modus werkt; en de naam van het host seriële-apparaat als de poort in <b>Host apparaat</b>-modus werkt.</translation>
+ <translation type="obsolete">Toont het pad naar de seriële poort op de host indien de poort in <b>Host pijp</b>-modus werkt; en de naam van het host seriële-apparaat als de poort in <b>Host apparaat</b>-modus werkt.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Poort/bestandspad:</translation>
+ <translation type="obsolete">&Poort/bestandspad:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -4831,6 +5147,22 @@
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Geeft het basis I/O poortadres van deze seriële poort weer. Geldige waarden zijn gehele getallen in de reeks van <tt>0</tt> tot <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -4883,11 +5215,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Voeg CD/DVD-speler toe</nobr></translation>
+ <translation type="obsolete"><nobr>Voeg CD/DVD-speler toe</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Voeg diskettestation toe</nobr></translation>
+ <translation type="obsolete"><nobr>Voeg diskettestation toe</nobr></translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -4927,11 +5259,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Voeg CD/DVD-speler toe</translation>
+ <translation type="obsolete">Voeg CD/DVD-speler toe</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Voeg diskettestation toe</translation>
+ <translation type="obsolete">Voeg diskettestation toe</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5086,15 +5418,15 @@
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD-&station:</translation>
+ <translation type="obsolete">CD/DVD-&station:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Kies een virtuele CD/DVD-schijf of een fysiek station om met het virtuele station te gebruiken. De virtuele machine zal een schijf ingebracht in het station, met de gegevens in het bestand of op de schijf in het fysieke station, beschouwen als haar inhoud.</translation>
+ <translation type="obsolete">Kies een virtuele CD/DVD-schijf of een fysiek station om met het virtuele station te gebruiken. De virtuele machine zal een schijf ingebracht in het station, met de gegevens in het bestand of op de schijf in het fysieke station, beschouwen als haar inhoud.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Zet een virtuele CD/DVD-station op</translation>
+ <translation type="obsolete">Zet een virtuele CD/DVD-station op</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -5118,7 +5450,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Kies een virtuele CD/DVD-schijfbestand...</translation>
+ <translation type="obsolete">Kies een virtuele CD/DVD-schijfbestand...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -5219,6 +5551,38 @@
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Kies een virtuele optische schijf bestand...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -5623,7 +5987,7 @@
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>USB 2.0 is momenteel voor deze virtuele machine ingeschakeld. Dit vereist echter dat <b>%1</b> is geïnstalleerd. Installeer het Extention Pack van de VirtualBox-downloadsite of schakel USB 2.0 uit waardoor de machine kan opstarten.</translation>
+ <translation type="obsolete">USB 2.0 is momenteel voor deze virtuele machine ingeschakeld. Dit vereist echter dat <b>%1</b> is geïnstalleerd. Installeer het Extention Pack van de VirtualBox-downloadsite of schakel USB 2.0 uit waardoor de machine kan opstarten.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
@@ -5645,6 +6009,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -5820,6 +6188,14 @@
<source>Close</source>
<translation type="unfinished">Sluiten</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -5871,7 +6247,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Het is niet gelukt het VirtualBox COM-object aan te maken.</p><p>Het programma wordt nu afgesloten.</p></translation>
+ <translation type="obsolete"><p>Het is niet gelukt het VirtualBox COM-object aan te maken.</p><p>Het programma wordt nu afgesloten.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -6252,7 +6628,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Er is een nieuwe versie van VirtualBox vrijgegeven! Versie <b>%1</b> is beschikbaar bij <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>U kunt deze versie direct downloaden via deze link:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Er is een nieuwe versie van VirtualBox vrijgegeven! Versie <b>%1</b> is beschikbaar bij <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>U kunt deze versie direct downloaden via deze link:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6328,11 +6704,11 @@
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Eén of meer virtuele harde schijven, cd/dvd's of diskettes zijn nu niet te benaderen. U kunt niet met de virtuele machines die deze media gebruiken werken, totdat dit medium of deze media weer benaderbaar zijn.</p><p>Druk op de knop <b>Controleren</b> om de Virtuele Media Manager te openen om na te gaan welk medium niet te benaderen is, of druk op de knop <b>Negeren</b> om dit bericht te negeren.</p></translation>
+ <translation type="obsolete"><p>Eén of meer virtuele harde schijven, cd/dvd's of diskettes zijn nu niet te benaderen. U kunt niet met de virtuele machines die deze media gebruiken werken, totdat dit medium of deze media weer benaderbaar zijn.</p><p>Druk op de knop <b>Controleren</b> om de Virtuele Media Manager te openen om na te gaan welk medium niet te benaderen is, of druk op de knop <b>Negeren</b> om dit bericht te negeren.</p [...]
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Een fatale fout is opgetreden terwijl de virtuele machine draaide. De machine is nu gestopt.</p><p>Kijk voor ondersteuning op de community sectie van <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> of raadpleeg uw eigen ondersteuningscontact. Stel alstublieft de inhoud van het logbestand <tt>VBox.log</tt> en het imagebestand <tt>VBox.png</tt> ter beschikking. Deze kunt u terugvinden in de <no [...]
+ <translation type="obsolete"><p>Een fatale fout is opgetreden terwijl de virtuele machine draaide. De machine is nu gestopt.</p><p>Kijk voor ondersteuning op de community sectie van <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> of raadpleeg uw eigen ondersteuningscontact. Stel alstublieft de inhoud van het logbestand <tt>VBox.log</tt> en het imagebestand <tt>VBox.png</tt> ter beschikking. Deze kunt u terugvin [...]
</message>
<message>
<source>You are trying to shut down the guest with the ACPI power button. This is currently not possible because the guest does not support software shutdown.</source>
@@ -6495,7 +6871,7 @@
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Weet u zeker dat u het cd/dvd-apparaat wilt verwijderen?</p><p>Het is daarna niet meer mogelijk om CD's of ISO-images te koppelen of de Guest Additions te installeren.</p></translation>
+ <translation type="obsolete"><p>Weet u zeker dat u het cd/dvd-apparaat wilt verwijderen?</p><p>Het is daarna niet meer mogelijk om CD's of ISO-images te koppelen of de Guest Additions te installeren.</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -6598,7 +6974,7 @@
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>U staat op het punt een nieuw CD/DVD-station aan controller <b>%1</b> toe te voegen.</p><p>Wilt u een virtuele CD/DVD-schijf in het station plaatsen of voorlopig leeg laten?</p></translation>
+ <translation type="obsolete"><p>U staat op het punt een nieuw CD/DVD-station aan controller <b>%1</b> toe te voegen.</p><p>Wilt u een virtuele CD/DVD-schijf in het station plaatsen of voorlopig leeg laten?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -6620,11 +6996,11 @@
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Het is niet gelukt CD/DVD-station <nobr><b>%1</b></nobr> los te koppelen van het slot <i>%2</i> van virtuele machine <b>%3</b>.</translation>
+ <translation type="obsolete">Het is niet gelukt CD/DVD-station <nobr><b>%1</b></nobr> los te koppelen van het slot <i>%2</i> van virtuele machine <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Het is niet gelukt diskettestation <nobr><b>%1</b></nobr> los te koppelen van het slot <i>%2</i> van virtuele machine <b>%3</b>.</translation>
+ <translation type="obsolete">Het is niet gelukt diskettestation <nobr><b>%1</b></nobr> los te koppelen van het slot <i>%2</i> van virtuele machine <b>%3</b>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
@@ -6669,11 +7045,11 @@
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Het is niet gelukt CD/DVD-station <nobr><b>%1</b></nobr> te koppelen aan het slot <i>%2</i> van de machine <b>%3</b>.</translation>
+ <translation type="obsolete">Het is niet gelukt CD/DVD-station <nobr><b>%1</b></nobr> te koppelen aan het slot <i>%2</i> van de machine <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Het is niet gelukt diskettestation <nobr><b>%1</b></nobr> te koppelen aan het slot <i>%2</i> van de machine <b>%3</b>.</translation>
+ <translation type="obsolete">Het is niet gelukt diskettestation <nobr><b>%1</b></nobr> te koppelen aan het slot <i>%2</i> van de machine <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -6921,7 +7297,7 @@
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Data droppen is niet gelukt.</translation>
+ <translation type="obsolete">Data droppen is niet gelukt.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -7161,11 +7537,11 @@
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p>Het <b>VirtualBox Guest Additions</b>-schijfimagebestand is met succes gedownload van <nobr><a href="%1">%1</a></nobr> en lokaal opgeslagen als <nobr><b>%2</b></nobr>.</p><p>Wilt u het schijfimagebestand registreren en in het virtuele cd/dvd-station doen?</p></translation>
+ <translation type="obsolete"><p>Het <b>VirtualBox Guest Additions</b>-schijfimagebestand is met succes gedownload van <nobr><a href="%1">%1</a></nobr> en lokaal opgeslagen als <nobr><b>%2</b></nobr>.</p><p>Wilt u het schijfimagebestand registreren en in het virtuele cd/dvd-station doen?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>Kon het <b>VirtualBox Guest Additions</b>-schijfimagebestand niet in de virtuele machine <b>%1</b> doen, omdat de machine geen cd/dvd-station heeft. Voeg een station toe via de pagina Opslag bij Instellingen van de virtuele machine.</p></translation>
+ <translation type="obsolete"><p>Kon het <b>VirtualBox Guest Additions</b>-schijfimagebestand niet in de virtuele machine <b>%1</b> doen, omdat de machine geen cd/dvd-station heeft. Voeg een station toe via de pagina Opslag bij Instellingen van de virtuele machine.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
@@ -7228,6 +7604,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetUserManual</name>
@@ -7834,13 +8298,17 @@
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Welkom bij VirtualBox!</h3><p>Het linker deel van dit venster zal straks alle virtuele machines tonen die op uw computer staan. De lijst is nu leeg omdat u nog geen virtuele machines hebt aangemaakt.<img src=:/welcome.png align=right/></p><p>Om een nieuwe virtuele machine aan te maken klikt u op de knop <b>Nieuw</b> in de werkbalk linksboven in het venster.</p><p>De toets <b>%1</b> opent een [...]
+ <translation type="obsolete"><h3>Welkom bij VirtualBox!</h3><p>Het linker deel van dit venster zal straks alle virtuele machines tonen die op uw computer staan. De lijst is nu leeg omdat u nog geen virtuele machines hebt aangemaakt.<img src=:/welcome.png align=right/></p><p>Om een nieuwe virtuele machine aan te maken klikt u op de knop <b>Nieuw</b> in de werkbalk linksboven in het venster.</p><p>De toets <b>%1</ [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Manager</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -7873,7 +8341,7 @@
</message>
<message>
<source>Settings</source>
- <translation>Instellingen</translation>
+ <translation type="obsolete">Instellingen</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -7926,6 +8394,10 @@
<source>Display</source>
<translation>Beeldscherm</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -7977,6 +8449,25 @@
<source>%1 - %2</source>
<translation>%1 - %2</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Instellingen</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -7991,6 +8482,10 @@
<source>Close</source>
<translation type="unfinished">Sluiten</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -8235,7 +8730,7 @@
<message>
<source>Drag'n'Drop Mode</source>
<translatorcomment>RL: Of 'Slepen-en-Neerzetten' - 't blijft een eeuwige discussie</translatorcomment>
- <translation>Slepen-naar-modus</translation>
+ <translation type="obsolete">Slepen-naar-modus</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -8249,6 +8744,10 @@
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -9302,7 +9801,7 @@
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>cd/dvd</translation>
+ <translation type="obsolete">cd/dvd</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -9995,17 +10494,17 @@
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
<translatorcomment>RL - Definitie: "A differencing disk is a virtual hard disk you use to isolate changes to a virtual hard disk or the guest operating system by storing them in a separate file." Een techterm dus. Niet vertalen.</translatorcomment>
- <translation>Aankoppelen van deze harde schijf wordt indirect uitgevoerd met gebruik van een nieuw aangemaakte differencing harde schijf.</translation>
+ <translation type="obsolete">Aankoppelen van deze harde schijf wordt indirect uitgevoerd met gebruik van een nieuw aangemaakte differencing harde schijf.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Enkele media in deze keten van harde schijven zijn niet te benaderen. Gebruik de Virtuele Media Manager in <b>Geef differencing harde schijven weer</b>-modus om deze media te inspecteren.</translation>
+ <translation type="obsolete">Enkele media in deze keten van harde schijven zijn niet te benaderen. Gebruik de Virtuele Media Manager in <b>Geef differencing harde schijven weer</b>-modus om deze media te inspecteren.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Deze basis harde schijf wordt indirect gekoppeld met gebruik van de volgende differencing harde schijf:</translation>
+ <translation type="obsolete">Deze basis harde schijf wordt indirect gekoppeld met gebruik van de volgende differencing harde schijf:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -10053,7 +10552,7 @@
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -10601,12 +11100,12 @@
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Ingeschakeld</translation>
+ <translation type="obsolete">Ingeschakeld</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Uitgeschakeld</translation>
+ <translation type="obsolete">Uitgeschakeld</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -10716,6 +11215,105 @@
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Actief</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Actief</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Actief</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -10966,6 +11564,10 @@
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Maak een nieuwe virtuele harde schijf aan</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
index 931366e..836b972 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts
@@ -296,7 +296,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">T&ryb zintegrowany</translation>
+ <translation type="unfinished">T&ryb zintegrowany</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -320,11 +320,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Wyłącz &integrację myszy</translation>
+ <translation type="obsolete">Wyłącz &integrację myszy</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Tymczasowo wyłącza integrację kursora myszy gospodarza</translation>
+ <translation type="obsolete">Tymczasowo wyłącza integrację kursora myszy gospodarza</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -336,11 +336,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Wyślij Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&Wyślij Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Wysyła sekwencję Ctrl-Alt-Del do maszyny wirtualnej</translation>
+ <translation type="obsolete">Wysyła sekwencję Ctrl-Alt-Del do maszyny wirtualnej</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -348,7 +348,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Wysyła sekwencję Ctrl-Alt-Backspace do maszyny wirtualnej</translation>
+ <translation type="obsolete">Wysyła sekwencję Ctrl-Alt-Backspace do maszyny wirtualnej</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -420,15 +420,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Płyty &CD/DVD</translation>
+ <translation type="obsolete">Płyty &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>D&yskietki</translation>
+ <translation type="obsolete">D&yskietki</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&Urządzenia USB</translation>
+ <translation type="obsolete">&Urządzenia USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -479,7 +479,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&Logowanie...</translation>
+ <translation type="obsolete">&Logowanie...</translation>
</message>
<message>
<source>&Help</source>
@@ -556,26 +556,10 @@
<translation type="obsolete">Wyłącz &logowanie...</translation>
</message>
<message>
- <source>Switch to &Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch between normal and fullscreen mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch to Seam&less Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and seamless desktop integration mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Switch to &Scaled Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and scaled mode</source>
<translation type="unfinished"></translation>
</message>
@@ -644,10 +628,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">&Plik</translation>
@@ -919,10 +899,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -1087,6 +1063,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Plik</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1100,6 +1165,27 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1737,6 +1823,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2422,11 +2535,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Niepodłączona</translation>
@@ -2645,6 +2753,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Kontroler USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2971,18 +3134,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">&Automatycznie pokazuj Dock oraz pasek menu w trybie pełnoekranowym</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4151,12 +4302,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Wskaźnik aktywności nośników CD/DVD:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Wskaźnik aktywności nośników CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Wskaźnik aktywności dyskietek:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Wskaźnik aktywności dyskietek:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4255,6 +4406,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4556,10 +4717,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4611,43 +4768,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Miniaturowy pasek narzędzi:</translation>
+ <translation type="obsolete">Miniaturowy pasek narzędzi:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Pokazywanie miniaturowego paska narzędzi w trybach pełnoekranowym i zintegrowanym.</translation>
+ <translation type="obsolete">Pokazywanie miniaturowego paska narzędzi w trybach pełnoekranowym i zintegrowanym.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Pokaż w trybie p&ełnoekranowym/zintegrowanym</translation>
+ <translation type="obsolete">Pokaż w trybie p&ełnoekranowym/zintegrowanym</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Pokazywanie miniaturowego paska narzędzi u góry ekranu, zamiast domyślnej pozycji u dołu ekranu.</translation>
+ <translation type="obsolete">Pokazywanie miniaturowego paska narzędzi u góry ekranu, zamiast domyślnej pozycji u dołu ekranu.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Pokaż u &góry ekranu</translation>
+ <translation type="obsolete">Pokaż u &góry ekranu</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4901,6 +5050,126 @@ p, li { white-space: pre-wrap; }
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Miniaturowy pasek narzędzi:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Pokazywanie miniaturowego paska narzędzi w trybach pełnoekranowym i zintegrowanym.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Pokaż w trybie p&ełnoekranowym/zintegrowanym</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Pokazywanie miniaturowego paska narzędzi u góry ekranu, zamiast domyślnej pozycji u dołu ekranu.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Pokaż u &góry ekranu</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5552,11 +5821,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Zaznaczenie tej opcji powoduje, że nazwane łącze wskazane w polu <b>Ścieżka portu</b> zostanie utworzone podczas uruchamiania maszyny wirtualnej. W przeciwnym razie maszyna wirtualna spróbuje użyć istniejącego łącza nazwanego.</translation>
+ <translation type="obsolete">Zaznaczenie tej opcji powoduje, że nazwane łącze wskazane w polu <b>Ścieżka portu</b> zostanie utworzone podczas uruchamiania maszyny wirtualnej. W przeciwnym razie maszyna wirtualna spróbuje użyć istniejącego łącza nazwanego.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Stwórz łącze nazwane</translation>
+ <translation type="obsolete">&Stwórz łącze nazwane</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5564,11 +5833,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Zawiera ścieżkę do łącza nazwanego dla portu szeregowego w systemie gospodarza, jeśli port pracuje w trybie <b>Nazwane łącze w systemie gospodarza</b> lub nazwę sprzętowego portu szeregowego, jeśli port pracuje w trybie <b>Sprzętowy port gospodarza</b>.</translation>
+ <translation type="obsolete">Zawiera ścieżkę do łącza nazwanego dla portu szeregowego w systemie gospodarza, jeśli port pracuje w trybie <b>Nazwane łącze w systemie gospodarza</b> lub nazwę sprzętowego portu szeregowego, jeśli port pracuje w trybie <b>Sprzętowy port gospodarza</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Ś&cieżka portu/pliku:</translation>
+ <translation type="obsolete">Ś&cieżka portu/pliku:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5578,6 +5847,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Zawiera bazowy adres I/O danego portu szeregowego. Poprawne wartości to liczby szesnastkowe od <tt>0</tt> do <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5694,11 +5979,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Dodaj płytę CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Dodaj płytę CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Dodaj stację dyskietek</nobr></translation>
+ <translation type="obsolete"><nobr>Dodaj stację dyskietek</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -5742,11 +6027,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Dodaj płytę CD/DVD</translation>
+ <translation type="obsolete">Dodaj płytę CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Dodaj dyskietkę</translation>
+ <translation type="obsolete">Dodaj dyskietkę</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5933,117 +6218,133 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
+ <source>Floppy &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <source>Choose a virtual floppy disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Set up the virtual CD/DVD drive</source>
+ <source>Set up the virtual floppy drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Floppy &Drive:</source>
+ <source>Create a new hard disk...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual floppy disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <source>Choose a virtual hard disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Set up the virtual floppy drive</source>
+ <source>Remove disk from virtual drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Create a new hard disk...</source>
+ <source>Choose a virtual floppy disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual hard disk file...</source>
+ <source>When checked the virtual disk will not be removed when the guest system ejects it.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
+ <source>&Live CD/DVD</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remove disk from virtual drive</source>
+ <source>When checked the guest system will see the virtual disk as a solid state device.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual floppy disk file...</source>
+ <source>&Solid-state Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the virtual disk will not be removed when the guest system ejects it.</source>
+ <source>Details:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Live CD/DVD</source>
+ <source>at most one supported</source>
+ <comment>controller</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a solid state device.</source>
+ <source>up to %1 supported</source>
+ <comment>controllers</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Port Count:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Controller: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No name is currently specified for the controller at position <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Solid-state Drive</source>
+ <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Details:</source>
+ <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>at most one supported</source>
- <comment>controller</comment>
+ <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>up to %1 supported</source>
- <comment>controllers</comment>
+ <source>Add USB Controller</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Port Count:</source>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Controller: %1</source>
+ <source>Choose a virtual optical disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No name is currently specified for the controller at position <b>%1</b>.</source>
+ <source><nobr>Add Optical Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
+ <source><nobr>Add Floppy Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <source>Add Optical Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <source>Add Floppy Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add USB Controller</source>
+ <source>Optical &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Hot-pluggable</source>
+ <source>Set up the virtual optical drive</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -6422,10 +6723,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"><nobr>Stan: %1</nobr></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6445,6 +6742,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6614,6 +6915,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Zamknij</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Przełącz</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6657,7 +6966,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Nie udało się stworzyć obiektu COM VirtualBox.</p><p>Aplikacja zostanie zamknięta.</p></translation>
+ <translation type="obsolete"><p>Nie udało się stworzyć obiektu COM VirtualBox.</p><p>Aplikacja zostanie zamknięta.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -7269,7 +7578,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Została wydana nowa wersja VirtualBox! Wersja <b>%1</b> jest dostępna na <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Można pobrać tę wersję bezpośrednio spod adresu:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Została wydana nowa wersja VirtualBox! Wersja <b>%1</b> jest dostępna na <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Można pobrać tę wersję bezpośrednio spod adresu:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7369,7 +7678,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Jeden lub więcej z zarejestrowanych wirtualnych twardych dysków, nośników CD/DVD lub dyskietek nie jest w tej chwili dostępny. W wyniku tego nie będzie można używać maszyn wirtualnych korzystających z tych nośników, dopóki dostęp do nich nie zostanie uzyskany ponownie.</p><p>Proszę wcisnąć <b>Sprawdź</b>, aby otworzyć Menedżera nośników wirtualnych i sprawdzić które z nośników są niedostępne lub <b>Ignoruj</b>, aby zignoro [...]
+ <translation type="obsolete"><p>Jeden lub więcej z zarejestrowanych wirtualnych twardych dysków, nośników CD/DVD lub dyskietek nie jest w tej chwili dostępny. W wyniku tego nie będzie można używać maszyn wirtualnych korzystających z tych nośników, dopóki dostęp do nich nie zostanie uzyskany ponownie.</p><p>Proszę wcisnąć <b>Sprawdź</b>, aby otworzyć Menedżera nośników wirtualnych i sprawdzić które z nośników są niedostępne lub <b>Ignoruj</b& [...]
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -7400,7 +7709,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Wystąpił błąd krytyczny podczas pracy maszyny wirtualnej i została ona zatrzymana.</p><p>Pomoc można uzyskać korzystając z forum na stronie <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> (sekcja Community) lub kontaktując się bezpośrednio z nami. Proszę pamiętać, aby do opisu problemu dołączyć zawartość pliku z logiem <tt>VBox.log</tt> oraz plik obrazu <tt>VBox.png</tt>, które można znaleźć w k [...]
+ <translation type="obsolete"><p>Wystąpił błąd krytyczny podczas pracy maszyny wirtualnej i została ona zatrzymana.</p><p>Pomoc można uzyskać korzystając z forum na stronie <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> (sekcja Community) lub kontaktując się bezpośrednio z nami. Proszę pamiętać, aby do opisu problemu dołączyć zawartość pliku z logiem <tt>VBox.log</tt> oraz plik obrazu <tt>VBox.png</tt>, które m [...]
</message>
<message>
<source>hard disk</source>
@@ -7683,7 +7992,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Usunąć napęd CD/DVD?</p><p>Po jego usunięciu nie będzie możliwe montowanie płyt CD, obrazów ISO oraz instalacja Dodatków (Guest Additions)!</p></translation>
+ <translation type="obsolete"><p>Usunąć napęd CD/DVD?</p><p>Po jego usunięciu nie będzie możliwe montowanie płyt CD, obrazów ISO oraz instalacja Dodatków (Guest Additions)!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -7763,10 +8072,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7775,14 +8080,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -7811,14 +8108,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8024,10 +8313,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8257,14 +8542,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8325,6 +8602,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -9310,13 +9675,17 @@ Będzie ona używana przez wszystkie moduły VirtualBox, aby móc rozróżnić t
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Witamy w VirtualBox!</h3><p>Lewa część tego okna przeznaczona jest do wyświetlania listy maszyn wirtualnych dostępnych na tym komputerze. Lista jest teraz pusta, ponieważ nie utworzono jeszcze żadnej maszyny.<img src=:/welcome.png align=right/></p><p>Aby utworzyć nową wirtualną maszynę, proszę wcisnąć przycisk <b>Nowa</b> na głównym pasku narzędziowym, umieszczonym na górze okna.</p><p> [...]
+ <translation type="obsolete"><h3>Witamy w VirtualBox!</h3><p>Lewa część tego okna przeznaczona jest do wyświetlania listy maszyn wirtualnych dostępnych na tym komputerze. Lista jest teraz pusta, ponieważ nie utworzono jeszcze żadnej maszyny.<img src=:/welcome.png align=right/></p><p>Aby utworzyć nową wirtualną maszynę, proszę wcisnąć przycisk <b>Nowa</b> na głównym pasku narzędziowym, umieszczonym na górze okna.</p><p>Mo [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9345,7 +9714,7 @@ Będzie ona używana przez wszystkie moduły VirtualBox, aby móc rozróżnić t
</message>
<message>
<source>Settings</source>
- <translation type="unfinished">Ustawienia</translation>
+ <translation type="obsolete">Ustawienia</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -9398,6 +9767,10 @@ Będzie ona używana przez wszystkie moduły VirtualBox, aby móc rozróżnić t
<source>Display</source>
<translation type="unfinished">Ekran</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -9461,6 +9834,25 @@ Będzie ona używana przez wszystkie moduły VirtualBox, aby móc rozróżnić t
<source>you have enabled a USB HID (Human Interface Device). This will not work unless USB emulation is also enabled. This will be done automatically when you accept the VM Settings by pressing the OK button.</source>
<translation type="obsolete">włączony jest USB HID (Human Interface Device). Nie będzie to działać, chyba że włączona będzie również emulacja USB. Zostanie to wykonane automatycznie po zatwierdzeniu ustawień maszyny wirtualnej przyciskiem OK.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Ustawienia</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -9475,6 +9867,10 @@ Będzie ona używana przez wszystkie moduły VirtualBox, aby móc rozróżnić t
<source>Close</source>
<translation type="unfinished">Zamknij</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -9866,10 +10262,6 @@ Będzie ona używana przez wszystkie moduły VirtualBox, aby móc rozróżnić t
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -9881,6 +10273,10 @@ Będzie ona używana przez wszystkie moduły VirtualBox, aby móc rozróżnić t
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -12232,7 +12628,7 @@ Wersja %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -13106,17 +13502,17 @@ Wersja %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Podłączenie tego dysku twardego zostanie wykonane pośrednio, z użyciem nowo utworzonego różnicowego dysku twardego.</translation>
+ <translation type="obsolete">Podłączenie tego dysku twardego zostanie wykonane pośrednio, z użyciem nowo utworzonego różnicowego dysku twardego.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Niektóre nośniki w tym łańcuchu dysków twardych są niedostępne. Proszę użyć Menedżera nośników wirtualnych w trybie <b>Pokaż różnicowe dyski twarde</b>, aby sprawdzić te nośniki.</translation>
+ <translation type="obsolete">Niektóre nośniki w tym łańcuchu dysków twardych są niedostępne. Proszę użyć Menedżera nośników wirtualnych w trybie <b>Pokaż różnicowe dyski twarde</b>, aby sprawdzić te nośniki.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Ten bazowy dysk twardy jest podłączony pośrednio, z użyciem następujących różnicowych dysków twardych:</translation>
+ <translation type="obsolete">Ten bazowy dysk twardy jest podłączony pośrednio, z użyciem następujących różnicowych dysków twardych:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -13168,7 +13564,7 @@ Wersja %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -13645,16 +14041,6 @@ Wersja %1</translation>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -13752,6 +14138,105 @@ Wersja %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -14545,6 +15030,10 @@ języka ustawiony jako domyślny dla systemu.</qt>
<source>Modify the attributes of the selected disk image file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
index 02ab257..fc21833 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts
@@ -292,7 +292,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Modo 'Seam&less'</translation>
+ <translation type="unfinished">Modo 'Seam&less'</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -316,11 +316,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Desactivar I&ntegração do Rato</translation>
+ <translation type="obsolete">Desactivar I&ntegração do Rato</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Desactiva temporariamente a integração do dispositivo apontador</translation>
+ <translation type="obsolete">Desactiva temporariamente a integração do dispositivo apontador</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -332,11 +332,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Inserir Ctrl-Alt-Apagar</translation>
+ <translation type="obsolete">&Inserir Ctrl-Alt-Apagar</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Envia o comando Ctrl-Alt-Apagar para a máquina virtual</translation>
+ <translation type="obsolete">Envia o comando Ctrl-Alt-Apagar para a máquina virtual</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -344,7 +344,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Envia o comando Ctrl-Alt-Backspace para a máquina virtual</translation>
+ <translation type="obsolete">Envia o comando Ctrl-Alt-Backspace para a máquina virtual</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -416,15 +416,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Dispositivos &CD/DVD</translation>
+ <translation type="obsolete">Dispositivos &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Dispositivos de Dis&quete</translation>
+ <translation type="obsolete">Dispositivos de Dis&quete</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Dispositivos &USB</translation>
+ <translation type="obsolete">Dispositivos &USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -495,15 +495,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Mudar para &Ecrã Completo</translation>
+ <translation type="obsolete">Mudar para &Ecrã Completo</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Mudar entre modo normal e modo ecrã completo</translation>
+ <translation type="obsolete">Mudar entre modo normal e modo ecrã completo</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Mudar para Modo In&tegrado</translation>
+ <translation type="obsolete">Mudar para Modo In&tegrado</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -511,7 +511,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Mudar para Modo E&scala</translation>
+ <translation type="obsolete">Mudar para Modo E&scala</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -590,10 +590,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">&Ficheiro</translation>
@@ -885,10 +881,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -929,11 +921,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Logging...</source>
- <comment>debug action</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Popup Menu</source>
<translation type="unfinished"></translation>
</message>
@@ -1058,6 +1045,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Ficheiro</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1071,6 +1147,26 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1788,6 +1884,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Appliance Export Wizard</source>
@@ -2275,11 +2397,6 @@
<translation type="unfinished">Desactivado</translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Não conectado</translation>
@@ -2483,6 +2600,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Controladora USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished">Activado</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished">Desactivado</translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2856,18 +3028,6 @@
<translation type="obsolete">Desactivar &Protector de Ecrã do Hospedeiro</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -3989,16 +4149,6 @@
<translation></translation>
</message>
<message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
- <comment>CD/DVD tooltip</comment>
- <translation></translation>
- </message>
- <message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
- <comment>FD tooltip</comment>
- <translation></translation>
- </message>
- <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
<comment>Network adapters tooltip</comment>
<translation></translation>
@@ -4098,6 +4248,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4363,10 +4523,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4418,43 +4574,35 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Mini Barra de Ferramentas:</translation>
+ <translation type="obsolete">Mini Barra de Ferramentas:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Se seleccionado, mostra a Mini Barra de Ferramentas em modo Ecrã Completo ou Integrado.</translation>
+ <translation type="obsolete">Se seleccionado, mostra a Mini Barra de Ferramentas em modo Ecrã Completo ou Integrado.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Mostrar em &Ecrã Completo/Integrado</translation>
+ <translation type="obsolete">Mostrar em &Ecrã Completo/Integrado</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Se seleccionado, mostra a Mini Barra de Ferramentas no topo do ecrã, em vez da sua posição predefinida no fundo do ecrã.</translation>
+ <translation type="obsolete">Se seleccionado, mostra a Mini Barra de Ferramentas no topo do ecrã, em vez da sua posição predefinida no fundo do ecrã.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Mostrar no &Topo do Ecrã</translation>
+ <translation type="obsolete">Mostrar no &Topo do Ecrã</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4692,6 +4840,126 @@
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Mini Barra de Ferramentas:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Se seleccionado, mostra a Mini Barra de Ferramentas em modo Ecrã Completo ou Integrado.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Mostrar em &Ecrã Completo/Integrado</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Se seleccionado, mostra a Mini Barra de Ferramentas no topo do ecrã, em vez da sua posição predefinida no fundo do ecrã.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Mostrar no &Topo do Ecrã</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5258,11 +5526,11 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Se seleccionado, a via de comunicação indicado no campo <b>Localização da Porta</b> será criada pela máquina virtual quando esta iniciar. Caso contrário, a máquina virtual tentará usar a via existente.</translation>
+ <translation type="obsolete">Se seleccionado, a via de comunicação indicado no campo <b>Localização da Porta</b> será criada pela máquina virtual quando esta iniciar. Caso contrário, a máquina virtual tentará usar a via existente.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Criar Via de Comunicação</translation>
+ <translation type="obsolete">&Criar Via de Comunicação</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5270,11 +5538,11 @@
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Mostra a localização para a via de comunicação da porta série no hospedeiro quando a porta estiver configurada no modo <b>Via de Comunicação do Hospedeiro</b>, ou o nome do dispositivo série quando a porta estiver configurada para o modo <b>Dispositivo do Hospedeiro</b>.</translation>
+ <translation type="obsolete">Mostra a localização para a via de comunicação da porta série no hospedeiro quando a porta estiver configurada no modo <b>Via de Comunicação do Hospedeiro</b>, ou o nome do dispositivo série quando a porta estiver configurada para o modo <b>Dispositivo do Hospedeiro</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Localização da Porta/Ficheiro:</translation>
+ <translation type="obsolete">&Localização da Porta/Ficheiro:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5284,6 +5552,22 @@
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Mostra o endereço da porta de E/S base desta porta em série. Os valores válidos são n+umeros inteiros no intervalo de <tt>0</tt> até <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5384,11 +5668,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Adicionar Dispositivo CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Adicionar Dispositivo CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Adicionar Dispositivo Disquete</nobr></translation>
+ <translation type="obsolete"><nobr>Adicionar Dispositivo Disquete</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -5428,11 +5712,7 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Adicionar Dispositivo CD/DVD</translation>
- </message>
- <message>
- <source>Add Floppy Device</source>
- <translation></translation>
+ <translation type="obsolete">Adicionar Dispositivo CD/DVD</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5584,15 +5864,15 @@
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>Uni&dade CD/DVD:</translation>
+ <translation type="obsolete">Uni&dade CD/DVD:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Escolha um CD/DVD virtual ou uma unidade física para usar com o dispositivo virtual. A máquina virtual procurará um disco inserido no dispositivo com os dados no ficheiro ou num disco na unidade física assim como os seus conteúdos.</translation>
+ <translation type="obsolete">Escolha um CD/DVD virtual ou uma unidade física para usar com o dispositivo virtual. A máquina virtual procurará um disco inserido no dispositivo com os dados no ficheiro ou num disco na unidade física assim como os seus conteúdos.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Definir o dispositivo CD/DVD virtual</translation>
+ <translation type="obsolete">Definir o dispositivo CD/DVD virtual</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -5616,7 +5896,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Escolher um ficheiro de CD/DVD virtual...</translation>
+ <translation type="obsolete">Escolher um ficheiro de CD/DVD virtual...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -5652,52 +5932,84 @@
<translation type="unfinished">até no máximo um suportado</translation>
</message>
<message>
- <source>up to %1 supported</source>
- <comment>controllers</comment>
- <translation type="unfinished">até %1 suportado</translation>
+ <source>up to %1 supported</source>
+ <comment>controllers</comment>
+ <translation type="unfinished">até %1 suportado</translation>
+ </message>
+ <message>
+ <source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
+ <translation type="obsolete">está actualmente a usar mais controladores de armazenamento do que o 'chipset' %1 suporta. Por favor mude o tipo de 'chipset' na página de definições do sistema ou reduza o número de controladores de armazenamento na página de definições de Armazenamento: %2.</translation>
+ </message>
+ <message>
+ <source>&Port Count:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Controller: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No name is currently specified for the controller at position <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
- <translation type="obsolete">está actualmente a usar mais controladores de armazenamento do que o 'chipset' %1 suporta. Por favor mude o tipo de 'chipset' na página de definições do sistema ou reduza o número de controladores de armazenamento na página de definições de Armazenamento: %2.</translation>
+ <source>Add USB Controller</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>&Port Count:</source>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Selects the port count of the SATA storage controller currently selected in the Storage Tree. This must be at least one more than the highest port number you need to use.</source>
+ <source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Controller: %1</source>
+ <source>Choose a virtual optical disk file...</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No name is currently specified for the controller at position <b>%1</b>.</source>
+ <source><nobr>Add Optical Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
+ <source><nobr>Add Floppy Drive</nobr></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <source>Add Optical Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <source>Add Floppy Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add USB Controller</source>
+ <source>Optical &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Hot-pluggable</source>
+ <source>Set up the virtual optical drive</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -6044,10 +6356,6 @@
<translation type="obsolete">O USB 2.0 está actualmente activado para esta máquina virtual. No entanto isto requer que o <b>%1</b> seja instalado. Por favor instale o Pacote de Extensão do sítio de transferências do VirtualBox. Depois poderá re-activar o USB 2.0. Será desactivado entretanto a não ser que cancele as alterações das definições actuais.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6067,6 +6375,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6232,6 +6544,14 @@
<source>Close</source>
<translation type="unfinished">Fechar</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Mudar</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6275,7 +6595,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Falha ao criar o objeto COM VirtualBox.</p><p>A aplicação será agora terminada.</p></translation>
+ <translation type="obsolete"><p>Falha ao criar o objeto COM VirtualBox.</p><p>A aplicação será agora terminada.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -6887,7 +7207,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Uma nova versão do VirtualBox está disponível! A version <b>%1</b> está disponível em <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Poderá fazer a transferência desta versão utilizando este atalho directo:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Uma nova versão do VirtualBox está disponível! A version <b>%1</b> está disponível em <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Poderá fazer a transferência desta versão utilizando este atalho directo:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6966,10 +7286,6 @@
<translation>Falha ao determinar o estado de acessibilidade da média <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
- <source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&More</source>
<comment>warnAboutAutoConvertedSettings message box</comment>
<translation type="obsolete">&Mais</translation>
@@ -6985,10 +7301,6 @@
<translation type="obsolete">Sobre-escre&ver</translation>
</message>
<message>
- <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>hard disk</source>
<comment>failed to close ...</comment>
<translation type="obsolete">disco rígido</translation>
@@ -7153,10 +7465,6 @@
<translation type="obsolete">disco rígido</translation>
</message>
<message>
- <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Remove</source>
<comment>medium</comment>
<translation>&Remover</translation>
@@ -7216,10 +7524,6 @@
<translation type="obsolete">Es&colher disco existente</translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Choose disk</source>
<comment>add attachment routine</comment>
<translation type="obsolete">Es&colher disco</translation>
@@ -7238,14 +7542,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -7274,14 +7570,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7491,10 +7779,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7723,14 +8007,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7791,6 +8067,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8692,13 +9056,17 @@ diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Bem-vindo ao VirtualBox!</h3><p>A parte esquerda desta janela é uma lista de todas as máquinas virtuais no seu computador. A lista está vazia agora porque ainda não criou qualquer máquina virtual.<img src=:/welcome.png align=right/></p><p>Para poder criar uma nova máquina virtual, prima o botão <b>Nova</b> na barra de ferramentas no topo da janela.</p><p>Pode premir a tecla <b>%1& [...]
+ <translation type="obsolete"><h3>Bem-vindo ao VirtualBox!</h3><p>A parte esquerda desta janela é uma lista de todas as máquinas virtuais no seu computador. A lista está vazia agora porque ainda não criou qualquer máquina virtual.<img src=:/welcome.png align=right/></p><p>Para poder criar uma nova máquina virtual, prima o botão <b>Nova</b> na barra de ferramentas no topo da janela.</p><p>Pode premir a tecla <b>%1< [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished">Gestor</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8731,7 +9099,7 @@ diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source>Settings</source>
- <translation>Definições</translation>
+ <translation type="obsolete">Definições</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -8784,6 +9152,10 @@ diálogo de Configurações da MV.</p></translation>
<source>Display</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8859,6 +9231,25 @@ diálogo de Configurações da MV.</p></translation>
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">está actualmente a usar mais controladores de armazenamento do que o 'chipset' %1 suporta. Por favor mude o tipo de 'chipset' na página de definições do sistema ou reduza o número de controladores de armazenamento na página de definições de Armazenamento: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -8873,6 +9264,10 @@ diálogo de Configurações da MV.</p></translation>
<source>Close</source>
<translation type="unfinished">Fechar</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -9246,10 +9641,6 @@ diálogo de Configurações da MV.</p></translation>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -9261,6 +9652,10 @@ diálogo de Configurações da MV.</p></translation>
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11476,7 +11871,7 @@ Versão %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12317,17 +12712,17 @@ Versão %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>A ligação deste disco será executada indirectamente usando um disco rígido de diferenciação recém criado.</translation>
+ <translation type="obsolete">A ligação deste disco será executada indirectamente usando um disco rígido de diferenciação recém criado.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Algumas das médias neste disco rígido estão inacessiveis. Por favor use o Gestor de Médias Virtual no modo <b>Mostrar Discos Rígidos de Diferenciação</b> para inspecionar esta média.</translation>
+ <translation type="obsolete">Algumas das médias neste disco rígido estão inacessiveis. Por favor use o Gestor de Médias Virtual no modo <b>Mostrar Discos Rígidos de Diferenciação</b> para inspecionar esta média.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Este disco rígido base está ligado indirectamente usando o seguinte disco rígido de diferenciação:</translation>
+ <translation type="obsolete">Este disco rígido base está ligado indirectamente usando o seguinte disco rígido de diferenciação:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -12373,7 +12768,7 @@ Versão %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -12899,12 +13294,12 @@ Versão %1</translation>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Activado</translation>
+ <translation type="obsolete">Activado</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished">Desactivado</translation>
+ <translation type="obsolete">Desactivado</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -13014,6 +13409,105 @@ Versão %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Activo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Activo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Activo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13858,6 +14352,10 @@ para ligar ao encaixe actualmente destacado.</qt>
<source>Modify the attributes of the selected disk image file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
index 9aa1281..a9339db 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts
@@ -296,7 +296,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Modo Seam&less</translation>
+ <translation>Modo Seam&less</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -320,11 +320,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Desabilitar Integração de &Mouse</translation>
+ <translation type="obsolete">Desabilitar Integração de &Mouse</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Temporariamente desabilitar integração de ponteiro de mouse</translation>
+ <translation type="obsolete">Temporariamente desabilitar integração de ponteiro de mouse</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -336,11 +336,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Inserir Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&Inserir Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Envia a sequência Ctrl-Alt-Del para a máquina virtual</translation>
+ <translation type="obsolete">Envia a sequência Ctrl-Alt-Del para a máquina virtual</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -348,7 +348,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Envia a sequência Ctrl-Alt-Backspace para a máquina virtual</translation>
+ <translation type="obsolete">Envia a sequência Ctrl-Alt-Backspace para a máquina virtual</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -420,15 +420,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Dispositivos de &CD/DVD</translation>
+ <translation type="obsolete">Dispositivos de &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Dispositivos de Disquete (&F)</translation>
+ <translation type="obsolete">Dispositivos de Disquete (&F)</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Dispositivos &USB</translation>
+ <translation type="obsolete">Dispositivos &USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -479,7 +479,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">Opções de &Log...</translation>
+ <translation type="obsolete">Opções de &Log...</translation>
</message>
<message>
<source>&Help</source>
@@ -557,15 +557,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Alternar para Tela Cheia (&F)</translation>
+ <translation type="obsolete">Alternar para Tela Cheia (&F)</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Alternar entre modo de tela cheia e normal</translation>
+ <translation type="obsolete">Alternar entre modo de tela cheia e normal</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Alternar para Modo Seam&less</translation>
+ <translation type="obsolete">Alternar para Modo Seam&less</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -573,7 +573,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Alternar para Modo E&scalonado</translation>
+ <translation type="obsolete">Alternar para Modo E&scalonado</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -780,7 +780,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>&Enviar Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">&Enviar Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>Sort List</source>
@@ -800,7 +800,7 @@
</message>
<message>
<source>Power off the virtual machine</source>
- <translation type="unfinished">Desliga a máquina virtual</translation>
+ <translation>Desligar a máquina virtual</translation>
</message>
<message>
<source>Show &log...</source>
@@ -1044,167 +1044,256 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Arrastar e Soltar</translation>
+ <translation type="obsolete">Arrastar e Soltar</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>Salvar o estado das máquina virtual</translation>
</message>
<message>
<source>&Network Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Co&nfigurações de Rede...</translation>
</message>
<message>
<source>&Shared Folders Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Configurações de Pasta&s Compartilhadas...</translation>
</message>
<message>
<source>R&emote Display</source>
- <translation type="unfinished"></translation>
+ <translation>T&ela Remota</translation>
</message>
<message>
<source>Toggle remote desktop (RDP) connections to this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Habilitar conexões de desktop remoto (RDP) para esta máquina</translation>
</message>
<message>
<source>&Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>Captura de &Vídeo:</translation>
</message>
<message>
<source>Toggle video capture</source>
- <translation type="unfinished"></translation>
+ <translation>Habilita captura de vídeo</translation>
</message>
<message>
<source>&Video Capture Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Configurações de Captura de &Vídeo...</translation>
</message>
<message>
<source>Configure video capture settings</source>
- <translation type="unfinished"></translation>
+ <translation>Altera configurações de captura de vídeo</translation>
</message>
<message>
<source>Popup Menu</source>
- <translation type="unfinished"></translation>
+ <translation>Menu Popup</translation>
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished"></translation>
+ <translation>Exibe Janela de Informações Sobre a Sessão</translation>
</message>
<message>
<source>&Webcams</source>
- <translation type="unfinished"></translation>
+ <translation>&Webcams</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished"></translation>
+ <translation>&Inserir imagem de CD dos Adicionais para Convidado...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished"></translation>
+ <translation>Insere o arquivo de imagem dos Adicionais de Convidado no drive virtual</translation>
</message>
<message>
<source>&VirtualBox</source>
- <translation type="unfinished"></translation>
+ <translation>&VirtualBox</translation>
</message>
<message>
<source>&Menu Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Barra de &Menu</translation>
</message>
<message>
<source>&Menu Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Configurações de Barra de &Menu...</translation>
</message>
<message>
<source>Opens window to configure menu-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Abre um diálogo para configurar a barra de menus</translation>
</message>
<message>
<source>Show Menu &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Exibir &Barra de Menu</translation>
</message>
<message>
<source>Toggle menu-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Define a visibilidade da barra de menus para esta máquina</translation>
</message>
<message>
<source>&Status Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Barra de &Status</translation>
</message>
<message>
<source>&Status Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Configurações de Barra de &Status...</translation>
</message>
<message>
<source>Opens window to configure status-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Abre um diálogo para configurar a barra de status</translation>
</message>
<message>
<source>Show Status &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Exibir &Barra de Status</translation>
</message>
<message>
<source>Toggle status-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Define a visibilidade da barra de status para esta máquina</translation>
</message>
<message>
<source>&Input</source>
- <translation type="unfinished"></translation>
+ <translation>Entrada (&I)</translation>
</message>
<message>
<source>&Keyboard</source>
- <translation type="unfinished">Teclado (&K)</translation>
+ <translation>Teclado (&K)</translation>
</message>
<message>
<source>&Keyboard Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Configurações de Teclado (&K)...</translation>
</message>
<message>
<source>Display the global settings window to configure shortcuts</source>
- <translation type="unfinished"></translation>
+ <translation>Exibe o diálogo de configurações globais para configurar atalhos</translation>
</message>
<message>
<source>&Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>&Mouse</translation>
</message>
<message>
<source>&Hard Drives</source>
- <translation type="unfinished"></translation>
+ <translation>Discos Rígidos (&H)</translation>
</message>
<message>
<source>&Hard Drive Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Configurações de Disco Rígido (&H)...</translation>
</message>
<message>
<source>Change the settings of hard drives</source>
- <translation type="unfinished"></translation>
+ <translation>Alterar as configurações de discos rígidos</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished">Rede</translation>
+ <translation>Rede</translation>
</message>
<message>
<source>&USB Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>Configurações de &USB...</translation>
</message>
<message>
<source>Change the settings of USB devices</source>
- <translation type="unfinished"></translation>
+ <translation>Alterar as configurações de dispositivos USB</translation>
</message>
<message>
<source>&Shared Folders</source>
- <translation type="unfinished"></translation>
+ <translation>Pa&stas Compartilhadas</translation>
</message>
<message>
<source>Show &Log...</source>
<comment>debug action</comment>
- <translation type="unfinished">Exibir &Log...</translation>
+ <translation>Exibir &Log...</translation>
</message>
<message>
<source>E&xtra Data Manager...</source>
- <translation type="unfinished"></translation>
+ <translation>Gerenciador de Dados E&xtras...</translation>
</message>
<message>
<source>Display the Extra Data Manager window</source>
+ <translation>Exibe a janela do Gerenciador de Dados Extras</translation>
+ </message>
+ <message>
+ <source>&File</source>
+ <translation>Arquivo (&F)</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation>Janela (&W)</translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation>&Minimizar</translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation>Minimizar a Janela da máquina ativa</translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation>Modo Tela Cheia (&F)</translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation>Alternar entre modo de tela cheia e normal</translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation>Alternar para Modo Es&calonado</translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation>Fator de Es&calonamento</translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation>&Inserir %1</translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation>Envia a sequência %1 para a máquina virtual</translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation>Integração de &Mouse</translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation>Habilitar Integração de ponteiro de mouse</translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation>Discos &Ópticos</translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation>Drive de Disquete (&F)</translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation>&USB</translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation>Arrastar e Soltar</translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation>Opções de &Log</translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1213,12 +1302,32 @@
<message>
<source>Enable</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished">Habilitar</translation>
+ <translation>Habilitar</translation>
</message>
<message>
<source>Resize to %1x%2</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>Redimensionar para %1x%2</translation>
+ </message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation>%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation>%1 - Criptografia de Disco</translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation>
+ <numerusform>Esta máquina virtual está protegida por senha. Por favor entra a(s) %n senha(s) criptográfica(s) abaixo.</numerusform>
+ <numerusform></numerusform>
+ </translation>
</message>
</context>
<context>
@@ -2042,7 +2151,7 @@
<name>UIDnDDrag</name>
<message>
<source>Retrieving data ...</source>
- <translation type="unfinished"></translation>
+ <translation>Obtendo dados...</translation>
</message>
</context>
<context>
@@ -2170,6 +2279,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation>Status</translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation>Senha</translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation>
+ <numerusform><nobr>Usado pelo(s) seguinte(s) %n disco(s) rígido(s):</nobr><br>%1</numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2794,19 +2929,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Collapse group</source>
- <translation type="unfinished"></translation>
+ <translation>Fechar grupo</translation>
</message>
<message>
<source>Expand group</source>
- <translation type="unfinished"></translation>
+ <translation>Expandir grupo</translation>
</message>
<message>
<source>Enter group</source>
- <translation type="unfinished"></translation>
+ <translation>Entrar no grupo</translation>
</message>
<message>
<source>Exit group</source>
- <translation type="unfinished"></translation>
+ <translation>Sair do grupo</translation>
</message>
</context>
<context>
@@ -2931,7 +3066,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Not attached</source>
@@ -3146,41 +3281,96 @@ p, li { white-space: pre-wrap; }
<message>
<source>Video Capture File</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Arquivo de Captura de Vídeo</translation>
</message>
<message>
<source>Video Capture Attributes</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Atributos de Captura de Vídeo</translation>
</message>
<message>
<source>Video Capture</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Captura de Vídeo</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>Desabilitado</translation>
</message>
<message>
<source>NAT Network, '%1'</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Rede NAT, '%1'</translation>
</message>
<message>
<source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
- <translation type="unfinished"></translation>
+ <translation>Tamanho do Frame: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</translation>
</message>
<message>
<source>Minimal Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Paravirtualização Mínima</translation>
</message>
<message>
<source>Hyper-V Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Paravirtualização Hyper-V</translation>
+ </message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation>Paravirtualização KVM</translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation>[Discos Óptico]</translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation>Controladora USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation>Fator de Escala</translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation>Saída de Vídeo HiDPI Sem Escala</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation>Habilitada</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation>Posição da Minibarra de Ferramentas</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>Superior</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>Inferior</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation>Minibarra de Ferramentas</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation>Desabilitada</translation>
</message>
</context>
<context>
@@ -3496,15 +3686,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Machine Windows:</source>
- <translation type="unfinished"></translation>
+ <translation>Janelas da Máquina:</translation>
</message>
<message>
<source>If checked, machine windows will be raised when the mouse pointer moves over them.</source>
- <translation type="unfinished"></translation>
+ <translation>Quando selecionado, as janelas relativas a esta máquina terão o foco quando o ponteiro do mouse passar por cima delas.</translation>
</message>
<message>
<source>&Raise Window Under Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>T&razer a Janela Sob o Mouse Para o Topo</translation>
</message>
</context>
<context>
@@ -3551,7 +3741,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Extension Packages</source>
- <translation type="unfinished"></translation>
+ <translation>Pacotes de &Extensão</translation>
</message>
</context>
<context>
@@ -3609,28 +3799,16 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Desligar &ScreenSaver do Hospedeiro</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
- <translation type="unfinished"></translation>
+ <translation>Screensaver do &Hospedeiro:</translation>
</message>
<message>
<source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
- <translation type="unfinished"></translation>
+ <translation>Quando selecionado, o screensaver do hospedeiro será desabilitado sempre que uma máquina virtual estiver em execução.</translation>
</message>
<message>
<source>Disable When Running Virtual Machines</source>
- <translation type="unfinished"></translation>
+ <translation>Desabilitar Quando Máquinas Virtuais Estiverem em Execução</translation>
</message>
</context>
<context>
@@ -3669,27 +3847,27 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Host Key Combination</source>
- <translation type="unfinished"></translation>
+ <translation>Combinação de Teclas do Hospedeiro</translation>
</message>
<message>
<source>Some items have the same shortcuts assigned.</source>
- <translation type="unfinished"></translation>
+ <translation>Alguns items possuem os mesmos atalhos de teclado definidos.</translation>
</message>
<message>
<source>&VirtualBox Manager</source>
- <translation type="unfinished"></translation>
+ <translation>Gerenciador do &VirtualBox</translation>
</message>
<message>
<source>Virtual &Machine</source>
- <translation type="unfinished"></translation>
+ <translation>&Máquina Virtual</translation>
</message>
<message>
<source>Lists all the available shortcuts which can be configured.</source>
- <translation type="unfinished"></translation>
+ <translation>Lista todos os atalhos de teclado disponíveis para configuração.</translation>
</message>
<message>
<source>Enter a sequence to filter the shortcut list.</source>
- <translation type="unfinished"></translation>
+ <translation>Entre uma sequência ser filtrada da lista de atalhos.</translation>
</message>
</context>
<context>
@@ -3748,7 +3926,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Interface Languages</source>
- <translation type="unfinished"></translation>
+ <translation>&Idiomas da Interface</translation>
</message>
</context>
<context>
@@ -3905,128 +4083,128 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&NAT Networks</source>
- <translation type="unfinished"></translation>
+ <translation>Redes &NAT</translation>
</message>
<message>
<source>Lists all available NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>Lista todas as redes NAT disponíveis.</translation>
</message>
<message>
<source>&Host-only Networks</source>
- <translation type="unfinished"></translation>
+ <translation>Redes Exclusivas de &Hospedeiro</translation>
</message>
<message>
<source>No new name specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhum nome especificado para a rede NAT previamente conhecida como <b>%1</b>.</translation>
</message>
<message>
<source>No CIDR specified for the NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhum CIDR especificado para a rede NAT <b>%1</b>.</translation>
</message>
<message>
<source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhum CIDR especificado para a rede NAT previamente chamada de <b>%1</b>.</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>CIDR inválido (<i>%1</i>) especificado para a rede NAT <b>%2</b>.</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>CIDR inválido (<i>%1</i>) especificado para a rede NAT previamente chamada <b>%2</b>.</translation>
</message>
<message>
<source>Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Nome da Rede</translation>
</message>
<message>
<source>[empty]</source>
- <translation type="unfinished"></translation>
+ <translation>[vazio]</translation>
</message>
<message>
<source>%1 (renamed from %2)</source>
- <translation type="unfinished"></translation>
+ <translation>%1 (renomeada de %2)</translation>
</message>
<message>
<source>Old Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Nome Antigo da Rede</translation>
</message>
<message>
<source>New Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>Nome Novo da Rede</translation>
</message>
<message>
<source>Network CIDR</source>
- <translation type="unfinished"></translation>
+ <translation>CIDR da Rede</translation>
</message>
<message>
<source>Supports DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>Suporta DHCP</translation>
</message>
<message>
<source>yes</source>
- <translation type="unfinished"></translation>
+ <translation>sim</translation>
</message>
<message>
<source>no</source>
- <translation type="unfinished"></translation>
+ <translation>não</translation>
</message>
<message>
<source>Supports IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>Suporta IPv6</translation>
</message>
<message>
<source>Default IPv6 route</source>
- <translation type="unfinished"></translation>
+ <translation>Rota IPv6 padrão</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
- <translation type="unfinished"></translation>
+ <translation>A interface do hospedeiro <b>%1</b> não possui um endereço IPv4 válido.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
- <translation type="unfinished"></translation>
+ <translation>A interface do hospedeiro <b>%1</b> não possui uma máscara IPv4 válida.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
- <translation type="unfinished"></translation>
+ <translation>A interface do hospedeiro <b>%1</b> não possui um endereço IPv6 válido.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
- <translation type="unfinished"></translation>
+ <translation>A interface do hospedeiro <b>%1</b> não possui um endereço de servidor DHCP válido.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
- <translation type="unfinished"></translation>
+ <translation>A interface do hospedeiro <b>%1</b> não possui uma máscara de servidor DHCP válido.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>A interface do hospedeiro <b>%1</b> não possui uma faixa inferior de endereços definida para o servidor DHCP.</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>A interface do hospedeiro <b>%1</b> não possui uma faixa superior de endereços definida para o servidor DHCP.</translation>
</message>
<message>
<source>The name <b>%1</b> is being used for several NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>O nome <b>%1</b> está sendo utilizado para diversas redes NAT.</translation>
</message>
<message>
<source>Active</source>
<comment>NAT network</comment>
- <translation type="unfinished">Ativo</translation>
+ <translation>Ativo</translation>
</message>
<message>
<source>&Add NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Acrescentar Rede NAT</translation>
</message>
<message>
<source>&Remove NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Remover rede NAT</translation>
</message>
<message>
<source>&Edit NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>&Editar rede NAT</translation>
</message>
</context>
<context>
@@ -4128,177 +4306,177 @@ p, li { white-space: pre-wrap; }
<name>UIGlobalSettingsNetworkDetailsHost</name>
<message>
<source>Host-only Network Details</source>
- <translation type="unfinished"></translation>
+ <translation>Detalhes de Rede Exclusiva de Hospedeiro (host-only)</translation>
</message>
<message>
<source>&Adapter</source>
- <translation type="unfinished">Pl&aca</translation>
+ <translation>Pl&aca</translation>
</message>
<message>
<source>Manual &Configuration</source>
- <translation type="unfinished">&Configuração Manual</translation>
+ <translation>&Configuração Manual</translation>
</message>
<message>
<source>Use manual configuration for this host-only network adapter.</source>
- <translation type="unfinished">Utilizar configuração manual para esta placa de rede exclusiva de hospedeiro.</translation>
+ <translation>Utilizar configuração manual para esta placa de rede exclusiva de hospedeiro.</translation>
</message>
<message>
<source>&IPv4 Address:</source>
- <translation type="unfinished">Endereço &IPv4:</translation>
+ <translation>Endereço &IPv4:</translation>
</message>
<message>
<source>Holds the host IPv4 address for this adapter.</source>
- <translation type="unfinished">Exibe o endereço IPv4 para esta placa.</translation>
+ <translation>Contém o endereço IPv4 para esta placa.</translation>
</message>
<message>
<source>IPv4 Network &Mask:</source>
- <translation type="unfinished">&Máscara de Rede IPv4:</translation>
+ <translation>&Máscara de Rede IPv4:</translation>
</message>
<message>
<source>Holds the host IPv4 network mask for this adapter.</source>
- <translation type="unfinished">Exibe a máscara de rede IPv4 para esta placa.</translation>
+ <translation>Contém a máscara de rede IPv4 para esta placa.</translation>
</message>
<message>
<source>I&Pv6 Address:</source>
- <translation type="unfinished">Endereço I&Pv6:</translation>
+ <translation>Endereço I&Pv6:</translation>
</message>
<message>
<source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">Exibe o endereço IPv6 para esta placa se IPv6 for suportado.</translation>
+ <translation>Contém o endereço IPv6 para esta placa se IPv6 for suportado.</translation>
</message>
<message>
<source>IPv6 Network Mask &Length:</source>
- <translation type="unfinished">Tamanho da Máscara de Rede IPv6 (&L):</translation>
+ <translation>Tamanho da Máscara de Rede IPv6 (&L):</translation>
</message>
<message>
<source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">Exibe o tamanho do prefixo da máscara de rede IPv6 para esta placa se IPv6 for suportado.</translation>
+ <translation>Contém o tamanho do prefixo da máscara de rede IPv6 para esta placa se IPv6 for suportado.</translation>
</message>
<message>
<source>&DHCP Server</source>
- <translation type="unfinished">Servidor &DHCP</translation>
+ <translation>Servidor &DHCP</translation>
</message>
<message>
<source>&Enable Server</source>
- <translation type="unfinished">Habilitar S&ervidor</translation>
+ <translation>Habilitar S&ervidor</translation>
</message>
<message>
<source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
- <translation type="unfinished">Indica se o Servidor DHCP está habilitado durante a inicialização da máquina ou não.</translation>
+ <translation>Indica se o Servidor DHCP está habilitado durante a inicialização da máquina ou não.</translation>
</message>
<message>
<source>Server Add&ress:</source>
- <translation type="unfinished">Endereço do Se&rvidor:</translation>
+ <translation>Endereço do Se&rvidor:</translation>
</message>
<message>
<source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Exibe o endereço do servidor DHCP que está servindo à rede associada a esta placa exclusiva de hospedeiro.</translation>
+ <translation>Contém o endereço do servidor DHCP que está servindo à rede associada a esta placa exclusiva de hospedeiro.</translation>
</message>
<message>
<source>Server &Mask:</source>
- <translation type="unfinished">&Máscara do Servidor:</translation>
+ <translation>&Máscara do Servidor:</translation>
</message>
<message>
<source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Exibe a máscara de rede do servidor DHCP que está servindo à rede associada a esta placa exclusiva de hospedeiro.</translation>
+ <translation>Contém a máscara de rede do servidor DHCP que está servindo à rede associada a esta placa exclusiva de hospedeiro.</translation>
</message>
<message>
<source>&Lower Address Bound:</source>
- <translation type="unfinished">Faixa Inferior de Endereçamento (&L):</translation>
+ <translation>Faixa Inferior de Endereçamento (&L):</translation>
</message>
<message>
<source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Exibe a faixa inferior de endereçamento oferecido pelo servidor DHCP que está servindo à rede associada com esta placa exclusiva de hospedeiro.</translation>
+ <translation>Contém a faixa inferior de endereçamento oferecido pelo servidor DHCP que está servindo à rede associada com esta placa exclusiva de hospedeiro.</translation>
</message>
<message>
<source>&Upper Address Bound:</source>
- <translation type="unfinished">Faixa S&uperior de Endereçamento:</translation>
+ <translation>Faixa S&uperior de Endereçamento:</translation>
</message>
<message>
<source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">Exibe a faixa superior de endereçamento oferecido pelo servidor DHCP que está servindo à rede associada com esta placa exclusiva de hospedeiro.</translation>
+ <translation>Contém a faixa superior de endereçamento oferecido pelo servidor DHCP que está servindo à rede associada com esta placa exclusiva de hospedeiro.</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsNetworkDetailsNAT</name>
<message>
<source>NAT Network Details</source>
- <translation type="unfinished"></translation>
+ <translation>Detalhes da Rede NAT</translation>
</message>
<message>
<source>&Enable Network</source>
- <translation type="unfinished"></translation>
+ <translation>Habilitar R&ede</translation>
</message>
<message>
<source>Enable this NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>Habilita esta rede NAT.</translation>
</message>
<message>
<source>Network &Name:</source>
- <translation type="unfinished"></translation>
+ <translation>&Nome da Rede:</translation>
</message>
<message>
<source>Holds the name for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>Contém o nome desta rede.</translation>
</message>
<message>
<source>Network &CIDR:</source>
- <translation type="unfinished"></translation>
+ <translation>&CIDR da Rede:</translation>
</message>
<message>
<source>Holds the CIDR for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>Contém o CIDR para esta rede.</translation>
</message>
<message>
<source>Network Options:</source>
- <translation type="unfinished"></translation>
+ <translation>Opções de Rede:</translation>
</message>
<message>
<source>Supports &DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>Suporta &DHCP</translation>
</message>
<message>
<source>Determines whether this network supports DHCP.</source>
- <translation type="unfinished"></translation>
+ <translation>Determina se esta rede suporta DHCP.</translation>
</message>
<message>
<source>Supports &IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>Suporta &IPv6</translation>
</message>
<message>
<source>Determines whether this network supports IPv6.</source>
- <translation type="unfinished"></translation>
+ <translation>Determina se esta rede suporta IPv6</translation>
</message>
<message>
<source>Advertise Default IPv6 &Route</source>
- <translation type="unfinished"></translation>
+ <translation>Divulgar Rota IPv6 Padrâo</translation>
</message>
<message>
<source>Determines whether this network should be advertised as the default IPv6 route.</source>
- <translation type="unfinished"></translation>
+ <translation>Determina se esta rede deve ser divulgada como a rota IPv6 padrão.</translation>
</message>
<message>
<source>Opens a window to manage port forwarding rules.</source>
- <translation type="unfinished">Abre um diálogo para gerenciar as regras de redirecionamento de portas.</translation>
+ <translation>Abre um diálogo para gerenciar as regras de redirecionamento de portas.</translation>
</message>
<message>
<source>&Port Forwarding</source>
- <translation type="unfinished">Redirecionamento de &Portas</translation>
+ <translation>Redirecionamento de &Portas</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsPortForwardingDlg</name>
<message>
<source>Port Forwarding Rules</source>
- <translation type="unfinished">Regras de Redirecionamento de Portas</translation>
+ <translation>Regras de Redirecionamento de Portas</translation>
</message>
<message>
<source>IPv4</source>
- <translation type="unfinished"></translation>
+ <translation>IPv4</translation>
</message>
<message>
<source>IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>IPv6</translation>
</message>
</context>
<context>
@@ -4353,11 +4531,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No proxy host is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhum servidor de proxy especificado.</translation>
</message>
<message>
<source>No proxy port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhuma porta de proxy especificada.</translation>
</message>
</context>
<context>
@@ -4422,71 +4600,71 @@ p, li { white-space: pre-wrap; }
<name>UIHostComboEditor</name>
<message>
<source><key_%1></source>
- <translation type="unfinished"><key_%1></translation>
+ <translation><key_%1></translation>
</message>
<message>
<source>Left </source>
- <translation type="unfinished">Esquerda </translation>
+ <translation>Esquerda </translation>
</message>
<message>
<source>Right </source>
- <translation type="unfinished">Direita </translation>
+ <translation>Direita </translation>
</message>
<message>
<source>Left Shift</source>
- <translation type="unfinished">Shift Esquerdo</translation>
+ <translation>Shift Esquerdo</translation>
</message>
<message>
<source>Right Shift</source>
- <translation type="unfinished">Shift Direito</translation>
+ <translation>Shift Direito</translation>
</message>
<message>
<source>Left Ctrl</source>
- <translation type="unfinished">Ctrl Esquerdo</translation>
+ <translation>Ctrl Esquerdo</translation>
</message>
<message>
<source>Right Ctrl</source>
- <translation type="unfinished">Ctrl Direito</translation>
+ <translation>Ctrl Direito</translation>
</message>
<message>
<source>Left Alt</source>
- <translation type="unfinished">Alt Esquerdo</translation>
+ <translation>Alt Esquerdo</translation>
</message>
<message>
<source>Right Alt</source>
- <translation type="unfinished">Alt Direito</translation>
+ <translation>Alt Direito</translation>
</message>
<message>
<source>Left WinKey</source>
- <translation type="unfinished">Tecla Windows Esquerda</translation>
+ <translation>Tecla Windows Esquerda</translation>
</message>
<message>
<source>Right WinKey</source>
- <translation type="unfinished">Tecla Windows Direita</translation>
+ <translation>Tecla Windows Direita</translation>
</message>
<message>
<source>Menu key</source>
- <translation type="unfinished">Tecla Menu</translation>
+ <translation>Tecla Menu</translation>
</message>
<message>
<source>Alt Gr</source>
- <translation type="unfinished">Alt Gr</translation>
+ <translation>Alt Gr</translation>
</message>
<message>
<source>Caps Lock</source>
- <translation type="unfinished">Caps Lock</translation>
+ <translation>Caps Lock</translation>
</message>
<message>
<source>Scroll Lock</source>
- <translation type="unfinished">Scroll Lock</translation>
+ <translation>Scroll Lock</translation>
</message>
<message>
<source>Host+</source>
- <translation type="unfinished"></translation>
+ <translation>Tecla de Hospedeiro +</translation>
</message>
<message>
<source>None</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhuma</translation>
</message>
</context>
<context>
@@ -4673,22 +4851,22 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Reset shortcut to default</source>
- <translation type="unfinished"></translation>
+ <translation>Redefinir atalho para padrão</translation>
</message>
<message>
<source>Unset shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>Remover atalho</translation>
</message>
</context>
<context>
<name>UIHotKeyTableModel</name>
<message>
<source>Name</source>
- <translation type="unfinished">Nome</translation>
+ <translation>Nome</translation>
</message>
<message>
<source>Shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>Atalho</translation>
</message>
</context>
<context>
@@ -4833,12 +5011,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica a atividade dos dispositivos de CD/DVD:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica a atividade dos dispositivos de CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indica a atividade dos dispositivos de disquete:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indica a atividade dos dispositivos de disquete:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4927,24 +5105,34 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
- <translation type="unfinished"></translation>
+ <translation><nobr>Indica atividade de captura de vídeo:</nobr><br>%1</translation>
</message>
<message>
<source><nobr><b>Video capture disabled</b></nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Captura de vídeo desabilitada</b></nobr></translation>
</message>
<message>
<source><nobr><b>Video capture file:</b> %1</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Arquivo de captura de vídeo:</b> %1</nobr></translation>
</message>
<message>
<source>Additional feature status:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></source>
<comment>Virtualization Stuff LED</comment>
- <translation type="unfinished"></translation>
+ <translation>Status dos recursos adicionais:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
- <translation type="unfinished"></translation>
+ <translation><p style='white-space:pre'><nobr>Indica a atividade da tela:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Indica a atividade dos drives ópticos:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Indica a atividade dos drives de disquete:</nobr>%1</p></translation>
</message>
</context>
<context>
@@ -5018,19 +5206,19 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No Webcams Connected</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhuma Webcam Conectada</translation>
</message>
<message>
<source>No supported webcams connected to the host PC</source>
- <translation type="unfinished"></translation>
+ <translation>nenhuma webcam suportada conectada ao PC hospedeiro</translation>
</message>
<message>
<source>Connect Network Adapter</source>
- <translation type="unfinished"></translation>
+ <translation>Conectar Placa de Rede</translation>
</message>
<message>
<source>Connect Network Adapter %1</source>
- <translation type="unfinished"></translation>
+ <translation>Conectar Placa de Rede %1</translation>
</message>
</context>
<context>
@@ -5188,169 +5376,162 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Video &Capture</source>
- <translation type="unfinished"></translation>
+ <translation>Captura de &Vídeo</translation>
</message>
<message>
<source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
- <translation type="unfinished"></translation>
+ <translation>Quando selecionado, permite que o VirtualBox grave uma sessão de uma máquina virtual como um arquivo de vídeo.</translation>
</message>
<message>
<source>&Enable Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>Habilitar Captura de Víd&eo</translation>
</message>
<message>
<source>File &Path:</source>
- <translation type="unfinished"></translation>
+ <translation>Caminho do Arquivo (&P):</translation>
</message>
<message>
<source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
- <translation type="unfinished"></translation>
+ <translation>Esta configuração determina o nome de arquivo que o VirtualBox utilizará para salvar o conteúdo gravado.</translation>
</message>
<message>
<source>Frame &Size:</source>
- <translation type="unfinished"></translation>
+ <translation>Tamanho do Frame (&S):</translation>
</message>
<message>
<source>This setting determines the resolution (frame size) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Esta configuração determina a resolução (tamanho do frame) do vídeo gravado.</translation>
</message>
<message>
<source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Esta configuração determina a resolução <b>horizontal</b> (largura do frame) para o vídeo gravado.</translation>
</message>
<message>
<source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>Esta configuração determina a resolução <b>vertical</b> (altura do frame) para o vídeo gravado.</translation>
</message>
<message>
<source>&Frame Rate:</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>taxa de quadros seria o mais adequado, mas não é intuitivo.</translatorcomment>
+ <translation>Taxa de &Frames:</translation>
</message>
<message>
<source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Esta configuração determina o número máximo de <b>frames por segundo</b> no vídeo resultante. Frames adicionais serão descartados. Reduzir este valor aumentará a quantidade de frames descartados, mas reduzirá o tamanho do arquivo final.</translation>
</message>
<message>
<source>&Quality:</source>
- <translation type="unfinished"></translation>
+ <translation>&Qualidade:</translation>
</message>
<message>
<source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Esta configuração determina a <b>qualidade</b>. Aumentar este valor fará com que o vídeo tenha uma aparência melhor, ao custo de um tamanho maior de arquivo.</translation>
</message>
<message>
<source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>Esta configuração determina o bitrate em <b>kilobits por segundo</b>. Aumentar este valor fará com que o vídeo tenha uma aparência melhor, ao custo de um tamanho maior de arquivo.</translation>
</message>
<message>
<source>&Screens:</source>
- <translation type="unfinished"></translation>
+ <translation>Tela&s:</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
- <translation type="unfinished"></translation>
+ <translation>A máquina virtual está configurada para utilizar a aceleração gráfica por hardware. No entanto, o sistema hospedeiro não possui este recurso, logo não será possível iniciar esta máquina.</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
- <translation type="unfinished"></translation>
+ <translation>A máquina virtual atualmente está configurada com menos que <b>%1</b> de memória de vídeo, que seria o mínimo necessário para permitir alternar para tela cheia ou modo seamless.</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
- <translation type="unfinished"></translation>
+ <translation>A máquina virtual atualmente está configurada com menos que <b>%1</b> de memória de vídeo, que seria o mínimo necessário para permitir que vídeo de alta resolução seja reproduzido com eficiência.</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">A máquina virtual está configurada para utilizar a aceleração gráfica por hardware e o tipo de sistema operacional está definido como Windows Vista ou posterior. Para melhor performance você deve definir a memória de vídeo para pelo menos <b>%1</b>.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
- <translation type="unfinished"></translation>
+ <translation>A máquina virtual está configurada para utilizar a aceleração de Video Stream. Este recurso somente funciona com sistemas convidados Windows, logo será desabilitado.</translation>
</message>
<message>
<source>The VRDE server port value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>A porta do servidor VRDE não foi especificada.</translation>
</message>
<message>
<source>The VRDE authentication timeout value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>O timeout para autenticação VRDE não foi especificado.</translation>
</message>
<message>
<source>User Defined</source>
- <translation type="unfinished"></translation>
+ <translation>Definido pelo Usuário</translation>
</message>
<message>
<source>%1 fps</source>
- <translation type="unfinished"></translation>
+ <translation>%1 fps</translation>
</message>
<message>
<source>fps</source>
- <translation type="unfinished"></translation>
+ <translation>fps</translation>
</message>
<message>
<source>low</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>baixa</translation>
</message>
<message>
<source>medium</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>média</translation>
</message>
<message>
<source>high</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>alta</translation>
</message>
<message>
<source>kbps</source>
- <translation type="unfinished"></translation>
+ <translation>kbps</translation>
</message>
<message>
<source>Screen %1</source>
- <translation type="unfinished"></translation>
+ <translation>Tela %1</translation>
</message>
<message>
<source>Enable video recording for screen %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
+ <translation>Habilitar gravação de vídeo para a tela %1.</translation>
</message>
<message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Minibarra de Ferramentas:</translation>
+ <translation type="obsolete">Minibarra de Ferramentas:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Se habilitado, exibe a minibarra de ferramentas enquanto estiver nos modos Tela Cheia ou Seamless.</translation>
+ <translation type="obsolete">Se habilitado, exibe a minibarra de ferramentas enquanto estiver nos modos Tela Cheia ou Seamless.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Exibir nos modos Tela Cheia/Seamless (&F)</translation>
+ <translation type="obsolete">Exibir nos modos Tela Cheia/Seamless (&F)</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">se marcado, exibe a mini barra de ferramentas no topo da tela, ao invés da posição padrão na parte de baixo da tela.</translation>
+ <translation type="obsolete">se marcado, exibe a mini barra de ferramentas no topo da tela, ao invés da posição padrão na parte de baixo da tela.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Exibir No &Topo da Tela</translation>
+ <translation type="obsolete">Exibir No &Topo da Tela</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
- <translation type="unfinished"></translation>
+ <source><i>About %1MB per 5 minute video</i></source>
+ <translation><i>Cerca de %1MB a cada 5 minutos de vídeo</i></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
- <translation type="unfinished"></translation>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <translation>O recurso de Tela de Remota está habilitado para esta máquina virtual. No entanto, este recurso precisa que <i>%1</i> esteja instalado. Baixe e instale o Pacote de Adicionais do site do VirtualBox, caso contrário sua VM será iniciada com o recurso de Tela Remota desabilitado.</translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5610,11 +5791,131 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Nome não especificado para a máquina virtual.</translation>
</message>
<message>
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
- <translation type="unfinished"></translation>
+ <translation>O tipo de sistema operacional para a máquina virtual foi definido para 64 bits. Sistemas convidados de 64 bits necessitam de virtualização de hardware, logo este recurso será habilitado automaticamente caso você confirme as mudanças.</translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation>C&riptografia</translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation>Quando selecionado, habilita a criptografia para esta máquina virtual.</translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation>H&abilitar Criptografia</translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation>Algor&itmo de Criptografia:</translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation>Contém o algoritmo utilizado para criptografar os discos da máquina virtual.</translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation>E&ntre Com a Nova Senha:</translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation>Contém a senha a ser atribuída para a máquina virtual.</translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation>C&onfirme a Nova Senha:</translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation>Confirma a senha atribuída a esta máquina virtual.</translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation>Você está tentando criptografar esta máquina virtual. No entanto, isto requer que <i>%1</i> esteja instalado. Instale o pacote de Adicionais para Convidado do site do VirtualBox.</translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation>Tipo de algoritmo de criptografia não especificado.</translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation>Senha de criptografia vazia.</translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation>As senhas de criptografia não coincidem.</translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation>Não Alterar</translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation>Permite modificar o conteúdo da barra de menu da VM.</translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation>Fator de Escala de Tela:</translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation>Esta configuração determina o fator de escala para a tela do convidado.</translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation>100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation>200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation>HiDPI:</translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation>Quando selecionado, o conteúdo da tela do sistema convidado não será redimensionado para compensar resoluções de tela mais altas no sistema hospedeiro.</translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation>&Utilizar Saída HiDPI Sem Escala</translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation>Minibarra de Ferramentas:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation>Se habilitado, exibe a minibarra de ferramentas enquanto estiver nos modos Tela Cheia ou Seamless.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation>Exibir nos modos Tela Cheia/Seamless (&F)</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation>Se marcado, exibe a mini barra de ferramentas no topo da tela, ao invés da posição padrão na parte de baixo da tela.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation>Exibir no &Topo da Tela</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation>Permite modificar o conteúdo da barra de status da VM.</translation>
</message>
</context>
<context>
@@ -5869,35 +6170,35 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No bridged network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhuma placa de rede em modo bridge foi selecionada.</translation>
</message>
<message>
<source>No internal network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>O nome da rede interna não foi especificado.</translation>
</message>
<message>
<source>No host-only network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhuma placa de rede apenas para hospedeiro (host-only) foi selecionada.</translation>
</message>
<message>
<source>No generic driver is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhum driver genérico foi selecionado.</translation>
</message>
<message>
<source>The MAC address must be 12 hexadecimal digits long.</source>
- <translation type="unfinished"></translation>
+ <translation>O endereço MAC deve ser composto de 12 dígitos hexadecimais.</translation>
</message>
<message>
<source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>O segundo dígito do endereço MAC não pode ser ímpar, pois apenas endereços unicast são permitidos.</translation>
</message>
<message>
<source>No NAT network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>O nome da rede NAT não foi especificado.</translation>
</message>
<message>
<source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
- <translation type="unfinished"></translation>
+ <translation>Contém o nome da rede NAT à qual esta placa de rede será conectada. Você pode criar e remover redes utilizando as configurações globais de rede na janela do gerenciador de máquinas virtuais.</translation>
</message>
</context>
<context>
@@ -6074,23 +6375,23 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhum IRQ foi especificado.</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhuma porta de I/O foi especificada.</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Duas ou mais portas possuem as mesmas configurações.</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>O caminho da porta não foi especificado.</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Existem caminhos de porta duplicados.</translation>
</message>
</context>
<context>
@@ -6311,11 +6612,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Se a opção estiver marcada, o pipe especificado no campo <b>Caminho da Porta</b> será criado pela máquina virtual quando esta for iniciada. Caso contrário, a máquina virtual tentará utilizar o pipe existente.</translation>
+ <translation type="obsolete">Se a opção estiver marcada, o pipe especificado no campo <b>Caminho da Porta</b> será criado pela máquina virtual quando esta for iniciada. Caso contrário, a máquina virtual tentará utilizar o pipe existente.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Criar Pipe</translation>
+ <translation type="obsolete">&Criar Pipe</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -6323,11 +6624,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Exibe o caminho para o pipe da porta serial no hospedeiro quando a porta estiver configurada para o modo <b>Pipe do Hospedeiro</b>, ou o nome do dispositivo serial quando a porta estiver configurada para o modo <b>Dispositivo do Hospedeiro</b>.</translation>
+ <translation type="obsolete">Exibe o caminho para o pipe da porta serial no hospedeiro quando a porta estiver configurada para o modo <b>Pipe do Hospedeiro</b>, ou o nome do dispositivo serial quando a porta estiver configurada para o modo <b>Dispositivo do Hospedeiro</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Porta/Caminho do Arquivo:</translation>
+ <translation type="obsolete">&Porta/Caminho do Arquivo:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -6337,6 +6638,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Exibe o endereço-base de I/O para esta porta serial. Os valores válidos são números na faixa <tt>0</tt> a <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation>Se selecionado, a máquina virtual irá assumir que o pipe ou socket especificado no campo <b>Caminho/Endereço</b> existe e tentará utilizá-lo. Caso contrário, o pipe ou socket será criado pela máquina virtual quando esta for iniciada.</translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation>&Conectar a pipe/socket existente</translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation>Caminho/Endereço (&P):</translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation><p>No modo <b>Pipe do Hospedeiro</b> : Contém o caminho para o pipe da porta serial na máquina hospedeira. Exemplos: "\\.\pipe\myvbox" or "/tmp/myvbox", para sistemas Windows e UNIX, respectivamente.</p><p>No modo <b>Dispositivo do Hospedeiro</b>: Contém o nome do dispositivo serial na máquina hospedeira. Exemplos: "COM1" ou "/dev/ttyS0".</p><p>No modo <b>Arquivo Puro& [...]
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6354,23 +6671,23 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>IRQ não foi especificado.</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Porta de I/O não foi especificada.</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Duas ou mais portas possuem a mesma configuração.</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>O caminho da porta não foi especificado.</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Existem caminhos de porta duplicados.</translation>
</message>
</context>
<context>
@@ -6465,15 +6782,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Adicionar Dispositivo de CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Adicionar Dispositivo de CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Adicionar Dispositivo de Disquete</nobr></translation>
+ <translation type="obsolete"><nobr>Adicionar Dispositivo de Disquete</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
- <translation type="unfinished">Nenhum disco rígido foi selecionado para <i>%1</i>.</translation>
+ <translation>Nenhum disco rígido foi selecionado para <i>%1</i>.</translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -6513,11 +6830,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Adicionar Dispositivo de CD/DVD</translation>
+ <translation type="obsolete">Adicionar Dispositivo de CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Adicionar Dispositivo de Disquete</translation>
+ <translation type="obsolete">Adicionar Dispositivo de Disquete</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6705,15 +7022,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&Drive de CD/DVD:</translation>
+ <translation type="obsolete">&Drive de CD/DVD:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Escolha um disco de CD/DVD virtual ou um drive físico para ser utilizado como drive virtual. A máquina virtual irá enxergar um disco inserido com os dados do arquivo que você selecionar, ou o conteúdo do disco no drive físico selecionado.</translation>
+ <translation type="obsolete">Escolha um disco de CD/DVD virtual ou um drive físico para ser utilizado como drive virtual. A máquina virtual irá enxergar um disco inserido com os dados do arquivo que você selecionar, ou o conteúdo do disco no drive físico selecionado.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Configurar o drive de CD/DVD virtual</translation>
+ <translation type="obsolete">Configurar o drive de CD/DVD virtual</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6737,7 +7054,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Selecione um arquivo de CD/DVD virtual...</translation>
+ <translation type="obsolete">Selecione um arquivo de CD/DVD virtual...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6807,31 +7124,63 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>No name is currently specified for the controller at position <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Nenhum nome foi especificado para a controladora na posição <b>%1</b>.</translation>
</message>
<message>
<source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>A controladora na posição <b>%1</b> possui o mesmo nome da controladora na posição <b>%2</b>.</translation>
</message>
<message>
<source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
- <translation type="unfinished"></translation>
+ <translation><i>%1</i> está utilizando um disco que já estava conectado a <i>%2</i>.</translation>
</message>
<message>
<source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
- <translation type="unfinished"></translation>
+ <translation>A máquina atualmente possui mais armazenamento configurado que o chipset %1 suporta. Altere o tipo do chipset na página de configuração de Sistema ou reduza a quantidade de controladoras de armazenamento na página de Armazenamento: %2</translation>
</message>
<message>
<source>Add USB Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Acrescentar Controladora USB</translation>
</message>
<message>
<source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
- <translation type="unfinished"></translation>
+ <translation>Quando selecionado, o sistema convidado irá ver o disco virtual como um dispositivo hot-plug.</translation>
</message>
<message>
<source>&Hot-pluggable</source>
- <translation type="unfinished"></translation>
+ <translation>&Hot-plug</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation>Selecione um arquivo de disco óptico virtual...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation><nobr>Acrescentar Disco Óptico</nobr></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation><nobr>Acrescentar Drive de Disquete</nobr></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation>Acrescentar Drive Óptico</translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation>Acrescentar Drive de Disquete</translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation>&Drive Óptico:</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation>Escolha um disco óptico virtual ou físico para utilizar como drive virtual. A máquina virtual irá ver um disco inserido no drive com os dados contidos no arquivo ou no disco do drive físico como seu conteúdo.</translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation>Configurar o drive óptico virtual</translation>
</message>
</context>
<context>
@@ -7059,55 +7408,55 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Pointing Device:</source>
- <translation type="unfinished"></translation>
+ <translation>Dispositivo de A&pontador:</translation>
</message>
<message>
<source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
- <translation type="unfinished"></translation>
+ <translation>Deterimina se o dispositivo de apontador emulado é um mouse padrão PS/2, um tablet USB ou um tablet USB multitouch.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>Mais de <b>%1%</b> da memória do sistema hospedeiro (<b>%2</b>) está configurada para a máquina virtual. Desta maneira, não sobrará memória suficiente para o sistema operacional hospedeiro. Selecione um valor menor.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>Mais de <b>%1%</b> da memória do computador hospedeiro (<b>%2</b>) está configurada para a máquina virtual. Pode não haver memória suficiente para o sistema operacional do hospedeiro. Reduza a quantidade de memória definida.</translation>
</message>
<message>
<source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>Por razões de performance, a quantidade de CPUs virtuais conectadas à máquina virtual não pode ser superior ao dobro da quantidade de CPUs físicas no hospedeiro (<b>%1</b>). Reduza a quantidade de CPUs virtuais.</translation>
</message>
<message>
<source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>Mais CPUs virtuais estão configuradas para a máquina virtual do que a quantidade de CPUs físicas disponíveis na máquina hospedeira (<b>%1</b>). Isto pode degradar consideravelmente a performance da sua máquina virtual. Reduza a quantidade de CPUs virtuais.</translation>
</message>
<message>
<source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
- <translation type="unfinished"></translation>
+ <translation>O limite de processamento está definido para um valor muito baixo. Isto pode tornar a máquina muito lenta para responder.</translation>
</message>
<message>
<source>&Paravirtualization Interface:</source>
- <translation type="unfinished"></translation>
+ <translation>Interface de ¶virtualização:</translation>
</message>
<message>
<source>Selects the paravirtualization guest interface provider to be used by this virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Seleciona o provedor da interface de paravirtualização a ser utilizada para o sistema convidado.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9 you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>O recurso de I/O APIC não está habilitado na seção Placa Mãe da página Sistema. Isto é necessário para suportar o tipo de chipset ICH9 que foi habilitado para esta VM. Isto será feito automaticamente caso você confirme as mudanças.</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>A emulação da controladora USB não está habilitada na página USB. Isto é necessário para suportar um dispositivo de entrada USB emulado que você habilitou para esta VM. Isto será feito automaticamente se confirmar as mudanças.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>O recurso de I/O APIC não está habilitado na seção Placa Mãe da página Sistema. Isto é necessário para suportar mais de um processador virtual, que foi habilitado para esta VM. Isto será feito automaticamente caso você confirme as mudanças.</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>O recurso de Virtualização de Hardware não está habilitado na seção Aceleração da página Sistema. Isto é necessário para suportar mais de um processador virtual, que foi habilitado para esta VM. Isto será feito automaticamente caso você confirme as mudanças.</translation>
</message>
</context>
<context>
@@ -7242,28 +7591,28 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">A USB 2.0 está habilitada para esta máquina virtual. No entanto, isto requer que <b>%1</b> esteja instalado. Instale o Pacote de Extensões no site do VirtualBox. Após instalar, será necessário habilitar novamente a USB 2.0 nesta máquina virtual. Por enquanto este recurso será desabilitado, a menos que você cancele suas mudanças.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>Quando selecionado, habilita a controladora virtual USB OHCI para esta máquina. A controladora USB OHCI fornece suporte a USB 1.0.</translation>
</message>
<message>
<source>USB &1.1 (OHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Controladora USB &1.1 (OHCI)</translation>
</message>
<message>
<source>USB &2.0 (EHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Controladora USB &2.0 (EHCI)</translation>
</message>
<message>
<source>When checked, enables the virtual USB xHCI controller of this machine. The USB xHCI controller provides USB 3.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>Quando selecionado, habilita a controladora virtual USB xHCI para esta máquina. A controladora USB xHCI fornece suporte a USB 3.0.</translation>
</message>
<message>
<source>USB &3.0 (xHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>Controladora USB &3.0 (xHCI)</translation>
+ </message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation>O suporte a USB 2.0/3.0 está habilitado para esta máquina virtual. No entanto, isto requer que <i>%1</i> esteja instalado. Baixe e instale o Extension Pack no site do VirtualBox ou desabilite o USB 2.0/3.0 para poder iniciar esta máquina.</translation>
</message>
</context>
<context>
@@ -7406,7 +7755,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Removing medium...</source>
- <translation type="unfinished"></translation>
+ <translation>Removendo mídia...</translation>
</message>
</context>
<context>
@@ -7428,15 +7777,23 @@ p, li { white-space: pre-wrap; }
<name>UIMenuBarEditorWidget</name>
<message>
<source>Virtual Screen Resize</source>
- <translation type="unfinished"></translation>
+ <translation>Redimensionar Tela Virtual</translation>
</message>
<message>
<source>Virtual Screen Mapping</source>
- <translation type="unfinished"></translation>
+ <translation>Mapeamento de Tela Virtual</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Fechar</translation>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Switch</source>
+ <translation>Trocar</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation>Habilitar Barra de Menu</translation>
</message>
</context>
<context>
@@ -7492,7 +7849,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Falha ao criar o objeto COM do VirtualBox.</p><p>A aplicação será finalizada.</p></translation>
+ <translation type="obsolete"><p>Falha ao criar o objeto COM do VirtualBox.</p><p>A aplicação será finalizada.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -8108,7 +8465,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Uma nova versão do VirtualBox foi lançada! A versão <b>%1</b> está disponível em <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Você pode baixá-la diretamente através deste link:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Uma nova versão do VirtualBox foi lançada! A versão <b>%1</b> está disponível em <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Você pode baixá-la diretamente através deste link:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -8208,7 +8565,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Um ou mais discos rígidos virtuais, mídias de CD/DVD ou disquete registrados não estão acessíveis. Portanto, você não poderá operar máquinas virtuais que utilizem estas mídias até que elas estejam acessíveis.</p><p>Pressione <b>OK</b> para abrir a janela do Gerenciador de Mídias Virtuais e verificar quais mídias estão inacessíveis, ou pressione <b>Ignorar</b> para ignorar esta mensagem.</p></translation>
+ <translation type="obsolete"><p>Um ou mais discos rígidos virtuais, mídias de CD/DVD ou disquete registrados não estão acessíveis. Portanto, você não poderá operar máquinas virtuais que utilizem estas mídias até que elas estejam acessíveis.</p><p>Pressione <b>OK</b> para abrir a janela do Gerenciador de Mídias Virtuais e verificar quais mídias estão inacessíveis, ou pressione <b>Ignorar</b> para ignorar esta mensagem.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -8239,7 +8596,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Um erro crítico ocorreu enquanto a máquina virtual estava em execução e por isto a execução foi interrompida.</p><p>Para ajuda, consulte a seção Comunidade no endereço <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ou utilize os recursos disponibilizados por seu contrato de suporte. Por favor forneça o conteúdo do arquivo de log <tt>VBox.log</tt> e o arquivo de imagem <tt>VBox.png</tt>, os quai [...]
+ <translation type="obsolete"><p>Um erro crítico ocorreu enquanto a máquina virtual estava em execução e por isto a execução foi interrompida.</p><p>Para ajuda, consulte a seção Comunidade no endereço <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ou utilize os recursos disponibilizados por seu contrato de suporte. Por favor forneça o conteúdo do arquivo de log <tt>VBox.log</tt> e o arquivo de imagem <tt>VBox.png< [...]
</message>
<message>
<source>hard disk</source>
@@ -8522,7 +8879,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Você tem certeza de que deseja remover o dispositivo de CD/DVD?</p><p>Você não poderá ler nenhum CD, montar imagens ISO ou instalar os Adicionais para Convidado sem ele!</p></translation>
+ <translation type="obsolete"><p>Você tem certeza de que deseja remover o dispositivo de CD/DVD?</p><p>Você não poderá ler nenhum CD, montar imagens ISO ou instalar os Adicionais para Convidado sem ele!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8625,7 +8982,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Você está prestes a acrescentar um drive de CD/DVD à controladora <b>%1</b>. Gostaria de escolher um disco virtual de CD/DVD para inserir no drive ou deseja deixá-lo vazio por enquanto?</p></translation>
+ <translation type="obsolete"><p>Você está prestes a acrescentar um drive de CD/DVD à controladora <b>%1</b>. Gostaria de escolher um disco virtual de CD/DVD para inserir no drive ou deseja deixá-lo vazio por enquanto?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8647,11 +9004,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Falha ao desconectar o dispositivo de CD/DVD (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
+ <translation type="obsolete">Falha ao desconectar o dispositivo de CD/DVD (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Falha ao desconectar o dispositivo de disquete (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
+ <translation type="obsolete">Falha ao desconectar o dispositivo de disquete (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -8702,11 +9059,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Falha ao conectar o dispositivo de CD/DVD (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
+ <translation type="obsolete">Falha ao conectar o dispositivo de CD/DVD (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Falha ao conectar o dispositivo de disquete (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
+ <translation type="obsolete">Falha ao conectar o dispositivo de disquete (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8956,7 +9313,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Falha ao descartar dados.</translation>
+ <translation type="obsolete">Falha ao descartar dados.</translation>
</message>
<message>
<source>&Network Operations Manager...</source>
@@ -9048,247 +9405,335 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Não é possível iniciar o Gerenciador do VirtualBox por restrições locais.</p><p>A aplicação será fechada agora.</p></translation>
</message>
<message>
<source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Não foi possível encontrar um arquivo de tradução para o idioma <b>%1</b> no diretório <b><nobr>%2</nobr></b>.</p><p>O idioma será temporariamente definido para o idioma padrão do sistema. Abra a janela de <b>Preferências</b> a partir do menu <b>Arquivo</b> na janela do Gerenciador do VirtualBox, e selecione um dos idiomas existentes na página <b>Idiomas</b>.</p></translation>
</message>
<message>
<source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Não foi possível encontrar o arquivo de tradução <b><nobr>%1</nobr></b>. <p>O idioma será temporariamente definido para English (built-in). Abra a janela <b>Preferências</b> a partir do menu <b>Arquivo</b> na janela do Gerenciador do VirtualBox, e selecione um dos idiomas existentes na página <b>Idiomas</b>.</p></translation>
</message>
<message>
<source>There is no virtual machine with the identifier <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Não existe máquina virtual com o identificador <b>%1</b>.</translation>
</message>
<message>
<source>Ignore</source>
- <translation type="unfinished">Ignorar</translation>
+ <translation>Ignorar</translation>
</message>
<message>
<source>Failed to create NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao criar a rede NAT.</translation>
</message>
<message>
<source>Failed to remove NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao remover a rede NAT <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create DHCP server.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao criar o servidor DHCP.</translation>
</message>
<message>
<source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao remover o servidor DHCP para a placa de rede <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create the host network interface.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao criar a placa de rede do hospedeiro.</translation>
</message>
<message>
<source>Create &new disk</source>
- <translation type="unfinished">&Criar novo disco</translation>
+ <translation>&Criar novo disco</translation>
</message>
<message>
<source>&Choose existing disk</source>
- <translation type="unfinished">Utilizar disco rígido existente (&C)</translation>
+ <translation>Utilizar disco rígido existente (&C)</translation>
</message>
<message>
<source>Leave &empty</source>
- <translation type="unfinished">D&eixar vazio</translation>
+ <translation>D&eixar vazio</translation>
</message>
<message>
<source>&Choose disk</source>
- <translation type="unfinished">Es&colher disco</translation>
+ <translation>Es&colher disco</translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você tem certeza de que deseja liberar o disco rígido virtual <nobr><b>%1</b></nobr>?</p><p>Esta ação irá desconectá-lo das seguintes máquinas virtuais:<b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você tem certeza de que deseja liberar o disco óptico virtual <nobr><b>%1</b></nobr>?</p><p>Esta ação irá desconectá-lo das seguintes máquinas virtuais:<b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você tem certeza de que deseja liberar o disquete virtual <nobr><b>%1</b></nobr>?</p><p>Esta ação irá desconectá-lo das seguintes máquinas virtuais:<b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você tem certeza de que deseja remover o disco rígido <nobr><b>%1</b></nobr> da lista de imagens de disco conhecidas?</p></translation>
</message>
<message>
<source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Como este disco rígido está inacessível, seu arquivo de imagem correspondente não pode ser apagado.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você tem certeza de que deseja remover o disco óptico virtual <nobr><b>%1</b></nobr> da lista de imagens de disco conhecidas?</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você tem certeza de que deseja remover o disquete virtual <nobr><b>%1</b></nobr> da lista de imagens de disco conhecidas?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Falha ao inserir o disco óptico virtual <nobr><b>%1</b></nobr> na máquina <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force insertion of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você gostaria de forçar a inserção deste disco?</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Falha ao ejetar o disco óptico virtual <nobr><b>%1</b></nobr> da máquina <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force ejection of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você gostaria de forçar a ejeção deste disco?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Falha ao inserir o disquete virtual <nobr><b>%1</b></nobr> na máquina <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Falha ao ejetar o disquete virtual <nobr><b>%1</b></nobr> da máquina <b>%2</b>.</p></translation>
</message>
<message>
<source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao abrir o arquivo de disco rígido <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao abrir o arquivo de disco óptico <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao abrir o arquivo de disquete <nobr><b>%1</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao fechar o arquivo de disco rígido <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao fechar o arquivo de disco óptico <nobr><b>%2</b></nobr>.</translation>
</message>
<message>
<source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao fechar o arquivo de disquete <nobr><b>%2</b></nobr>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
<comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
- <translation type="unfinished">
- <numerusform></numerusform>
- <numerusform></numerusform>
+ <translation>
+ <numerusform><p>A seguinte %n máquina virtual atualmente possui o estado salvo: <b>%1</b></p><p>Se você continuar, o estado salvo das máquina exportada será descartado. As outras máquinas não serão afetadas.</p></numerusform>
+ <numerusform><p>As seguintes %n máquinas virtuais atualmente possuem o estado salvo: <b>%1</b></p><p>Se você continuar, o estado salvo das máquinas exportadas será descartado. As outras máquinas não serão afetadas.</p></numerusform>
</translation>
</message>
<message>
<source>Switch</source>
- <translation type="unfinished">Trocar</translation>
+ <translation>Trocar</translation>
</message>
<message>
<source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao habilitar o servidor de desktop remoto para a máquina virtual <b>%1</b>.</translation>
</message>
<message>
<source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao desabilitar o servidor de desktop remoto para a máquina virtual <b>%1</b>.</translation>
</message>
<message>
<source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao habilitar a captura de vídeo para a máquina virtual <b>%1</b>.</translation>
</message>
<message>
<source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao desabilitar a captura de vídeo para a máquina virtual <b>%1</b>.</translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Não foi possível encontrar o arquivo de imagem de disco dos <b>Adicionais para Convidado do VirtualBox</b>.</p><p>Deseja baixar este arquivo de imagem da internet?</p></translation>
</message>
<message>
<source>Download</source>
- <translation type="unfinished">Baixar</translation>
+ <translation>Baixar</translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você tem certeza de que deseja baixar a imagem de disco dos <b>Adicionais para Convidado do VirtualBox</b> a partir de <nobr><a href="%1">%1</a></nobr> (tamanho %2 bytes)?</p></translation>
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>O arquivo de imagem de disco dos <b>Adicionais para Convidado do VirtualBox</b> foi baixado com sucesso a partir de <nobr><a href="%1">%1</a></nobr> mas não pode ser salvo localmente como <nobr><b>%2</b>.</nobr></p><p>Escolha outro local para salvar este arquivo.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Não foi possível encontrar o <b>Manual do Usuário do VirtualBox</b> <nobr><b>%1</b>.</nobr></p><p>Deseja baixar este arquivo da internet?</p></translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você tem certeza de que deseja baixar o <b>Manual do Usuário do VirtualBox</b> a partir de <nobr><a href="%1">%1</a></nobr> (tamanho %2 bytes)?</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"><p>O Manual do Usuário do VirtualBox foi baixado com sucesso a partir de <nobr><a href="%1">%2</a></nobr> mas não pode ser gravado localmente como <nobr><b>%3</b>.</nobr></p><p>Escolha o local para onde deseja copiar este arquivo.</p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>O Manual do Usuário do VirtualBox foi baixado com sucesso a partir de <nobr><a href="%1">%1</a></nobr> mas não pode ser gravado localmente como <nobr><b>%2</b>.</nobr></p><p>Escolha outro local para salvar este arquivo.</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
- <translation type="unfinished"><p>O Manual do Usuário do VirtualBox foi baixado com sucesso a partir de <nobr><a href="%1">%2</a></nobr> e gravado localmente como <nobr><b>%3</b>.</nobr></p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>O Manual do Usuário do VirtualBox foi baixado com sucesso a partir de <nobr><a href="%1">%1</a></nobr> e salvo localmente como <nobr><b>%2</b>.</nobr></p></translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Fechar</translation>
+ <translation>Fechar</translation>
</message>
<message>
<source>Ok</source>
- <translation type="unfinished">Ok</translation>
+ <translation>Ok</translation>
</message>
<message>
<source>Do not show this message again</source>
- <translation type="unfinished">Não mostrar esta mensagem novamente</translation>
+ <translation>Não mostrar esta mensagem novamente</translation>
</message>
<message>
<source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Você deseja remover a rede NAT <nobr><b>%1</b>?</nobr></p><p>Caso esta rede esteja sendo usada por uma ou mais placas de rede, estas placas de rede não poderão ser utilizadas até que suas configurações sejam alteradas, seja para utilizar outro nome de rede ou um tipo de conexão diferente.</p></translation>
</message>
<message>
<source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao conectar a webcam <b>%1</b> à máquina virtual <b>%2</b>.</translation>
</message>
<message>
<source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>Falha ao desconectar a webcam <b>%1</b> da máquina virtual <b>%2</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"></translation>
+ <translation><p>Os Adicionais para Convidado não estão disponíveis nesta máquina virtual, e portanto não é possível utilizar o recurso de pastas compartilhadas. Para utilizar pastas compartilhadas dentro da máquina virtual, instale os Adicionais para Convidado, ou instale-os novamente caso não estejam funcionando corretamente. Para fazer isto, selecione a opção <b>Instalar Adicionais para Convidado</b> no menu <b>Dispositivos</b>. Caso já esteja inst [...]
</message>
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished"></translation>
+ <translation>Inserir</translation>
</message>
<message>
<source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>A tela virtual está configurada para o modo de cores <b>%1 bit</b>. Para melhor performance, configure-a para utilizar <b>%2 bit</b>. Isto pode ser feito na seção <b>Tela</b> do Painel de Controle ou Configurações do Sistema do sistema operacional convidado.</p></translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Rule names should be unique.</source>
- <translation type="unfinished"></translation>
+ <translation>As regras atuais de redirecionamento de portas não são válidas. Os nomes das regras precisam ser únicos.</translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
+ <translation>As regras atuais de redirecionamento de portas não são válidas. Algumas das regras possuem endereços IP e portas conflitantes.</translation>
+ </message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation><p>Falha ao criar o objeto COM do VirtualBoxClient.</p><p>A aplicação será finalizada agora.</p></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation>Falha ao definir os dados extras globais do VirtualBox da chave <i>%1</i> para o valor <i>{%2}</i>.</translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation>Falha ao definir os dados extras da chave <i>%1</i> da máquina <i>%2</i> para o valor <i>{%3}</i>.</translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation><p>Um ou mais arquivos de imagem de discos virtuais rígidos, ópticos, ou de disquete não estão acessíveis. Portanto, você não poderá operar máquinas virtuais que utilizem estes arquivos até que estes estejam acessíveis.</p><p>Pressione <b>Verificar</b> para abrir a janela do Gerenciador de Mídias Virtuais e verificar quais arquivos estão inacessíveis, ou pressione <b>Ignorar</b> para ignorar esta mensagem.</p></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation>Falha ao gravar as configurações.</translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation><p>Você está prestes a acrescentar um drive óptico à controladora <b>%1</b>. Gostaria de escolher um disco óptico virtual para inserir no drive ou deseja deixá-lo vazio por enquanto?</p></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation><p>Você tem certeza de que deseja remover o drive óptico?</p><p>Você não poderá inserir nenhum disco óptico, imagens ISO ou instalar os Adicionais para Convidado sem ele!</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Falha ao conectar o drive óptico (<nobr><b>%1</b></nobr>) ao slot <i>%2</i> da máquina <b>%3</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Falha ao conectar o drive de disquete (<nobr><b>%1</b></nobr>) ao slot <i>%2</i> da máquina <b>%3</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Falha ao desconectar o drive óptico (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>Falha ao desconectar o drive de disquete (<nobr><b>%1</b></nobr>) do slot <i>%2</i> da máquina <b>%3</b>.</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this er [...]
+ <translation type="obsolete"><p>Um erro crítico ocorreu durante a execução da máquina virtual e sua execução deve ser interrompida.</p><p>Para ajuda, consulte a seção Comunidade em <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> ou o seu contrato de suporte. Forneça o conteúdo do arquivo de log <tt>VBox.log</tt>, que pode ser encontrado no diretório da máquina virtual, assim como uma descrição do que você estava fazendo qu [...]
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>Falha ao conectar o cabo de rede da máquina virtual <b>%1</b>.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>Falha ao desconectar o cabo de rede da máquina virtual <b>%1</b>.</translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation><p>Não foi possível inserir o arquivo de imagem de disco dos <b>Adicionais para Convidado do VirtualBox</b> na máquina virtual <b>%1</b>, pois a máquina não possui nenhum drive óptico. Acrescente um drive óptico utilizando a página de armazenamento na janela de configurações da máquina virtual.</p></translation>
+ </message>
+ <message>
+ <source>Unable to enter password!</source>
+ <translation type="obsolete">Não foi possível entrar com a senha!</translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation><p>O arquivo de imagem de disco dos <b>Adicionais para Convidado do VirtualBox</b> foi baixado com sucesso a partir de <nobr><a href="%1">%1</a></nobr> e salvo localmente como <nobr><b>%2</b>.</nobr></p><p>Você deseja registrar este arquivo de imagem de disco e inseri-lo no drive óptico virtual?</p></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -9352,19 +9797,19 @@ p, li { white-space: pre-wrap; }
<name>UIMiniToolBar</name>
<message>
<source>Always show the toolbar</source>
- <translation type="unfinished">Sempre exibir a barra de ferramentas</translation>
+ <translation>Sempre exibir a barra de ferramentas</translation>
</message>
<message>
<source>Minimize Window</source>
- <translation type="unfinished">Minimizar Janela</translation>
+ <translation>Minimizar Janela</translation>
</message>
<message>
<source>Exit Full Screen or Seamless Mode</source>
- <translation type="unfinished">Sair da Tela Cheia ou Modo Seamless</translation>
+ <translation>Sair da Tela Cheia ou Modo Seamless</translation>
</message>
<message>
<source>Close VM</source>
- <translation type="unfinished">Fechar VM</translation>
+ <translation>Fechar VM</translation>
</message>
</context>
<context>
@@ -9476,7 +9921,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The network operation failed with the following error: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>A operação de rede falhou com o seguinte erro: %1.</translation>
</message>
</context>
<context>
@@ -9503,27 +9948,27 @@ p, li { white-space: pre-wrap; }
<name>UINetworkReplyPrivate</name>
<message>
<source>Host not found</source>
- <translation type="unfinished"></translation>
+ <translation>Servidor não encontrado</translation>
</message>
<message>
<source>Content access denied</source>
- <translation type="unfinished"></translation>
+ <translation>Acesso negado ao conteúdo</translation>
</message>
<message>
<source>Protocol failure</source>
- <translation type="unfinished"></translation>
+ <translation>Falha de protocolo</translation>
</message>
<message>
<source>Wrong SSL certificate format</source>
- <translation type="unfinished"></translation>
+ <translation>Formato de certificado SSL incorreto</translation>
</message>
<message>
<source>SSL authentication failed</source>
- <translation type="unfinished"></translation>
+ <translation>Falha na autenticação SSL</translation>
</message>
<message>
<source>Unknown reason</source>
- <translation type="unfinished"></translation>
+ <translation>Razão desconhecida</translation>
</message>
</context>
<context>
@@ -10443,7 +10888,7 @@ utilizando o diálogo de Configurações da MV.</p></translation>
<name>UIPopupCenter</name>
<message>
<source>Click for full details</source>
- <translation type="unfinished"></translation>
+ <translation>Clique para mais detalhes</translation>
</message>
</context>
<context>
@@ -10578,13 +11023,17 @@ utilizando o diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Bem-Vindo ao VirtualBox!</h3><p>A parte esquerda desta janela mostra uma lista de todas as máquinas virtuais disponíveis em seu computador. A lista está vazia agora porque você ainda não criou nenhuma máquina virtual.<img src=:/welcome.png align=right/></p><p>Para criar uma nova máquina virtual, pressione o botão <b>Novo</b> na barra de ferramentas principal, localizada no topo da janela.</p><p>Você pode [...]
+ <translation type="obsolete"><h3>Bem-Vindo ao VirtualBox!</h3><p>A parte esquerda desta janela mostra uma lista de todas as máquinas virtuais disponíveis em seu computador. A lista está vazia agora porque você ainda não criou nenhuma máquina virtual.<img src=:/welcome.png align=right/></p><p>Para criar uma nova máquina virtual, pressione o botão <b>Novo</b> na barra de ferramentas principal, localizada no topo da janela.</p>&l [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Gerenciador</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -10617,15 +11066,15 @@ utilizando o diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source>Settings</source>
- <translation>Configurações</translation>
+ <translation type="obsolete">Configurações</translation>
</message>
<message>
<source><b>%1</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation>página <b>%1</b>:</translation>
</message>
<message>
<source><b>%1: %2</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation>página <b>%1: %2</b>:</translation>
</message>
</context>
<context>
@@ -10670,6 +11119,10 @@ utilizando o diálogo de Configurações da MV.</p></translation>
<source>Display</source>
<translation>Tela</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10745,19 +11198,43 @@ utilizando o diálogo de Configurações da MV.</p></translation>
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">você está utilizando mais controladoras de armazenamento que o chipset %1 suporta. Altere o tipo de chipset na página de Configurações do Sistema ou reduza a quantidade das seguintes controladoras de armazenamento na página de Configurações de Armazenamento: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation>Interface do Usuário</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Configurações</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation>Carregando Configurações...</translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation>Salvando Configurações...</translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
<message>
<source><nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr></source>
- <translation type="unfinished"></translation>
+ <translatorcomment>O warning de accelerator é falso.</translatorcomment>
+ <translation><nobr><b>Clique</b> para chavear a presença dos indicadores.</nobr><br><nobr><b>Arraste e solte</b>para mudar a posição do indicador.</nobr></translation>
</message>
</context>
<context>
<name>UIStatusBarEditorWidget</name>
<message>
<source>Close</source>
- <translation type="unfinished">Fechar</translation>
+ <translation>Fechar</translation>
+ </message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation>Habilitar Barra de Status</translation>
</message>
</context>
<context>
@@ -10941,11 +11418,11 @@ utilizando o diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source>&Continue running in the background</source>
- <translation type="unfinished"></translation>
+ <translation>&Continuar executando em background</translation>
</message>
<message>
<source><p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Ao fechar as janelas das máquinas virtuais, elas continuarão em execução.</p><p>Você pode utilizar o Gerenciador do VirtualBox para recuperar a janela da máquina virtual posteriormente.</p></translation>
</message>
</context>
<context>
@@ -11163,19 +11640,23 @@ utilizando o diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Modo Arrastar e Soltar</translation>
+ <translation type="obsolete">Modo Arrastar e Soltar</translation>
</message>
<message>
<source>Configuration &Details</source>
- <translation type="unfinished"></translation>
+ <translation>&Detalhes de Configuração</translation>
</message>
<message>
<source>&Runtime Information</source>
- <translation type="unfinished"></translation>
+ <translation>Informações de &Runtime</translation>
</message>
<message>
<source>VM Uptime</source>
- <translation type="unfinished"></translation>
+ <translation>Uptime da VM</translation>
+ </message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation>Modo Arrastar e Soltar</translation>
</message>
</context>
<context>
@@ -11369,19 +11850,19 @@ utilizando o diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source>&Expert Mode</source>
- <translation type="unfinished"></translation>
+ <translation>Modo &Expert</translation>
</message>
<message>
<source>Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users.</source>
- <translation type="unfinished"></translation>
+ <translation>Alterna para o <nobr><b>Modo Expert</b></nobr>, um diálogo de uma página para usuários experientes.</translation>
</message>
<message>
<source>&Guided Mode</source>
- <translation type="unfinished"></translation>
+ <translation>Modo &Guiado</translation>
</message>
<message>
<source>Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations.</source>
- <translation type="unfinished"></translation>
+ <translation>Alterna para o <nobr><b>Modo Guiado</b></nobr>, um diálogo passo-a-passo com explicações detalhadas.</translation>
</message>
</context>
<context>
@@ -11711,39 +12192,39 @@ utilizando o diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source>Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>Configurações de armazenamento</translation>
</message>
<message>
<source>Please choose a file to export the virtual appliance to</source>
- <translation type="unfinished"></translation>
+ <translation>Escolha um arquivo para exportar o appliance virtual</translation>
</message>
<message>
<source>F&ormat:</source>
- <translation type="unfinished"></translation>
+ <translation>F&ormato:</translation>
</message>
<message>
<source>OVF 0.9</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 0.9</translation>
</message>
<message>
<source>OVF 1.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 1.0</translation>
</message>
<message>
<source>OVF 2.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 2.0</translation>
</message>
<message>
<source>Write in standard OVF 1.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>Gravar no formato padrão OVF 1.0.</translation>
</message>
<message>
<source>Write in new experimental OVF 2.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>Gravar no formato experimental OVF 2.0.</translation>
</message>
<message>
<source>&Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>Configuraçõe&s de armazenamento</translation>
</message>
</context>
<context>
@@ -11762,14 +12243,14 @@ utilizando o diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>Escolha um arquivo para exportar o appliance virtual...</translation>
</message>
</context>
<context>
<name>UIWizardExportAppPageExpert</name>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>Escolha um arquivo para exportar o appliance virtual...</translation>
</message>
</context>
<context>
@@ -11839,15 +12320,15 @@ utilizando o diálogo de Configurações da MV.</p></translation>
</message>
<message>
<source>Import Virtual Appliance</source>
- <translation type="unfinished"></translation>
+ <translation>Importar Appliance Virtual</translation>
</message>
<message>
<source>Choose a virtual appliance file to import...</source>
- <translation type="unfinished"></translation>
+ <translation>Escolha um arquivo para importar o appliance virtual...</translation>
</message>
<message>
<source>Please choose a virtual appliance file to import</source>
- <translation type="unfinished"></translation>
+ <translation>Escolha um arquivo para importar o appliance virtual</translation>
</message>
</context>
<context>
@@ -13251,7 +13732,7 @@ Versão %1</translation>
</message>
<message>
<source>Choose...</source>
- <translation type="unfinished"></translation>
+ <translation>Escolher...</translation>
</message>
</context>
<context>
@@ -13310,7 +13791,7 @@ Versão %1</translation>
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished"></translation>
+ <translation>O valor padrão real do caminho será exibido após aceitar as mudanças e abrir este diálogo novamente.</translation>
</message>
</context>
<context>
@@ -13675,7 +14156,7 @@ Versão %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -14559,17 +15040,17 @@ Versão %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>A conexão deste disco rígido será feita indiretamente utilizando um disco rígido diferencial adicional.</translation>
+ <translation type="obsolete">A conexão deste disco rígido será feita indiretamente utilizando um disco rígido diferencial adicional.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Algumas das mídias neste disco rígido estão inacessíveis. Utilize o Gerenciador de Discos Virtuais no modo <b>Exibir Discos Rígidos Diferenciais</b> para inspecionar estas mídias.</translation>
+ <translation type="obsolete">Algumas das mídias neste disco rígido estão inacessíveis. Utilize o Gerenciador de Discos Virtuais no modo <b>Exibir Discos Rígidos Diferenciais</b> para inspecionar estas mídias.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Este disco rígido de base está indiretamente conectado através do seguinte disco rígido diferencial:</translation>
+ <translation type="obsolete">Este disco rígido de base está indiretamente conectado através do seguinte disco rígido diferencial:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -14615,7 +15096,7 @@ Versão %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -15175,111 +15656,200 @@ Versão %1</translation>
<translation>Escolha a localização para o arquivo contendo o novo disco rígido virtual</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Execução Sem Limites</translation>
</message>
<message>
<source>PS/2 Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Mouse PS/2</translation>
</message>
<message>
<source>USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Mouse USB</translation>
</message>
<message>
<source>PS/2 and USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Mouse PS/2 e USB</translation>
</message>
<message>
<source>Unrestricted Execution</source>
- <translation type="unfinished"></translation>
+ <translation>Execução Sem Limites</translation>
</message>
<message>
<source>USB Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tablet USB</translation>
</message>
<message>
<source>USB Multi-Touch Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>Tablet USB Multi-Touch</translation>
</message>
<message>
<source>NAT Network</source>
<comment>NetworkAttachmentType</comment>
- <translation type="unfinished"></translation>
+ <translation>Rede NAT</translation>
</message>
<message>
<source>NAT network, '%1'</source>
<comment>details report (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>Rede NAT, '%1'</translation>
</message>
<message>
<source>You can create or add disk image files in the virtual machine settings.</source>
- <translation type="unfinished"></translation>
+ <translation>Você pode criar ou acrescentar imagens de discos utilizando as configurações da máquina virtual.</translation>
</message>
<message>
<source>USB</source>
<comment>StorageControllerType</comment>
- <translation type="unfinished">USB</translation>
+ <translation>USB</translation>
</message>
<message>
<source>USB Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished"></translation>
+ <translation>Porta USB %1</translation>
</message>
<message>
<source>off</source>
<comment>guest monitor status</comment>
- <translation type="unfinished"></translation>
+ <translation>desligado</translation>
</message>
<message>
<source>Paravirtualization Interface</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Interface de paravirtualização</translation>
</message>
<message>
<source>None</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Nenhuma</translation>
</message>
<message>
<source>Default</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished">Padrão</translation>
+ <translation>Padrão</translation>
</message>
<message>
<source>Legacy</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Legado</translation>
</message>
<message>
<source>Minimal</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Mínima</translation>
</message>
<message>
<source>Hyper-V</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V</translation>
</message>
<message>
<source>New dynamically allocated storage</source>
<comment>MediumVariant</comment>
+ <translation>Novo armazenamento dinamicamente alocado</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>Ativo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>Inativo</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>Ativo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>Inativo</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>Ativo</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>Inativo</translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Criando Snapshot</translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Criando Snapshot Online</translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation>KVM</translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation>Óptico</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>OHCI</translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>EHCI</translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>xHCI</translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation>Interface do Usuário</translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation>(Drive Óptico)</translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation>A conexão deste disco rígido será feita indiretamente utilizando um novo disco rígido diferencial.</translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation>Alguns dos arquivos nesta cadeia de discos rígidos estão inacessíveis. Utilize o Gerenciador de Mídias Virtuais para inspecionar estes arquivos.</translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation>Este disco rígido de base está indiretamente conectado através do seguinte disco rígido diferencial:</translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
<translation type="unfinished"></translation>
</message>
</context>
@@ -16158,6 +16728,10 @@ to the system default language.</qt>
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Criar um novo disco rígido virtual</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation>UUID:</translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
index 749997c..2725ea1 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts
@@ -307,7 +307,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Mod trans*parent</translation>
+ <translation type="unfinished">Mod trans*parent</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -331,11 +331,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Dezactivează integrarea &mouse</translation>
+ <translation type="obsolete">Dezactivează integrarea &mouse</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Dezactivează temporar intergrarea mouse</translation>
+ <translation type="obsolete">Dezactivează temporar intergrarea mouse</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -347,11 +347,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Inserează Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&Inserează Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Trimite secvența Ctrl-Alt-Del către mașina virtuală</translation>
+ <translation type="obsolete">Trimite secvența Ctrl-Alt-Del către mașina virtuală</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -359,7 +359,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Trimite secvența Ctrl-Alt-Backspace către mașina virtuală</translation>
+ <translation type="obsolete">Trimite secvența Ctrl-Alt-Backspace către mașina virtuală</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -427,15 +427,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Dispozitive &CD/DVD</translation>
+ <translation type="obsolete">Dispozitive &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Unități de &dischetă</translation>
+ <translation type="obsolete">Unități de &dischetă</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Dispozitive &USB</translation>
+ <translation type="obsolete">Dispozitive &USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -486,7 +486,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">Jurna&lizare...</translation>
+ <translation type="obsolete">Jurna&lizare...</translation>
</message>
<message>
<source>&Help</source>
@@ -505,26 +505,10 @@
<translation>Arată iconul aplicației</translation>
</message>
<message>
- <source>Switch to &Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch between normal and fullscreen mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch to Seam&less Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and seamless desktop integration mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Switch to &Scaled Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and scaled mode</source>
<translation type="unfinished"></translation>
</message>
@@ -593,10 +577,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">&Fișier</translation>
@@ -864,10 +844,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -1032,6 +1008,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Fișier</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1045,6 +1110,27 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1628,6 +1714,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2254,11 +2367,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Neconectat</translation>
@@ -2467,6 +2575,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Controlor USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -2770,18 +2933,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="obsolete">Previzualizare în timp re&al</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -3884,16 +4035,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation></translation>
</message>
<message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
- <comment>CD/DVD tooltip</comment>
- <translation></translation>
- </message>
- <message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
- <comment>FD tooltip</comment>
- <translation></translation>
- </message>
- <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
<comment>Network adapters tooltip</comment>
<translation></translation>
@@ -3986,6 +4127,16 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4251,10 +4402,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4306,43 +4453,35 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Minibară:</translation>
+ <translation type="obsolete">Minibară:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Dacă este bifat, afișează Minibara în modul pe tot ecranul și în cel transparent.</translation>
+ <translation type="obsolete">Dacă este bifat, afișează Minibara în modul pe tot ecranul și în cel transparent.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Arată în mod pe tot &ecranul/transparent</translation>
+ <translation type="obsolete">Arată în mod pe tot &ecranul/transparent</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Dacă este bifată, poziționează minibara în partea de sus a ecranului, deși poziția implicită este la baza ecranului.</translation>
+ <translation type="obsolete">Dacă este bifată, poziționează minibara în partea de sus a ecranului, deși poziția implicită este la baza ecranului.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Poziționează &sus</translation>
+ <translation type="obsolete">Poziționează &sus</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4584,6 +4723,126 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Minibară:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Dacă este bifat, afișează Minibara în modul pe tot ecranul și în cel transparent.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Arată în mod pe tot &ecranul/transparent</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Dacă este bifată, poziționează minibara în partea de sus a ecranului, deși poziția implicită este la baza ecranului.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Poziționează &sus</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5154,11 +5413,11 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Dacă este bifat, țeava specificată în câmpul <b>Cale port</b> va fi creată de mașina virtuală, când aceasta pornește. Altfel, mașina virtuală va încerca să folosească țeava existentă.</translation>
+ <translation type="obsolete">Dacă este bifat, țeava specificată în câmpul <b>Cale port</b> va fi creată de mașina virtuală, când aceasta pornește. Altfel, mașina virtuală va încerca să folosească țeava existentă.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Crează țeavă</translation>
+ <translation type="obsolete">&Crează țeavă</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5166,11 +5425,11 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Afișează calea către țeava portului serial pe gazdă, când portul lucrează în mod <b>Țeavă gazdă</b>, sau numele dispozitivul serial de pe gazdă, când portul lucrează în mod <b>Dispozitiv gazdă</b>.</translation>
+ <translation type="obsolete">Afișează calea către țeava portului serial pe gazdă, când portul lucrează în mod <b>Țeavă gazdă</b>, sau numele dispozitivul serial de pe gazdă, când portul lucrează în mod <b>Dispozitiv gazdă</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Cale port/fișier:</translation>
+ <translation type="obsolete">&Cale port/fișier:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5180,6 +5439,22 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Afișează adresa portului I/O de bază pentru acest port paralel. Valori valide sunt întregi între <tt>0</tt> și <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5291,14 +5566,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source><nobr>Add CD/DVD Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><nobr>Add Floppy Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Add Controller</source>
<translation>Adaugă controlor</translation>
</message>
@@ -5332,11 +5599,11 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Adaugă dispozitiv CD/DVD</translation>
+ <translation type="obsolete">Adaugă dispozitiv CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Adaugă unitate de dischetă</translation>
+ <translation type="obsolete">Adaugă unitate de dischetă</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5507,18 +5774,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Set up the virtual CD/DVD drive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Floppy &Drive:</source>
<translation type="unfinished"></translation>
</message>
@@ -5539,10 +5794,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove disk from virtual drive</source>
<translation type="unfinished"></translation>
</message>
@@ -5605,23 +5856,55 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add USB Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Hot-pluggable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
+ <source>Add Floppy Drive</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add USB Controller</source>
+ <source>Optical &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Hot-pluggable</source>
+ <source>Set up the virtual optical drive</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5981,10 +6264,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"><nobr>Stare %1</nobr></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6004,6 +6283,10 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6173,6 +6456,14 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<source>Close</source>
<translation type="unfinished">Închide</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Schimbă</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6216,7 +6507,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Nu am putut crea obiectul COM VirtualBox.</p><p>Aplicația se va închide acum.</p></translation>
+ <translation type="obsolete"><p>Nu am putut crea obiectul COM VirtualBox.</p><p>Aplicația se va închide acum.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -6846,7 +7137,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>O versiune mai nouă a VirtualBox a fost lansată! Versiunea <b>%1</b> este disponibilă la <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Puteți descărca această versiune direct de la:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>O versiune mai nouă a VirtualBox a fost lansată! Versiunea <b>%1</b> este disponibilă la <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Puteți descărca această versiune direct de la:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6897,10 +7188,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&More</source>
<comment>warnAboutAutoConvertedSettings message box</comment>
<translation type="obsolete">&Mai mult</translation>
@@ -6917,7 +7204,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>O eroare critică s-a petrecut în timpul execuției mașinii virtuale și execuția a fost oprită.</p><p>Pentru ajutor, vă rugăm verificați secțiunea Community pe <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> sau contractul dvs de suport tehnic. Vă rugăm oferiți conținutul fișierului jurnal <tt>VBox.log</tt> și fișierul imagine <tt>VBox.png</tt>, pe care le puteți găsi în dosarul <nobr><b& [...]
+ <translation type="obsolete"><p>O eroare critică s-a petrecut în timpul execuției mașinii virtuale și execuția a fost oprită.</p><p>Pentru ajutor, vă rugăm verificați secțiunea Community pe <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> sau contractul dvs de suport tehnic. Vă rugăm oferiți conținutul fișierului jurnal <tt>VBox.log</tt> și fișierul imagine <tt>VBox.png</tt>, pe care le puteți găsi în dosarul &l [...]
</message>
<message>
<source>hard disk</source>
@@ -7091,10 +7378,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="obsolete">dispozitiv dischetă</translation>
</message>
<message>
- <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Remove</source>
<comment>medium</comment>
<translation>Ș&terge</translation>
@@ -7144,10 +7427,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7156,14 +7435,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -7192,14 +7463,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7401,10 +7664,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7634,14 +7893,6 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7702,6 +7953,94 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci c
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8693,13 +9032,17 @@ din listă apăsând butonul <b>Existent</b> (pentru a invoca dialog
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Bun venit în VirtualBox!</h3><p>Partea din stânga a ferestrei arată lista tuturor mașinilor virtuale din computerul dvs. Lista este goală acum deoarece nu a fost creată nici o mașină virtuală până acum.<img src=:/welcome.png align=right/></p><p>Pentru a crea o mașină virtuală nouă apăsați butonul <b>Nouă</b> în bara de unelte principală localizată în partea de sus a ferestrei.</p><p>Put [...]
+ <translation type="obsolete"><h3>Bun venit în VirtualBox!</h3><p>Partea din stânga a ferestrei arată lista tuturor mașinilor virtuale din computerul dvs. Lista este goală acum deoarece nu a fost creată nici o mașină virtuală până acum.<img src=:/welcome.png align=right/></p><p>Pentru a crea o mașină virtuală nouă apăsați butonul <b>Nouă</b> în bara de unelte principală localizată în partea de sus a ferestrei.</p><p>Puteț [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8728,7 +9071,7 @@ din listă apăsând butonul <b>Existent</b> (pentru a invoca dialog
</message>
<message>
<source>Settings</source>
- <translation type="unfinished">Setări</translation>
+ <translation type="obsolete">Setări</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -8781,6 +9124,10 @@ din listă apăsând butonul <b>Existent</b> (pentru a invoca dialog
<source>Display</source>
<translation type="unfinished">Afișare</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8832,6 +9179,25 @@ din listă apăsând butonul <b>Existent</b> (pentru a invoca dialog
<source>%1 - %2</source>
<translation type="unfinished">%1 - %2</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Setări</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -8846,6 +9212,10 @@ din listă apăsând butonul <b>Existent</b> (pentru a invoca dialog
<source>Close</source>
<translation type="unfinished">Închide</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -9273,10 +9643,6 @@ din listă apăsând butonul <b>Existent</b> (pentru a invoca dialog
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -9288,6 +9654,10 @@ din listă apăsând butonul <b>Existent</b> (pentru a invoca dialog
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11691,7 +12061,7 @@ Versiunea %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12501,21 +12871,6 @@ Versiunea %1</translation>
<comment>medium</comment>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation>
@@ -12566,7 +12921,7 @@ Versiunea %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -13023,16 +13378,6 @@ Versiunea %1</translation>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -13130,6 +13475,105 @@ Versiunea %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -14009,6 +14453,10 @@ Folosiți meniul contextual sau butaonele din dreapta pentru a adâuga sau șter
<source>Modify the attributes of the selected disk image file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
index b41ebf2..b8aceb4 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts
@@ -252,7 +252,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Режим интеграции &дисплея</translation>
+ <translation type="unfinished">Режим интеграции &дисплея</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -276,11 +276,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Выключить интеграцию &мыши</translation>
+ <translation type="obsolete">Выключить интеграцию &мыши</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Временно отключить интеграцию указателя мыши</translation>
+ <translation type="obsolete">Временно отключить интеграцию указателя мыши</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -292,11 +292,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Посл&ать Ctrl-Alt-Del</translation>
+ <translation type="obsolete">Посл&ать Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Послать последовательность клавиш Ctrl-Alt-Del в виртуальную машину</translation>
+ <translation type="obsolete">Послать последовательность клавиш Ctrl-Alt-Del в виртуальную машину</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -304,7 +304,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Послать последовательность клавиш Ctrl-Alt-Backspace в виртуальную машину</translation>
+ <translation type="obsolete">Послать последовательность клавиш Ctrl-Alt-Backspace в виртуальную машину</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -376,15 +376,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&Приводы оптических дисков</translation>
+ <translation type="obsolete">&Приводы оптических дисков</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>П&риводы гибких дисков</translation>
+ <translation type="obsolete">П&риводы гибких дисков</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&Устройства USB</translation>
+ <translation type="obsolete">&Устройства USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -431,7 +431,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>С&бор данных...</translation>
+ <translation type="obsolete">С&бор данных...</translation>
</message>
<message>
<source>&Help</source>
@@ -509,15 +509,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>&Полноэкранный режим</translation>
+ <translation type="obsolete">&Полноэкранный режим</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Переключиться в полноэкранный режим</translation>
+ <translation type="obsolete">Переключиться в полноэкранный режим</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>&Режим интеграции дисплея</translation>
+ <translation type="obsolete">&Режим интеграции дисплея</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -525,7 +525,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Р&ежим масштабирования</translation>
+ <translation type="obsolete">Р&ежим масштабирования</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -605,7 +605,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Посла&ть Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">Посла&ть Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>&File</source>
@@ -900,7 +900,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Drag'n'Drop</translation>
+ <translation type="obsolete">Drag'n'Drop</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -1067,6 +1067,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Файл</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1080,6 +1169,11 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
</context>
<context>
<name>UIActonPool</name>
@@ -1089,6 +1183,22 @@
</message>
</context>
<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIApplianceEditorWidget</name>
<message>
<source>Virtual System %1</source>
@@ -1993,6 +2103,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2678,7 +2815,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[Привод CD/DVD]</translation>
+ <translation type="obsolete">[Привод CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2909,6 +3046,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB-контроллер</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3255,15 +3447,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>&Док и меню-бар:</translation>
+ <translation type="obsolete">&Док и меню-бар:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>Показывать в полноэкранном режиме</translation>
+ <translation type="obsolete">Показывать в полноэкранном режиме</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>Когда стоит галочка, док и меню-бар хоста будут видны, даже если машина находится в полноэкранном режиме.</translation>
+ <translation type="obsolete">Когда стоит галочка, док и меню-бар хоста будут видны, даже если машина находится в полноэкранном режиме.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -4458,12 +4650,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Отображает активность приводов оптических дисков:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Отображает активность приводов оптических дисков:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Отображает активность приводов гибких дисков:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Отображает активность приводов гибких дисков:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4575,6 +4767,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4889,7 +5091,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>Виртуальная машина настроена на использование аппаратного ускорения, а операционной системой является Windows Vista (или более новая версия). Для достижения наилучшей производительности следует выделить под видеопамять машины как минимум <b>%1</b>.</translation>
+ <translation type="obsolete">Виртуальная машина настроена на использование аппаратного ускорения, а операционной системой является Windows Vista (или более новая версия). Для достижения наилучшей производительности следует выделить под видеопамять машины как минимум <b>%1</b>.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -4943,43 +5145,35 @@ p, li { white-space: pre-wrap; }
<translation>Включить захват видео для дисплея %1.</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Мини тулбар:</translation>
+ <translation type="obsolete">Мини тулбар:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Если стоит галочка, в полноэкранных режимах работы будет использоваться мини тулбар.</translation>
+ <translation type="obsolete">Если стоит галочка, в полноэкранных режимах работы будет использоваться мини тулбар.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">&Использовать в полноэкранных режимах</translation>
+ <translation type="obsolete">&Использовать в полноэкранных режимах</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Если стоит галочка, мини тулбар будет расположен сверху, в отличие от своей позиции по-умолчанию - снизу.</translation>
+ <translation type="obsolete">Если стоит галочка, мини тулбар будет расположен сверху, в отличие от своей позиции по-умолчанию - снизу.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">&Расположить сверху экрана</translation>
+ <translation type="obsolete">&Расположить сверху экрана</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5233,6 +5427,126 @@ p, li { white-space: pre-wrap; }
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation>Для этой машины выбран 64х-битный тип гостевой ОС. В связи с тем, что такие ОС требуют средств аппаратной виртуализации (VT-x/AMD-V), эти функции будут включены автоматически.</translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D-ускорение {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D-ускорение {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Мини тулбар:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Если стоит галочка, в полноэкранных режимах работы будет использоваться мини тулбар.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">&Использовать в полноэкранных режимах</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Если стоит галочка, мини тулбар будет расположен сверху, в отличие от своей позиции по-умолчанию - снизу.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">&Расположить сверху экрана</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5924,11 +6238,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Если стоит галочка, то канал, указанный в поле <b>Путь к порту</b>, будет создан при старте виртуальной машины. В противном случае, виртуальная машина попытается использовать существующий канал.</translation>
+ <translation type="obsolete">Если стоит галочка, то канал, указанный в поле <b>Путь к порту</b>, будет создан при старте виртуальной машины. В противном случае, виртуальная машина попытается использовать существующий канал.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Создать канал</translation>
+ <translation type="obsolete">&Создать канал</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5936,11 +6250,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Показывает путь к каналу последовательного порта на основном ПК, когда порт работает в режиме <b>Хост-канал</b>, либо имя устройства последовательного порта основного ПК, когда порт работает в режиме <b>Хост-устройство</b>.</translation>
+ <translation type="obsolete">Показывает путь к каналу последовательного порта на основном ПК, когда порт работает в режиме <b>Хост-канал</b>, либо имя устройства последовательного порта основного ПК, когда порт работает в режиме <b>Хост-устройство</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>П&уть к порту/файлу:</translation>
+ <translation type="obsolete">П&уть к порту/файлу:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5950,6 +6264,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Показывает базовый адрес ввода-вывода для этого последовательного порта. Допустимые значения -- целые числа в диапазоне от <tt>0</tt> до <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6074,11 +6404,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Добавить привод оптических дисков</nobr></translation>
+ <translation type="obsolete"><nobr>Добавить привод оптических дисков</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Добавить привод гибких дисков</nobr></translation>
+ <translation type="obsolete"><nobr>Добавить привод гибких дисков</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -6122,11 +6452,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Добавить привод оптических дисков</translation>
+ <translation type="obsolete">Добавить привод оптических дисков</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Добавить привод гибких дисков</translation>
+ <translation type="obsolete">Добавить привод гибких дисков</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6314,15 +6644,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&Привод:</translation>
+ <translation type="obsolete">&Привод:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Выбрать файл образа оптического диска или привод хоста для использования в виртуальном приводе гостевой ВМ. Виртуальная машина получит доступ к информации, содержащейся в образе или на носителе привода хоста, как если бы эта информация находилась на оптическом диске внутри виртуальной машины.</translation>
+ <translation type="obsolete">Выбрать файл образа оптического диска или привод хоста для использования в виртуальном приводе гостевой ВМ. Виртуальная машина получит доступ к информации, содержащейся в образе или на носителе привода хоста, как если бы эта информация находилась на оптическом диске внутри виртуальной машины.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Настроить привод оптических дисков</translation>
+ <translation type="obsolete">Настроить привод оптических дисков</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6346,7 +6676,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Выбрать образ оптического диска...</translation>
+ <translation type="obsolete">Выбрать образ оптического диска...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6442,6 +6772,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished">Выбрать образ оптического диска...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6868,7 +7230,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>Данная машина настроена на эмуляцию USB 2.0, для чего требуюется установить <b>%1</b>. Если необходимо, установите данный плагин, предварительно скачав его с сайта VirtualBox или отключите USB 2.0 для дальнейшей работы с машиной.</translation>
+ <translation type="obsolete">Данная машина настроена на эмуляцию USB 2.0, для чего требуюется установить <b>%1</b>. Если необходимо, установите данный плагин, предварительно скачав его с сайта VirtualBox или отключите USB 2.0 для дальнейшей работы с машиной.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
@@ -6890,6 +7252,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7063,6 +7429,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Закрыть</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Переключить</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7106,7 +7480,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Не удалось создать COM-объект VirtualBox.</p><p>Работа приложения будет завершена.</p></translation>
+ <translation type="obsolete"><p>Не удалось создать COM-объект VirtualBox.</p><p>Работа приложения будет завершена.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7565,7 +7939,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Выпущена новая версия программы VirtualBox! Версия <b>%1</b> доступна на сайте <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Вы можете скачать эту версию, используя следующую прямую ссылку: </p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Выпущена новая версия программы VirtualBox! Версия <b>%1</b> доступна на сайте <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Вы можете скачать эту версию, используя следующую прямую ссылку: </p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7665,7 +8039,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Один или несколько виртуальных жестких дисков, образов CD/DVD или дискет сейчас недоступны. В результате, Вы не сможете запускать виртуальные машины, использующие эти носители, до тех пор, пока к ним не появится доступ.</p><p>Нажмите <b>Проверить</b>, чтобы открыть окно Менеджера виртуальных носителей и увидеть, какие именно носители недоступны, или нажмите <b>Игнорировать</b>, чтобы пропустить это сообщение.</p></tr [...]
+ <translation type="obsolete"><p>Один или несколько виртуальных жестких дисков, образов CD/DVD или дискет сейчас недоступны. В результате, Вы не сможете запускать виртуальные машины, использующие эти носители, до тех пор, пока к ним не появится доступ.</p><p>Нажмите <b>Проверить</b>, чтобы открыть окно Менеджера виртуальных носителей и увидеть, какие именно носители недоступны, или нажмите <b>Игнорировать</b>, чтобы пропустить это сообщени [...]
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -7696,7 +8070,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Во время работы виртуальной машины произошла критическая ошибка. Выполнение виртуальной машины приостановлено.</p><p>Вы можете обратиться за помощью к разделу Community на веб-сайте <a href=http://www.virtualbox.org>http://www.virtualbox.org</a>, либо к Вашему контракту на поддержку и сопровождение продукта. Пожалуйста, предоставьте содержимое журнала <tt>VBox.log</tt> и изображение <tt>VBox.png</tt>, которые н [...]
+ <translation type="obsolete"><p>Во время работы виртуальной машины произошла критическая ошибка. Выполнение виртуальной машины приостановлено.</p><p>Вы можете обратиться за помощью к разделу Community на веб-сайте <a href=http://www.virtualbox.org>http://www.virtualbox.org</a>, либо к Вашему контракту на поддержку и сопровождение продукта. Пожалуйста, предоставьте содержимое журнала <tt>VBox.log</tt> и изображение <tt>VBox.png</t [...]
</message>
<message>
<source>hard disk</source>
@@ -7979,7 +8353,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Вы уверены, что хотите удалить виртуальный привод оптических дисков?</p><p>Без такого устройства у Вас не будет возможности подключать привод оптических дисков основного компьютера или образ оптического диска к виртуальной машине. Кроме того, Вы не сможете установить дополнения гостевой операционной системы!</p></translation>
+ <translation type="obsolete"><p>Вы уверены, что хотите удалить виртуальный привод оптических дисков?</p><p>Без такого устройства у Вас не будет возможности подключать привод оптических дисков основного компьютера или образ оптического диска к виртуальной машине. Кроме того, Вы не сможете установить дополнения гостевой операционной системы!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8082,7 +8456,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Вы собираетесь добавить новый привод оптических дисков к контроллеру <b>%1</b>.</p><p>Желаете выбрать образ оптического диска и поместить его в данный привод или оставить привод пустым?</p></translation>
+ <translation type="obsolete"><p>Вы собираетесь добавить новый привод оптических дисков к контроллеру <b>%1</b>.</p><p>Желаете выбрать образ оптического диска и поместить его в данный привод или оставить привод пустым?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8104,11 +8478,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Не удалось отсоединить привод оптических дисков <nobr><b>%1</b></nobr> от слота <i>%2</i> машины <b>%3</b>.</translation>
+ <translation type="obsolete">Не удалось отсоединить привод оптических дисков <nobr><b>%1</b></nobr> от слота <i>%2</i> машины <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Не удалось отсоединить привод гибких дисков <nobr><b>%1</b></nobr> от слота <i>%2</i> машины <b>%3</b>.</translation>
+ <translation type="obsolete">Не удалось отсоединить привод гибких дисков <nobr><b>%1</b></nobr> от слота <i>%2</i> машины <b>%3</b>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
@@ -8152,11 +8526,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Не удалось подсоединить привод оптических дисков <nobr><b>%1</b></nobr> к слоту <i>%2</i> машины <b>%3</b>.</translation>
+ <translation type="obsolete">Не удалось подсоединить привод оптических дисков <nobr><b>%1</b></nobr> к слоту <i>%2</i> машины <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Не удалось подсоединить привод гибких дисков <nobr><b>%1</b></nobr> к слоту <i>%2</i> машины <b>%3</b>.</translation>
+ <translation type="obsolete">Не удалось подсоединить привод гибких дисков <nobr><b>%1</b></nobr> к слоту <i>%2</i> машины <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8407,7 +8781,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Не удалось скопировать данные.</translation>
+ <translation type="obsolete">Не удалось скопировать данные.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -8644,11 +9018,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p><b>Образ дополнений гостевой ОС</b> был успешно загружен с сетевого адреса <nobr><a href="%1">%1</a></nobr> и сохранён локально по адресу <nobr><b>%2</b>.</nobr></p><p>Хотите ли подключить его к виртуальному приводу оптических дисков?</p></translation>
+ <translation type="obsolete"><p><b>Образ дополнений гостевой ОС</b> был успешно загружен с сетевого адреса <nobr><a href="%1">%1</a></nobr> и сохранён локально по адресу <nobr><b>%2</b>.</nobr></p><p>Хотите ли подключить его к виртуальному приводу оптических дисков?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>Не удалось подключить установочный пакет <b>Образа дополнений гостевой ОС</b> к виртуальной машине <b>%1</b>, поскольку данная машина не имеет привода оптических дисков. Пожалуйста добавьте привод, используя настройки носителей информации виртуальной машины.</p></translation>
+ <translation type="obsolete"><p>Не удалось подключить установочный пакет <b>Образа дополнений гостевой ОС</b> к виртуальной машине <b>%1</b>, поскольку данная машина не имеет привода оптических дисков. Пожалуйста добавьте привод, используя настройки носителей информации виртуальной машины.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
@@ -8711,6 +9085,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -9702,13 +10164,17 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Добро пожаловать в мир VirtualBox!</h3><p>Левая часть этого окна предназначена для отображения списка Ваших виртуальных машин. Этот список сейчас пуст, потому что Вы не создали ни одной виртуальной машины.<img src=:/welcome.png align=right/></p><p>Чтобы создать новую машину, нажмите кнопку <b>Создать</b> на основной панели инструментов, расположенной вверху окна.</p><p>Hажмите клавишу <b>%1</b& [...]
+ <translation type="obsolete"><h3>Добро пожаловать в мир VirtualBox!</h3><p>Левая часть этого окна предназначена для отображения списка Ваших виртуальных машин. Этот список сейчас пуст, потому что Вы не создали ни одной виртуальной машины.<img src=:/welcome.png align=right/></p><p>Чтобы создать новую машину, нажмите кнопку <b>Создать</b> на основной панели инструментов, расположенной вверху окна.</p><p>Hажмите клавишу &l [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Менеджер</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9741,7 +10207,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Settings</source>
- <translation>Настройки</translation>
+ <translation type="obsolete">Настройки</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -9794,6 +10260,10 @@ p, li { white-space: pre-wrap; }
<source>Display</source>
<translation>Дисплей</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -9869,6 +10339,25 @@ p, li { white-space: pre-wrap; }
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">В данный момент больше контроллеров носителей информации, чем поддерживается чипсетом %1. Пожалуйста, измените тип чипсета на странице 'Система' или уменьшите количество следующих контроллеров на странице 'Носители': %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -9883,6 +10372,10 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Закрыть</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10198,7 +10691,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Drag'n'Drop</translation>
+ <translation type="obsolete">Drag'n'Drop</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -10212,6 +10705,10 @@ p, li { white-space: pre-wrap; }
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -12072,7 +12569,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12886,17 +13383,17 @@ p, li { white-space: pre-wrap; }
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Подключение данного жёсткого диска будет осуществлено косвенно, используя новый разностный диск.</translation>
+ <translation type="obsolete">Подключение данного жёсткого диска будет осуществлено косвенно, используя новый разностный диск.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Некоторые устройства данной цепочки жёстких дисков недоступны. Для проверки вы можете использовать менеджер виртуальных носителей в режиме <b>отображения разностных жёстких дисков</b>.</translation>
+ <translation type="obsolete">Некоторые устройства данной цепочки жёстких дисков недоступны. Для проверки вы можете использовать менеджер виртуальных носителей в режиме <b>отображения разностных жёстких дисков</b>.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Этот базовый жёсткий диск косвенно подсоединен с помощью следующего разностного диска:</translation>
+ <translation type="obsolete">Этот базовый жёсткий диск косвенно подсоединен с помощью следующего разностного диска:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -12948,7 +13445,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -13510,12 +14007,12 @@ p, li { white-space: pre-wrap; }
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Включено</translation>
+ <translation type="obsolete">Включено</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Выключено</translation>
+ <translation type="obsolete">Выключено</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -13625,6 +14122,105 @@ p, li { white-space: pre-wrap; }
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13931,6 +14527,10 @@ p, li { white-space: pre-wrap; }
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Создать новый виртуальный жесткий диск</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
index 08e77f6..8f687a3 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts
@@ -292,7 +292,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Režim &plynulého prechodu</translation>
+ <translation type="unfinished">Režim &plynulého prechodu</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -316,11 +316,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Vypnúť Integráciu &myši</translation>
+ <translation type="obsolete">Vypnúť Integráciu &myši</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Dočasne vypne hostiteľskú integráciu ukazovateľa myši</translation>
+ <translation type="obsolete">Dočasne vypne hostiteľskú integráciu ukazovateľa myši</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -332,11 +332,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Poslať Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&Poslať Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Pošle virtuálnemu stroju klávesovú sekvenciu Ctrl-Alt-Del</translation>
+ <translation type="obsolete">Pošle virtuálnemu stroju klávesovú sekvenciu Ctrl-Alt-Del</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -344,7 +344,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Pošle virtuálnemu stroju klávesovú sekvenciu Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">Pošle virtuálnemu stroju klávesovú sekvenciu Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -412,15 +412,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>Zariadenia &CD/DVD</translation>
+ <translation type="obsolete">Zariadenia &CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Disketové zariadenia</translation>
+ <translation type="obsolete">&Disketové zariadenia</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB zariadenia</translation>
+ <translation type="obsolete">&USB zariadenia</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -471,7 +471,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&Logovanie...</translation>
+ <translation type="obsolete">&Logovanie...</translation>
</message>
<message>
<source>&Help</source>
@@ -500,15 +500,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>P&repnúť na celú obrazovku</translation>
+ <translation type="obsolete">P&repnúť na celú obrazovku</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Prepnúť medzi normálnym zobrazením a celou obrazovkou</translation>
+ <translation type="obsolete">Prepnúť medzi normálnym zobrazením a celou obrazovkou</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Prepnúť do &bezošvého režimu</translation>
+ <translation type="obsolete">Prepnúť do &bezošvého režimu</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -516,7 +516,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Prepnúť do rež&imu škálovania</translation>
+ <translation type="obsolete">Prepnúť do rež&imu škálovania</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -591,10 +591,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished">&Súbor</translation>
@@ -866,10 +862,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -1034,6 +1026,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Súbor</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1047,6 +1128,27 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1851,6 +1953,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2457,11 +2586,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Nepripojená</translation>
@@ -2680,6 +2804,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB radič</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3051,18 +3230,6 @@
<translation type="obsolete">Vypnúť š&etrič obrazovky hostiteľa</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4227,12 +4394,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Zobrazuje aktivitu CD/DVD zariadení:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Zobrazuje aktivitu CD/DVD zariadení:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Zobrazuje aktivitu zariadení disketovej mechaniky:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Zobrazuje aktivitu zariadení disketovej mechaniky:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4330,6 +4497,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4623,10 +4800,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4678,43 +4851,31 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Mini nástrojová lišta:</translation>
+ <translation type="obsolete">Mini nástrojová lišta:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Ak je zaškrtnuté, zobrazí v režime na celú obrazovku a v režime plynulého prechodu malú lištu nástrojov.</translation>
+ <translation type="obsolete">Ak je zaškrtnuté, zobrazí v režime na celú obrazovku a v režime plynulého prechodu malú lištu nástrojov.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Zobraziť v rež&ime celej obrazovky/plynulého prechodu</translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">Zobraziť v rež&ime celej obrazovky/plynulého prechodu</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Z&obraziť na vrchu obrazovky</translation>
+ <translation type="obsolete">Z&obraziť na vrchu obrazovky</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4872,6 +5033,126 @@
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Mini nástrojová lišta:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Ak je zaškrtnuté, zobrazí v režime na celú obrazovku a v režime plynulého prechodu malú lištu nástrojov.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Zobraziť v rež&ime celej obrazovky/plynulého prechodu</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Z&obraziť na vrchu obrazovky</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -5378,26 +5659,34 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Ak je zaškrtnuté, rúra uvedená v poli <b>Cesta k portu</b> bude vytvorená virtuálnym strojom pri spustení. Inak virtuálny stroj bude predpokladať, že rúra existuje a pokúsi sa ju použiť.</translation>
+ <translation type="obsolete">Ak je zaškrtnuté, rúra uvedená v poli <b>Cesta k portu</b> bude vytvorená virtuálnym strojom pri spustení. Inak virtuálny stroj bude predpokladať, že rúra existuje a pokúsi sa ju použiť.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Vytvoriť rúru (pipe)</translation>
+ <translation type="obsolete">&Vytvoriť rúru (pipe)</translation>
+ </message>
+ <message>
+ <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
+ <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Port/File &Path:</source>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
+ <source>&Connect to existing pipe/socket</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
<translation type="unfinished"></translation>
</message>
</context>
@@ -5463,14 +5752,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><nobr>Add CD/DVD Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><nobr>Add Floppy Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Add Controller</source>
<translation>Pridať radič</translation>
</message>
@@ -5504,11 +5785,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Pridať zariadenie CD/DVD</translation>
+ <translation type="obsolete">Pridať zariadenie CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Pridať zariadenie disketovej mechaniky</translation>
+ <translation type="obsolete">Pridať zariadenie disketovej mechaniky</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5667,18 +5948,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Set up the virtual CD/DVD drive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Floppy &Drive:</source>
<translation type="unfinished"></translation>
</message>
@@ -5699,10 +5968,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove disk from virtual drive</source>
<translation type="unfinished"></translation>
</message>
@@ -5773,15 +6038,47 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add USB Controller</source>
+ <source>Add USB Controller</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Hot-pluggable</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Hot-pluggable</source>
+ <source>Set up the virtual optical drive</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -6120,10 +6417,6 @@
<translation type="unfinished"><nobr>Stav: %1</nobr></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6143,6 +6436,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6308,6 +6605,14 @@
<source>Close</source>
<translation type="unfinished">Zatvoriť</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Prepnúť</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6351,7 +6656,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Nepodarilo sa vytvoriť VirtualBox COM objekt.</p><p>Aplikácia sa teraz ukončí.</p></translation>
+ <translation type="obsolete"><p>Nepodarilo sa vytvoriť VirtualBox COM objekt.</p><p>Aplikácia sa teraz ukončí.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -6816,10 +7121,6 @@
<translation type="obsolete">Zobrazí dialógové okno s informáciami o produkte</translation>
</message>
<message>
- <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Release</source>
<comment>detach medium</comment>
<translation>Uvoľniť</translation>
@@ -6860,19 +7161,11 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>E&xit</source>
<comment>warnAboutAutoConvertedSettings message box</comment>
<translation type="obsolete">&Ukončiť</translation>
</message>
<message>
- <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>hard disk</source>
<comment>failed to close ...</comment>
<translation type="obsolete">pevný disk</translation>
@@ -7047,10 +7340,6 @@
<translation type="obsolete">zariadenie disketovej mechaniky</translation>
</message>
<message>
- <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Remove</source>
<comment>medium</comment>
<translation>&Odstrániť</translation>
@@ -7100,10 +7389,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7112,14 +7397,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -7148,14 +7425,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7361,10 +7630,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7594,14 +7859,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -7662,6 +7919,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -8607,12 +8952,12 @@ preskočiť a pripojiť pevné disky neskôr pomocou dialógu Nastavenia virtuá
<translation type="unfinished"></translation>
</message>
<message>
- <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <source>Manager</source>
+ <comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Manager</source>
- <comment>Note: main window title which is pretended by the product name.</comment>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
<translation type="unfinished"></translation>
</message>
</context>
@@ -8647,7 +8992,7 @@ preskočiť a pripojiť pevné disky neskôr pomocou dialógu Nastavenia virtuá
</message>
<message>
<source>Settings</source>
- <translation>Nastavenia</translation>
+ <translation type="obsolete">Nastavenia</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -8700,6 +9045,10 @@ preskočiť a pripojiť pevné disky neskôr pomocou dialógu Nastavenia virtuá
<source>Display</source>
<translation type="unfinished">Displej</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8755,6 +9104,25 @@ preskočiť a pripojiť pevné disky neskôr pomocou dialógu Nastavenia virtuá
<source>you have 2D Video Acceleration enabled. As 2D Video Acceleration is supported for Windows guests only, this feature will be disabled.</source>
<translation type="obsolete">povolili ste 2D akceleráciu videa. Pretože 2D akcelerácia videa je podporovaná iba pre hosťovské systémy s Windows, táto vlastnosť bude vypnutá.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Nastavenia</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -8769,6 +9137,10 @@ preskočiť a pripojiť pevné disky neskôr pomocou dialógu Nastavenia virtuá
<source>Close</source>
<translation type="unfinished">Zatvoriť</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -9092,10 +9464,6 @@ preskočiť a pripojiť pevné disky neskôr pomocou dialógu Nastavenia virtuá
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -9107,6 +9475,10 @@ preskočiť a pripojiť pevné disky neskôr pomocou dialógu Nastavenia virtuá
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11326,7 +11698,7 @@ verzia %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12187,21 +12559,6 @@ verzia %1</translation>
<source>You can create disk image files using the virtual media manager.</source>
<translation type="obsolete">Obrazy médií môžete vytvoriť pomocou Správcu virtuálnych médií.</translation>
</message>
- <message>
- <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation>
@@ -12252,7 +12609,7 @@ verzia %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -12774,16 +13131,6 @@ verzia %1</translation>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -12881,6 +13228,105 @@ verzia %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Aktívne</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Aktívne</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Aktívne</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13606,6 +14052,10 @@ je zobrazený <b>tučným</b> písmom. Voľbou <i>Štandardný
<source>C&lose</source>
<translation type="obsolete">&Zavrieť</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
index f21f53c..63dd3db 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts
@@ -248,7 +248,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">&Интегрисан биро</translation>
+ <translation type="unfinished">&Интегрисан биро</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -272,11 +272,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Онемогучи интегрисање ми&ша</translation>
+ <translation type="obsolete">Онемогучи интегрисање ми&ша</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Привремено онемогучи хост интеграција миша</translation>
+ <translation type="obsolete">Привремено онемогучи хост интеграција миша</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -288,11 +288,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Пошаљи Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&Пошаљи Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Пошаљи Ctrl-Alt-Del виртуелној машини</translation>
+ <translation type="obsolete">Пошаљи Ctrl-Alt-Del виртуелној машини</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -300,7 +300,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Пошаљи Ctrl-Alt-Backspace виртуелној машини</translation>
+ <translation type="obsolete">Пошаљи Ctrl-Alt-Backspace виртуелној машини</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -364,15 +364,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>CD/DVD Уређаји</translation>
+ <translation type="obsolete">CD/DVD Уређаји</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Флопи уређаји</translation>
+ <translation type="obsolete">Флопи уређаји</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>USB уре&ђаји</translation>
+ <translation type="obsolete">USB уре&ђаји</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -423,7 +423,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">Журнал...</translation>
+ <translation type="obsolete">Журнал...</translation>
</message>
<message>
<source>&Help</source>
@@ -452,15 +452,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Пређи на Пун Екран</translation>
+ <translation type="obsolete">Пређи на Пун Екран</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Пребаци нормални/пун екран</translation>
+ <translation type="obsolete">Пребаци нормални/пун екран</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Пређи интегрисан мод</translation>
+ <translation type="obsolete">Пређи интегрисан мод</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -468,7 +468,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Пређи на зумиран мод</translation>
+ <translation type="obsolete">Пређи на зумиран мод</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -543,10 +543,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished"></translation>
@@ -838,10 +834,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -1006,6 +998,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1019,6 +1100,27 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1873,6 +1975,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2551,11 +2680,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Није прикачено</translation>
@@ -2784,6 +2908,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB контролер</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3166,18 +3345,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Угаси скрин сејвер хоста</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4279,12 +4446,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Показује активност CD/DVD уређаја:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Показује активност CD/DVD уређаја:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Показује активност флопи уређаја:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Показује активност флопи уређаја:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4396,6 +4563,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4693,10 +4870,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4748,43 +4921,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Мини алатна-трака:</translation>
+ <translation type="obsolete">Мини алатна-трака:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Ако унето, показати алатну траку у пуном екрану или интегрисаном моду.</translation>
+ <translation type="obsolete">Ако унето, показати алатну траку у пуном екрану или интегрисаном моду.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Покажи у пуном екрану/интегрисано</translation>
+ <translation type="obsolete">Покажи у пуном екрану/интегрисано</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Ако унето, покажи малу алатну траку на врх екрана, уместо на дну.</translation>
+ <translation type="obsolete">Ако унето, покажи малу алатну траку на врх екрана, уместо на дну.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Покажи на врх екрана</translation>
+ <translation type="obsolete">Покажи на врх екрана</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5035,7 +5200,127 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Мини алатна-трака:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Ако унето, показати алатну траку у пуном екрану или интегрисаном моду.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Покажи у пуном екрану/интегрисано</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Ако унето, покажи малу алатну траку на врх екрана, уместо на дну.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Покажи на врх екрана</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5623,11 +5908,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Ако одабрано, туба специфирана у <b>Путања порта</b> ће бити креирана на покретање машине. Инаће, машина ће мислити да тзба постоји и пробаће да је користи.</translation>
+ <translation type="obsolete">Ако одабрано, туба специфирана у <b>Путања порта</b> ће бити креирана на покретање машине. Инаће, машина ће мислити да тзба постоји и пробаће да је користи.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Креирај тубу</translation>
+ <translation type="obsolete">&Креирај тубу</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5635,11 +5920,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Показује путању са хоста за серијске интерфејси када интерфејс ради у моду <b>Хост туба</b>, или име уређаја када порт ради као <b>Хост уређај</b>.</translation>
+ <translation type="obsolete">Показује путању са хоста за серијске интерфејси када интерфејс ради у моду <b>Хост туба</b>, или име уређаја када порт ради као <b>Хост уређај</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Путања порта/датотеке:</translation>
+ <translation type="obsolete">Путања порта/датотеке:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5649,6 +5934,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Показује базну I/O адресу серијалног порта. Вредности су бројеви између <tt>0</tt> и <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5773,11 +6074,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Додај CD/DVD уређај</nobr></translation>
+ <translation type="obsolete"><nobr>Додај CD/DVD уређај</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Додај флопи уређај</nobr></translation>
+ <translation type="obsolete"><nobr>Додај флопи уређај</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -5821,11 +6122,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Додај CD/DVD уређај</translation>
+ <translation type="obsolete">Додај CD/DVD уређај</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Додај флопи уређај</translation>
+ <translation type="obsolete">Додај флопи уређај</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6005,15 +6306,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD драјв:</translation>
+ <translation type="obsolete">CD/DVD драјв:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Одабрати виртуални CD/DVD диск или физички драј за овај виртуални драјв. Машина ће видети унет диск или физички драјв као њен садржај.</translation>
+ <translation type="obsolete">Одабрати виртуални CD/DVD диск или физички драј за овај виртуални драјв. Машина ће видети унет диск или физички драјв као њен садржај.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Подеси виртуелни CD/DVD драјв</translation>
+ <translation type="obsolete">Подеси виртуелни CD/DVD драјв</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6037,7 +6338,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Одабрати виртуелни CD/DVD диск...</translation>
+ <translation type="obsolete">Одабрати виртуелни CD/DVD диск...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6133,6 +6434,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6534,10 +6867,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">USB 2.0 је активно за ову машину. Али, потребно је да <b>%1</b> буде инсталиран. Инсталирајте пакет са VirtualBox сајта. После тога, мочићете да поново упали USB 2.0. Дотле, биће онемогућен осим ако поништите актуелне промене поставке.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6557,6 +6886,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6730,6 +7063,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Затвори</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Пребаци</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6773,7 +7114,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Неуспешна креација COM објекта за VirtualBox.</p><p>Програм ће се зауставити.</p></translation>
+ <translation type="obsolete"><p>Неуспешна креација COM објекта за VirtualBox.</p><p>Програм ће се зауставити.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7233,7 +7574,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Нађена новија верзија VirtualBox-а! Верзија <b>%1</b> је доступна на <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Можете преузети ову верзију са овим линком:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Нађена новија верзија VirtualBox-а! Верзија <b>%1</b> је доступна на <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Можете преузети ову верзију са овим линком:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7333,7 +7674,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Један или више виртуелних хард диска, ЦД/ДВД или флопи нису доступни. Као резултат, нећете моћи да радите са машинама које користе те медије док не буду поново доступни.</p><p>Стиснути <b>Провери</b> за отварање менаджера да би се видело који медиј није доступан, или одабрати <b>Игнориши</b> за игнорисање ове поруке.</p></translation>
+ <translation type="obsolete"><p>Један или више виртуелних хард диска, ЦД/ДВД или флопи нису доступни. Као резултат, нећете моћи да радите са машинама које користе те медије док не буду поново доступни.</p><p>Стиснути <b>Провери</b> за отварање менаджера да би се видело који медиј није доступан, или одабрати <b>Игнориши</b> за игнорисање ове поруке.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -7364,7 +7705,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Критична грешка се појавила при раду машине, тако да је рад заустављен.</p><p>За помоћ, видети <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> или вашу подршку. Послати садржај журнала <tt>VBox.log</tt> и слику <tt>VBox.png</tt>, које су у фасцикли <nobr><b>%1</b></nobr>, као и опис шта сте радили пре појављивање грешке. Можете исто приступити овим датотекама преко <b& [...]
+ <translation type="obsolete"><p>Критична грешка се појавила при раду машине, тако да је рад заустављен.</p><p>За помоћ, видети <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> или вашу подршку. Послати садржај журнала <tt>VBox.log</tt> и слику <tt>VBox.png</tt>, које су у фасцикли <nobr><b>%1</b></nobr>, као и опис шта сте радили пре појављивање грешке. Можете исто приступити овим датотек [...]
</message>
<message>
<source>hard disk</source>
@@ -7647,7 +7988,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Сигурн избрисати CD/DVD уређај?</p><p>Нећете моћи да монтирате CD или ISO слике или да инсталирате 'додатке госта'!</p></translation>
+ <translation type="obsolete"><p>Сигурн избрисати CD/DVD уређај?</p><p>Нећете моћи да монтирате CD или ISO слике или да инсталирате 'додатке госта'!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -7750,7 +8091,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Спремате се да креирате нов контролер <b>%1</b> CD/DVD драјва.</p><p>Да ли да одаберете виртуални CD/DVD диск да се убаци унутра или да се остави празно за сада?</p></translation>
+ <translation type="obsolete"><p>Спремате се да креирате нов контролер <b>%1</b> CD/DVD драјва.</p><p>Да ли да одаберете виртуални CD/DVD диск да се убаци унутра или да се остави празно за сада?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -7772,11 +8113,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Неуспешан одвој CD/DVD уређаја (<nobr><b>%1</b></nobr>) са слота <i>%2</i> од машине <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешан одвој CD/DVD уређаја (<nobr><b>%1</b></nobr>) са слота <i>%2</i> од машине <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Неуспешан одвој флопи уређаја (<nobr><b>%1</b></nobr>) са слота <i>%2</i> од машине <b>%3</b>.</translation>
+ <translation type="obsolete">Неуспешан одвој флопи уређаја (<nobr><b>%1</b></nobr>) са слота <i>%2</i> од машине <b>%3</b>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
@@ -7816,11 +8157,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Погрешно закачивање CD/DVD уређаја (<nobr><b>%1</b></nobr>) на слот <i>%2</i> од машине <b>%3</b>.</translation>
+ <translation type="obsolete">Погрешно закачивање CD/DVD уређаја (<nobr><b>%1</b></nobr>) на слот <i>%2</i> од машине <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Погрешно закачивање флопиа (<nobr><b>%1</b></nobr>) на слот <i>%2</i> од машине <b>%3</b>.</translation>
+ <translation type="obsolete">Погрешно закачивање флопиа (<nobr><b>%1</b></nobr>) на слот <i>%2</i> од машине <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8065,10 +8406,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8298,14 +8635,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8366,6 +8695,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -9368,13 +9785,17 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Добродошли у VirtualBox!</h3><p>Леви део прозор показује списак виртуелне машине са рачунара. Списак је празан пошто нисте још креирали виртуелну машину.<img src=:/welcome.png align=right/></p><p>За креацију нове виртуелне машине, стиснути <b>Ново</b> са главне траке која је на горњи део прозора.</p><p>Можете да стиснете <b>F1</b> за инстантни помоћ, или ићи на <a href=ht [...]
+ <translation type="obsolete"><h3>Добродошли у VirtualBox!</h3><p>Леви део прозор показује списак виртуелне машине са рачунара. Списак је празан пошто нисте још креирали виртуелну машину.<img src=:/welcome.png align=right/></p><p>За креацију нове виртуелне машине, стиснути <b>Ново</b> са главне траке која је на горњи део прозора.</p><p>Можете да стиснете <b>F1</b> за инстантни помоћ, или ићи на <a href=http [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished">Уреди</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9407,7 +9828,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Settings</source>
- <translation>Параметри</translation>
+ <translation type="obsolete">Параметри</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -9460,6 +9881,10 @@ p, li { white-space: pre-wrap; }
<source>Display</source>
<translation type="unfinished">Дисплеј</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -9519,6 +9944,25 @@ p, li { white-space: pre-wrap; }
<source>you have 2D Video Acceleration enabled. As 2D Video Acceleration is supported for Windows guests only, this feature will be disabled.</source>
<translation type="obsolete">имате 2D видео убрзавање упаљено. Пошто је 2D видео убрзавање је подршана само са тране Windows госта, опција ће бити онемогућена.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Параметри</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -9533,6 +9977,10 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Затвори</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -9856,10 +10304,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -9871,6 +10315,10 @@ p, li { white-space: pre-wrap; }
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11662,7 +12110,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12466,17 +12914,17 @@ p, li { white-space: pre-wrap; }
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Привезивање овог хард диска ће бити индиректан користечи новог креираног различитог хард диска.</translation>
+ <translation type="obsolete">Привезивање овог хард диска ће бити индиректан користечи новог креираног различитог хард диска.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Меки медиј из хард диска није доступан. Користити витуелни менаџер медија у <b>Покажи различит хард диск</b> за проверу овог медија.</translation>
+ <translation type="obsolete">Меки медиј из хард диска није доступан. Користити витуелни менаџер медија у <b>Покажи различит хард диск</b> за проверу овог медија.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Овај базни хард диск је индиректно прикачен са овим различитим диском:</translation>
+ <translation type="obsolete">Овај базни хард диск је индиректно прикачен са овим различитим диском:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -12528,7 +12976,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -13073,16 +13521,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -13180,6 +13618,105 @@ p, li { white-space: pre-wrap; }
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Активно</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Активно</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Активно</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13482,6 +14019,10 @@ p, li { white-space: pre-wrap; }
<source>C&lose</source>
<translation type="obsolete">Затвори</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
index af7be81..d6eaa69 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts
@@ -263,7 +263,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Söm&löst läge</translation>
+ <translation type="unfinished">Söm&löst läge</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -287,11 +287,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>Inaktivera &musintegration</translation>
+ <translation type="obsolete">Inaktivera &musintegration</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Inaktivera värdmuspekarintegrationen temporärt</translation>
+ <translation type="obsolete">Inaktivera värdmuspekarintegrationen temporärt</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -303,11 +303,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>In&foga Ctrl-Alt-Del</translation>
+ <translation type="obsolete">In&foga Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Skicka Ctrl-Alt-Del-sekvens till den virtuella maskinen</translation>
+ <translation type="obsolete">Skicka Ctrl-Alt-Del-sekvens till den virtuella maskinen</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -315,7 +315,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Skicka Ctrl-Alt-Backsteg-sekvens till den virtuella maskinen</translation>
+ <translation type="obsolete">Skicka Ctrl-Alt-Backsteg-sekvens till den virtuella maskinen</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -387,15 +387,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD-enheter</translation>
+ <translation type="obsolete">&CD/DVD-enheter</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Diskettenheter</translation>
+ <translation type="obsolete">&Diskettenheter</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB-enheter</translation>
+ <translation type="obsolete">&USB-enheter</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -446,7 +446,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&Loggning...</translation>
+ <translation type="obsolete">&Loggning...</translation>
</message>
<message>
<source>&Help</source>
@@ -524,15 +524,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Växla till &helskärm</translation>
+ <translation type="obsolete">Växla till &helskärm</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Växla mellan normalt läge och helskärmsläge</translation>
+ <translation type="obsolete">Växla mellan normalt läge och helskärmsläge</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Växla till söm&löst läge</translation>
+ <translation type="obsolete">Växla till söm&löst läge</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -540,7 +540,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Växla till &skalningsläge</translation>
+ <translation type="obsolete">Växla till &skalningsläge</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -747,7 +747,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished">Info&ga Ctrl-Alt-Backsteg</translation>
+ <translation type="obsolete">Info&ga Ctrl-Alt-Backsteg</translation>
</message>
<message>
<source>Sort List</source>
@@ -938,10 +938,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -1102,6 +1098,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Arkiv</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1115,6 +1200,26 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -2042,6 +2147,32 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2732,11 +2863,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Not attached</source>
<comment>details (storage)</comment>
<translation type="obsolete">Inte ansluten</translation>
@@ -2965,6 +3091,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">USB-styrkort</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGDetailsUpdateThreadAudio</name>
@@ -3396,18 +3577,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Inaktivera &skärmsläckare på värddatorn</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4620,12 +4789,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indikerar aktiviteten för CD/DVD-enheterna:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indikerar aktiviteten för CD/DVD-enheterna:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Indikerar aktiviteten för diskettenheterna:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Indikerar aktiviteten för diskettenheterna:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4737,6 +4906,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -5042,10 +5221,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -5097,43 +5272,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Minimal verktygsrad:</translation>
+ <translation type="obsolete">Minimal verktygsrad:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Om kryssad, visa minimal verktygsrad i helskärmsläge och sömlöst läge.</translation>
+ <translation type="obsolete">Om kryssad, visa minimal verktygsrad i helskärmsläge och sömlöst läge.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">Visa i &helskärm/sömlöst läge</translation>
+ <translation type="obsolete">Visa i &helskärm/sömlöst läge</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Om kryssad kommer minimala verktygsraden att visas överst på skärmen istället för på dess standardposition längst ner på skärmen.</translation>
+ <translation type="obsolete">Om kryssad kommer minimala verktygsraden att visas överst på skärmen istället för på dess standardposition längst ner på skärmen.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Visa övers&t på skärmen</translation>
+ <translation type="obsolete">Visa övers&t på skärmen</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5392,11 +5559,131 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <source>No name specified for the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">3D {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">3D {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Minimal verktygsrad:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Om kryssad, visa minimal verktygsrad i helskärmsläge och sömlöst läge.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">Visa i &helskärm/sömlöst läge</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Om kryssad kommer minimala verktygsraden att visas överst på skärmen istället för på dess standardposition längst ner på skärmen.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Visa övers&t på skärmen</translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -6093,11 +6380,11 @@ serial ports</comment>
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>När kryssad kommer röret angivet i fältet <b>Portsökväg</b> att skapas av den virtuella maskinen när den startas. Om inte kommer den virtuella maskinen att försöka använda det befintliga röret.</translation>
+ <translation type="obsolete">När kryssad kommer röret angivet i fältet <b>Portsökväg</b> att skapas av den virtuella maskinen när den startas. Om inte kommer den virtuella maskinen att försöka använda det befintliga röret.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>Skapa &rör</translation>
+ <translation type="obsolete">Skapa &rör</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -6105,7 +6392,7 @@ serial ports</comment>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Visar sökvägen till serieportens rör på värden när porten arbetar i läget <b>Värdrör</b>, eller värdmaskinens serieenhetsnamn när porten arbetar i läget <b>Värdenhet</b>.</translation>
+ <translation type="obsolete">Visar sökvägen till serieportens rör på värden när porten arbetar i läget <b>Värdrör</b>, eller värdmaskinens serieenhetsnamn när porten arbetar i läget <b>Värdenhet</b>.</translation>
</message>
<message>
<source>Port %1</source>
@@ -6114,7 +6401,7 @@ serial ports</comment>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>Port/Filsökvä&g:</translation>
+ <translation type="obsolete">Port/Filsökvä&g:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -6124,6 +6411,22 @@ serial ports</comment>
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Visar I/O-basportadressen för denna serieport. Giltiga värden är heltal inom intervallet <tt>0</tt> till <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -6252,11 +6555,11 @@ serial ports</comment>
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Lägg till CD/DVD-enhet</nobr></translation>
+ <translation type="obsolete"><nobr>Lägg till CD/DVD-enhet</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Lägg till diskettenhet</nobr></translation>
+ <translation type="obsolete"><nobr>Lägg till diskettenhet</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -6300,11 +6603,11 @@ serial ports</comment>
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Lägg till CD/DVD-enhet</translation>
+ <translation type="obsolete">Lägg till CD/DVD-enhet</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Lägg till diskettenhet</translation>
+ <translation type="obsolete">Lägg till diskettenhet</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6492,15 +6795,15 @@ serial ports</comment>
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD-&enhet:</translation>
+ <translation type="obsolete">CD/DVD-&enhet:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Välj en virtuell CD/DVD-skiva eller en fysisk enhet att använda med den virtuella enheten. Den virtuella maskinen kommer att se en skiva matas in i enheten med data i filen eller på skivan i den fysiska enheten som dess innehåll.</translation>
+ <translation type="obsolete">Välj en virtuell CD/DVD-skiva eller en fysisk enhet att använda med den virtuella enheten. Den virtuella maskinen kommer att se en skiva matas in i enheten med data i filen eller på skivan i den fysiska enheten som dess innehåll.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Konfigurera den virtuella CD/DVD-enheten</translation>
+ <translation type="obsolete">Konfigurera den virtuella CD/DVD-enheten</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6524,7 +6827,7 @@ serial ports</comment>
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Välj en virtuell CD/DVD-skivfil...</translation>
+ <translation type="obsolete">Välj en virtuell CD/DVD-skivfil...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6628,6 +6931,38 @@ serial ports</comment>
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -7033,10 +7368,6 @@ serial ports</comment>
<translation type="obsolete">USB 2.0 är för närvarande aktiverat för denna virtuella maskin. Dock kräver detta att <b>%1</b> installeras. Installera Extension Pack (tilläggspaket) från VirtualBox webbplats. Efter det kommer du att kunna återaktivera USB 2.0. Det kommer att vara inaktiverat under tiden såvida inte du avbryter de aktuella inställningsändringarna.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -7056,6 +7387,10 @@ serial ports</comment>
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -7229,6 +7564,14 @@ serial ports</comment>
<source>Close</source>
<translation type="unfinished">Stäng</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Växla</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -7272,7 +7615,7 @@ serial ports</comment>
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Misslyckades med att skapa VirtualBox COM-objekt.</p><p>Programmet kommer nu att avslutas.</p></translation>
+ <translation type="obsolete"><p>Misslyckades med att skapa VirtualBox COM-objekt.</p><p>Programmet kommer nu att avslutas.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7836,7 +8179,7 @@ serial ports</comment>
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>En ny version av VirtualBox har släppts! Version <b>%1</b> finns tillgänglig på <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Du kan hämta ner denna version från denna direktlänk:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>En ny version av VirtualBox har släppts! Version <b>%1</b> finns tillgänglig på <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Du kan hämta ner denna version från denna direktlänk:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7936,7 +8279,7 @@ serial ports</comment>
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>En eller flera virtuella hårddiskar, CD/DVD- eller diskettmedia är inte tillgängliga för närvarande. Du kommer därför inte att kunna använda virtuella maskiner som använder dessa media förrän de blir åtkomliga.</p><p>Tryck på <b>Kontrollera</b> för att öppna Hanterare för virtuella media och se vilket media som är oåtkomligt, eller tryck på <b>Ignorera</b> för att ignorera detta meddelande.</p></translation>
+ <translation type="obsolete"><p>En eller flera virtuella hårddiskar, CD/DVD- eller diskettmedia är inte tillgängliga för närvarande. Du kommer därför inte att kunna använda virtuella maskiner som använder dessa media förrän de blir åtkomliga.</p><p>Tryck på <b>Kontrollera</b> för att öppna Hanterare för virtuella media och se vilket media som är oåtkomligt, eller tryck på <b>Ignorera</b> för att ignorera detta meddelande.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -7967,7 +8310,7 @@ serial ports</comment>
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Ett kritiskt fel har inträffat vid körning av den virtuella maskinen och därför har maskinkörningen stoppats.</p><p>För hjälp kan du se avsnittet Community på <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> eller ditt supportkontrakt. Tillhandahåll innehållet i loggfilen <tt>VBox.log</tt> och bildfilen <tt>VBox.png</tt> som du kan hitta i katalogen <nobr><b>%1</b></nobr>, [...]
+ <translation type="obsolete"><p>Ett kritiskt fel har inträffat vid körning av den virtuella maskinen och därför har maskinkörningen stoppats.</p><p>För hjälp kan du se avsnittet Community på <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> eller ditt supportkontrakt. Tillhandahåll innehållet i loggfilen <tt>VBox.log</tt> och bildfilen <tt>VBox.png</tt> som du kan hitta i katalogen <nobr><b>%1</b&g [...]
</message>
<message>
<source>hard disk</source>
@@ -8250,7 +8593,7 @@ serial ports</comment>
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Är du säker på att du vill ta bort CD/DVD-enheten?</p><p>Du kommer inte att kunna montera några CD- eller ISO-avbildningar eller installera Gästtillägg utan den!</p></translation>
+ <translation type="obsolete"><p>Är du säker på att du vill ta bort CD/DVD-enheten?</p><p>Du kommer inte att kunna montera några CD- eller ISO-avbildningar eller installera Gästtillägg utan den!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -8353,7 +8696,7 @@ serial ports</comment>
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Du är på väg att lägga till en ny CD/DVD-enhet till styrkortet <b>%1</b>.</p><p>Vill du välja en virtuell CD/DVD-skiva att lägga i enheten eller lämna den tom för stunden?</p></translation>
+ <translation type="obsolete"><p>Du är på väg att lägga till en ny CD/DVD-enhet till styrkortet <b>%1</b>.</p><p>Vill du välja en virtuell CD/DVD-skiva att lägga i enheten eller lämna den tom för stunden?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -8375,11 +8718,11 @@ serial ports</comment>
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Misslyckades med att koppla från CD/DVD-enheten (<nobr><b>%1</b></nobr>) från platsen <i>%2</i> för maskinen <b>%3</b>.</translation>
+ <translation type="obsolete">Misslyckades med att koppla från CD/DVD-enheten (<nobr><b>%1</b></nobr>) från platsen <i>%2</i> för maskinen <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Misslyckades med att koppla från diskettenheten (<nobr><b>%1</b></nobr>) från platsen <i>%2</i> för maskinen <b>%3</b>.</translation>
+ <translation type="obsolete">Misslyckades med att koppla från diskettenheten (<nobr><b>%1</b></nobr>) från platsen <i>%2</i> för maskinen <b>%3</b>.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
@@ -8422,11 +8765,11 @@ serial ports</comment>
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Misslyckades med att ansluta CD/DVD-enheten (<nobr><b>%1</b></nobr>) till platsen <i>%2</i> för maskinen <b>%3</b>.</translation>
+ <translation type="obsolete">Misslyckades med att ansluta CD/DVD-enheten (<nobr><b>%1</b></nobr>) till platsen <i>%2</i> för maskinen <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Misslyckades med att ansluta diskettenheten (<nobr><b>%1</b></nobr>) till platsen <i>%2</i> för maskinen <b>%3</b>.</translation>
+ <translation type="obsolete">Misslyckades med att ansluta diskettenheten (<nobr><b>%1</b></nobr>) till platsen <i>%2</i> för maskinen <b>%3</b>.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -8680,7 +9023,7 @@ serial ports</comment>
</message>
<message>
<source>Failed to drop data.</source>
- <translation type="unfinished">Misslyckades med att släppa data.</translation>
+ <translation type="obsolete">Misslyckades med att släppa data.</translation>
</message>
<message>
<source><p>Failed to initialize COM because the VirtualBox global configuration directory <b><nobr>%1</nobr></b> is not accessible. Please check the permissions of this directory and of its parent directory.</p><p>The application will now terminate.</p></source>
@@ -8939,14 +9282,6 @@ serial ports</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -9007,6 +9342,94 @@ serial ports</comment>
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -10141,13 +10564,17 @@ serial ports</comment>
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation type="unfinished"><h3>Välkommen till VirtualBox!</h3><p>På den vänstra sidan av detta fönster finns en lista över alla virtuella maskiner på din dator. Listan är tom just nu därför att du inte har skapat några virtuella maskiner än.<img src=:/welcome.png align=right/></p><p>Tryck på knappen <b>Ny</b> i huvudverktygsraden i överkanten av fönstret för att skapa en ny virtuell maskin.</p><p>Du kan trycka på tan [...]
+ <translation type="obsolete"><h3>Välkommen till VirtualBox!</h3><p>På den vänstra sidan av detta fönster finns en lista över alla virtuella maskiner på din dator. Listan är tom just nu därför att du inte har skapat några virtuella maskiner än.<img src=:/welcome.png align=right/></p><p>Tryck på knappen <b>Ny</b> i huvudverktygsraden i överkanten av fönstret för att skapa en ny virtuell maskin.</p><p>Du kan trycka på tange [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished">Hanterare</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -10180,7 +10607,7 @@ serial ports</comment>
</message>
<message>
<source>Settings</source>
- <translation>Inställningar</translation>
+ <translation type="obsolete">Inställningar</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -10233,6 +10660,10 @@ serial ports</comment>
<source>Display</source>
<translation type="unfinished">Skärm</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -10308,6 +10739,25 @@ serial ports</comment>
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">du använder för närvarande fler lagringsstyrkort än vad ett %1-chipset har stöd för. Ändra typ av chipset i systeminställningarna eller minska antalet av följande lagringsstyrkort i lagringsinställningarna: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Inställningar</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -10322,6 +10772,10 @@ serial ports</comment>
<source>Close</source>
<translation type="unfinished">Stäng</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10661,10 +11115,6 @@ serial ports</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -10676,6 +11126,10 @@ serial ports</comment>
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -12695,7 +13149,7 @@ Version %1</translation>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -13554,17 +14008,17 @@ Version %1</translation>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Anslutning av denna hårddisk kommer att genomföras indirekt med en nyligen skapad skiljande hårddisk.</translation>
+ <translation type="obsolete">Anslutning av denna hårddisk kommer att genomföras indirekt med en nyligen skapad skiljande hårddisk.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Några av de media som finns på denna hårddiskkedja är inte åtkomliga. Använd Hanterare för virtuella media i <b>Visa skiljande hårddiskar</b>-läget för att inspektera dessa media.</translation>
+ <translation type="obsolete">Några av de media som finns på denna hårddiskkedja är inte åtkomliga. Använd Hanterare för virtuella media i <b>Visa skiljande hårddiskar</b>-läget för att inspektera dessa media.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Denna bashårddisk är indirekt ansluten med följande skiljande hårddisk:</translation>
+ <translation type="obsolete">Denna bashårddisk är indirekt ansluten med följande skiljande hårddisk:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -13610,7 +14064,7 @@ Version %1</translation>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -14170,16 +14624,6 @@ Version %1</translation>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -14277,6 +14721,105 @@ Version %1</translation>
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Aktiv</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -14583,6 +15126,10 @@ Version %1</translation>
<source>C&lose</source>
<translation type="obsolete">S&täng</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
index c8c2152..cdd8704 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts
@@ -285,7 +285,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">Tam U&yum Kipi</translation>
+ <translation>Ö&zgün Kipi</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -309,11 +309,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>&Fare Bütünleştirme etkisiz</translation>
+ <translation type="obsolete">&Fare Bütünleştirme etkisiz</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Anamakine fare işaretçisi bütünleştirme geçici olarak etkisiz</translation>
+ <translation type="obsolete">Anamakine fare işaretçisi bütünleştirme geçici olarak etkisiz</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -325,11 +325,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>Ctrl-Alt-Del &Ekle</translation>
+ <translation type="obsolete">Ctrl-Alt-Del &Ekle</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Sanal makineye Ctrl-Alt-Del sıralaması gönder</translation>
+ <translation type="obsolete">Sanal makineye Ctrl-Alt-Del sıralaması gönder</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -337,7 +337,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Sanal makineye Ctrl-Alt-Backspace sıralaması gönder</translation>
+ <translation type="obsolete">Sanal makineye Ctrl-Alt-Backspace sıralaması gönder</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -409,15 +409,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&CD/DVD Aygıtları</translation>
+ <translation type="obsolete">&CD/DVD Aygıtları</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>&Disket Aygıtları</translation>
+ <translation type="obsolete">&Disket Aygıtları</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>&USB Aygıtları</translation>
+ <translation type="obsolete">&USB Aygıtları</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -464,7 +464,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation>Gün&lükleniyor...</translation>
+ <translation type="obsolete">Gün&lükleniyor...</translation>
</message>
<message>
<source>&Help</source>
@@ -493,15 +493,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>&Tam Ekrana değiştir</translation>
+ <translation type="obsolete">&Tam Ekrana değiştir</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Normal ve tam ekran kipi arasında değiştir</translation>
+ <translation type="obsolete">Normal ve tam ekran kipi arasında değiştir</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Ö&zgün Kipine değiştir</translation>
+ <translation type="obsolete">Ö&zgün Kipine değiştir</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -509,7 +509,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Küçültme Ki&pine değiştir</translation>
+ <translation type="obsolete">Küçültme Ki&pine değiştir</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -549,7 +549,7 @@
</message>
<message>
<source>Go back to showing all suppressed warnings and messages</source>
- <translation>Gösterilen tüm önlenmiş uyarılara ve mesajlara geri dön</translation>
+ <translation>Gösterilen tüm önlenmiş uyarılara ve iletilere geri dön</translation>
</message>
<message>
<source>&Network Operations Manager...</source>
@@ -569,15 +569,15 @@
</message>
<message>
<source>Show a window with product information</source>
- <translation>Ürün bilgisinin olduğu bir ileti göster</translation>
+ <translation>Ürün bilgisinin olduğu bir pencere göster</translation>
</message>
<message>
<source>Take Sn&apshot...</source>
- <translation>A&nlık görüntü al...</translation>
+ <translation>A&nlık Görüntü Al...</translation>
</message>
<message>
<source>Take Screensh&ot...</source>
- <translation>Ekran görüntü&sü al...</translation>
+ <translation>Ekran Görüntü&sü Al...</translation>
</message>
<message>
<source>Take a screenshot of the virtual machine</source>
@@ -585,7 +585,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Ctrl-Alt-Backspace &ekle</translation>
+ <translation type="obsolete">Ctrl-Alt-Backspace &ekle</translation>
</message>
<message>
<source>&File</source>
@@ -603,7 +603,7 @@
</message>
<message>
<source>Display the Virtual Media Manager window</source>
- <translation>Sanal Ortam Yöneticisi iletisini göster</translation>
+ <translation>Sanal Ortam Yöneticisi penceresini görüntüle</translation>
</message>
<message>
<source>&Import Appliance...</source>
@@ -628,7 +628,7 @@
</message>
<message>
<source>Display the global settings window</source>
- <translation>Genel ayarlar iletisini göster</translation>
+ <translation>Genel ayarlar penceresini görüntüle</translation>
</message>
<message>
<source>E&xit</source>
@@ -640,7 +640,7 @@
</message>
<message>
<source>&Group</source>
- <translation>&Grup</translation>
+ <translation>&Grupla</translation>
</message>
<message>
<source>Create a new virtual machine</source>
@@ -848,7 +848,7 @@
</message>
<message>
<source>Gro&up</source>
- <translation>Gr&up</translation>
+ <translation>Gr&upla</translation>
</message>
<message>
<source>Sort the group of the first selected machine alphabetically</source>
@@ -860,7 +860,7 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>Sürükle'v'Bırak</translation>
+ <translation type="obsolete">Sürükle'v'Bırak</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
@@ -908,124 +908,213 @@
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished"></translation>
+ <translation>Oturum Bilgisi Penceresini Göster</translation>
</message>
<message>
<source>&Webcams</source>
- <translation type="unfinished"></translation>
+ <translation>&Web Kameraları</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished"></translation>
+ <translation>Misafir Eklentileri CD kalıbını &yerleştir...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished"></translation>
+ <translation>Sanal sürücü içine Misafir Eklentileri disk dosyasını yerleştir</translation>
</message>
<message>
<source>&VirtualBox</source>
- <translation type="unfinished"></translation>
+ <translation>&VirtualBox</translation>
</message>
<message>
<source>&Menu Bar</source>
- <translation type="unfinished"></translation>
+ <translation>&Menü Çubuğu</translation>
</message>
<message>
<source>&Menu Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Menü Çubuğu Ayarları...</translation>
</message>
<message>
<source>Opens window to configure menu-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Menü çubuğunu yapılandırmak için pencere açar</translation>
</message>
<message>
<source>Show Menu &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Menü Çu&buğunu Göster</translation>
</message>
<message>
<source>Toggle menu-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Bu makine için menü çubuğu görünürlüğünü değiştir</translation>
</message>
<message>
<source>&Status Bar</source>
- <translation type="unfinished"></translation>
+ <translation>&Durum Çubuğu</translation>
</message>
<message>
<source>&Status Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Durum Çubuğu Ayarları...</translation>
</message>
<message>
<source>Opens window to configure status-bar</source>
- <translation type="unfinished"></translation>
+ <translation>Durum çubuğunu yapılandırmak için pencere açar</translation>
</message>
<message>
<source>Show Status &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>Durum Çu&buğunu Göster</translation>
</message>
<message>
<source>Toggle status-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>Bu makine için durum çubuğu görünürlüğünü değiştir</translation>
</message>
<message>
<source>&Input</source>
- <translation type="unfinished"></translation>
+ <translation>&Girdi</translation>
</message>
<message>
<source>&Keyboard</source>
- <translation type="unfinished">&Klavye</translation>
+ <translation>&Klavye</translation>
</message>
<message>
<source>&Keyboard Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Klavye Ayarları...</translation>
</message>
<message>
<source>Display the global settings window to configure shortcuts</source>
- <translation type="unfinished"></translation>
+ <translation>Kısayolları yapılandırmak için genel ayarlar penceresini görüntüle</translation>
</message>
<message>
<source>&Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>&Fare</translation>
</message>
<message>
<source>&Hard Drives</source>
- <translation type="unfinished"></translation>
+ <translation>&Sabit Sürücüler</translation>
</message>
<message>
<source>&Hard Drive Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&Sabit Sürücü Ayarları...</translation>
</message>
<message>
<source>Change the settings of hard drives</source>
- <translation type="unfinished"></translation>
+ <translation>Sabit sürücülerin ayarlarını değiştir</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished">Ağ</translation>
+ <translation>Ağ</translation>
</message>
<message>
<source>&USB Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>&USB Ayarları...</translation>
</message>
<message>
<source>Change the settings of USB devices</source>
- <translation type="unfinished"></translation>
+ <translation>US aygıtların ayarlarını değiştir</translation>
</message>
<message>
<source>&Shared Folders</source>
- <translation type="unfinished"></translation>
+ <translation>&Paylaşılan Klasörler</translation>
</message>
<message>
<source>Show &Log...</source>
<comment>debug action</comment>
- <translation type="unfinished"></translation>
+ <translation>Gün&lüğü Göster...</translation>
</message>
<message>
<source>E&xtra Data Manager...</source>
- <translation type="unfinished"></translation>
+ <translation>İla&ve Veri Yöneticisi...</translation>
</message>
<message>
<source>Display the Extra Data Manager window</source>
- <translation type="unfinished"></translation>
+ <translation>İlave Veri Yöneticisi penceresini görünütüle</translation>
+ </message>
+ <message>
+ <source>&File</source>
+ <translation>&Dosya</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation>&Pencere</translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation>&Simge Durumuna</translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation>Aktif makine penceresini simge durumuna küçült</translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation>&Tam Ekran Kipi</translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation>Normal ve tam ekran kipi arasında değiştir</translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation>&Küçültme Kipi</translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation>&Küçültme Etkeni</translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation>%1 &Ekle</translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation>Sanal makineye %1 sıralaması gönder</translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation>&Fare Bütünleştirme</translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation>Anamakine fare işaretçisi bütünleştirmesini etkinleştir</translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation>&Optik Sürücüler</translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation>&Disket Sürücüler</translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation>&USB</translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation>Sürükle ve Bırak</translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation>&Günlükleme</translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation>&Normal Başlat</translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation>&Başlıksız Başlat</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation>Seçilen sanal makineleri arka planda başlat</translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation>&Ayrılabilir Başlat</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation>Seçilen sanal makineleri arka planda devam ettiren seçenek ile başlatır</translation>
</message>
</context>
<context>
@@ -1033,12 +1122,17 @@
<message>
<source>Enable</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished">Etkinleştir</translation>
+ <translation>Etkinleştir</translation>
</message>
<message>
<source>Resize to %1x%2</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>%1x%2 olarak yeniden boyutlandır</translation>
+ </message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation>% %1</translation>
</message>
</context>
<context>
@@ -1049,6 +1143,20 @@
</message>
</context>
<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation>%1 - Disk Şifreleme</translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation>
+ <numerusform>Bu sanal makine parola korumalıdır. Lütfen aşağıya %n şifreleme parolasını girin.</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIApplianceEditorWidget</name>
<message>
<source>Virtual System %1</source>
@@ -1124,7 +1232,7 @@
</message>
<message>
<source>USB Controller</source>
- <translation>USB Denetleyici</translation>
+ <translation>USB Denetleyicisi</translation>
</message>
<message>
<source>Sound Card</source>
@@ -1170,7 +1278,7 @@
</message>
<message>
<source>When checked a new unique MAC address will assigned to all configured network cards.</source>
- <translation>Yeni bir benzersiz MAC adresi işaretlendiğinde tüm yapılandırılmış ağ kartlarına atanacaktır.</translation>
+ <translation>İşaretlendiğinde, yeni bir benzersiz MAC adresi tüm yapılandırılmış ağ kartlarına atanacak.</translation>
</message>
<message>
<source>&Reinitialize the MAC address of all network cards</source>
@@ -1651,7 +1759,7 @@
<name>UIDnDDrag</name>
<message>
<source>Retrieving data ...</source>
- <translation type="unfinished"></translation>
+ <translation>Veri alınıyor...</translation>
</message>
</context>
<context>
@@ -1761,6 +1869,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation>Durum</translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation>KİMLİK</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation>Parola</translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation>
+ <numerusform><nobr>Aşağıdaki %n sabit sürücü(ler) tarafından kullanılır:</nobr><br>%1</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>< &Back</source>
@@ -2099,7 +2232,7 @@
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2298,12 +2431,67 @@
<message>
<source>Minimal Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>En Az Yarı Sanallaştırma</translation>
</message>
<message>
<source>Hyper-V Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V Yarı Sanallaştırma</translation>
+ </message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation>KVM Yarı Sanallaştırma</translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation>[Optik Sürücü]</translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation>USB Denetleyicisi</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation>Küçültme etkeni</translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation>Küçültülmemiş HiDPI Görüntü Çıktısı</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation>Etkinleştirildi</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation>Küçük Araç Çubuğu Konumu</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>Üstte</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>Altta</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation>Küçük Araç Çubuğu</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation>Etkisizleştirildi</translation>
</message>
</context>
<context>
@@ -2536,15 +2724,15 @@
</message>
<message>
<source>Machine Windows:</source>
- <translation type="unfinished"></translation>
+ <translation>Makine Pencereleri:</translation>
</message>
<message>
<source>If checked, machine windows will be raised when the mouse pointer moves over them.</source>
- <translation type="unfinished"></translation>
+ <translation>Eğer işaretlendiyse, fare işaretçisi üzerilerine hareket ettiğinde makine pencereleri öne gelecektir.</translation>
</message>
<message>
<source>&Raise Window Under Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>Fare Altındaki Pencereyi Öne &Getir</translation>
</message>
</context>
<context>
@@ -2602,11 +2790,11 @@
</message>
<message>
<source>Holds the path to the default virtual machine folder. This folder is used, if not explicitly specified otherwise, when creating new virtual machines.</source>
- <translation>Varsayılan sanal makine klasörüne yolu gösterir. Eğer açıkça aksi hali belirtilmemişse, yeni sanal makineler oluşturulurken, bu klasör kullanılır.</translation>
+ <translation>Varsayılan sanal makine klasörü için yolu tutar. Eğer açıkça aksi hali belirtilmemişse, yeni sanal makineler oluşturulurken, bu klasör kullanılır.</translation>
</message>
<message>
<source>Holds the path to the library that provides authentication for Remote Display (VRDP) clients.</source>
- <translation>Uzak Ekran (VRDP) istemcileri için kimlik doğrulaması sağlayan kütüphaneye yolu gösterir.</translation>
+ <translation>Uzak Görüntü (VRDP) istemcilerine kimlik doğrulaması sağlayan kütüphane için yolu tutar.</translation>
</message>
<message>
<source>Default &Hard Disk Folder:</source>
@@ -2646,15 +2834,15 @@
</message>
<message>
<source>&Dock and Menubar:</source>
- <translation>&Yapışık Alan ve Menü Çubuğu:</translation>
+ <translation type="obsolete">&Yapışık Alan ve Menü Çubuğu:</translation>
</message>
<message>
<source>Auto-Show in Fullscreen</source>
- <translation>Tam Ekranda Otomatik Göster</translation>
+ <translation type="obsolete">Tam Ekranda Otomatik Göster</translation>
</message>
<message>
<source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>İşaretlendiğinde, anamakine yapışık alanı ve menü çubuğu, sanal makine tam ekran kipinde olduğunda gösterilecektir.</translation>
+ <translation type="obsolete">İşaretlendiğinde, anamakine yapışık alanı ve menü çubuğu, sanal makine tam ekran kipinde olduğunda gösterilecektir.</translation>
</message>
<message>
<source>&Host Screensaver:</source>
@@ -3761,12 +3949,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>CD/DVD aygıtlarının etkinliğini gösterir:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>CD/DVD aygıtlarının etkinliğini gösterir:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Disket aygıtlarının etkinliğini gösterir:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Disket aygıtlarının etkinliğini gösterir:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -3871,7 +4059,17 @@
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
- <translation type="unfinished"></translation>
+ <translation><p style='white-space:pre'><nobr>Görüntünün etkinliğini gösterir:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Optik sürücülerin etkinliğini gösterir:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>Disket sürücülerin etkinliğini gösterir:</nobr>%1</p></translation>
</message>
</context>
<context>
@@ -3925,19 +4123,19 @@
</message>
<message>
<source>No Webcams Connected</source>
- <translation type="unfinished"></translation>
+ <translation>Bağlı Web Kameraları Yok</translation>
</message>
<message>
<source>No supported webcams connected to the host PC</source>
- <translation type="unfinished"></translation>
+ <translation>Anamakine PC'ye bağlı desteklenen web kameraları yok</translation>
</message>
<message>
<source>Connect Network Adapter</source>
- <translation type="unfinished"></translation>
+ <translation>Ağ Bağdaştırıcısını Bağla</translation>
</message>
<message>
<source>Connect Network Adapter %1</source>
- <translation type="unfinished"></translation>
+ <translation>%1 Ağ Bağdaştırıcısını Bağla</translation>
</message>
</context>
<context>
@@ -4003,11 +4201,11 @@
</message>
<message>
<source>Enable &3D Acceleration</source>
- <translation>&3B Hızlandırma etkin</translation>
+ <translation>&3B Hızlandırmayı etkinleştir</translation>
</message>
<message>
<source>&Remote Display</source>
- <translation>&Uzak Ekran</translation>
+ <translation>&Uzak Görüntü</translation>
</message>
<message>
<source>When checked, the VM will act as a Remote Desktop Protocol (RDP) server, allowing remote clients to connect and operate the VM (when it is running) using a standard RDP client.</source>
@@ -4051,7 +4249,7 @@
</message>
<message>
<source>Enable &2D Video Acceleration</source>
- <translation>&2B Görüntü Hızlandırma etkin</translation>
+ <translation>&2B Görüntü Hızlandırmayı etkinleştir</translation>
</message>
<message>
<source>The VRDP Server port number. You may specify <tt>0</tt> (zero), to select port 3389, the standard port for RDP.</source>
@@ -4163,7 +4361,7 @@
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>Sanal makine, donanım grafikleri hızlandırmasını kullanması için ayarlanır ve işletim sistemi ipucu, Windows Vista veya sonrasına ayarlıdır. En iyi performans için makinenin görüntü belleğini en az <b>%1</b> olarak ayarlamalısınız.</translation>
+ <translation type="obsolete">Sanal makine, donanım grafikleri hızlandırmasını kullanması için ayarlanır ve işletim sistemi ipucu, Windows Vista veya sonrasına ayarlıdır. En iyi performans için makinenin görüntü belleğini en az <b>%1</b> olarak ayarlamalısınız.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -4217,44 +4415,36 @@
<translation>Ekran %1 için görüntü kaydını etkinleştir.</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Küçük Araç Çubuğu:</translation>
+ <translation type="obsolete">Küçük Araç Çubuğu:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Eğer işaretlenmişse, Tam Ekran ve Özgün kiplerinde Küçük Araç Çubuğunu gösterir.</translation>
+ <translation type="obsolete">Eğer işaretlenmişse, Tam Ekran ve Özgün kiplerinde Küçük Araç Çubuğunu gösterir.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">&Tam Ekran/Özgün İçinde Göster</translation>
+ <translation type="obsolete">&Tam Ekran/Özgün İçinde Göster</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Eğer işaretlenmişse, ekranın en altındaki varsayılan konumu yerine, ekranın en üstünde Küçük Araç Çubuğunu gösterir.</translation>
+ <translation type="obsolete">Eğer işaretlenmişse, ekranın en altındaki varsayılan konumu yerine, ekranın en üstünde Küçük Araç Çubuğunu gösterir.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Ekranın En Üstünde &Göster</translation>
+ <translation type="obsolete">Ekranın En Üstünde &Göster</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
- <translation type="unfinished"></translation>
+ <source><i>About %1MB per 5 minute video</i></source>
+ <translation><i>5 dakikalık görüntü başına yaklaşık %1MB</i></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
- <translation type="unfinished"></translation>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <translation>Uzak Görüntü bu sanal makine için şu an etkinleştirildi. Ancak bu, <i>%1</i> yüklenmesini gerektirir. Lütfen VirtualBox indirme sitesinden Genişletme Paketini yükleyin aksi halde VM'iniz Uzak Görüntü etkisizleştirilmiş olarak başlatılacaktır.</translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
- <translation type="unfinished"></translation>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
+ <translation>Sanal makine, donanım grafikleri hızlandırmasını kullanması için ayarlanır ve işletim sistemi ipucu, Windows Vista veya sonrasına ayarlıdır. En iyi performans için makinenin görüntü belleğini en az <b>%1</b> olarak ayarlamalısınız.</translation>
</message>
</context>
<context>
@@ -4265,7 +4455,7 @@
</message>
<message>
<source>Holds the path where snapshots of this virtual machine will be stored. Be aware that snapshots can take quite a lot of disk space.</source>
- <translation>Bu sanal makinenin anlık görüntülerinin saklanacağı yeri gösterir. Anlık görüntülerin oldukça disk alanı kaplayabileceğinden haberiniz olsun.</translation>
+ <translation>Bu sanal makinenin anlık görüntülerinin saklanacağı yerin yolunu tutar. Anlık görüntülerin oldukça disk alanı kaplayabileceğinden haberiniz olsun.</translation>
</message>
<message>
<source>Basi&c</source>
@@ -4373,7 +4563,7 @@
</message>
<message>
<source>Selects which clipboard data will be copied between the guest and the host OS. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>Misafir ve anamakine İS arasında kopyalanacak olan pano verisini seçer. Bu özellik misafir İS içinde Misafir Eklentilerinin yüklü olmasını gerektirir.</translation>
+ <translation>Misafir ve anamakine İS arasında kopyalanacak olan pano verisini seçer. Bu özellik misafir İS içinde Misafir Eklentilerinin yüklenmesini gerektirir.</translation>
</message>
<message>
<source>&IDE Controller Type:</source>
@@ -4389,7 +4579,7 @@
</message>
<message>
<source>Holds the description of the virtual machine. The description field is useful for commenting on configuration details of the installed guest OS.</source>
- <translation>Sanal makinenin tanımını gösterir. Açıklama alanı yüklü misafir İS'nin yapılandırma ayrıntılarında yorum yapmak için faydalıdır.</translation>
+ <translation>Sanal makinenin tanımını tutar. Açıklama alanı yüklü misafir İS'nin yapılandırma ayrıntılarında yorum yapmak için faydalıdır.</translation>
</message>
<message>
<source>&Other</source>
@@ -4459,6 +4649,126 @@
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
<translation>Sanal makine işletim sistemi ipucu 64-bit türüne ayarlı. 64-bit misafir sistemleri donanım sanallaştırması gerektirir, bu yüzden eğer değişiklikleri onaylarsanız, bu otomatik olarak etkinleştirilecektir.</translation>
</message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation>Şif&releme</translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation>İşaretlendiğinde, bu sanal makine için şifrelemeyi etkinleştirir.</translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation>Şifrelemeyi &etkinleştir</translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation>Şifreleme Ş&ifreleyici:</translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation>Sanal makine disklerini şifrelemek için kullanılacak şifreleyiciyi tutar.</translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation>Yeni Parolayı Giri&n:</translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation>Sanal makineye atanacak olan parolayı tutar.</translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation>Yeni Parolayı &Onaylayın:</translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation>Sanal makineye atanacak olan parolayı onaylar.</translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation>Bu sanal makineyi şifrelemeye çalışıyorsunuz. Ancak bu, <i>%1</i> yüklenmesini gerektirir. Lütfen VirtualBox indirme sitesinden Genişletme Paketini yükleyin.</translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation>Şifreleme şifreleyicisi türü belirlenmemiş.</translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation>Şifreleme parolası boş.</translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation>Şifreleme parolaları eşleşmiyor.</translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation>Değiştirilmemiş Bırak</translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation>VM menü çubuğu içeriklerini değiştirmeye izin verir.</translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation>Ekran Küçültme Etkeni:</translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation>Bu ayar misafir ekranı küçültme etkenini belirler.</translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation>% 100</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation>% 200</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation>HiDPI:</translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation>Eğer işaretlendiyse, misafir ekranı içerikleri yüksek anamakine ekranı çözünürlüğüne karşılık gelene kadar küçültülmeyecektir.</translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation>&Küçültülmemiş HiDPI Çıktısı kullan</translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation>Küçük Araç Çubuğu:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation>Eğer işaretlendiyse, Tam Ekran ve Özgün kiplerinde Küçük Araç Çubuğunu gösterir.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation>&Tam Ekran/Özgün İçinde Göster</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation>Eğer işaretlendiyse, ekranın en altındaki varsayılan konumu yerine, ekranın en üstünde Küçük Araç Çubuğunu gösterir.</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation>Ekranın En Üstünde &Göster</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation>VM durum çubuğu içeriklerini değiştirmeye izin verir.</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsNetwork</name>
@@ -4472,11 +4782,11 @@
</message>
<message>
<source>When checked, plugs this virtual network adapter into the virtual machine.</source>
- <translation>Seçilirse bu sanal ağ bağdaştırıcısını sanal makineye bağlar.</translation>
+ <translation>İşaretlendiğinde, bu sanal ağ bağdaştırıcısını sanal makineye bağlar.</translation>
</message>
<message>
<source>&Enable Network Adapter</source>
- <translation>Ağ Bağdaştırıcısı &etkin</translation>
+ <translation>Ağ Bağdaştırıcısını &etkinleştir</translation>
</message>
<message>
<source>A&dapter Type:</source>
@@ -4504,7 +4814,7 @@
</message>
<message>
<source>Holds the MAC address of this adapter. It contains exactly 12 characters chosen from {0-9,A-F}. Note that the second character must be an even digit.</source>
- <translation>Bu bağdaştırıcının MAC adresini gösterir. Bu, {0-9,A-F} grubundan seçilen tam olarak 12 karakteri içerir. İkinci karakterin her zaman bir çift rakam olmak zorunda olduğunu unutmayın.</translation>
+ <translation>Bu bağdaştırıcının MAC adresini tutar. Bu, {0-9,A-F} grubundan seçilen tam olarak 12 karakteri içerir. İkinci karakterin her zaman bir çift rakam olmak zorunda olduğunu unutmayın.</translation>
</message>
<message>
<source>Generates a new random MAC address.</source>
@@ -4607,7 +4917,7 @@
</message>
<message>
<source>Opens a window to manage port forwarding rules.</source>
- <translation>Bağlantı noktası yönlendirme kurallarını yönetmek için ileti açar.</translation>
+ <translation>Bağlantı noktası yönlendirme kurallarını yönetmek için bir pencere açar.</translation>
</message>
<message>
<source>&Port Forwarding</source>
@@ -4639,7 +4949,7 @@
</message>
<message>
<source>Holds the name of the internal network that this network card will be connected to. You can create a new internal network by choosing a name which is not used by any other network cards in this virtual machine or others.</source>
- <translation>Bağlanacak olan bu ağ kartının dahili ağ adını girin. Bu sanal makinede ya da diğerlerinde kullanılmayan herhangi bir diğer ağ kartının adını seçerek yeni bir dahili ağ oluşturabilirsiniz.</translation>
+ <translation>Bu ağ kartının bağlanacak olduğu dahili ağın adını tutar. Bu sanal makinede ya da diğerlerinde herhangi bir başka ağ kartı tarafından kullanılmayan bir adı seçerek yeni bir dahili ağ oluşturabilirsiniz.</translation>
</message>
<message>
<source>Selects the virtual network adapter on the host system that traffic to and from this network card will go through. You can create and remove adapters using the global network settings in the virtual machine manager window.</source>
@@ -4733,7 +5043,7 @@
</message>
<message>
<source>&Enable Parallel Port</source>
- <translation>&Paralel B.Noktası etkin</translation>
+ <translation>&Paralel B.Noktasını etkinleştir</translation>
</message>
<message>
<source>Port &Number:</source>
@@ -4741,7 +5051,7 @@
</message>
<message>
<source>Holds the parallel port number. You can choose one of the standard parallel ports or select <b>User-defined</b> and specify port parameters manually.</source>
- <translation>Paralel bağlantı noktası numarasını gösterir. Standart paralel bağlantı noktalarından birini seçebilir ya da <b>Kullanıcı-tanımlı</b> seçebilirsiniz ve bağlantı noktası parametrelerini el ile belirleyebilirsiniz.</translation>
+ <translation>Paralel bağlantı noktası numarasını tutar. Standart paralel bağlantı noktalarından birini seçebilir ya da <b>Kullanıcı-tanımlı</b> seçebilirsiniz ve bağlantı noktası parametrelerini el ile belirleyebilirsiniz.</translation>
</message>
<message>
<source>&IRQ:</source>
@@ -4757,15 +5067,15 @@
</message>
<message>
<source>Holds the host parallel device name.</source>
- <translation>Anamakine paralel aygıt adını gösterir.</translation>
+ <translation>Anamakine paralel aygıt adını tutar.</translation>
</message>
<message>
<source>Holds the IRQ number of this parallel port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
- <translation>Bu paralel bağlantı.noktasının IRQ numarasını gösterir. Bu <tt>0</tt> ve <tt>255</tt> arasında bütün bir numara olmalıdır. Eğer bu sanal makine için <b>I/O APIC</b> ayarı etkinleştirilmişse sadece <tt>15</tt>'ten büyük değerler kullanılabilir.</translation>
+ <translation>Bu paralel bağlantı noktasının IRQ numarasını tutar. Bu <tt>0</tt> ve <tt>255</tt> arasında bütün bir numara olmalıdır. Eğer bu sanal makine için <b>I/O APIC</b> ayarı etkinleştirilmişse sadece <tt>15</tt>'ten büyük değerler kullanılabilir.</translation>
</message>
<message>
<source>Holds the base I/O port address of this parallel port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
- <translation>Bu paralel bağlantı.noktasının temel G/Ç bağlantı noktası adresini gösterir. Geçerli değerler <tt>0</tt>'dan<tt>0xFFFF</tt> değerine kadar aralıktaki tam sayı numaralarıdır.</translation>
+ <translation>Bu paralel bağlantı noktasının temel G/Ç bağlantı noktası adresini tutar. Geçerli değerler <tt>0</tt>'dan<tt>0xFFFF</tt> değerine kadar aralıktaki tam sayı numaralarıdır.</translation>
</message>
</context>
<context>
@@ -4941,7 +5251,7 @@
</message>
<message>
<source>Holds the name of the shared folder (as it will be seen by the guest OS).</source>
- <translation>Paylaşılan klasörün adını gösterir (misafir İS tarafından görüldüğü şekilde olacaktır).</translation>
+ <translation>Paylaşılan klasörün adını tutar (misafir İS tarafından görüldüğü şekilde olacaktır).</translation>
</message>
<message>
<source>When checked, the guest OS will not be able to write to the specified shared folder.</source>
@@ -4965,7 +5275,7 @@
</message>
<message>
<source>If checked, this shared folder will be permanent.</source>
- <translation>Eğer işaretlenmişse, bu paylaşılan klasör kalıcı olacaktır.</translation>
+ <translation>Eğer işaretlendiyse, bu paylaşılan klasör kalıcı olacaktır.</translation>
</message>
</context>
<context>
@@ -4981,7 +5291,7 @@
</message>
<message>
<source>&Enable Serial Port</source>
- <translation>S&eri B.Noktası etkin</translation>
+ <translation>S&eri B.Noktasını etkinleştir</translation>
</message>
<message>
<source>Port &Number:</source>
@@ -5017,11 +5327,11 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Eğer işaretlenmişse, başlatılırken sanal makine tarafından <b>Bağlantı Noktası Yolu</b> alanı içinde belirtilen hat oluşturulacaktır. Aksi taktirde, sanal makine hattın var olduğunu farzedecek ve bunu kullanmayı deneyecek.</translation>
+ <translation type="obsolete">Eğer işaretlenmişse, başlatılırken sanal makine tarafından <b>Bağlantı Noktası Yolu</b> alanı içinde belirtilen hat oluşturulacaktır. Aksi taktirde, sanal makine hattın var olduğunu farzedecek ve bunu kullanmayı deneyecek.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Hat oluştur</translation>
+ <translation type="obsolete">&Hat oluştur</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5029,19 +5339,35 @@
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Bağlantı noktası <b>Anamakine Hattı</b> kipinde çalışıyorken anamakine üzerindeki seri bağlantı noktasının hattına olan yolu gösterir ya da bağlantı noktası <b>Anamakine Aygıtı</b> kipinde çalışıyorken anamakine seri aygıt adını gösterir.</translation>
+ <translation type="obsolete">Bağlantı noktası <b>Anamakine Hattı</b> kipinde çalışıyorken anamakine üzerindeki seri bağlantı noktasının hattına olan yolu gösterir ya da bağlantı noktası <b>Anamakine Aygıtı</b> kipinde çalışıyorken anamakine seri aygıt adını gösterir.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>B.Noktası/Dosya &Yolu:</translation>
+ <translation type="obsolete">B.Noktası/Dosya &Yolu:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
- <translation>Bu seri bağlantı noktasının IRQ numarasını gösterir. Bu <tt>0</tt> ve <tt>255</tt> arasında bütün bir numara olmalıdır. Eğer bu sanal makine için <b>I/O APIC</b> ayarı etkinleştirilmişse sadece <tt>15</tt>'ten büyük değerler kullanılabilir.</translation>
+ <translation>Bu seri bağlantı noktasının IRQ numarasını tutar. Bu <tt>0</tt> ve <tt>255</tt> arasında bütün bir numara olmalıdır. Eğer bu sanal makine için <b>I/O APIC</b> ayarı etkinleştirilmişse sadece <tt>15</tt>'ten büyük değerler kullanılabilir.</translation>
</message>
<message>
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
- <translation>Bu seri bağlantı.noktasının temel G/Ç bağlantı noktası adresini gösterir. Geçerli değerler <tt>0</tt>'dan<tt>0xFFFF</tt> değerine kadar aralıktaki tam sayı numaralarıdır.</translation>
+ <translation>Bu seri bağlantı noktasının temel G/Ç bağlantı noktası adresini tutar. Geçerli değerler <tt>0</tt>'dan<tt>0xFFFF</tt> değerine kadar aralıktaki tam sayı numaralarıdır.</translation>
+ </message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation>Eğer işaretlendiyse, sanal makine <b>Yol/Adres</b> alanında belirtilmiş hat ya da yuvanın mevcut olduğunu varsayacak ve kullanmaya çalışacak. Aksi halde hat ya da yuva sanal makine tarafından başlatıldığında oluşturulacaktır.</translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation>Varolan hatta/yuvaya &bağlan</translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation>&Yol/Adres:</translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation><p><b>Anamakine Hattı</b> kipinde: Anamakinedeki seri bağlantı noktasının hattı için yolu tutar. Örnek: "\\.\pipe\myvbox" veya "/tmp/myvbox", ayrı ayrı Windows ve UNIX-gibi sistemler için.</p><p><b>Anamakine Aygıtı</b> kipinde: Anamakine seri aygıt adını tutar. Örnek: "COM1" veya "/dev/ttyS0".</p><p><b>Ham Dosya</b> kipinde: Anamakine sistemindeki, seri çıktının [...]
</message>
</context>
<context>
@@ -5123,11 +5449,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>CD/DVD Aygıtı Ekle</nobr></translation>
+ <translation type="obsolete"><nobr>CD/DVD Aygıtı Ekle</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Disket Aygıtı Ekle</nobr></translation>
+ <translation type="obsolete"><nobr>Disket Aygıtı Ekle</nobr></translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -5167,11 +5493,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>CD/DVD Aygıtı ekle</translation>
+ <translation type="obsolete">CD/DVD Aygıtı ekle</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Disket Aygıtı ekle</translation>
+ <translation type="obsolete">Disket Aygıtı ekle</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5319,19 +5645,19 @@
</message>
<message>
<source>Set up the virtual hard disk</source>
- <translation>Sanal sabit disk ayarla</translation>
+ <translation>Sanal sabit diski ayarla</translation>
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>CD/DVD &Sürücü:</translation>
+ <translation type="obsolete">CD/DVD &Sürücü:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Sanal sürücü ile kullanmak için sanal bir CD/DVD disk ya da fiziksel bir sürücü seçin. Sanal makine, dosyadaki veriyle sürücüye yerleştirilen bir diski veya fiziksel sürücüdeki diski, içerikleri gibi görecek.</translation>
+ <translation type="obsolete">Sanal sürücü ile kullanmak için sanal bir CD/DVD disk ya da fiziksel bir sürücü seçin. Sanal makine, dosyadaki veriyle sürücüye yerleştirilen bir diski veya fiziksel sürücüdeki diski, içerikleri gibi görecek.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Sanal CD/DVD sürücü ayarla</translation>
+ <translation type="obsolete">Sanal CD/DVD sürücü ayarla</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -5343,7 +5669,7 @@
</message>
<message>
<source>Set up the virtual floppy drive</source>
- <translation>Sanal disket sürücü ayarla</translation>
+ <translation>Sanal disket sürücüyü ayarla</translation>
</message>
<message>
<source>Create a new hard disk...</source>
@@ -5355,7 +5681,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Sanal bir CD/DVD disk dosyası seçin...</translation>
+ <translation type="obsolete">Sanal bir CD/DVD disk dosyası seçin...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -5375,7 +5701,7 @@
</message>
<message>
<source>When checked the guest system will see the virtual disk as a solid state device.</source>
- <translation>İşaretlendiğinde, misafir sistem sanal diski katı hal sürücüsü (SSD) gibi görecek.</translation>
+ <translation>İşaretlendiğinde, misafir sistem sanal diski bir katı hal aygıtı (SSD) gibi görecek.</translation>
</message>
<message>
<source>&Solid-state Drive</source>
@@ -5445,15 +5771,47 @@
</message>
<message>
<source>Add USB Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB Denetleyicisi ekle</translation>
</message>
<message>
<source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
- <translation type="unfinished"></translation>
+ <translation>İşaretlendiğinde, misafir sistem sanal diski bir çalışırken-takılabilir aygıt gibi görecek.</translation>
</message>
<message>
<source>&Hot-pluggable</source>
- <translation type="unfinished"></translation>
+ <translation>Çalışırken-&takılabilir</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation>Sanal bir optik disk dosyası seçin...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation><nobr>Optik Sürücü Ekle</nobr></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation><nobr>Disket Sürücü Ekle</nobr></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation>Optik Sürücü ekle</translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation>Disket Sürücü ekle</translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation>Optik &Sürücü:</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation>Sanal sürücü ile kullanmak için sanal bir optik disk ya da fiziksel bir sürücü seçin. Sanal makine, dosyadaki veriyle sürücüye yerleştirilen bir diski veya fiziksel sürücüdeki diski, içerikleri gibi görecek.</translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation>Sanal optik sürücüyü ayarla</translation>
</message>
</context>
<context>
@@ -5541,7 +5899,7 @@
</message>
<message>
<source>Enable &I/O APIC</source>
- <translation>&G/Ç APIC etkin</translation>
+ <translation>&G/Ç APIC etkinleştir</translation>
</message>
<message>
<source>&Processor</source>
@@ -5557,7 +5915,7 @@
</message>
<message>
<source>Enable PA&E/NX</source>
- <translation>PA&E/NX etkin</translation>
+ <translation>PA&E/NX etkinleştir</translation>
</message>
<message>
<source>Acce&leration</source>
@@ -5573,7 +5931,7 @@
</message>
<message>
<source>Enable &VT-x/AMD-V</source>
- <translation>&VT-x/AMD-V etkin</translation>
+ <translation>&VT-x/AMD-V etkinleştir</translation>
</message>
<message>
<source>When checked, the virtual machine will try to make use of the nested paging extension of Intel VT-x and AMD-V.</source>
@@ -5581,7 +5939,7 @@
</message>
<message>
<source>Enable Nested Pa&ging</source>
- <translation>İçiçe Sa&yfalama etkin</translation>
+ <translation>İçiçe Sa&yfalamayı etkinleştir</translation>
</message>
<message>
<source><qt>%1 CPUs</qt></source>
@@ -5590,19 +5948,19 @@
</message>
<message>
<source>When checked, the guest will support the Extended Firmware Interface (EFI), which is required to boot certain guest OSes. Non-EFI aware OSes will not be able to boot if this option is activated.</source>
- <translation>İşaretlendiğinde, misafir, belli misafir İS'lerin önyüklemesini gerektiren Genişletilmiş Donanım Yazılımı Arayüzünü (EFI) destekleyecek. Eğer bu seçenek etkinleştirildiyse, EFI-olmamadan habersiz İS'leri önyükleme yapılamayacaktır.</translation>
+ <translation>İşaretlendiğinde misafir, belli misafir İS'lerin önyüklemesini gerektiren Genişletilmiş Donanım Yazılımı Arayüzünü (EFI) destekleyecek. Eğer bu seçenek etkinleştirildiyse, EFI'sız tanınan İS'leri önyükleme yapılamayacaktır.</translation>
</message>
<message>
<source>Enable &EFI (special OSes only)</source>
- <translation>&EFI (sadece özel İS'leri) etkin</translation>
+ <translation>&EFI etkinleştir (sadece özel İS'leri)</translation>
</message>
<message>
<source>If checked, the RTC device will report the time in UTC, otherwise in local (host) time. Unix usually expects the hardware clock to be set to UTC.</source>
- <translation>Eğer işaretlenmişse, RTC aygıtı UTC olarak zamanı, aksi takdirde yerel (anamakine) zamanı bildirecek. Unix genellikle donanım saatinin UTC'ye ayarlanmasını bekler.</translation>
+ <translation>Eğer işaretlendiyse, RTC aygıtı zamanı UTC olarak, aksi takdirde yerel (anamakine) zamanı bildirecek. Unix genellikle donanım saatinin UTC'ye ayarlanmasını bekler.</translation>
</message>
<message>
<source>Hardware Clock in &UTC Time</source>
- <translation>&UTC zamanı olarak donanım saati</translation>
+ <translation>&UTC Zamanı olarak Donanım Saati</translation>
</message>
<message>
<source>Controls the number of virtual CPUs in the virtual machine. You need hardware virtualization support on your host system to use more than one virtual CPU.</source>
@@ -5622,7 +5980,7 @@
</message>
<message>
<source>Selects the chipset to be emulated in this virtual machine. Note that the ICH9 chipset emulation is experimental and not recommended except for guest systems (such as Mac OS X) which require it.</source>
- <translation>Bu sanal makinede uyarlanan yonga setini seçer. ICH9 yonga seti uyarlamasının deneysel olduğunu ve gerektiren misafir sistemler (Mac OS X gibi) hariç, önerilmediğini unutmayın.</translation>
+ <translation>Bu sanal makinede benzetilen yonga setini seçer. ICH9 yonga seti benzetiminin deneysel olduğunu ve gerektiren misafir sistemler (Mac OS X gibi) hariç, önerilmediğini unutmayın.</translation>
</message>
<message>
<source>&Execution Cap:</source>
@@ -5660,7 +6018,7 @@
</message>
<message>
<source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
- <translation>Uyarlanan işaretleme aygıtının bir standart PS/2 fare, bir USB tablet ya da bir USB çoklu-dokunmalı tablet olup olmadığını belirler.</translation>
+ <translation>Benzetilen işaretleme aygıtının bir standart PS/2 fare, bir USB tablet ya da bir USB çoklu-dokunmalı tablet olup olmadığını belirler.</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
@@ -5700,27 +6058,27 @@
</message>
<message>
<source>&Paravirtualization Interface:</source>
- <translation type="unfinished"></translation>
+ <translation>&Yarı Sanallaştırma Arayüzü:</translation>
</message>
<message>
<source>Selects the paravirtualization guest interface provider to be used by this virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>Bu sanal makine tarafından kullanılacak yarı sanallaştırma misafir arayüzü sağlayıcısını seçer.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9 you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>G/Ç APIC özelliği şu an Sistem sayfasının Anakart bölümünde etkinleştirilmedi. Bu, sizin bu VM için etkinleştirdiğiniz ICH9 türü bir yonga setini desteklemek için gereklidir. Eğer değişikliklerinizi onaylarsanız, bu otomatik olarak yapılacaktır.</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>USB denetleyicisi benzetimi şu an USB sayfasında etkinleştirilmedi. Bu, sizin bu VM için etkinleştirdiğiniz bir benzetilen USB girdi aygıtı desteklemek için gereklidir. Eğer değişikliklerinizi onaylarsanız, bu otomatik olarak yapılacaktır.</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>G/Ç APIC özelliği şu an Sistem sayfasının Anakart bölümünde etkinleştirilmedi. Bu, sizin bu VM için seçtiğiniz birden fazla sanal işlemciyi desteklemek için gereklidir. Eğer değişikliklerinizi onaylarsanız, bu otomatik olarak yapılacaktır.</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>Donanım sanallaştırma şu an Sistem sayfasının Hızlandırma bölümünde etkinleştirilmedi. Bu, sizin bu VM için seçtiğiniz birden fazla sanal işlemciyi desteklemek için gereklidir. Eğer değişikliklerinizi onaylarsanız, bu otomatik olarak yapılacaktır.</translation>
</message>
</context>
<context>
@@ -5784,7 +6142,7 @@
</message>
<message>
<source>Enable &USB Controller</source>
- <translation>&USB Denetleyicisi etkin</translation>
+ <translation>&USB Denetleyicisini etkinleştir</translation>
</message>
<message>
<source>When checked, enables the virtual USB EHCI controller of this machine. The USB EHCI controller provides USB 2.0 support.</source>
@@ -5852,27 +6210,31 @@
</message>
<message>
<source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>USB 2.0 şu anda bu sanal makine için etkinleştirildi. Ancak, bu <b>%1</b> yüklenmesini gerektirir. Lütfen VirtualBox indirme sitesinden Genişletme Paketini yükleyin ya da makineyi başlatmak için USB 2.0'ı etkisizleştirin.</translation>
+ <translation type="obsolete">USB 2.0 şu anda bu sanal makine için etkinleştirildi. Ancak, bu <b>%1</b> yüklenmesini gerektirir. Lütfen VirtualBox indirme sitesinden Genişletme Paketini yükleyin ya da makineyi başlatmak için USB 2.0'ı etkisizleştirin.</translation>
</message>
<message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>İşaretlendiğinde, bu makinenin sanal USB OHCI denetleyicisini etkinleştirir. USB OHCI denetleyicisi USB 1.0 desteği sağlar.</translation>
</message>
<message>
<source>USB &1.1 (OHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &1.1 (OHCI) Denetleyicisi</translation>
</message>
<message>
<source>USB &2.0 (EHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &2.0 (EHCI) Denetleyicisi</translation>
</message>
<message>
<source>When checked, enables the virtual USB xHCI controller of this machine. The USB xHCI controller provides USB 3.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>İşaretlendiğinde, bu makinenin sanal USB xHCI denetleyicisini etkinleştirir. USB xHCI denetleyicisi USB 3.0 desteği sağlar.</translation>
</message>
<message>
<source>USB &3.0 (xHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &3.0 (xHCI) Denetleyicisi</translation>
+ </message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation>USB 2.0/3.0 bu sanal makine için şu an etkinleştirildi. Ancak bu, <b>%1</b> yüklenmesini gerektirir. Lütfen VirtualBox indirme sitesinden Genişletme Paketini yükleyin ya da makineyi başlatabilmek için USB 2.0/3.0'ı etkisizleştirin.</translation>
</message>
</context>
<context>
@@ -5898,7 +6260,7 @@
</message>
<message>
<source>Holds the filter name.</source>
- <translation>Süzgeç adını gösterir.</translation>
+ <translation>Süzgeç adını tutar.</translation>
</message>
<message>
<source>&Vendor ID:</source>
@@ -5962,7 +6324,7 @@
</message>
<message>
<source>Defines whether this filter applies to USB devices attached locally to the host computer (<i>No</i>), to a VRDP client's computer (<i>Yes</i>), or both (<i>Any</i>).</source>
- <translation>Bu süzgecin anamakine bilgisayarına yerel olarak takılı USB aygıtlara (<i>Hayır</i>), VRDP istemcilerinin bilgisayarlarına (<i>Evet</i>) ya da her ikisinede (<i>Herhangi</i>) uygulanıp uygulanmayacağını tanımlar.</translation>
+ <translation>Bu süzgecin anamakine bilgisayarına yerel olarak takılı USB aygıtlara (<i>Hayır</i>), VRDP istemcilerinin bilgisayarlarına (<i>Evet</i>) ya da her ikisine de (<i>Herhangi</i>) uygulanıp uygulanmayacağını tanımlar.</translation>
</message>
<message>
<source>&Action:</source>
@@ -5988,14 +6350,14 @@
<name>UIMachineWindowNormal</name>
<message>
<source>Shows the currently assigned Host key.<br>This key, when pressed alone, toggles the keyboard and mouse capture state. It can also be used in combination with other keys to quickly perform actions from the main menu.</source>
- <translation>Şu andaki atanmış Anamakine tuşunu gösterir.<br> Bu tuş, yalnız basıldığında, klavye ve fare yakalama durumunu değiştirir. Ayrıca eylemleri ana menüden daha hızlı gerçekleştirmek için diğer tuşlar ile birlikte kullanılabilir.</translation>
+ <translation>Şu anki atanmış Anamakine tuşunu gösterir.<br> Bu tuş, yalnız basıldığında, klavye ve fare yakalama durumunu değiştirir. Ayrıca eylemleri ana menüden daha hızlı gerçekleştirmek için diğer tuşlar ile birlikte kullanılabilir.</translation>
</message>
</context>
<context>
<name>UIMediumManager</name>
<message>
<source>&Hard drives</source>
- <translation>Sa&bit diskler</translation>
+ <translation>Sa&bit sürücüler</translation>
</message>
<message>
<source>&Optical disks</source>
@@ -6015,7 +6377,7 @@
</message>
<message>
<source>Removing medium...</source>
- <translation type="unfinished"></translation>
+ <translation>Ortam kaldırılıyor...</translation>
</message>
</context>
<context>
@@ -6037,15 +6399,23 @@
<name>UIMenuBarEditorWidget</name>
<message>
<source>Virtual Screen Resize</source>
- <translation type="unfinished"></translation>
+ <translation>Sanal Ekran Yeniden Boyutlandırma</translation>
</message>
<message>
<source>Virtual Screen Mapping</source>
- <translation type="unfinished"></translation>
+ <translation>Sanal Ekran Eşleme</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">Kapat</translation>
+ <translation>Kapat</translation>
+ </message>
+ <message>
+ <source>Switch</source>
+ <translation>Değiştir</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation>Menü Çubuğunu etkinleştir</translation>
</message>
</context>
<context>
@@ -6090,7 +6460,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>VirtualBox COM nesnesini oluşturma başarısız.</p><p>Uygulama şimdi sonlandırılacak.</p></translation>
+ <translation type="obsolete"><p>VirtualBox COM nesnesini oluşturma başarısız.</p><p>Uygulama şimdi sonlandırılacak.</p></translation>
</message>
<message>
<source><p>Failed to load the global GUI configuration.</p><p>The application will now terminate.</p></source>
@@ -6267,7 +6637,7 @@
</message>
<message>
<source>Failed to detach the USB device <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation><b>%1</b> USB aygıtını <b>%2</b> sanal makinesinden çıkartma başarısız.</translation>
+ <translation><b>%1</b> USB aygıtını <b>%2</b> sanal makinesinden ayırma başarısız.</translation>
</message>
<message>
<source>Failed to create the shared folder <b>%1</b> (pointing to <nobr><b>%2</b></nobr>) for the virtual machine <b>%3</b>.</source>
@@ -6279,7 +6649,7 @@
</message>
<message>
<source><p>The Virtual Machine reports that the guest OS does not support <b>mouse pointer integration</b> in the current video mode. You need to capture the mouse (by clicking over the VM display or pressing the host key) in order to use the mouse inside the guest OS.</p></source>
- <translation><p>Sanal makine misafir İS'de şu anki görüntü kipinde <b>fare işaretçisi bütünleştirme</b> desteklemediğini bildiriyor. Misafir İS içerisinde farenizi kullanmak için farenizi yakalamanız (VM ekranı üzerine tıklayarak ya da anamakine tuşuna basarak) gerekli.</p></translation>
+ <translation><p>Sanal Makine misafir İS'de şu anki görüntü kipinde <b>fare işaretçisi bütünleştirmeyi</b> desteklemediğini bildiriyor. Misafir İS içerisinde farenizi kullanmak için farenizi yakalamanız (VM ekranı üzerine tıklayarak ya da anamakine tuşuna basarak) gerekli.</p></translation>
</message>
<message>
<source><p>The Virtual Machine is currently in the <b>Paused</b> state and not able to see any keyboard or mouse input. If you want to continue to work inside the VM, you need to resume it by selecting the corresponding action from the menu bar.</p></source>
@@ -6316,7 +6686,7 @@
</message>
<message>
<source><p>A fatal error has occurred during virtual machine execution! The virtual machine will be powered off. Please copy the following error message using the clipboard to help diagnose the problem:</p></source>
- <translation><p>Sanal makinenin çalıştırılması sırasında önemli bir hata meydana geldi! Sanal makine gücü kapatılacaktır. Lütfen sorunu teşhis etmede yardımcı olmak için panoyu kullanarak aşağıdaki hata mesajını kopyalayın:</p></translation>
+ <translation><p>Sanal makinenin çalıştırılması sırasında önemli bir hata meydana geldi! Sanal makine gücü kapatılacaktır. Lütfen sorunu teşhis etmede yardımcı olmak için panoyu kullanarak aşağıdaki hata iletisini kopyalayın:</p></translation>
</message>
<message>
<source><p>An error has occurred during virtual machine execution! The error details are shown below. You may try to correct the error and resume the virtual machine execution.</p></source>
@@ -6583,11 +6953,11 @@
</message>
<message>
<source><p>You have the <b>Auto capture keyboard</b> option turned on. This will cause the Virtual Machine to automatically <b>capture</b> the keyboard every time the VM window is activated and make it unavailable to other applications running on your host machine: when the keyboard is captured, all keystrokes (including system ones like Alt-Tab) will be directed to the VM.</p><p>You can press the <b>host key</b> at any time t [...]
- <translation><p><b>Klavyeyi otomatik yakala</b> seçeneğiniz açılmış. Bu, VM pencersinin etkinleştirildiği her seferde Sanal Makinenin klavyenizi otomatik olarak <b>yakalamasına</b> neden olacak ve anamakinenizde çalışan diğer uygulamar için kullanılamaz yapacak: klavye yakalandığında tüm tuşa basmalar (Alt-Tab gibi sistem için olanlar da dahil) VM'eyönlendirilecektir.</p><p>İstediğiniz zaman klavyeyi ve fareyi (eğer yakalandıysa) < [...]
+ <translation><p><b>Klavyeyi otomatik yakala</b> seçeneğiniz açılmış. Bu, VM penceresinin etkinleştirildiği her seferde Sanal Makinenin klavyenizi otomatik olarak <b>yakalamasına</b> neden olacak ve anamakinenizde çalışan diğer uygulamar için kullanılamaz yapacak: klavye yakalandığında tüm tuşa basmalar (Alt-Tab gibi sistem için olanlar da dahil) VM'eyönlendirilecektir.</p><p>İstediğiniz zaman klavyeyi ve fareyi (eğer yakalandıysa) &l [...]
</message>
<message>
<source><p>The Virtual Machine reports that the guest OS supports <b>mouse pointer integration</b>. This means that you do not need to <i>capture</i> the mouse pointer to be able to use it in your guest OS -- all mouse actions you perform when the mouse pointer is over the Virtual Machine's display are directly sent to the guest OS. If the mouse is currently captured, it will be automatically uncaptured.</p><p>The mouse icon on the s [...]
- <translation><p>Sanal Makine misafir İS'nin <b>fare işaretçisi bütünleştirme</b> desteklediğini bildiriyor. Bu, fare işaretçisinin misafir İS'niz içinde kullanılabilmesi için <i>yaklamanıza</i> gerek olmadığı anlamına geliyor -- Sanal Makine ekranının üzerine fare işaretçisi geldiğinde gerçekleştirdiğiniz tüm fare eylemleri doğrudan misafir İS'ne gönderilir. Eğer fare şu anda yakalanırsa, otomatik olarak serbest bırakılacaktır.</p&g [...]
+ <translation><p>Sanal Makine misafir İS'nin <b>fare işaretçisi bütünleştirmeyi</b> desteklediğini bildiriyor. Bu, fare işaretçisinin misafir İS'niz içinde kullanılabilmesi için <i>yakalamanıza</i> gerek olmadığı anlamına geliyor -- Sanal Makine ekranının üzerine fare işaretçisi geldiğinde gerçekleştirdiğiniz tüm fare eylemleri doğrudan misafir İS'ne gönderilir. Eğer fare şu anda yakalanırsa, otomatik olarak serbest bırakılacaktır.</ [...]
</message>
<message>
<source>&Contents...</source>
@@ -6639,7 +7009,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>VirtualBox'ın yeni bir sürümü yayımlandı! Sürüm <b>%1</b> <a href="http://www.virtualbox.org/">virtualbox.org</a> adresinde mevcuttur.</p><p>Şu bağlantıyı kullanarak bu sürümü indirebilirsiniz:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>VirtualBox'ın yeni bir sürümü yayımlandı! Sürüm <b>%1</b> <a href="http://www.virtualbox.org/">virtualbox.org</a> adresinde mevcuttur.</p><p>Şu bağlantıyı kullanarak bu sürümü indirebilirsiniz:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6719,7 +7089,7 @@
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Bir ya da daha fazla sanal sabit disk, CD/DVD veya disket kalıbı dosyası şu anda erişilebilir değil. Sonuç olarak, daha sonra erişilebilir olana kadar bu dosyaları kullanan sanal makineleri işletemeyceksiniz.</p><p>Sanal Ortam Yöneticisi penceresini açmak için <b>Kontrol et</b> düğmesine basın ve hangi dosyaların erişilemez olduğunu görün, ya da bu mesajı yoksaymak için <b>Yoksay</b> düğmesine basın.</p></translation>
+ <translation type="obsolete"><p>Bir ya da daha fazla sanal sabit disk, CD/DVD veya disket kalıbı dosyası şu anda erişilebilir değil. Sonuç olarak, daha sonra erişilebilir olana kadar bu dosyaları kullanan sanal makineleri işletemeyceksiniz.</p><p>Sanal Ortam Yöneticisi penceresini açmak için <b>Kontrol et</b> düğmesine basın ve hangi dosyaların erişilemez olduğunu görün, ya da bu mesajı yoksaymak için <b>Yoksay</b> düğmesine basın.</p& [...]
</message>
<message>
<source>&More</source>
@@ -6738,7 +7108,7 @@
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Sanal makine çalışırken ciddi bir hata meydana geldi ve makinenin çalıştırılması durdu.</p><p>Yardım için lütfen <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> adresindeki Community bölümüne veya destek sözleşmenize bakın. Lütfen <nobr><b>%1</b></nobr> dizininde bulabileceğiniz <tt>VBox.log</tt> günlük dosyasının ve <tt>VBox.png</tt> resim dosyasının içeriklerinin yanısı [...]
+ <translation type="obsolete"><p>Sanal makine çalışırken ciddi bir hata meydana geldi ve makinenin çalışması durduruldu.</p><p>Yardım için lütfen <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> adresindeki Community bölümüne veya destek sözleşmenize bakın. Lütfen <nobr><b>%1</b></nobr> dizininde bulabileceğiniz <tt>VBox.log</tt> günlük dosyasının ve <tt>VBox.png</tt> resim dosyasının içer [...]
</message>
<message>
<source>hard disk</source>
@@ -6958,7 +7328,7 @@
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>CD/DVD aygıtını silmek istediğinize emin misiniz?</p><p>Herhangi bir CD veya ISO kalıbını yerleştiremeyeceksiniz ya da onsuz Misafir Eklentilerini yükleyemeyeceksiniz!</p></translation>
+ <translation type="obsolete"><p>CD/DVD aygıtını silmek istediğinize emin misiniz?</p><p>Herhangi bir CD veya ISO kalıbını yerleştiremeyeceksiniz ya da onsuz Misafir Eklentilerini yükleyemeyeceksiniz!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -7045,7 +7415,7 @@
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p><b>%1</b> denetleyicisine yeni bir CD/DVD sürücü eklemek üzeresiniz.</p><p>Sürücüye koymak için sanal bir CD/DVD disk seçmek ya da şimdilik boş bırakmak ister misiniz?</p></translation>
+ <translation type="obsolete"><p><b>%1</b> denetleyicisine yeni bir CD/DVD sürücü eklemek üzeresiniz.</p><p>Sürücüye koymak için sanal bir CD/DVD disk seçmek ya da şimdilik boş bırakmak ister misiniz?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -7063,15 +7433,15 @@
</message>
<message>
<source>Failed to detach the hard disk (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation><b>%3</b> makinesinin <i>%2</i> yuvasından sabit diski (<nobr><b>%1</b></nobr>) çıkartma başarısız.</translation>
+ <translation><b>%3</b> makinesinin <i>%2</i> yuvasından sabit diski (<nobr><b>%1</b></nobr>) ayırma başarısız.</translation>
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation><b>%3</b> makinesinin <i>%2</i> yuvasından CD/DVD aygıtını (<nobr><b>%1</b></nobr>) çıkartma başarısız.</translation>
+ <translation type="obsolete"><b>%3</b> makinesinin <i>%2</i> yuvasından CD/DVD aygıtını (<nobr><b>%1</b></nobr>) çıkartma başarısız.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation><b>%3</b> makinesinin <i>%2</i> yuvasından disket aygıtını (<nobr><b>%1</b></nobr>) çıkartma başarısız.</translation>
+ <translation type="obsolete"><b>%3</b> makinesinin <i>%2</i> yuvasından disket aygıtını (<nobr><b>%1</b></nobr>) çıkartma başarısız.</translation>
</message>
<message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
@@ -7091,7 +7461,7 @@
</message>
<message>
<source>The current port forwarding rules are not valid. None of the host or guest port values may be set to zero.</source>
- <translation>Şu anki bağlantı noktası yönlendirme kuralları geçerli değil. Anamakine veya misafir bağlantı noktası değerleri sıfıra ayarlanmış olabilir.</translation>
+ <translation>Şu anki bağlantı noktası yönlendirme kuralları geçerli değil. Anamakine veya misafir bağlantı noktası değerlerinin hiçbiri sıfıra ayarlanmamış olabilir.</translation>
</message>
<message>
<source><p>There are unsaved changes in the port forwarding configuration.</p><p>If you proceed your changes will be discarded.</p></source>
@@ -7103,11 +7473,11 @@
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation><b>%3</b> makinesinin <i>%2</i> yuvasına CD/DVD aygıtını (<nobr><b>%1</b></nobr>) takma başarısız.</translation>
+ <translation type="obsolete"><b>%3</b> makinesinin <i>%2</i> yuvasına CD/DVD aygıtını (<nobr><b>%1</b></nobr>) takma başarısız.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation><b>%3</b> makinesinin <i>%2</i> yuvasına disket aygıtını (<nobr><b>%1</b></nobr>) takma başarısız.</translation>
+ <translation type="obsolete"><b>%3</b> makinesinin <i>%2</i> yuvasına disket aygıtını (<nobr><b>%1</b></nobr>) takma başarısız.</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -7340,11 +7710,11 @@
</message>
<message>
<source>You are about to create a new virtual machine without a hard drive. You will not be able to install an operating system on the machine until you add one. In the mean time you will only be able to start the machine using a virtual optical disk or from the network.</source>
- <translation>Sabit diski olmayan yeni bir sanal makine oluşturmak üzeresiniz. Bir tane ekleyene kadar makine üzerine bir işletim sistemi yükleyemeyeceksiniz. Bu arada sadece sanal optik diski kullanarak veya ağdan makineyi başlatabileceksiniz.</translation>
+ <translation>Sabit sürücü olmayan yeni bir sanal makine oluşturmak üzeresiniz. Bir tane ekleyene kadar makine üzerine bir işletim sistemi yükleyemeyeceksiniz. Bu arada sadece sanal optik diski kullanarak veya ağdan makineyi başlatabileceksiniz.</translation>
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Veriyi kaldırma başarısız.</translation>
+ <translation type="obsolete">Veriyi kaldırma başarısız.</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -7448,7 +7818,7 @@
</message>
<message>
<source>&Choose existing disk</source>
- <translation>Mevcut diski &seçin</translation>
+ <translation>Mevcut diski &seç</translation>
</message>
<message>
<source>Leave &empty</source>
@@ -7456,7 +7826,7 @@
</message>
<message>
<source>&Choose disk</source>
- <translation>&Disk seçin</translation>
+ <translation>&Disk seç</translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
@@ -7579,11 +7949,11 @@
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p><b>VirtualBox Misafir Eklentileri</b> disk kalıbı dosyası <nobr><a href="%1">%1</a></nobr> adresinden başarılı olarak indirildi ve <nobr><b>%2</b></nobr> ile yerel olarak kaydedildi.</p><p>Bu disk kalıbı dosyasını kaydettirmek ve sanal CD/DVD sürücüsüne yerleştirmek ister misiniz?</p></translation>
+ <translation type="obsolete"><p><b>VirtualBox Misafir Eklentileri</b> disk kalıbı dosyası <nobr><a href="%1">%1</a></nobr> adresinden başarılı olarak indirildi ve <nobr><b>%2</b></nobr> ile yerel olarak kaydedildi.</p><p>Bu disk kalıbı dosyasını kaydettirmek ve sanal CD/DVD sürücüsüne yerleştirmek ister misiniz?</p></translation>
</message>
<message>
<source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><b>%1</b> sanal makinesi içine <b>VirtualBox Misafir Eklentileri</b> disk kalıbı dosyası yerleştirilemedi, makine CD/DVD sürücülere sahip değil gibi. Lütfen sanal makine ayarları penceresinin depolama sayfasını kullanarak bir sürücü ekleyin.</p></translation>
+ <translation type="obsolete"><b>%1</b> sanal makinesi içine <b>VirtualBox Misafir Eklentileri</b> disk kalıbı dosyası yerleştirilemedi, makine CD/DVD sürücülere sahip değil gibi. Lütfen sanal makine ayarları penceresinin depolama sayfasını kullanarak bir sürücü ekleyin.</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
@@ -7619,31 +7989,139 @@
</message>
<message>
<source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation><b>%1</b> web kamerasını <b>%2</b> sanal makinesine takma başarısız.</translation>
</message>
<message>
<source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation><b>%1</b> web kamerasını <b>%2</b> sanal makinesinden ayırma başarısız.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"></translation>
+ <translation><p>VirtualBox Misafir Eklentileri bu sanal makinede mevcut görünmüyor ve paylaşılan klasörler onlar olmadan kullanılamaz. Paylaşılan klasörleri sanal makine içerisinde kullanmak için lütfen <b>Aygıtlar</b> menüsünden <b>Misafir Eklentileri CD kalıbını yerleştir</b>'i seçerek, yüklü değillerse Misafir Eklentilerini yükleyin veya düzgün olarak çalışmıyorlarsa, yeniden yükleyin. Eğer yüklü ama makine tam olarak henüz başlatılmadıysa o [...]
</message>
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished"></translation>
+ <translation>Ekle</translation>
</message>
<message>
<source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Sanal ekran şu an <b>%1 bit</b> renk kipine ayarlı. Daha iyi performans için lütfen bunu <b>%2 bit</b> olarak değiştirin. Bu genellikle misafir işletim sisteminin Denetim Masası'nın ya da Sistem Ayarları'nın <b>Görüntü</b> bölümünden yapılabilir.</p></translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Rule names should be unique.</source>
- <translation type="unfinished"></translation>
+ <translation>Şu anki bağlantı noktası yönlendirme kuralları geçerli değil. Kural adları benzersiz olmalıdır.</translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
+ <translation>Şu anki bağlantı noktası yönlendirme kuralları geçerli değil. Birkaç kural aynı anamakine bağlantı noktalarına ve çakışan IP adreslerine sahip.</translation>
+ </message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation><p>VirtualBoxClient COM nesnesini oluşturma başarısız.</p><p>Uygulama şimdi sonlandırılacak.</p></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation><i>%1</i> anahtarı için genel VirtualBox ilave verisini <i>{%2}</i> değerine ayarlama başarısız.</translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation><i>%2</i> makinesinin <i>%1</i> anahtarı için ilave verisini <i>{%3}</i> değerine ayarlama başarısız.</translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation><p>Bir ya da daha fazla sanal sabit disk, optik disk veya disket kalıbı dosyası şu anda erişilebilir değil. Sonuç olarak, daha sonra erişilebilir olana kadar bu dosyaları kullanan sanal makineleri işletemeyceksiniz.</p><p>Sanal Ortam Yöneticisi penceresini açmak için <b>Kontrol et</b> düğmesine basın ve hangi dosyaların erişilemez olduğunu görün, ya da bu iletiyi yoksaymak için <b>Yoksay</b> düğmesine basın.</p></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation>Ayarları kaydetme başarısız.</translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation><p><b>%1</b> denetleyicisine yeni bir optik sürücü eklemek üzeresiniz.</p><p>Sürücüye koymak için sanal bir optik disk seçmek ya da şimdilik boş bırakmak ister misiniz?</p></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation><p>Optik sürücüyü silmek istediğinize emin misiniz?</p><p>Herhangi bir optik diski veya ISO kalıbını yerleştiremeyeceksiniz ya da onsuz Misafir Eklentilerini yükleyemeyeceksiniz!</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation><b>%3</b> makinesinin <i>%2</i> yuvasına optik sürücüyü (<nobr><b>%1</b></nobr>) takma başarısız.</translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation><b>%3</b> makinesinin <i>%2</i> yuvasına disket sürücüyü (<nobr><b>%1</b></nobr>) takma başarısız.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation><b>%3</b> makinesinin <i>%2</i> yuvasından optik sürücüyü (<nobr><b>%1</b></nobr>) ayırma başarısız.</translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation><b>%3</b> makinesinin <i>%2</i> yuvasından disket sürücüyü (<nobr><b>%1</b></nobr>) ayırma başarısız.</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this er [...]
+ <translation type="obsolete"><p>Sanal makine çalışırken ciddi bir hata meydana geldi ve makinenin çalışması durdurulmalı.</p><p>Yardım için lütfen <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> adresindeki Community bölümüne veya destek sözleşmenize bakın. Lütfen sanal amkine günlük dizininde bulabileceğiniz <tt>VBox.log</tt> günlük dosyasının içeriklerinin yanısıra bu hata olduğunda ne yapıyor olduğunuzun açıklamasını da [...]
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation><b>%1</b> sanal makinesinin ağ bağdaştırıcısı kablosunu bağlama başarısız.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation><b>%1</b> sanal makinesinden ağ bağdaştırıcısı kablosu bağlantısını kesme başarısız.</translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation><b>%1</b> sanal makinesi içine <b>VirtualBox Misafir Eklentileri</b> disk kalıbı dosyası yerleştirilemedi, makine optik sürücülere sahip değil gibi. Lütfen sanal makine ayarları penceresinin depolama sayfasını kullanarak bir sürücü ekleyin.</p></translation>
+ </message>
+ <message>
+ <source>Unable to enter password!</source>
+ <translation type="obsolete">Parola girilemiyor!</translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation><p><b>VirtualBox Misafir Eklentileri</b> disk kalıbı dosyası <nobr><a href="%1">%1</a></nobr> adresinden başarılı olarak indirildi ve <nobr><b>%2</b></nobr> ile yerel olarak kaydedildi.</p><p>Bu disk kalıbı dosyasını kaydettirmek ve sanal optik sürücü içine yerleştirmek ister misiniz?</p></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation failed.</source>
+ <translation type="obsolete">Sürükle ve bırak işlemi başarısız oldu.</translation>
+ </message>
+ <message>
+ <source>Failed while dropping data.</source>
+ <translation type="obsolete">Veri bırakılırken başarısız.</translation>
+ </message>
+ <message>
+ <source>Unable to cancel drag and drop operation.</source>
+ <translation type="obsolete">Sürükle ve bırak işlemi iptal edilemiyor.</translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation>Hatalı parola ya da kimlik doğrulaması başarısız.</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation><p>Sanal makine çalışırken ciddi bir hata meydana geldi ve makinenin çalışması durduruldu.</p><p>Yardım için lütfen <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> adresindeki Community bölümüne veya destek sözleşmenize bakın. Lütfen <nobr><b>%1</b></nobr> dizininde bulabileceğiniz <tt>VBox.log</tt> günlük dosyasının ve <tt>VBox.png</tt> resim dosyasının içeriklerinin yanı [...]
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation><p>Sanal makine çalışırken ciddi bir hata meydana geldi ve makinenin çalışması durdurulmalı.</p><p>Yardım için lütfen <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> adresindeki Community bölümüne veya destek sözleşmenize bakın. Lütfen sanal amkine günlük dizininde bulabileceğiniz <tt>VBox.log</tt> günlük dosyasının içeriklerinin yanısıra bu hata olduğunda ne yapıyor olduğunuzun açıklamasını da verin. Ayrıca [...]
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation><p>VirtualBox'ın yeni bir sürümü yayımlandı! Sürüm <b>%1</b> <a href="https://www.virtualbox.org/">virtualbox.org</a> adresinde mevcuttur.</p><p>Şu bağlantıyı kullanarak bu sürümü indirebilirsiniz:</p><p><a href=%2>%3</a></p></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -7707,7 +8185,7 @@
</message>
<message>
<source>Holds the name of the virtual machine.</source>
- <translation>Sanal makinenin adını gösterir.</translation>
+ <translation>Sanal makinenin adını tutar.</translation>
</message>
<message>
<source>&Type:</source>
@@ -8500,13 +8978,17 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>VirtualBox'a Hoş Geldiniz!</h3><p>Bu pencerenin sol tarafı bilgisayarınızdaki tüm sanal makinelerin listesidir. Liste şimdi boş çünkü henüz herhangi bir sanal makine oluşturmadınız.<img src=:/welcome.png align=right/></p><p>Yeni bir sanal makine oluşturmak için pencerenin en üstünde bulunan ana araç çubuğundaki <b>Yeni</b> düğmesine basın.</p><p><b>%1</b> tuşuna basarak anında yardım ala [...]
+ <translation type="obsolete"><h3>VirtualBox'a Hoş Geldiniz!</h3><p>Bu pencerenin sol tarafı bilgisayarınızdaki tüm sanal makinelerin listesidir. Liste şimdi boş çünkü henüz herhangi bir sanal makine oluşturmadınız.<img src=:/welcome.png align=right/></p><p>Yeni bir sanal makine oluşturmak için pencerenin en üstünde bulunan ana araç çubuğundaki <b>Yeni</b> düğmesine basın.</p><p><b>%1</b> tuşuna basarak a [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Yöneticisi</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation><h3>VirtualBox'a Hoş Geldiniz!</h3><p>Bu pencerenin sol tarafı bilgisayarınızdaki tüm sanal makinelerin listesidir. Liste şimdi boş çünkü henüz herhangi bir sanal makine oluşturmadınız.<img src=:/welcome.png align=right/></p><p>Yeni bir sanal makine oluşturmak için pencerenin en üstünde bulunan ana araç çubuğundaki <b>Yeni</b> düğmesine basın.</p><p><b>%1</b> tuşuna basarak anında yardım ala [...]
+ </message>
</context>
<context>
<name>UISession</name>
@@ -8535,15 +9017,15 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Settings</source>
- <translation>Ayarlar</translation>
+ <translation type="obsolete">Ayarlar</translation>
</message>
<message>
<source><b>%1</b> page:</source>
- <translation><b>%1</b> sayfa:</translation>
+ <translation><b>%1</b> sayfası:</translation>
</message>
<message>
<source><b>%1: %2</b> page:</source>
- <translation><b>%1: %2</b> sayfa:</translation>
+ <translation><b>%1: %2</b> sayfası:</translation>
</message>
</context>
<context>
@@ -8588,6 +9070,10 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
<source>Display</source>
<translation>Ekran</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation>Tercihler</translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -8639,19 +9125,42 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
<source>%1 - %2</source>
<translation>%1 - %2</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation>Kullanıcı Arayüzü</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>Ayarlar</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation>Ayarlar yükleniyor...</translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation>Ayarlar kaydediliyor...</translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
<message>
<source><nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr>Gösterge varlığını değiştirmek için <b>tıklayın</b>.</nobr><br><nobr>Gösterge konumunu değiştirmek için <b>Sürükle ve Bırak</b>'ın.</nobr></translation>
</message>
</context>
<context>
<name>UIStatusBarEditorWidget</name>
<message>
<source>Close</source>
- <translation type="unfinished">Kapat</translation>
+ <translation>Kapat</translation>
+ </message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation>Durum Çubuğunu etkinleştir</translation>
</message>
</context>
<context>
@@ -8811,11 +9320,11 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>&Continue running in the background</source>
- <translation type="unfinished"></translation>
+ <translation>Arka planda çalışmaya &devam et</translation>
</message>
<message>
<source><p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>Sanal makine pencerelerini kapatır ama sanal makineyi çalışır halde tutar.</p><p>Çalışan sanal makineyi bir pencere içine döndürmek için VirtualBox Yöneticisi'ni kullanabilirsiniz.</p></translation>
</message>
</context>
<context>
@@ -8984,7 +9493,7 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Sürükle'v'Bırak Kipi</translation>
+ <translation type="obsolete">Sürükle'v'Bırak Kipi</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -8996,7 +9505,11 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>VM Uptime</source>
- <translation type="unfinished"></translation>
+ <translation>VM Çalışma Zamanı</translation>
+ </message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation>Sürükle ve Bırak Kipi</translation>
</message>
</context>
<context>
@@ -9158,26 +9671,26 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>&Expert Mode</source>
- <translation type="unfinished"></translation>
+ <translation>&Uzman Kipi</translation>
</message>
<message>
<source>Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users.</source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Uzman Kipi</b></nobr>'ne değiştirin, deneyimli kullanıcılar için tek sayfalık bir iletidir.</translation>
</message>
<message>
<source>&Guided Mode</source>
- <translation type="unfinished"></translation>
+ <translation>&Rehberli Kip</translation>
</message>
<message>
<source>Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations.</source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>Rehberli Kip</b></nobr>'e değiştirin, ayrıntılı açıklamaları olan adım adım bir iletidir.</translation>
</message>
</context>
<context>
<name>UIWizardCloneVD</name>
<message>
<source>Copy Virtual Hard Drive</source>
- <translation>Sanal Sabit Diski Kopyala</translation>
+ <translation>Sanal Sabit Sürücüyü Kopyala</translation>
</message>
<message>
<source>Copy</source>
@@ -9185,43 +9698,43 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Hard drive to copy</source>
- <translation>Kopyalamak için sabit disk</translation>
+ <translation>Kopyalamak için sabit sürücü</translation>
</message>
<message>
<source><p>Please select the virtual hard drive file that you would like to copy if it is not already selected. You can either choose one from the list or use the folder icon beside the list to select one.</p></source>
- <translation><p>Lütfen kopyalamak istediğiniz sanal sabit disk dosyası eğer seçilmediyse seçin. Ya listeden birisini seçebilirsiniz ya da birini seçmek için listenin yanındaki klasör simgesini kullanabilirsiniz.</p></translation>
+ <translation><p>Lütfen kopyalamak istediğiniz sanal sabit sürücü dosyası eğer seçilmediyse seçin. Ya listeden birisini seçebilirsiniz ya da birini seçmek için listenin yanındaki klasör simgesini kullanabilirsiniz.</p></translation>
</message>
<message>
<source>Choose a virtual hard drive file to copy...</source>
- <translation>Kopyalamak için sanal sabit disk dosyasını seçin...</translation>
+ <translation>Kopyalamak için sanal sabit sürücü dosyasını seçin...</translation>
</message>
<message>
<source>Hard drive file type</source>
- <translation>Sabit disk dosyası türü</translation>
+ <translation>Sabit sürücü dosyası türü</translation>
</message>
<message>
<source>Please choose the type of file that you would like to use for the new virtual hard drive. If you do not need to use it with other virtualization software you can leave this setting unchanged.</source>
- <translation>Lütfen yeni sanal sabit disk için kullanmak istediğiniz dosyanın türünü seçin. Eğer diğer sanallaştırma yazılımları ile kullanmaya ihtiyacınız yoksa bu ayarı değiştirmeden bırakabilirsiniz.</translation>
+ <translation>Lütfen yeni sanal sabit sürücü için kullanmak istediğiniz dosyanın türünü seçin. Eğer diğer sanallaştırma yazılımları ile kullanmaya ihtiyacınız yoksa bu ayarı değiştirmeden bırakabilirsiniz.</translation>
</message>
<message>
<source>Storage on physical hard drive</source>
- <translation>Fiziksel sabit diskte depolama</translation>
+ <translation>Fiziksel sabit sürücü depolama</translation>
</message>
<message>
<source>Please choose whether the new virtual hard drive file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size).</source>
- <translation>Lütfen yeni sanal sabit disk dosyasının kullanılmasına göre (değişken olarak ayrılan) büyüyüp büyümemesini ya da en fazla boyutunda (sabitlenmiş boyut) oluşturulup oluşturulmamalıysa seçin.</translation>
+ <translation>Lütfen yeni sanal sabit sürücü dosyasının kullanılmasına göre (değişken olarak ayrılan) büyüyüp büyümemesini ya da en fazla boyutunda (sabitlenmiş boyut) oluşturulup oluşturulmamalıysa seçin.</translation>
</message>
<message>
<source><p>A <b>dynamically allocated</b> hard drive file will only use space on your physical hard drive as it fills up (up to a maximum <b>fixed size</b>), although it will not shrink again automatically when space on it is freed.</p></source>
- <translation><p><b>Değişken olarak ayrılan</b> sabit disk dosyası sadece fiziksel sabit diskinizdeki alanı doldurarak (en fazla <b>sabitlenmiş boyuta</b> kadar) kullanacak olmasına rağmen alan serbest kaldığında otomatik olarak tekrar küçülmeyecektir.</p></translation>
+ <translation><p><b>Değişken olarak ayrılan</b> sabit sürücü dosyası sadece fiziksel sabit sürücünüzdeki alanı doldurarak (en fazla <b>sabitlenmiş boyuta</b> kadar) kullanacak olmasına rağmen alan serbest kaldığında otomatik olarak tekrar küçülmeyecektir.</p></translation>
</message>
<message>
<source><p>A <b>fixed size</b> hard drive file may take longer to create on some systems but is often faster to use.</p></source>
- <translation><p><b>Sabitlenmiş boyutlu</b> sabit disk dosyasını oluşturmak bazı sistemlerde uzun sürebilir ama kullanması çoğu kez en hızlı olandır.</p></translation>
+ <translation><p><b>Sabitlenmiş boyutlu</b> sabit sürücü dosyasını oluşturmak bazı sistemlerde uzun sürebilir ama kullanması çoğu kez en hızlı olandır.</p></translation>
</message>
<message>
<source><p>You can also choose to <b>split</b> the hard drive file into several files of up to two gigabytes each. This is mainly useful if you wish to store the virtual machine on removable USB devices or old systems, some of which cannot handle very large files.</source>
- <translation><p>Ayrıca sabit disk dosyasını her biri iki gigabayta kadar birkaç dosyaya <b>bölmeyi</b> seçebilirsiniz. Bu çoğunlukla eğer sanal makineyi kaldırılabilir USB aygıtlarda veya çok büyük dosyalarla başa çıkamayan bazı eski sistemlerde depolamak isterseniz faydalıdır.</translation>
+ <translation><p>Ayrıca sabit sürücü dosyasını her biri iki gigabayta kadar birkaç dosyaya <b>bölmeyi</b> seçebilirsiniz. Bu çoğunlukla eğer sanal makineyi kaldırılabilir USB aygıtlarda veya çok büyük dosyalarla başa çıkamayan bazı eski sistemlerde depolamak isterseniz faydalıdır.</translation>
</message>
<message>
<source>&Dynamically allocated</source>
@@ -9237,19 +9750,19 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Please choose a location for new virtual hard drive file</source>
- <translation>Lütfen yeni sanal sabit disk dosyası için bir yer seçin</translation>
+ <translation>Lütfen yeni sanal sabit sürücü dosyası için bir yer seçin</translation>
</message>
<message>
<source>New hard drive to create</source>
- <translation>Oluşturmak için yeni sabit disk</translation>
+ <translation>Oluşturmak için yeni sabit sürücü</translation>
</message>
<message>
<source>Please type the name of the new virtual hard drive file into the box below or click on the folder icon to select a different folder to create the file in.</source>
- <translation>Lütfen aşağıdaki kutuya yeni sanal sabit disk dosyasının adını yazın ya da içine oluşturulacak farklı bir klasörü seçmek için klasör simgesine tıklayın.</translation>
+ <translation>Lütfen aşağıdaki kutuya yeni sanal sabit sürücü dosyasının adını yazın ya da içine oluşturulacak farklı bir klasörü seçmek için klasör simgesine tıklayın.</translation>
</message>
<message>
<source>Choose a location for new virtual hard drive file...</source>
- <translation>Yeni sanal sabit disk dosyası için bir yer seçin...</translation>
+ <translation>Yeni sanal sabit sürücü dosyası için bir yer seçin...</translation>
</message>
<message>
<source>%1_copy</source>
@@ -9258,15 +9771,15 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Hard drive to ©</source>
- <translation>&Kopyalamak için sabit disk</translation>
+ <translation>&Kopyalamak için sabit sürücü</translation>
</message>
<message>
<source>&New hard drive to create</source>
- <translation>Oluşturmak için ¥i sabit disk</translation>
+ <translation>Oluşturmak için ¥i sabit sürücü</translation>
</message>
<message>
<source>Hard drive file &type</source>
- <translation>Sabit disk dosyası &türü</translation>
+ <translation>Sabit sürücü dosyası &türü</translation>
</message>
</context>
<context>
@@ -9309,7 +9822,7 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source><p>Please choose the type of clone you wish to create.</p><p>If you choose <b>Full clone</b>, an exact copy (including all virtual hard drive files) of the original virtual machine will be created.</p><p>If you choose <b>Linked clone</b>, a new machine will be created, but the virtual hard drive files will be tied to the virtual hard drive files of original machine and you will not be able to move the new virtual machi [...]
- <translation><p>Lütfen oluşturmak istediğiniz çoğaltma türünü seçin.</p><p>Eğer <b>Tam çoğaltma</b> seçerseniz, orijinal sanal makinenin tam bir kopyası (tüm sanal sabit disk dosyaları dahil) oluşturulacaktır.</p><p>Eğer <b>Birbirine bağlantılı çoğaltma</b> seçerseniz, yeni bir sanal makine oluşturulacaktır ama sanal sabit disk dosyaları orijinal makinenin sanal sabit disk dosyalarına bağlanacaktır ve yeni sanal makineyi farkl [...]
+ <translation><p>Lütfen oluşturmak istediğiniz çoğaltma türünü seçin.</p><p>Eğer <b>Tam çoğaltma</b> seçerseniz, orijinal sanal makinenin tam bir kopyası (tüm sanal sabit sürücü dosyaları dahil) oluşturulacaktır.</p><p>Eğer <b>Birbirine bağlantılı çoğaltma</b> seçerseniz, yeni bir sanal makine oluşturulacaktır ama sanal sabit sürücü dosyaları orijinal makinenin sanal sabit sürücü dosyalarına bağlanacaktır ve yeni sanal makineyi [...]
</message>
<message>
<source><p>If you create a <b>Linked clone</b> then a new snapshot will be created in the original virtual machine as part of the cloning process.</p></source>
@@ -9577,7 +10090,7 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source><p>Please select a virtual optical disk file or a physical optical drive containing a disk to start your new virtual machine from.</p><p>The disk should be suitable for starting a computer from. As this virtual machine has no hard drive you will not be able to install an operating system on it at the moment.</p></source>
- <translation><p>Lütfen sanal bir optik disk dosyası veya yeni sanal makinenizi ondan başlatmak için bir disk içeren fiziksel optik disk sürücüsü seçin.</p><p>Disk bir bilgisayarı başlatması için uygun olmalı. Bu sanal makine olarak hiç sabit diske sahip değil, şu anda bir işletim sistemi yükleyemeyeceksiniz.</p></translation>
+ <translation><p>Lütfen sanal bir optik disk dosyası veya yeni sanal makinenizi ondan başlatmak için bir disk içeren fiziksel optik sürücü seçin.</p><p>Disk bir bilgisayarı ondan başlatmak için uygun olmalıdır. Bu sanal makine gibi hiç sabit sürücüye sahip değil, şu anda bir işletim sistemi yükleyemeyeceksiniz.</p></translation>
</message>
<message>
<source>Choose a virtual optical disk file...</source>
@@ -9643,7 +10156,7 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
<name>UIWizardNewVD</name>
<message>
<source>Create Virtual Hard Drive</source>
- <translation>Sanal Sabit Disk Oluştur</translation>
+ <translation>Sanal Sabit Sürücü Oluştur</translation>
</message>
<message>
<source>Create</source>
@@ -9651,31 +10164,31 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Hard drive file type</source>
- <translation>Sabit disk dosyası türü</translation>
+ <translation>Sabit sürücü dosyası türü</translation>
</message>
<message>
<source>Please choose the type of file that you would like to use for the new virtual hard drive. If you do not need to use it with other virtualization software you can leave this setting unchanged.</source>
- <translation>Lütfen yeni sanal sabit disk için kullanmak istediğiniz dosyanın türünü seçin. Eğer diğer sanallaştırma yazılımları ile kullanmaya ihtiyacınız yoksa bu ayarı değiştirmeden bırakabilirsiniz.</translation>
+ <translation>Lütfen yeni sanal sabit sürücü için kullanmak istediğiniz dosyanın türünü seçin. Eğer diğer sanallaştırma yazılımları ile kullanmaya ihtiyacınız yoksa bu ayarı değiştirmeden bırakabilirsiniz.</translation>
</message>
<message>
<source>Storage on physical hard drive</source>
- <translation>Fiziksel sabit diskte depolama</translation>
+ <translation>Fiziksel sabit sürücüde depolama</translation>
</message>
<message>
<source>Please choose whether the new virtual hard drive file should grow as it is used (dynamically allocated) or if it should be created at its maximum size (fixed size).</source>
- <translation>Lütfen yeni sanal sabit disk dosyasının kullanılmasına göre (değişken olarak ayrılan) büyüyüp büyümemesini ya da en fazla boyutunda (sabitlenmiş boyut) oluşturulup oluşturulmamalıysa seçin.</translation>
+ <translation>Lütfen yeni sanal sabit sürücü dosyasının kullanılmasına göre (değişken olarak ayrılan) büyüyüp büyümemesini ya da en fazla boyutunda (sabitlenmiş boyut) oluşturulup oluşturulmamalıysa seçin.</translation>
</message>
<message>
<source><p>A <b>dynamically allocated</b> hard drive file will only use space on your physical hard drive as it fills up (up to a maximum <b>fixed size</b>), although it will not shrink again automatically when space on it is freed.</p></source>
- <translation><p><b>Değişken olarak ayrılan</b> sabit disk dosyası sadece fiziksel sabit diskinizdeki alanı doldurarak (en fazla <b>sabitlenmiş boyuta</b> kadar) kullanacak olmasına rağmen alan serbest kaldığında otomatik olarak tekrar küçülmeyecektir.</p></translation>
+ <translation><p><b>Değişken olarak ayrılan</b> sabit sürücü dosyası sadece fiziksel sabit sürücünüzdeki alanı doldurarak (en fazla <b>sabitlenmiş boyuta</b> kadar) kullanacak olmasına rağmen alan serbest kaldığında otomatik olarak tekrar küçülmeyecektir.</p></translation>
</message>
<message>
<source><p>A <b>fixed size</b> hard drive file may take longer to create on some systems but is often faster to use.</p></source>
- <translation><p><b>Sabitlenmiş boyutlu</b> sabit disk dosyasını oluşturmak bazı sistemlerde uzun sürebilir ama kullanması çoğu kez en hızlı olandır.</p></translation>
+ <translation><p><b>Sabitlenmiş boyutlu</b> sabit sürücü dosyasını oluşturmak bazı sistemlerde uzun sürebilir ama kullanması çoğu kez en hızlı olandır.</p></translation>
</message>
<message>
<source><p>You can also choose to <b>split</b> the hard drive file into several files of up to two gigabytes each. This is mainly useful if you wish to store the virtual machine on removable USB devices or old systems, some of which cannot handle very large files.</source>
- <translation><p>Ayrıca sabit disk dosyasını her biri iki gigabayta kadar birkaç dosyaya <b>bölmeyi</b> seçebilirsiniz. Bu çoğunlukla eğer sanal makineyi kaldırılabilir USB aygıtlarda veya çok büyük dosyalarla başa çıkamayan bazı eski sistemlerde depolamak isterseniz faydalıdır.</translation>
+ <translation><p>Ayrıca sabit sürücü dosyasını her biri iki gigabayta kadar birkaç dosyaya <b>bölmeyi</b> seçebilirsiniz. Bu çoğunlukla eğer sanal makineyi kaldırılabilir USB aygıtlarda veya çok büyük dosyalarla başa çıkamayan bazı eski sistemlerde depolamak isterseniz faydalıdır.</translation>
</message>
<message>
<source>&Dynamically allocated</source>
@@ -9699,15 +10212,15 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Please type the name of the new virtual hard drive file into the box below or click on the folder icon to select a different folder to create the file in.</source>
- <translation>Lütfen aşağıdaki kutuya yeni sanal sabit disk dosyasının adını yazın ya da içine oluşturulacak farklı bir klasörü seçmek için klasör simgesine tıklayın.</translation>
+ <translation>Lütfen aşağıdaki kutuya yeni sanal sabit sürücü dosyasının adını yazın ya da içine oluşturulacak farklı bir klasörü seçmek için klasör simgesine tıklayın.</translation>
</message>
<message>
<source>Choose a location for new virtual hard drive file...</source>
- <translation>Yeni sanal sabit disk dosyası için bir yer seçin...</translation>
+ <translation>Yeni sanal sabit sürücü dosyası için bir yer seçin...</translation>
</message>
<message>
<source>Select the size of the virtual hard drive in megabytes. This size is the limit on the amount of file data that a virtual machine will be able to store on the hard drive.</source>
- <translation>Megabayt olarak sanal sabit sürücünün boyutunu seçin. Bu boyut sabit diskte depolanabilecek bir sanal makine dosya verisinin miktarını sınırlandırır.</translation>
+ <translation>Megabayt olarak sanal sabit sürücünün boyutunu seçin. Bu boyut sabit sürücüdeki depolanabilecek bir sanal makine dosya verisinin miktarını sınırlandırır.</translation>
</message>
<message>
<source>File &location</source>
@@ -9719,7 +10232,7 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Hard drive file &type</source>
- <translation>Sabit disk dosyası &türü</translation>
+ <translation>Sabit sürücü dosyası &türü</translation>
</message>
</context>
<context>
@@ -9770,15 +10283,15 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>Hard drive</source>
- <translation>Sabit disk</translation>
+ <translation>Sabit sürücü</translation>
</message>
<message>
<source><p>If you wish you can add a virtual hard drive to the new machine. You can either create a new hard drive file or select one from the list or from another location using the folder icon.</p><p>If you need a more complex storage set-up you can skip this step and make the changes to the machine settings once the machine is created.</p><p>The recommended size of the hard drive is <b>%1</b>.</p></source>
- <translation>Eğer isterseniz yeni makineye sanal bir sabit disk ekleyebilirsiniz. Ya yeni bir sabit disk dosyası oluşturabilirsiniz ya da listeden veya klasör simgesini kullanarak başka bir yerden birini seçebilirsiniz.</p><p>Eğer daha karışık depolama ayarlamasına ihtiyacınız varsa bu adımı atlayabilir ve makine bir kere oluşturuldumu makine ayarlarından değişiklikleri yapabilirsiniz.</p><p>Sabit disk için önerilen boyut <b>%1</b>.</p></ [...]
+ <translation>Eğer isterseniz yeni makineye sanal bir sabit sürücü ekleyebilirsiniz. Ya yeni bir sabit sürücü dosyası oluşturabilirsiniz ya da listeden veya klasör simgesini kullanarak başka bir yerden birini seçebilirsiniz.</p><p>Eğer daha karışık depolama ayarlamasına ihtiyacınız varsa bu adımı atlayabilir ve makine bir kere oluşturuldumu makine ayarlarından değişiklikleri yapabilirsiniz.</p><p>Sabit sürücü için önerilen boyut <b>%1</b>.</p [...]
</message>
<message>
<source>Choose a virtual hard drive file...</source>
- <translation>Sanal sabit disk dosyası seçin...</translation>
+ <translation>Sanal sabit sürücü dosyası seçin...</translation>
</message>
<message>
<source>&Memory size</source>
@@ -9786,15 +10299,15 @@ bu basamağı atlayarak sabit diskleri Sanal Makine Ayarları penceresinden ekle
</message>
<message>
<source>&Do not add a virtual hard drive</source>
- <translation>Sanal sabit disk &ekleme</translation>
+ <translation>Sanal bir sabit sürücü &ekleme</translation>
</message>
<message>
<source>&Create a virtual hard drive now</source>
- <translation>Şimdi sanal sabit disk &oluştur</translation>
+ <translation>Şimdi sanal bir sabit sürücü &oluştur</translation>
</message>
<message>
<source>&Use an existing virtual hard drive file</source>
- <translation>Mevcut sanal sabit disk dosyası &kullan</translation>
+ <translation>Mevcut sanal bir sabit sürücü dosyası &kullan</translation>
</message>
</context>
<context>
@@ -10742,7 +11255,7 @@ Version %1</source>
</message>
<message>
<source>Opens a window to select a different folder.</source>
- <translation>Farklı bir klasör seçmek için bir ileti açar.</translation>
+ <translation>Farklı bir klasör seçmek için bir pencere açar.</translation>
</message>
<message>
<source>Resets the folder path to the default value.</source>
@@ -10750,7 +11263,7 @@ Version %1</source>
</message>
<message>
<source>Opens a window to select a different file.</source>
- <translation>Farklı bir dosya seçmek için bir ileti açar.</translation>
+ <translation>Farklı bir dosya seçmek için bir pencere açar.</translation>
</message>
<message>
<source>Resets the file path to the default value.</source>
@@ -10770,7 +11283,7 @@ Version %1</source>
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished"></translation>
+ <translation>Gerçek varsayılan yol değeri, değişiklikler kabul edildikten ve bu pencere tekrar açıldıktan sonra görüntülenecektir.</translation>
</message>
</context>
<context>
@@ -11122,7 +11635,7 @@ Version %1</source>
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -11855,7 +12368,7 @@ Version %1</source>
<message>
<source>Paravirtualized Network (virtio-net)</source>
<comment>NetworkAdapterType</comment>
- <translation>Parasanallaştırılmış Ağ (virtio-net)</translation>
+ <translation>Yarı Sanallaştırılmış Ağ (virtio-net)</translation>
</message>
<message>
<source>I82078</source>
@@ -11923,17 +12436,17 @@ Version %1</source>
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Takılan bu sabit disk yeni olarak oluşturulmuş ayrımlanan sabit disk kullanımını dolaylı olarak gerçekleştirecektir.</translation>
+ <translation type="obsolete">Takılan bu sabit disk yeni olarak oluşturulmuş ayrımlanan sabit disk kullanımını dolaylı olarak gerçekleştirecektir.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Bu sabit disk zincirindeki ortamın bazısı erişilemez. Lütfen bu ortamı incelemek için <b>Ayrımlanan Sabit Diskleri Göster</b> içindeki Sanal Ortam Yönetcisini kullanın.</translation>
+ <translation type="obsolete">Bu sabit disk zincirindeki ortamın bazısı erişilemez. Lütfen bu ortamı incelemek için <b>Ayrımlanan Sabit Diskleri Göster</b> içindeki Sanal Ortam Yönetcisini kullanın.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Bu ana sabit disk aşağıdaki ayrımlanan sabit diskleri kullanarak dolaylı olarak takılır:</translation>
+ <translation type="obsolete">Bu ana sabit disk aşağıdaki ayrımlanan sabit diskleri kullanarak dolaylı olarak takılır:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -11973,7 +12486,7 @@ Version %1</source>
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>Screens</source>
@@ -12378,7 +12891,7 @@ Version %1</source>
</message>
<message>
<source>Please choose a virtual hard drive file</source>
- <translation>Lütfen sanal sabit sürücü dosyası seçin</translation>
+ <translation>Lütfen sanal bir sabit sürücü dosyası seçin</translation>
</message>
<message>
<source>All virtual hard drive files (%1)</source>
@@ -12386,7 +12899,7 @@ Version %1</source>
</message>
<message>
<source>Please choose a virtual optical disk file</source>
- <translation>Lütfen sanal optik disk dosyası seçin</translation>
+ <translation>Lütfen sanal bir optik disk dosyası seçin</translation>
</message>
<message>
<source>All virtual optical disk files (%1)</source>
@@ -12418,7 +12931,7 @@ Version %1</source>
</message>
<message>
<source>QED (QEMU enhanced disk)</source>
- <translation>QED (QEMU geliştirilmiş disk)</translation>
+ <translation>QED (QEMU Geliştirilmiş Disk)</translation>
</message>
<message>
<source>QCOW (QEMU Copy-On-Write)</source>
@@ -12431,12 +12944,12 @@ Version %1</source>
<message>
<source>Enabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Etkinleştirildi</translation>
+ <translation type="obsolete">Etkinleştirildi</translation>
</message>
<message>
<source>Disabled</source>
<comment>details report (Unrestricted Execution)</comment>
- <translation>Etkisizleştirildi</translation>
+ <translation type="obsolete">Etkisizleştirildi</translation>
</message>
<message>
<source>Unrestricted Execution</source>
@@ -12499,51 +13012,150 @@ Version %1</source>
<message>
<source>USB</source>
<comment>StorageControllerType</comment>
- <translation type="unfinished"></translation>
+ <translation>USB</translation>
</message>
<message>
<source>USB Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished"></translation>
+ <translation>USB B.Noktası %1</translation>
</message>
<message>
<source>off</source>
<comment>guest monitor status</comment>
- <translation type="unfinished"></translation>
+ <translation>kapalı</translation>
</message>
<message>
<source>Paravirtualization Interface</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>Yarı Sanallaştırma Arayüzü</translation>
</message>
<message>
<source>None</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Yok</translation>
</message>
<message>
<source>Default</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Varsayılan</translation>
</message>
<message>
<source>Legacy</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Eski</translation>
</message>
<message>
<source>Minimal</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>En Az</translation>
</message>
<message>
<source>Hyper-V</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V</translation>
</message>
<message>
<source>New dynamically allocated storage</source>
<comment>MediumVariant</comment>
+ <translation>Yeni değişken olarak ayrılan depolama</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>Aktif</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>Devre dışı</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>Aktif</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>Devre dışı</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>Aktif</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>Devre dışı</translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Anlık Görüntü alınıyor</translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>Çevrimiçi Anlık Görüntü alınıyor</translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation>KVM</translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation>Optik</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>OHCI</translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>EHCI</translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>xHCI</translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation>Kullanıcı arayüzü</translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation>(Optik Sürücü)</translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation>Takılan bu sabit sürücü yeni olarak oluşturulmuş ayrımlanan sabit sürücüyü kullanarak dolaylı olarak gerçekleştirecektir.</translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation>Bu sabit sürücü zincirindeki dosyaların bazıları erişilemez. Lütfen bu dosyaları incelemek için Sanal Ortam Yönetcisi'ni kullanın.</translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation>Bu ana sabit sürücü aşağıdaki ayrımlanan sabit sürücüyü kullanarak dolaylı olarak takılır:</translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
<translation type="unfinished"></translation>
</message>
</context>
@@ -13341,6 +13953,10 @@ to the system default language.</qt>
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Yeni bir sanal sabit sürücü oluştur</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation>UUID:</translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
index 6bd664c..42ff8f4 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts
@@ -248,7 +248,7 @@
</message>
<message>
<source>Seam&less Mode</source>
- <translation type="obsolete">&Цілокроєний режим</translation>
+ <translation type="unfinished">&Цілокроєний режим</translation>
</message>
<message>
<source>Switch to seamless desktop integration mode</source>
@@ -272,11 +272,11 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>В&имкнути інтеграцію миші</translation>
+ <translation type="obsolete">В&имкнути інтеграцію миші</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>Тимчасово вимкнути інтеграцію головного курсора миші</translation>
+ <translation type="obsolete">Тимчасово вимкнути інтеграцію головного курсора миші</translation>
</message>
<message>
<source>Enable &Mouse Integration</source>
@@ -288,11 +288,11 @@
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>&Ввести Ctrl-Alt-Del</translation>
+ <translation type="obsolete">&Ввести Ctrl-Alt-Del</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>Відправити послідовність клавіш Ctrl-Alt-Del у віртуальну машину</translation>
+ <translation type="obsolete">Відправити послідовність клавіш Ctrl-Alt-Del у віртуальну машину</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -300,7 +300,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>Відправити послідовність клавіш Ctrl-Alt-Backspace у віртуальну машину</translation>
+ <translation type="obsolete">Відправити послідовність клавіш Ctrl-Alt-Backspace у віртуальну машину</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -364,15 +364,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>&Пристрої CD/DVD</translation>
+ <translation type="obsolete">&Пристрої CD/DVD</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>Пристрої &дискет</translation>
+ <translation type="obsolete">Пристрої &дискет</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>Пристро&ї USB</translation>
+ <translation type="obsolete">Пристро&ї USB</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -419,7 +419,7 @@
<message>
<source>&Logging...</source>
<comment>debug action</comment>
- <translation type="unfinished">&Реєстрування...</translation>
+ <translation type="obsolete">&Реєстрування...</translation>
</message>
<message>
<source>&Help</source>
@@ -497,15 +497,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>Перемкнутись у &повноекранний режим</translation>
+ <translation type="obsolete">Перемкнутись у &повноекранний режим</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>Перемкнутись між повноекранним і звичайним екраном</translation>
+ <translation type="obsolete">Перемкнутись між повноекранним і звичайним екраном</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>Перемкнутись у &ціловикроєний режим</translation>
+ <translation type="obsolete">Перемкнутись у &ціловикроєний режим</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -513,7 +513,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>Перемкнутись на &масштабний режим</translation>
+ <translation type="obsolete">Перемкнутись на &масштабний режим</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -720,7 +720,7 @@
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>Вс&тавити Ctrl-Alt-Backspace</translation>
+ <translation type="obsolete">Вс&тавити Ctrl-Alt-Backspace</translation>
</message>
<message>
<source>Sort List</source>
@@ -911,10 +911,6 @@
<translation>Вимкнути вибрану віртуальну машину</translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -1075,6 +1071,95 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished">&Файл</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -1088,6 +1173,27 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished">%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1994,6 +2100,33 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Select a file to export into</source>
@@ -2725,7 +2858,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
+ <translation type="obsolete">[CD/DVD]</translation>
</message>
<message>
<source>Not Attached</source>
@@ -2876,6 +3009,61 @@ p, li { white-space: pre-wrap; }
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished">Контролер USB</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGMachinePreview</name>
@@ -3072,18 +3260,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">Вимкнути &зберігач головного екрана</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -4296,12 +4472,12 @@ p, li { white-space: pre-wrap; }
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Індикатори активності пристроїв CD/DVD:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Індикатори активності пристроїв CD/DVD:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>Індикатори активності пристроїв дискет:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>Індикатори активності пристроїв дискет:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -4413,6 +4589,16 @@ p, li { white-space: pre-wrap; }
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -4726,10 +4912,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -4781,43 +4963,35 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">Зменшена панель інструментів:</translation>
+ <translation type="obsolete">Зменшена панель інструментів:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">Якщо це позначено, показувати зменшену панель інструментів в повноекранному і ціловикроєному режимі.</translation>
+ <translation type="obsolete">Якщо це позначено, показувати зменшену панель інструментів в повноекранному і ціловикроєному режимі.</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">&Показувати в повноекранному/ціловикроєному</translation>
+ <translation type="obsolete">&Показувати в повноекранному/ціловикроєному</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">Якщо це позначено, показувати зменшену панель інструментів зверху екрана, а не, як типово, знизу.</translation>
+ <translation type="obsolete">Якщо це позначено, показувати зменшену панель інструментів зверху екрана, а не, як типово, знизу.</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">Показувати &зверху екрана</translation>
+ <translation type="obsolete">Показувати &зверху екрана</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5044,15 +5218,135 @@ p, li { white-space: pre-wrap; }
<translation>&Перегування:</translation>
</message>
<message>
- <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>Вибирає, які дані буде скопійовано між гостьовою і головною системою за допомогою перетягування. Ця можливість потребує встановлення гостьових доповнень на гостьовій системі.</translation>
+ <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation>Вибирає, які дані буде скопійовано між гостьовою і головною системою за допомогою перетягування. Ця можливість потребує встановлення гостьових доповнень на гостьовій системі.</translation>
+ </message>
+ <message>
+ <source>No name specified for the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation type="unfinished">Просторове {100%?}</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation type="unfinished">Просторове {200%?}</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation type="unfinished">Зменшена панель інструментів:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation type="unfinished">Якщо це позначено, показувати зменшену панель інструментів в повноекранному і ціловикроєному режимі.</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished">&Показувати в повноекранному/ціловикроєному</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished">Якщо це позначено, показувати зменшену панель інструментів зверху екрана, а не, як типово, знизу.</translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished">Показувати &зверху екрана</translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5643,11 +5937,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>Якщо це позначено, канал описується в полі <b>Шлях порту</b>, яке буде створене при запуску віртуальної машини. Інакше віртуальна машина спробує використати наявний канал.</translation>
+ <translation type="obsolete">Якщо це позначено, канал описується в полі <b>Шлях порту</b>, яке буде створене при запуску віртуальної машини. Інакше віртуальна машина спробує використати наявний канал.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>&Створити канал</translation>
+ <translation type="obsolete">&Створити канал</translation>
</message>
<message>
<source>Port &Path:</source>
@@ -5655,11 +5949,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>Показує шлях до головного каналу послідовного порту, коли порт працює в режимі <b>Головний канал</b>, або назву головного пристрою послідовного порту, коли порт працює в режимі <b>Головний пристрій</b>.</translation>
+ <translation type="obsolete">Показує шлях до головного каналу послідовного порту, коли порт працює в режимі <b>Головний канал</b>, або назву головного пристрою послідовного порту, коли порт працює в режимі <b>Головний пристрій</b>.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>&Шлях порту/файла:</translation>
+ <translation type="obsolete">&Шлях порту/файла:</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -5669,6 +5963,22 @@ p, li { white-space: pre-wrap; }
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>Показує базову адресу порту В/В цього послідовного порту. Правильне значення — ціле число від <tt>0</tt> до <tt>0xFFFF</tt>.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -5793,11 +6103,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>Додати пристрій CD/DVD</nobr></translation>
+ <translation type="obsolete"><nobr>Додати пристрій CD/DVD</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>Додати пристрій дискет</nobr></translation>
+ <translation type="obsolete"><nobr>Додати пристрій дискет</nobr></translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
@@ -5841,11 +6151,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>Додати пристрій CD/DVD</translation>
+ <translation type="obsolete">Додати пристрій CD/DVD</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>Додати пристрій дискет</translation>
+ <translation type="obsolete">Додати пристрій дискет</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -6033,15 +6343,15 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>&Носій CD/DVD:</translation>
+ <translation type="obsolete">&Носій CD/DVD:</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>Виберіть віртуальний диск CD/DVD або фізичний носій для застосування віртуальним носієм. Віртуальна машина розпізнає диск замість носія з даними у файлі або на диску у фізичного носія як його вміст.</translation>
+ <translation type="obsolete">Виберіть віртуальний диск CD/DVD або фізичний носій для застосування віртуальним носієм. Віртуальна машина розпізнає диск замість носія з даними у файлі або на диску у фізичного носія як його вміст.</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>Налаштувати віртуальний носій CD/DVD</translation>
+ <translation type="obsolete">Налаштувати віртуальний носій CD/DVD</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -6065,7 +6375,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>Вибрати файл віртуально диска CD/DVD…</translation>
+ <translation type="obsolete">Вибрати файл віртуально диска CD/DVD…</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -6161,6 +6471,38 @@ p, li { white-space: pre-wrap; }
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -6566,10 +6908,6 @@ p, li { white-space: pre-wrap; }
<translation type="obsolete">USB 2.0 тепер увімкнуто для цієї віртуальної машини. Однак, це потребує встановити <b>%1</b>. Будь ласка, встановіть пакунок розширень із сайту звантаження VirtualBox. Після цього ви зможете перезапустити USB 2.0. Покищо це вимкнуто, поки ви не скасуєте поточні зміни налаштувань.</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -6589,6 +6927,10 @@ p, li { white-space: pre-wrap; }
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -6762,6 +7104,14 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Закрити</translation>
</message>
+ <message>
+ <source>Switch</source>
+ <translation type="unfinished">Перемкнути</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMessageCenter</name>
@@ -6805,7 +7155,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>Не вдалося створити об'єкт COM програми VirtualBox.</p><p>Програма зараз завершить роботу.</p></translation>
+ <translation type="obsolete"><p>Не вдалося створити об'єкт COM програми VirtualBox.</p><p>Програма зараз завершить роботу.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -7264,7 +7614,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>Випущено нову версію VirtualBox! Версія <b>%1</b> доступна на <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Ви можете звантажити цю версію прямим посиланням:<p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>Випущено нову версію VirtualBox! Версія <b>%1</b> доступна на <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>Ви можете звантажити цю версію прямим посиланням:<p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -7364,7 +7714,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>Один або більше віртуальних носіїв жорстких дисків, CD/DVD або дискет — недоступні. У результаті, ви не можете керувати віртуальною машиною, що використовує той носій, допоки носій не стане доступним.</p><p>Натисність <b>Перевірити</b>, щоб відкрити вікно менеджера віртуальних носіїв і побачити які носії недоступні, або натиснути <b>Ігнорувати</b>, щоб уникнути цього повідомлення.</p></translation>
+ <translation type="obsolete"><p>Один або більше віртуальних носіїв жорстких дисків, CD/DVD або дискет — недоступні. У результаті, ви не можете керувати віртуальною машиною, що використовує той носій, допоки носій не стане доступним.</p><p>Натисність <b>Перевірити</b>, щоб відкрити вікно менеджера віртуальних носіїв і побачити які носії недоступні, або натиснути <b>Ігнорувати</b>, щоб уникнути цього повідомлення.</p></translation>
</message>
<message>
<source><p>Your existing VirtualBox settings files were automatically converted from the old format to a new format required by the new version of VirtualBox.</p><p>Press <b>OK</b> to start VirtualBox now or press <b>More</b> if you want to get more information about what files were converted and access additional actions.</p><p>Press <b>Exit</b> to terminate the VirtualBox application without saving the results of [...]
@@ -7395,7 +7745,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>Трапилась критична помилка під час роботи віртуальної машини і її виконання припинено.</p><p>Зверніться до спільноти за допомогою на сайті <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> або до вашої групи підтримки. Будь ласка, додайте свій журнал помилок <tt>VBox.log</tt> та зображення <tt>VBox.png</tt>, які ви можете знайти в теці <nobr><b>%1</b></nobr>, і також опис т [...]
+ <translation type="obsolete"><p>Трапилась критична помилка під час роботи віртуальної машини і її виконання припинено.</p><p>Зверніться до спільноти за допомогою на сайті <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> або до вашої групи підтримки. Будь ласка, додайте свій журнал помилок <tt>VBox.log</tt> та зображення <tt>VBox.png</tt>, які ви можете знайти в теці <nobr><b>%1</b></nobr> [...]
</message>
<message>
<source>hard disk</source>
@@ -7702,7 +8052,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>Вилучити пристрій CD/DVD?</p><p>Ви не зможете змонтувати ані CD, ані образ ISO, ані встановити гостьові доповнення без нього!</p></translation>
+ <translation type="obsolete"><p>Вилучити пристрій CD/DVD?</p><p>Ви не зможете змонтувати ані CD, ані образ ISO, ані встановити гостьові доповнення без нього!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -7777,7 +8127,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>Ви збираєтесь додати новий носій CD/DVD до контролера <b>%1</b>.</p><p>Бажаєте вибрати віртуальний диск CD/DVD, щоб застосувати у носії, або залишити це порожнім поки що?</p></translation>
+ <translation type="obsolete"><p>Ви збираєтесь додати новий носій CD/DVD до контролера <b>%1</b>.</p><p>Бажаєте вибрати віртуальний диск CD/DVD, щоб застосувати у носії, або залишити це порожнім поки що?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -7799,11 +8149,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Не вдалось від'єднати носій CD/DVD (<nobr><b>%1</b></nobr>) із гнізда <i>%2</i> машини <b>%3</b>.</translation>
+ <translation type="obsolete">Не вдалось від'єднати носій CD/DVD (<nobr><b>%1</b></nobr>) із гнізда <i>%2</i> машини <b>%3</b>.</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Не вдалось від'єднати носій дискет (<nobr><b>%1</b></nobr>) із гнізда <i>%2</i> машини <b>%3</b>.</translation>
+ <translation type="obsolete">Не вдалось від'єднати носій дискет (<nobr><b>%1</b></nobr>) із гнізда <i>%2</i> машини <b>%3</b>.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Machine</b> menu. If they are installed but the machine is not yet fully started then s [...]
@@ -7855,11 +8205,11 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Не вдалось під'єднати носій CD/DVD (<nobr><b>%1</b></nobr>) до гнізда <i>%2</i> машини <b>%3</b>.</translation>
+ <translation type="obsolete">Не вдалось під'єднати носій CD/DVD (<nobr><b>%1</b></nobr>) до гнізда <i>%2</i> машини <b>%3</b>.</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>Не вдалось під'єднати носій дискет (<nobr><b>%1</b></nobr>) до гнізда <i>%2</i> машини <b>%3</b>.</translation>
+ <translation type="obsolete">Не вдалось під'єднати носій дискет (<nobr><b>%1</b></nobr>) до гнізда <i>%2</i> машини <b>%3</b>.</translation>
</message>
<message>
<source>Deletion of all files belonging to the VM is currently disabled on Windows/x64 to prevent a crash. That will be fixed in the next release.</source>
@@ -8113,7 +8463,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Failed to drop data.</source>
- <translation>Не вдалось кинути дані.</translation>
+ <translation type="obsolete">Не вдалось кинути дані.</translation>
</message>
<message>
<source><p>Failed to initialize COM because the VirtualBox global configuration directory <b><nobr>%1</nobr></b> is not accessible. Please check the permissions of this directory and of its parent directory.</p><p>The application will now terminate.</p></source>
@@ -8378,14 +8728,6 @@ p, li { white-space: pre-wrap; }
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -8446,6 +8788,94 @@ p, li { white-space: pre-wrap; }
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniProcessWidgetAdditions</name>
@@ -9508,13 +9938,17 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>Ласкаво просимо до VirtualBox!</h3><p>У лівій частині цього вікна показується список віртуальних машин на вашому комп'ютері. Зараз список порожній, оскільки, поки що, ви не маєте створених віртуальних машин.<img src=:/welcome.png align=right/></p><p>Для того, щоб створити нову віртуальну машину, натисніть <b>Створити</b> в головному меню панелі інструментів, які розміщено зверху вікна.</p><p>Ви може [...]
+ <translation type="obsolete"><h3>Ласкаво просимо до VirtualBox!</h3><p>У лівій частині цього вікна показується список віртуальних машин на вашому комп'ютері. Зараз список порожній, оскільки, поки що, ви не маєте створених віртуальних машин.<img src=:/welcome.png align=right/></p><p>Для того, щоб створити нову віртуальну машину, натисніть <b>Створити</b> в головному меню панелі інструментів, які розміщено зверху вікна.</p> [...]
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>Керування</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -9547,7 +9981,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Settings</source>
- <translation>Налаштування</translation>
+ <translation type="obsolete">Налаштування</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -9600,6 +10034,10 @@ p, li { white-space: pre-wrap; }
<source>Display</source>
<translation>Екран</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -9675,6 +10113,25 @@ p, li { white-space: pre-wrap; }
<source>you are currently using more storage controllers than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2.</source>
<translation type="obsolete">ви тепер використовуєте більше пам'яті контролерів, аніж підтримується — %1. Будь ласка, змініть тип комплекс мікросхем на сторінці налаштувань системи або або збільште кількість кількість пам'яті таких контролерів на сторінці налаштувань пам'яті: %2.</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">Налаштування</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -9689,6 +10146,10 @@ p, li { white-space: pre-wrap; }
<source>Close</source>
<translation type="unfinished">Закрити</translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -10013,7 +10474,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>Режим перетягування</translation>
+ <translation type="obsolete">Режим перетягування</translation>
</message>
<message>
<source>Configuration &Details</source>
@@ -10027,6 +10488,10 @@ p, li { white-space: pre-wrap; }
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -11846,7 +12311,7 @@ p, li { white-space: pre-wrap; }
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>CD/DVD</translation>
+ <translation type="obsolete">CD/DVD</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -12650,17 +13115,17 @@ p, li { white-space: pre-wrap; }
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>Під'єднання цього жорсткого диска буде здійснюватись непрямим чином, використовуючи новостворені обчислення жорсткого диска.</translation>
+ <translation type="obsolete">Під'єднання цього жорсткого диска буде здійснюватись непрямим чином, використовуючи новостворені обчислення жорсткого диска.</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>Деякі носії цієї низки жорсткий дисків недоступні. Будь ласка, використайте керування віртуальними носіями в режимі <b>Показати обчислення жорстких дисків</b>, щоб оглянути цей носій.</translation>
+ <translation type="obsolete">Деякі носії цієї низки жорсткий дисків недоступні. Будь ласка, використайте керування віртуальними носіями в режимі <b>Показати обчислення жорстких дисків</b>, щоб оглянути цей носій.</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
- <translation>Цей базовий жорсткий диск не напряму під'єднано, використовуючи такі обчислення жорсткого диска:</translation>
+ <translation type="obsolete">Цей базовий жорсткий диск не напряму під'єднано, використовуючи такі обчислення жорсткого диска:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -12717,7 +13182,7 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
+ <translation type="obsolete">(CD/DVD)</translation>
</message>
<message>
<source>VDE network, '%1'</source>
@@ -13272,16 +13737,6 @@ p, li { white-space: pre-wrap; }
<translation>Виберіть адресу для нового файла віртуального жорсткого диска</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -13379,6 +13834,105 @@ p, li { white-space: pre-wrap; }
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished">Активні</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished">Активні</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished">Активні</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished">TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -13685,6 +14239,10 @@ p, li { white-space: pre-wrap; }
<source>Create a new virtual hard drive</source>
<translation type="obsolete">Створити новий віртуальний жорсткий диск</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
index 6e13987..a0818f9 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts
@@ -171,26 +171,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Disable &Mouse Integration</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Temporarily disable host mouse pointer integration</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&Insert Ctrl-Alt-Del</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Take a snapshot of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -235,18 +215,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&CD/DVD Devices</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&Floppy Devices</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&USB Devices</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Change the settings of network adapters</source>
<translation type="unfinished"></translation>
</message>
@@ -285,26 +253,10 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Switch to &Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch between normal and fullscreen mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Switch to Seam&less Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and seamless desktop integration mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Switch to &Scaled Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Switch between normal and scaled mode</source>
<translation type="unfinished"></translation>
</message>
@@ -373,10 +325,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation type="unfinished"></translation>
@@ -640,10 +588,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation type="unfinished"></translation>
</message>
@@ -684,11 +628,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Logging...</source>
- <comment>debug action</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Popup Menu</source>
<translation type="unfinished"></translation>
</message>
@@ -813,6 +752,99 @@
<source>Display the Extra Data Manager window</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>&File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Seam&less Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIActionPoolRuntime</name>
@@ -826,6 +858,25 @@
<comment>Virtual Screen</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
</context>
<context>
<name>UIApplianceEditorWidget</name>
@@ -1019,6 +1070,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation type="unfinished">
+ <numerusform></numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIGChooserItemGroup</name>
<message>
<source><b>%1</b></source>
@@ -1148,11 +1224,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Controller</source>
<comment>details (audio)</comment>
<translation type="unfinished"></translation>
@@ -1351,6 +1422,61 @@
<comment>details (system)</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIGMachinePreview</name>
@@ -1507,18 +1633,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation type="unfinished"></translation>
</message>
@@ -2259,16 +2373,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
- <comment>CD/DVD tooltip</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
- <comment>FD tooltip</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
<comment>Network adapters tooltip</comment>
<translation type="unfinished"></translation>
@@ -2347,6 +2451,16 @@
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UILineTextEdit</name>
@@ -2592,10 +2706,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
<translation type="unfinished"></translation>
</message>
@@ -2647,94 +2757,186 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Machine &Window</source>
+ <source><i>About %1MB per 5 minute video</i></source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Allows to modify VM menu-bar contents.</source>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Mini ToolBar:</source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>UIMachineSettingsGeneral</name>
<message>
- <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <source>Holds the path where snapshots of this virtual machine will be stored. Be aware that snapshots can take quite a lot of disk space.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Show in &Fullscreen/Seamless</source>
+ <source>Basi&c</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <source>A&dvanced</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Show at &Top of Screen</source>
+ <source>&Shared Clipboard:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
+ <source>Selects which clipboard data will be copied between the guest and the host OS. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>S&napshot Folder:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <source>D&escription</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>Holds the description of the virtual machine. The description field is useful for commenting on configuration details of the installed guest OS.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>D&rag'n'Drop:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>No name specified for the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
- <name>UIMachineSettingsGeneral</name>
+ <name>UIMachineSettingsInterface</name>
<message>
- <source>Holds the path where snapshots of this virtual machine will be stored. Be aware that snapshots can take quite a lot of disk space.</source>
+ <source>Allows to modify VM menu-bar contents.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Basi&c</source>
+ <source>Screen Scale Factor:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>A&dvanced</source>
+ <source>This setting determines the guest screen scale factor.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Shared Clipboard:</source>
+ <source>100%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Selects which clipboard data will be copied between the guest and the host OS. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <source>200%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>S&napshot Folder:</source>
+ <source>%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>D&escription</source>
+ <source>HiDPI:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the description of the virtual machine. The description field is useful for commenting on configuration details of the installed guest OS.</source>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>D&rag'n'Drop:</source>
+ <source>Use &Unscaled HiDPI Output</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <source>Mini ToolBar:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -3134,27 +3336,27 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
+ <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>&Create Pipe</source>
+ <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Port/File &Path:</source>
+ <source>&Connect to existing pipe/socket</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
+ <source>&Path/Address:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
<translation type="unfinished"></translation>
</message>
</context>
@@ -3196,14 +3398,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><nobr>Add CD/DVD Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><nobr>Add Floppy Device</nobr></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Add Controller</source>
<translation type="unfinished"></translation>
</message>
@@ -3236,14 +3430,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Add CD/DVD Device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Add Floppy Device</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove Attachment</source>
<translation type="unfinished"></translation>
</message>
@@ -3372,18 +3558,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Set up the virtual CD/DVD drive</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Floppy &Drive:</source>
<translation type="unfinished"></translation>
</message>
@@ -3404,10 +3578,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Remove disk from virtual drive</source>
<translation type="unfinished"></translation>
</message>
@@ -3489,6 +3659,38 @@
<source>&Hot-pluggable</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSystem</name>
@@ -3817,10 +4019,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
<translation type="unfinished"></translation>
</message>
@@ -3840,6 +4038,10 @@
<source>USB &3.0 (xHCI) Controller</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsUSBFilterDetails</name>
@@ -3990,11 +4192,19 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Virtual Screen Mapping</source>
+ <source>Virtual Screen Mapping</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Switch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Close</source>
+ <source>Enable Menu Bar</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -4039,10 +4249,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to set global VirtualBox properties.</source>
<translation type="unfinished"></translation>
</message>
@@ -4268,10 +4474,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Release</source>
<comment>detach medium</comment>
<translation type="unfinished"></translation>
@@ -4312,14 +4514,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
<translation type="unfinished"></translation>
</message>
@@ -4416,10 +4610,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Remove</source>
<comment>medium</comment>
<translation type="unfinished"></translation>
@@ -4469,10 +4659,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -4481,14 +4667,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation type="unfinished"></translation>
</message>
@@ -4517,14 +4695,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -4716,10 +4886,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Failed to drop data.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
<translation type="unfinished"></translation>
</message>
@@ -4943,14 +5109,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation type="unfinished"></translation>
</message>
@@ -5011,6 +5169,94 @@
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIMiniToolBar</name>
@@ -5233,12 +5479,12 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <source>Manager</source>
+ <comment>Note: main window title which is pretended by the product name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Manager</source>
- <comment>Note: main window title which is pretended by the product name.</comment>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
<translation type="unfinished"></translation>
</message>
</context>
@@ -5260,10 +5506,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Settings</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source><b>%1</b> page:</source>
<translation type="unfinished"></translation>
</message>
@@ -5310,6 +5552,10 @@
<source>Display</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -5361,6 +5607,25 @@
<source>%1 - %2</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
@@ -5375,6 +5640,10 @@
<source>Close</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UITextEditor</name>
@@ -5601,10 +5870,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation type="unfinished"></translation>
</message>
@@ -5616,6 +5881,10 @@
<source>VM Uptime</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UIVMListView</name>
@@ -6564,11 +6833,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>CD/DVD</source>
- <comment>DeviceType</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Hard Disk</source>
<comment>DeviceType</comment>
<translation type="unfinished"></translation>
@@ -7157,21 +7421,6 @@
<comment>medium</comment>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
- <comment>medium</comment>
- <translation type="unfinished"></translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
@@ -7209,10 +7458,6 @@
</translation>
</message>
<message>
- <source>(CD/DVD)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Screens</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -7647,16 +7892,6 @@
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation type="unfinished"></translation>
@@ -7754,6 +7989,105 @@
<comment>MediumVariant</comment>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxGlobalSettings</name>
@@ -7884,6 +8218,10 @@
<source>Modify the attributes of the selected disk image file</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>VBoxScreenshotViewer</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
index df0defa..d14bb7e 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts
@@ -219,19 +219,19 @@
</message>
<message>
<source>Disable &Mouse Integration</source>
- <translation>禁止自动独占鼠标(&M)</translation>
+ <translation type="obsolete">禁止自动独占鼠标(&M)</translation>
</message>
<message>
<source>Temporarily disable host mouse pointer integration</source>
- <translation>临时禁止自动独占鼠标</translation>
+ <translation type="obsolete">临时禁止自动独占鼠标</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Del</source>
- <translation>发送 Ctrl-Alt-Del (&E)</translation>
+ <translation type="obsolete">发送 Ctrl-Alt-Del (&E)</translation>
</message>
<message>
<source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>发送 Ctrl-Alt-Del 键盘序列到虚拟电脑</translation>
+ <translation type="obsolete">发送 Ctrl-Alt-Del 键盘序列到虚拟电脑</translation>
</message>
<message>
<source>&Insert Ctrl-Alt-Backspace</source>
@@ -239,7 +239,7 @@
</message>
<message>
<source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>发送 Ctrl-Alt-Backspace 键盘序列到虚拟电脑</translation>
+ <translation type="obsolete">发送 Ctrl-Alt-Backspace 键盘序列到虚拟电脑</translation>
</message>
<message>
<source>Take &Snapshot...</source>
@@ -247,7 +247,7 @@
</message>
<message>
<source>Take a snapshot of the virtual machine</source>
- <translation>为当前虚拟电脑生成一个备份</translation>
+ <translation>为当前虚拟电脑生成一个备份[系统快照]</translation>
</message>
<message>
<source>Show Session Information Dialog</source>
@@ -295,15 +295,15 @@
</message>
<message>
<source>&CD/DVD Devices</source>
- <translation>分配光驱(&C)</translation>
+ <translation type="obsolete">分配光驱(&C)</translation>
</message>
<message>
<source>&Floppy Devices</source>
- <translation>分配软驱(&F)</translation>
+ <translation type="obsolete">分配软驱(&F)</translation>
</message>
<message>
<source>&USB Devices</source>
- <translation>分配USB设备(&U)</translation>
+ <translation type="obsolete">分配USB设备(&U)</translation>
</message>
<message>
<source>&Network Adapters...</source>
@@ -370,15 +370,15 @@
</message>
<message>
<source>Switch to &Fullscreen</source>
- <translation>切换到全屏模式(&F)</translation>
+ <translation type="obsolete">切换到全屏模式(&F)</translation>
</message>
<message>
<source>Switch between normal and fullscreen mode</source>
- <translation>切换正常或全屏模式</translation>
+ <translation type="obsolete">切换正常或全屏模式</translation>
</message>
<message>
<source>Switch to Seam&less Mode</source>
- <translation>切换到无缝模式(&L)</translation>
+ <translation type="obsolete">切换到无缝模式(&L)</translation>
</message>
<message>
<source>Switch between normal and seamless desktop integration mode</source>
@@ -386,7 +386,7 @@
</message>
<message>
<source>Switch to &Scaled Mode</source>
- <translation>切换到自动缩放模式(&S)</translation>
+ <translation type="obsolete">切换到自动缩放模式(&S)</translation>
</message>
<message>
<source>Switch between normal and scaled mode</source>
@@ -454,19 +454,19 @@
</message>
<message>
<source>Take Sn&apshot...</source>
- <translation>生成备份(&A)...</translation>
+ <translation>生成备份[系统快照](&A)...</translation>
</message>
<message>
<source>Take Screensh&ot...</source>
- <translation>抓取屏幕快照(&O)...</translation>
+ <translation>屏幕截图(&O)...</translation>
</message>
<message>
<source>Take a screenshot of the virtual machine</source>
- <translation>为当前虚拟电脑生成一个屏幕快照</translation>
+ <translation>为当前虚拟电脑生成一个屏幕截图</translation>
</message>
<message>
<source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>发送 Ctrl-Alt-Backspace (&E)</translation>
+ <translation type="obsolete">发送 Ctrl-Alt-Backspace (&E)</translation>
</message>
<message>
<source>&File</source>
@@ -763,177 +763,267 @@
</message>
<message>
<source>Drag'n'Drop</source>
- <translation>拖放</translation>
+ <translation type="obsolete">拖放</translation>
</message>
<message>
<source>Save the machine state of the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>保存虚拟电脑的状态</translation>
</message>
<message>
<source>Power off the virtual machine</source>
- <translation type="unfinished"></translation>
+ <translation>强制退出</translation>
</message>
<message>
<source>&Network Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>网络(&N)...</translation>
</message>
<message>
<source>&Shared Folders Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>共享文件夹(&S)...</translation>
</message>
<message>
<source>R&emote Display</source>
- <translation type="unfinished"></translation>
+ <translation>远程桌面(&R)</translation>
</message>
<message>
<source>Toggle remote desktop (RDP) connections to this machine</source>
- <translation type="unfinished"></translation>
+ <translation>切换到当前虚拟电脑的远程桌面(RDP)连接</translation>
</message>
<message>
<source>&Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>录像(&V)</translation>
</message>
<message>
<source>Toggle video capture</source>
- <translation type="unfinished"></translation>
+ <translation>切换录像</translation>
</message>
<message>
<source>&Video Capture Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>录像设置(&V)...</translation>
</message>
<message>
<source>Configure video capture settings</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>&Logging...</source>
- <comment>debug action</comment>
- <translation type="unfinished"></translation>
+ <translation>设定录像选项</translation>
</message>
<message>
<source>Popup Menu</source>
- <translation type="unfinished"></translation>
+ <translation>弹出菜单</translation>
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished"></translation>
+ <translation>显示当前运行状态信息</translation>
</message>
<message>
<source>&Webcams</source>
- <translation type="unfinished"></translation>
+ <translation>摄像头(&W)</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished"></translation>
+ <translation>安装增强功能(&I)...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished"></translation>
+ <translation>打开增强功能包所在虚拟光盘</translation>
</message>
<message>
<source>&VirtualBox</source>
- <translation type="unfinished"></translation>
+ <translation>&VirtualBox</translation>
</message>
<message>
<source>&Menu Bar</source>
- <translation type="unfinished"></translation>
+ <translation>菜单栏(&M)</translation>
</message>
<message>
<source>&Menu Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>菜单栏设置(&M)...</translation>
</message>
<message>
<source>Opens window to configure menu-bar</source>
- <translation type="unfinished"></translation>
+ <translation>打开对话框选配置菜单栏</translation>
</message>
<message>
<source>Show Menu &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>显示菜单栏(&B)</translation>
</message>
<message>
<source>Toggle menu-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>切换菜单栏</translation>
</message>
<message>
<source>&Status Bar</source>
- <translation type="unfinished"></translation>
+ <translation>状态栏(&S)</translation>
</message>
<message>
<source>&Status Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>状态栏设置(&S)...</translation>
</message>
<message>
<source>Opens window to configure status-bar</source>
- <translation type="unfinished"></translation>
+ <translation>打开对话框选配置状态栏</translation>
</message>
<message>
<source>Show Status &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>显示状态栏(&B)</translation>
</message>
<message>
<source>Toggle status-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>切换状态栏</translation>
</message>
<message>
<source>&Input</source>
- <translation type="unfinished"></translation>
+ <translation>热键(&I)</translation>
</message>
<message>
<source>&Keyboard</source>
- <translation type="unfinished"></translation>
+ <translation>热键(&K)</translation>
</message>
<message>
<source>&Keyboard Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>热键设置(&K)...</translation>
</message>
<message>
<source>Display the global settings window to configure shortcuts</source>
- <translation type="unfinished"></translation>
+ <translation>打开全局设定界面设置热键</translation>
</message>
<message>
<source>&Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>鼠标(&M)</translation>
</message>
<message>
<source>&Hard Drives</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟硬盘(&H)</translation>
</message>
<message>
<source>&Hard Drive Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟硬盘设置(&H)...</translation>
</message>
<message>
<source>Change the settings of hard drives</source>
- <translation type="unfinished"></translation>
+ <translation>更改虚拟硬盘设置</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished">网络</translation>
+ <translation>网络</translation>
</message>
<message>
<source>&USB Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>USB设置(&U)...</translation>
</message>
<message>
<source>Change the settings of USB devices</source>
- <translation type="unfinished"></translation>
+ <translation>更改USB设置</translation>
</message>
<message>
<source>&Shared Folders</source>
- <translation type="unfinished"></translation>
+ <translation>共享文件夹(&S)</translation>
</message>
<message>
<source>Show &Log...</source>
<comment>debug action</comment>
- <translation type="unfinished">日志(&L)...</translation>
+ <translation>日志(&L)...</translation>
</message>
<message>
<source>E&xtra Data Manager...</source>
- <translation type="unfinished"></translation>
+ <translatorcomment>todo</translatorcomment>
+ <translation>外部数据管理(&x)...</translation>
</message>
<message>
<source>Display the Extra Data Manager window</source>
- <translation type="unfinished"></translation>
+ <translation>打开外部数据管理界面</translation>
+ </message>
+ <message>
+ <source>&File</source>
+ <translation>管理(&F)</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translatorcomment>todo</translatorcomment>
+ <translation>窗口(&W)</translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation>窗口最小化(&M)</translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation>当前虚拟电脑窗口最小化</translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation>全屏模式(&F)</translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation>切换正常或全屏模式</translation>
+ </message>
+ <message>
+ <source>Seam&less Mode</source>
+ <translation>无缝模式(&L)</translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation>自动缩放模式(&S)</translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation>缩放率(&c)</translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation>载入 %1 (&I)</translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation>发送 %1 键盘序列到虚拟电脑</translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation>鼠标集成(&M)</translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation>启用主机鼠标指针合并</translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation>分配光驱(&O)</translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation>分配软驱(&F)</translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation>&USB</translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation>拖放</translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation>日志(&L)</translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation>正常启动(&N)</translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation>无界面启动(&H)</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation>在后台运行选中的虚拟电脑</translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation>分离式启动(&D)</translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
+ <translation>启动所选虚拟电脑,并允许其可在后台继续运行</translation>
</message>
</context>
<context>
@@ -941,12 +1031,31 @@
<message>
<source>Enable</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished">启用</translation>
+ <translation>启用</translation>
</message>
<message>
<source>Resize to %1x%2</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>重设为 %1x%2</translation>
+ </message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation>%1%</translation>
+ </message>
+</context>
+<context>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
+ <message>
+ <source>%1 - Disk Encryption</source>
+ <translation>%1 - 虚拟盘加密</translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation>
+ <numerusform>虚拟电脑已加密码保护。请在下面输入密码。</numerusform>
+ </translation>
</message>
</context>
<context>
@@ -1721,7 +1830,7 @@
<name>UIDnDDrag</name>
<message>
<source>Retrieving data ...</source>
- <translation type="unfinished"></translation>
+ <translation>获取数据...</translation>
</message>
</context>
<context>
@@ -1783,6 +1892,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation>状态</translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation>密码</translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation>
+ <numerusform><nobr>用于如下 %n 个硬盘:</nobr><br>%1</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIExportApplianceWzd</name>
<message>
<source>Appliance Export Wizard</source>
@@ -2053,19 +2187,19 @@
</message>
<message>
<source>Collapse group</source>
- <translation type="unfinished"></translation>
+ <translation>折叠编组</translation>
</message>
<message>
<source>Expand group</source>
- <translation type="unfinished"></translation>
+ <translation>展开编组</translation>
</message>
<message>
<source>Enter group</source>
- <translation type="unfinished"></translation>
+ <translation>进入编组</translation>
</message>
<message>
<source>Exit group</source>
- <translation type="unfinished"></translation>
+ <translation>退出编组</translation>
</message>
</context>
<context>
@@ -2140,7 +2274,7 @@
<message>
<source>[CD/DVD]</source>
<comment>details (storage)</comment>
- <translation>[光驱]</translation>
+ <translation type="obsolete">[光驱]</translation>
</message>
<message>
<source>Not attached</source>
@@ -2325,41 +2459,98 @@
<message>
<source>Video Capture File</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>录像文件</translation>
</message>
<message>
<source>Video Capture Attributes</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>录像属性</translation>
</message>
<message>
<source>Video Capture</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>录像</translation>
</message>
<message>
<source>Disabled</source>
<comment>details (display/video capture)</comment>
- <translation type="unfinished"></translation>
+ <translation>已禁用</translation>
</message>
<message>
<source>NAT Network, '%1'</source>
<comment>details (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>NAT 网络, '%1'</translation>
</message>
<message>
<source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
- <translation type="unfinished"></translation>
+ <translation>帧尺寸: %1x%2, 帧率: %3fps, 比特率: %4kbps</translation>
</message>
<message>
<source>Minimal Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>最少半虚拟化</translation>
</message>
<message>
<source>Hyper-V Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V 半虚拟化</translation>
+ </message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation>KVM 半虚拟化</translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation>[光驱]</translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation>USB 控制器</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translatorcomment>todo</translatorcomment>
+ <translation>缩放率</translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translatorcomment>todo</translatorcomment>
+ <translation>原始 HiDPI 视频输出</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation>已启用</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation>小工具栏位置</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>顶部</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>底部</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation>小工具栏</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation>已禁用</translation>
</message>
</context>
<context>
@@ -2612,15 +2803,15 @@
</message>
<message>
<source>Machine Windows:</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟机窗口:</translation>
</message>
<message>
<source>If checked, machine windows will be raised when the mouse pointer moves over them.</source>
- <translation type="unfinished"></translation>
+ <translation>选中时, 鼠标移到虚拟机窗口上则该窗口变为前置窗口。</translation>
</message>
<message>
<source>&Raise Window Under Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>鼠标前置窗口(&R)</translation>
</message>
</context>
<context>
@@ -2667,7 +2858,7 @@
</message>
<message>
<source>&Extension Packages</source>
- <translation type="unfinished"></translation>
+ <translation>扩展包(&E)</translation>
</message>
</context>
<context>
@@ -2709,28 +2900,16 @@
<translation type="obsolete">禁用主机的屏幕保护程序(&S)</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
- <translation type="unfinished"></translation>
+ <translation>主机的屏幕保护程序(&S):</translation>
</message>
<message>
<source>When checked, the host screensaver will be disabled whenever a virtual machine is running.</source>
- <translation type="unfinished"></translation>
+ <translation>选中时,如果虚拟机运行,主机的屏幕保护程序将被禁用。</translation>
</message>
<message>
<source>Disable When Running Virtual Machines</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟机正在运行时禁用</translation>
</message>
</context>
<context>
@@ -2761,27 +2940,27 @@
</message>
<message>
<source>Host Key Combination</source>
- <translation type="unfinished"></translation>
+ <translation>主机组合键</translation>
</message>
<message>
<source>Some items have the same shortcuts assigned.</source>
- <translation type="unfinished"></translation>
+ <translation>有些项目分配了相同的快捷键。</translation>
</message>
<message>
<source>&VirtualBox Manager</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟电脑管理器(&V)</translation>
</message>
<message>
<source>Virtual &Machine</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟电脑(&M)</translation>
</message>
<message>
<source>Lists all the available shortcuts which can be configured.</source>
- <translation type="unfinished"></translation>
+ <translation>列出所有可配置的快捷键。</translation>
</message>
<message>
<source>Enter a sequence to filter the shortcut list.</source>
- <translation type="unfinished"></translation>
+ <translation>输入内容过滤快捷键列表。</translation>
</message>
</context>
<context>
@@ -2840,7 +3019,7 @@
</message>
<message>
<source>&Interface Languages</source>
- <translation type="unfinished"></translation>
+ <translation>界面语言(&I)</translation>
</message>
</context>
<context>
@@ -2983,128 +3162,128 @@
</message>
<message>
<source>&NAT Networks</source>
- <translation type="unfinished"></translation>
+ <translation>&NAT 网络</translation>
</message>
<message>
<source>Lists all available NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>显示所有可用NAT网络。</translation>
</message>
<message>
<source>&Host-only Networks</source>
- <translation type="unfinished"></translation>
+ <translation>仅主机(Host-Only)网络(&H)</translation>
</message>
<message>
<source>No new name specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>没有为原先的 <b>%1</b> NAT网络指定新名称。</translation>
</message>
<message>
<source>No CIDR specified for the NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>没有为 <b>%1</b> NAT网络指定CIDR。</translation>
</message>
<message>
<source>No CIDR specified for the NAT network previously called <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>没有为原先的 <b>%1</b> NAT网络指定CIDR。</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>为 NAT 网络 <b>%2</b>.指定的CIDR (<i>%1</i>)无效。</translation>
</message>
<message>
<source>Invalid CIDR specified (<i>%1</i>) for the NAT network previously called <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>为 NAT 网络 <b>%2</b>.指定的CIDR (<i>%1</i>)无效。</translation>
</message>
<message>
<source>Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>网络名称</translation>
</message>
<message>
<source>[empty]</source>
- <translation type="unfinished"></translation>
+ <translation>[空]</translation>
</message>
<message>
<source>%1 (renamed from %2)</source>
- <translation type="unfinished"></translation>
+ <translation>%1 (从 %2 重命名)</translation>
</message>
<message>
<source>Old Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>旧网络名称</translation>
</message>
<message>
<source>New Network Name</source>
- <translation type="unfinished"></translation>
+ <translation>新网络名称</translation>
</message>
<message>
<source>Network CIDR</source>
- <translation type="unfinished"></translation>
+ <translation>网络 CIDR</translation>
</message>
<message>
<source>Supports DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>支持 DHCP</translation>
</message>
<message>
<source>yes</source>
- <translation type="unfinished"></translation>
+ <translation>是</translation>
</message>
<message>
<source>no</source>
- <translation type="unfinished"></translation>
+ <translation>否</translation>
</message>
<message>
<source>Supports IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>支持 IPv6</translation>
</message>
<message>
<source>Default IPv6 route</source>
- <translation type="unfinished"></translation>
+ <translation>默认 IPv6 路径</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 address.</source>
- <translation type="unfinished"></translation>
+ <translation>主机网卡 <b>%1</b> 目前没有有效的 IPv4 地址。</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv4 network mask.</source>
- <translation type="unfinished"></translation>
+ <translation>主机网卡 <b>%1</b> 目前没有有效的 IPv4 掩码。</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid IPv6 address.</source>
- <translation type="unfinished"></translation>
+ <translation>主机网卡 <b>%1</b> 目前没有有效的 IPv6 地址。</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server address.</source>
- <translation type="unfinished"></translation>
+ <translation>主机网卡 <b>%1</b> 目前没有有效的 DHCP 服务器地址。</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server mask.</source>
- <translation type="unfinished"></translation>
+ <translation>主机网卡 <b>%1</b> 目前没有有效的 DHCP 服务器掩码。</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server lower address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>主机网卡 <b>%1</b> 目前没有有效的 DHCP 服务器低地址。</translation>
</message>
<message>
<source>Host interface <b>%1</b> does not currently have a valid DHCP server upper address bound.</source>
- <translation type="unfinished"></translation>
+ <translation>主机网卡 <b>%1</b> 目前没有有效的 DHCP 服务器高地址。</translation>
</message>
<message>
<source>The name <b>%1</b> is being used for several NAT networks.</source>
- <translation type="unfinished"></translation>
+ <translation>此名称 <b>%1</b> 正用于多个 NAT 网络。</translation>
</message>
<message>
<source>Active</source>
<comment>NAT network</comment>
- <translation type="unfinished">活动</translation>
+ <translation>活动</translation>
</message>
<message>
<source>&Add NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>添加NAT网络(&A)</translation>
</message>
<message>
<source>&Remove NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>移除NAT网络(&R)</translation>
</message>
<message>
<source>&Edit NAT network</source>
- <translation type="unfinished"></translation>
+ <translation>编辑NAT网络(&E)</translation>
</message>
</context>
<context>
@@ -3207,177 +3386,177 @@
<name>UIGlobalSettingsNetworkDetailsHost</name>
<message>
<source>Host-only Network Details</source>
- <translation type="unfinished">仅主机(Host-Only)网络明细</translation>
+ <translation>仅主机(Host-Only)网络明细</translation>
</message>
<message>
<source>&Adapter</source>
- <translation type="unfinished">主机虚拟网络界面(&A)</translation>
+ <translation>主机虚拟网络界面(&A)</translation>
</message>
<message>
<source>Manual &Configuration</source>
- <translation type="unfinished">手动配置(&C)</translation>
+ <translation>手动配置(&C)</translation>
</message>
<message>
<source>Use manual configuration for this host-only network adapter.</source>
- <translation type="unfinished">为该仅主机(Host-Only)网络连接使用手动配置.</translation>
+ <translation>为该仅主机(Host-Only)网络连接使用手动配置.</translation>
</message>
<message>
<source>&IPv4 Address:</source>
- <translation type="unfinished">IPv4 地址(&I):</translation>
+ <translation>IPv4 地址(&I):</translation>
</message>
<message>
<source>Holds the host IPv4 address for this adapter.</source>
- <translation type="unfinished">显示主机虚拟网络界面的 IPv4 地址.</translation>
+ <translation>显示主机虚拟网络界面的 IPv4 地址.</translation>
</message>
<message>
<source>IPv4 Network &Mask:</source>
- <translation type="unfinished">IPv4 网络掩码(&M):</translation>
+ <translation>IPv4 网络掩码(&M):</translation>
</message>
<message>
<source>Holds the host IPv4 network mask for this adapter.</source>
- <translation type="unfinished">显示主机虚拟网络界面的 IPv4 网络掩码.</translation>
+ <translation>显示主机虚拟网络界面的 IPv4 网络掩码.</translation>
</message>
<message>
<source>I&Pv6 Address:</source>
- <translation type="unfinished">IPv6 地址(&P):</translation>
+ <translation>IPv6 地址(&P):</translation>
</message>
<message>
<source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">显示主机虚拟网络界面的 IPv6 地址.</translation>
+ <translation>显示主机虚拟网络界面的 IPv6 地址.</translation>
</message>
<message>
<source>IPv6 Network Mask &Length:</source>
- <translation type="unfinished">IPv6 网络掩码长度(&L):</translation>
+ <translation>IPv6 网络掩码长度(&L):</translation>
</message>
<message>
<source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
- <translation type="unfinished">显示主机虚拟网络界面的 IPv6 网络掩码前缀.</translation>
+ <translation>显示主机虚拟网络界面的 IPv6 网络掩码前缀.</translation>
</message>
<message>
<source>&DHCP Server</source>
- <translation type="unfinished">DHCP 服务器(&D)</translation>
+ <translation>DHCP 服务器(&D)</translation>
</message>
<message>
<source>&Enable Server</source>
- <translation type="unfinished">启用服务器(&E)</translation>
+ <translation>启用服务器(&E)</translation>
</message>
<message>
<source>Indicates whether the DHCP Server is enabled on machine startup or not.</source>
- <translation type="unfinished">指示DHCP服务器在电脑开机时是否启用.</translation>
+ <translation>指示DHCP服务器在电脑开机时是否启用.</translation>
</message>
<message>
<source>Server Add&ress:</source>
- <translation type="unfinished">服务器地址(&r):</translation>
+ <translation>服务器地址(&r):</translation>
</message>
<message>
<source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">显示 DHCP 服务器地址.</translation>
+ <translation>显示 DHCP 服务器地址.</translation>
</message>
<message>
<source>Server &Mask:</source>
- <translation type="unfinished">服务器网络掩码(&M):</translation>
+ <translation>服务器网络掩码(&M):</translation>
</message>
<message>
<source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">显示 DHCP 服务器网络掩码.</translation>
+ <translation>显示 DHCP 服务器网络掩码.</translation>
</message>
<message>
<source>&Lower Address Bound:</source>
- <translation type="unfinished">最小地址(&L):</translation>
+ <translation>最小地址(&L):</translation>
</message>
<message>
<source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">显示 DHCP 服务器提供的最小地址.</translation>
+ <translation>显示 DHCP 服务器提供的最小地址.</translation>
</message>
<message>
<source>&Upper Address Bound:</source>
- <translation type="unfinished">最大地址(&U):</translation>
+ <translation>最大地址(&U):</translation>
</message>
<message>
<source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation type="unfinished">显示 DHCP 服务器提供的最大地址.</translation>
+ <translation>显示 DHCP 服务器提供的最大地址.</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsNetworkDetailsNAT</name>
<message>
<source>NAT Network Details</source>
- <translation type="unfinished"></translation>
+ <translation>NAT 网络明细</translation>
</message>
<message>
<source>&Enable Network</source>
- <translation type="unfinished"></translation>
+ <translation>启用网络(&E)</translation>
</message>
<message>
<source>Enable this NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>启用此NAT网络。</translation>
</message>
<message>
<source>Network &Name:</source>
- <translation type="unfinished"></translation>
+ <translation>网络名称(&N):</translation>
</message>
<message>
<source>Holds the name for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>显示网络名称。</translation>
</message>
<message>
<source>Network &CIDR:</source>
- <translation type="unfinished"></translation>
+ <translation>网络 &CIDR:</translation>
</message>
<message>
<source>Holds the CIDR for this network.</source>
- <translation type="unfinished"></translation>
+ <translation>显示此网络的CIDR.</translation>
</message>
<message>
<source>Network Options:</source>
- <translation type="unfinished"></translation>
+ <translation>网络选项:</translation>
</message>
<message>
<source>Supports &DHCP</source>
- <translation type="unfinished"></translation>
+ <translation>支持 &DHCP</translation>
</message>
<message>
<source>Determines whether this network supports DHCP.</source>
- <translation type="unfinished"></translation>
+ <translation>确定网络是否支持DHCP.</translation>
</message>
<message>
<source>Supports &IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>支持 &IPv6</translation>
</message>
<message>
<source>Determines whether this network supports IPv6.</source>
- <translation type="unfinished"></translation>
+ <translation>确定网络是否支持IPv6.</translation>
</message>
<message>
<source>Advertise Default IPv6 &Route</source>
- <translation type="unfinished"></translation>
+ <translation>建议默认 IPv6 路径(&R)</translation>
</message>
<message>
<source>Determines whether this network should be advertised as the default IPv6 route.</source>
- <translation type="unfinished"></translation>
+ <translation>确定是否将此网络建议为默认 IPv6 路径。</translation>
</message>
<message>
<source>Opens a window to manage port forwarding rules.</source>
- <translation type="unfinished">打开管理端口转发规则的对话框。</translation>
+ <translation>打开管理端口转发规则的对话框。</translation>
</message>
<message>
<source>&Port Forwarding</source>
- <translation type="unfinished">端口转发(&P)</translation>
+ <translation>端口转发(&P)</translation>
</message>
</context>
<context>
<name>UIGlobalSettingsPortForwardingDlg</name>
<message>
<source>Port Forwarding Rules</source>
- <translation type="unfinished">端口转发规则</translation>
+ <translation>端口转发规则</translation>
</message>
<message>
<source>IPv4</source>
- <translation type="unfinished"></translation>
+ <translation>IPv4</translation>
</message>
<message>
<source>IPv6</source>
- <translation type="unfinished"></translation>
+ <translation>IPv6</translation>
</message>
</context>
<context>
@@ -3432,11 +3611,11 @@
</message>
<message>
<source>No proxy host is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定代理服务器。</translation>
</message>
<message>
<source>No proxy port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定代理端口。</translation>
</message>
</context>
<context>
@@ -3501,71 +3680,71 @@
<name>UIHostComboEditor</name>
<message>
<source><key_%1></source>
- <translation type="unfinished"><key_%1></translation>
+ <translation><key_%1></translation>
</message>
<message>
<source>Left </source>
- <translation type="unfinished">左 </translation>
+ <translation>左 </translation>
</message>
<message>
<source>Right </source>
- <translation type="unfinished">右 </translation>
+ <translation>右 </translation>
</message>
<message>
<source>Left Shift</source>
- <translation type="unfinished">左 Shift</translation>
+ <translation>左 Shift</translation>
</message>
<message>
<source>Right Shift</source>
- <translation type="unfinished">右 Shift</translation>
+ <translation>右 Shift</translation>
</message>
<message>
<source>Left Ctrl</source>
- <translation type="unfinished">左 Ctrl</translation>
+ <translation>左 Ctrl</translation>
</message>
<message>
<source>Right Ctrl</source>
- <translation type="unfinished">右 Ctrl</translation>
+ <translation>右 Ctrl</translation>
</message>
<message>
<source>Left Alt</source>
- <translation type="unfinished">左 Alt</translation>
+ <translation>左 Alt</translation>
</message>
<message>
<source>Right Alt</source>
- <translation type="unfinished">右 Alt</translation>
+ <translation>右 Alt</translation>
</message>
<message>
<source>Left WinKey</source>
- <translation type="unfinished">左 Win 键</translation>
+ <translation>左 Win 键</translation>
</message>
<message>
<source>Right WinKey</source>
- <translation type="unfinished">右 Win 键</translation>
+ <translation>右 Win 键</translation>
</message>
<message>
<source>Menu key</source>
- <translation type="unfinished">菜单键</translation>
+ <translation>菜单键</translation>
</message>
<message>
<source>Alt Gr</source>
- <translation type="unfinished">Alt Gr</translation>
+ <translation>Alt Gr</translation>
</message>
<message>
<source>Caps Lock</source>
- <translation type="unfinished">大写锁定键</translation>
+ <translation>大写锁定键</translation>
</message>
<message>
<source>Scroll Lock</source>
- <translation type="unfinished">滚屏锁定键</translation>
+ <translation>滚屏锁定键</translation>
</message>
<message>
<source>Host+</source>
- <translation type="unfinished"></translation>
+ <translation>主机键+</translation>
</message>
<message>
<source>None</source>
- <translation type="unfinished">空</translation>
+ <translation>空</translation>
</message>
</context>
<context>
@@ -3636,22 +3815,22 @@
</message>
<message>
<source>Reset shortcut to default</source>
- <translation type="unfinished"></translation>
+ <translation>恢复为默认值</translation>
</message>
<message>
<source>Unset shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>取消快捷键</translation>
</message>
</context>
<context>
<name>UIHotKeyTableModel</name>
<message>
<source>Name</source>
- <translation type="unfinished"></translation>
+ <translation>名称</translation>
</message>
<message>
<source>Shortcut</source>
- <translation type="unfinished"></translation>
+ <translation>快捷键</translation>
</message>
</context>
<context>
@@ -3744,12 +3923,12 @@
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
<comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>指示光驱活动状态:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>指示光驱活动状态:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
<comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>指示软驱活动状态:</nobr>%1</p></translation>
+ <translation type="obsolete"><p style='white-space:pre'><nobr>指示软驱活动状态:</nobr>%1</p></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
@@ -3829,24 +4008,34 @@
</message>
<message>
<source><nobr>Indicates video capturing activity:</nobr><br>%1</source>
- <translation type="unfinished"></translation>
+ <translation><nobr>指示录像进程:</nobr><br>%1</translation>
</message>
<message>
<source><nobr><b>Video capture disabled</b></nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>录像已关闭</b></nobr></translation>
</message>
<message>
<source><nobr><b>Video capture file:</b> %1</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>录像文件:</b> %1</nobr></translation>
</message>
<message>
<source>Additional feature status:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></source>
<comment>Virtualization Stuff LED</comment>
- <translation type="unfinished"></translation>
+ <translation>其他功能状态:<br><nobr><b>%1:</b> %2</nobr><br><nobr><b>%3:</b> %4</nobr><br><nobr><b>%5:</b> %6</nobr><br><nobr><b>%7:</b> %8%</nobr></translation>
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
- <translation type="unfinished"></translation>
+ <translation><p style='white-space:pre'><nobr>指示显示器活动状态:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>指示光驱活动状态:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>指示软驱活动状态:</nobr>%1</p></translation>
</message>
</context>
<context>
@@ -3896,23 +4085,23 @@
</message>
<message>
<source>Select a filename for the screenshot ...</source>
- <translation>选择屏幕快照的文件名...</translation>
+ <translation>选择屏幕截图的文件名...</translation>
</message>
<message>
<source>No Webcams Connected</source>
- <translation type="unfinished"></translation>
+ <translation>没有连接摄像头</translation>
</message>
<message>
<source>No supported webcams connected to the host PC</source>
- <translation type="unfinished"></translation>
+ <translation>没有可用摄像头连接到主机</translation>
</message>
<message>
<source>Connect Network Adapter</source>
- <translation type="unfinished"></translation>
+ <translation>启用网络连接</translation>
</message>
<message>
<source>Connect Network Adapter %1</source>
- <translation type="unfinished"></translation>
+ <translation>启用网络连接 %1</translation>
</message>
</context>
<context>
@@ -4064,170 +4253,162 @@
</message>
<message>
<source>Video &Capture</source>
- <translation type="unfinished"></translation>
+ <translation>录像(&C)</translation>
</message>
<message>
<source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
- <translation type="unfinished"></translation>
+ <translation>选中时,将虚拟机进程录制为视频文件。</translation>
</message>
<message>
<source>&Enable Video Capture</source>
- <translation type="unfinished"></translation>
+ <translation>启用录像(&E)</translation>
</message>
<message>
<source>File &Path:</source>
- <translation type="unfinished"></translation>
+ <translation>文件路径(&P):</translation>
</message>
<message>
<source>This setting determines the filename VirtualBox uses to save the recorded content.</source>
- <translation type="unfinished"></translation>
+ <translation>将录制内容保存到的文件名。</translation>
</message>
<message>
<source>Frame &Size:</source>
- <translation type="unfinished"></translation>
+ <translation>帧大小(&S):</translation>
</message>
<message>
<source>This setting determines the resolution (frame size) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>设定录像视频的分辨率(帧大小)。</translation>
</message>
<message>
<source>This setting determines the <b>horizontal</b> resolution (frame width) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation>录像的<b>水平</b> 分辨率 (帧宽度) 。</translation>
</message>
<message>
<source>This setting determines the <b>vertical</b> resolution (frame height) of the recorded video.</source>
- <translation type="unfinished"></translation>
+ <translation></translation>
</message>
<message>
<source>&Frame Rate:</source>
- <translation type="unfinished"></translation>
+ <translation>帧率(&F):</translation>
</message>
<message>
<source>This setting determines the maximum number of <b>frames per second</b>. Additional frames will be skipped. Reducing this value will increase the number of skipped frames and reduce the file size.</source>
- <translation type="unfinished"></translation>
+ <translation>设置最大的 <b>每秒帧数</b>。会跳过多余帧。设定小一点的值会跳过更多帧,文件会小些。</translation>
</message>
<message>
<source>&Quality:</source>
- <translation type="unfinished"></translation>
+ <translation>品质(&Q):</translation>
</message>
<message>
<source>This setting determines the <b>quality</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>录像的 <b>品质</b>。增加此值可使录像看起来好些,但文件会大些。</translation>
</message>
<message>
<source>This setting determines the bitrate in <b>kilobits per second</b>. Increasing this value will make the video look better at the cost of an increased file size.</source>
- <translation type="unfinished"></translation>
+ <translation>比特率 <b>千比特每秒</b>。增加此值可使录像看起来好些,但文件会大些。</translation>
</message>
<message>
<source>&Screens:</source>
- <translation type="unfinished"></translation>
+ <translation>屏幕(&S):</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration. However the host system does not currently provide this, so you will not be able to start the machine.</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟电脑设置为启用显卡硬件加速。 但是主机系统并不支持,此功能将不可用。</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required to switch to fullscreen or seamless mode.</source>
- <translation type="unfinished"></translation>
+ <translation>您分配了少于 <b>%1</b> 的显存,这会导致虚拟电脑无法切换到全屏模式或无缝模式。</translation>
</message>
<message>
<source>The virtual machine is currently assigned less than <b>%1</b> of video memory which is the minimum amount required for High Definition Video to be played efficiently.</source>
- <translation type="unfinished"></translation>
+ <translation>您分配了少于 <b>%1</b> 的显存,这会导致虚拟电脑无法切换到全屏模式或无缝模式。</translation>
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation type="obsolete">虚拟电脑设置为启用显卡硬件加速,并且操作系统设置为Windows Vista及更新版。为获得最佳性能,应将虚拟电脑的显存至少设置为 <b>%1</b>.</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟电脑设置为使用视频流加速。但是此功能仅适用于Windows客户系统。此设置将禁用。</translation>
</message>
<message>
<source>The VRDE server port value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未设置VRDE服务器端口值。</translation>
</message>
<message>
<source>The VRDE authentication timeout value is not currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未设置VRDE认证超时值。</translation>
</message>
<message>
<source>User Defined</source>
- <translation type="unfinished"></translation>
+ <translation>用户定义</translation>
</message>
<message>
<source>%1 fps</source>
- <translation type="unfinished"></translation>
+ <translation>%1 fps</translation>
</message>
<message>
<source>fps</source>
- <translation type="unfinished"></translation>
+ <translation>fps</translation>
</message>
<message>
<source>low</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>低</translation>
</message>
<message>
<source>medium</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>中</translation>
</message>
<message>
<source>high</source>
<comment>quality</comment>
- <translation type="unfinished"></translation>
+ <translation>高</translation>
</message>
<message>
<source>kbps</source>
- <translation type="unfinished"></translation>
+ <translation>kbps</translation>
</message>
<message>
<source>Screen %1</source>
- <translation type="unfinished"></translation>
+ <translation>屏幕 %1</translation>
</message>
<message>
<source>Enable video recording for screen %1.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
+ <translation>启用屏幕 %1 录像。</translation>
</message>
<message>
<source>Mini ToolBar:</source>
- <translation type="unfinished">小工具栏:</translation>
+ <translation type="obsolete">小工具栏:</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">选中,将在全屏或无缝模式显示小工具栏。</translation>
+ <translation type="obsolete">选中,将在全屏或无缝模式显示小工具栏。</translation>
</message>
<message>
<source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">在全屏或无缝模式显示(&F)</translation>
+ <translation type="obsolete">在全屏或无缝模式显示(&F)</translation>
</message>
<message>
<source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">选中,小工具栏将出现在屏幕的顶部,而不是默认的底部位置。</translation>
+ <translation type="obsolete">选中,小工具栏将出现在屏幕的顶部,而不是默认的底部位置。</translation>
</message>
<message>
<source>Show at &Top of Screen</source>
- <translation type="unfinished">在屏幕顶部显示(&T)</translation>
+ <translation type="obsolete">在屏幕顶部显示(&T)</translation>
</message>
<message>
- <source>Allows to modify VM status-bar contents.</source>
- <translation type="unfinished"></translation>
+ <source><i>About %1MB per 5 minute video</i></source>
+ <translation><i>五分钟视频约 %1MB</i></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
- <translation type="unfinished"></translation>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <translation>本虚拟机当前已启用远程桌面。然而,这需要安装 <b>%1</b>。请从 VirtualBox 下载站中安装“扩展增强包” (菜单操作:设备--安装增强功能),不然远程桌面将禁用。</translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
- <translation type="unfinished"></translation>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
+ <translation>虚拟电脑设置为启用显卡硬件加速,并且操作系统设置为Windows Vista及更新版。为获得最佳性能,应将虚拟电脑的显存至少设置为 <b>%1</b>.</translation>
</message>
</context>
<context>
@@ -4318,11 +4499,132 @@
</message>
<message>
<source>No name specified for the virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟电脑未设置名称。</translation>
</message>
<message>
<source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟电脑操作系统提示设为64位。 64位系统需要硬件虚拟。若设置则更改时自动选择。</translation>
+ </message>
+ <message>
+ <source>Enc&ryption</source>
+ <translation>加密(&r)</translation>
+ </message>
+ <message>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation>选中后,将为这个虚拟电脑启用加密.</translation>
+ </message>
+ <message>
+ <source>En&able Encryption</source>
+ <translation>启用加密(&a)</translation>
+ </message>
+ <message>
+ <source>Encryption C&ipher:</source>
+ <translation>加密算法(&i):</translation>
+ </message>
+ <message>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation>显示加密虚拟硬盘所用算法。</translation>
+ </message>
+ <message>
+ <source>E&nter New Password:</source>
+ <translation>新密码(&n):</translation>
+ </message>
+ <message>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation>显示虚拟电脑所用密码。</translation>
+ </message>
+ <message>
+ <source>C&onfirm New Password:</source>
+ <translation>重输新密码(&o):</translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation>确认所设密码。</translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation>你准备加密此虚拟电脑。不过,这需要安装<i>%1</i>。请从 VirtualBox 网站下载安装增强包。</translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation>未设置加密算法。</translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation>密码为空。</translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation>密码不匹配。</translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation>不更改</translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation>允许修改菜单栏。</translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation>屏幕缩放率:</translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation>设置虚拟电脑屏幕缩放率。</translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation>100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation>200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translatorcomment>todo</translatorcomment>
+ <translation>HiDPI:</translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation>选中时,虚拟电脑显示内容将不缩放匹配主机高分辨率屏幕。</translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation>用原始 HiDPI 输出(&U)</translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation>小工具栏:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation>选中,将在全屏或无缝模式显示小工具栏。</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation>在全屏或无缝模式显示(&F)</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation>选中,小工具栏将出现在屏幕的顶部,而不是默认的底部位置。</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation>在屏幕顶部显示(&T)</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation>允许修改状态栏。</translation>
</message>
</context>
<context>
@@ -4461,35 +4763,35 @@
</message>
<message>
<source>No bridged network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定要桥接的网卡。</translation>
</message>
<message>
<source>No internal network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定内部网络名称。</translation>
</message>
<message>
<source>No host-only network adapter is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定要仅主机(Host-Only)的网络界面。</translation>
</message>
<message>
<source>No generic driver is currently selected.</source>
- <translation type="unfinished"></translation>
+ <translation>没有选定通用驱动程序。</translation>
</message>
<message>
<source>The MAC address must be 12 hexadecimal digits long.</source>
- <translation type="unfinished"></translation>
+ <translation>MAC地址应为12个十六进制数字。</translation>
</message>
<message>
<source>The second digit in the MAC address may not be odd as only unicast addresses are allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>MAC地址的第二个数字不能为单数,仅支持唯一的地址。</translation>
</message>
<message>
<source>No NAT network name is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定NAT网络名称。</translation>
</message>
<message>
<source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
- <translation type="unfinished"></translation>
+ <translation>显示将连接到的NAT网络。可在全局设定中创建、删除全局网络设置。</translation>
</message>
</context>
<context>
@@ -4556,23 +4858,23 @@
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定IRQ。</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定I/O端口。</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>多个端口有同样的设置。</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定端口路径。</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>重复指定了端口路径。</translation>
</message>
</context>
<context>
@@ -4769,19 +5071,19 @@
</message>
<message>
<source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>如果选中,在 <b>端口路径</b>域中指定的通道将在虚拟电脑启动时被创建。否则虚拟电脑将尝试使用已存在的通道.</translation>
+ <translation type="obsolete">如果选中,在 <b>端口路径</b>域中指定的通道将在虚拟电脑启动时被创建。否则虚拟电脑将尝试使用已存在的通道.</translation>
</message>
<message>
<source>&Create Pipe</source>
- <translation>创建通道(&C)</translation>
+ <translation type="obsolete">创建通道(&C)</translation>
</message>
<message>
<source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>当端口工作在 <b>Host Pipe</b> 模式时将显示该串口通道在主机上的路径,或者当端口工作在 <b>Host Device</b> 模式时将显示主机上的串口设备名.</translation>
+ <translation type="obsolete">当端口工作在 <b>Host Pipe</b> 模式时将显示该串口通道在主机上的路径,或者当端口工作在 <b>Host Device</b> 模式时将显示主机上的串口设备名.</translation>
</message>
<message>
<source>Port/File &Path:</source>
- <translation>端口/文件位置(&P):</translation>
+ <translation type="obsolete">端口/文件位置(&P):</translation>
</message>
<message>
<source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
@@ -4791,6 +5093,22 @@
<source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
<translation>显示该串口的 I/O 端口地址,正确的数值为从 <tt>0</tt> 到 <tt>0xFFFF</tt>的整数.</translation>
</message>
+ <message>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation>如果选中,虚拟电脑将假设在 <b>路径/地址</b>域中指定的通道或套接字存在并尝试启用之,否则将在启动时创建之。</translation>
+ </message>
+ <message>
+ <source>&Connect to existing pipe/socket</source>
+ <translation>连接至现有通道或套接字(&C)</translation>
+ </message>
+ <message>
+ <source>&Path/Address:</source>
+ <translation>路径/地址(&P):</translation>
+ </message>
+ <message>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation><p>在 <b>主机通道</b> 模式: 显示到主机串口通道的路径. 例如: "\\.\pipe\myvbox" 或 "/tmp/myvbox", 对应 Windows 与 类UNIX 系统.</p><p>在 <b>主机设备</b> 模式: 显示主机串口设备名称. 例如: "COM1" 或 "/dev/ttyS0".</p><p>在 <b>裸文件</b> 模式: 显示主机中的串口输出存储文件的路径.</p><p>在 <b>TCP</b> 模式: 显示 TCP "端口" (服务器), 或 "主机名:端口" (客户端).</translation>
+ </message>
</context>
<context>
<name>UIMachineSettingsSerialPage</name>
@@ -4808,23 +5126,23 @@
</message>
<message>
<source>No IRQ is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定IRQ。</translation>
</message>
<message>
<source>No I/O port is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定I/O端口。</translation>
</message>
<message>
<source>Two or more ports have the same settings.</source>
- <translation type="unfinished"></translation>
+ <translation>多个端口有同样的设置。</translation>
</message>
<message>
<source>No port path is currently specified.</source>
- <translation type="unfinished"></translation>
+ <translation>未指定端口路径。</translation>
</message>
<message>
<source>There are currently duplicate port paths specified.</source>
- <translation type="unfinished"></translation>
+ <translation>重复指定了端口路径。</translation>
</message>
</context>
<context>
@@ -4843,11 +5161,11 @@
</message>
<message>
<source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>添加 虚拟 光驱</nobr></translation>
+ <translation type="obsolete"><nobr>添加 虚拟 光驱</nobr></translation>
</message>
<message>
<source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>添加 虚拟 软驱</nobr></translation>
+ <translation type="obsolete"><nobr>添加 虚拟 软驱</nobr></translation>
</message>
<message>
<source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source>
@@ -4887,11 +5205,11 @@
</message>
<message>
<source>Add CD/DVD Device</source>
- <translation>添加虚拟光驱</translation>
+ <translation type="obsolete">添加虚拟光驱</translation>
</message>
<message>
<source>Add Floppy Device</source>
- <translation>添加虚拟软驱</translation>
+ <translation type="obsolete">添加虚拟软驱</translation>
</message>
<message>
<source>Remove Attachment</source>
@@ -5043,15 +5361,15 @@
</message>
<message>
<source>CD/DVD &Drive:</source>
- <translation>分配光驱(&D):</translation>
+ <translation type="obsolete">分配光驱(&D):</translation>
</message>
<message>
<source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>选择用于虚拟驱动器的虚拟光盘或物理光驱。虚拟机将会看到插入的光盘上的数据。</translation>
+ <translation type="obsolete">选择用于虚拟驱动器的虚拟光盘或物理光驱。虚拟机将会看到插入的光盘上的数据。</translation>
</message>
<message>
<source>Set up the virtual CD/DVD drive</source>
- <translation>设置虚拟光盘</translation>
+ <translation type="obsolete">设置虚拟光盘</translation>
</message>
<message>
<source>Floppy &Drive:</source>
@@ -5075,7 +5393,7 @@
</message>
<message>
<source>Choose a virtual CD/DVD disk file...</source>
- <translation>选择一个虚拟光盘...</translation>
+ <translation type="obsolete">选择一个虚拟光盘...</translation>
</message>
<message>
<source>Remove disk from virtual drive</source>
@@ -5148,35 +5466,67 @@
</message>
<message>
<source>No name is currently specified for the controller at position <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>位于 <b>%1</b> 中的控制器未指定名称。</translation>
</message>
<message>
<source>The controller at position <b>%1</b> has the same name as the controller at position <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>位于 <b>%1</b> 中的控制器使用的名称已经被位于 <b>%2</b> 中的控制器所使用。</translation>
</message>
<message>
<source>No hard disk is selected for <i>%1</i>.</source>
- <translation type="unfinished"></translation>
+ <translation><i>%1</i> 没有选定硬盘。</translation>
</message>
<message>
<source><i>%1</i> is using a disk that is already attached to <i>%2</i>.</source>
- <translation type="unfinished"></translation>
+ <translation><i>%1</i> 使用的虚拟硬盘已经连接到 <i>%2</i> 。</translation>
</message>
<message>
<source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
- <translation type="unfinished"></translation>
+ <translation>您当前使用的存储控制器比 %1 芯片组支持的多。请在系统设置页面更改芯片组类型,或在存储设置页面减少以下存储控制器的数量: %2</translation>
</message>
<message>
<source>Add USB Controller</source>
- <translation type="unfinished"></translation>
+ <translation>添加USB控制器</translation>
</message>
<message>
<source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
- <translation type="unfinished"></translation>
+ <translation>选中时,虚拟机系统会将虚拟磁盘视为热插拔设备。</translation>
</message>
<message>
<source>&Hot-pluggable</source>
- <translation type="unfinished"></translation>
+ <translation>热插拔(&H)</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation>选择一个虚拟光盘文件...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation><nobr>添加 虚拟 光驱</nobr></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation><nobr>添加 虚拟 软驱</nobr></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation>添加虚拟光驱</translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation>添加虚拟软驱</translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation>分配光驱(&D):</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation>选择用于虚拟驱动器的虚拟光盘或物理光驱。虚拟机将会看到插入的光盘上的数据。</translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation>设置虚拟光盘</translation>
</message>
</context>
<context>
@@ -5276,7 +5626,7 @@
</message>
<message>
<source>When checked, the Physical Address Extension (PAE) feature of the host CPU will be exposed to the virtual machine.</source>
- <translation>选中,电脑上的物理地址扩展(PAE)特性将会传递给虚拟电脑.</translation>
+ <translation>选中,电脑上的物理地址扩展(PAE)特性将会传递给虚拟电脑.</translation>
</message>
<message>
<source>Enable PA&E/NX</source>
@@ -5383,55 +5733,55 @@
</message>
<message>
<source>&Pointing Device:</source>
- <translation type="unfinished"></translation>
+ <translation>指点设备(&P):</translation>
</message>
<message>
<source>Determines whether the emulated pointing device is a standard PS/2 mouse, a USB tablet or a USB multi-touch tablet.</source>
- <translation type="unfinished"></translation>
+ <translation>确定模拟的指点设备为标准的 PS/2 鼠标、USB平板或USB多点触摸平板。</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. Not enough memory is left for the host operating system. Please select a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>您已将当前电脑总内存 (<b>%2</b>) 中超过 <b>%1%</b> 的部分分配给了当前的虚拟电脑。这会导致主控系统上没有足够的内存来保证正常运行。因此请选择一个更小的数目。</translation>
</message>
<message>
<source>More than <b>%1%</b> of the host computer's memory (<b>%2</b>) is assigned to the virtual machine. There might not be enough memory left for the host operating system. Please consider selecting a smaller amount.</source>
- <translation type="unfinished"></translation>
+ <translation>您已将当前电脑总内存 (<b>%2</b>) 中超过 <b>%1%</b> 的部分分配给了当前的虚拟电脑。这会导致主控系统上没有足够的内存来保证正常运行。因此请选择一个更小的数目。</translation>
</message>
<message>
<source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>为了获得更好的性能,分配给虚拟电脑的虚拟处理器的数量不应超过电脑上实际的处理器数量 (<b>%1</b>) 的两倍,因此请减少为该虚拟电脑所分配的虚拟处理器的数量。</translation>
</message>
<message>
<source>More virtual CPUs are assigned to the virtual machine than the number of physical CPUs on the host system (<b>%1</b>). This is likely to degrade the performance of your virtual machine. Please consider reducing the number of virtual CPUs.</source>
- <translation type="unfinished"></translation>
+ <translation>您为该虚拟电脑分配的虚拟CPU数量已超过电脑上实际CPU数量 (<b>%1</b>),这会降低该虚拟电脑的运行速度,因此请考虑减少为该虚拟电脑分配的虚拟CPU数量。</translation>
</message>
<message>
<source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
- <translation type="unfinished"></translation>
+ <translation>您已将处理器运行峰值设置为低值。这可能会使虚拟机感觉响应很慢。</translation>
</message>
<message>
<source>&Paravirtualization Interface:</source>
- <translation type="unfinished"></translation>
+ <translation>半虚拟化接口(&P):</translation>
</message>
<message>
<source>Selects the paravirtualization guest interface provider to be used by this virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>选择虚拟电脑要采用的半虚拟化接口。</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9 you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>您已为该虚拟机分配了 ICH9 芯片组类型。只有同时启用 IO-APIC 功能,才能正常工作。这将在您按“确定”按钮访问虚拟机设置时自动完成。</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>USB配置页中USB控制器模拟未启用。 模拟USB输入设备时需要启用。 确认更改时将自动启用。</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>您已为该虚拟机分配了 ICH9 芯片组类型。只有同时启用 IO-APIC 功能,才能正常工作。这将在您按“确定”按钮访问虚拟机设置时自动完成。</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>尚未启用硬件虚拟。支持多个虚拟处理器时需要启用。当你按确认按钮接受虚拟机设定的时此选项将被启用。</translation>
</message>
</context>
<context>
@@ -5499,7 +5849,7 @@
</message>
<message>
<source>When checked, enables the virtual USB EHCI controller of this machine. The USB EHCI controller provides USB 2.0 support.</source>
- <translation>选中,在该虚拟电脑上启用 USB EHCI 控制器。该控制器将提供 USB 2.0支持.</translation>
+ <translation>选中时,在该虚拟电脑上启用 USB EHCI 控制器。该控制器将提供 USB 2.0支持.</translation>
</message>
<message>
<source>Enable USB 2.0 (E&HCI) Controller</source>
@@ -5563,28 +5913,28 @@
<translation type="obsolete">本虚拟机当前已启用 USB 2.0。然而,这需要安装 <b>%1</b>。请从 VirtualBox 下载站中安装“扩展增强包”。安装之后您将可以重新启用 USB 2.0。在此期间,除非您取消当前设置更改,否则将禁用此功能。</translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>选中时,在该虚拟电脑上启用 USB OHCI 控制器。该控制器将提供 USB 1.0支持.</translation>
</message>
<message>
<source>USB &1.1 (OHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &1.1 (OHCI) 控制器</translation>
</message>
<message>
<source>USB &2.0 (EHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &2.0 (EHCI) 控制器</translation>
</message>
<message>
<source>When checked, enables the virtual USB xHCI controller of this machine. The USB xHCI controller provides USB 3.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>选中时,在该虚拟电脑上启用 USB xHCI 控制器。该控制器将提供 USB 3.0支持.</translation>
</message>
<message>
<source>USB &3.0 (xHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB &3.0 (xHCI) 控制器</translation>
+ </message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation>本虚拟机当前已启用 USB 2.0/3.0。然而,这需要安装 <i>%1</i>。请从 VirtualBox 下载站中安装“扩展增强包”。或者禁用 USB 2.0/3.0 以便启动虚拟电脑。</translation>
</message>
</context>
<context>
@@ -5727,7 +6077,7 @@
</message>
<message>
<source>Removing medium...</source>
- <translation type="unfinished"></translation>
+ <translation>移除介质...</translation>
</message>
</context>
<context>
@@ -5749,15 +6099,23 @@
<name>UIMenuBarEditorWidget</name>
<message>
<source>Virtual Screen Resize</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟显示屏改变大小</translation>
</message>
<message>
<source>Virtual Screen Mapping</source>
- <translation type="unfinished"></translation>
+ <translation>虚拟显示屏映射</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">关闭</translation>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Switch</source>
+ <translation>切换</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation>启用菜单栏</translation>
</message>
</context>
<context>
@@ -5802,7 +6160,7 @@
</message>
<message>
<source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>创建 COM 对象失败.</p><p>应用程序将被中断.</p></translation>
+ <translation type="obsolete"><p>创建 COM 对象失败.</p><p>应用程序将被中断.</p></translation>
</message>
<message>
<source>Failed to set global VirtualBox properties.</source>
@@ -6167,7 +6525,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>VirtualBox 新版本已发布!版本 <b>%1</b> 可在此了解 <a href="http://www.virtualbox.org/">virtualbox.org</a>。</p><p>您可以使用此链接下载该版本:</p><p><a href=%2>%3</a></p></translation>
+ <translation type="obsolete"><p>VirtualBox 新版本已发布!版本 <b>%1</b> 可在此了解 <a href="http://www.virtualbox.org/">virtualbox.org</a>。</p><p>您可以使用此链接下载该版本:</p><p><a href=%2>%3</a></p></translation>
</message>
<message>
<source><p>Are you sure you want to release the %1 <nobr><b>%2</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%3</b>.</p></source>
@@ -6243,11 +6601,11 @@
</message>
<message>
<source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>有一个或多个虚拟硬盘、光盘或软盘当前无法访问.。因此,你可能无法打开那些要使用这些介质的虚拟电脑直到它可以再次访问为止.</p><p>按 <b>检测</b> 打开虚拟介质管理器可以查看那些无法访问的介质,或按 <b>忽略</b> 忽略这个提示.</p></translation>
+ <translation type="obsolete"><p>有一个或多个虚拟硬盘、光盘或软盘当前无法访问.。因此,你可能无法打开那些要使用这些介质的虚拟电脑直到它可以再次访问为止.</p><p>按 <b>检测</b> 打开虚拟介质管理器可以查看那些无法访问的介质,或按 <b>忽略</b> 忽略这个提示.</p></translation>
</message>
<message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>虚拟电脑在运行中发生一个严重错误,现在将被关闭.</p><p>请联系您的供应商. 并提供日志文件 <tt>VBox.log</tt> 和映像文件 <tt>VBox.png</tt>, 它们位于 <nobr><b>%1</b></nobr> 文件夹, 同时就该错误是如何发生的提供一份详细说明. </p><p>按<b>确定</b> 如果您想关闭该虚拟电脑,或者按 <b>忽略</b> 如果您想调试它. 请注意调试需要专业的知识和工具, 因此建议您按 <b>确定</b> .</p></translation>
+ <translation type="obsolete"><p>虚拟电脑在运行中发生一个严重错误,现在将被关闭.</p><p>请联系您的供应商. 并提供日志文件 <tt>VBox.log</tt> 和映像文件 <tt>VBox.png</tt>, 它们位于 <nobr><b>%1</b></nobr> 文件夹, 同时就该错误是如何发生的提供一份详细说明. </p><p>按<b>确定</b> 如果您想关闭该虚拟电脑,或者按 <b>忽略</b> 如果您想调试它. 请注意调试需要专业的知识和工具, 因此建议您按 <b>确定</b> .</p></translation>
</message>
<message>
<source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
@@ -6429,7 +6787,7 @@
</message>
<message>
<source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>您确定要删除光驱?</p><p>您将无法使用任何光盘或虚拟光盘以及存放增强功能包的虚拟光盘!</p></translation>
+ <translation type="obsolete"><p>您确定要删除光驱?</p><p>您将无法使用任何光盘或虚拟光盘以及存放增强功能包的虚拟光盘!</p></translation>
</message>
<message>
<source>&Remove</source>
@@ -6533,7 +6891,7 @@
</message>
<message>
<source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>您将要添加新光驱到控制器 <b>%1</b>。</p><p>您是否要选择一个虚拟光盘来放入驱动器,或将其现在留空?</p></translation>
+ <translation type="obsolete"><p>您将要添加新光驱到控制器 <b>%1</b>。</p><p>您是否要选择一个虚拟光盘来放入驱动器,或将其现在留空?</p></translation>
</message>
<message>
<source>&Choose disk</source>
@@ -6555,11 +6913,11 @@
</message>
<message>
<source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 分离光驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
+ <translation type="obsolete">从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 分离光驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
</message>
<message>
<source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 分离软驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
+ <translation type="obsolete">从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 分离软驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
@@ -6598,11 +6956,11 @@
</message>
<message>
<source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 附加光驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
+ <translation type="obsolete">从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 附加光驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
</message>
<message>
<source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 附加软驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
+ <translation type="obsolete">从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 附加软驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
</message>
<message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
@@ -6712,7 +7070,7 @@
</message>
<message>
<source>Create a snapshot of the current machine state</source>
- <translation>创建当前虚拟机状态的备份</translation>
+ <translation>创建当前虚拟机状态的备份[系统快照]</translation>
</message>
<message>
<source><p>Are you sure you want to restore snapshot <b>%1</b>?</p></source>
@@ -6852,7 +7210,7 @@
</message>
<message>
<source>Failed to drop data.</source>
- <translation>未能丢弃数据。</translation>
+ <translation type="obsolete">未能丢弃数据。</translation>
</message>
<message>
<source><p>Could not find the VirtualBox Guest Additions disk image file file.</nobr></p><p>Do you wish to download this disk image file from the Internet?</p></source>
@@ -6913,247 +7271,337 @@
</message>
<message>
<source><p>Cannot start the VirtualBox Manager due to local restrictions.</p><p>The application will now terminate.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>由于本地限制,虚拟电脑控制台不能启动.</p><p>程序将被中断。</p></translation>
</message>
<message>
<source><p>Could not find a language file for the language <b>%1</b> in the directory <b><nobr>%2</nobr></b>.</p><p>The language will be temporarily reset to the system default language. Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>在文件夹 <b><nobr>%2</nobr></b>中找不到 <b>%1</b> 所对应的语言文件包.</p><p>界面语言将被临时重置为系统默认语言.请到 <b>全局设定</b> 对话框中 指定可用语言.</p></translation>
</message>
<message>
<source><p>Could not load the language file <b><nobr>%1</nobr></b>. <p>The language will be temporarily reset to English (built-in). Please go to the <b>Preferences</b> window which you can open from the <b>File</b> menu of the VirtualBox Manager window, and select one of the existing languages on the <b>Language</b> page.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>不能加载 <b><nobr>%1</nobr></b>语言包. <p>界面语言将被重置为英文 (内嵌). 请到 <b>全局设定</b> 对话框中指定可用语言.</p></translation>
</message>
<message>
<source>There is no virtual machine with the identifier <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>找不到名称为 <b>%1</b> 的虚拟电脑.</translation>
</message>
<message>
<source>Ignore</source>
- <translation type="unfinished">忽略</translation>
+ <translation>忽略</translation>
</message>
<message>
<source>Failed to create NAT network.</source>
- <translation type="unfinished"></translation>
+ <translation>创建NAT网络失败.</translation>
</message>
<message>
<source>Failed to remove NAT network <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>不能删除NAT网络 <b>%1</b>.</translation>
</message>
<message>
<source>Failed to create DHCP server.</source>
- <translation type="unfinished"></translation>
+ <translation>创建DHCP服务器失败.</translation>
</message>
<message>
<source>Failed to remove DHCP server for network interface <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>未能删除网卡<b>%1</b>的DHCp服务器.</translation>
</message>
<message>
<source>Failed to create the host network interface.</source>
- <translation type="unfinished"></translation>
+ <translation>未能创建主机网络连接.</translation>
</message>
<message>
<source>Create &new disk</source>
- <translation type="unfinished">创建新的虚拟盘(&N)</translation>
+ <translation>创建新的虚拟盘(&N)</translation>
</message>
<message>
<source>&Choose existing disk</source>
- <translation type="unfinished">使用现有的虚拟盘(&C)</translation>
+ <translation>使用现有的虚拟盘(&C)</translation>
</message>
<message>
<source>Leave &empty</source>
- <translation type="unfinished">留空(&E)</translation>
+ <translation>留空(&E)</translation>
</message>
<message>
<source>&Choose disk</source>
- <translation type="unfinished">选择磁盘(&C)</translation>
+ <translation>选择磁盘(&C)</translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual hard disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否确定要释放虚拟硬盘 <nobr><b>%1</b></nobr>?</p><p>这会从下列虚拟电脑中解除绑定: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual optical disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否确定要释放虚拟光盘 <nobr><b>%1</b></nobr>?</p><p>这会从下列虚拟电脑中解除绑定: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to release the virtual floppy disk <nobr><b>%1</b></nobr>?</p><p>This will detach it from the following virtual machine(s): <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否确定要释放虚拟软盘 <nobr><b>%1</b></nobr>?</p><p>这会从下列虚拟电脑中解除绑定: <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual hard disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否确定要从当前可用介质列表中删除虚拟硬盘 <nobr><b>%1</b></nobr>?</p></translation>
</message>
<message>
<source><p>As this hard disk is inaccessible its image file can not be deleted.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>请注意:该虚拟硬盘现在已无法访问,因此不能被删除.</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual optical disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否确定要从当前可用介质列表中删除虚拟光盘 <nobr><b>%1</b></nobr>?</p></translation>
</message>
<message>
<source><p>Are you sure you want to remove the virtual floppy disk <nobr><b>%1</b></nobr> from the list of known disk image files?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否确定要从当前可用介质列表中删除虚拟软盘 <nobr><b>%1</b></nobr>?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>未能加载虚拟光盘 <nobr><b>%1</b></nobr> 到虚拟电脑 <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Would you like to try to force insertion of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否要强制挂载该介质?</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual optical disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>未能从虚拟电脑 <b>%2</b>弹出虚拟光盘 <nobr><b>%1</b></nobr> .</p></translation>
</message>
<message>
<source><p>Would you like to try to force ejection of this disk?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否要强制卸载该介质?</p></translation>
</message>
<message>
<source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>未能加载虚拟软盘 <nobr><b>%1</b></nobr> 到虚拟电脑 <b>%2</b>.</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>未能从虚拟电脑 <b>%2</b>弹出虚拟软盘 <nobr><b>%1</b></nobr> .</p></translation>
</message>
<message>
<source>Failed to open the hard disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>打开硬盘文件<nobr><b>%1</b></nobr> 失败.</translation>
</message>
<message>
<source>Failed to open the optical disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>打开光盘文件<nobr><b>%1</b></nobr> 失败.</translation>
</message>
<message>
<source>Failed to open the floppy disk file <nobr><b>%1</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>打开软盘文件<nobr><b>%1</b></nobr> 失败.</translation>
</message>
<message>
<source>Failed to close the hard disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>关闭硬盘文件<nobr><b>%2</b></nobr> 失败.</translation>
</message>
<message>
<source>Failed to close the optical disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>关闭光盘文件<nobr><b>%2</b></nobr> 失败.</translation>
</message>
<message>
<source>Failed to close the floppy disk file <nobr><b>%2</b></nobr>.</source>
- <translation type="unfinished"></translation>
+ <translation>关闭软盘文件<nobr><b>%2</b></nobr> 失败.</translation>
</message>
<message numerus="yes">
<source><p>The %n following virtual machine(s) are currently in a saved state: <b>%1</b></p><p>If you continue the runtime state of the exported machine(s) will be discarded. The other machine(s) will not be changed.</p></source>
<comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many machines are in the list and doesn't need to be told).</comment>
- <translation type="unfinished">
+ <translation>
<numerusform><p>虚拟机 <b>%1</b> 当前处于保存状态。</p><p>如果您继续,将放弃已导出虚拟机的运行时状态。注意,现有的虚拟机不会更改。</p></numerusform>
</translation>
</message>
<message>
<source>Switch</source>
- <translation type="unfinished">切换</translation>
+ <translation>切换</translation>
</message>
<message>
<source>Failed to enable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>为虚拟电脑 <b>%1</b> 启用远程桌面服务器失败.</translation>
</message>
<message>
<source>Failed to disable the remote desktop server for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>为虚拟电脑 <b>%1</b> 禁用远程桌面服务器失败.</translation>
</message>
<message>
<source>Failed to enable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>为虚拟电脑 <b>%1</b> 启用录像失败.</translation>
</message>
<message>
<source>Failed to disable video capturing for the virtual machine <b>%1</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>为虚拟电脑 <b>%1</b> 禁用录像失败.</translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox Guest Additions</b> disk image file.</p><p>Do you wish to download this disk image file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>找不到增强功能包的虚拟光盘。</nobr></p><p>是否要从互联网上下载?</p></translation>
</message>
<message>
<source>Download</source>
- <translation type="unfinished">下载</translation>
+ <translation>下载</translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox Guest Additions</b> disk image file from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您确认要从 <nobr><a href="%1">%1</a></nobr>下载增强功能包 (大小 %2 字节)?</p></translation>
</message>
<message>
<source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>VirtualBox 用户手册已成功从 <nobr><a href="%1">%1</a></nobr> 下载,但未能在本地保存为 <nobr><b>%2</b></nobr>。</p><p>请为文件选择另一个位置。</p></translation>
</message>
<message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>无法找到 VirtualBox 用户手册 <nobr><b>%1</b></nobr>。</p><p>您是否要从网上下载该文件?</p></translation>
</message>
<message>
<source><p>Are you sure you want to download the <b>VirtualBox User Manual</b> from <nobr><a href="%1">%1</a></nobr> (size %2 bytes)?</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>您是否真要从 <nobr><a href="%1">%1</a></nobr> 下载 VirtualBox 用户手册(大小为 %2 字节)?</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> but can't be saved locally as <nobr><b>%2</b>.</nobr></p><p>Please choose another location for that file.</p></source>
- <translation type="unfinished"><p>VirtualBox 用户手册已成功从 <nobr><a href="%1">%2</a></nobr> 下载,但未能在本地保存为 <nobr><b>%3</b></nobr>。</p><p>请为文件选择另一个位置。</p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>VirtualBox 用户手册已成功从 <nobr><a href="%1">%1</a></nobr> 下载,但未能在本地保存为 <nobr><b>%2</b></nobr>。</p><p>请为文件选择另一个位置。</p></translation>
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
- <translation type="unfinished"><p>VirtualBox 用户手册已成功从 <nobr><a href="%1">%2</a></nobr> 下载,已保存为 <nobr><b>%3</b></nobr>。</p> {1"?} {1<?} {2<?}</translation>
+ <translation><p>VirtualBox 用户手册已成功从 <nobr><a href="%1">%1</a></nobr> 下载,已保存为 <nobr><b>%2</b></nobr>。</p></translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">关闭</translation>
+ <translation>关闭</translation>
</message>
<message>
<source>Ok</source>
- <translation type="unfinished">确定</translation>
+ <translation>确定</translation>
</message>
<message>
<source>Do not show this message again</source>
- <translation type="unfinished">不要再显示这个信息</translation>
+ <translation>不要再显示这个信息</translation>
</message>
<message>
<source><p>Do you want to remove the NAT network <nobr><b>%1</b>?</nobr></p><p>If this network is in use by one or more virtual machine network adapters these adapters will no longer be usable until you correct their settings by either choosing a different network name or a different adapter attachment type.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>是否删除NAT网络 <nobr><b>%1</b>?</nobr></p><p>相关的网卡需要重新设置才可使用。</p></translation>
</message>
<message>
<source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>不能分配摄像头 <b>%1</b> 到虚拟电脑 <b>%2</b>.</translation>
</message>
<message>
<source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>不能将 摄像头 <b>%1</b> 从虚拟电脑 <b>%2</b> 中释放.</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"></translation>
+ <translation><p>VirtualBox功能增强包似乎在该虚拟机中不可用,没有它们,共享文件夹将无法使用。要在虚拟机内部使用共享文件夹,未安装功能增强包的话请安装,如果已安装而无法正常工作,请重新安装,要安装请从<b>设备</b>菜单中选择<b>安装功能增强</b>。如果已安装而虚拟机尚未完全启动,那么一旦启动完毕,共享文件夹将变为可用。</p></translation>
</message>
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished"></translation>
+ <translation>载入</translation>
</message>
<message>
<source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>虚拟显示屏目前设置为 <b>%1 位</b>颜色模式。 需要更好显示效果请切换至 <b>%2 位</b>。 通常可在虚拟电脑中操作系统的控制面板或系统设置的 <b>显示</b> 部分设定。</p></translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Rule names should be unique.</source>
- <translation type="unfinished"></translation>
+ <translation>当前端口转发规则无效。规则名称应唯一。</translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
- <translation type="unfinished"></translation>
+ <translation>当前端口转发规则无效。一些规则用相同的主机端口且IP地址冲突。</translation>
+ </message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation><p>创建 VirtualBoxClient COM 对象失败.</p><p>应用程序将被中断.</p></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translatorcomment>todo</translatorcomment>
+ <translation>为全局 VirtualBox 外部数据中的键 <i>%1</i> 赋值 <i>{%2}</i> 失败.</translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation>为虚拟电脑 <i>%2</i> 外部数据中的键 <i>%1</i> 赋值 <i>{%2}</i> 失败.</translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation><p>有一个或多个虚拟硬盘、光盘或软盘当前无法访问.。因此,你可能无法打开那些要使用这些介质的虚拟电脑直到它可以再次访问为止.</p><p>按 <b>检测</b> 打开虚拟介质管理器可以查看那些无法访问的介质,或按 <b>忽略</b> 忽略这个提示.</p></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation>保存设置失败.</translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation><p>您将要添加新光驱到控制器 <b>%1</b>。</p><p>您是否要选择一个虚拟光盘来放入驱动器,或将其现在留空?</p></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation><p>您确定要删除光驱?</p><p>您将无法使用任何光盘或虚拟光盘以及存放增强功能包的虚拟光盘!</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 附加光驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 附加软驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 分离光驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>从虚拟机 <b>%3</b> 的插槽 <i>%2</i> 分离软驱 (<nobr><b>%1</b></nobr>) 失败。</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this er [...]
+ <translation type="obsolete"><p>运行虚拟电脑时发生严重错误, 应将其关闭.</p><p>要获取帮助, 请查看社区内容 <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> 或咨询你的支持部门. 请提供日志文件 <tt>VBox.log</tt>, 位于虚拟电脑的log文件夹中, 并描述出错时的操作. 注意: 也可从管理器的主菜单 <b>控制</b> 中选择 <b>日志</b>.</p><p>点击 <b>确定</b> 关闭虚拟电脑.</p></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>为虚拟电脑 <b>%1</b> 连接网线失败.</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>为虚拟电脑 <b>%1</b> 断开网线失败.</translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation><p>无法分配存放增强功能包的虚拟光盘到虚拟电脑 <b>%1</b>, 因为该虚拟电脑没有光驱. 请先到虚拟电脑设置对话框的存储页中添加一个光驱.</p></translation>
+ </message>
+ <message>
+ <source>Unable to enter password!</source>
+ <translation type="obsolete">未能输入密码!</translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation><p>增强功能包虚拟光盘已从 <nobr><a href="%1">%1</a></nobr>成功下载并保存在 <nobr><b>%2</b>.</nobr></p><p>您是否要注册该虚拟光盘并把它立即挂载到该虚拟电脑上?</p></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation failed.</source>
+ <translation>拖放操作失败。</translation>
+ </message>
+ <message>
+ <source>Failed while dropping data.</source>
+ <translation>拖放数据失败。</translation>
+ </message>
+ <message>
+ <source>Unable to cancel drag and drop operation.</source>
+ <translation>未能取消拖放操作。</translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation>密码错误或验证失败。</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translatorcomment>todo</translatorcomment>
+ <translation><p>运行虚拟电脑时发生严重错误, 应将其关闭.</p><p>要获取帮助, 请查看社区内容 <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> 或咨询你的支持部门. 请提供日志文件 <tt>VBox.log</tt>和图像文件 <tt>VBox.png</tt>, 位于 <nobr><b>%1</b></nobr> 文件夹中, 并描述出错时的操作. 注意: 也可从管理器的主菜单 <b>控制</b> 中选择 <b>日志</b>.</p><p>点击 <b>确定</b> 关闭虚拟电脑.如果你想调试它. 请注意调试需要专业的知识和工具, 因此建议你按 <b>确定</b> .</p> [...]
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation><p>运行虚拟电脑时发生严重错误, 应将其关闭.</p><p>要获取帮助, 请查看社区内容 <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> 或咨询你的支持部门. 请提供日志文件 <tt>VBox.log</tt>, 位于虚拟电脑的log文件夹中, 并描述出错时的操作. 注意: 也可从管理器的主菜单 <b>控制</b> 中选择 <b>日志</b>.</p><p>点击 <b>确定</b> 关闭虚拟电脑.</p></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation><p>VirtualBox 新版本已发布!版本 <b>%1</b> 可在此了解 <a href="http://www.virtualbox.org/">virtualbox.org</a>。</p><p>您可以使用此链接下载该版本:</p><p><a href=%2>%3</a></p></translation>
</message>
</context>
<context>
@@ -7197,19 +7645,19 @@
<name>UIMiniToolBar</name>
<message>
<source>Always show the toolbar</source>
- <translation type="unfinished">总是显示小工具栏</translation>
+ <translation>总是显示小工具栏</translation>
</message>
<message>
<source>Minimize Window</source>
- <translation type="unfinished">窗口最小化</translation>
+ <translation>窗口最小化</translation>
</message>
<message>
<source>Exit Full Screen or Seamless Mode</source>
- <translation type="unfinished">退出全屏或无缝模式</translation>
+ <translation>退出全屏或无缝模式</translation>
</message>
<message>
<source>Close VM</source>
- <translation type="unfinished">关闭虚拟电脑</translation>
+ <translation>关闭虚拟电脑</translation>
</message>
</context>
<context>
@@ -7287,7 +7735,7 @@
</message>
<message>
<source>The network operation failed with the following error: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>网络操作出错: %1.</translation>
</message>
</context>
<context>
@@ -7314,27 +7762,27 @@
<name>UINetworkReplyPrivate</name>
<message>
<source>Host not found</source>
- <translation type="unfinished"></translation>
+ <translation>未找到主机</translation>
</message>
<message>
<source>Content access denied</source>
- <translation type="unfinished"></translation>
+ <translation>内容访问被拒绝</translation>
</message>
<message>
<source>Protocol failure</source>
- <translation type="unfinished"></translation>
+ <translation>协议失效</translation>
</message>
<message>
<source>Wrong SSL certificate format</source>
- <translation type="unfinished"></translation>
+ <translation>错误的SSL证书格式</translation>
</message>
<message>
<source>SSL authentication failed</source>
- <translation type="unfinished"></translation>
+ <translation>SSL认证失败</translation>
</message>
<message>
<source>Unknown reason</source>
- <translation type="unfinished"></translation>
+ <translation>未知原因</translation>
</message>
</context>
<context>
@@ -7687,7 +8135,7 @@
<name>UIPopupCenter</name>
<message>
<source>Click for full details</source>
- <translation type="unfinished"></translation>
+ <translation>点击查看详情</translation>
</message>
</context>
<context>
@@ -7766,13 +8214,17 @@
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>欢迎使用虚拟电脑控制台!</h3><p>窗口的左边用来显示已生成的虚拟电脑. 现在是空的,因为你还没有新建任何虚拟电脑.<img src=:/welcome.png align=right/></p><p>要新建一个虚拟电脑, 请按位于窗口顶部工具栏上的 <b>新建</b> 按钮。</p><p>你可以按 <b>%1</b> 键来查看帮助,或访问 <a href=http://www.virtualbox.org>www.virtualbox.org</a> 查看最新信息和新闻.</p></translation>
+ <translation type="obsolete"><h3>欢迎使用虚拟电脑控制台!</h3><p>窗口的左边用来显示已生成的虚拟电脑. 现在是空的,因为你还没有新建任何虚拟电脑.<img src=:/welcome.png align=right/></p><p>要新建一个虚拟电脑, 请按位于窗口顶部工具栏上的 <b>新建</b> 按钮。</p><p>你可以按 <b>%1</b> 键来查看帮助,或访问 <a href=http://www.virtualbox.org>www.virtualbox.org</a> 查看最新信息和新闻.</p></translation>
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>管理器</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation><h3>欢迎使用虚拟电脑控制台!</h3><p>窗口的左边用来显示已生成的虚拟电脑. 现在是空的,因为你还没有新建任何虚拟电脑.<img src=:/welcome.png align=right/></p><p>要新建一个虚拟电脑, 请按位于窗口顶部工具栏上的 <b>新建</b> 按钮。</p><p>你可以按 <b>%1</b> 键来查看帮助,或访问 <a href=http://www.virtualbox.org>www.virtualbox.org</a> 查看最新信息和新闻.</p></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -7805,15 +8257,15 @@
</message>
<message>
<source>Settings</source>
- <translation>设置</translation>
+ <translation type="obsolete">设置</translation>
</message>
<message>
<source><b>%1</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation><b>%1</b> 页:</translation>
</message>
<message>
<source><b>%1: %2</b> page:</source>
- <translation type="unfinished"></translation>
+ <translation><b>%1: %2</b> 页:</translation>
</message>
</context>
<context>
@@ -7858,6 +8310,10 @@
<source>Display</source>
<translation>显示</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation>全局设定</translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -7909,19 +8365,42 @@
<source>%1 - %2</source>
<translation>%1 - %2</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation>用户界面</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation>设置</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation>载入设置...</translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation>保存设置...</translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
<message>
<source><nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>点击</b> 切换状态.</nobr><br><nobr><b>拖放</b> 更改位置.</nobr></translation>
</message>
</context>
<context>
<name>UIStatusBarEditorWidget</name>
<message>
<source>Close</source>
- <translation type="unfinished">关闭</translation>
+ <translation>关闭</translation>
+ </message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation>显示状态栏</translation>
</message>
</context>
<context>
@@ -8049,11 +8528,11 @@
</message>
<message>
<source>&Continue running in the background</source>
- <translation type="unfinished"></translation>
+ <translation>继续在后台运行(&C)</translation>
</message>
<message>
<source><p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>关闭虚拟电脑窗口但保持其运行.</p><p>你可用管理器返回窗口状态.</p></translation>
</message>
</context>
<context>
@@ -8064,7 +8543,7 @@
</message>
<message>
<source>&Snapshots</source>
- <translation>备份(&S)</translation>
+ <translation>备份[系统快照](&S)</translation>
</message>
</context>
<context>
@@ -8162,19 +8641,23 @@
</message>
<message>
<source>Drag'n'Drop Mode</source>
- <translation>拖放模式</translation>
+ <translation type="obsolete">拖放模式</translation>
</message>
<message>
<source>Configuration &Details</source>
- <translation type="unfinished"></translation>
+ <translation>配置详情(&D)</translation>
</message>
<message>
<source>&Runtime Information</source>
- <translation type="unfinished"></translation>
+ <translation>运行状态(&R)</translation>
</message>
<message>
<source>VM Uptime</source>
- <translation type="unfinished"></translation>
+ <translation>运行时间</translation>
+ </message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation>拖放模式</translation>
</message>
</context>
<context>
@@ -8304,19 +8787,19 @@
</message>
<message>
<source>&Expert Mode</source>
- <translation type="unfinished"></translation>
+ <translation>专家模式(&E)</translation>
</message>
<message>
<source>Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users.</source>
- <translation type="unfinished"></translation>
+ <translation>切换到 <nobr><b>专家模式</b></nobr>, 适合有经验用户的单页对话框.</translation>
</message>
<message>
<source>&Guided Mode</source>
- <translation type="unfinished"></translation>
+ <translation>向导模式(&G)</translation>
</message>
<message>
<source>Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations.</source>
- <translation type="unfinished"></translation>
+ <translation>切换到 <nobr><b>向导模式</b></nobr>, 带详细提示的逐步对话框.</translation>
</message>
</context>
<context>
@@ -8651,39 +9134,39 @@
</message>
<message>
<source>Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>存储设置</translation>
</message>
<message>
<source>Please choose a file to export the virtual appliance to</source>
- <translation type="unfinished"></translation>
+ <translation>选择一个文件</translation>
</message>
<message>
<source>F&ormat:</source>
- <translation type="unfinished"></translation>
+ <translation>格式(&o):</translation>
</message>
<message>
<source>OVF 0.9</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 0.9</translation>
</message>
<message>
<source>OVF 1.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 1.0</translation>
</message>
<message>
<source>OVF 2.0</source>
- <translation type="unfinished"></translation>
+ <translation>OVF 2.0</translation>
</message>
<message>
<source>Write in standard OVF 1.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>用标准的 OVF 1.0 格式写入.</translation>
</message>
<message>
<source>Write in new experimental OVF 2.0 format.</source>
- <translation type="unfinished"></translation>
+ <translation>用试验版 OVF 2.0 格式写入.</translation>
</message>
<message>
<source>&Storage settings</source>
- <translation type="unfinished"></translation>
+ <translation>存储设置(&S)</translation>
</message>
</context>
<context>
@@ -8702,14 +9185,14 @@
</message>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>选择一个文件...</translation>
</message>
</context>
<context>
<name>UIWizardExportAppPageExpert</name>
<message>
<source>Choose a file to export the virtual appliance to...</source>
- <translation type="unfinished"></translation>
+ <translation>选择一个文件...</translation>
</message>
</context>
<context>
@@ -8779,15 +9262,15 @@
</message>
<message>
<source>Import Virtual Appliance</source>
- <translation type="unfinished"></translation>
+ <translation>导入虚拟电脑</translation>
</message>
<message>
<source>Choose a virtual appliance file to import...</source>
- <translation type="unfinished"></translation>
+ <translation>选择一个文件...</translation>
</message>
<message>
<source>Please choose a virtual appliance file to import</source>
- <translation type="unfinished"></translation>
+ <translation>选择一个虚拟电脑文件导入</translation>
</message>
</context>
<context>
@@ -8985,7 +9468,7 @@
</message>
<message>
<source>Choose...</source>
- <translation type="unfinished"></translation>
+ <translation>选择...</translation>
</message>
</context>
<context>
@@ -9044,7 +9527,7 @@
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished"></translation>
+ <translation>当保存变化后再打开本对话框时,将显示新的默认路径.</translation>
</message>
</context>
<context>
@@ -9232,7 +9715,7 @@
<message>
<source>CD/DVD</source>
<comment>DeviceType</comment>
- <translation>光驱</translation>
+ <translation type="obsolete">光驱</translation>
</message>
<message>
<source>Hard Disk</source>
@@ -9924,18 +10407,18 @@
<message>
<source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
<comment>medium</comment>
- <translation>分配此硬盘将间接使用最近创建的备份硬盘。</translation>
+ <translation type="obsolete">分配此硬盘将间接使用最近创建的备份硬盘。</translation>
</message>
<message>
<source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
<comment>medium</comment>
- <translation>该硬盘链中的某些介质不可访问。请使用<b>显示备份硬盘</b>模式中的“虚拟机介质管理器”来检查这些介质。</translation>
+ <translation type="obsolete">该硬盘链中的某些介质不可访问。请使用<b>显示备份硬盘</b>模式中的“虚拟机介质管理器”来检查这些介质。</translation>
</message>
<message>
<source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
<comment>medium</comment>
<translatorcomment>TODO</translatorcomment>
- <translation>该基本硬盘是使用以下备份硬盘间接分配的:</translation>
+ <translation type="obsolete">该基本硬盘是使用以下备份硬盘间接分配的:</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -9975,7 +10458,7 @@
</message>
<message>
<source>(CD/DVD)</source>
- <translation>(光驱)</translation>
+ <translation type="obsolete">(光驱)</translation>
</message>
<message>
<source>Screens</source>
@@ -10520,112 +11003,198 @@
<translation>请选择虚拟硬盘文件保存的位置</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>不受限执行</translation>
</message>
<message>
<source>PS/2 Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>PS/2 鼠标</translation>
</message>
<message>
<source>USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>USB鼠标</translation>
</message>
<message>
<source>PS/2 and USB Mouse</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>PS/2和USB鼠标</translation>
</message>
<message>
<source>Unrestricted Execution</source>
- <translation type="unfinished"></translation>
+ <translation>不受限执行</translation>
</message>
<message>
<source>USB Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>USB平板</translation>
</message>
<message>
<source>USB Multi-Touch Tablet</source>
<comment>PointingHIDType</comment>
- <translation type="unfinished"></translation>
+ <translation>USB多点触摸平板</translation>
</message>
<message>
<source>NAT Network</source>
<comment>NetworkAttachmentType</comment>
- <translation type="unfinished"></translation>
+ <translation>NAT 网络</translation>
</message>
<message>
<source>NAT network, '%1'</source>
<comment>details report (network)</comment>
- <translation type="unfinished"></translation>
+ <translation>NAT 网络, '%1'</translation>
</message>
<message>
<source>You can create or add disk image files in the virtual machine settings.</source>
- <translation type="unfinished"></translation>
+ <translation>您也可以通过虚拟介质管理器来创建或添加虚拟介质.</translation>
</message>
<message>
<source>USB</source>
<comment>StorageControllerType</comment>
- <translation type="unfinished"></translation>
+ <translation>USB</translation>
</message>
<message>
<source>USB Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished"></translation>
+ <translation>USB 端口 %1</translation>
</message>
<message>
<source>off</source>
<comment>guest monitor status</comment>
- <translation type="unfinished"></translation>
+ <translation>关闭</translation>
</message>
<message>
<source>Paravirtualization Interface</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>半虚拟化接口</translation>
</message>
<message>
<source>None</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished">空</translation>
+ <translation>空</translation>
</message>
<message>
<source>Default</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished">默认</translation>
+ <translation>默认</translation>
</message>
<message>
<source>Legacy</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>旧的</translation>
</message>
<message>
<source>Minimal</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>最少</translation>
</message>
<message>
<source>Hyper-V</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V</translation>
</message>
<message>
<source>New dynamically allocated storage</source>
<comment>MediumVariant</comment>
- <translation type="unfinished"></translation>
+ <translation>新建动态分配存储</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>活动</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>不活动</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>活动</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>不活动</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>活动</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>不活动</translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>生成备份</translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translatorcomment>todo</translatorcomment>
+ <translation>正在生成当前运行状态的备份</translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation>KVM</translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translatorcomment>todo</translatorcomment>
+ <translation>光驱</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>OHCI</translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>EHCI</translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>xHCI</translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation>用户界面</translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation>(光驱)</translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation>分配此硬盘将间接使用最近创建的备份硬盘。</translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation>该硬盘链中的某些介质不可访问。请使用“虚拟机介质管理器”来检查这些介质。</translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation>该基本硬盘是使用以下备份硬盘间接分配的:</translation>
</message>
</context>
<context>
@@ -10872,6 +11441,10 @@
<source>Create a new virtual hard drive</source>
<translation type="obsolete">创建一个新的虚拟硬盘</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation>UUID:</translation>
+ </message>
</context>
<context>
<name>VBoxMiniToolBar</name>
@@ -10915,15 +11488,15 @@
<name>VBoxScreenshotViewer</name>
<message>
<source>Screenshot of %1 (%2)</source>
- <translation>屏幕快照 %1 (%2)</translation>
+ <translation>屏幕截图 %1 (%2)</translation>
</message>
<message>
<source>Click to view non-scaled screenshot.</source>
- <translation>单击查看未缩放的快照。</translation>
+ <translation>单击查看未缩放的屏幕截图。</translation>
</message>
<message>
<source>Click to view scaled screenshot.</source>
- <translation>单击查看缩放的快照。</translation>
+ <translation>单击查看缩放的屏幕截图。</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
index 8fcff3c..cfb172c 100644
--- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="zh_TW">
+<TS version="2.0" language="zh_TW" sourcelanguage="en">
<context>
<name>@@@</name>
<message>
@@ -87,10 +87,6 @@
<source>The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall the kernel module by executing<br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup'</font><br/><br/>as root. If it is available in your distribution, you should install the DKMS package first. This package keeps track of Linux kernel changes and recompiles the vboxdrv kernel module if necess [...]
<translation>未載入 VirtualBox Linux 核心驅動程式 (vboxdrv) 或是 /dev/vboxdrv 的權限問題。 請以 root 執行 <br/><br/> <font color=blue>'/etc/init.d/vboxdrv setup' 來重新安裝核心模組。 如果在您的發行中可以使用,您應先安裝 DKMS 套件。 這個套件保留 Linux 核心變更的追蹤並在需要時重新編譯 vboxdrv 核心模組。</translation>
</message>
- <message>
- <source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
- <translation type="obsolete">框架大小: %1x%2,畫面播放速率: %3fps,位元率: %4kbps</translation>
- </message>
</context>
<context>
<name>QIArrowSplitter</name>
@@ -175,34 +171,10 @@
<translation>調整視窗大小與位置以最適合客體顯示</translation>
</message>
<message>
- <source>Disable &Mouse Integration</source>
- <translation>停用滑鼠整合(&M)</translation>
- </message>
- <message>
- <source>Temporarily disable host mouse pointer integration</source>
- <translation>暫時停用主機滑鼠指標整合</translation>
- </message>
- <message>
- <source>&Insert Ctrl-Alt-Del</source>
- <translation>傳送 Ctrl-Alt-Del 鍵(&I)</translation>
- </message>
- <message>
- <source>Send the Ctrl-Alt-Del sequence to the virtual machine</source>
- <translation>傳送 Ctrl-Alt-Del 序列到虛擬機器</translation>
- </message>
- <message>
- <source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source>
- <translation>傳送 Ctrl-Alt-Backspace 序列到虛擬機器</translation>
- </message>
- <message>
<source>Take a snapshot of the virtual machine</source>
<translation>取得虛擬機器的快照</translation>
</message>
<message>
- <source>Show Session Information Dialog</source>
- <translation type="obsolete">顯示工作階段資訊視窗</translation>
- </message>
- <message>
<source>&Pause</source>
<translation>暫停(&P)</translation>
</message>
@@ -243,18 +215,6 @@
<translation>裝置(&D)</translation>
</message>
<message>
- <source>&CD/DVD Devices</source>
- <translation>CD/DVD 裝置(&C)</translation>
- </message>
- <message>
- <source>&Floppy Devices</source>
- <translation>軟碟裝置(&F)</translation>
- </message>
- <message>
- <source>&USB Devices</source>
- <translation>USB 裝置(&U)</translation>
- </message>
- <message>
<source>Change the settings of network adapters</source>
<translation>變更網路卡的設定值</translation>
</message>
@@ -263,14 +223,6 @@
<translation>建立或修改共用資料夾</translation>
</message>
<message>
- <source>&Install Guest Additions...</source>
- <translation type="obsolete">安裝 Guest Additions(&I)...</translation>
- </message>
- <message>
- <source>Mount the Guest Additions installation image</source>
- <translation type="obsolete">掛載 Guest Additions 安裝映像</translation>
- </message>
- <message>
<source>De&bug</source>
<translation>除錯(&B)</translation>
</message>
@@ -301,26 +253,10 @@
<translation>顯示應用程式圖示</translation>
</message>
<message>
- <source>Switch to &Fullscreen</source>
- <translation>切換為全螢幕(&F)</translation>
- </message>
- <message>
- <source>Switch between normal and fullscreen mode</source>
- <translation>在標準和全螢幕模式之間切換</translation>
- </message>
- <message>
- <source>Switch to Seam&less Mode</source>
- <translation>切換為無縫模式(&L)</translation>
- </message>
- <message>
<source>Switch between normal and seamless desktop integration mode</source>
<translation>在標準和無縫桌面整合模式之間切換</translation>
</message>
<message>
- <source>Switch to &Scaled Mode</source>
- <translation>切換為縮放模式(&S)</translation>
- </message>
- <message>
<source>Switch between normal and scaled mode</source>
<translation>在標準和縮放模式之間切換</translation>
</message>
@@ -389,10 +325,6 @@
<translation>取得虛擬機器的快照</translation>
</message>
<message>
- <source>Ins&ert Ctrl-Alt-Backspace</source>
- <translation>傳送 Ctrl-Alt-Backspace 鍵(&E)</translation>
- </message>
- <message>
<source>&File</source>
<comment>Mac OS X version</comment>
<translation>檔案(&F)</translation>
@@ -656,10 +588,6 @@
<translation>共用剪貼簿(&C)</translation>
</message>
<message>
- <source>Drag'n'Drop</source>
- <translation>拖放</translation>
- </message>
- <message>
<source>Save the machine state of the virtual machine</source>
<translation>啟用虛擬機器的機器狀態</translation>
</message>
@@ -700,133 +628,221 @@
<translation>組態視訊擷取設定</translation>
</message>
<message>
- <source>&Logging...</source>
- <comment>debug action</comment>
- <translation>記錄(&L)...</translation>
- </message>
- <message>
<source>Popup Menu</source>
<translation>Popup Menu</translation>
</message>
<message>
<source>Show Session Information Window</source>
- <translation type="unfinished"></translation>
+ <translation>顯示工作階段資訊視窗</translation>
</message>
<message>
<source>&Webcams</source>
- <translation type="unfinished"></translation>
+ <translation>Webcams(&W)</translation>
</message>
<message>
<source>&Insert Guest Additions CD image...</source>
- <translation type="unfinished"></translation>
+ <translation>插入 Guest Additions CD 映像(&I)...</translation>
</message>
<message>
<source>Insert the Guest Additions disk file into the virtual drive</source>
- <translation type="unfinished"></translation>
+ <translation>插入 Guest Additions 磁碟檔案到虛擬磁碟機</translation>
</message>
<message>
<source>&VirtualBox</source>
- <translation type="unfinished"></translation>
+ <translation>&VirtualBox</translation>
</message>
<message>
<source>&Menu Bar</source>
- <translation type="unfinished"></translation>
+ <translation>功能表列(&M)</translation>
</message>
<message>
<source>&Menu Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>功能表列設定(&M)...</translation>
</message>
<message>
<source>Opens window to configure menu-bar</source>
- <translation type="unfinished"></translation>
+ <translation>開啟視窗以組態功能表列</translation>
</message>
<message>
<source>Show Menu &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>顯示功能表列(&B)</translation>
</message>
<message>
<source>Toggle menu-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>切換此機器的功能表列可見性</translation>
</message>
<message>
<source>&Status Bar</source>
- <translation type="unfinished"></translation>
+ <translation>狀態列(&S)</translation>
</message>
<message>
<source>&Status Bar Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>狀態列設定(&S)...</translation>
</message>
<message>
<source>Opens window to configure status-bar</source>
- <translation type="unfinished"></translation>
+ <translation>開啟視窗以組態狀態列</translation>
</message>
<message>
<source>Show Status &Bar</source>
- <translation type="unfinished"></translation>
+ <translation>顯示狀態列(&B)</translation>
</message>
<message>
<source>Toggle status-bar visibility for this machine</source>
- <translation type="unfinished"></translation>
+ <translation>切換此機器的狀態列可見性</translation>
</message>
<message>
<source>&Input</source>
- <translation type="unfinished"></translation>
+ <translation>輸入(&I)</translation>
</message>
<message>
<source>&Keyboard</source>
- <translation type="unfinished"></translation>
+ <translation>鍵盤(&K)</translation>
</message>
<message>
<source>&Keyboard Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>鍵盤設定(&K)...</translation>
</message>
<message>
<source>Display the global settings window to configure shortcuts</source>
- <translation type="unfinished"></translation>
+ <translation>顯示全域設定視窗以組態快速鍵</translation>
</message>
<message>
<source>&Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>滑鼠(&M)</translation>
</message>
<message>
<source>&Hard Drives</source>
- <translation type="unfinished"></translation>
+ <translation>硬碟(&H)</translation>
</message>
<message>
<source>&Hard Drive Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>硬碟設定(&H)...</translation>
</message>
<message>
<source>Change the settings of hard drives</source>
- <translation type="unfinished"></translation>
+ <translation>變更硬碟設定</translation>
</message>
<message>
<source>Network</source>
- <translation type="unfinished">網路</translation>
+ <translation>網路</translation>
</message>
<message>
<source>&USB Settings...</source>
- <translation type="unfinished"></translation>
+ <translation>USB 設定(&U)...</translation>
</message>
<message>
<source>Change the settings of USB devices</source>
- <translation type="unfinished"></translation>
+ <translation>變更 USB 裝置的設定</translation>
</message>
<message>
<source>&Shared Folders</source>
- <translation type="unfinished"></translation>
+ <translation>共用資料夾(&S)</translation>
</message>
<message>
<source>Show &Log...</source>
<comment>debug action</comment>
- <translation type="unfinished">顯示日誌(&L)...</translation>
+ <translation>顯示日誌(&L)...</translation>
</message>
<message>
<source>E&xtra Data Manager...</source>
- <translation type="unfinished"></translation>
+ <translation>額外資料管理員(&X)...</translation>
</message>
<message>
<source>Display the Extra Data Manager window</source>
+ <translation>顯示額外資料管理員視窗</translation>
+ </message>
+ <message>
+ <source>&File</source>
+ <translation>檔案(&F)</translation>
+ </message>
+ <message>
+ <source>&Window</source>
+ <translation>視窗(&W)</translation>
+ </message>
+ <message>
+ <source>&Minimize</source>
+ <translation>最小化(&M)</translation>
+ </message>
+ <message>
+ <source>Minimize active machine-window</source>
+ <translation>最小化使用中機器視窗</translation>
+ </message>
+ <message>
+ <source>&Full-screen Mode</source>
+ <translation>全螢幕模式(&F)</translation>
+ </message>
+ <message>
+ <source>Switch between normal and full-screen mode</source>
+ <translation>在標準和全螢幕模式之間切換</translation>
+ </message>
+ <message>
+ <source>Seam&less Mode</source>
+ <translation>無縫模式(&L)</translation>
+ </message>
+ <message>
+ <source>S&caled Mode</source>
+ <translation>縮放模式(&C)</translation>
+ </message>
+ <message>
+ <source>S&cale Factor</source>
+ <translation>縮放係數(&C)</translation>
+ </message>
+ <message>
+ <source>&Insert %1</source>
+ <translation>插入 %1(&I)</translation>
+ </message>
+ <message>
+ <source>Send the %1 sequence to the virtual machine</source>
+ <translation>傳送 %1 序列到虛擬機器</translation>
+ </message>
+ <message>
+ <source>&Mouse Integration</source>
+ <translation>滑鼠整合(&M)</translation>
+ </message>
+ <message>
+ <source>Enable host mouse pointer integration</source>
+ <translation>啟用主機滑鼠指標整合</translation>
+ </message>
+ <message>
+ <source>&Optical Drives</source>
+ <translation>光碟機(&O)</translation>
+ </message>
+ <message>
+ <source>&Floppy Drives</source>
+ <translation>軟碟機(&F)</translation>
+ </message>
+ <message>
+ <source>&USB</source>
+ <translation>USB(&U)</translation>
+ </message>
+ <message>
+ <source>Drag and Drop</source>
+ <translation>拖放</translation>
+ </message>
+ <message>
+ <source>&Logging</source>
+ <comment>debug action</comment>
+ <translation>記錄(&L)</translation>
+ </message>
+ <message>
+ <source>&Normal Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Headless Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines in the background</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>&Detachable Start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Start the selected virtual machines with the option of continuing them in the background</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -835,19 +851,31 @@
<message>
<source>Enable</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>啟用</translation>
</message>
<message>
<source>Resize to %1x%2</source>
<comment>Virtual Screen</comment>
- <translation type="unfinished"></translation>
+ <translation>調整大小成 %1x%2</translation>
+ </message>
+ <message>
+ <source>%1%</source>
+ <comment>scale-factor</comment>
+ <translation>%1%</translation>
</message>
</context>
<context>
- <name>UIActonPool</name>
+ <name>UIAddDiskEncryptionPasswordDialog</name>
<message>
- <source>Popup Menu</source>
- <translation type="obsolete">Popup Menu</translation>
+ <source>%1 - Disk Encryption</source>
+ <translation>%1 - 磁碟加密</translation>
+ </message>
+ <message numerus="yes">
+ <source>This virtual machine is password protected. Please enter the %n encryption password(s) below.</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many passwords are in the list and doesn't need to be told).</comment>
+ <translation>
+ <numerusform>這個虛擬機器受到密碼保護。 請在下方輸入 %n 加密密碼。</numerusform>
+ </translation>
</message>
</context>
<context>
@@ -987,7 +1015,7 @@
<name>UIDnDDrag</name>
<message>
<source>Retrieving data ...</source>
- <translation type="unfinished"></translation>
+ <translation>正在檢索資料 ...</translation>
</message>
</context>
<context>
@@ -998,13 +1026,6 @@
</message>
</context>
<context>
- <name>UIDnDMimeData</name>
- <message>
- <source>Dropping data ...</source>
- <translation type="obsolete">正在拖放資料 ...</translation>
- </message>
-</context>
-<context>
<name>UIDownloader</name>
<message>
<source>Looking for %1...</source>
@@ -1049,6 +1070,31 @@
</message>
</context>
<context>
+ <name>UIEncryptionDataModel</name>
+ <message>
+ <source>Status</source>
+ <comment>password table field</comment>
+ <translation>狀態</translation>
+ </message>
+ <message>
+ <source>ID</source>
+ <comment>password table field</comment>
+ <translation>ID</translation>
+ </message>
+ <message>
+ <source>Password</source>
+ <comment>password table field</comment>
+ <translation>密碼</translation>
+ </message>
+ <message numerus="yes">
+ <source><nobr>Used by the following %n hard drive(s):</nobr><br>%1</source>
+ <comment>This text is never used with n == 0. Feel free to drop the %n where possible, we only included it because of problems with Qt Linguist (but the user can see how many hard drives are in the tool-tip and doesn't need to be told).</comment>
+ <translation>
+ <numerusform><nobr>由以下 %n 硬碟所使用:</nobr><br>%1</numerusform>
+ </translation>
+ </message>
+</context>
+<context>
<name>UIGChooserItemGroup</name>
<message>
<source><b>%1</b></source>
@@ -1178,11 +1224,6 @@
<translation>停用</translation>
</message>
<message>
- <source>[CD/DVD]</source>
- <comment>details (storage)</comment>
- <translation>[CD/DVD]</translation>
- </message>
- <message>
<source>Controller</source>
<comment>details (audio)</comment>
<translation>控制器</translation>
@@ -1270,7 +1311,7 @@
<message>
<source>Nested Paging</source>
<comment>details (system)</comment>
- <translation>Nested Paging</translation>
+ <translation>巢式分頁</translation>
</message>
<message>
<source>Video Memory</source>
@@ -1369,17 +1410,72 @@
</message>
<message>
<source>Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps</source>
- <translation>框架大小: %1x%2,畫面播放速率: %3fps,位元率: %4kbps</translation>
+ <translation>框架大小: %1x%2,畫面播放率: %3fps,位元率: %4kbps</translation>
</message>
<message>
<source>Minimal Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>最小半虛擬化</translation>
</message>
<message>
<source>Hyper-V Paravirtualization</source>
<comment>details (system)</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V 半虛擬化</translation>
+ </message>
+ <message>
+ <source>KVM Paravirtualization</source>
+ <comment>details (system)</comment>
+ <translation>KVM 半虛擬化</translation>
+ </message>
+ <message>
+ <source>[Optical Drive]</source>
+ <comment>details (storage)</comment>
+ <translation>[光碟機]</translation>
+ </message>
+ <message>
+ <source>USB Controller</source>
+ <comment>details (usb)</comment>
+ <translation>USB 控制器</translation>
+ </message>
+ <message>
+ <source>Scale-factor</source>
+ <comment>details (user interface)</comment>
+ <translation>縮放係數</translation>
+ </message>
+ <message>
+ <source>Unscaled HiDPI Video Output</source>
+ <comment>details (user interface)</comment>
+ <translation>不縮放的 HiDPI 視訊輸出</translation>
+ </message>
+ <message>
+ <source>Enabled</source>
+ <comment>details (user interface/Unscaled HiDPI Video Output)</comment>
+ <translation>啟用</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar Position</source>
+ <comment>details (user interface)</comment>
+ <translation>迷你工具列位置</translation>
+ </message>
+ <message>
+ <source>Top</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>頂端</translation>
+ </message>
+ <message>
+ <source>Bottom</source>
+ <comment>details (user interface/mini-toolbar position)</comment>
+ <translation>底端</translation>
+ </message>
+ <message>
+ <source>Mini-toolbar</source>
+ <comment>details (user interface)</comment>
+ <translation>迷你工具列</translation>
+ </message>
+ <message>
+ <source>Disabled</source>
+ <comment>details (user interface/mini-toolbar)</comment>
+ <translation>停用</translation>
</message>
</context>
<context>
@@ -1442,7 +1538,7 @@
</message>
<message>
<source>Suggest a reasonable maximum screen size to the guest. The guest will only see this suggestion when guest additions are installed.</source>
- <translation>建議合理的客體最大畫面大小。 Guest Additions 元件安裝時客體才能看到此建議。</translation>
+ <translation>建議合理的客體最大畫面大小。 Guest Additions 安裝時客體才能看到此建議。</translation>
</message>
<message>
<source>None</source>
@@ -1460,19 +1556,19 @@
</message>
<message>
<source>Suggest a maximum screen size to the guest. The guest will only see this suggestion when guest additions are installed.</source>
- <translation>建議客體最大畫面大小。 Guest Additions 元件安裝時客體才能看到此建議。</translation>
+ <translation>建議客體最大畫面大小。 Guest Additions 安裝時客體才能看到此建議。</translation>
</message>
<message>
<source>Machine Windows:</source>
- <translation type="unfinished"></translation>
+ <translation>機器視窗:</translation>
</message>
<message>
<source>If checked, machine windows will be raised when the mouse pointer moves over them.</source>
- <translation type="unfinished"></translation>
+ <translation>如果勾選,滑鼠指標移至機器視窗上方時將帶出視窗。</translation>
</message>
<message>
<source>&Raise Window Under Mouse</source>
- <translation type="unfinished"></translation>
+ <translation>提昇滑鼠下視窗(&R)</translation>
</message>
</context>
<context>
@@ -1522,11 +1618,11 @@
<name>UIGlobalSettingsGeneral</name>
<message>
<source>Holds the path to the default virtual machine folder. This folder is used, if not explicitly specified otherwise, when creating new virtual machines.</source>
- <translation>預設虛擬機器資料夾所使用的路徑。 新建虛擬機器時,如果沒有特別指定,則會使用這個資料夾。</translation>
+ <translation>保留預設虛擬機器資料夾的路徑。 新建虛擬機器時,如果沒有特別指定,則會使用這個資料夾。</translation>
</message>
<message>
<source>Holds the path to the library that provides authentication for Remote Display (VRDP) clients.</source>
- <translation>提供遠端顯示 (VRDP) 用戶端驗證所使用的程式庫路徑。</translation>
+ <translation>保留提供遠端顯示 (VRDP) 用戶端驗證的程式庫路徑。</translation>
</message>
<message>
<source>Default &Machine Folder:</source>
@@ -1537,18 +1633,6 @@
<translation>VRDP 驗證程式庫(&R):</translation>
</message>
<message>
- <source>&Dock and Menubar:</source>
- <translation>停駐和功能表列(&D):</translation>
- </message>
- <message>
- <source>Auto-Show in Fullscreen</source>
- <translation>自動以全螢幕顯示</translation>
- </message>
- <message>
- <source>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</source>
- <translation>勾選時,虛擬機器於全螢幕模式時將顯示停駐和功能表列。</translation>
- </message>
- <message>
<source>&Host Screensaver:</source>
<translation>主機螢幕保護(&H):</translation>
</message>
@@ -1907,7 +1991,7 @@
</message>
<message>
<source>Holds the host IPv4 address for this adapter.</source>
- <translation>此網路卡所使用的 IPv4 位址。</translation>
+ <translation>保留這個網路卡的 IPv4 位址。</translation>
</message>
<message>
<source>IPv4 Network &Mask:</source>
@@ -1915,7 +1999,7 @@
</message>
<message>
<source>Holds the host IPv4 network mask for this adapter.</source>
- <translation>此網路卡所使用的 IPv4 網路遮罩。</translation>
+ <translation>保留這個網路卡的 IPv4 網路遮罩。</translation>
</message>
<message>
<source>I&Pv6 Address:</source>
@@ -1923,7 +2007,7 @@
</message>
<message>
<source>Holds the host IPv6 address for this adapter if IPv6 is supported.</source>
- <translation>此網路卡所使用的 IPv6 位址,如果支援 IPv6。</translation>
+ <translation>保留這個網路卡的 IPv6 位址,如果支援 IPv6。</translation>
</message>
<message>
<source>IPv6 Network Mask &Length:</source>
@@ -1931,7 +2015,7 @@
</message>
<message>
<source>Holds the host IPv6 network mask prefix length for this adapter if IPv6 is supported.</source>
- <translation>此網路卡所使用的主機 IPv6 網路遮罩字首長度,如果支援 IPv6。</translation>
+ <translation>保留這個網路卡的主機 IPv6 網路遮罩前置長度,如果支援 IPv6。</translation>
</message>
<message>
<source>&DHCP Server</source>
@@ -1951,7 +2035,7 @@
</message>
<message>
<source>Holds the address of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation>DHCP 伺服器所使用的位址,服務與此「僅限主機」網路卡關聯的網路。</translation>
+ <translation>保留 DHCP 伺服器的位址,服務與此「僅限主機」網路卡關聯的網路。</translation>
</message>
<message>
<source>Server &Mask:</source>
@@ -1959,7 +2043,7 @@
</message>
<message>
<source>Holds the network mask of the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation>DHCP 伺服器所使用的網路遮罩,服務與此「僅限主機」網路卡關聯的網路。</translation>
+ <translation>保留 DHCP 伺服器的網路遮罩,服務與這個「僅限主機」網路卡關聯的網路。</translation>
</message>
<message>
<source>&Lower Address Bound:</source>
@@ -1967,7 +2051,7 @@
</message>
<message>
<source>Holds the lower address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation>DHCP 伺服器所提供使用的位址下限,服務與此「僅限主機」網路卡關聯的網路。</translation>
+ <translation>保留 DHCP 伺服器所提供的位址下限,服務與這個「僅限主機」網路卡關聯的網路。</translation>
</message>
<message>
<source>&Upper Address Bound:</source>
@@ -1975,7 +2059,7 @@
</message>
<message>
<source>Holds the upper address bound offered by the DHCP server servicing the network associated with this host-only adapter.</source>
- <translation>DHCP 伺服器所提供使用的位址上限,服務與此「僅限主機」網路卡關聯的網路。</translation>
+ <translation>保留 DHCP 伺服器所提供的位址上限,服務與這個「僅限主機」網路卡關聯的網路。</translation>
</message>
</context>
<context>
@@ -1998,7 +2082,7 @@
</message>
<message>
<source>Holds the name for this network.</source>
- <translation>這個網路所使用的名稱。</translation>
+ <translation>保留這個網路的名稱。</translation>
</message>
<message>
<source>Network &CIDR:</source>
@@ -2006,7 +2090,7 @@
</message>
<message>
<source>Holds the CIDR for this network.</source>
- <translation>此網路所使用的 CIDR。</translation>
+ <translation>保留這個網路的 CIDR。</translation>
</message>
<message>
<source>Network Options:</source>
@@ -2049,7 +2133,7 @@
<name>UIGlobalSettingsPortForwardingDlg</name>
<message>
<source>Port Forwarding Rules</source>
- <translation>通訊埠轉送規則</translation>
+ <translation>連接埠轉送規則</translation>
</message>
<message>
<source>IPv4</source>
@@ -2209,7 +2293,7 @@
</message>
<message>
<source>Caps Lock</source>
- <translation>Caps Lock</translation>
+ <translation>大寫鎖定</translation>
</message>
<message>
<source>Scroll Lock</source>
@@ -2289,16 +2373,6 @@
<translation><p style='white-space:pre'><nobr>指示虛擬硬碟的活動:</nobr>%1</p></translation>
</message>
<message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the CD/DVD devices:</nobr>%1</p></source>
- <comment>CD/DVD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>指示 CD/DVD 裝置的活動:</nobr>%1</p></translation>
- </message>
- <message>
- <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy devices:</nobr>%1</p></source>
- <comment>FD tooltip</comment>
- <translation><p style='white-space:pre'><nobr>指示軟碟裝置的活動:</nobr>%1</p></translation>
- </message>
- <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the network interfaces:</nobr>%1</p></source>
<comment>Network adapters tooltip</comment>
<translation><p style='white-space:pre'><nobr>指示網路卡的活動:</nobr>%1</p></translation>
@@ -2334,11 +2408,6 @@
<translation><br><nobr><b>未附加 USB 裝置</b></nobr></translation>
</message>
<message>
- <source><br><nobr><b>USB Controller is disabled</b></nobr></source>
- <comment>USB device tooltip</comment>
- <translation type="obsolete"><br><nobr><b>USB 控制器已停用</b></nobr></translation>
- </message>
- <message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the machine's shared folders:</nobr>%1</p></source>
<comment>Shared folders tooltip</comment>
<translation><p style='white-space:pre'><nobr>指示電腦共用資料夾的活動:</nobr>%1</p></translation>
@@ -2380,7 +2449,17 @@
</message>
<message>
<source><p style='white-space:pre'><nobr>Indicates the activity of the display:</nobr>%1</p></source>
- <translation type="unfinished"></translation>
+ <translation><p style='white-space:pre'><nobr>指示顯示器的活動性:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the optical drives:</nobr>%1</p></source>
+ <comment>CD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>指示光碟機的活動性:</nobr>%1</p></translation>
+ </message>
+ <message>
+ <source><p style='white-space:pre'><nobr>Indicates the activity of the floppy drives:</nobr>%1</p></source>
+ <comment>FD tooltip</comment>
+ <translation><p style='white-space:pre'><nobr>指示軟碟機的活動性:</nobr>%1</p></translation>
</message>
</context>
<context>
@@ -2414,19 +2493,19 @@
</message>
<message>
<source>No Webcams Connected</source>
- <translation type="unfinished"></translation>
+ <translation>未連接 Webcams</translation>
</message>
<message>
<source>No supported webcams connected to the host PC</source>
- <translation type="unfinished"></translation>
+ <translation>未連接支援的 Webcams 在主機電腦</translation>
</message>
<message>
<source>Connect Network Adapter</source>
- <translation type="unfinished"></translation>
+ <translation>連接網路卡</translation>
</message>
<message>
<source>Connect Network Adapter %1</source>
- <translation type="unfinished"></translation>
+ <translation>連接網路卡 %1</translation>
</message>
</context>
<context>
@@ -2560,7 +2639,7 @@
</message>
<message>
<source>When checked, VirtualBox will record the virtual machine session as a video file.</source>
- <translation>勾選時,VirtualBox 將以視訊檔案錄製虛擬機器工作階段。</translation>
+ <translation>勾選時,VirtualBox 將錄製虛擬機器工作階段為視訊檔。</translation>
</message>
<message>
<source>&Enable Video Capture</source>
@@ -2628,7 +2707,7 @@
</message>
<message>
<source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least b>%1</b>.</source>
- <translation>虛擬機器設成使用硬體圖形加速和作業系統提示設成 Windows Vista 或以上。 為了最佳效能,應該設定機器至少 <b>%1</b> 的視訊記憶體。</translation>
+ <translation type="obsolete">虛擬機器設成使用硬體圖形加速和作業系統提示設成 Windows Vista 或以上。 為了最佳效能,應該設定機器至少 <b>%1</b> 的視訊記憶體。</translation>
</message>
<message>
<source>The virtual machine is set up to use Video Stream Acceleration. As this feature only works with Windows guest systems it will be disabled.</source>
@@ -2682,43 +2761,15 @@
<translation>啟用畫面 %1 的視訊錄製。</translation>
</message>
<message>
- <source>Machine &Window</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Allows to modify VM menu-bar contents.</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <source>Mini ToolBar:</source>
- <translation type="unfinished">迷你工具列:</translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="unfinished">如果勾選,在全螢幕及無縫模式顯示迷你工具列。</translation>
- </message>
- <message>
- <source>Show in &Fullscreen/Seamless</source>
- <translation type="unfinished">在全螢幕/無縫模式顯示(&F)</translation>
- </message>
- <message>
- <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="unfinished">如果勾選,在螢幕上方顯示迷你工具列,而不是它的預設位置在螢幕的下方。</translation>
- </message>
- <message>
- <source>Show at &Top of Screen</source>
- <translation type="unfinished">顯示在螢幕上方(&T)</translation>
- </message>
- <message>
- <source>Allows to modify VM status-bar contents.</source>
- <translation type="unfinished"></translation>
+ <source><i>About %1MB per 5 minute video</i></source>
+ <translation><i>每 5 分鐘視訊約 %1MB </i></translation>
</message>
<message>
- <source>Remote Display is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
- <translation type="unfinished"></translation>
+ <source>Remote Display is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site as otherwise your VM will be started with Remote Display disabled.</source>
+ <translation>這部虛擬機器目前啟用遠端顯示。 然而,這需要安裝 <i>%1</i>。 請從 VirtualBox 下載網站安裝 Extension Pack,否則 VM 將停用遠端顯示來啟動。</translation>
</message>
<message>
- <source><i>About %1MB per 5 minute video</i></source>
+ <source>The virtual machine is set up to use hardware graphics acceleration and the operating system hint is set to Windows Vista or later. For best performance you should set the machine's video memory to at least <b>%1</b>.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -2726,15 +2777,15 @@
<name>UIMachineSettingsGeneral</name>
<message>
<source>Holds the path where snapshots of this virtual machine will be stored. Be aware that snapshots can take quite a lot of disk space.</source>
- <translation>將儲存這部虛擬機器快照所使用的路徑。 注意,快照可能需要相當多的磁碟空間。</translation>
+ <translation>保留將儲存這部虛擬機器快照的路徑。 注意,快照可能需要相當多的磁碟空間。</translation>
</message>
<message>
<source>Basi&c</source>
- <translation>基本(&B)</translation>
+ <translation>基本(&C)</translation>
</message>
<message>
<source>A&dvanced</source>
- <translation>進階(&A)</translation>
+ <translation>進階(&D)</translation>
</message>
<message>
<source>&Shared Clipboard:</source>
@@ -2750,59 +2801,147 @@
</message>
<message>
<source>D&escription</source>
- <translation>描述(&D)</translation>
+ <translation>描述(&E)</translation>
</message>
<message>
<source>Holds the description of the virtual machine. The description field is useful for commenting on configuration details of the installed guest OS.</source>
- <translation>虛擬機器所使用的描述。 描述欄位對於註解已安裝的客體作業系統之組態詳細資料是有用的。</translation>
+ <translation>保留虛擬機器的描述。 描述欄位對於註解已安裝的客體作業系統之組態詳細資料是有用的。</translation>
</message>
<message>
- <source>If checked, any CD/DVD or floppy disks inserted into or removed from the virtual drives while the machine is running will be remembered.</source>
- <translation type="obsolete">如果勾選,將記住機器執行時所放入或從虛擬磁碟移除的任何 CD/DVD 或軟體。</translation>
+ <source>D&rag'n'Drop:</source>
+ <translation>拖放(&R):</translation>
</message>
<message>
- <source>Removable Media:</source>
- <translation type="obsolete">卸除式媒體:</translation>
+ <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
+ <translation>選取要使用拖放在客體和主機作業系統之間複製的資料。 此功能需要在客體 OS 安裝 Guest Additions。</translation>
</message>
<message>
- <source>&Remember Runtime Changes</source>
- <translation type="obsolete">記住執行階段變更(&R)</translation>
+ <source>No name specified for the virtual machine.</source>
+ <translation>未指定虛擬機器的名稱。</translation>
</message>
<message>
- <source>Mini ToolBar:</source>
- <translation type="obsolete">迷你工具列:</translation>
+ <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
+ <translation>虛擬機器作業系統提示設成 64 位元類型。 64 位元客體需要硬體虛擬化,因此如果您確認變更這將會自動啟用。</translation>
</message>
<message>
- <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
- <translation type="obsolete">如果勾選,在全螢幕及無縫模式顯示迷你工具列。</translation>
+ <source>Enc&ryption</source>
+ <translation>加密(&R)</translation>
</message>
<message>
- <source>Show in &Fullscreen/Seamless</source>
- <translation type="obsolete">在全螢幕/無縫模式顯示(&F)</translation>
+ <source>When checked, enables encryption for this virtual machine.</source>
+ <translation>如果勾選,對此虛擬機器啟用加密。</translation>
</message>
<message>
- <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
- <translation type="obsolete">如果勾選,在螢幕上方顯示迷你工具列,而不是它的預設位置在螢幕的下方。</translation>
+ <source>En&able Encryption</source>
+ <translation>啟用加密(&A)</translation>
</message>
<message>
- <source>Show at &Top of Screen</source>
- <translation type="obsolete">顯示在螢幕上方(&T)</translation>
+ <source>Encryption C&ipher:</source>
+ <translation>加密 Cipher(&I) :</translation>
</message>
<message>
- <source>D&rag'n'Drop:</source>
- <translation>拖放(&D):</translation>
+ <source>Holds the cipher to be used for encrypting the virtual machine disks.</source>
+ <translation>保留虛擬機器磁碟所使用的 Cipher。</translation>
</message>
<message>
- <source>Selects which data will be copied between the guest and the host OS by drag'n'drop. This feature requires Guest Additions to be installed in the guest OS.</source>
- <translation>選取要使用拖放在客體和主機作業系統之間複製的資料。 此功能需要在客體 OS 安裝 Guest Additions。</translation>
+ <source>E&nter New Password:</source>
+ <translation>輸入新密碼(&N):</translation>
</message>
<message>
- <source>No name specified for the virtual machine.</source>
- <translation>未指定虛擬機器的名稱。</translation>
+ <source>Holds the password to be assigned to the virtual machine.</source>
+ <translation>保留指派給虛擬機器的密碼。</translation>
</message>
<message>
- <source>The virtual machine operating system hint is set to a 64-bit type. 64-bit guest systems require hardware virtualization, so this will be enabled automatically if you confirm the changes.</source>
- <translation>虛擬機器作業系統提示設成 64 位元類型。 64 位元客體需要硬體虛擬化,因此如果您確認變更這將會自動啟用。</translation>
+ <source>C&onfirm New Password:</source>
+ <translation>確認新密碼(&O):</translation>
+ </message>
+ <message>
+ <source>Confirms the password to be assigned to the virtual machine.</source>
+ <translation>確認要指派給虛擬機器的密碼。</translation>
+ </message>
+ <message>
+ <source>You are trying to encrypt this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site.</source>
+ <translation>您正嘗試加密此虛擬機器。 然而這需要安裝 <i>%1</i>。 從 VirtualBox 網站下載並安裝 Extension Pack。</translation>
+ </message>
+ <message>
+ <source>Encryption cipher type not specified.</source>
+ <translation>加密 Cipher 類型未指定。</translation>
+ </message>
+ <message>
+ <source>Encryption password empty.</source>
+ <translation>加密密碼為空。</translation>
+ </message>
+ <message>
+ <source>Encryption passwords do not match.</source>
+ <translation>加密密碼不相符。</translation>
+ </message>
+ <message>
+ <source>Leave Unchanged</source>
+ <comment>cipher type</comment>
+ <translation>保留不變更</translation>
+ </message>
+</context>
+<context>
+ <name>UIMachineSettingsInterface</name>
+ <message>
+ <source>Allows to modify VM menu-bar contents.</source>
+ <translation>允許修改虛擬機器功能表列內容。</translation>
+ </message>
+ <message>
+ <source>Screen Scale Factor:</source>
+ <translation>畫面縮放係數:</translation>
+ </message>
+ <message>
+ <source>This setting determines the guest screen scale factor.</source>
+ <translation>此設定決定客體畫面縮放係數。</translation>
+ </message>
+ <message>
+ <source>100%</source>
+ <translation>100%</translation>
+ </message>
+ <message>
+ <source>200%</source>
+ <translation>200%</translation>
+ </message>
+ <message>
+ <source>%</source>
+ <translation>%</translation>
+ </message>
+ <message>
+ <source>HiDPI:</source>
+ <translation>HiDPI:</translation>
+ </message>
+ <message>
+ <source>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</source>
+ <translation>如果勾選,將不會放大客體畫面內容以補償高主機螢幕解析度。</translation>
+ </message>
+ <message>
+ <source>Use &Unscaled HiDPI Output</source>
+ <translation>使用不縮放的 HiDPI 視訊輸出(&U)</translation>
+ </message>
+ <message>
+ <source>Mini ToolBar:</source>
+ <translation>迷你工具列:</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar in Fullscreen and Seamless modes.</source>
+ <translation>如果勾選,在全螢幕和無縫模式顯示迷你工具列。</translation>
+ </message>
+ <message>
+ <source>Show in &Fullscreen/Seamless</source>
+ <translation>在全螢幕/無縫模式顯示(&F)</translation>
+ </message>
+ <message>
+ <source>If checked, show the Mini ToolBar at the top of the screen, rather than in its default position at the bottom of the screen.</source>
+ <translation>如果勾選,在螢幕的頂端顯示迷你工具列,而不是在其預設位置螢幕的底端。</translation>
+ </message>
+ <message>
+ <source>Show at &Top of Screen</source>
+ <translation>顯示在螢幕頂端(&T)</translation>
+ </message>
+ <message>
+ <source>Allows to modify VM status-bar contents.</source>
+ <translation>允許修改虛擬機器狀態列內容。</translation>
</message>
</context>
<context>
@@ -2850,7 +2989,7 @@
</message>
<message>
<source>Holds the MAC address of this adapter. It contains exactly 12 characters chosen from {0-9,A-F}. Note that the second character must be an even digit.</source>
- <translation>這個網路卡所使用的 MAC 位址。 其確切包含 12 個字元選擇自 {0-9, A-F}。 請注意第二個字元必須是偶數數字。</translation>
+ <translation>保留這個網路卡的 MAC 位址。 其確切包含 12 個字元選擇自 {0-9, A-F}。 請注意,第二個字元必須是偶數數字。</translation>
</message>
<message>
<source>Generates a new random MAC address.</source>
@@ -2894,7 +3033,7 @@
</message>
<message>
<source>Holds the name of the internal network that this network card will be connected to. You can create a new internal network by choosing a name which is not used by any other network cards in this virtual machine or others.</source>
- <translation>這個網路卡將連接所使用的內部網路名稱。 可以選擇名稱以建立新的內部網路,其名稱未在此或其它虛擬機器中由其他任何網路卡所使用。</translation>
+ <translation>保留這個網路卡將連接的內部網路名稱。 可以選擇名稱以建立新的內部網路,其名稱未在此或其它虛擬機器中由其他任何網路卡所使用。</translation>
</message>
<message>
<source>Selects the virtual network adapter on the host system that traffic to and from this network card will go through. You can create and remove adapters using the global network settings in the virtual machine manager window.</source>
@@ -2938,7 +3077,7 @@
</message>
<message>
<source>Holds the name of the NAT network that this network card will be connected to. You can create and remove networks using the global network settings in the virtual machine manager window.</source>
- <translation>這個網路卡將連接的 NAT 網路所使用的名稱。 可以使用 [虛擬機器管理員] 視窗中的 [全域網路] 設定建立或移除網路。</translation>
+ <translation>保留這個網路卡將連接的 NAT 網路的名稱。 可以使用 [虛擬機器管理員] 視窗中的 [全域網路] 設定建立或移除網路。</translation>
</message>
</context>
<context>
@@ -2962,7 +3101,7 @@
</message>
<message>
<source>Holds the parallel port number. You can choose one of the standard parallel ports or select <b>User-defined</b> and specify port parameters manually.</source>
- <translation>使用的並列埠號。您可以選擇標準並列埠之一,或是選擇<b>使用者定義</b>並手動指定連接埠參數。</translation>
+ <translation>保留並列埠號。您可以選擇標準並列埠之一,或是選擇<b>使用者定義</b>並手動指定連接埠參數。</translation>
</message>
<message>
<source>&IRQ:</source>
@@ -2978,15 +3117,15 @@
</message>
<message>
<source>Holds the host parallel device name.</source>
- <translation>主機並列裝置所使用的名稱。</translation>
+ <translation>保留主機並列裝置名稱。</translation>
</message>
<message>
<source>Holds the IRQ number of this parallel port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
- <translation>這個並列埠所使用的 IRQ 號碼。這應該是介於 <tt>0</tt> 與 <tt>255</tt> 之間的整數。 只有這部虛擬機器啟用 <b>I/O APIC</b> 時,才會使用大於 <tt>15</tt> 的值。</translation>
+ <translation>保留這個並列埠的 IRQ 號碼。這應該是介於 <tt>0</tt> 與 <tt>255</tt> 之間的整數。 只有這部虛擬機器啟用 <b>I/O APIC</b> 設定時,才會使用大於 <tt>15</tt> 的值。</translation>
</message>
<message>
<source>Holds the base I/O port address of this parallel port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
- <translation>這個並列埠所使用的基礎 I/O 連接埠位址。有效值從 <tt>0</tt> 到 <tt>0xFFFF</tt> 的整數。</translation>
+ <translation>保留這個並列埠的基礎 I/O 連接埠位址。有效值從 <tt>0</tt> 到 <tt>0xFFFF</tt> 的整數。</translation>
</message>
</context>
<context>
@@ -3125,10 +3264,6 @@
<translation>編輯共用</translation>
</message>
<message>
- <source>Dialog</source>
- <translation type="obsolete">Dialog</translation>
- </message>
- <message>
<source>Folder Path:</source>
<translation>資料夾路徑:</translation>
</message>
@@ -3138,7 +3273,7 @@
</message>
<message>
<source>Holds the name of the shared folder (as it will be seen by the guest OS).</source>
- <translation>共用資料夾所使用的名稱 (客體作業系統將會看到的)。</translation>
+ <translation>保留共用資料夾的名稱 (客體作業系統將會看到的)。</translation>
</message>
<message>
<source>When checked, the guest OS will not be able to write to the specified shared folder.</source>
@@ -3150,7 +3285,7 @@
</message>
<message>
<source>&Make Permanent</source>
- <translation>永久性(&M)</translation>
+ <translation>設為永久(&M)</translation>
</message>
<message>
<source>When checked, the guest OS will try to automatically mount the shared folder on startup.</source>
@@ -3174,11 +3309,11 @@
</message>
<message>
<source>When checked, enables the given serial port of the virtual machine.</source>
- <translation>勾選時,表示啟用給予的虛擬機器序列埠。</translation>
+ <translation>勾選時,虛擬機器啟用給予的串列埠。</translation>
</message>
<message>
<source>&Enable Serial Port</source>
- <translation>啟用序列埠(&E)</translation>
+ <translation>啟用串列埠(&E)</translation>
</message>
<message>
<source>Port &Number:</source>
@@ -3186,7 +3321,7 @@
</message>
<message>
<source>Selects the serial port number. You can choose one of the standard serial ports or select <b>User-defined</b> and specify port parameters manually.</source>
- <translation>選取序列埠號。您可以選擇標準序列埠之一,或是選擇<b>使用者定義</b>並手動指定連接埠參數。</translation>
+ <translation>選取串列埠號。 您可以選擇標準串列埠之一,或是選擇<b>使用者定義</b>並手動指定連接埠參數。</translation>
</message>
<message>
<source>&IRQ:</source>
@@ -3202,31 +3337,31 @@
</message>
<message>
<source>Controls the working mode of this serial port. If you select <b>Disconnected</b>, the guest OS will detect the serial port but will not be able to operate it.</source>
- <translation>控制這個序列埠的工作模式。如果您選取<b>已中斷連接</b>,客體作業系統將會偵測到序列埠但無法操作它。</translation>
+ <translation>控制這個串列埠的工作模式。 如果您選取<b>已中斷連接</b>,客體作業系統將偵測到串列埠但無法操作。</translation>
</message>
<message>
- <source>If checked, the pipe specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe exists and try to use it.</source>
- <translation>如果勾選,在<b>連接埠路徑</b>欄位中指定的管線將由虛擬機器於啟動時建立。 否則,虛擬機器將假設管線存在並嘗試使用它。</translation>
+ <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
+ <translation>保留這個串列埠的 IRQ 號碼。這應該是介於 <tt>0</tt> 與 <tt>255</tt> 之間的整數。 只有這部虛擬機器啟用 <b>I/O APIC</b> 設定時,才會使用大於 <tt>15</tt> 的值。</translation>
</message>
<message>
- <source>&Create Pipe</source>
- <translation>建立管線(&C)</translation>
+ <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
+ <translation>保留這個串列埠的基礎 I/O 連接埠位址。有效值從 <tt>0</tt> 到 <tt>0xFFFF</tt> 的整數。</translation>
</message>
<message>
- <source>Holds the path to the serial port's pipe on the host when the port is working in <b>Host Pipe</b> mode, or the host serial device name when the port is working in <b>Host Device</b> mode.</source>
- <translation>連接埠工作在<b>主機管線</b>模式時,主機中序列埠管線所使用的路徑,或者當連接埠工作在<b>主機裝置</b>模式時所使用的主機序列裝置名稱。</translation>
+ <source>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</source>
+ <translation>如果勾選,虛擬機器將假設於 <b>路徑/位址</b>欄位中指定的管線或通訊端存在並嘗試去使用。 否則,虛擬機器將在啟動時建立管線或通訊端。</translation>
</message>
<message>
- <source>Port/File &Path:</source>
- <translation>連接埠/檔案路徑(&P):</translation>
+ <source>&Connect to existing pipe/socket</source>
+ <translation>連線到現有管線/通訊端(&C)</translation>
</message>
<message>
- <source>Holds the IRQ number of this serial port. This should be a whole number between <tt>0</tt> and <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>I/O APIC</b> setting is enabled for this virtual machine.</source>
- <translation>這個序列埠所使用的 IRQ 號碼。這應該是介於 <tt>0</tt> 與 <tt>255</tt> 之間的整數。 只有這部虛擬機器啟用 <b>I/O APIC</b> 時,才會使用大於 <tt>15</tt> 的值。</translation>
+ <source>&Path/Address:</source>
+ <translation>路徑/位址(&P):</translation>
</message>
<message>
- <source>Holds the base I/O port address of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>0xFFFF</tt>.</source>
- <translation>這個序列埠所使用的基礎 I/O 連接埠位址。有效值從 <tt>0</tt> 到 <tt>0xFFFF</tt> 的整數。</translation>
+ <source><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the seri [...]
+ <translation><p>在<b>主機管線</b>模式: 保留路徑為主機的串列埠管線。 範例: "\\.\pipe\myvbox" 或 "/tmp/myvbox", 分別對 Windows 和 UNIX 類的系統。</p><p>在<b>主機裝置</b>模式: 保留主機串列裝置名稱。 範例: "COM1" 或 "/dev/ttyS0"。</p><p>在 <b>Raw 檔案</b>模式: 保留在主機系統的檔案路徑,其中將傾印串列輸出。</p><p>在 <b>TCP</b> 模式: 在伺服器模式時保留 TCP "連接埠" 或在用戶端模式時保留 "主機名稱:連接埠" 。</translation>
</message>
</context>
<context>
@@ -3267,14 +3402,6 @@
<translation><nobr>加入硬碟</nobr></translation>
</message>
<message>
- <source><nobr>Add CD/DVD Device</nobr></source>
- <translation><nobr>加入 CD/DVD 裝置</nobr></translation>
- </message>
- <message>
- <source><nobr>Add Floppy Device</nobr></source>
- <translation><nobr>加入軟碟裝置</nobr></translation>
- </message>
- <message>
<source>Add Controller</source>
<translation>加入控制器</translation>
</message>
@@ -3307,14 +3434,6 @@
<translation>加入硬碟</translation>
</message>
<message>
- <source>Add CD/DVD Device</source>
- <translation>加入 CD/DVD 裝置</translation>
- </message>
- <message>
- <source>Add Floppy Device</source>
- <translation>加入軟碟裝置</translation>
- </message>
- <message>
<source>Remove Attachment</source>
<translation>移除附件</translation>
</message>
@@ -3324,7 +3443,7 @@
</message>
<message>
<source>Removes the controller highlighted in the Storage Tree.</source>
- <translation>移除存放裝置樹中反白的控制器。</translation>
+ <translation>移除存放裝置樹中反白顯示的控制器。</translation>
</message>
<message>
<source>Adds a new attachment to the Storage Tree using currently selected controller as parent.</source>
@@ -3332,7 +3451,7 @@
</message>
<message>
<source>Removes the attachment highlighted in the Storage Tree.</source>
- <translation>移除存放裝置樹中反白的附件。</translation>
+ <translation>移除存放裝置樹中反白顯示的附件。</translation>
</message>
<message>
<source>Hard &Disk:</source>
@@ -3443,18 +3562,6 @@
<translation>設定虛擬硬碟</translation>
</message>
<message>
- <source>CD/DVD &Drive:</source>
- <translation>CD/DVD 光碟機(&D):</translation>
- </message>
- <message>
- <source>Choose a virtual CD/DVD disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
- <translation>選擇與虛擬磁碟機使用的虛擬 CD/DVD 磁碟或實體光碟機。 虛擬機器將看到插入光碟機的磁碟,以檔案中資料或實體光碟機中磁碟為內容。</translation>
- </message>
- <message>
- <source>Set up the virtual CD/DVD drive</source>
- <translation>設定虛擬 CD/DVD 光碟機</translation>
- </message>
- <message>
<source>Floppy &Drive:</source>
<translation>軟碟機(&D):</translation>
</message>
@@ -3475,10 +3582,6 @@
<translation>選擇虛擬硬碟檔案...</translation>
</message>
<message>
- <source>Choose a virtual CD/DVD disk file...</source>
- <translation>選擇虛擬 CD/DVD 磁碟檔案...</translation>
- </message>
- <message>
<source>Remove disk from virtual drive</source>
<translation>從虛擬磁碟機移除磁碟</translation>
</message>
@@ -3546,19 +3649,51 @@
</message>
<message>
<source>The machine currently has more storage controllers assigned than a %1 chipset supports. Please change the chipset type on the System settings page or reduce the number of the following storage controllers on the Storage settings page: %2</source>
- <translation>機器目前指派超過 %1 晶片組所支援的存放控制器。 請在 [系統] 設定頁中變更晶片組類型或在 [存放] 設定頁中減少以下存放控制器的數量: %2。</translation>
+ <translation>機器目前指派超過 %1 晶片組所支援的存放控制器。 請在 [系統] 設定頁中變更晶片組類型或在 [存放裝置] 設定頁中減少以下存放控制器的數量: %2</translation>
</message>
<message>
<source>Add USB Controller</source>
- <translation type="unfinished"></translation>
+ <translation>加入 USB 控制器</translation>
</message>
<message>
<source>When checked the guest system will see the virtual disk as a hot-pluggable device.</source>
- <translation type="unfinished"></translation>
+ <translation>勾選時,客體系統將看到虛擬磁碟為熱插拔裝置。</translation>
</message>
<message>
<source>&Hot-pluggable</source>
- <translation type="unfinished"></translation>
+ <translation>可熱插拔(&H)</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk file...</source>
+ <translation>選擇虛擬光碟檔案...</translation>
+ </message>
+ <message>
+ <source><nobr>Add Optical Drive</nobr></source>
+ <translation><nobr>加入光碟機</nobr></translation>
+ </message>
+ <message>
+ <source><nobr>Add Floppy Drive</nobr></source>
+ <translation><nobr>加入軟碟機</nobr></translation>
+ </message>
+ <message>
+ <source>Add Optical Drive</source>
+ <translation>加入光碟機</translation>
+ </message>
+ <message>
+ <source>Add Floppy Drive</source>
+ <translation>加入軟碟機</translation>
+ </message>
+ <message>
+ <source>Optical &Drive:</source>
+ <translation>光碟機(&D):</translation>
+ </message>
+ <message>
+ <source>Choose a virtual optical disk or a physical drive to use with the virtual drive. The virtual machine will see a disk inserted into the drive with the data in the file or on the disk in the physical drive as its contents.</source>
+ <translation>選擇與虛擬磁碟機使用的虛擬光碟或實體光碟機。 虛擬機器將看到插入光碟機的磁碟的檔案中資料,或實體光碟機中磁碟為其內容。</translation>
+ </message>
+ <message>
+ <source>Set up the virtual optical drive</source>
+ <translation>設定虛擬光碟機</translation>
</message>
</context>
<context>
@@ -3732,14 +3867,6 @@
<translation>指派超過主機電腦記憶體 (<b>%2</b>) 的 <b>%1%</b> 到虛擬機器。 主機的作業系統可能沒有足夠的剩餘記憶體。 請考慮選取較小的記憶體數。</translation>
</message>
<message>
- <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9. It will be done automatically if you confirm your changes.</source>
- <translation type="obsolete">目前未在 [系統] 頁的 [主機板] 區啟用 /IO APIC 功能。 這是需要的以便支援 ICH9 類型的晶片組。 如果您確認變更將會自動完成。</translation>
- </message>
- <message>
- <source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device. It will be done automatically if you confirm your changes.</source>
- <translation type="obsolete">目前沒有在 USB 頁面啟用 USB 控制器模擬。 這是需要的以支援模擬的 USB 輸入裝置。 如果您確認變更將會自動完成。</translation>
- </message>
- <message>
<source>For performance reasons, the number of virtual CPUs attached to the virtual machine may not be more than twice the number of physical CPUs on the host (<b>%1</b>). Please reduce the number of virtual CPUs.</source>
<translation>為了效能原因,附加到虛擬機器的虛擬 CPU 數不可多於主機中實體 CPU 數 (<b>%1</b> 顆) 的兩倍。 請降低虛擬 CPU 數。</translation>
</message>
@@ -3748,40 +3875,32 @@
<translation>指派超過主機系統實體 CPU (<b>%1</b> 顆) 的虛擬 CPU 到虛擬機器。 這可能會降低虛擬機器的效能。 請考慮降低除虛擬 CPU 數。</translation>
</message>
<message>
- <source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
- <translation type="obsolete">目前未在 [系統] 頁的 [主機板] 區啟用 /IO APIC 功能。 這是需要的以便支援一個以上的虛擬處理器。 如果您確認變更將會自動完成。</translation>
- </message>
- <message>
- <source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor. It will be done automatically if you confirm your changes.</source>
- <translation type="obsolete">硬體虛擬化目前未在 [系統] 頁的 [加速] 區啟用。 這是需要的以便支援一個以上的虛擬處理器。 如果您確認變更將會自動完成。</translation>
- </message>
- <message>
<source>The processor execution cap is set to a low value. This may make the machine feel slow to respond.</source>
<translation>處理器執行上限設定成低的值。 這會使機器回應感覺變慢。</translation>
</message>
<message>
<source>&Paravirtualization Interface:</source>
- <translation type="unfinished"></translation>
+ <translation>半虛擬化介面(&P):</translation>
</message>
<message>
<source>Selects the paravirtualization guest interface provider to be used by this virtual machine.</source>
- <translation type="unfinished"></translation>
+ <translation>選取這個虛擬機器所使用的半虛擬化客體介面提供者。</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support a chip set of type ICH9 you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>目前未在 [系統] 頁的 [主機板] 區啟用 /IO APIC 功能。 這是需要的以便在您啟用的這個 VM 支援 ICH9 類型的晶片組。 如果您確認變更將會自動完成。</translation>
</message>
<message>
<source>USB controller emulation is not currently enabled on the USB page. This is needed to support an emulated USB input device you have enabled for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>目前沒有在 USB 頁面啟用 USB 控制器模擬。 這是需要的以便在您啟用的這個 VM 支援模擬的 USB 輸入裝置。 如果您確認變更將會自動完成。</translation>
</message>
<message>
<source>The I/O APIC feature is not currently enabled in the Motherboard section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>目前未在 [系統] 頁的 [主機板] 區啟用 /IO APIC 功能。 這是需要的以便在您選擇的這個 VM 支援一個以上的虛擬處理器。 如果您確認變更將會自動完成。</translation>
</message>
<message>
<source>Hardware virtualization is not currently enabled in the Acceleration section of the System page. This is needed in order to support more than one virtual processor you have chosen for this VM. It will be done automatically if you confirm your changes.</source>
- <translation type="unfinished"></translation>
+ <translation>硬體虛擬化目前未在 [系統] 頁的 [加速] 區啟用。 這是需要的以便在您選擇的這個 VM 支援一個以上的虛擬處理器。 如果您確認變更將會自動完成。</translation>
</message>
</context>
<context>
@@ -3852,10 +3971,6 @@
<translation>勾選時,啟用這部機器的虛擬 USB EHCI 控制器。 USB EHCI 控制器提供 USB 2.0 支援。</translation>
</message>
<message>
- <source>Enable USB 2.0 (E&HCI) Controller</source>
- <translation type="obsolete">啟用 USB 2.0 (EHCI) 控制器(&H)</translation>
- </message>
- <message>
<source>USB Device &Filters</source>
<translation>USB 裝置篩選器(&F)</translation>
</message>
@@ -3908,28 +4023,28 @@
<translation><nobr>狀態: %1</nobr></translation>
</message>
<message>
- <source>USB 2.0 is currently enabled for this virtual machine. However, this requires the <b>%1</b> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0 to be able to start the machine.</source>
- <translation>USB 2.0 目前在這部虛擬機器啟用。 然而這需要安裝 <b>%1</b>。 請從 VirtualBox 下載網站安裝擴充包或停用 USB 2.0 使能夠啟動機器。</translation>
- </message>
- <message>
<source>When checked, enables the virtual USB OHCI controller of this machine. The USB OHCI controller provides USB 1.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>勾選時,啟用這部機器的虛擬 USB OHCI 控制器。 USB OHCI 控制器提供 USB 1.0 支援。</translation>
</message>
<message>
<source>USB &1.1 (OHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB 1.1 (EHCI) 控制器(&1)</translation>
</message>
<message>
<source>USB &2.0 (EHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB 2.0 (EHCI) 控制器(&2)</translation>
</message>
<message>
<source>When checked, enables the virtual USB xHCI controller of this machine. The USB xHCI controller provides USB 3.0 support.</source>
- <translation type="unfinished"></translation>
+ <translation>勾選時,啟用這部機器的虛擬 USB xHCI 控制器。 USB xHCI 控制器提供 USB 3.0 支援。</translation>
</message>
<message>
<source>USB &3.0 (xHCI) Controller</source>
- <translation type="unfinished"></translation>
+ <translation>USB 3.0 (xHCI) 控制器(&3)</translation>
+ </message>
+ <message>
+ <source>USB 2.0/3.0 is currently enabled for this virtual machine. However, this requires the <i>%1</i> to be installed. Please install the Extension Pack from the VirtualBox download site or disable USB 2.0/3.0 to be able to start the machine.</source>
+ <translation>USB 2.0/3.0 目前在這部虛擬機器啟用。 然而,這需要安裝 <i>%1</i> 。 請從 VirtualBox 下載網站下載並安裝 Extension Pack 或停用 USB 2.0/3.0 使可以啟動機器。</translation>
</message>
</context>
<context>
@@ -3955,7 +4070,7 @@
</message>
<message>
<source>Holds the filter name.</source>
- <translation>篩選器所使用的名稱。</translation>
+ <translation>保留篩選器名稱。</translation>
</message>
<message>
<source>&Vendor ID:</source>
@@ -4055,12 +4170,8 @@
<translation>軟碟(&F)</translation>
</message>
<message>
- <source>C&lose</source>
- <translation type="obsolete">關閉(&L)</translation>
- </message>
- <message>
<source>Removing medium...</source>
- <translation type="unfinished"></translation>
+ <translation>移除媒體...</translation>
</message>
</context>
<context>
@@ -4082,15 +4193,23 @@
<name>UIMenuBarEditorWidget</name>
<message>
<source>Virtual Screen Resize</source>
- <translation type="unfinished"></translation>
+ <translation>虛擬畫面調整大小</translation>
</message>
<message>
<source>Virtual Screen Mapping</source>
- <translation type="unfinished"></translation>
+ <translation>虛擬畫面對應</translation>
</message>
<message>
<source>Close</source>
- <translation type="unfinished">關閉</translation>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>Switch</source>
+ <translation>切換</translation>
+ </message>
+ <message>
+ <source>Enable Menu Bar</source>
+ <translation>啟用功能表列</translation>
</message>
</context>
<context>
@@ -4134,10 +4253,6 @@
<translation><p>初始化 COM 或尋找 VirtualBox COM 伺服器時失敗。 很有可能,VirtualBox 伺服器未執作或是啟動失敗。</p><p>應用程式現在將終止。</p></translation>
</message>
<message>
- <source><p>Failed to create the VirtualBox COM object.</p><p>The application will now terminate.</p></source>
- <translation><p>建立 VirtualBox COM 物件時失敗。</p><p>應用程式現在將終止。</p></translation>
- </message>
- <message>
<source>Failed to set global VirtualBox properties.</source>
<translation>設定全域 VirtualBox 內容失敗。</translation>
</message>
@@ -4257,7 +4372,7 @@
<message>
<source>Result Code: </source>
<comment>error info</comment>
- <translation>結果碼(&N): </translation>
+ <translation>結果碼: </translation>
</message>
<message>
<source>Component: </source>
@@ -4284,10 +4399,6 @@
<translation><p>從虛擬機器 <b>%3</b> 移除共用資料夾 <b>%1</b> (指向 <nobr><b>%2</b></nobr>) 時失敗。</p><p>請關閉客體作業系統中所有可能會用到這個共用資料夾的程式,並且再試一次。</p></translation>
</message>
<message>
- <source><p>The virtual machine window is optimized to work in <b>%1 bit</b> color mode but the virtual display is currently set to <b>%2 bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3 bit</b> color mode, if it is available, for best possible performance of the virtual video subsystem.</p><p><b>Note</b>. Some operating systems, like [...]
- <translation type="obsolete"><p>虛擬機器視窗最佳化在 <b>%1 位元</b> 的色彩模式中工作,但是目前虛擬顯示設定為 <b>%2 位元</b>。</p><p>如果可用,請開啟客體作業系統的顯示內容對話方塊,並且選取 <b>%3 位元</b> 的色彩模式,作為虛擬視訊子系統的最佳效能。</p><p><b>請注意</b>,某些像是 OS/2 的作業系統,可能實際上作用於 32 位元模式,卻回報為 24 位元 (16 萬色) 。 您可以試著選取不同的色彩模式來查看這個訊息是否消失,如果您確定所要求的色彩模式 (%4 位元) 在客體作業系統中不可用,您可以現在簡單的停用訊息。</p></translation>
- </message>
- <message>
<source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source>
<translation>開啟授權檔案 <nobr><b>%1</b></nobr> 失敗。 請檢查檔案權限。</translation>
</message>
@@ -4313,11 +4424,6 @@
<translation>捨棄</translation>
</message>
<message>
- <source>Mount</source>
- <comment>additions</comment>
- <translation type="obsolete">掛載</translation>
- </message>
- <message>
<source><p>The host key is currently defined as <b>%1</b>.</p></source>
<comment>additional message box paragraph</comment>
<translation><p>Host 鍵目前定義為 <b>%1</b>。</p></translation>
@@ -4373,7 +4479,7 @@
</message>
<message>
<source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="http://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
- <translation><p>VirtualBox 的新版本已發佈! 版本 <b>%1</b> 在 <a href="http://www.virtualbox.org/">virtualbox.org</a>可用。</p><p>您可以使用連結:</p><p><a href=%2>%3</a></p>下載這個版本</translation>
+ <translation type="obsolete"><p>VirtualBox 的新版本已發佈! 版本 <b>%1</b> 在 <a href="http://www.virtualbox.org/">virtualbox.org</a>可用。</p><p>您可以使用連結:</p><p><a href=%2>%3</a></p>下載這個版本</translation>
</message>
<message>
<source>Release</source>
@@ -4416,12 +4522,8 @@
<translation>存取磁碟映像檔案 <nobr><b>%1</b></nobr> 失敗。</translation>
</message>
<message>
- <source><p>One or more virtual hard disks, CD/DVD or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
- <translation><p>一或多個虛擬硬碟、CD/DVD 或軟碟映像檔案目前不可存取。 因此您將無法操作使用這些檔案的虛擬機器,直至它們稍後成為可存取。</p><p>按下 [<b>檢查</b>] 來開啟虛擬媒體管理員視窗並查看哪些檔案不可存取或按下 [<b>忽略</b>] 以忽略這個訊息。</p></translation>
- </message>
- <message>
<source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nobr& [...]
- <translation><p>執行虛擬機器時發生關鍵錯誤並已停止機器執行。</p><p>有關協助,請查閱 <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> 的 Community 區或您的技術支援。 請提供日誌檔 <tt>VBox.log</tt> 的內容和圖像檔 <tt>VBox.png</tt>,您可以在 <nobr><b>%1</b></nobr> 目錄找到,以及說明您正在做什麼時發生此錯誤。 請注意,您也可以從 VirtualBox 主視窗的<b>機器</b>功能表選取<b>顯示紀錄</b>存取以上檔案。</p><p>如果您要關閉機器按下 [<b>確定</b>] 或如果您要保留它作為除錯按下 [<b>忽略&l [...]
+ <translation type="obsolete"><p>執行虛擬機器時發生關鍵錯誤並已停止機器執行。</p><p>有關協助,請查閱 <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> 的 Community 區或您的技術支援。 請提供日誌檔 <tt>VBox.log</tt> 的內容和圖像檔 <tt>VBox.png</tt>,您可以在 <nobr><b>%1</b></nobr> 目錄找到,以及說明您正在做什麼時發生此錯誤。 請注意,您也可以從 VirtualBox 主視窗的<b>機器</b>功能表選取<b>顯示紀錄</b>存取以上檔案。</p><p>如果您要關閉機器按下 [<b>確定</b>] 或如果您要保留它作為除錯按 [...]
</message>
<message>
<source>The following files already exist:<br /><br />%1<br /><br />Are you sure you want to replace them? Replacing them will overwrite their contents.</source>
@@ -4520,10 +4622,6 @@
<translation>強制卸載</translation>
</message>
<message>
- <source><p>Are you sure you want to delete the CD/DVD device?</p><p>You will not be able to insert any CDs or ISO images or install the Guest Additions without it!</p></source>
- <translation><p>您確定要刪除 CD/DVD 裝置嗎?</p><p>沒有它您將無法放入任何 CD 或 ISO 映像或安裝 Guest Additions!</p></translation>
- </message>
- <message>
<source>&Remove</source>
<comment>medium</comment>
<translation>移除(&R)</translation>
@@ -4570,11 +4668,7 @@
</message>
<message>
<source><p>You are about to add a virtual hard disk to controller <b>%1</b>.</p><p>Would you like to create a new, empty file to hold the disk contents or select an existing one?</p></source>
- <translation><p>您即將加入虛擬硬碟到控制器 <b>%1</b>。</p><p>您希望建立新的空檔案來持有磁碟內容或選取現有的檔案?</p></translation>
- </message>
- <message>
- <source><p>You are about to add a new CD/DVD drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual CD/DVD disk to put in the drive or to leave it empty for now?</p></source>
- <translation><p>您即將加入新的 CD/DVD 光碟機到控制器 <b>%1</b>。</p><p>您希望選擇虛擬 CD/DVD 磁碟放在光碟機或現在保持為空嗎?</p></translation>
+ <translation><p>您即將加入虛擬硬碟到控制器 <b>%1</b>。</p><p>您希望建立新的空檔案來保留磁碟內容或選取現有的檔案?</p></translation>
</message>
<message>
<source><p>You are about to add a new floppy drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual floppy disk to put in the drive or to leave it empty for now?</p></source>
@@ -4585,14 +4679,6 @@
<translation>從機器 <b>%3</b> 的插槽 <i>%2</i> 分離硬碟裝置 (<nobr><b>%1</b></nobr>) 失敗。</translation>
</message>
<message>
- <source>Failed to detach the CD/DVD device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>從機器 <b>%3</b> 的插槽 <i>%2</i> 分離 CD/DVD 裝置 (<nobr><b>%1</b></nobr>) 失敗。</translation>
- </message>
- <message>
- <source>Failed to detach the floppy device (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>從機器 <b>%3</b> 的插槽 <i>%2</i> 分離軟碟裝置 (<nobr><b>%1</b></nobr>) 失敗。</translation>
- </message>
- <message>
<source>Failed to update Guest Additions. The Guest Additions disk image file will be inserted for user installation.</source>
<translation>更新 Guest Additions 失敗。 將放入 Guest Additions 磁碟映像檔案供使用者安裝。</translation>
</message>
@@ -4621,22 +4707,10 @@
<translation>在機器 <b>%3</b> 的插槽 <i>%2</i> 附加硬碟裝置 (<nobr><b>%1</b></nobr>) 失敗。</translation>
</message>
<message>
- <source>Failed to attach the CD/DVD device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>在機器 <b>%3</b> 的插槽 <i>%2</i> 附加 CD/DVD 裝置 (<nobr><b>%1</b></nobr>) 失敗。</translation>
- </message>
- <message>
- <source>Failed to attach the floppy device (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
- <translation>在機器 <b>%3</b> 的插槽 <i>%2</i> 附加軟碟裝置 (<nobr><b>%1</b></nobr>) 失敗。</translation>
- </message>
- <message>
<source><p>Note that the storage unit of this medium will not be deleted and that it will be possible to use it later again.</p></source>
<translation><p>請注意,這個媒體的存放單元將不會刪除且可以稍後再次使用。</p></translation>
</message>
<message>
- <source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Install Guest Additions</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully started then s [...]
- <translation type="obsolete"><p>VirtualBox Guest Additions 似乎在這部虛擬機器不可使用,因此共用資料夾無法使用。 若要在虛擬機器內使用共用資料夾,如果是未安裝請安裝 Guest Additions ,或如果是未正常動作則重新安裝,從<b>裝置</b>功能表選取<b>安裝 Guest Additions</b>。 如果已安裝但機器尚未完全啟動,則共用資料夾將在啟動後可以使用。</p></translation>
- </message>
- <message>
<source><p>The virtual machine window will be now switched to <b>fullscreen</b> mode. You can go back to windowed mode at any time by pressing <b>%1</b>.</p><p>Note that the <i>Host</i> key is currently defined as <b>%2</b>.</p><p>Note that the main menu bar is hidden in fullscreen mode. You can access it by pressing <b>Host+Home</b>.</p></source>
<translation><p>現在將切換虛擬機器視窗到<b>全螢幕</b>模式。 您可以隨時按下 [<b>%1</b>] 回到視窗模式。</p><p>請注意,<i>Host</i> 鍵目前定義為 <b>%2</b>。</p><p>主功能表列在全螢幕模式中是隱藏的。 您可以按下 [<b>Host+Home</b>] 來存取。</p></translation>
</message>
@@ -4825,7 +4899,7 @@
</message>
<message>
<source>Failed to drop data.</source>
- <translation>拖放資料失敗。</translation>
+ <translation type="obsolete">拖放資料失敗。</translation>
</message>
<message>
<source><p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p></source>
@@ -4961,7 +5035,7 @@
</message>
<message>
<source><p>Unable to insert the virtual optical disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation><p>無法放入虛擬光碟 <nobr><b>%1</b></nobr> 至虛擬機器 <b>%1</b>。</p></translation>
+ <translation><p>無法放入虛擬光碟 <nobr><b>%1</b></nobr> 至虛擬機器 <b>%2</b>。</p></translation>
</message>
<message>
<source><p>Would you like to try to force insertion of this disk?</p></source>
@@ -4977,7 +5051,7 @@
</message>
<message>
<source><p>Unable to insert the virtual floppy disk <nobr><b>%1</b></nobr> into the machine <b>%2</b>.</p></source>
- <translation><p>無法放入虛擬軟碟 <nobr><b>%1</b></nobr> 至虛擬機器 <b>%1</b>。</p></translation>
+ <translation><p>無法放入虛擬軟碟 <nobr><b>%1</b></nobr> 至虛擬機器 <b>%2</b>。</p></translation>
</message>
<message>
<source><p>Unable to eject the virtual floppy disk <nobr><b>%1</b></nobr> from the machine <b>%2</b>.</p></source>
@@ -5051,14 +5125,6 @@
<translation><p>從 <nobr><a href="%1">%1</a></nobr> 下載 <b>VirtualBox Guest Additions</b> 磁碟映像檔案成功,但無法在本機儲存為 <nobr><b>%2</b>。</nobr></p><p>請為該檔案選擇另一個位置。</p></translation>
</message>
<message>
- <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual CD/DVD drive?</p></source>
- <translation><p>從 <nobr><a href="%1">%1</a></nobr> 下載 <b>VirtualBox Guest Additions</b> 磁碟映像檔案成功並在本機儲存為 <nobr><b>%2</b>。</nobr></p><p>您希望註冊此磁碟映像檔案並放入到虛擬 CD/DVD 磁碟機嗎?</p></translation>
- </message>
- <message>
- <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no CD/DVD drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
- <translation><p>無法放入 <b>VirtualBox Guest Additions</b> 磁碟映像檔案到虛擬機器 <b>%1</b>,因為機器沒有 CD/DVD 磁碟機。 請使用虛擬機器設定視窗的 [存放裝置] 頁面加入磁碟機。</p></translation>
- </message>
- <message>
<source><p>Could not find the <b>VirtualBox User Manual</b> <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source>
<translation><p>找不到 <b>VirtualBox 使用者手冊</b> <nobr><b>%1</b>。</nobr></p><p>您希望從 Internet 下載此檔案嗎?</p></translation>
</message>
@@ -5072,7 +5138,7 @@
</message>
<message>
<source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p></source>
- <translation><p>從 <nobr><a href="%1">%1</a></nobr> 下載 VirtualBox 使用者手冊成功並在本機儲存為 <nobr><b>%2</b>。</translation>
+ <translation><p>從 <nobr><a href="%1">%1</a></nobr> 下載 VirtualBox 使用者手冊成功並在本機儲存為 <nobr><b>%2</b>。</nobr></p></translation>
</message>
<message>
<source>Close</source>
@@ -5092,31 +5158,127 @@
</message>
<message>
<source>Failed to attach the webcam <b>%1</b> to the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>附加 Webcam <b>%1</b> 到虛擬機器 <b>%2</b> 失敗。</translation>
</message>
<message>
<source>Failed to detach the webcam <b>%1</b> from the virtual machine <b>%2</b>.</source>
- <translation type="unfinished"></translation>
+ <translation>從虛擬機器 <b>%2</b> 附加 Webcam <b>%1</b> 失敗。</translation>
</message>
<message>
<source><p>The VirtualBox Guest Additions do not appear to be available on this virtual machine, and shared folders cannot be used without them. To use shared folders inside the virtual machine, please install the Guest Additions if they are not installed, or re-install them if they are not working correctly, by selecting <b>Insert Guest Additions CD image</b> from the <b>Devices</b> menu. If they are installed but the machine is not yet fully starte [...]
- <translation type="unfinished"></translation>
+ <translation><p>VirtualBox Guest Additions 似乎在這部虛擬機器不可使用,因此共用資料夾無法使用。 若要在虛擬機器內使用共用資料夾,如果未安裝則請安裝 Guest Additions ,或者如果是未正常動作則請重新安裝,從<b>裝置</b>功能表選取<b>插入 Guest Additions CD 映像</b>。 如果已安裝但機器尚未完全啟動,則共用資料夾將在啟動後可以使用。</p></translation>
</message>
<message>
<source>Insert</source>
<comment>additions</comment>
- <translation type="unfinished"></translation>
+ <translation>插入</translation>
</message>
<message>
<source><p>The virtual screen is currently set to a <b>%1 bit</b> color mode. For better performance please change this to <b>%2 bit</b>. This can usually be done from the <b>Display</b> section of the guest operating system's Control Panel or System Settings.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>虛擬螢幕目前設成 <b>%1 位元</b>色彩模式。 為了更好的效能,請變更此為 <b>%2 位元</b>。 這通常能從客體作業系統的控制台或系統設定中的<b>顯示</b>區段完成。</p></translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Rule names should be unique.</source>
- <translation type="unfinished"></translation>
+ <translation>目前連接埠轉送規則無效。規則名稱應該唯一。</translation>
</message>
<message>
<source>The current port forwarding rules are not valid. Few rules have same host ports and conflicting IP addresses.</source>
+ <translation>目前連接埠轉送規則無效。 一些規則具有相同的主機埠和 IP 位址衝突。</translation>
+ </message>
+ <message>
+ <source><p>Failed to create the VirtualBoxClient COM object.</p><p>The application will now terminate.</p></source>
+ <translation><p>建立 VirtualBoxClient COM 物件時失敗。</p><p>應用程式現在將終止。</p></translation>
+ </message>
+ <message>
+ <source>Failed to set the global VirtualBox extra data for key <i>%1</i> to value <i>{%2}</i>.</source>
+ <translation>設定機碼 <i>%1</i> 的全域 VirtualBox 額外資料為數值 <i>{%2}</i> 失敗。</translation>
+ </message>
+ <message>
+ <source>Failed to set the extra data for key <i>%1</i> of machine <i>%2</i> to value <i>{%3}</i>.</source>
+ <translation>設定機器 <i>%2</i> 機碼<i>%1</i> 的額外資料為數值 <i>{%3}</i> 失敗。</translation>
+ </message>
+ <message>
+ <source><p>One or more virtual hard disks, optical or floppy disk image files are not currently accessible. As a result, you will not be able to operate virtual machines that use these files until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see which files are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source>
+ <translation><p>一或多個虛擬硬碟、光碟機 或軟碟映像檔案目前不可存取。 因此您將無法操作使用這些檔案的虛擬機器,直至它們稍後成為可存取。</p><p>按下 [<b>檢查</b>] 來開啟虛擬媒體管理員視窗並查看哪些檔案不可存取或按下 [<b>忽略</b>] 以忽略這個訊息。</p></translation>
+ </message>
+ <message>
+ <source>Failed to save the settings.</source>
+ <translation>儲存設定失敗。</translation>
+ </message>
+ <message>
+ <source><p>You are about to add a new optical drive to controller <b>%1</b>.</p><p>Would you like to choose a virtual optical disk to put in the drive or to leave it empty for now?</p></source>
+ <translation><p>您即將加入新的光碟機到控制器 <b>%1</b>。</p><p>您希望選擇虛擬光碟以放在光碟機或現在保持為空嗎?</p></translation>
+ </message>
+ <message>
+ <source><p>Are you sure you want to delete the optical drive?</p><p>You will not be able to insert any optical disks or ISO images or install the Guest Additions without it!</p></source>
+ <translation><p>您確定要刪除光碟機嗎?</p><p>沒有它您將無法放入任何光碟或 ISO 映像或安裝 Guest Additions!</p></translation>
+ </message>
+ <message>
+ <source>Failed to attach the optical drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>在機器 <b>%3</b> 的插槽 <i>%2</i> 附加光碟機 (<nobr><b>%1</b></nobr>) 失敗。</translation>
+ </message>
+ <message>
+ <source>Failed to attach the floppy drive (<nobr><b>%1</b></nobr>) to the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>在機器 <b>%3</b> 的插槽 <i>%2</i> 附加軟碟機 (<nobr><b>%1</b></nobr>) 失敗。</translation>
+ </message>
+ <message>
+ <source>Failed to detach the optical drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>在機器 <b>%3</b> 的插槽 <i>%2</i> 分離光碟機 (<nobr><b>%1</b></nobr>) 失敗。</translation>
+ </message>
+ <message>
+ <source>Failed to detach the floppy drive (<nobr><b>%1</b></nobr>) from the slot <i>%2</i> of the machine <b>%3</b>.</source>
+ <translation>在機器 <b>%3</b> 的插槽 <i>%2</i> 分離軟碟機 (<nobr><b>%1</b></nobr>) 失敗。</translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this er [...]
+ <translation type="obsolete"><p>執行虛擬機器時發生嚴重錯誤,且需要停止執行虛擬機器。</p><p>請查看在 <a href=http://www.virtualbox.org>http://www.virtualbox.org</a> 的 Community 區或您的技術支援合約取得協助。 請提供日誌檔案 <tt>VBox.log</tt> 的內容。您可以在虛擬機器的 log 目錄找到,以及發生此錯誤時的動作描述。 請注意,您也可以從 VirtualBox 主視窗的 [<b>機器</b>] 功能表選取 [<b>顯示日誌</b>] 來存取上述檔案。</p><p>按下 [<b>確定</b>] 以關閉機器。</p></translation>
+ </message>
+ <message>
+ <source>Failed to connect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>連接虛擬機器 <b>%1</b> 的網路卡失敗。</translation>
+ </message>
+ <message>
+ <source>Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.</source>
+ <translation>中斷連接虛擬機器 <b>%1</b> 的網路卡失敗。</translation>
+ </message>
+ <message>
+ <source><p>Could not insert the <b>VirtualBox Guest Additions</b> disk image file into the virtual machine <b>%1</b>, as the machine has no optical drives. Please add a drive using the storage page of the virtual machine settings window.</p></source>
+ <translation><p>無法放入 <b>VirtualBox Guest Additions</b> 磁碟映像檔案到虛擬機器 <b>%1</b>,因為機器沒有光碟機。 請使用虛擬機器設定視窗的 [存放裝置] 頁面加入磁碟機。</p></translation>
+ </message>
+ <message>
+ <source>Unable to enter password!</source>
+ <translation type="obsolete">無法輸入密碼!</translation>
+ </message>
+ <message>
+ <source><p>The <b>VirtualBox Guest Additions</b> disk image file has been successfully downloaded from <nobr><a href="%1">%1</a></nobr> and saved locally as <nobr><b>%2</b>.</nobr></p><p>Do you wish to register this disk image file and insert it into the virtual optical drive?</p></source>
+ <translation><p>從 <nobr><a href="%1">%1</a></nobr> 下載 <b>VirtualBox Guest Additions</b> 磁碟映像檔案成功並在本機儲存為 <nobr><b>%2</b>。</nobr></p><p>您希望註冊此磁碟映像檔案並放入到虛擬光碟機嗎?</p></translation>
+ </message>
+ <message>
+ <source>Bad password or authentication failure.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution has been stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, which you can find in the <nobr><b>%1</b></nob [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A critical error has occurred while running the virtual machine and the machine execution should be stopped.</p><p>For help, please see the Community section on <a href=https://www.virtualbox.org>https://www.virtualbox.org</a> or your support contract. Please provide the contents of the log file <tt>VBox.log</tt>, which you can find in the virtual machine log directory, as well as a description of what you were doing when this [...]
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source><p>A new version of VirtualBox has been released! Version <b>%1</b> is available at <a href="https://www.virtualbox.org/">virtualbox.org</a>.</p><p>You can download this version using the link:</p><p><a href=%2>%3</a></p></source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from host to guest failed.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Unable to cancel host to guest drag and drop operation.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drag and drop operation from guest to host failed.</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -5154,11 +5316,11 @@
<name>UINameAndSystemEditor</name>
<message>
<source>N&ame:</source>
- <translation>名稱(&N):</translation>
+ <translation>名稱(&A):</translation>
</message>
<message>
<source>Holds the name of the virtual machine.</source>
- <translation>虛擬機器所使用的名稱。</translation>
+ <translation>保留虛擬機器的名稱。</translation>
</message>
<message>
<source>&Type:</source>
@@ -5209,7 +5371,7 @@
</message>
<message>
<source>The network operation failed with the following error: %1.</source>
- <translation>網路操作失敗,錯誤: %1。</translation>
+ <translation>網路操作失敗,錯誤如下: %1。</translation>
</message>
</context>
<context>
@@ -5342,13 +5504,17 @@
</message>
<message>
<source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
- <translation><h3>歡迎使用 VirtualBox!</h3><p>此視窗的左側是電腦中所有虛擬機器的清單。 此清單目前是空的因為尚未建立任何虛擬機器。<img src=:/welcome.png align=right/></p><p>為了新建虛擬機器,按下位於視窗頂端的主工具列的 [<b>新增</b>] 按鈕。</p><p>您可以按下 <b>%1</b> 鍵取得即時說明,或訪問 <a href=http://www.virtualbox.org>www.virtualbox.org</a> 取得最新資訊和新聞。</p></translation>
+ <translation type="obsolete"><h3>歡迎使用 VirtualBox!</h3><p>此視窗的左側是電腦中所有虛擬機器的清單。 此清單目前是空的因為尚未建立任何虛擬機器。<img src=:/welcome.png align=right/></p><p>為了新建虛擬機器,按下位於視窗頂端的主工具列的 [<b>新增</b>] 按鈕。</p><p>您可以按下 <b>%1</b> 鍵取得即時說明,或訪問 <a href=http://www.virtualbox.org>www.virtualbox.org</a> 取得最新資訊和新聞。</p></translation>
</message>
<message>
<source>Manager</source>
<comment>Note: main window title which is pretended by the product name.</comment>
<translation>管理員</translation>
</message>
+ <message>
+ <source><h3>Welcome to VirtualBox!</h3><p>The left part of this window is a list of all virtual machines on your computer. The list is empty now because you haven't created any virtual machines yet.<img src=:/welcome.png align=right/></p><p>In order to create a new virtual machine, press the <b>New</b> button in the main tool bar located at the top of the window.</p><p>You can press the <b>%1</b> key to [...]
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISession</name>
@@ -5369,7 +5535,7 @@
</message>
<message>
<source>Settings</source>
- <translation>設定值</translation>
+ <translation type="obsolete">設定值</translation>
</message>
<message>
<source><b>%1</b> page:</source>
@@ -5418,6 +5584,10 @@
<source>Display</source>
<translation>顯示</translation>
</message>
+ <message>
+ <source>Preferences</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UISettingsDialogMachine</name>
@@ -5451,7 +5621,7 @@
</message>
<message>
<source>Serial Ports</source>
- <translation>序列埠</translation>
+ <translation>串列埠</translation>
</message>
<message>
<source>Parallel Ports</source>
@@ -5469,19 +5639,42 @@
<source>%1 - %2</source>
<translation>%1 - %2</translation>
</message>
+ <message>
+ <source>User Interface</source>
+ <translation>使用者介面</translation>
+ </message>
+ <message>
+ <source>Settings</source>
+ <translation type="unfinished">設定值</translation>
+ </message>
+</context>
+<context>
+ <name>UISettingsSerializerProgress</name>
+ <message>
+ <source>Loading Settings...</source>
+ <translation>正在載入設定...</translation>
+ </message>
+ <message>
+ <source>Saving Settings...</source>
+ <translation>正在儲存設定...</translation>
+ </message>
</context>
<context>
<name>UIStatusBarEditorButton</name>
<message>
<source><nobr><b>Click</b> to toggle indicator presence.</nobr><br><nobr><b>Drag&Drop</b> to change indicator position.</nobr></source>
- <translation type="unfinished"></translation>
+ <translation><nobr><b>按一下</b>以切換顯示指示器。</nobr><br><nobr><b>拖曳</b>以變更指示器位置。</nobr></translation>
</message>
</context>
<context>
<name>UIStatusBarEditorWidget</name>
<message>
<source>Close</source>
- <translation type="unfinished">關閉</translation>
+ <translation>關閉</translation>
+ </message>
+ <message>
+ <source>Enable Status Bar</source>
+ <translation>啟用狀態列</translation>
</message>
</context>
<context>
@@ -5609,11 +5802,11 @@
</message>
<message>
<source>&Continue running in the background</source>
- <translation type="unfinished"></translation>
+ <translation>繼續在背景執行(&C)</translation>
</message>
<message>
<source><p>Close the virtual machine windows but keep the virtual machine running.</p><p>You can use the VirtualBox Manager to return to running the virtual machine in a window.</p></source>
- <translation type="unfinished"></translation>
+ <translation><p>關閉虛擬機器視窗但保持虛擬機器執行中。</p><p>您可以使用 VirtualBox 管理員以返回執行中虛擬機器在視窗。</p></translation>
</message>
</context>
<context>
@@ -5688,10 +5881,6 @@
<translation>沒有網路卡</translation>
</message>
<message>
- <source>UIVMInfoDialog</source>
- <translation type="obsolete">UIVMInfoDialog</translation>
- </message>
- <message>
<source>Storage Statistics</source>
<translation>存放裝置統計</translation>
</message>
@@ -5713,10 +5902,6 @@
<translation>剪貼簿模式</translation>
</message>
<message>
- <source>Drag'n'Drop Mode</source>
- <translation>拖放模式</translation>
- </message>
- <message>
<source>Configuration &Details</source>
<translation>組態詳細資料(&D)</translation>
</message>
@@ -5726,7 +5911,11 @@
</message>
<message>
<source>VM Uptime</source>
- <translation type="unfinished"></translation>
+ <translation>VM 開機時間</translation>
+ </message>
+ <message>
+ <source>Drag and Drop Mode</source>
+ <translation>拖放模式</translation>
</message>
</context>
<context>
@@ -5816,28 +6005,20 @@
<context>
<name>UIWizard</name>
<message>
- <source>Hide Description</source>
- <translation type="obsolete">隱藏描述</translation>
- </message>
- <message>
- <source>Show Description</source>
- <translation type="obsolete">顯示描述</translation>
- </message>
- <message>
<source>&Expert Mode</source>
- <translation type="unfinished"></translation>
+ <translation>專家模式(&E)</translation>
</message>
<message>
<source>Switch to <nobr><b>Expert Mode</b></nobr>, a one-page dialog for experienced users.</source>
- <translation type="unfinished"></translation>
+ <translation>切換到<nobr><b>專家模式</b></nobr>,針對有經驗使用者的一頁對話方塊。</translation>
</message>
<message>
<source>&Guided Mode</source>
- <translation type="unfinished"></translation>
+ <translation>指導模式(&G)</translation>
</message>
<message>
<source>Switch to <nobr><b>Guided Mode</b></nobr>, a step-by-step dialog with detailed explanations.</source>
- <translation type="unfinished"></translation>
+ <translation>切換到<nobr><b>指導模式</b></nobr>,含詳細解釋的逐步對話方塊。</translation>
</message>
</context>
<context>
@@ -6119,11 +6300,11 @@
</message>
<message>
<source>Open Virtualization Format Archive (%1)</source>
- <translation>Open Virtualization Format Archive (%1)</translation>
+ <translation>開啟 Virtualization Format Archive (%1)</translation>
</message>
<message>
<source>Open Virtualization Format (%1)</source>
- <translation>Open Virtualization Format (%1)</translation>
+ <translation>開啟 Virtualization Format (%1)</translation>
</message>
<message>
<source>Write in legacy OVF 0.9 format for compatibility with other virtualization products.</source>
@@ -6263,7 +6444,7 @@
</message>
<message>
<source>Open Virtualization Format (%1)</source>
- <translation>Open Virtualization Format (%1)</translation>
+ <translation>開啟 Virtualization Format (%1)</translation>
</message>
<message>
<source>Appliance settings</source>
@@ -6385,7 +6566,7 @@
</message>
<message>
<source>Please choose a descriptive name for the new virtual machine and select the type of operating system you intend to install on it. The name you choose will be used throughout VirtualBox to identify this machine.</source>
- <translation>請選擇新虛擬機器的描述性名稱,並選取您打算在其上安裝的作業系統類型。 VirtualBox 將使用整個選擇的名稱來識別此機器。</translation>
+ <translation>請選擇新虛擬機器的描述性名稱,並選取您打算在上面安裝的作業系統類型。 VirtualBox 將使用整個選擇的名稱來識別此機器。</translation>
</message>
<message>
<source>Memory size</source>
@@ -6453,10 +6634,6 @@
<translation><重設為預設值></translation>
</message>
<message>
- <source>The actual default path value will be displayed after accepting the changes and opening this dialog again.</source>
- <translation type="obsolete">接受變更並重新開啟這個對話方塊後,將顯示實際的預設路徑值。</translation>
- </message>
- <message>
<source><not selected></source>
<translation><未選取></translation>
</message>
@@ -6502,7 +6679,7 @@
</message>
<message>
<source>The actual default path value will be displayed after accepting the changes and opening this window again.</source>
- <translation type="unfinished"></translation>
+ <translation>接受變更並重新開啟這個視窗後,將顯示實際的預設路徑值。</translation>
</message>
</context>
<context>
@@ -6688,11 +6865,6 @@
<translation>軟碟</translation>
</message>
<message>
- <source>CD/DVD</source>
- <comment>DeviceType</comment>
- <translation>CD/DVD</translation>
- </message>
- <message>
<source>Hard Disk</source>
<comment>DeviceType</comment>
<translation>硬碟</translation>
@@ -6750,7 +6922,7 @@
<message>
<source>Not supported</source>
<comment>USBDeviceState</comment>
- <translation>未支援</translation>
+ <translation>不支援</translation>
</message>
<message>
<source>Unavailable</source>
@@ -6810,7 +6982,7 @@
<message>
<source>Serial Ports</source>
<comment>details report</comment>
- <translation>序列埠</translation>
+ <translation>串列埠</translation>
</message>
<message>
<source>USB</source>
@@ -7045,7 +7217,7 @@
<message>
<source>Nested Paging</source>
<comment>details report</comment>
- <translation>Nested Paging</translation>
+ <translation>巢式分頁</translation>
</message>
<message>
<source>Enabled</source>
@@ -7281,21 +7453,6 @@
<comment>medium</comment>
<translation><b>沒有可用的磁碟映像檔案</b></translation>
</message>
- <message>
- <source>Attaching this hard disk will be performed indirectly using a newly created differencing hard disk.</source>
- <comment>medium</comment>
- <translation>附加這個硬碟將使用新建立的差異硬碟間接執行。</translation>
- </message>
- <message>
- <source>Some of the files in this hard disk chain are inaccessible. Please use the Virtual Media Manager in <b>Show Differencing Hard Disks</b> mode to inspect these files.</source>
- <comment>medium</comment>
- <translation>在這個硬碟鏈結中某些檔案無法存取。 請使用虛擬媒體管理員在<b>顯示差異硬碟</b>模式來檢查這些檔案。</translation>
- </message>
- <message>
- <source>This base hard disk is indirectly attached using the following differencing hard disk:</source>
- <comment>medium</comment>
- <translation>這個基礎硬碟使用以下差異硬碟間接附加:</translation>
- </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation>
@@ -7333,10 +7490,6 @@
</translation>
</message>
<message>
- <source>(CD/DVD)</source>
- <translation>(CD/DVD)</translation>
- </message>
- <message>
<source>Screens</source>
<comment>details report</comment>
<translation>畫面</translation>
@@ -7382,18 +7535,8 @@
<translation>PB</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>nested paging</comment>
- <translation type="obsolete">啟用</translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>nested paging</comment>
- <translation type="obsolete">停用</translation>
- </message>
- <message>
<source>Nested Paging</source>
- <translation>Nested Paging</translation>
+ <translation>巢式分頁</translation>
</message>
<message>
<source>Unknown device</source>
@@ -7706,7 +7849,7 @@
<message>
<source>Serial ports</source>
<comment>DetailsElementType</comment>
- <translation>序列埠</translation>
+ <translation>串列埠</translation>
</message>
<message>
<source>Parallel ports</source>
@@ -7781,16 +7924,6 @@
<translation>請選擇新虛擬硬碟檔案的位置</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation>啟用</translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>details report (Unrestricted Execution)</comment>
- <translation>停用</translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<comment>details report</comment>
<translation>無限制的執行</translation>
@@ -7811,16 +7944,6 @@
<translation>PS/2 和 USB 滑鼠</translation>
</message>
<message>
- <source>Enabled</source>
- <comment>unrestricted execution</comment>
- <translation type="obsolete">啟用</translation>
- </message>
- <message>
- <source>Disabled</source>
- <comment>unrestricted execution</comment>
- <translation type="obsolete">停用</translation>
- </message>
- <message>
<source>Unrestricted Execution</source>
<translation>無限制的執行</translation>
</message>
@@ -7846,56 +7969,155 @@
</message>
<message>
<source>You can create or add disk image files in the virtual machine settings.</source>
- <translation>您可以使用虛擬機器設定建立或加入磁碟映像檔案。</translation>
+ <translation>您可以在虛擬機器設定建立或加入磁碟映像檔案。</translation>
</message>
<message>
<source>USB</source>
<comment>StorageControllerType</comment>
- <translation type="unfinished">USB</translation>
+ <translation>USB</translation>
</message>
<message>
<source>USB Port %1</source>
<comment>StorageSlot</comment>
- <translation type="unfinished"></translation>
+ <translation>USB 連接埠 %1</translation>
</message>
<message>
<source>off</source>
<comment>guest monitor status</comment>
- <translation type="unfinished"></translation>
+ <translation>關閉</translation>
</message>
<message>
<source>Paravirtualization Interface</source>
<comment>details report</comment>
- <translation type="unfinished"></translation>
+ <translation>半虛擬化介面</translation>
</message>
<message>
<source>None</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished">無</translation>
+ <translation>無</translation>
</message>
<message>
<source>Default</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished">預設值</translation>
+ <translation>預設值</translation>
</message>
<message>
<source>Legacy</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>舊版</translation>
</message>
<message>
<source>Minimal</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>最小</translation>
</message>
<message>
<source>Hyper-V</source>
<comment>ParavirtProvider</comment>
- <translation type="unfinished"></translation>
+ <translation>Hyper-V</translation>
</message>
<message>
<source>New dynamically allocated storage</source>
<comment>MediumVariant</comment>
+ <translation>新增動態配置存放裝置</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>啟動</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (VT-x/AMD-V)</comment>
+ <translation>停用</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>啟動</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Nested Paging)</comment>
+ <translation>停用</translation>
+ </message>
+ <message>
+ <source>Active</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>啟動</translation>
+ </message>
+ <message>
+ <source>Inactive</source>
+ <comment>details report (Unrestricted Execution)</comment>
+ <translation>停用</translation>
+ </message>
+ <message>
+ <source>Taking Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>拍照</translation>
+ </message>
+ <message>
+ <source>Taking Online Snapshot</source>
+ <comment>MachineState</comment>
+ <translation>取得線上快照</translation>
+ </message>
+ <message>
+ <source>KVM</source>
+ <comment>ParavirtProvider</comment>
+ <translation>KVM</translation>
+ </message>
+ <message>
+ <source>Optical</source>
+ <comment>DeviceType</comment>
+ <translation>光碟機</translation>
+ </message>
+ <message>
+ <source>TCP</source>
+ <comment>PortMode</comment>
+ <translation>TCP</translation>
+ </message>
+ <message>
+ <source>OHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>OHCI</translation>
+ </message>
+ <message>
+ <source>EHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>EHCI</translation>
+ </message>
+ <message>
+ <source>xHCI</source>
+ <comment>USBControllerType</comment>
+ <translation>xHCI</translation>
+ </message>
+ <message>
+ <source>User interface</source>
+ <comment>DetailsElementType</comment>
+ <translation>使用者介面</translation>
+ </message>
+ <message>
+ <source>(Optical Drive)</source>
+ <translation>(光碟機)</translation>
+ </message>
+ <message>
+ <source>Attaching this hard drive will be performed indirectly using a newly created differencing hard drive.</source>
+ <comment>medium</comment>
+ <translation>附加這個硬碟機將使用新建立的差異硬碟機間接執行。</translation>
+ </message>
+ <message>
+ <source>Some of the files in this hard drive chain are inaccessible. Please use the Virtual Medium Manager to inspect these files.</source>
+ <comment>medium</comment>
+ <translation>在這個硬碟機鏈結中某些檔案無法存取。 請使用虛擬媒體管理員來檢查這些檔案。</translation>
+ </message>
+ <message>
+ <source>This base hard drive is indirectly attached using the following differencing hard drive:</source>
+ <comment>medium</comment>
+ <translation>這個基礎硬碟機使用以下差異硬碟機間接附加:</translation>
+ </message>
+ <message>
+ <source>Encrypted</source>
+ <comment>medium</comment>
<translation type="unfinished"></translation>
</message>
</context>
@@ -8028,6 +8250,10 @@
<source>Modify the attributes of the selected disk image file</source>
<translation>修改選取磁碟映像檔案的屬性</translation>
</message>
+ <message>
+ <source>UUID:</source>
+ <translation>UUID:</translation>
+ </message>
</context>
<context>
<name>VBoxScreenshotViewer</name>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_bg.ts b/src/VBox/Frontends/VirtualBox/nls/qt_bg.ts
index 5ef1720..5ced86a 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_bg.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_bg.ts
@@ -3995,74 +3995,74 @@ Please choose a different file name.</source>
<name>QUnicodeControlCharacterMenu</name>
<message>
<source>LRM Left-to-right mark</source>
- <translation type="unfinished"></translation>
+ <translation>LRM Маркер от ляво надясно</translation>
</message>
<message>
<source>RLM Right-to-left mark</source>
- <translation type="unfinished"></translation>
+ <translation>LRM Маркер от дясно наляво</translation>
</message>
<message>
<source>ZWJ Zero width joiner</source>
- <translation type="unfinished"></translation>
+ <translation>ZWJ Свързване с нулева ширина</translation>
</message>
<message>
<source>ZWNJ Zero width non-joiner</source>
- <translation type="unfinished"></translation>
+ <translation>ZWNJ Несвързване с нулева ширина</translation>
</message>
<message>
<source>ZWSP Zero width space</source>
- <translation type="unfinished"></translation>
+ <translation>ZWSP Интервал с нулева ширина</translation>
</message>
<message>
<source>LRE Start of left-to-right embedding</source>
- <translation type="unfinished"></translation>
+ <translation>LRE Начало на вмъкване от ляво надясно</translation>
</message>
<message>
<source>RLE Start of right-to-left embedding</source>
- <translation type="unfinished"></translation>
+ <translation>RLE Начало на вмъкване от дясно наляво</translation>
</message>
<message>
<source>LRO Start of left-to-right override</source>
- <translation type="unfinished"></translation>
+ <translation>LRO Начало на презапис от ляво надясно</translation>
</message>
<message>
<source>RLO Start of right-to-left override</source>
- <translation type="unfinished"></translation>
+ <translation>RLO Начало на презапис от дясно наляво</translation>
</message>
<message>
<source>PDF Pop directional formatting</source>
- <translation type="unfinished"></translation>
+ <translation>PDF Прекъсване на посочно форматиране</translation>
</message>
<message>
<source>Insert Unicode control character</source>
- <translation type="unfinished"></translation>
+ <translation>Вмъкване на Уникод контролен символ</translation>
</message>
</context>
<context>
<name>QWebFrame</name>
<message>
<source>Request cancelled</source>
- <translation type="unfinished"></translation>
+ <translation>Заявката е отказана</translation>
</message>
<message>
<source>Request blocked</source>
- <translation type="unfinished"></translation>
+ <translation>Заявката е блокирана</translation>
</message>
<message>
<source>Cannot show URL</source>
- <translation type="unfinished"></translation>
+ <translation>Не може да се покаже URL</translation>
</message>
<message>
<source>Frame load interruped by policy change</source>
- <translation type="unfinished"></translation>
+ <translation>Зареждането на кадри е прекъснато от промяна в политиката</translation>
</message>
<message>
<source>Cannot show mimetype</source>
- <translation type="unfinished"></translation>
+ <translation>Не може да се покаже mime тип</translation>
</message>
<message>
<source>File does not exist</source>
- <translation type="unfinished"></translation>
+ <translation>Файлът не съществува</translation>
</message>
</context>
<context>
@@ -4313,7 +4313,7 @@ Please choose a different file name.</source>
</message>
<message>
<source>Web Inspector - %2</source>
- <translation type="unfinished"></translation>
+ <translation>Уеб инспектор - %2</translation>
</message>
</context>
<context>
@@ -4444,817 +4444,819 @@ Please choose a different file name.</source>
</message>
<message>
<source>error triggered by consumer</source>
- <translation type="unfinished"></translation>
+ <translation>грешка, предизвикана от потребител</translation>
</message>
<message>
<source>unexpected end of file</source>
- <translation type="unfinished"></translation>
+ <translation>неочакван край на файл</translation>
</message>
<message>
<source>more than one document type definition</source>
- <translation type="unfinished"></translation>
+ <translation>повече от една дефиниция за тип на документ</translation>
</message>
<message>
<source>error occurred while parsing element</source>
- <translation type="unfinished"></translation>
+ <translation>възникнала грешка при изчитане на елемент</translation>
</message>
<message>
<source>tag mismatch</source>
- <translation type="unfinished"></translation>
+ <translation>пропуск на таг</translation>
</message>
<message>
<source>error occurred while parsing content</source>
- <translation type="unfinished"></translation>
+ <translation>възникнала грешка при изчитане на съдържание</translation>
</message>
<message>
<source>unexpected character</source>
- <translation type="unfinished"></translation>
+ <translation>неочакван символ</translation>
</message>
<message>
<source>invalid name for processing instruction</source>
- <translation type="unfinished"></translation>
+ <translation>невалидно име за изпълнение на инструкция</translation>
</message>
<message>
<source>version expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>очаква се версия при четенето на XML декларация</translation>
</message>
<message>
<source>wrong value for standalone declaration</source>
- <translation type="unfinished"></translation>
+ <translation>грешна стойност на самостоятелна декларация</translation>
</message>
<message>
<source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>очаква се декларация за кодировка или самостоятелна декларация при четенето на XML декларация</translation>
</message>
<message>
<source>standalone declaration expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>очаква се самостоятелна декларация при четенето на XML декларация</translation>
</message>
<message>
<source>error occurred while parsing document type definition</source>
- <translation type="unfinished"></translation>
+ <translation>възникнала грешка при изчитането на дефиницията за тип на документа</translation>
</message>
<message>
<source>letter is expected</source>
- <translation type="unfinished"></translation>
+ <translation>очаква се буква</translation>
</message>
<message>
<source>error occurred while parsing comment</source>
- <translation type="unfinished"></translation>
+ <translation>възникнала грешка при изчитане на коментар</translation>
</message>
<message>
<source>error occurred while parsing reference</source>
- <translation type="unfinished"></translation>
+ <translation>възникнала грешка при изчитане на справка</translation>
</message>
<message>
<source>internal general entity reference not allowed in DTD</source>
- <translation type="unfinished"></translation>
+ <translation>справка от вътрешен общ обхват не е позволена в DTD</translation>
</message>
<message>
<source>external parsed general entity reference not allowed in attribute value</source>
- <translation type="unfinished"></translation>
+ <translation>справка от външен общ изчетен обект не е позволена в стойност на атрибут</translation>
</message>
<message>
<source>external parsed general entity reference not allowed in DTD</source>
- <translation type="unfinished"></translation>
+ <translation>справка от външен общ изчетен обект не е позволена в DTD</translation>
</message>
<message>
<source>unparsed entity reference in wrong context</source>
- <translation type="unfinished"></translation>
+ <translation>неизчетена справка за обект в грешен контекст</translation>
</message>
<message>
<source>recursive entities</source>
- <translation type="unfinished"></translation>
+ <translation>рекурсивни обекти</translation>
</message>
<message>
<source>error in the text declaration of an external entity</source>
- <translation type="unfinished"></translation>
+ <translation>грешка в текстовата декларация на външен обект</translation>
</message>
</context>
<context>
<name>QXmlStream</name>
<message>
<source>Extra content at end of document.</source>
- <translation type="unfinished"></translation>
+ <translation>Допълнително съдържание в края на документа.</translation>
</message>
<message>
<source>Invalid entity value.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалидна стойност на обект.</translation>
</message>
<message>
<source>Invalid XML character.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалиден XML символ.</translation>
</message>
<message>
<source>Sequence ']]>' not allowed in content.</source>
- <translation type="unfinished"></translation>
+ <translation>Последователността ']]>' не е позволена в съдържанието.</translation>
</message>
<message>
<source>Namespace prefix '%1' not declared</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс '%1' в пространство от имена не е указан</translation>
</message>
<message>
<source>Attribute redefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Преуказан атрибут.</translation>
</message>
<message>
<source>Unexpected character '%1' in public id literal.</source>
- <translation type="unfinished"></translation>
+ <translation>Неочакван символ '%1' в публичен id literal.</translation>
</message>
<message>
<source>Invalid XML version string.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалиден стринг за XML версия.</translation>
</message>
<message>
<source>Unsupported XML version.</source>
- <translation type="unfinished"></translation>
+ <translation>Неподдържана XML версия.</translation>
</message>
<message>
<source>%1 is an invalid encoding name.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 е невалидно име за кодировка.</translation>
</message>
<message>
<source>Encoding %1 is unsupported</source>
- <translation type="unfinished"></translation>
+ <translation>Кодировката %1 не се поддържа</translation>
</message>
<message>
<source>Standalone accepts only yes or no.</source>
- <translation type="unfinished"></translation>
+ <translation>Самостоятелният приема само да и не.</translation>
</message>
<message>
<source>Invalid attribute in XML declaration.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалиден атрибут в XML декларация.</translation>
</message>
<message>
<source>Premature end of document.</source>
- <translation type="unfinished"></translation>
+ <translation>Преждевременен край на документ.</translation>
</message>
<message>
<source>Invalid document.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалиден документ.</translation>
</message>
<message>
<source>Expected </source>
- <translation type="unfinished"></translation>
+ <translation>Очаквано </translation>
</message>
<message>
<source>, but got '</source>
- <translation type="unfinished"></translation>
+ <translation>, но получено '</translation>
</message>
<message>
<source>Unexpected '</source>
- <translation type="unfinished"></translation>
+ <translation>Неочаквано '</translation>
</message>
<message>
<source>Expected character data.</source>
- <translation type="unfinished"></translation>
+ <translation>Очаквани символни данни.</translation>
</message>
<message>
<source>Recursive entity detected.</source>
- <translation type="unfinished"></translation>
+ <translation>Засечен е рекурсивен обект.</translation>
</message>
<message>
<source>Start tag expected.</source>
- <translation type="unfinished"></translation>
+ <translation>Очаква се начален таг.</translation>
</message>
<message>
<source>XML declaration not at start of document.</source>
- <translation type="unfinished"></translation>
+ <translation>XML декларацията не е в началото на документа.</translation>
</message>
<message>
<source>NDATA in parameter entity declaration.</source>
- <translation type="unfinished"></translation>
+ <translation>NDATA в декларацията на параметрите на обект.</translation>
</message>
<message>
<source>%1 is an invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 е невалидно име за инструкция за обработка.</translation>
</message>
<message>
<source>Invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалидно име за инструкция за обработка.</translation>
</message>
<message>
<source>Illegal namespace declaration.</source>
- <translation type="unfinished"></translation>
+ <translation>Непозволена декларация за пространство от имена.</translation>
</message>
<message>
<source>Invalid XML name.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалидно XML име.</translation>
</message>
<message>
<source>Opening and ending tag mismatch.</source>
- <translation type="unfinished"></translation>
+ <translation>Пропуснати отварящ и затварящ тагове.</translation>
</message>
<message>
<source>Reference to unparsed entity '%1'.</source>
- <translation type="unfinished"></translation>
+ <translation>Препратка към неизчетен обект '%1'.</translation>
</message>
<message>
<source>Entity '%1' not declared.</source>
- <translation type="unfinished"></translation>
+ <translation>Обектът '%1' не е деклариран.</translation>
</message>
<message>
<source>Reference to external entity '%1' in attribute value.</source>
- <translation type="unfinished"></translation>
+ <translation>Препратка към външен обект '%1' в стойност на атрибут.</translation>
</message>
<message>
<source>Invalid character reference.</source>
- <translation type="unfinished"></translation>
+ <translation>Невалидна препратка към символ.</translation>
</message>
<message>
<source>Encountered incorrectly encoded content.</source>
- <translation type="unfinished"></translation>
+ <translation>Намерено некоректно кодирано съдържание.</translation>
</message>
<message>
<source>The standalone pseudo attribute must appear after the encoding.</source>
- <translation type="unfinished"></translation>
+ <translation>Самостоятелният псевдо атрибут трябва да се появи преди кодировката.</translation>
</message>
<message>
<source>%1 is an invalid PUBLIC identifier.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 е невалиден ПУБЛИЧЕН указател.</translation>
</message>
</context>
<context>
<name>QtXmlPatterns</name>
<message>
<source>An %1-attribute with value %2 has already been declared.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут %1 със стойност %2 вече е деклариран.</translation>
</message>
<message>
<source>An %1-attribute must have a valid %2 as value, which %3 isn't.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут %1 трябва да има валиден %2 като стойност, а %3 не е.</translation>
</message>
<message>
<source>Network timeout.</source>
- <translation type="unfinished"></translation>
+ <translation>Просрочено мрежово време.</translation>
</message>
<message>
<source>Element %1 can't be serialized because it appears outside the document element.</source>
- <translation type="unfinished"></translation>
+ <translation>Елемент %1 не може да се сериализира, тъй като е извън документовия елемент.</translation>
</message>
<message>
<source>Attribute %1 can't be serialized because it appears at the top level.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут %1 не може да се сериализира, защото е в горното ниво.</translation>
</message>
<message>
<source>Year %1 is invalid because it begins with %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Година %1 е невалидна, защото започва с %2.</translation>
</message>
<message>
<source>Day %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
+ <translation>Ден %1 е извън обхвата %2..%3.</translation>
</message>
<message>
<source>Month %1 is outside the range %2..%3.</source>
- <translation type="unfinished"></translation>
+ <translation>Месец %1 е извън обхвата %2..%3.</translation>
</message>
<message>
<source>Overflow: Can't represent date %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Препълване: Не може да се покаже дата %1.</translation>
</message>
<message>
<source>Day %1 is invalid for month %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Ден %1 е невалиден за месец %2.</translation>
</message>
<message>
<source>Time 24:%1:%2.%3 is invalid. Hour is 24, but minutes, seconds, and milliseconds are not all 0; </source>
- <translation type="unfinished"></translation>
+ <translation>Време 24:%1:%2.%3 е невалидно. Часът е 24, но не всички минути, секунди и милисекунди са 0; </translation>
</message>
<message>
<source>Time %1:%2:%3.%4 is invalid.</source>
- <translation type="unfinished"></translation>
+ <translation>Време %1:%2:%3.%4 е невалидно.</translation>
</message>
<message>
<source>Overflow: Date can't be represented.</source>
- <translation type="unfinished"></translation>
+ <translation>Препълване: Не може да се покаже датата.</translation>
</message>
<message>
<source>At least one component must be present.</source>
- <translation type="unfinished"></translation>
+ <translation>Поне един компонент трябва да е наличен.</translation>
</message>
<message>
<source>At least one time component must appear after the %1-delimiter.</source>
- <translation type="unfinished"></translation>
+ <translation>Поне един времеви компонент трябва да е след ограничението %1.</translation>
</message>
<message>
<source>No operand in an integer division, %1, can be %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Няма операнда в целочислено деление, %1, може да е %2.</translation>
</message>
<message>
<source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
- <translation type="unfinished"></translation>
+ <translation>Първата операнда е целочислено деление, %1, не може да е безкрайност (%2).</translation>
</message>
<message>
<source>The second operand in a division, %1, cannot be zero (%2).</source>
- <translation type="unfinished"></translation>
+ <translation>Втората операнда в делението, %1, не може да е нула (%2).</translation>
</message>
<message>
<source>%1 is not a valid value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е валидна стойност от тип %2.</translation>
</message>
<message>
<source>When casting to %1 from %2, the source value cannot be %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Когато се разпределя към %1 от %2 входящата стойност не може да е %3.</translation>
</message>
<message>
<source>Integer division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Целочисленото деление (%1) на нула (%2) не е дефинирано.</translation>
</message>
<message>
<source>Division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Делението (%1) на нула (%2) не е дефинирано.</translation>
</message>
<message>
<source>Modulus division (%1) by zero (%2) is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Модулното деление (%1) на нула (%2) не е дефинирано.</translation>
</message>
<message>
<source>Dividing a value of type %1 by %2 (not-a-number) is not allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Делението на стойност от тип %1 на %2 (не е число) не е позволено.</translation>
</message>
<message>
<source>Dividing a value of type %1 by %2 or %3 (plus or minus zero) is not allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Делението на стойност от тип %1 на %2 или %3 (плюс или минус нула) не е позволено.</translation>
</message>
<message>
<source>Multiplication of a value of type %1 by %2 or %3 (plus or minus infinity) is not allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Умножението на стойност от тип %1 с %2 или %3 (плюс или минус безкрайност) не е позволено.</translation>
</message>
<message>
<source>A value of type %1 cannot have an Effective Boolean Value.</source>
- <translation type="unfinished"></translation>
+ <translation>Стойност от тип %1 не може да има Ефективна Булева Стойност.</translation>
</message>
<message>
<source>Effective Boolean Value cannot be calculated for a sequence containing two or more atomic values.</source>
- <translation type="unfinished"></translation>
+ <translation>Ефективна Булева Стойност не може да се изчисли за поредица, съдържаща две или повече атомични стойности.</translation>
</message>
<message>
<source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Стойност %1 от тип %2 надвишава максимума (%3).</translation>
</message>
<message>
<source>Value %1 of type %2 is below minimum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Стойност %1 от тип %2 е под минимума (%3).</translation>
</message>
<message>
<source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
- <translation type="unfinished"></translation>
+ <translation>Стойност от тип %1 трябва да съдържа четен брой цифри. Стойността %2 не съдържа.</translation>
</message>
<message>
<source>%1 is not valid as a value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е валидна като стойност от тип %2.</translation>
</message>
<message>
<source>Operator %1 cannot be used on type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Оператор %1 не може да се използва върху тип %2.</translation>
</message>
<message>
<source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Оператор %1 не може да се използва върху атомични стойности от тип %2 и %3.</translation>
</message>
<message>
<source>The namespace URI in the name for a computed attribute cannot be %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Именното URI пространство в името за изчислен атрибут не може да е %1.</translation>
</message>
<message>
<source>The name for a computed attribute cannot have the namespace URI %1 with the local name %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Името за изчислен атрибут не може да има именно URI пространство %1 с локално име %2.</translation>
</message>
<message>
<source>Type error in cast, expected %1, received %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Печатна грешка в изчислението, очаквано %1, получено %2.</translation>
</message>
<message>
<source>When casting to %1 or types derived from it, the source value must be of the same type, or it must be a string literal. Type %2 is not allowed.</source>
- <translation type="unfinished"></translation>
+ <translation>Когато се изчислява към %1 или типове, изхождащи от него, входящата стойност трябва да бъде от същия тип или трябва да е буквен низ. Тип %2 не е позволен.</translation>
</message>
<message>
<source>No casting is possible with %1 as the target type.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е възможно изчисление с %1 като целеви тип.</translation>
</message>
<message>
<source>It is not possible to cast from %1 to %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е възможно изчисление от %1 към %2.</translation>
</message>
<message>
<source>Casting to %1 is not possible because it is an abstract type, and can therefore never be instantiated.</source>
- <translation type="unfinished"></translation>
+ <translation>Изчисление към %1 не е възможно, защото е абстрактен тип, и в този случай никога няма да се представи.</translation>
</message>
<message>
<source>It's not possible to cast the value %1 of type %2 to %3</source>
- <translation type="unfinished"></translation>
+ <translation>Не е възможно изчисление на стойност %1 от тип %2 към %3</translation>
</message>
<message>
<source>Failure when casting from %1 to %2: %3</source>
- <translation type="unfinished"></translation>
+ <translation>Неуспешно изчисление от %1 към %2: %3</translation>
</message>
<message>
<source>A comment cannot contain %1</source>
- <translation type="unfinished"></translation>
+ <translation>Коментарът не може да съдържа %1</translation>
</message>
<message>
<source>A comment cannot end with a %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Коментарът не може да завърша с %1.</translation>
</message>
<message>
<source>No comparisons can be done involving the type %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Не може да се прави сравнение при използване на тип %1.</translation>
</message>
<message>
<source>Operator %1 is not available between atomic values of type %2 and %3.</source>
- <translation type="unfinished"></translation>
+ <translation>Оператор %1 не е наличен между атомични стойности от тип %2 и %3.</translation>
</message>
<message>
<source>An attribute node cannot be a child of a document node. Therefore, the attribute %1 is out of place.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибутен възел не може да е дете на документен възел. Следователно атрибутът %1 не е на мястото си.</translation>
</message>
<message>
<source>A library module cannot be evaluated directly. It must be imported from a main module.</source>
- <translation type="unfinished"></translation>
+ <translation>Библиотечен модул не може да се прилага директно. Трябва да е вмъкнат от основен модул.</translation>
</message>
<message>
<source>A value of type %1 cannot be a predicate. A predicate must have either a numeric type or an Effective Boolean Value type.</source>
- <translation type="unfinished"></translation>
+ <translation>Стойност от тип %1 не може да е предикат. Предикатът трябва да има или числов тип, или тип Ефективна Булева Стойност.</translation>
</message>
<message>
<source>A positional predicate must evaluate to a single numeric value.</source>
- <translation type="unfinished"></translation>
+ <translation>Позиционен предикат трябва да се прилага към единична числова стойност.</translation>
</message>
<message>
<source>The target name in a processing instruction cannot be %1 in any combination of upper and lower case. Therefore, is %2 invalid.</source>
- <translation type="unfinished"></translation>
+ <translation>Целевото име в изпълняваната инструкция не може да е %1 в каквато и да е комбинация от големи и малки букви. Следователно %2 не е валидно.</translation>
</message>
<message>
<source>%1 is not a valid target name in a processing instruction. It must be a %2 value, e.g. %3.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е валидно целево име в изпълняваната инструкция. Трябва да е стойност %2, например %3.</translation>
</message>
<message>
<source>The last step in a path must contain either nodes or atomic values. It cannot be a mixture between the two.</source>
- <translation type="unfinished"></translation>
+ <translation>Последната стъпка в пътя трябва да съдържа или възли, или атомични стойности. Не може да е смес от двете.</translation>
</message>
<message>
<source>The data of a processing instruction cannot contain the string %1</source>
- <translation type="unfinished"></translation>
+ <translation>Данните на изпълняваната инструкция не може да съдържат низ %1</translation>
</message>
<message>
<source>No namespace binding exists for the prefix %1</source>
- <translation type="unfinished"></translation>
+ <translation>Няма указано пространство от имена за префикс %1</translation>
</message>
<message>
<source>No namespace binding exists for the prefix %1 in %2</source>
- <translation type="unfinished"></translation>
+ <translation>Няма указано пространство от имена за префикс %1 в %2</translation>
</message>
<message>
<source>%1 is an invalid %2</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е валидно %2</translation>
</message>
<message numerus="yes">
<source>%1 takes at most %n argument(s). %2 is therefore invalid.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 поема най-много %n аргумент. Следователно %2 не е валидно.</numerusform>
+ <numerusform>%1 поема най-много %n аргумента. Следователно %2 не е валидно.</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%1 requires at least %n argument(s). %2 is therefore invalid.</source>
- <translation type="unfinished">
- <numerusform></numerusform>
+ <translation>
+ <numerusform>%1 изисква поне %n аргумент. Следователно %2 не е валидно.</numerusform>
+ <numerusform>%1 изисква поне %n аргумента. Следователно %2 не е валидно.</numerusform>
</translation>
</message>
<message>
<source>The first argument to %1 cannot be of type %2. It must be a numeric type, xs:yearMonthDuration or xs:dayTimeDuration.</source>
- <translation type="unfinished"></translation>
+ <translation>Първият аргумент към %1 не може да е от тип %2. Трябва да е числов тип, xs:yearMonthDuration или xs:dayTimeDuration.</translation>
</message>
<message>
<source>The first argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation type="unfinished"></translation>
+ <translation>Първият аргумент към %1 не може да е от тип %2. Трябва да е от тип %3, %4 или %5.</translation>
</message>
<message>
<source>The second argument to %1 cannot be of type %2. It must be of type %3, %4, or %5.</source>
- <translation type="unfinished"></translation>
+ <translation>Вторият аргумент към %1 не може да е от тип %2. Трябва да е от тип %3, %4 или %5.</translation>
</message>
<message>
<source>%1 is not a valid XML 1.0 character.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е валиден XML 1.0 символ.</translation>
</message>
<message>
<source>The first argument to %1 cannot be of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Първият аргумент към %1 не може да е от тип %2.</translation>
</message>
<message>
<source>If both values have zone offsets, they must have the same zone offset. %1 and %2 are not the same.</source>
- <translation type="unfinished"></translation>
+ <translation>Ако и двете стойности имат зоново отместване, те трябва да имат еднакво зоново отместване. %1 и %2 не са еднакви.</translation>
</message>
<message>
<source>%1 was called.</source>
- <translation type="unfinished"></translation>
+ <translation>Повикан е %1.</translation>
</message>
<message>
<source>%1 must be followed by %2 or %3, not at the end of the replacement string.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 трябва да е следван от %2 или %3, не в края на заместващия низ.</translation>
</message>
<message>
<source>In the replacement string, %1 must be followed by at least one digit when not escaped.</source>
- <translation type="unfinished"></translation>
+ <translation>В заместващия низ, %1 трябва да е следван от поне една цифра, когато не е ескейпнат.</translation>
</message>
<message>
<source>In the replacement string, %1 can only be used to escape itself or %2, not %3</source>
- <translation type="unfinished"></translation>
+ <translation>В заместващия низ, %1 може да се използва само за ескейпване на себе си или %2, не %3</translation>
</message>
<message>
<source>%1 matches newline characters</source>
- <translation type="unfinished"></translation>
+ <translation>%1 съвпада със символи за нов ред</translation>
</message>
<message>
<source>%1 and %2 match the start and end of a line.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 и %2 съвпадат с начало и край на линия.</translation>
</message>
<message>
<source>Matches are case insensitive</source>
- <translation type="unfinished"></translation>
+ <translation>Съвпаденията са нечувсвтителни към регистъра</translation>
</message>
<message>
<source>Whitespace characters are removed, except when they appear in character classes</source>
- <translation type="unfinished"></translation>
+ <translation>Празните символи са премахнати, освен участващите в символни класове</translation>
</message>
<message>
<source>%1 is an invalid regular expression pattern: %2</source>
- <translation type="unfinished"></translation>
+ <translation>%1 е невалиден модел за регулярен израз: %2</translation>
</message>
<message>
<source>%1 is an invalid flag for regular expressions. Valid flags are:</source>
- <translation type="unfinished"></translation>
+ <translation>%1 е невалиден флаг за регулярен израз. Валидните флагове са:</translation>
</message>
<message>
<source>If the first argument is the empty sequence or a zero-length string (no namespace), a prefix cannot be specified. Prefix %1 was specified.</source>
- <translation type="unfinished"></translation>
+ <translation>Ако първият аргумент е празна поредица или низ с нулева дължина (без пространство от имена), не може да бъде указан префикс. Указан е префик %1.</translation>
</message>
<message>
<source>It will not be possible to retrieve %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Няма да е възможно получаването на %1.</translation>
</message>
<message>
<source>The root node of the second argument to function %1 must be a document node. %2 is not a document node.</source>
- <translation type="unfinished"></translation>
+ <translation>Кореновият възел на втория аргумент към функция %1 трябва да е документен възел. %2 не е документен възел.</translation>
</message>
<message>
<source>The default collection is undefined</source>
- <translation type="unfinished"></translation>
+ <translation>Не е дефинирана колецията по подразбиране</translation>
</message>
<message>
<source>%1 cannot be retrieved</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не може да се получи</translation>
</message>
<message>
<source>The normalization form %1 is unsupported. The supported forms are %2, %3, %4, and %5, and none, i.e. the empty string (no normalization).</source>
- <translation type="unfinished"></translation>
+ <translation>Нормализационната форма %1 не се поддържа. Поддържаните форми са %2, %3, %4 и %5, и без, например празен низ (без нормализация).</translation>
</message>
<message>
<source>A zone offset must be in the range %1..%2 inclusive. %3 is out of range.</source>
- <translation type="unfinished"></translation>
+ <translation>Зоновото отместване трябва да е в обхвата %1..%2 включително. %3 е извън обхвата.</translation>
</message>
<message>
<source>%1 is not a whole number of minutes.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е цяло число от минути.</translation>
</message>
<message>
<source>Required cardinality is %1; got cardinality %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Изискваната кардиналност е %1, получена кардиналност %2.</translation>
</message>
<message>
<source>The item %1 did not match the required type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Елементът %1 не съвпада с изисквания тип %2.</translation>
</message>
<message>
<source>%1 is an unknown schema type.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е тип схема.</translation>
</message>
<message>
<source>Only one %1 declaration can occur in the query prolog.</source>
- <translation type="unfinished"></translation>
+ <translation>Само една %1 декларация може да присъства в пролога на заявката.</translation>
</message>
<message>
<source>The initialization of variable %1 depends on itself</source>
- <translation type="unfinished"></translation>
+ <translation>Инициализирането на променлива %1 зависи от себе си</translation>
</message>
<message>
<source>No variable by name %1 exists</source>
- <translation type="unfinished"></translation>
+ <translation>Променлива с име %1 не съществува</translation>
</message>
<message>
<source>The variable %1 is unused</source>
- <translation type="unfinished"></translation>
+ <translation>Променливата %1 не се използва</translation>
</message>
<message>
<source>Version %1 is not supported. The supported XQuery version is 1.0.</source>
- <translation type="unfinished"></translation>
+ <translation>Версия %1 е неподдържана. Поддържаната XQuery версия е 1.0.</translation>
</message>
<message>
<source>The encoding %1 is invalid. It must contain Latin characters only, must not contain whitespace, and must match the regular expression %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Кодировката %1 е невалидна. Трябва да съдържа само латински символи, трябва да не съдържа празни символи и трябва да съвпада с регулярния израз %2.</translation>
</message>
<message>
<source>No function with signature %1 is available</source>
- <translation type="unfinished"></translation>
+ <translation>Функция с подпис %1 не е налична</translation>
</message>
<message>
<source>A default namespace declaration must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
+ <translation>Декларацията за пространство от имена по подразбиране трябва да е преди функция, променлива и допълнителни декларации.</translation>
</message>
<message>
<source>Namespace declarations must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
+ <translation>Декларациите за пространство от имена трябва да са преди функция, променлива и допълнителни декларации.</translation>
</message>
<message>
<source>Module imports must occur before function, variable, and option declarations.</source>
- <translation type="unfinished"></translation>
+ <translation>Внасянето на модули трябва да е преди функция, променлива и допълнителни декларации.</translation>
</message>
<message>
<source>It is not possible to redeclare prefix %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е възможно предекларирането на префикс %1.</translation>
</message>
<message>
<source>Only the prefix %1 can be declared to bind the namespace %2. By default, it is already bound to the prefix %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Само префиксът %1 може да се декларира за указване на пространство от имена %2. По подразбиране вече е указано към префикс %1.</translation>
</message>
<message>
<source>Prefix %1 is already declared in the prolog.</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс %1 вече е деклариран в пролога.</translation>
</message>
<message>
<source>The name of an option must have a prefix. There is no default namespace for options.</source>
- <translation type="unfinished"></translation>
+ <translation>Името на опцията трябва да има префикс. По подразбиране няма пространство от имена за опции.</translation>
</message>
<message>
<source>The Schema Import feature is not supported, and therefore %1 declarations cannot occur.</source>
- <translation type="unfinished"></translation>
+ <translation>Функцията Внасяне на схема не се поддържа, следователно %1 декларации не може да има.</translation>
</message>
<message>
<source>The target namespace of a %1 cannot be empty.</source>
- <translation type="unfinished"></translation>
+ <translation>Целевото пространство от имена от %1 не може да е празно.</translation>
</message>
<message>
<source>The module import feature is not supported</source>
- <translation type="unfinished"></translation>
+ <translation>Функцията за внадяне на модул не се поддържа</translation>
</message>
<message>
<source>A variable by name %1 has already been declared in the prolog.</source>
- <translation type="unfinished"></translation>
+ <translation>Променлива с име %1 вече е декларирана в пролога.</translation>
</message>
<message>
<source>No value is available for the external variable by name %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е налична стойност за външната променлива с име %1.</translation>
</message>
<message>
<source>The namespace for a user defined function cannot be empty (try the predefined prefix %1 which exists for cases like this)</source>
- <translation type="unfinished"></translation>
+ <translation>Пространството от имена за потребителски дефинирана функция не може да е празно (опитайте предефинирания префикс %1, който съществува за случаи като този)</translation>
</message>
<message>
<source>The namespace %1 is reserved; therefore user defined functions may not use it. Try the predefined prefix %2, which exists for these cases.</source>
- <translation type="unfinished"></translation>
+ <translation>Пространството от имена %1 е запазено, следователно потребителски дефинираните функции не могат да го ползват. Опитайте предефинирания префикс %2, който съществува за случаи като този.</translation>
</message>
<message>
<source>The namespace of a user defined function in a library module must be equivalent to the module namespace. In other words, it should be %1 instead of %2</source>
- <translation type="unfinished"></translation>
+ <translation>Пространството от имена за потребителски дефинирана функция в библиотечен модул трябва да е еквивалентен на модула за пространство от имена, трябва да е %1 вместо %2</translation>
</message>
<message>
<source>A function already exists with the signature %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Вече съществува функция с подпис %1.</translation>
</message>
<message>
<source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
- <translation type="unfinished"></translation>
+ <translation>Не се поддържат външни функции. Всички поддържани функции могат да се използват директно, без да се декларират предварително като външни</translation>
</message>
<message>
<source>An argument by name %1 has already been declared. Every argument name must be unique.</source>
- <translation type="unfinished"></translation>
+ <translation>Аргумент с име %1 вече е деклариран. Имената на аргументите трябва да са уникални.</translation>
</message>
<message>
<source>The name of a variable bound in a for-expression must be different from the positional variable. Hence, the two variables named %1 collide.</source>
- <translation type="unfinished"></translation>
+ <translation>Името на променлива, указана за израз, трябва да е различна от позиционална променлива. Следователно променливите с имена %1 си противоречат.</translation>
</message>
<message>
<source>The Schema Validation Feature is not supported. Hence, %1-expressions may not be used.</source>
- <translation type="unfinished"></translation>
+ <translation>Функцията за валидация на схеми не се поддържа. Следователно %1 изрази не могат да се ползват.</translation>
</message>
<message>
<source>None of the pragma expressions are supported. Therefore, a fallback expression must be present</source>
- <translation type="unfinished"></translation>
+ <translation>Никой от прагма изразите не се поддържа. Следователно трябва да има наличен авариен израз</translation>
</message>
<message>
<source>The %1-axis is unsupported in XQuery</source>
- <translation type="unfinished"></translation>
+ <translation>Оста %1 не се поддържа в XQuery</translation>
</message>
<message>
<source>%1 is not a valid numeric literal.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е валиден числов литерал.</translation>
</message>
<message>
<source>No function by name %1 is available.</source>
- <translation type="unfinished"></translation>
+ <translation>Няма налична функция с име %1.</translation>
</message>
<message>
<source>The namespace URI cannot be the empty string when binding to a prefix, %1.</source>
- <translation type="unfinished"></translation>
+ <translation>URI пространството от имена не може да е празен низ, когато се указва към префикс, %1.</translation>
</message>
<message>
<source>%1 is an invalid namespace URI.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 е невалидно URI пространство от имена.</translation>
</message>
<message>
<source>It is not possible to bind to the prefix %1</source>
- <translation type="unfinished"></translation>
+ <translation>Не може да се укаже към префикс %1</translation>
</message>
<message>
<source>Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished"></translation>
+ <translation>Пространство от имена %1 може да се укаже само към %2 (и то е във всеки случай предекларирано).</translation>
</message>
<message>
<source>Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).</source>
- <translation type="unfinished"></translation>
+ <translation>Префикс %1 може да се укаже само към %2 (и той е във всеки случай предеклариран).</translation>
</message>
<message>
<source>Two namespace declaration attributes have the same name: %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Два атрибута за декларации на пространство от имена имат едно и също име: %1.</translation>
</message>
<message>
<source>The namespace URI must be a constant and cannot use enclosed expressions.</source>
- <translation type="unfinished"></translation>
+ <translation>URI пространството от имена трябва да е константа или не може да използва заградени изрази.</translation>
</message>
<message>
<source>An attribute by name %1 has already appeared on this element.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут с име %1 вече има към този елемент.</translation>
</message>
<message>
<source>A direct element constructor is not well-formed. %1 is ended with %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Директен конструктор на елементи не е формиран добре. %1 завършва с %2.</translation>
</message>
<message>
<source>The name %1 does not refer to any schema type.</source>
- <translation type="unfinished"></translation>
+ <translation>Името %1 не води към никой тип схема.</translation>
</message>
<message>
<source>%1 is an complex type. Casting to complex types is not possible. However, casting to atomic types such as %2 works.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 е комплексен тип. Изчисление към комплесни типове е невъзможно. Следователно изчисление към атомични типове като %2 работи.</translation>
</message>
<message>
<source>%1 is not an atomic type. Casting is only possible to atomic types.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е атомичен тип. Възможно е изчисление само към атомични типове.</translation>
</message>
<message>
<source>%1 is not a valid name for a processing-instruction. Therefore this name test will never match.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е валидно име за изпълняваната инструкция. Следователно тази проба на името никога няма да съвпадне.</translation>
</message>
<message>
<source>%1 is not in the in-scope attribute declarations. Note that the schema import feature is not supported.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 не е в обхватните атрибутни декларации. Имайте предвид, че функцията за внасяне на схема не се поддържа.</translation>
</message>
<message>
<source>The name of an extension expression must be in a namespace.</source>
- <translation type="unfinished"></translation>
+ <translation>Името на разширителен израз трябва да е в пространство от имена.</translation>
</message>
<message>
<source>empty</source>
- <translation type="unfinished"></translation>
+ <translation>празно</translation>
</message>
<message>
<source>zero or one</source>
- <translation type="unfinished"></translation>
+ <translation>нула или едно</translation>
</message>
<message>
<source>exactly one</source>
- <translation type="unfinished"></translation>
+ <translation>точно едно</translation>
</message>
<message>
<source>one or more</source>
- <translation type="unfinished"></translation>
+ <translation>едно или повече</translation>
</message>
<message>
<source>zero or more</source>
- <translation type="unfinished"></translation>
+ <translation>нула или повече</translation>
</message>
<message>
<source>Required type is %1, but %2 was found.</source>
- <translation type="unfinished"></translation>
+ <translation>Изисква се тип %1, но %2 е намерен.</translation>
</message>
<message>
<source>Promoting %1 to %2 may cause loss of precision.</source>
- <translation type="unfinished"></translation>
+ <translation>Указването на %1 към %2 може да предизвика загуба на точност.</translation>
</message>
<message>
<source>The focus is undefined.</source>
- <translation type="unfinished"></translation>
+ <translation>Фокусът не е дефиниран.</translation>
</message>
<message>
<source>It's not possible to add attributes after any other kind of node.</source>
- <translation type="unfinished"></translation>
+ <translation>Не е възможно добавянето на атрибути след всеки друг вид възли.</translation>
</message>
<message>
<source>An attribute by name %1 has already been created.</source>
- <translation type="unfinished"></translation>
+ <translation>Атрибут с име %1 вече е създаден.</translation>
</message>
<message>
<source>Only the Unicode Codepoint Collation is supported(%1). %2 is unsupported.</source>
- <translation type="unfinished"></translation>
+ <translation>Поддържа се само Уникод Кодова Съпоставка(%1). %2 не се поддържа.</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_it.ts b/src/VBox/Frontends/VirtualBox/nls/qt_it.ts
index f7d3a1a..38d66cc 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_it.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_it.ts
@@ -1661,7 +1661,7 @@ Vuoi eliminarlo comunque?</translation>
</message>
<message>
<source>Server closed connection unexpectedly</source>
- <translation>Il server ha terminato inaspettatamente la connessione </translation>
+ <translation>Il server ha terminato inaspettatamente la connessione</translation>
</message>
<message>
<source>Connection refused</source>
@@ -1857,7 +1857,7 @@ Vuoi eliminarlo comunque?</translation>
</message>
<message>
<source>No space left on device</source>
- <translation>Non è rimasto spazio sul dispositivo</translation>
+ <translation>Spazio insufficiente sul dispositivo</translation>
</message>
<message>
<source>Unknown error</source>
@@ -1927,11 +1927,11 @@ Vuoi eliminarlo comunque?</translation>
</message>
<message>
<source>The file '%1' is not a valid Qt plugin.</source>
- <translation>Il file «%1» non è un'estensione Qt valida.</translation>
+ <translation>Il file '%1' non è un'estensione Qt valida.</translation>
</message>
<message>
<source>The plugin '%1' uses incompatible Qt library. (Cannot mix debug and release libraries.)</source>
- <translation>L'estensione «%1» utilizza una libreria Qt incompatibile. (Non è possibile mischiare librerie di debug e di rilascio.)</translation>
+ <translation>L'estensione '%1' utilizza una libreria Qt incompatibile. (Non è possibile mischiare librerie di debug e di rilascio.)</translation>
</message>
</context>
<context>
@@ -2442,19 +2442,19 @@ Vuoi eliminarlo comunque?</translation>
<name>QOCIResult</name>
<message>
<source>Unable to bind column for batch execute</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Impossibile associare la colonna per l'esecuzione sequenziale</translation>
</message>
<message>
<source>Unable to execute batch statement</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Impossibile eseguire l'istruzione sequenziale</translation>
</message>
<message>
<source>Unable to goto next</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Impossibile spostarsi al successivo</translation>
</message>
<message>
<source>Unable to alloc statement</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Impossibile allocare l'istruzione</translation>
</message>
<message>
<source>Unable to prepare statement</source>
@@ -3516,39 +3516,39 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>Bass Up</source>
- <translation type="unfinished"></translation>
+ <translation>Aumenta bassi</translation>
</message>
<message>
<source>Bass Down</source>
- <translation type="unfinished"></translation>
+ <translation>Riduci bassi</translation>
</message>
<message>
<source>Treble Up</source>
- <translation type="unfinished"></translation>
+ <translation>Aumenta alti</translation>
</message>
<message>
<source>Treble Down</source>
- <translation type="unfinished"></translation>
+ <translation>Riduci alti</translation>
</message>
<message>
<source>Media Play</source>
- <translation type="unfinished"></translation>
+ <translation>Media Riproduci</translation>
</message>
<message>
<source>Media Stop</source>
- <translation type="unfinished"></translation>
+ <translation>Media Ferma</translation>
</message>
<message>
<source>Media Previous</source>
- <translation type="unfinished"></translation>
+ <translation>Media Precedente</translation>
</message>
<message>
<source>Media Next</source>
- <translation type="unfinished"></translation>
+ <translation>Media Successivo</translation>
</message>
<message>
<source>Media Record</source>
- <translation type="unfinished"></translation>
+ <translation>Media Registra</translation>
</message>
<message>
<source>Favorites</source>
@@ -3560,7 +3560,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>Standby</source>
- <translation type="unfinished"></translation>
+ <translation>Standby</translation>
</message>
<message>
<source>Open URL</source>
@@ -3778,7 +3778,7 @@ Scegli un nome diverso.</translation>
<name>QSocks5SocketEngine</name>
<message>
<source>Socks5 timeout error connecting to socks server</source>
- <translation>Connessione al server Socks5 fuori tempo massimo </translation>
+ <translation>Connessione al server Socks5 fuori tempo massimo</translation>
</message>
<message>
<source>Network operation timed out</source>
@@ -4475,19 +4475,19 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>version expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>versione attesa durante la lettura della dichiarazione XML</translation>
</message>
<message>
<source>wrong value for standalone declaration</source>
- <translation type="unfinished"></translation>
+ <translation>valore errato per la dichiarazione autonoma</translation>
</message>
<message>
<source>encoding declaration or standalone declaration expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>dichiarazione di codifica o dichiarazione autonoma attesa durante la lettura della dichiarazione XML</translation>
</message>
<message>
<source>standalone declaration expected while reading the XML declaration</source>
- <translation type="unfinished"></translation>
+ <translation>dichiarazione autonoma attesa durante la lettura della dichiarazione XML</translation>
</message>
<message>
<source>error occurred while parsing document type definition</source>
@@ -4626,15 +4626,15 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>%1 is an invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 non è un nome valido dell'istruzione di elaborazione.</translation>
</message>
<message>
<source>Invalid processing instruction name.</source>
- <translation type="unfinished"></translation>
+ <translation>Nome dell'istruzione di elaborazione non valido.</translation>
</message>
<message>
<source>Illegal namespace declaration.</source>
- <translation type="unfinished"></translation>
+ <translation>Dichiarazione dello spazio dei nomi non consentita.</translation>
</message>
<message>
<source>Invalid XML name.</source>
@@ -4654,7 +4654,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>Reference to external entity '%1' in attribute value.</source>
- <translation type="unfinished"></translation>
+ <translation>Riferimento all'entità esterna '%1' nel valore dell'attributo.</translation>
</message>
<message>
<source>Invalid character reference.</source>
@@ -4737,7 +4737,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>No operand in an integer division, %1, can be %2.</source>
- <translation type="unfinished"></translation>
+ <translation>Nessun operando in una divisione intera, %1, può essere %2.</translation>
</message>
<message>
<source>The first operand in an integer division, %1, cannot be infinity (%2).</source>
@@ -4789,11 +4789,11 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>Value %1 of type %2 exceeds maximum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Il valore %1 di tipo %2 supera il massimo (%3).</translation>
</message>
<message>
<source>Value %1 of type %2 is below minimum (%3).</source>
- <translation type="unfinished"></translation>
+ <translation>Il valore %1 di tipo %2 è sotto il minimo (%3).</translation>
</message>
<message>
<source>A value of type %1 must contain an even number of digits. The value %2 does not.</source>
@@ -4801,11 +4801,11 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>%1 is not valid as a value of type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 non è un valore valido di tipo %2.</translation>
</message>
<message>
<source>Operator %1 cannot be used on type %2.</source>
- <translation type="unfinished"></translation>
+ <translation>L'operatore %1 non può essere utilizzato per il tipo %2.</translation>
</message>
<message>
<source>Operator %1 cannot be used on atomic values of type %2 and %3.</source>
@@ -4965,7 +4965,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>%1 and %2 match the start and end of a line.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 e %2 corrispondo all'inizio e alla fine di una riga.</translation>
</message>
<message>
<source>Matches are case insensitive</source>
@@ -4997,7 +4997,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>The default collection is undefined</source>
- <translation type="unfinished"></translation>
+ <translation>La raccolta predefinita non è specificata</translation>
</message>
<message>
<source>%1 cannot be retrieved</source>
@@ -5013,7 +5013,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>%1 is not a whole number of minutes.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 non è un numero intero di minuti.</translation>
</message>
<message>
<source>Required cardinality is %1; got cardinality %2.</source>
@@ -5053,7 +5053,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>No function with signature %1 is available</source>
- <translation type="unfinished"></translation>
+ <translation>Non è disponibile alcuna funzione con firma '%1'</translation>
</message>
<message>
<source>A default namespace declaration must occur before function, variable, and option declarations.</source>
@@ -5089,7 +5089,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>The target namespace of a %1 cannot be empty.</source>
- <translation type="unfinished"></translation>
+ <translation>Lo spazio dei nomi di destinazione di un %1 non può essere vuoto.</translation>
</message>
<message>
<source>The module import feature is not supported</source>
@@ -5117,7 +5117,7 @@ Scegli un nome diverso.</translation>
</message>
<message>
<source>A function already exists with the signature %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Una funzione con firma %1 esiste già.</translation>
</message>
<message>
<source>No external functions are supported. All supported functions can be used directly, without first declaring them as external</source>
diff --git a/src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts b/src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts
index 58b17b0..be2ff11 100644
--- a/src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts
+++ b/src/VBox/Frontends/VirtualBox/nls/qt_zh_TW.ts
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
-<TS version="2.0" language="zh_TW">
+<TS version="2.0" language="zh_TW" sourcelanguage="en">
<context>
<name>MAC_APPLICATION_MENU</name>
<message>
@@ -103,7 +103,7 @@ have libgstreamer-plugins-base installed.</source>
</message>
<message numerus="yes">
<source>A required codec is missing. You need to install the following codec(s) to play this content: %0</source>
- <translation>
+ <translation type="unfinished">
<numerusform>遺失所需的轉碼器。 您需要安裝以下轉碼器以播放這個內容: %0</numerusform>
</translation>
</message>
@@ -590,7 +590,7 @@ to
</message>
<message>
<source>Holds the name of the window and contains controls to manipulate it</source>
- <translation>視窗所使用的名稱並包含對其進行操作的控制項</translation>
+ <translation>保留視窗的名稱並包含對其進行操作的控制項</translation>
</message>
</context>
<context>
@@ -674,7 +674,7 @@ to
</message>
<message>
<source>Socket operation timed out</source>
- <translation>通訊端操作未逾時</translation>
+ <translation>通訊端操作逾時</translation>
</message>
<message>
<source>Socket is not connected</source>
@@ -928,7 +928,7 @@ to
<name>QDialog</name>
<message>
<source>What's This?</source>
- <translation>這是? </translation>
+ <translation>這是?</translation>
</message>
<message>
<source>Done</source>
@@ -1122,7 +1122,7 @@ to
<source>%1 already exists.
Do you want to replace it?</source>
<translation>%1 已經存在。
-您要取代它嗎? </translation>
+您要取代它嗎?</translation>
</message>
<message>
<source>%1
@@ -1184,11 +1184,11 @@ Please verify the correct directory name was given.</source>
<source>'%1' is write protected.
Do you want to delete it anyway?</source>
<translation>「%1」有寫入保護。
-您仍然要刪除嗎? </translation>
+您仍然要刪除嗎?</translation>
</message>
<message>
<source>Are sure you want to delete '%1'?</source>
- <translation>您確定要刪除「%1」嗎? </translation>
+ <translation>您確定要刪除「%1」嗎?</translation>
</message>
<message>
<source>Could not delete directory.</source>
@@ -2101,7 +2101,7 @@ Do you want to delete it anyway?</source>
<name>QMdiArea</name>
<message>
<source>(Untitled)</source>
- <translation> (未命名) </translation>
+ <translation>(未命名)</translation>
</message>
</context>
<context>
@@ -2263,7 +2263,7 @@ Do you want to delete it anyway?</source>
</message>
<message>
<source>Unsupported socket operation</source>
- <translation>未支援的通訊端操作</translation>
+ <translation>不支援的通訊端操作</translation>
</message>
<message>
<source>Protocol type not supported</source>
@@ -2299,7 +2299,7 @@ Do you want to delete it anyway?</source>
</message>
<message>
<source>The address is protected</source>
- <translation>位址不受保護</translation>
+ <translation>位址受到保護</translation>
</message>
<message>
<source>Unable to send a message</source>
@@ -2741,7 +2741,7 @@ Please choose a different file name.</source>
<source>%1 already exists.
Do you want to overwrite it?</source>
<translation>%1 已經存在。
-您要覆寫它嗎? </translation>
+您要覆寫它嗎?</translation>
</message>
<message>
<source>%1 is a directory.
@@ -3804,7 +3804,7 @@ Please choose a different file name.</source>
</message>
<message>
<source>Delete this record?</source>
- <translation>刪除這個紀錄嗎? </translation>
+ <translation>刪除這個紀錄嗎?</translation>
</message>
<message>
<source>Yes</source>
@@ -3824,7 +3824,7 @@ Please choose a different file name.</source>
</message>
<message>
<source>Save edits?</source>
- <translation>儲存編輯嗎? </translation>
+ <translation>儲存編輯嗎?</translation>
</message>
<message>
<source>Cancel</source>
@@ -3836,7 +3836,7 @@ Please choose a different file name.</source>
</message>
<message>
<source>Cancel your edits?</source>
- <translation>取消您的編輯嗎? </translation>
+ <translation>取消您的編輯嗎?</translation>
</message>
</context>
<context>
@@ -4319,7 +4319,7 @@ Please choose a different file name.</source>
<name>QWhatsThisAction</name>
<message>
<source>What's This?</source>
- <translation>這是? </translation>
+ <translation>這是?</translation>
</message>
</context>
<context>
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV.c b/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV.c
index 332cef6..7caed50 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV.c
@@ -1,3 +1,4 @@
+/* $Id: cconvAYUV.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uSrcTex;
void vboxCConvApplyAYUV(vec4 color);
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV_void.c b/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV_void.c
index 8e8d7bb..40d59ff 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV_void.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvAYUV_void.c
@@ -1,2 +1,3 @@
+/* $Id: cconvAYUV_void.c $ */
void vboxCConv()
{}
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvApplyAYUV.c b/src/VBox/Frontends/VirtualBox/shaders/cconvApplyAYUV.c
index 8625b1c..9db3d92 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvApplyAYUV.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvApplyAYUV.c
@@ -1,3 +1,4 @@
+/* $Id: cconvApplyAYUV.c $ */
void vboxCConvApplyAYUV(vec4 color)
{
float y, u, v, r, g, b;
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvBGR.c b/src/VBox/Frontends/VirtualBox/shaders/cconvBGR.c
index 898bb70..6f839e5 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvBGR.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvBGR.c
@@ -1,3 +1,4 @@
+/* $Id: cconvBGR.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uSrcTex;
void vboxCConv()
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvBGR_void.c b/src/VBox/Frontends/VirtualBox/shaders/cconvBGR_void.c
index 8e8d7bb..dab037c 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvBGR_void.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvBGR_void.c
@@ -1,2 +1,3 @@
+/* $Id: cconvBGR_void.c $ */
void vboxCConv()
{}
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY.c b/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY.c
index 108c43b..a228455 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY.c
@@ -1,3 +1,4 @@
+/* $Id: cconvUYVY.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uSrcTex;
void vboxCConvApplyAYUV(vec4 color);
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY_void.c b/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY_void.c
index 8e8d7bb..af49276 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY_void.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvUYVY_void.c
@@ -1,2 +1,3 @@
+/* $Id: cconvUYVY_void.c $ */
void vboxCConv()
{}
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2.c b/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2.c
index fa8ebb9..7220888 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2.c
@@ -1,3 +1,4 @@
+/* $Id: cconvYUY2.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uSrcTex;
void vboxCConvApplyAYUV(vec4 color);
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2_void.c b/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2_void.c
index 8e8d7bb..a199fde 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2_void.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvYUY2_void.c
@@ -1,2 +1,3 @@
+/* $Id: cconvYUY2_void.c $ */
void vboxCConv()
{}
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvYV12.c b/src/VBox/Frontends/VirtualBox/shaders/cconvYV12.c
index 08240db..8ad7d23 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvYV12.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvYV12.c
@@ -1,3 +1,4 @@
+/* $Id: cconvYV12.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uSrcTex;
uniform sampler2DRect uVTex;
diff --git a/src/VBox/Frontends/VirtualBox/shaders/cconvYV12_void.c b/src/VBox/Frontends/VirtualBox/shaders/cconvYV12_void.c
index 8e8d7bb..0e4f62e 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/cconvYV12_void.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/cconvYV12_void.c
@@ -1,2 +1,3 @@
+/* $Id: cconvYV12_void.c $ */
void vboxCConv()
{}
diff --git a/src/VBox/Frontends/VirtualBox/shaders/ckeyDst.c b/src/VBox/Frontends/VirtualBox/shaders/ckeyDst.c
index 808f5ec..e4399e2 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/ckeyDst.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/ckeyDst.c
@@ -1,3 +1,4 @@
+/* $Id: ckeyDst.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uDstTex;
uniform vec4 uDstClr;
diff --git a/src/VBox/Frontends/VirtualBox/shaders/ckeyDst2.c b/src/VBox/Frontends/VirtualBox/shaders/ckeyDst2.c
index ba00805..7532586 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/ckeyDst2.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/ckeyDst2.c
@@ -1,3 +1,4 @@
+/* $Id: ckeyDst2.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uDstTex;
uniform vec4 uDstClr;
diff --git a/src/VBox/Frontends/VirtualBox/shaders/ckeyDst_void.c b/src/VBox/Frontends/VirtualBox/shaders/ckeyDst_void.c
index 8777874..eab01bd 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/ckeyDst_void.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/ckeyDst_void.c
@@ -1,3 +1,4 @@
+/* $Id: ckeyDst_void.c $ */
void vboxCKeyDst(void)
{
}
diff --git a/src/VBox/Frontends/VirtualBox/shaders/mainOverlay.c b/src/VBox/Frontends/VirtualBox/shaders/mainOverlay.c
index 37e31fd..1d58bb5 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/mainOverlay.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/mainOverlay.c
@@ -1,3 +1,4 @@
+/* $Id: mainOverlay.c $ */
void vboxCKeyDst(void);
void vboxCConv();
void main(void)
diff --git a/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoCKey.c b/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoCKey.c
index a6ee783..df65f64 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoCKey.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoCKey.c
@@ -1,3 +1,4 @@
+/* $Id: mainOverlayNoCKey.c $ */
void vboxCConv();
void main(void)
{
diff --git a/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoDiscard.c b/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoDiscard.c
index 8822368..a13e28c 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoDiscard.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoDiscard.c
@@ -1,3 +1,4 @@
+/* $Id: mainOverlayNoDiscard.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uDstTex;
uniform vec4 uDstClr;
diff --git a/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoDiscard2.c b/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoDiscard2.c
index 38ea104..5bdf193 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoDiscard2.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/mainOverlayNoDiscard2.c
@@ -1,3 +1,4 @@
+/* $Id: mainOverlayNoDiscard2.c $ */
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect uDstTex;
uniform vec4 uDstClr;
diff --git a/src/VBox/Frontends/VirtualBox/shaders/splitBGRA.c b/src/VBox/Frontends/VirtualBox/shaders/splitBGRA.c
index 359b6fa..17a5c55 100644
--- a/src/VBox/Frontends/VirtualBox/shaders/splitBGRA.c
+++ b/src/VBox/Frontends/VirtualBox/shaders/splitBGRA.c
@@ -1,3 +1,4 @@
+/* $Id: splitBGRA.c $ */
float vboxSplitBGRA(vec4 color, float coord)
{
int pix = int(coord);
diff --git a/src/VBox/Frontends/VirtualBox/src/UIMediumTypeChangeDialog.h b/src/VBox/Frontends/VirtualBox/src/UIMediumTypeChangeDialog.h
index 307ca57..7c639a8 100644
--- a/src/VBox/Frontends/VirtualBox/src/UIMediumTypeChangeDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/UIMediumTypeChangeDialog.h
@@ -1,3 +1,4 @@
+/* $Id: UIMediumTypeChangeDialog.h $ */
/** @file
* VBox Qt GUI - UIMediumTypeChangeDialog class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.h b/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.h
index 0cd09b7..8d3228a 100644
--- a/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/UIVMInfoDialog.h
@@ -1,3 +1,4 @@
+/* $Id: UIVMInfoDialog.h $ */
/** @file
* VBox Qt GUI - UIVMInfoDialog class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.h b/src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.h
index 5f6c7d7..8b156ab 100644
--- a/src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.h
+++ b/src/VBox/Frontends/VirtualBox/src/UIVMLogViewer.h
@@ -1,3 +1,4 @@
+/* $Id: UIVMLogViewer.h $ */
/** @file
* VBox Qt GUI - UIVMLogViewer class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h b/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h
index 3ce1723..e7fa18d 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxAboutDlg.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxAboutDlg.h $ */
/** @file
* VBox Qt GUI - VBoxAboutDlg class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h b/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h
index 4c7e2e7..21053d0 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlay.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
* VBox Qt GUI - VBoxFrameBuffer Overly classes declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlayCommon.h b/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlayCommon.h
index 8cbeacc..6361428 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlayCommon.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxFBOverlayCommon.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
* VBox Qt GUI - VBoxFrameBuffer Overlay classes declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.cpp b/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.cpp
index 07f27bc..d90d9dc 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.cpp
@@ -66,7 +66,6 @@ VBoxGlobalSettingsData::VBoxGlobalSettingsData()
maxGuestRes = "auto";
remapScancodes = QString::null;
proxySettings = QString::null;
- presentationModeEnabled = false;
hostScreenSaverDisabled = false;
}
@@ -79,7 +78,6 @@ VBoxGlobalSettingsData::VBoxGlobalSettingsData (const VBoxGlobalSettingsData &th
maxGuestRes = that.maxGuestRes;
remapScancodes = that.remapScancodes;
proxySettings = that.proxySettings;
- presentationModeEnabled = that.presentationModeEnabled;
hostScreenSaverDisabled = that.hostScreenSaverDisabled;
}
@@ -97,7 +95,6 @@ bool VBoxGlobalSettingsData::operator== (const VBoxGlobalSettingsData &that) con
maxGuestRes == that.maxGuestRes &&
remapScancodes == that.remapScancodes &&
proxySettings == that.proxySettings &&
- presentationModeEnabled == that.presentationModeEnabled &&
hostScreenSaverDisabled == that.hostScreenSaverDisabled
);
}
@@ -127,9 +124,6 @@ gPropertyMap[] =
{ "GUI/MaxGuestResolution", "maxGuestRes", "\\d*[1-9]\\d*,\\d*[1-9]\\d*|any|auto", true },
{ "GUI/RemapScancodes", "remapScancodes", "(\\d+=\\d+,)*\\d+=\\d+", true },
{ "GUI/ProxySettings", "proxySettings", "[\\s\\S]*", true },
-#ifdef Q_WS_MAC
- { GUI_PresentationModeEnabled, "presentationModeEnabled", "true|false", true },
-#endif /* Q_WS_MAC */
{ "GUI/HostScreenSaverDisabled", "hostScreenSaverDisabled", "true|false", true }
};
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.h b/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.h
index 87610aa..53c6838 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxGlobalSettings.h $ */
/** @file
* VBox Qt GUI - VBoxGlobalSettingsData, VBoxGlobalSettings class declarations.
*/
@@ -42,7 +43,6 @@ private:
QString maxGuestRes;
QString remapScancodes;
QString proxySettings;
- bool presentationModeEnabled;
bool hostScreenSaverDisabled;
friend class VBoxGlobalSettings;
@@ -60,7 +60,6 @@ class VBoxGlobalSettings : public QObject, public CIShared <VBoxGlobalSettingsDa
Q_PROPERTY (QString maxGuestRes READ maxGuestRes WRITE setMaxGuestRes)
Q_PROPERTY (QString remapScancodes READ remapScancodes WRITE setRemapScancodes)
Q_PROPERTY (QString proxySettings READ proxySettings WRITE setProxySettings)
- Q_PROPERTY (bool presentationModeEnabled READ presentationModeEnabled WRITE setPresentationModeEnabled)
Q_PROPERTY (bool hostScreenSaverDisabled READ hostScreenSaverDisabled WRITE setHostScreenSaverDisabled)
public:
@@ -117,12 +116,6 @@ public:
mData()->proxySettings = aProxySettings;
}
- bool presentationModeEnabled() const { return data()->presentationModeEnabled; }
- void setPresentationModeEnabled (bool enabled)
- {
- mData()->presentationModeEnabled = enabled;
- }
-
bool hostScreenSaverDisabled() const { return data()->hostScreenSaverDisabled; }
void setHostScreenSaverDisabled (bool disabled)
{
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxLicenseViewer.h b/src/VBox/Frontends/VirtualBox/src/VBoxLicenseViewer.h
index 0eb7b9f..0d596c4 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxLicenseViewer.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxLicenseViewer.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxLicenseViewer.h $ */
/** @file
* VBox Qt GUI - VBoxLicenseViewer class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxSnapshotDetailsDlg.h b/src/VBox/Frontends/VirtualBox/src/VBoxSnapshotDetailsDlg.h
index a6ba98e..2eeb078 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxSnapshotDetailsDlg.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxSnapshotDetailsDlg.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxSnapshotDetailsDlg.h $ */
/** @file
* VBox Qt GUI - VBoxSnapshotDetailsDlg class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxTakeSnapshotDlg.h b/src/VBox/Frontends/VirtualBox/src/VBoxTakeSnapshotDlg.h
index c70e470..f4e2722 100644
--- a/src/VBox/Frontends/VirtualBox/src/VBoxTakeSnapshotDlg.h
+++ b/src/VBox/Frontends/VirtualBox/src/VBoxTakeSnapshotDlg.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxTakeSnapshotDlg.h $ */
/** @file
* VBox Qt GUI - VBoxTakeSnapshotDlg class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/converter/UIConverter.h b/src/VBox/Frontends/VirtualBox/src/converter/UIConverter.h
index 7edb84f..9f40ccb 100644
--- a/src/VBox/Frontends/VirtualBox/src/converter/UIConverter.h
+++ b/src/VBox/Frontends/VirtualBox/src/converter/UIConverter.h
@@ -1,3 +1,4 @@
+/* $Id: UIConverter.h $ */
/** @file
* VBox Qt GUI - UIConverter declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h b/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h
index 2be4643..a455080 100644
--- a/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h
+++ b/src/VBox/Frontends/VirtualBox/src/converter/UIConverterBackend.h
@@ -1,3 +1,4 @@
+/* $Id: UIConverterBackend.h $ */
/** @file
* VBox Qt GUI - UIConverterBackend declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIAdvancedSlider.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIAdvancedSlider.h
index 764ceab..0cee68d 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIAdvancedSlider.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIAdvancedSlider.h
@@ -1,3 +1,4 @@
+/* $Id: QIAdvancedSlider.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QIAdvancedSlider class implementation
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIAdvancedToolBar.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIAdvancedToolBar.h
index cb021e8..b1adcae 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIAdvancedToolBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIAdvancedToolBar.h
@@ -1,3 +1,4 @@
+/* $Id: QIAdvancedToolBar.h $ */
/** @file
* VBox Qt GUI - QIAdvancedToolBar class implementation
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowButtonPress.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowButtonPress.h
index 5ce8b4b..57c781a 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowButtonPress.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowButtonPress.h
@@ -1,3 +1,4 @@
+/* $Id: QIArrowButtonPress.h $ */
/** @file
* VBox Qt GUI - QIArrowButtonPress class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowButtonSwitch.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowButtonSwitch.h
index 8648b58..1b00c81 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowButtonSwitch.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowButtonSwitch.h
@@ -1,3 +1,4 @@
+/* $Id: QIArrowButtonSwitch.h $ */
/** @file
* VBox Qt GUI - QIArrowButtonSwitch class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowSplitter.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowSplitter.h
index c8f6e42..225a08c 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowSplitter.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIArrowSplitter.h
@@ -1,3 +1,4 @@
+/* $Id: QIArrowSplitter.h $ */
/** @file
* VBox Qt GUI - QIArrowSplitter class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIDialog.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIDialog.h
index 899ac15..c291733 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIDialog.h
@@ -1,3 +1,4 @@
+/* $Id: QIDialog.h $ */
/** @file
* VBox Qt GUI - VBox Qt extensions: QIDialog class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIDialogButtonBox.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIDialogButtonBox.h
index bba6163..e6cdccc 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIDialogButtonBox.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIDialogButtonBox.h
@@ -1,3 +1,4 @@
+/* $Id: QIDialogButtonBox.h $ */
/** @file
* VBox Qt GUI - VBox Qt extensions: QIDialogButtonBox class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIFileDialog.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIFileDialog.h
index 04e8de0..75f7183 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIFileDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIFileDialog.h
@@ -1,3 +1,4 @@
+/* $Id: QIFileDialog.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QIFileDialog class declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QILabel.h b/src/VBox/Frontends/VirtualBox/src/extensions/QILabel.h
index 2c4582a..d7eb4aa 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QILabel.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QILabel.h
@@ -1,3 +1,4 @@
+/* $Id: QILabel.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QILabel class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QILabelSeparator.h b/src/VBox/Frontends/VirtualBox/src/extensions/QILabelSeparator.h
index 0ce32f0..d23e8bf 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QILabelSeparator.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QILabelSeparator.h
@@ -1,3 +1,4 @@
+/* $Id: QILabelSeparator.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QILabelSeparator class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QILineEdit.h b/src/VBox/Frontends/VirtualBox/src/extensions/QILineEdit.h
index b7dd77e..ecdef0e 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QILineEdit.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QILineEdit.h
@@ -1,3 +1,4 @@
+/* $Id: QILineEdit.h $ */
/** @file
* VBox Qt GUI - QILineEdit class declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIListView.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIListView.h
index 38c4601..29ea554 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIListView.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIListView.h
@@ -1,3 +1,4 @@
+/* $Id: QIListView.h $ */
/** @file
* VBox Qt GUI - QIListView, QIItemDelegate class declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIMainDialog.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIMainDialog.h
index 6eff102..c98a4ea 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIMainDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIMainDialog.h
@@ -1,3 +1,4 @@
+/* $Id: QIMainDialog.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QIMainDialog class implementation.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIMenu.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIMenu.h
index 0ef19b9..9232313 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIMenu.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIMenu.h
@@ -1,3 +1,4 @@
+/* $Id: QIMenu.h $ */
/** @file
* VBox Qt GUI - QIMenu class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.h
index 2f2682e..f155a20 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIMessageBox.h
@@ -1,3 +1,4 @@
+/* $Id: QIMessageBox.h $ */
/** @file
* VBox Qt GUI - QIMessageBox class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIProcess.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIProcess.h
index 924f4b9..5d8db0c 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIProcess.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIProcess.h
@@ -1,3 +1,4 @@
+/* $Id: QIProcess.h $ */
/** @file
* VBox Qt GUI - QIProcess class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIRichTextLabel.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIRichTextLabel.h
index ea6b8bc..01754cb 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIRichTextLabel.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIRichTextLabel.h
@@ -1,3 +1,4 @@
+/* $Id: QIRichTextLabel.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QIRichTextLabel class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIRichToolButton.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIRichToolButton.h
index b18131f..ecb9c89 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIRichToolButton.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIRichToolButton.h
@@ -1,3 +1,4 @@
+/* $Id: QIRichToolButton.h $ */
/** @file
* VBox Qt GUI - QIRichToolButton class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QISplitter.h b/src/VBox/Frontends/VirtualBox/src/extensions/QISplitter.h
index 1283264..daa114b 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QISplitter.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QISplitter.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
* VBox Qt GUI - Qt extensions: QISplitter class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBar.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBar.h
index c0a3875..95b0eb8 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBar.h
@@ -1,3 +1,4 @@
+/* $Id: QIStatusBar.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QIStatusBar class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.h
index 1176b14..de0d72d 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIStatusBarIndicator.h
@@ -1,3 +1,4 @@
+/* $Id: QIStatusBarIndicator.h $ */
/** @file
* VBox Qt GUI - QIStatusBarIndicator interface declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QITabWidget.h b/src/VBox/Frontends/VirtualBox/src/extensions/QITabWidget.h
index d624779..7f6b267 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QITabWidget.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QITabWidget.h
@@ -1,3 +1,4 @@
+/* $Id: QITabWidget.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QITabWidget class declaration/implementation.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QITableView.h b/src/VBox/Frontends/VirtualBox/src/extensions/QITableView.h
index 02a9325..523a6df 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QITableView.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QITableView.h
@@ -1,3 +1,4 @@
+/* $Id: QITableView.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QITableView class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIToolButton.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIToolButton.h
index b296219..fd22df4 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIToolButton.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIToolButton.h
@@ -1,3 +1,4 @@
+/* $Id: QIToolButton.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QIToolButton class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QITreeView.h b/src/VBox/Frontends/VirtualBox/src/extensions/QITreeView.h
index 4316578..d6ca889 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QITreeView.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QITreeView.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
* VBox Qt GUI - Qt extensions: QITreeView class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QITreeWidget.h b/src/VBox/Frontends/VirtualBox/src/extensions/QITreeWidget.h
index dee4d56..6e0b878 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QITreeWidget.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QITreeWidget.h
@@ -1,3 +1,4 @@
+/* $Id: QITreeWidget.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QITreeWidget class implementation.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIWidgetValidator.h b/src/VBox/Frontends/VirtualBox/src/extensions/QIWidgetValidator.h
index e313b56..8674c78 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/QIWidgetValidator.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIWidgetValidator.h
@@ -1,3 +1,4 @@
+/* $Id: QIWidgetValidator.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QIWidgetValidator class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/graphics/QIGraphicsWidget.h b/src/VBox/Frontends/VirtualBox/src/extensions/graphics/QIGraphicsWidget.h
index 7e76339..63c1563 100644
--- a/src/VBox/Frontends/VirtualBox/src/extensions/graphics/QIGraphicsWidget.h
+++ b/src/VBox/Frontends/VirtualBox/src/extensions/graphics/QIGraphicsWidget.h
@@ -1,3 +1,4 @@
+/* $Id: QIGraphicsWidget.h $ */
/** @file
* VBox Qt GUI - QIGraphicsWidget class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp b/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp
index 5b34d37..daf6f9c 100644
--- a/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.cpp
@@ -133,7 +133,6 @@ const char* UIExtraDataDefs::GUI_StatusBar_Enabled = "GUI/StatusBar/Enabled";
const char* UIExtraDataDefs::GUI_RestrictedStatusBarIndicators = "GUI/RestrictedStatusBarIndicators";
const char* UIExtraDataDefs::GUI_StatusBar_IndicatorOrder = "GUI/StatusBar/IndicatorOrder";
#ifdef Q_WS_MAC
-const char* UIExtraDataDefs::GUI_PresentationModeEnabled = "GUI/PresentationModeEnabled";
const char* UIExtraDataDefs::GUI_RealtimeDockIconUpdateEnabled = "GUI/RealtimeDockIconUpdateEnabled";
const char* UIExtraDataDefs::GUI_RealtimeDockIconUpdateMonitor = "GUI/RealtimeDockIconUpdateMonitor";
#endif /* Q_WS_MAC */
diff --git a/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h b/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h
index 4d0ba66..2533ac5 100644
--- a/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UIExtraDataDefs.h $ */
/** @file
* VBox Qt GUI - Extra-data related definitions.
*/
@@ -229,8 +230,6 @@ namespace UIExtraDataDefs
/** Holds Runtime UI status-bar indicator order. */
extern const char* GUI_StatusBar_IndicatorOrder;
#ifdef Q_WS_MAC
- /** Mac OS X: Holds whether 'presentation mode' enabled. */
- extern const char* GUI_PresentationModeEnabled;
/** Mac OS X: Holds whether Dock icon should be updated at runtime. */
extern const char* GUI_RealtimeDockIconUpdateEnabled;
/** Mac OS X: Holds guest-screen which Dock icon should reflect at runtime. */
diff --git a/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp b/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp
index f2613a9..978737c 100644
--- a/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.cpp
@@ -549,7 +549,7 @@ private:
* @{ */
/** Data pane. */
QWidget *m_pPaneOfData;
- /** Dta filter. */
+ /** Data filter. */
QLineEdit *m_pFilterOfData;
/** Data pane: Table-view. */
QTableView *m_pViewOfData;
@@ -777,7 +777,9 @@ void UIExtraDataManagerWindow::sltDataHandleCustomContextMenuRequested(const QPo
{
/* Prepare menu: */
QMenu menu;
+ menu.addAction(m_pActionAdd);
menu.addAction(m_pActionDel);
+ menu.addSeparator();
menu.addAction(m_pActionSave);
/* Execute menu: */
m_pActionSave->setProperty("CalledFromContextMenu", true);
@@ -1201,7 +1203,7 @@ void UIExtraDataManagerWindow::prepareMenu()
connect(m_pActionLoad, SIGNAL(triggered(bool)), this, SLOT(sltLoad()));
}
/* Create 'Save' action: */
- m_pActionSave = pActionsMenu->addAction("Save");
+ m_pActionSave = pActionsMenu->addAction("Save As...");
AssertReturnVoid(m_pActionSave);
{
/* Configure 'Save' action: */
@@ -1788,7 +1790,6 @@ QStringList UIExtraDataManagerWindow::knownExtraDataKeys()
#endif /* !Q_WS_MAC */
<< GUI_StatusBar_Enabled << GUI_RestrictedStatusBarIndicators << GUI_StatusBar_IndicatorOrder
#ifdef Q_WS_MAC
- << GUI_PresentationModeEnabled
<< GUI_RealtimeDockIconUpdateEnabled << GUI_RealtimeDockIconUpdateMonitor
#endif /* Q_WS_MAC */
<< GUI_PassCAD
@@ -3317,12 +3318,6 @@ void UIExtraDataManager::setStatusBarIndicatorOrder(const QList<IndicatorType> &
}
#ifdef Q_WS_MAC
-bool UIExtraDataManager::presentationModeEnabled(const QString &strID)
-{
- /* 'False' unless feature allowed: */
- return isFeatureAllowed(GUI_PresentationModeEnabled, strID);
-}
-
bool UIExtraDataManager::realtimeDockIconUpdateEnabled(const QString &strID)
{
/* 'True' unless feature restricted: */
@@ -3644,11 +3639,6 @@ void UIExtraDataManager::sltExtraDataChange(QString strMachineID, QString strKey
/* Runtime UI shortcut changed? */
else if (strKey == GUI_Input_MachineShortcuts)
emit sigRuntimeUIShortcutChange();
-#ifdef Q_WS_MAC
- /* 'Presentation mode' status changed (allowed if not restricted)? */
- else if (strKey == GUI_PresentationModeEnabled)
- emit sigPresentationModeChange(!isFeatureRestricted(strKey));
-#endif /* Q_WS_MAC */
}
}
/* Machine extra-data 'change' event: */
@@ -3699,6 +3689,9 @@ void UIExtraDataManager::sltExtraDataChange(QString strMachineID, QString strKey
/* Scaling optimization type change: */
else if (strKey == GUI_Scaling_Optimization)
emit sigScalingOptimizationTypeChange(strMachineID);
+ /* HiDPI optimization type change: */
+ else if (strKey == GUI_HiDPI_Optimization)
+ emit sigHiDPIOptimizationTypeChange(strMachineID);
/* Unscaled HiDPI Output mode change: */
else if (strKey == GUI_HiDPI_UnscaledOutput)
emit sigUnscaledHiDPIOutputModeChange(strMachineID);
diff --git a/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h b/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h
index eae3b55..c8e88a5 100644
--- a/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h
+++ b/src/VBox/Frontends/VirtualBox/src/extradata/UIExtraDataManager.h
@@ -1,3 +1,4 @@
+/* $Id: UIExtraDataManager.h $ */
/** @file
* VBox Qt GUI - UIExtraDataManager class declaration.
*/
@@ -81,12 +82,13 @@ signals:
/** Notifies about the scaling optimization type change. */
void sigScalingOptimizationTypeChange(const QString &strMachineID);
+ /** Notifies about the HiDPI optimization type change. */
+ void sigHiDPIOptimizationTypeChange(const QString &strMachineID);
+
/** Notifies about unscaled HiDPI output mode change. */
void sigUnscaledHiDPIOutputModeChange(const QString &strMachineID);
#ifdef RT_OS_DARWIN
- /** Mac OS X: Notifies about 'presentation mode' status change. */
- void sigPresentationModeChange(bool fEnabled);
/** Mac OS X: Notifies about 'dock icon' appearance change. */
void sigDockIconAppearanceChange(bool fEnabled);
#endif /* RT_OS_DARWIN */
@@ -447,9 +449,6 @@ public:
void setStatusBarIndicatorOrder(const QList<IndicatorType> &list, const QString &strID);
#ifdef Q_WS_MAC
- /** Mac OS X: Returns whether 'presentation mode' enabled. */
- bool presentationModeEnabled(const QString &strID);
-
/** Mac OS X: Returns whether Dock icon should be updated at runtime. */
bool realtimeDockIconUpdateEnabled(const QString &strID);
/** Mac OS X: Defines whether Dock icon update should be fEnabled at runtime. */
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/CIShared.h b/src/VBox/Frontends/VirtualBox/src/globals/CIShared.h
index 2fb974b..e20f06f 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/CIShared.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/CIShared.h
@@ -1,3 +1,4 @@
+/* $Id: CIShared.h $ */
/** @file
* VBox Qt GUI - Common VirtualBox classes: CIShared class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/COMDefs.h b/src/VBox/Frontends/VirtualBox/src/globals/COMDefs.h
index 97be32b..4f42574 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/COMDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/COMDefs.h
@@ -1,3 +1,4 @@
+/* $Id: COMDefs.h $ */
/** @file
* VBox Qt GUI - Various COM definitions and COM wrapper class declarations.
*
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h b/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h
index 4e00a0e..d98cfee 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/QIWithRetranslateUI.h
@@ -1,3 +1,4 @@
+/* $Id: QIWithRetranslateUI.h $ */
/** @file
* VBox Qt GUI - Qt extensions: QIWithRetranslateUI class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
index 81dc241..aaf903d 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.cpp
@@ -119,6 +119,11 @@ UIActionPolymorphic* UIAction::toActionPolymorphic()
return qobject_cast<UIActionPolymorphic*>(this);
}
+UIActionPolymorphicMenu* UIAction::toActionPolymorphicMenu()
+{
+ return qobject_cast<UIActionPolymorphicMenu*>(this);
+}
+
void UIAction::setName(const QString &strName)
{
/* Remember internal name: */
@@ -315,6 +320,88 @@ UIActionPolymorphic::UIActionPolymorphic(UIActionPool *pParent,
}
+UIActionPolymorphicMenu::UIActionPolymorphicMenu(UIActionPool *pParent,
+ const QString &strIcon, const QString &strIconDisabled)
+ : UIAction(pParent, UIActionType_PolymorphicMenu)
+ , m_pMenu(0)
+ , m_iState(0)
+{
+ if (!strIcon.isNull())
+ setIcon(UIIconPool::iconSet(strIcon, strIconDisabled));
+ prepare();
+}
+
+UIActionPolymorphicMenu::UIActionPolymorphicMenu(UIActionPool *pParent,
+ const QString &strIconNormal, const QString &strIconSmall,
+ const QString &strIconNormalDisabled, const QString &strIconSmallDisabled)
+ : UIAction(pParent, UIActionType_PolymorphicMenu)
+ , m_pMenu(0)
+ , m_iState(0)
+{
+ if (!strIconNormal.isNull())
+ setIcon(UIIconPool::iconSetFull(strIconNormal, strIconSmall, strIconNormalDisabled, strIconSmallDisabled));
+ prepare();
+}
+
+UIActionPolymorphicMenu::UIActionPolymorphicMenu(UIActionPool *pParent,
+ const QIcon &icon)
+ : UIAction(pParent, UIActionType_PolymorphicMenu)
+ , m_pMenu(0)
+ , m_iState(0)
+{
+ if (!icon.isNull())
+ setIcon(icon);
+ prepare();
+}
+
+UIActionPolymorphicMenu::~UIActionPolymorphicMenu()
+{
+ /* Hide menu: */
+ hideMenu();
+ /* Delete menu: */
+ delete m_pMenu;
+ m_pMenu = 0;
+}
+
+void UIActionPolymorphicMenu::setShowToolTip(bool fShowToolTip)
+{
+ qobject_cast<UIMenu*>(menu())->setShowToolTip(fShowToolTip);
+}
+
+void UIActionPolymorphicMenu::showMenu()
+{
+ /* Show menu if necessary: */
+ if (!menu())
+ setMenu(m_pMenu);
+}
+
+void UIActionPolymorphicMenu::hideMenu()
+{
+ /* Hide menu if necessary: */
+ if (menu())
+ setMenu(0);
+}
+
+void UIActionPolymorphicMenu::prepare()
+{
+ /* Create menu: */
+ m_pMenu = new UIMenu;
+ AssertPtrReturnVoid(m_pMenu);
+ {
+ /* Prepare menu: */
+ connect(m_pMenu, SIGNAL(aboutToShow()),
+ parent(), SLOT(sltHandleMenuPrepare()));
+ /* Show menu: */
+ showMenu();
+ }
+}
+
+void UIActionPolymorphicMenu::updateText()
+{
+ setText(nameInMenu());
+}
+
+
class UIActionMenuApplication : public UIActionMenu
{
Q_OBJECT;
@@ -1194,9 +1281,8 @@ bool UIActionPool::addAction(UIMenu *pMenu, UIAction *pAction, bool fReallyAdd /
const bool fIsMenuConsumed = pMenu->isConsumed();
#endif /* RT_OS_DARWIN */
- /* Make this action enabled/visible
+ /* Make this action visible
* depending on clearance state. */
- pAction->setEnabled(fIsActionAllowed);
pAction->setVisible(fIsActionAllowed);
#ifdef RT_OS_DARWIN
@@ -1235,13 +1321,8 @@ bool UIActionPool::addMenu(QList<QMenu*> &menuList, UIAction *pAction, bool fRea
const bool fIsMenuConsumed = pMenu->isConsumed();
#endif /* RT_OS_DARWIN */
- /* Make this action enabled/visible
+ /* Make this action visible
* depending on clearance state. */
- pAction->setEnabled( fIsActionAllowed
-#ifdef RT_OS_DARWIN
- && !fIsMenuConsumable
-#endif /* RT_OS_DARWIN */
- );
pAction->setVisible( fIsActionAllowed
#ifdef RT_OS_DARWIN
&& !fIsMenuConsumable
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
index 019aa45..4335087 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIActionPool.h
@@ -1,3 +1,4 @@
+/* $Id: UIActionPool.h $ */
/** @file
* VBox Qt GUI - UIActionPool class declaration.
*/
@@ -27,6 +28,7 @@
/* Forward declarations: */
class UIActionPolymorphic;
+class UIActionPolymorphicMenu;
class UIActionPool;
class UIActionPoolRuntime;
class UIActionPoolSelector;
@@ -45,7 +47,8 @@ enum UIActionType
UIActionType_Menu,
UIActionType_Simple,
UIActionType_Toggle,
- UIActionType_Polymorphic
+ UIActionType_Polymorphic,
+ UIActionType_PolymorphicMenu
};
/** Action indexes. */
@@ -153,6 +156,8 @@ public:
/** Casts action to polymorphic-action. */
UIActionPolymorphic* toActionPolymorphic();
+ /** Casts action to polymorphic-menu-action. */
+ UIActionPolymorphicMenu* toActionPolymorphicMenu();
/** Returns current action name. */
const QString& name() const { return m_strName; }
@@ -315,6 +320,59 @@ private:
};
+/** Abstract UIAction extension for 'Polymorphic Menu' action type. */
+class UIActionPolymorphicMenu : public UIAction
+{
+ Q_OBJECT;
+
+public:
+
+ /** Returns current action state. */
+ int state() const { return m_iState; }
+ /** Defines current action state. */
+ void setState(int iState) { m_iState = iState; retranslateUi(); }
+
+protected:
+
+ /** Constructor, taking normal icon name and name for disabled analog. */
+ UIActionPolymorphicMenu(UIActionPool *pParent,
+ const QString &strIcon = QString(), const QString &strIconDis = QString());
+ /** Constructor, taking normal, small icon names and names for disabled analogs. */
+ UIActionPolymorphicMenu(UIActionPool *pParent,
+ const QString &strIconNormal, const QString &strIconSmall,
+ const QString &strIconNormalDisabled, const QString &strIconSmallDisabled);
+ /** Constructor, taking copy of existing icon. */
+ UIActionPolymorphicMenu(UIActionPool *pParent,
+ const QIcon &icon);
+
+ /** Destructor. */
+ ~UIActionPolymorphicMenu();
+
+ /** Defines whether tool-tip should be shown. */
+ void setShowToolTip(bool fShowToolTip);
+
+ /** Show menu. */
+ void showMenu();
+ /** Hide menu. */
+ void hideMenu();
+
+private:
+
+ /** Prepare routine. */
+ void prepare();
+
+ /** Updates action text accordingly. */
+ virtual void updateText();
+
+private:
+
+ /** Holds the menu instance. */
+ UIMenu *m_pMenu;
+ /** Holds current action state. */
+ int m_iState;
+};
+
+
/** Abstract QObject extension
* representing action-pool interface and factory. */
class UIActionPool : public QIWithRetranslateUI3<QObject>
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.h b/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.h
index 4de8136..3026455 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIAnimationFramework.h
@@ -1,3 +1,4 @@
+/* $Id: UIAnimationFramework.h $ */
/** @file
* VBox Qt GUI - UIAnimationFramework class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h b/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
index 6d42ddb..966d585 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UIDefs.h $ */
/** @file
* VBox Qt GUI - Global definitions.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.h
index fdf9514..18a945e 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIIconPool.h
@@ -1,3 +1,4 @@
+/* $Id: UIIconPool.h $ */
/** @file
* VBox Qt GUI - UIIconPool class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIImageTools.h b/src/VBox/Frontends/VirtualBox/src/globals/UIImageTools.h
index 27c65e1..e0a99f7 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIImageTools.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIImageTools.h
@@ -1,3 +1,4 @@
+/* $Id: UIImageTools.h $ */
/** @file
* VBox Qt GUI - Declarations of utility classes and functions for image manipulation.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
index 5d5f607..625d5d7 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.cpp
@@ -34,6 +34,7 @@
# include "CSnapshotTakenEvent.h"
# include "CSnapshotDeletedEvent.h"
# include "CSnapshotChangedEvent.h"
+# include "CSnapshotRestoredEvent.h"
# include "CExtraDataCanChangeEvent.h"
# include "CExtraDataChangedEvent.h"
# include "CMousePointerShapeChangedEvent.h"
@@ -118,6 +119,12 @@ STDMETHODIMP UIMainEventListener::HandleEvent(VBoxEventType_T /* type */, IEvent
emit sigSnapshotChange(es.GetMachineId(), es.GetSnapshotId());
break;
}
+ case KVBoxEventType_OnSnapshotRestored:
+ {
+ CSnapshotRestoredEvent es(pEvent);
+ emit sigSnapshotRestore(es.GetMachineId(), es.GetSnapshotId());
+ break;
+ }
// case KVBoxEventType_OnMediumRegistered:
// case KVBoxEventType_OnGuestPropertyChange:
@@ -234,13 +241,17 @@ STDMETHODIMP UIMainEventListener::HandleEvent(VBoxEventType_T /* type */, IEvent
emit sigCanShowWindow(fVeto, strReason);
if (fVeto)
es.AddVeto(strReason);
+ else
+ es.AddApproval(strReason);
break;
}
case KVBoxEventType_OnShowWindow:
{
CShowWindowEvent es(pEvent);
/* Has to be done in place to give an answer: */
- LONG64 winId;
+ LONG64 winId = es.GetWinId();
+ if (winId != 0)
+ break; /* Already set by some listener. */
emit sigShowWindow(winId);
es.SetWinId(winId);
break;
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
index ed0e9ab..937992c 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMainEventListener.h
@@ -1,3 +1,4 @@
+/* $Id: UIMainEventListener.h $ */
/** @file
* VBox Qt GUI - UIMainEventListener class declaration.
*/
@@ -63,6 +64,8 @@ signals:
void sigSnapshotDelete(QString strId, QString strSnapshotId);
/** Notifies about snapshot with @a strSnapshotId was changed for the machine with @a strId. */
void sigSnapshotChange(QString strId, QString strSnapshotId);
+ /** Notifies about snapshot with @a strSnapshotId was restored for the machine with @a strId. */
+ void sigSnapshotRestore(QString strId, QString strSnapshotId);
/** Notifies about extra-data of the machine with @a strId can be changed for the key @a strKey to value @a strValue. */
void sigExtraDataCanChange(QString strId, QString strKey, QString strValue, bool &fVeto, QString &strVetoReason); /* use Qt::DirectConnection */
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
index f62d542..04cda13 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -72,6 +72,8 @@
# include "CEmulatedUSB.h"
# ifdef VBOX_WITH_DRAG_AND_DROP
# include "CGuest.h"
+# include "CDnDSource.h"
+# include "CDnDTarget.h"
# endif /* VBOX_WITH_DRAG_AND_DROP */
/* Other VBox includes: */
@@ -915,6 +917,13 @@ void UIMessageCenter::cannotRemoveSnapshot(const CProgress &progress, const QStr
formatErrorInfo(progress));
}
+void UIMessageCenter::cannotSaveSettings(const QString strDetails, QWidget *pParent /* = 0 */) const
+{
+ error(pParent, MessageType_Error,
+ tr("Failed to save the settings."),
+ strDetails);
+}
+
bool UIMessageCenter::confirmNATNetworkRemoval(const QString &strName, QWidget *pParent /* = 0*/) const
{
return questionBinary(pParent, MessageType_Question,
@@ -1672,6 +1681,13 @@ void UIMessageCenter::cannotFindSnapshotByName(const CMachine &machine, const QS
formatErrorInfo(machine));
}
+void UIMessageCenter::cannotAddDiskEncryptionPassword(const CAppliance &appliance, QWidget *pParent /* = 0 */)
+{
+ error(pParent, MessageType_Error,
+ tr("Bad password or authentication failure."),
+ formatErrorInfo(appliance));
+}
+
void UIMessageCenter::showRuntimeError(const CConsole &console, bool fFatal, const QString &strErrorId, const QString &strErrorMsg) const
{
/* Prepare auto-confirm id: */
@@ -1771,7 +1787,7 @@ bool UIMessageCenter::remindAboutGuruMeditation(const QString &strLogFolder)
"machine and the machine execution has been stopped.</p>"
""
"<p>For help, please see the Community section on "
- "<a href=http://www.virtualbox.org>http://www.virtualbox.org</a> "
+ "<a href=https://www.virtualbox.org>https://www.virtualbox.org</a> "
"or your support contract. Please provide the contents of the "
"log file <tt>VBox.log</tt> and the image file <tt>VBox.png</tt>, "
"which you can find in the <nobr><b>%1</b></nobr> directory, "
@@ -1797,7 +1813,7 @@ void UIMessageCenter::warnAboutVBoxSVCUnavailable() const
"machine and the machine execution should be stopped.</p>"
""
"<p>For help, please see the Community section on "
- "<a href=http://www.virtualbox.org>http://www.virtualbox.org</a> "
+ "<a href=https://www.virtualbox.org>https://www.virtualbox.org</a> "
"or your support contract. Please provide the contents of the "
"log file <tt>VBox.log</tt>, "
"which you can find in the virtual machine log directory, "
@@ -2049,8 +2065,8 @@ void UIMessageCenter::cannotToggleNetworkAdapterCable(const CNetworkAdapter &ada
{
error(0, MessageType_Error,
fConnect ?
- tr("Failed to connect network adapter cable of the virtual machine <b>%1</b>.").arg(strMachineName) :
- tr("Failed to disconnect network adapter cable of the virtual machine <b>%1</b>.").arg(strMachineName),
+ tr("Failed to connect the network adapter cable of the virtual machine <b>%1</b>.").arg(strMachineName) :
+ tr("Failed to disconnect the network adapter cable of the virtual machine <b>%1</b>.").arg(strMachineName),
formatErrorInfo(adapter));
}
@@ -2077,7 +2093,7 @@ void UIMessageCenter::cannotMountGuestAdditions(const QString &strMachineName) c
void UIMessageCenter::cannotAddDiskEncryptionPassword(const CConsole &console)
{
error(0, MessageType_Error,
- tr("Unable to enter password!"),
+ tr("Bad password or authentication failure."),
formatErrorInfo(console));
}
@@ -2092,7 +2108,7 @@ void UIMessageCenter::showUpdateSuccess(const QString &strVersion, const QString
{
alert(windowManager().networkManagerOrMainWindowShown(), MessageType_Info,
tr("<p>A new version of VirtualBox has been released! Version <b>%1</b> is available "
- "at <a href=\"http://www.virtualbox.org/\">virtualbox.org</a>.</p>"
+ "at <a href=\"https://www.virtualbox.org/\">virtualbox.org</a>.</p>"
"<p>You can download this version using the link:</p>"
"<p><a href=%2>%3</a></p>")
.arg(strVersion, strLink, strLink));
@@ -2383,17 +2399,38 @@ void UIMessageCenter::warnAboutExtPackInstalled(const QString &strPackName, QWid
}
#ifdef VBOX_WITH_DRAG_AND_DROP
-void UIMessageCenter::cannotDropData(const CGuest &guest, QWidget *pParent /* = 0*/) const
+void UIMessageCenter::cannotDropDataToGuest(const CDnDTarget &dndTarget, QWidget *pParent /* = 0 */) const
+{
+ error(pParent, MessageType_Error,
+ tr("Drag and drop operation from host to guest failed."),
+ formatErrorInfo(dndTarget));
+}
+
+void UIMessageCenter::cannotDropDataToGuest(const CProgress &progress, QWidget *pParent /* = 0 */) const
+{
+ error(pParent, MessageType_Error,
+ tr("Drag and drop operation from host to guest failed."),
+ formatErrorInfo(progress));
+}
+
+void UIMessageCenter::cannotCancelDropToGuest(const CDnDTarget &dndTarget, QWidget *pParent /* = 0 */) const
+{
+ error(pParent, MessageType_Error,
+ tr("Unable to cancel host to guest drag and drop operation."),
+ formatErrorInfo(dndTarget));
+}
+
+void UIMessageCenter::cannotDropDataToHost(const CDnDSource &dndSource, QWidget *pParent /* = 0 */) const
{
error(pParent, MessageType_Error,
- tr("Failed to drop data."),
- formatErrorInfo(guest));
+ tr("Drag and drop operation from guest to host failed."),
+ formatErrorInfo(dndSource));
}
-void UIMessageCenter::cannotDropData(const CProgress &progress, QWidget *pParent /* = 0*/) const
+void UIMessageCenter::cannotDropDataToHost(const CProgress &progress, QWidget *pParent /* = 0 */) const
{
error(pParent, MessageType_Error,
- tr("Failed to drop data."),
+ tr("Drag and drop operation from guest to host failed."),
formatErrorInfo(progress));
}
#endif /* VBOX_WITH_DRAG_AND_DROP */
@@ -2579,7 +2616,7 @@ QString UIMessageCenter::formatErrorInfo(const COMResult &rc)
void UIMessageCenter::sltShowHelpWebDialog()
{
- vboxGlobal().openURL("http://www.virtualbox.org");
+ vboxGlobal().openURL("https://www.virtualbox.org");
}
void UIMessageCenter::sltShowHelpAboutDialog()
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
index 4860429..f158141 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIMessageCenter.h
@@ -1,3 +1,4 @@
+/* $Id: UIMessageCenter.h $ */
/** @file
* VBox Qt GUI - UIMessageCenter class declaration.
*/
@@ -209,6 +210,9 @@ public:
void cannotRemoveSnapshot(const CMachine &machine, const QString &strSnapshotName, const QString &strMachineName) const;
void cannotRemoveSnapshot(const CProgress &progress, const QString &strSnapshotName, const QString &strMachineName) const;
+ /* API: Common settings warnings: */
+ void cannotSaveSettings(const QString strDetails, QWidget *pParent = 0) const;
+
/* API: Global settings warnings: */
bool confirmNATNetworkRemoval(const QString &strName, QWidget *pParent = 0) const;
bool confirmHostOnlyInterfaceRemoval(const QString &strName, QWidget *pParent = 0) const;
@@ -275,6 +279,7 @@ public:
void cannotExportAppliance(const CMachine &machine, const QString &strPath, QWidget *pParent = 0) const;
void cannotExportAppliance(const CProgress &progress, const QString &strPath, QWidget *pParent = 0) const;
void cannotFindSnapshotByName(const CMachine &machine, const QString &strMachine, QWidget *pParent = 0) const;
+ void cannotAddDiskEncryptionPassword(const CAppliance &appliance, QWidget *pParent = 0);
/* API: Runtime UI warnings: */
void showRuntimeError(const CConsole &console, bool fFatal, const QString &strErrorId, const QString &strErrorMsg) const;
@@ -343,9 +348,12 @@ public:
void warnAboutExtPackInstalled(const QString &strPackName, QWidget *pParent = 0) const;
#ifdef VBOX_WITH_DRAG_AND_DROP
- /* API: Drag&drop warnings: */
- void cannotDropData(const CGuest &guest, QWidget *pParent = 0) const;
- void cannotDropData(const CProgress &progress, QWidget *pParent = 0) const;
+ /* API: Drag and drop warnings: */
+ void cannotDropDataToGuest(const CDnDTarget &dndTarget, QWidget *pParent = 0) const;
+ void cannotDropDataToGuest(const CProgress &progress, QWidget *pParent = 0) const;
+ void cannotCancelDropToGuest(const CDnDTarget &dndTarget, QWidget *pParent = 0) const;
+ void cannotDropDataToHost(const CDnDSource &dndSource, QWidget *pParent = 0) const;
+ void cannotDropDataToHost(const CProgress &progress, QWidget *pParent = 0) const;
#endif /* VBOX_WITH_DRAG_AND_DROP */
/* API: License-viewer warnings: */
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.h b/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.h
index 7b5adbf..298d705 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIModalWindowManager.h
@@ -1,3 +1,4 @@
+/* $Id: UIModalWindowManager.h $ */
/** @file
* VBox Qt GUI - UIModalWindowManager class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIPopupCenter.h b/src/VBox/Frontends/VirtualBox/src/globals/UIPopupCenter.h
index 9574eb8..7b53a1a 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIPopupCenter.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIPopupCenter.h
@@ -1,3 +1,4 @@
+/* $Id: UIPopupCenter.h $ */
/** @file
* VBox Qt GUI - UIPopupCenter class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
index 3ddf11f..a2af3f5 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIShortcutPool.h
@@ -1,3 +1,4 @@
+/* $Id: UIShortcutPool.h $ */
/** @file
* VBox Qt GUI - UIShortcutPool class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h b/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h
index 838a912..77d2ca5 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/UIThreadPool.h
@@ -1,3 +1,4 @@
+/* $Id: UIThreadPool.h $ */
/** @file
* VBox Qt GUI - UIThreadPool and UITask class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
index 3430c91..08ce645 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp
@@ -4000,26 +4000,16 @@ void VBoxGlobal::prepare()
m_strPidfile = QString(qApp->argv()[i]);
}
#endif /* VBOX_GUI_WITH_PIDFILE */
+ /* Visual state type options: */
else if (!::strcmp(arg, "-normal") || !::strcmp(arg, "--normal"))
- {
visualStateType = UIVisualStateType_Normal;
- }
else if (!::strcmp(arg, "-fullscreen") || !::strcmp(arg, "--fullscreen"))
- {
visualStateType = UIVisualStateType_Fullscreen;
- }
else if (!::strcmp(arg, "-seamless") || !::strcmp(arg, "--seamless"))
- {
visualStateType = UIVisualStateType_Seamless;
- }
else if (!::strcmp(arg, "-scale") || !::strcmp(arg, "--scale"))
- {
visualStateType = UIVisualStateType_Scale;
- }
- else if (!::strcmp (arg, "-comment") || !::strcmp (arg, "--comment"))
- {
- ++i;
- }
+ /* Passwords: */
else if (!::strcmp (arg, "--settingspw"))
{
if (++i < argc)
@@ -4062,6 +4052,9 @@ void VBoxGlobal::prepare()
}
}
}
+ /* Misc options: */
+ else if (!::strcmp (arg, "-comment") || !::strcmp (arg, "--comment"))
+ ++i;
else if (!::strcmp(arg, "--no-startvm-errormsgbox"))
mShowStartVMErrors = false;
else if (!::strcmp(arg, "--aggressive-caching"))
@@ -4070,6 +4063,18 @@ void VBoxGlobal::prepare()
mAgressiveCaching = false;
else if (!::strcmp(arg, "--restore-current"))
mRestoreCurrentSnapshot = true;
+ /* Ad hoc VM reconfig options: */
+ else if (!::strcmp(arg, "--fdc"))
+ {
+ if (++i < argc)
+ m_strFloppyImage = qApp->argv()[i];
+ }
+ else if (!::strcmp(arg, "--dvd") || !::strcmp(arg, "--cdrom"))
+ {
+ if (++i < argc)
+ m_strDvdImage = qApp->argv()[i];
+ }
+ /* VMM Options: */
else if (!::strcmp(arg, "--disable-patm"))
mDisablePatm = true;
else if (!::strcmp(arg, "--disable-csam"))
@@ -4088,6 +4093,7 @@ void VBoxGlobal::prepare()
mWarpPct = RTStrToUInt32(qApp->argv() [i]);
}
#ifdef VBOX_WITH_DEBUGGER_GUI
+ /* Debugger/Debugging options: */
else if (!::strcmp(arg, "-dbg") || !::strcmp (arg, "--dbg"))
setDebuggerVar(&m_fDbgEnabled, true);
else if (!::strcmp( arg, "-debug") || !::strcmp (arg, "--debug"))
@@ -4602,7 +4608,7 @@ bool VBoxGlobal::launchMachine(CMachine &machine, LaunchMode enmLaunchMode /* =
switch (enmLaunchMode)
{
case LaunchMode_Default: strType = ""; break;
- case LaunchMode_Separate:
+ case LaunchMode_Separate: strType = vboxGlobal().isSeparateProcess() ? "headless" : "separate"; break;
case LaunchMode_Headless: strType = "headless"; break;
}
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
index 90a8b5a..708efba 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxGlobal.h $ */
/** @file
* VBox Qt GUI - VBoxGlobal class declaration.
*/
@@ -154,6 +155,11 @@ public:
/** Defines whether we should fRestore current snapshot before VM started. */
void setShouldRestoreCurrentSnapshot(bool fRestore) { mRestoreCurrentSnapshot = fRestore; }
+ bool hasFloppyImageToMount() const { return !m_strFloppyImage.isEmpty(); }
+ bool hasDvdImageToMount() const { return !m_strDvdImage.isEmpty(); }
+ QString const &getFloppyImage() const { return m_strFloppyImage; }
+ QString const &getDvdImage() const { return m_strDvdImage; }
+
bool isPatmDisabled() const { return mDisablePatm; }
bool isCsamDisabled() const { return mDisableCsam; }
bool isSupervisorCodeExecedRecompiled() const { return mRecompileSupervisor; }
@@ -479,6 +485,15 @@ private:
bool mAgressiveCaching;
/** The --restore-current option. */
bool mRestoreCurrentSnapshot;
+ /** @name Ad-hoc VM reconfiguration.
+ * @{ */
+ /** Floppy image. */
+ QString m_strFloppyImage;
+ /** DVD image. */
+ QString m_strDvdImage;
+ /** @} */
+ /** @name VMM options
+ * @{ */
/** The --disable-patm option. */
bool mDisablePatm;
/** The --disable-csam option. */
@@ -491,6 +506,7 @@ private:
bool mExecuteAllInIem;
/** The --warp-factor option value. */
uint32_t mWarpPct;
+ /** @} */
#ifdef VBOX_WITH_DEBUGGER_GUI
/** Whether the debugger should be accessible or not.
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxUtils.h b/src/VBox/Frontends/VirtualBox/src/globals/VBoxUtils.h
index 192f8ff..6e933d8 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxUtils.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxUtils.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxUtils.h $ */
/** @file
* VBox Qt GUI - Declarations of utility classes and functions.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxVersion.h b/src/VBox/Frontends/VirtualBox/src/globals/VBoxVersion.h
index a5d0288..332b8e5 100644
--- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxVersion.h
+++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxVersion.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxVersion.h $ */
/** @file
* VBox Qt GUI - VBoxVersion class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/main.cpp b/src/VBox/Frontends/VirtualBox/src/main.cpp
index e5e9b1c..18ded32 100644
--- a/src/VBox/Frontends/VirtualBox/src/main.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/main.cpp
@@ -240,6 +240,8 @@ static void showHelp()
" --no-startvm-errormsgbox do not show a message box for VM start errors\n"
" --restore-current restore the current snapshot before starting\n"
" --no-aggressive-caching delays caching media info in VM processes\n"
+ " --fdc <image|none> Mount the specified floppy image\n"
+ " --dvd <image|none> Mount the specified DVD image\n"
# ifdef VBOX_GUI_WITH_PIDFILE
" --pidfile <file> create a pidfile file when a VM is up and running\n"
# endif
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp b/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp
index 513816f..dd41783 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.cpp
@@ -90,6 +90,7 @@ UIMedium& UIMedium::operator=(const UIMedium &other)
m_strHardDiskType = other.hardDiskType();
m_strHardDiskFormat = other.hardDiskFormat();
m_strStorageDetails = other.storageDetails();
+ m_strEncryptionPasswordID = other.encryptionPasswordID();
m_strUsage = other.usage();
m_strToolTip = other.tip();
@@ -103,6 +104,7 @@ UIMedium& UIMedium::operator=(const UIMedium &other)
m_fReadOnly = other.isReadOnly();
m_fUsedInSnapshots = other.isUsedInSnapshots();
m_fHostDrive = other.isHostDrive();
+ m_fEncrypted = other.isEncrypted();
return *this;
}
@@ -141,18 +143,15 @@ void UIMedium::refresh()
/* Reset cache parameters: */
//m_strKey = nullID();
- /* Reset name/location parameters: */
+ /* Reset name/location/size parameters: */
m_strName = VBoxGlobal::tr("Empty", "medium");
m_strLocation = m_strSize = m_strLogicalSize = QString("--");
- /* Reset size parameters: */
- m_strSize = QString();
- m_strLogicalSize = QString();
-
/* Reset hard drive related parameters: */
m_strHardDiskType = QString();
m_strHardDiskFormat = QString();
m_strStorageDetails = QString();
+ m_strEncryptionPasswordID = QString();
/* Reset data parameters: */
m_strUsage = QString();
@@ -169,6 +168,7 @@ void UIMedium::refresh()
m_fReadOnly = false;
m_fUsedInSnapshots = false;
m_fHostDrive = false;
+ m_fEncrypted = false;
/* For non NULL medium: */
if (!m_medium.isNull())
@@ -241,6 +241,24 @@ void UIMedium::refresh()
m_strRootId = parentMedium.GetId();
parentMedium = parentMedium.GetParent();
}
+
+ /* Refresh encryption attributes: */
+ if (m_strRootId != m_strId)
+ {
+ m_strEncryptionPasswordID = root().encryptionPasswordID();
+ m_fEncrypted = root().isEncrypted();
+ }
+ else
+ {
+ QString strCipher;
+ CMedium medium(m_medium);
+ const QString strEncryptionPasswordID = medium.GetEncryptionSettings(strCipher);
+ if (medium.isOk())
+ {
+ m_strEncryptionPasswordID = strEncryptionPasswordID;
+ m_fEncrypted = true;
+ }
+ }
}
}
@@ -473,6 +491,10 @@ QString UIMedium::details(bool fNoDiffs /* = false */,
{
strDetails = QString("%1, ").arg(rootMedium.m_strHardDiskType);
}
+
+ /* Add encryption status: */
+ if (m_fEncrypted)
+ strDetails += QString("%1, ").arg(VBoxGlobal::tr("Encrypted", "medium"));
}
// @todo prepend the details with the warning/error icon when not accessible
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h b/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h
index ac7ce25..2fd5bf2 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMedium.h
@@ -1,3 +1,4 @@
+/* $Id: UIMedium.h $ */
/** @file
* VBox Qt GUI - UIMedium class declaration.
*/
@@ -191,6 +192,8 @@ public:
/** Returns the hard drive medium storage details. */
QString storageDetails() const { return m_strStorageDetails; }
+ /** Returns the hard drive medium encryption password ID. */
+ QString encryptionPasswordID() const { return m_strEncryptionPasswordID; }
/** Returns the medium usage data.
* @param fNoDiffs @c true to enable user-friendly "don't show diffs" mode.
@@ -262,6 +265,9 @@ public:
/** Returns whether this medium corresponds to real host drive. */
bool isHostDrive() const { return m_fHostDrive; }
+ /** Returns whether this medium is encrypted. */
+ bool isEncrypted() const { return m_fEncrypted; }
+
/** Returns whether this medium is attached to any VM (in the current state or in a snapshot) in which case
* #usage() will contain a string with comma-separated VM names (with snapshot names, if any, in parenthesis). */
bool isUsed() const { return !m_strUsage.isNull(); }
@@ -331,6 +337,8 @@ private:
QString m_strHardDiskFormat;
/** Holds the hard drive medium storage details. */
QString m_strStorageDetails;
+ /** Holds the hard drive medium encryption password ID. */
+ QString m_strEncryptionPasswordID;
/** Holds the medium usage. */
QString m_strUsage;
@@ -355,6 +363,8 @@ private:
bool m_fUsedInSnapshots : 1;
/** Holds whether this medium corresponds to real host drive. */
bool m_fHostDrive : 1;
+ /** Holds whether this medium is encrypted. */
+ bool m_fEncrypted : 1;
/** Holds the NULL medium ID. */
static QString m_sstrNullID;
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumDefs.h b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumDefs.h
index 6e7e8d1..750364b 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UIMediumDefs.h $ */
/** @file
* VBox Qt GUI - UIMedium related declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
index 5b58716..258f995 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.cpp
@@ -80,6 +80,7 @@ UIMediumEnumerator::UIMediumEnumerator(ulong uWorkerCount /* = 3*/, ulong uWorke
connect(gVBoxEvents, SIGNAL(sigSnapshotTake(QString, QString)), this, SLOT(sltHandleMachineUpdate(QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotDelete(QString, QString)), this, SLOT(sltHandleSnapshotDeleted(QString, QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotChange(QString, QString)), this, SLOT(sltHandleMachineUpdate(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotRestore(QString, QString)), this, SLOT(sltHandleSnapshotDeleted(QString, QString)));
connect(gVBoxEvents, SIGNAL(sigMachineRegistered(QString, bool)), this, SLOT(sltHandleMachineRegistration(QString, bool)));
/* Prepare thread-pool: */
@@ -195,23 +196,21 @@ void UIMediumEnumerator::sltHandleMachineUpdate(QString strMachineID)
LogRel(("UIMediumEnumerator: New usage: %s\n",
currentCMediumIDs.isEmpty() ? "<empty>" : currentCMediumIDs.join(", ").toAscii().constData()));
- /* Determine excluded/included mediums: */
- QSet<QString> oldSet = previousUIMediumIDs.toSet();
- QSet<QString> newSet = currentCMediumIDs.toSet();
- QSet<QString> excludedSet = oldSet - newSet;
- QSet<QString> includedSet = newSet - oldSet;
- QStringList excludedList = excludedSet.toList();
- QStringList includedList = includedSet.toList();
- if (!excludedList.isEmpty())
- LogRel(("UIMediumEnumerator: Items excluded from usage: %s\n", excludedList.join(", ").toAscii().constData()));
- if (!includedList.isEmpty())
- LogRel(("UIMediumEnumerator: Items included into usage: %s\n", includedList.join(", ").toAscii().constData()));
+ /* Determine excluded mediums: */
+ const QSet<QString> previousSet = previousUIMediumIDs.toSet();
+ const QSet<QString> currentSet = currentCMediumIDs.toSet();
+ const QSet<QString> excludedSet = previousSet - currentSet;
+ const QStringList excludedUIMediumIDs = excludedSet.toList();
+ if (!excludedUIMediumIDs.isEmpty())
+ LogRel(("UIMediumEnumerator: Items excluded from usage: %s\n", excludedUIMediumIDs.join(", ").toAscii().constData()));
+ if (!currentCMediumIDs.isEmpty())
+ LogRel(("UIMediumEnumerator: Items currently in usage: %s\n", currentCMediumIDs.join(", ").toAscii().constData()));
/* Update cache for excluded UIMediums: */
- recacheFromCachedUsage(excludedList);
+ recacheFromCachedUsage(excludedUIMediumIDs);
- /* Update cache for included CMediums: */
- recacheFromActualUsage(currentCMediums, includedList);
+ /* Update cache for current CMediums: */
+ recacheFromActualUsage(currentCMediums, currentCMediumIDs);
LogRel(("UIMediumEnumerator: Machine (or snapshot) event processed, ID = %s\n",
strMachineID.toAscii().constData()));
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
index 072fd26..483cbf5 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumEnumerator.h
@@ -1,3 +1,4 @@
+/* $Id: UIMediumEnumerator.h $ */
/** @file
* VBox Qt GUI - UIMediumEnumerator class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
index a097aa1..6103e8e 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.cpp
@@ -139,6 +139,8 @@ public:
/** Returns QString <i>storage details</i> of the wrapped UIMedium. */
QString details() const { return m_medium.storageDetails(); }
+ /** Returns QString <i>encryption password ID</i> of the wrapped UIMedium. */
+ QString encryptionPasswordID() const { return m_medium.encryptionPasswordID(); }
/** Returns QString <i>tool-tip</i> of the wrapped UIMedium. */
QString toolTip() const { return m_medium.toolTip(); }
@@ -1204,7 +1206,7 @@ void UIMediumManager::prepareTab(UIMediumType type)
/* Prepare tree-widget: */
prepareTreeWidget(type, type == UIMediumType_HardDisk ? 3 : 2);
/* Prepare information-container: */
- prepareInformationContainer(type, type == UIMediumType_HardDisk ? 6 : 3);
+ prepareInformationContainer(type, type == UIMediumType_HardDisk ? 7 : 3);
}
}
}
@@ -1609,10 +1611,13 @@ void UIMediumManager::updateInformationFieldsHD()
else
{
/* Acquire required details: */
- QString strDetails = pCurrentItem->details();
- QString strUsage = pCurrentItem->usage().isNull() ?
- formatFieldText(QApplication::translate("VBoxMediaManagerDlg", "<i>Not Attached</i>"), false) :
- formatFieldText(pCurrentItem->usage());
+ const QString strDetails = pCurrentItem->details();
+ const QString strUsage = pCurrentItem->usage().isNull() ?
+ formatFieldText(QApplication::translate("VBoxMediaManagerDlg", "<i>Not Attached</i>"), false) :
+ formatFieldText(pCurrentItem->usage());
+ const QString strEncryptionPasswordID = pCurrentItem->encryptionPasswordID().isNull() ?
+ formatFieldText(QApplication::translate("VBoxMediaManagerDlg", "<i>Not Encrypted</i>"), false) :
+ formatFieldText(pCurrentItem->encryptionPasswordID());
const QString strID = pCurrentItem->id();
if (infoField(UIMediumType_HardDisk, 0))
infoField(UIMediumType_HardDisk, 0)->setText(pCurrentItem->hardDiskType());
@@ -1625,7 +1630,9 @@ void UIMediumManager::updateInformationFieldsHD()
if (infoField(UIMediumType_HardDisk, 4))
infoField(UIMediumType_HardDisk, 4)->setText(strUsage);
if (infoField(UIMediumType_HardDisk, 5))
- infoField(UIMediumType_HardDisk, 5)->setText(strID);
+ infoField(UIMediumType_HardDisk, 5)->setText(strEncryptionPasswordID);
+ if (infoField(UIMediumType_HardDisk, 6))
+ infoField(UIMediumType_HardDisk, 6)->setText(strID);
}
/* Enable/disable information-panes container: */
@@ -1802,7 +1809,9 @@ void UIMediumManager::retranslateUi()
if (infoLabel(UIMediumType_HardDisk, 4))
infoLabel(UIMediumType_HardDisk, 4)->setText(QApplication::translate("VBoxMediaManagerDlg", "Attached to:"));
if (infoLabel(UIMediumType_HardDisk, 5))
- infoLabel(UIMediumType_HardDisk, 5)->setText(QApplication::translate("VBoxMediaManagerDlg", "UUID:"));
+ infoLabel(UIMediumType_HardDisk, 5)->setText(QApplication::translate("VBoxMediaManagerDlg", "Encrypted with key:"));
+ if (infoLabel(UIMediumType_HardDisk, 6))
+ infoLabel(UIMediumType_HardDisk, 6)->setText(QApplication::translate("VBoxMediaManagerDlg", "UUID:"));
/* Translate CD tree-widget: */
QTreeWidget *pTreeWidgetCD = treeWidget(UIMediumType_DVD);
diff --git a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h
index c490500..91590b2 100644
--- a/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h
+++ b/src/VBox/Frontends/VirtualBox/src/medium/UIMediumManager.h
@@ -1,3 +1,4 @@
+/* $Id: UIMediumManager.h $ */
/** @file
* VBox Qt GUI - UIMediumManager class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UIDownloader.h b/src/VBox/Frontends/VirtualBox/src/net/UIDownloader.h
index de618f6..854047f 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UIDownloader.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UIDownloader.h
@@ -1,3 +1,4 @@
+/* $Id: UIDownloader.h $ */
/** @file
* VBox Qt GUI - UIDownloader class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderAdditions.h b/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderAdditions.h
index 2376233..9d1454c 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderAdditions.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderAdditions.h
@@ -1,3 +1,4 @@
+/* $Id: UIDownloaderAdditions.h $ */
/** @file
* VBox Qt GUI - UIDownloaderAdditions class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderExtensionPack.h b/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderExtensionPack.h
index c45f3b1..1b91c61 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderExtensionPack.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderExtensionPack.h
@@ -1,3 +1,4 @@
+/* $Id: UIDownloaderExtensionPack.h $ */
/** @file
* VBox Qt GUI - UIDownloaderExtensionPack class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderUserManual.h b/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderUserManual.h
index 58f4530..fc182cf 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderUserManual.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UIDownloaderUserManual.h
@@ -1,3 +1,4 @@
+/* $Id: UIDownloaderUserManual.h $ */
/** @file
* VBox Qt GUI - UIDownloaderUserManual class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkCustomer.h b/src/VBox/Frontends/VirtualBox/src/net/UINetworkCustomer.h
index dd4223a..d3b3707 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkCustomer.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkCustomer.h
@@ -1,3 +1,4 @@
+/* $Id: UINetworkCustomer.h $ */
/** @file
* VBox Qt GUI - UINetworkCustomer class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkDefs.h b/src/VBox/Frontends/VirtualBox/src/net/UINetworkDefs.h
index 3095679..bb5099c 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UINetworkDefs.h $ */
/** @file
* VBox Qt GUI - Network routine related declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkManager.h b/src/VBox/Frontends/VirtualBox/src/net/UINetworkManager.h
index 337ac0b..91903ba 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkManager.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkManager.h
@@ -1,3 +1,4 @@
+/* $Id: UINetworkManager.h $ */
/** @file
* VBox Qt GUI - UINetworkManager stuff declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerDialog.h b/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerDialog.h
index 0dd798e..683473b 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerDialog.h
@@ -1,3 +1,4 @@
+/* $Id: UINetworkManagerDialog.h $ */
/** @file
* VBox Qt GUI - UINetworkManagerDialog stuff declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerIndicator.h b/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerIndicator.h
index a6e3e7b..163c637 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerIndicator.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkManagerIndicator.h
@@ -1,3 +1,4 @@
+/* $Id: UINetworkManagerIndicator.h $ */
/** @file
* VBox Qt GUI - UINetworkManagerIndicator stuff declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.h b/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.h
index b27139d..4375c8c 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkReply.h
@@ -1,3 +1,4 @@
+/* $Id: UINetworkReply.h $ */
/** @file
* VBox Qt GUI - UINetworkReply stuff declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkRequest.h b/src/VBox/Frontends/VirtualBox/src/net/UINetworkRequest.h
index 758be64..062f9e9 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkRequest.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkRequest.h
@@ -1,3 +1,4 @@
+/* $Id: UINetworkRequest.h $ */
/** @file
* VBox Qt GUI - UINetworkRequest stuff declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UINetworkRequestWidget.h b/src/VBox/Frontends/VirtualBox/src/net/UINetworkRequestWidget.h
index 3171916..c16216c 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UINetworkRequestWidget.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UINetworkRequestWidget.h
@@ -1,3 +1,4 @@
+/* $Id: UINetworkRequestWidget.h $ */
/** @file
* VBox Qt GUI - UINetworkRequestWidget stuff declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UIUpdateDefs.h b/src/VBox/Frontends/VirtualBox/src/net/UIUpdateDefs.h
index e13fccd..5bf8a91 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UIUpdateDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UIUpdateDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UIUpdateDefs.h $ */
/** @file
* VBox Qt GUI - Update routine related declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/net/UIUpdateManager.h b/src/VBox/Frontends/VirtualBox/src/net/UIUpdateManager.h
index 793041b..cd031b4 100644
--- a/src/VBox/Frontends/VirtualBox/src/net/UIUpdateManager.h
+++ b/src/VBox/Frontends/VirtualBox/src/net/UIUpdateManager.h
@@ -1,3 +1,4 @@
+/* $Id: UIUpdateManager.h $ */
/** @file
* VBox Qt GUI - UIUpdateManager class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/objects/UIRichTextString.cpp b/src/VBox/Frontends/VirtualBox/src/objects/UIRichTextString.cpp
new file mode 100644
index 0000000..be86bf5
--- /dev/null
+++ b/src/VBox/Frontends/VirtualBox/src/objects/UIRichTextString.cpp
@@ -0,0 +1,233 @@
+/* $Id: UIRichTextString.cpp $ */
+/** @file
+ * VBox Qt GUI - UIRichTextString class implementation.
+ */
+
+/*
+ * Copyright (C) 2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifdef VBOX_WITH_PRECOMPILED_HEADERS
+# include <precomp.h>
+#else /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+/* Qt includes: */
+# include <QApplication>
+# include <QPalette>
+
+/* GUI includes: */
+# include "UIRichTextString.h"
+
+/* Other VBox includes: */
+# include "iprt/assert.h"
+
+#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+
+const QString UIRichTextString::m_sstrAny = QString("[\\s\\S]*");
+const QMap<UIRichTextString::Type, QString> UIRichTextString::m_sPatterns = populatePatterns();
+const QMap<UIRichTextString::Type, bool> UIRichTextString::m_sPatternHasMeta = populatePatternHasMeta();
+
+UIRichTextString::UIRichTextString(Type type /* = Type_None */)
+ : m_type(type)
+ , m_strString(QString())
+ , m_strStringMeta(QString())
+{
+}
+
+UIRichTextString::UIRichTextString(const QString &strString, Type type /* = Type_None */, const QString &strStringMeta /* = QString() */)
+ : m_type(type)
+ , m_strString(strString)
+ , m_strStringMeta(strStringMeta)
+{
+ //printf("Creating new UIRichTextString with string=\"%s\" and string-meta=\"%s\"\n",
+ // m_strString.toAscii().constData(), m_strStringMeta.toAscii().constData());
+ parse();
+}
+
+UIRichTextString::~UIRichTextString()
+{
+ /* Erase the map: */
+ qDeleteAll(m_strings.begin(), m_strings.end());
+ m_strings.clear();
+}
+
+QString UIRichTextString::toString() const
+{
+ /* Add own string first: */
+ QString strString = m_strString;
+
+ /* Add all the strings of children finally: */
+ foreach (const int &iPosition, m_strings.keys())
+ strString.insert(iPosition, m_strings.value(iPosition)->toString());
+
+ /* Return result: */
+ return strString;
+}
+
+QList<QTextLayout::FormatRange> UIRichTextString::formatRanges(int iShift /* = 0 */) const
+{
+ /* Prepare format range list: */
+ QList<QTextLayout::FormatRange> ranges;
+
+ /* Add own format range first: */
+ QTextLayout::FormatRange range;
+ range.start = iShift;
+ range.length = toString().size();
+ range.format = textCharFormat(m_type);
+ /* Enable anchor if present: */
+ if (!m_strAnchor.isNull())
+ {
+ range.format.setAnchorHref(m_strAnchor);
+ /* Highlight anchor if hovered: */
+ if (range.format.anchorHref() == m_strHoveredAnchor)
+ range.format.setForeground(qApp->palette().color(QPalette::Link));
+ }
+ ranges.append(range);
+
+ /* Add all the format ranges of children finally: */
+ foreach (const int &iPosition, m_strings.keys())
+ ranges.append(m_strings.value(iPosition)->formatRanges(iShift + iPosition));
+
+ /* Return result: */
+ return ranges;
+}
+
+void UIRichTextString::setHoveredAnchor(const QString &strHoveredAnchor)
+{
+ /* Define own hovered anchor first: */
+ m_strHoveredAnchor = strHoveredAnchor;
+
+ /* Propagate hovered anchor to children finally: */
+ foreach (const int &iPosition, m_strings.keys())
+ m_strings.value(iPosition)->setHoveredAnchor(m_strHoveredAnchor);
+}
+
+void UIRichTextString::parse()
+{
+ /* Assign the meta to anchor directly for now,
+ * will do a separate parsing when there will
+ * be more than one type of meta: */
+ if (!m_strStringMeta.isNull())
+ m_strAnchor = m_strStringMeta;
+
+ /* Parse the passed QString with all the known patterns: */
+ foreach (const Type &enmPattern, m_sPatterns.keys())
+ {
+ /* Get the current pattern: */
+ const QString strPattern = m_sPatterns.value(enmPattern);
+
+ /* Recursively parse the string: */
+ int iMaxLevel = 0;
+ do
+ {
+ /* Search for the maximum level of the current pattern: */
+ iMaxLevel = searchForMaxLevel(m_strString, strPattern, strPattern);
+ //printf(" Maximum level for the pattern \"%s\" is %d.\n",
+ // strPattern.toAscii().constData(), iMaxLevel);
+ /* If current pattern of at least level 1 is found: */
+ if (iMaxLevel > 0)
+ {
+ /* Compose full pattern of the corresponding level: */
+ const QString strFullPattern = composeFullPattern(strPattern, strPattern, iMaxLevel);
+ //printf(" Full pattern: %s\n", strFullPattern.toAscii().constData());
+ QRegExp regExp(strFullPattern);
+ regExp.setMinimal(true);
+ const int iPosition = regExp.indexIn(m_strString);
+ AssertReturnVoid(iPosition != -1);
+ if (iPosition != -1)
+ {
+ /* Cut the found string: */
+ m_strString.remove(iPosition, regExp.cap(0).size());
+ /* And paste that string as our child: */
+ const bool fPatterHasMeta = m_sPatternHasMeta.value(enmPattern);
+ const QString strSubString = !fPatterHasMeta ? regExp.cap(1) : regExp.cap(2);
+ const QString strSubMeta = !fPatterHasMeta ? QString() : regExp.cap(1);
+ m_strings.insert(iPosition, new UIRichTextString(strSubString, enmPattern, strSubMeta));
+ }
+ }
+ }
+ while (iMaxLevel > 0);
+ }
+}
+
+/* static */
+QMap<UIRichTextString::Type, QString> UIRichTextString::populatePatterns()
+{
+ QMap<Type, QString> patterns;
+ patterns.insert(Type_Anchor, QString("<a href=([^>]+)>(%1)</a>"));
+ patterns.insert(Type_Bold, QString("<b>(%1)</b>"));
+ patterns.insert(Type_Italic, QString("<i>(%1)</i>"));
+ return patterns;
+}
+
+/* static */
+QMap<UIRichTextString::Type, bool> UIRichTextString::populatePatternHasMeta()
+{
+ QMap<Type, bool> patternHasMeta;
+ patternHasMeta.insert(Type_Anchor, true);
+ patternHasMeta.insert(Type_Bold, false);
+ patternHasMeta.insert(Type_Italic, false);
+ return patternHasMeta;
+}
+
+/* static */
+int UIRichTextString::searchForMaxLevel(const QString &strString, const QString &strPattern,
+ const QString &strCurrentPattern, int iCurrentLevel /* = 0 */)
+{
+ QRegExp regExp(strCurrentPattern.arg(m_sstrAny));
+ regExp.setMinimal(true);
+ if (regExp.indexIn(strString) != -1)
+ return searchForMaxLevel(strString, strPattern,
+ strCurrentPattern.arg(m_sstrAny + strPattern + m_sstrAny),
+ iCurrentLevel + 1);
+ return iCurrentLevel;
+}
+
+/* static */
+QString UIRichTextString::composeFullPattern(const QString &strPattern,
+ const QString &strCurrentPattern, int iCurrentLevel)
+{
+ if (iCurrentLevel > 1)
+ return composeFullPattern(strPattern,
+ strCurrentPattern.arg(m_sstrAny + strPattern + m_sstrAny),
+ iCurrentLevel - 1);
+ return strCurrentPattern.arg(m_sstrAny);
+}
+
+/* static */
+QTextCharFormat UIRichTextString::textCharFormat(Type type)
+{
+ QTextCharFormat format;
+ switch (type)
+ {
+ case Type_Anchor:
+ {
+ format.setAnchor(true);
+ break;
+ }
+ case Type_Bold:
+ {
+ QFont font = format.font();
+ font.setBold(true);
+ format.setFont(font);
+ break;
+ }
+ case Type_Italic:
+ {
+ QFont font = format.font();
+ font.setItalic(true);
+ format.setFont(font);
+ break;
+ }
+ }
+ return format;
+}
+
diff --git a/src/VBox/Frontends/VirtualBox/src/objects/UIRichTextString.h b/src/VBox/Frontends/VirtualBox/src/objects/UIRichTextString.h
new file mode 100644
index 0000000..4b6ebae
--- /dev/null
+++ b/src/VBox/Frontends/VirtualBox/src/objects/UIRichTextString.h
@@ -0,0 +1,114 @@
+/* $Id: UIRichTextString.h $ */
+/** @file
+ * VBox Qt GUI - UIRichTextString class declaration.
+ */
+
+/*
+ * Copyright (C) 2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#ifndef ___UIRichTextString_h___
+#define ___UIRichTextString_h___
+
+/* Qt includes: */
+#include <QTextLayout>
+
+/** Rich text string implementation which parses the passed QString
+ * and holds it as the tree of the formatted rich text blocks. */
+class UIRichTextString
+{
+public:
+
+ /** Rich text block types. */
+ enum Type
+ {
+ Type_None,
+ Type_Anchor,
+ Type_Bold,
+ Type_Italic,
+ };
+
+ /** Default (empty) constructor. */
+ UIRichTextString(Type type = Type_None);
+
+ /** Constructor taking passed QString.
+ * @param strString holds the string being parsed and held as the tree of rich text blocks,
+ * @param type holds the type of <i>this</i> rich text block,
+ * @param strStringMeta holds the string containing meta data describing <i>this</i> rich text block. */
+ UIRichTextString(const QString &strString, Type type = Type_None, const QString &strStringMeta = QString());
+
+ /** Destructor. */
+ ~UIRichTextString();
+
+ /** Returns the QString representation. */
+ QString toString() const;
+
+ /** Returns the list of existing format ranges appropriate for QTextLayout.
+ * @param iShift holds the shift of <i>this</i> rich text block accordig to it's root. */
+ QList<QTextLayout::FormatRange> formatRanges(int iShift = 0) const;
+
+ /** Defines the anchor to highlight in <i>this</i> rich text block and in it's children. */
+ void setHoveredAnchor(const QString &strHoveredAnchor);
+
+private:
+
+ /** Parses the string. */
+ void parse();
+
+ /** Used to populate const static map of known patterns.
+ * @note Keep it sync with the method below - #populatePatternHasMeta(). */
+ static QMap<Type, QString> populatePatterns();
+ /** Used to populate const static map of meta flags for the known patterns.
+ * @note Keep it sync with the method above - #populatePatterns(). */
+ static QMap<Type, bool> populatePatternHasMeta();
+
+ /** Recursively searching for the maximum level of the passed pattern.
+ * @param strString holds the string to check for the current (recursively advanced) pattern in,
+ * @param strPattern holds the etalon pattern to recursively advance the current pattern with,
+ * @param strCurrentPattern holds the current (recursively advanced) pattern to check for the presence of,
+ * @param iCurrentLevel holds the current level of the recursively advanced pattern. */
+ static int searchForMaxLevel(const QString &strString, const QString &strPattern,
+ const QString &strCurrentPattern, int iCurrentLevel = 0);
+
+ /** Recursively composing the pattern of the maximum level.
+ * @param strPattern holds the etalon pattern to recursively update the current pattern with,
+ * @param strCurrentPattern holds the current (recursively advanced) pattern,
+ * @param iCurrentLevel holds the amount of the levels left to recursively advance current pattern. */
+ static QString composeFullPattern(const QString &strPattern,
+ const QString &strCurrentPattern, int iCurrentLevel);
+
+ /** Composes the QTextCharFormat correpoding to passed @a type. */
+ static QTextCharFormat textCharFormat(Type type);
+
+ /** Holds the type of <i>this</i> rich text block. */
+ Type m_type;
+ /** Holds the string of <i>this</i> rich text block. */
+ QString m_strString;
+ /** Holds the string meta data of <i>this</i> rich text block. */
+ QString m_strStringMeta;
+ /** Holds the children of <i>this</i> rich text block. */
+ QMap<int, UIRichTextString*> m_strings;
+
+ /** Holds the anchor of <i>this</i> rich text block. */
+ QString m_strAnchor;
+ /** Holds the anchor to highlight in <i>this</i> rich text block and in it's children. */
+ QString m_strHoveredAnchor;
+
+ /** Holds the <i>any</i> string pattern. */
+ static const QString m_sstrAny;
+ /** Holds the map of known patterns. */
+ static const QMap<Type, QString> m_sPatterns;
+ /** Holds the map of meta flags for the known patterns. */
+ static const QMap<Type, bool> m_sPatternHasMeta;
+};
+
+#endif /* !___UIRichTextString_h___ */
+
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/UIDesktopServices.h b/src/VBox/Frontends/VirtualBox/src/platform/UIDesktopServices.h
index 64ac84e..d12b6a6 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/UIDesktopServices.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/UIDesktopServices.h
@@ -1,3 +1,4 @@
+/* $Id: UIDesktopServices.h $ */
/** @file
* VBox Qt GUI - Desktop Services..
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/CocoaEventHelper.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/CocoaEventHelper.h
index c57c8ce..6c8574a 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/CocoaEventHelper.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/CocoaEventHelper.h
@@ -1,3 +1,4 @@
+/* $Id: CocoaEventHelper.h $ */
/** @file
* VBox Qt GUI - Declarations of utility functions for handling Darwin Cocoa
* specific event handling tasks.
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.h
index ea935c8..06cb979 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
* VBox Qt GUI - Common GUI Library - Darwin Keyboard routines.
*
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.h
index 80d38fd..37eaa98 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaApplication.h
@@ -1,3 +1,4 @@
+/* $Id: UICocoaApplication.h $ */
/** @file
* VBox Qt GUI - UICocoaApplication - C++ interface to NSApplication for handling -sendEvent.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.h
index c8f370b..30ce95d 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.h
@@ -1,3 +1,4 @@
+/* $Id: UICocoaSpecialControls.h $ */
/** @file
* VBox Qt GUI - VBoxCocoaSpecialControls class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UIDesktopServices_darwin_p.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UIDesktopServices_darwin_p.h
index 6227acb..9c5263a 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UIDesktopServices_darwin_p.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UIDesktopServices_darwin_p.h
@@ -1,3 +1,4 @@
+/* $Id: UIDesktopServices_darwin_p.h $ */
/** @file
* VBox Qt GUI - Qt GUI - Utility Classes and Functions specific to darwin..
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UIWindowMenuManager.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UIWindowMenuManager.h
index e45a700..0815d67 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UIWindowMenuManager.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UIWindowMenuManager.h
@@ -1,3 +1,4 @@
+/* $Id: UIWindowMenuManager.h $ */
/** @file
* VBox Qt GUI - UIWindowMenuManager class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxCocoaHelper.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxCocoaHelper.h
index fdabdce..28c16da 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxCocoaHelper.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxCocoaHelper.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxCocoaHelper.h $ */
/** @file
* VBox Qt GUI - VBoxCocoa Helper.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h
index 1c0b842..8cf73b9 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxUtils-darwin.h $ */
/** @file
* VBox Qt GUI - Declarations of utility classes and functions for handling Darwin specific tasks.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/os2/VBoxHlp.h b/src/VBox/Frontends/VirtualBox/src/platform/os2/VBoxHlp.h
index 8e21e43..4237951 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/os2/VBoxHlp.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/os2/VBoxHlp.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxHlp.h $ */
/** @file
* VBox Qt GUI - Declaration of OS/2-specific helpers that require to reside in a DLL.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/win/VBoxUtils-win.h b/src/VBox/Frontends/VirtualBox/src/platform/win/VBoxUtils-win.h
index b511b6b..7738211 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/win/VBoxUtils-win.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/win/VBoxUtils-win.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxUtils-win.h $ */
/** @file
* VBox Qt GUI - Declarations of utility classes and functions for handling Win specific tasks.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/x11/VBoxX11Helper.h b/src/VBox/Frontends/VirtualBox/src/platform/x11/VBoxX11Helper.h
index 7ffadea..c0d892a 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/x11/VBoxX11Helper.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/x11/VBoxX11Helper.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxX11Helper.h $ */
/** @file
* VBox Qt GUI - VBox X11 helper functions.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/platform/x11/XKeyboard.h b/src/VBox/Frontends/VirtualBox/src/platform/x11/XKeyboard.h
index 114243e..2f54f04 100644
--- a/src/VBox/Frontends/VirtualBox/src/platform/x11/XKeyboard.h
+++ b/src/VBox/Frontends/VirtualBox/src/platform/x11/XKeyboard.h
@@ -1,3 +1,4 @@
+/* $Id: XKeyboard.h $ */
/** @file
* VBox Qt GUI - Declarations of Linux-specific keyboard functions.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/precomp.cpp b/src/VBox/Frontends/VirtualBox/src/precomp.cpp
index 5605257..564bd1c 100644
--- a/src/VBox/Frontends/VirtualBox/src/precomp.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/precomp.cpp
@@ -1,3 +1,4 @@
+/* $Id: precomp.cpp $ */
#include "precomp.h"
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
index 057425b..4475bb2 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIActionPoolRuntime.h
@@ -1,3 +1,4 @@
+/* $Id: UIActionPoolRuntime.h $ */
/** @file
* VBox Qt GUI - UIActionPoolRuntime class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIAddDiskEncryptionPasswordDialog.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIAddDiskEncryptionPasswordDialog.h
index 2c3a6c4..3ffccb4 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIAddDiskEncryptionPasswordDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIAddDiskEncryptionPasswordDialog.h
@@ -1,3 +1,4 @@
+/* $Id: UIAddDiskEncryptionPasswordDialog.h $ */
/** @file
* VBox Qt GUI - UIAddDiskEncryptionPasswordDialog class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h
index 7eccfd9..8dae9b3 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIConsoleEventHandler.h
@@ -1,3 +1,4 @@
+/* $Id: UIConsoleEventHandler.h $ */
/** @file
* VBox Qt GUI - UIConsoleEventHandler class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDDrag.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDDrag.cpp
index 7d213dc..11272f6 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDDrag.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDDrag.cpp
@@ -146,11 +146,11 @@ int UIDnDDrag::RetrieveData(const CSession &session,
int rc = VINF_SUCCESS;
CGuest guest = session.GetConsole().GetGuest();
- /* Start getting the data from the source. First inform the source we
- * want the data in the specified MIME type. */
+ /* Start getting the data from the source. Request and transfer data
+ * from the source and display a moddal progress dialog while doing this. */
CProgress progress = dndSource.Drop(strMimeType,
UIDnDHandler::toVBoxDnDAction(dropAction));
- if (guest.isOk())
+ if (dndSource.isOk())
{
msgCenter().showModalProgressDialog(progress,
tr("Retrieving data ..."), ":/progress_dnd_gh_90px.png",
@@ -163,8 +163,7 @@ int UIDnDDrag::RetrieveData(const CSession &session,
if (RT_SUCCESS(rc))
{
- /* After we successfully retrieved data from
- * the source, we query it from Main. */
+ /* After we successfully retrieved data from the source we query it from Main. */
QVector<uint8_t> vecData = dndSource.ReceiveData();
if (!vecData.isEmpty())
{
@@ -201,14 +200,14 @@ int UIDnDDrag::RetrieveData(const CSession &session,
rc = VERR_NO_DATA;
}
else
- msgCenter().cannotDropData(progress, pParent);
+ msgCenter().cannotDropDataToHost(progress, pParent);
}
- else
+ else /* Don't pop up a message. */
rc = VERR_CANCELLED;
}
else
{
- msgCenter().cannotDropData(guest, pParent);
+ msgCenter().cannotDropDataToHost(dndSource, pParent);
rc = VERR_GENERAL_FAILURE; /** @todo Fudge; do a GetResultCode() to rc translation. */
}
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDHandler.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDHandler.cpp
index 34dc06a..c4540f9 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDHandler.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIDnDHandler.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -42,12 +42,13 @@
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
-#undef LOG_GROUP
+#ifdef LOG_GROUP
+ #undef LOG_GROUP
+#endif
#define LOG_GROUP LOG_GROUP_GUEST_DND
#include <VBox/log.h>
-
UIDnDHandler *UIDnDHandler::m_pInstance = NULL;
UIDnDHandler::UIDnDHandler(void)
@@ -126,28 +127,35 @@ Qt::DropAction UIDnDHandler::dragDrop(CSession &session, CDnDTarget &dndTarget,
if ( !d.isEmpty()
&& !format.isEmpty())
{
- /* Convert the actual MIME data to a vector (needed
- * for the COM wrapper). */
+ /* Convert the actual MIME data to a vector (needed for the COM wrapper). */
QVector<uint8_t> dv(d.size());
memcpy(dv.data(), d.constData(), d.size());
CProgress progress = dndTarget.SendData(screenId, format, dv);
- if (guest.isOk())
+
+ if (dndTarget.isOk())
{
+ LogFlowFunc(("Transferring data to guest ...\n"));
+
msgCenter().showModalProgressDialog(progress,
tr("Dropping data ..."), ":/progress_dnd_hg_90px.png",
pParent);
- if ( !progress.GetCanceled()
+
+ LogFlowFunc(("Transfer fCompleted=%RTbool, fCanceled=%RTbool, hr=%Rhrc\n",
+ progress.GetCompleted(), progress.GetCanceled(), progress.GetResultCode()));
+
+ BOOL fCanceled = progress.GetCanceled();
+ if ( !fCanceled
&& ( !progress.isOk()
|| progress.GetResultCode() != 0))
{
- msgCenter().cannotDropData(progress, pParent);
+ msgCenter().cannotDropDataToGuest(progress, pParent);
result = KDnDAction_Ignore;
}
}
else
{
- msgCenter().cannotDropData(guest, pParent);
+ msgCenter().cannotDropDataToGuest(dndTarget, pParent);
result = KDnDAction_Ignore;
}
}
@@ -248,6 +256,7 @@ int UIDnDHandler::dragIsPending(CSession &session, CDnDSource &dndSource,
else /* No format data from the guest arrived yet. */
rc = VERR_NO_DATA;
#else /* !VBOX_WITH_DRAG_AND_DROP_GH */
+ NOREF(dndSource);
NOREF(session);
NOREF(screenId);
NOREF(pParent);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
index e0b56cc..55eb8a0 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.cpp
@@ -1182,7 +1182,7 @@ void UIFrameBufferPrivate::performResize(int iWidth, int iHeight)
if (m_sourceBitmap.isNull())
{
LogRel(("GUI: UIFrameBufferPrivate::performResize: "
- "Using FALLBACK buffer due to source-bitmap is not provided..\n"));
+ "Using fallback buffer since no source-bitmap is provided\n"));
/* Remember new size came from hint: */
m_iWidth = iWidth;
@@ -1256,6 +1256,9 @@ void UIFrameBufferPrivate::performResize(int iWidth, int iHeight)
emit sigSetVisibleRegion(m_syncVisibleRegion);
}
+ /* Make sure that the current screen image is immediately displayed: */
+ m_pMachineView->viewport()->update();
+
unlock();
}
@@ -1528,7 +1531,7 @@ void UIFrameBufferPrivate::drawImageRect(QPainter &painter, const QImage &image,
{
/* Fast scale sub-pixmap (2nd copy involved): */
subPixmap = subPixmap.scaled(subPixmap.size() * dBackingScaleFactor,
- Qt::IgnoreAspectRatio, transformationMode(enmScalingOptimizationType));
+ Qt::IgnoreAspectRatio, Qt::FastTransformation);
}
#ifdef Q_WS_MAC
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h
index aed5263..f38e503 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIFrameBuffer.h
@@ -1,3 +1,4 @@
+/* $Id: UIFrameBuffer.h $ */
/** @file
* VBox Qt GUI - UIFrameBuffer class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h
index bae2d7a..d565b5e 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIIndicatorsPool.h
@@ -1,3 +1,4 @@
+/* $Id: UIIndicatorsPool.h $ */
/** @file
* VBox Qt GUI - UIIndicatorsPool class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
index 6ca64fa..07cf789 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp
@@ -1402,8 +1402,8 @@ void UIKeyboardHandler::keyEventHandleHostComboRelease(ulong uScreenId)
#endif /* Q_WS_X11 */
if (m_fIsKeyboardCaptured)
{
- if (uisession()->mouseCapturePolicy() == MouseCapturePolicy_Default ||
- uisession()->mouseCapturePolicy() == MouseCapturePolicy_HostComboOnly)
+ const MouseCapturePolicy mcp = gEDataManager->mouseCapturePolicy(vboxGlobal().managedVMUuid());
+ if (mcp == MouseCapturePolicy_Default || mcp == MouseCapturePolicy_HostComboOnly)
machineLogic()->mouseHandler()->captureMouse(uScreenId);
}
else
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h
index c54ce17..139d2af 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h
@@ -1,3 +1,4 @@
+/* $Id: UIKeyboardHandler.h $ */
/** @file
* VBox Qt GUI - UIKeyboardHandler class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h
index 4bdb748..167bea9 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachine.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachine.h $ */
/** @file
* VBox Qt GUI - UIMachine class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineDefs.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineDefs.h
index e062c8f..95507d9 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineDefs.h $ */
/** @file
* VBox Qt GUI - Defines for Virtual Machine classes.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
index ce9def1..bfecca0 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.cpp
@@ -377,8 +377,9 @@ UIMachineView* UIMachineLogic::dockPreviewView() const
void UIMachineLogic::saveState()
{
- /* Prevent auto-closure: */
- setPreventAutoClose(true);
+ /* Enable 'manual-override',
+ * preventing automatic Runtime UI closing: */
+ setManualOverrideMode(true);
/* Was the step successful? */
bool fSuccess = true;
@@ -390,8 +391,8 @@ void UIMachineLogic::saveState()
if (fSuccess)
fSuccess = uisession()->saveState();
- /* Allow auto-closure: */
- setPreventAutoClose(false);
+ /* Disable 'manual-override' finally: */
+ setManualOverrideMode(false);
/* Manually close Runtime UI: */
if (fSuccess)
@@ -410,8 +411,9 @@ void UIMachineLogic::shutdown()
void UIMachineLogic::powerOff(bool fDiscardingState)
{
- /* Prevent auto-closure: */
- setPreventAutoClose(true);
+ /* Enable 'manual-override',
+ * preventing automatic Runtime UI closing: */
+ setManualOverrideMode(true);
/* Was the step successful? */
bool fSuccess = true;
@@ -419,8 +421,8 @@ void UIMachineLogic::powerOff(bool fDiscardingState)
bool fServerCrashed = false;
fSuccess = uisession()->powerOff(fDiscardingState, fServerCrashed) || fServerCrashed;
- /* Allow auto-closure: */
- setPreventAutoClose(false);
+ /* Disable 'manual-override' finally: */
+ setManualOverrideMode(false);
/* Manually close Runtime UI: */
if (fSuccess)
@@ -500,7 +502,7 @@ void UIMachineLogic::sltMachineStateChanged()
/* Take the screenshot for debugging purposes: */
takeScreenshot(strLogFolder + "/VBox.png", "png");
/* How should we handle Guru Meditation? */
- switch (uisession()->guruMeditationHandlerType())
+ switch (gEDataManager->guruMeditationHandlerType(vboxGlobal().managedVMUuid()))
{
/* Ask how to proceed; Power off VM if proposal accepted: */
case GuruMeditationHandlerType_Default:
@@ -554,8 +556,8 @@ void UIMachineLogic::sltMachineStateChanged()
case KMachineState_Teleported:
case KMachineState_Aborted:
{
- /* Is it allowed to close Runtime UI? */
- if (!isPreventAutoClose())
+ /* If not in 'manual-override' mode: */
+ if (!isManualOverrideMode())
{
/* VM has been powered off, saved, teleported or aborted.
* We must close Runtime UI: */
@@ -752,7 +754,7 @@ UIMachineLogic::UIMachineLogic(QObject *pParent, UISession *pSession, UIVisualSt
, m_pSharedClipboardActions(0)
, m_pDragAndDropActions(0)
, m_fIsWindowsCreated(false)
- , m_fIsPreventAutoClose(false)
+ , m_fIsManualOverride(false)
#ifdef VBOX_WITH_DEBUGGER_GUI
, m_pDbgGui(0)
, m_pDbgGuiVT(0)
@@ -1505,8 +1507,8 @@ void UIMachineLogic::sltClose()
if (!isMachineWindowsCreated())
return;
- /* Do not try to close machine-window if restricted: */
- if (isPreventAutoClose())
+ /* Do not close machine-window in 'manual-override' mode: */
+ if (isManualOverrideMode())
return;
/* First, we have to close/hide any opened modal & popup application widgets.
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h
index 87feccd..ad7acfc 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineLogic.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineLogic.h $ */
/** @file
* VBox Qt GUI - UIMachineLogic class declaration.
*/
@@ -116,9 +117,12 @@ public:
UIMachineWindow* mainMachineWindow() const;
UIMachineWindow* activeMachineWindow() const;
- /* Maintenance getters/setters: */
- bool isPreventAutoClose() const { return m_fIsPreventAutoClose; }
- void setPreventAutoClose(bool fIsPreventAutoClose) { m_fIsPreventAutoClose = fIsPreventAutoClose; }
+ /** Returns whether VM is in 'manual-override' mode.
+ * @note S.a. #m_fIsManualOverride description for more information. */
+ bool isManualOverrideMode() const { return m_fIsManualOverride; }
+ /** Defines whether VM is in 'manual-override' mode.
+ * @note S.a. #m_fIsManualOverride description for more information. */
+ void setManualOverrideMode(bool fIsManualOverride) { m_fIsManualOverride = fIsManualOverride; }
/** Adjusts machine-window(s) geometry if necessary. */
virtual void adjustMachineWindowsGeometry();
@@ -359,7 +363,11 @@ private:
QMap<int, MenuUpdateHandler> m_menuUpdateHandlers;
bool m_fIsWindowsCreated : 1;
- bool m_fIsPreventAutoClose : 1;
+
+ /** Holds whether VM is in 'manual-override' mode
+ * which means there will be no automatic UI shutdowns,
+ * visual representation mode changes and other similar routines. */
+ bool m_fIsManualOverride : 1;
#ifdef VBOX_WITH_DEBUGGER_GUI
/* Debugger functionality: */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
index edb5a41..be0978c 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.cpp
@@ -233,7 +233,7 @@ void UIMachineView::sltPerformGuestResize(const QSize &toSize)
void UIMachineView::sltHandleNotifyChange(int iWidth, int iHeight)
{
- LogRel(("GUI: UIMachineView::sltHandleNotifyChange: Screen=%d, Size=%dx%d.\n",
+ LogRel(("GUI: UIMachineView::sltHandleNotifyChange: Screen=%d, Size=%dx%d\n",
(unsigned long)m_uScreenId, iWidth, iHeight));
// TODO: Move to appropriate place!
@@ -303,7 +303,7 @@ void UIMachineView::sltHandleNotifyChange(int iWidth, int iHeight)
* the viewport through IFramebuffer::NotifyUpdate): */
display().InvalidateAndUpdateScreen(m_uScreenId);
- LogRelFlow(("GUI: UIMachineView::sltHandleNotifyChange: Complete for Screen=%d, Size=%dx%d.\n",
+ LogRelFlow(("GUI: UIMachineView::sltHandleNotifyChange: Complete for Screen=%d, Size=%dx%d\n",
(unsigned long)m_uScreenId, iWidth, iHeight));
}
@@ -407,13 +407,26 @@ void UIMachineView::sltHandleScalingOptimizationChange(const QString &strMachine
if (strMachineID != vboxGlobal().managedVMUuid())
return;
- /* Take the scale-factor into account: */
+ /* Take the scaling-optimization type into account: */
frameBuffer()->setScalingOptimizationType(gEDataManager->scalingOptimizationType(vboxGlobal().managedVMUuid()));
/* Update viewport: */
viewport()->update();
}
+void UIMachineView::sltHandleHiDPIOptimizationChange(const QString &strMachineID)
+{
+ /* Skip unrelated machine IDs: */
+ if (strMachineID != vboxGlobal().managedVMUuid())
+ return;
+
+ /* Take the HiDPI-optimization type into account: */
+ frameBuffer()->setHiDPIOptimizationType(gEDataManager->hiDPIOptimizationType(vboxGlobal().managedVMUuid()));
+
+ /* Update viewport: */
+ viewport()->update();
+}
+
void UIMachineView::sltHandleUnscaledHiDPIOutputModeChange(const QString &strMachineID)
{
/* Skip unrelated machine IDs: */
@@ -555,7 +568,7 @@ void UIMachineView::prepareFrameBuffer()
/* Assign it's view: */
pFrameBuffer->setView(this);
/* Mark frame-buffer as used again: */
- LogRelFlow(("GUI: UIMachineView::prepareFrameBuffer: Start EMT callbacks accepting for screen: %d.\n", screenId()));
+ LogRelFlow(("GUI: UIMachineView::prepareFrameBuffer: Start EMT callbacks accepting for screen: %d\n", screenId()));
pFrameBuffer->setMarkAsUnused(false);
/* And remember our choice: */
m_pFrameBuffer = pFrameBuffer;
@@ -574,7 +587,10 @@ void UIMachineView::prepareFrameBuffer()
#endif /* !VBOX_WITH_VIDEOHWACCEL */
/* Take HiDPI optimization type into account: */
- m_pFrameBuffer->setHiDPIOptimizationType(uisession()->hiDPIOptimizationType());
+ m_pFrameBuffer->setHiDPIOptimizationType(gEDataManager->hiDPIOptimizationType(vboxGlobal().managedVMUuid()));
+
+ /* Take scaling optimization type into account: */
+ m_pFrameBuffer->setScalingOptimizationType(gEDataManager->scalingOptimizationType(vboxGlobal().managedVMUuid()));
#ifdef Q_WS_MAC
/* Take backing scale-factor into account: */
@@ -690,6 +706,9 @@ void UIMachineView::prepareConnections()
/* Scaling-optimization change: */
connect(gEDataManager, SIGNAL(sigScalingOptimizationTypeChange(const QString&)),
this, SLOT(sltHandleScalingOptimizationChange(const QString&)));
+ /* HiDPI-optimization change: */
+ connect(gEDataManager, SIGNAL(sigHiDPIOptimizationTypeChange(const QString&)),
+ this, SLOT(sltHandleHiDPIOptimizationChange(const QString&)));
/* Unscaled HiDPI output mode change: */
connect(gEDataManager, SIGNAL(sigUnscaledHiDPIOutputModeChange(const QString&)),
this, SLOT(sltHandleUnscaledHiDPIOutputModeChange(const QString&)));
@@ -729,7 +748,7 @@ void UIMachineView::cleanupFrameBuffer()
AssertReturnVoid(m_pFrameBuffer == uisession()->frameBuffer(screenId()));
/* Mark framebuffer as unused: */
- LogRelFlow(("GUI: UIMachineView::cleanupFrameBuffer: Stop EMT callbacks accepting for screen: %d.\n", screenId()));
+ LogRelFlow(("GUI: UIMachineView::cleanupFrameBuffer: Stop EMT callbacks accepting for screen: %d\n", screenId()));
m_pFrameBuffer->setMarkAsUnused(true);
/* Process pending framebuffer events: */
@@ -891,7 +910,7 @@ QSize UIMachineView::guestSizeHint()
void UIMachineView::handleScaleChange()
{
- LogRel(("GUI: UIMachineView::handleScaleChange: Screen=%d.\n",
+ LogRel(("GUI: UIMachineView::handleScaleChange: Screen=%d\n",
(unsigned long)m_uScreenId));
/* If machine-window is visible: */
@@ -931,7 +950,7 @@ void UIMachineView::handleScaleChange()
frameBuffer()->performRescale();
}
- LogRelFlow(("GUI: UIMachineView::handleScaleChange: Complete for Screen=%d.\n",
+ LogRelFlow(("GUI: UIMachineView::handleScaleChange: Complete for Screen=%d\n",
(unsigned long)m_uScreenId));
}
@@ -1442,7 +1461,6 @@ void UIMachineView::dragLeaveEvent(QDragLeaveEvent *pEvent)
void UIMachineView::dragIsPending(void)
{
- /* At the moment we only support guest->host DnD. */
/** @todo Add guest->guest DnD functionality here by getting
* the source of guest B (when copying from B to A). */
CDnDSource dndSource = static_cast<CDnDSource>(guest().GetDnDSource());
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h
index 785059a..6145866 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineView.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineView.h $ */
/** @file
* VBox Qt GUI - UIMachineView class declaration.
*/
@@ -125,6 +126,9 @@ protected slots:
/** Handles the scaling-optimization change. */
void sltHandleScalingOptimizationChange(const QString &strMachineID);
+ /** Handles the HiDPI-optimization change. */
+ void sltHandleHiDPIOptimizationChange(const QString &strMachineID);
+
/** Handles the unscaled HiDPI output mode change. */
void sltHandleUnscaledHiDPIOutputModeChange(const QString &strMachineID);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp
index 2d25f11..858b2eb 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp
@@ -338,9 +338,38 @@ void UIMachineWindow::closeEvent(QCloseEvent *pCloseEvent)
/* Make sure close-dialog is valid: */
if (pCloseDlg->isValid())
{
- /* If VM is not paused and not stuck, we should pause it first: */
- bool fWasPaused = uisession()->isPaused() || uisession()->isStuck();
- if (fWasPaused || uisession()->pause())
+ /* We are going to show close-dialog: */
+ bool fShowCloseDialog = true;
+ /* Check if VM is paused or stuck: */
+ const bool fWasPaused = uisession()->isPaused();
+ const bool fIsStuck = uisession()->isStuck();
+ /* If VM is NOT paused and NOT stuck: */
+ if (!fWasPaused && !fIsStuck)
+ {
+ /* We should pause it first: */
+ const bool fIsPaused = uisession()->pause();
+ /* If we were unable to pause VM: */
+ if (!fIsPaused)
+ {
+ /* If that is NOT the separate VM process UI: */
+ if (!vboxGlobal().isSeparateProcess())
+ {
+ /* We are not going to show close-dialog: */
+ fShowCloseDialog = false;
+ }
+ /* If that is the separate VM process UI: */
+ else
+ {
+ /* We are going to show close-dialog only
+ * if headless frontend stopped/killed already: */
+ CMachine machine = uisession()->machine();
+ KMachineState machineState = machine.GetState();
+ fShowCloseDialog = !machine.isOk() || machineState == KMachineState_Null;
+ }
+ }
+ }
+ /* If we are going to show close-dialog: */
+ if (fShowCloseDialog)
{
/* Show close-dialog to let the user make the choice: */
windowManager().registerNewParent(pCloseDlg, pParentDlg);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.h
index 39ef63a..921c359 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineWindow.h $ */
/** @file
* VBox Qt GUI - UIMachineWindow class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMenuBarEditorWindow.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMenuBarEditorWindow.h
index 4f7842d..1edf4ce 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMenuBarEditorWindow.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMenuBarEditorWindow.h
@@ -1,3 +1,4 @@
+/* $Id: UIMenuBarEditorWindow.h $ */
/** @file
* VBox Qt GUI - UIMenuBarEditorWindow class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp
index 23915e1..f005fd4 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp
@@ -1018,7 +1018,8 @@ bool UIMouseHandler::mouseEvent(int iEventType, ulong uScreenId,
qApp->processEvents();
#endif /* Q_WS_X11 */
machineLogic()->keyboardHandler()->captureKeyboard(uScreenId);
- if (uisession()->mouseCapturePolicy() == MouseCapturePolicy_Default)
+ const MouseCapturePolicy mcp = gEDataManager->mouseCapturePolicy(vboxGlobal().managedVMUuid());
+ if (mcp == MouseCapturePolicy_Default)
captureMouse(uScreenId);
}
}
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h
index 272c67e..89f9179 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h
@@ -1,3 +1,4 @@
+/* $Id: UIMouseHandler.h $ */
/** @file
* VBox Qt GUI - UIMouseHandler class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.cpp
index 12484bd..874a6e6 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.cpp
@@ -211,24 +211,6 @@ quint64 UIMultiScreenLayout::memoryRequirements() const
return memoryRequirements(m_screenMap);
}
-bool UIMultiScreenLayout::isHostTaskbarCovert() const
-{
- /* Check for all screens which are in use if they have some
- * taskbar/menubar/dock on it. Its done by comparing the available with the
- * screen geometry. Only if they are the same for all screens, there are no
- * host area covert. This is a little bit ugly, but there seems no other
- * way to find out if we are on a screen where the taskbar/dock or whatever
- * is present. */
- QDesktopWidget *pDW = QApplication::desktop();
- for (int i = 0; i < m_screenMap.size(); ++i)
- {
- int hostScreen = m_screenMap.value(i);
- if (pDW->availableGeometry(hostScreen) != pDW->screenGeometry(hostScreen))
- return true;
- }
- return false;
-}
-
void UIMultiScreenLayout::sltHandleScreenLayoutChange(int iRequestedGuestScreen, int iRequestedHostScreen)
{
/* Search for the virtual screen which is currently displayed on the
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.h
index 3f190a3..719c399 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMultiScreenLayout.h
@@ -1,3 +1,4 @@
+/* $Id: UIMultiScreenLayout.h $ */
/** @file
* VBox Qt GUI - UIMultiScreenLayout class declaration.
*/
@@ -53,7 +54,6 @@ public:
int hostScreenForGuestScreen(int iScreenId) const;
bool hasHostScreenForGuestScreen(int iScreenId) const;
quint64 memoryRequirements() const;
- bool isHostTaskbarCovert() const;
private slots:
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
index f724db9..1711b7d 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.cpp
@@ -197,6 +197,12 @@ bool UISession::initialize()
debugger().SetVirtualTimeRate(vboxGlobal().getWarpPct());
}
+ /* Apply ad-hoc reconfigurations from the command line: */
+ if (vboxGlobal().hasFloppyImageToMount())
+ mountAdHocImage(KDeviceType_Floppy, UIMediumType_Floppy, vboxGlobal().getFloppyImage());
+ if (vboxGlobal().hasDvdImageToMount())
+ mountAdHocImage(KDeviceType_DVD, UIMediumType_DVD, vboxGlobal().getDvdImage());
+
/* Power UP if this is NOT separate process: */
if (!vboxGlobal().isSeparateProcess())
if (!powerUp())
@@ -266,9 +272,11 @@ bool UISession::powerUp()
return false;
}
- /* Guard progressbar warnings from auto-closing: */
- if (uimachine()->machineLogic())
- uimachine()->machineLogic()->setPreventAutoClose(true);
+ /* Enable 'manual-override',
+ * preventing automatic Runtime UI closing
+ * and visual representation mode changes: */
+ if (machineLogic())
+ machineLogic()->setManualOverrideMode(true);
/* Show "Starting/Restoring" progress dialog: */
if (isSaved())
@@ -288,9 +296,9 @@ bool UISession::powerUp()
return false;
}
- /* Allow further auto-closing: */
- if (uimachine()->machineLogic())
- uimachine()->machineLogic()->setPreventAutoClose(false);
+ /* Disable 'manual-override' finally: */
+ if (machineLogic())
+ machineLogic()->setManualOverrideMode(false);
/* True by default: */
return true;
@@ -930,9 +938,6 @@ UISession::UISession(UIMachine *pMachine)
#ifndef Q_WS_MAC
, m_pMachineWindowIcon(0)
#endif /* !Q_WS_MAC */
- , m_mouseCapturePolicy(MouseCapturePolicy_Default)
- , m_guruMeditationHandlerType(GuruMeditationHandlerType_Default)
- , m_hiDPIOptimizationType(HiDPIOptimizationType_None)
, m_requestedVisualStateType(UIVisualStateType_Invalid)
#ifdef Q_WS_WIN
, m_alphaCursor(0)
@@ -1325,15 +1330,6 @@ void UISession::loadSessionSettings()
m_strMachineWindowNamePostfix = gEDataManager->machineWindowNamePostfix(strMachineID);
#endif /* !Q_WS_MAC */
- /* Determine mouse-capture policy: */
- m_mouseCapturePolicy = gEDataManager->mouseCapturePolicy(strMachineID);
-
- /* Determine Guru Meditation handler type: */
- m_guruMeditationHandlerType = gEDataManager->guruMeditationHandlerType(strMachineID);
-
- /* Determine HiDPI optimization type: */
- m_hiDPIOptimizationType = gEDataManager->hiDPIOptimizationType(strMachineID);
-
/* Is there should be First RUN Wizard? */
m_fIsFirstTimeStarted = gEDataManager->machineFirstTimeStarted(strMachineID);
@@ -1841,6 +1837,56 @@ bool UISession::preprocessInitialization()
return true;
}
+bool UISession::mountAdHocImage(KDeviceType enmDeviceType, UIMediumType enmMediumType, const QString &strImage)
+{
+ /* The 'none' image name means ejecting what ever is in the drive,
+ * so leave the image variables null. */
+ CVirtualBox vbox = vboxGlobal().virtualBox();
+ UIMedium uiImage;
+ if (strImage != "none")
+ {
+ /* Open the image: */
+ CVirtualBox vbox = vboxGlobal().virtualBox();
+ CMedium vboxImage = vbox.OpenMedium(strImage, enmDeviceType, KAccessMode_ReadWrite, false /* fForceNewUuid */);
+ if (!vbox.isOk() || vboxImage.isNull())
+ {
+ msgCenter().cannotOpenMedium(vbox, enmMediumType, strImage);
+ return false;
+ }
+
+ /* Work the cache and use the cached image if possible: */
+ uiImage = vboxGlobal().medium(vboxImage.GetId());
+ if (uiImage.isNull())
+ {
+ uiImage = UIMedium(vboxImage, enmMediumType, KMediumState_Created);
+ vboxGlobal().createMedium(uiImage);
+ }
+ }
+ if (vbox.isOk())
+ {
+ /* Find suitable storage controller: */
+ foreach (const CStorageController &controller, machine().GetStorageControllers())
+ {
+ foreach (const CMediumAttachment &attachment, machine().GetMediumAttachmentsOfController(controller.GetName()))
+ {
+ if (attachment.GetType() == enmDeviceType)
+ {
+ /* Mount the image: */
+ machine().MountMedium(controller.GetName(), attachment.GetPort(), attachment.GetDevice(), uiImage.medium(), true /* force */);
+ if (machine().isOk())
+ return true;
+ msgCenter().cannotRemountMedium(machine(), uiImage, !uiImage.isNull() /* mount */, false /* retry */);
+ return false;
+ }
+ }
+ }
+ msgCenter().cannotRemountMedium(machine(), uiImage, !uiImage.isNull() /* mount */, false /* retry */);
+ }
+ else
+ msgCenter().cannotOpenMedium(vbox, enmMediumType, strImage);
+ return false;
+}
+
bool UISession::postprocessInitialization()
{
/* Check if the required virtualization features are active. We get this info only when the session is active. */
@@ -1866,8 +1912,10 @@ bool UISession::postprocessInitialization()
/* If user asked to close VM: */
if (fShouldWeClose)
{
- /* Prevent auto-closure during power off sequence: */
- machineLogic()->setPreventAutoClose(true);
+ /* Enable 'manual-override',
+ * preventing automatic Runtime UI closing: */
+ if (machineLogic())
+ machineLogic()->setManualOverrideMode(true);
/* Power off VM: */
bool fServerCrashed = false;
powerOff(false, fServerCrashed);
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
index 0ecfaba..da03715 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UISession.h
@@ -1,3 +1,4 @@
+/* $Id: UISession.h $ */
/** @file
* VBox Qt GUI - UISession class declaration.
*/
@@ -25,6 +26,7 @@
/* GUI includes: */
#include "UIExtraDataDefs.h"
+#include "UIMediumDefs.h"
/* COM includes: */
#include "COMEnums.h"
@@ -134,16 +136,6 @@ public:
/** @} */
#endif /* !Q_WS_MAC */
- /** @name Runtime workflow stuff.
- ** @{ */
- /** Returns the mouse-capture policy. */
- MouseCapturePolicy mouseCapturePolicy() const { return m_mouseCapturePolicy; }
- /** Returns Guru Meditation handler type. */
- GuruMeditationHandlerType guruMeditationHandlerType() const { return m_guruMeditationHandlerType; }
- /** Returns HiDPI optimization type. */
- HiDPIOptimizationType hiDPIOptimizationType() const { return m_hiDPIOptimizationType; }
- /** @} */
-
/** @name Host-screen configuration variables.
** @{ */
/** Returns the list of host-screen geometries we currently have. */
@@ -377,6 +369,7 @@ private:
WId winId() const;
void setPointerShape(const uchar *pShapeData, bool fHasAlpha, uint uXHot, uint uYHot, uint uWidth, uint uHeight);
bool preprocessInitialization();
+ bool mountAdHocImage(KDeviceType enmDeviceType, UIMediumType enmMediumType, const QString &strImage);
bool postprocessInitialization();
int countOfVisibleWindows();
@@ -435,16 +428,6 @@ private:
/** @} */
#endif /* !Q_WS_MAC */
- /** @name Runtime workflow variables.
- ** @{ */
- /** Holds the mouse-capture policy. */
- MouseCapturePolicy m_mouseCapturePolicy;
- /** Holds Guru Meditation handler type. */
- GuruMeditationHandlerType m_guruMeditationHandlerType;
- /** Holds HiDPI optimization type. */
- HiDPIOptimizationType m_hiDPIOptimizationType;
- /** @} */
-
/** @name Visual-state configuration variables.
** @{ */
/** Determines which visual-state should be entered when possible. */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UISlidingToolBar.h b/src/VBox/Frontends/VirtualBox/src/runtime/UISlidingToolBar.h
index 84973b4..9c6f186 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UISlidingToolBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UISlidingToolBar.h
@@ -1,3 +1,4 @@
+/* $Id: UISlidingToolBar.h $ */
/** @file
* VBox Qt GUI - UISlidingToolBar class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIStatusBarEditorWindow.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIStatusBarEditorWindow.h
index e2f16ab..1c3ab5e 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIStatusBarEditorWindow.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIStatusBarEditorWindow.h
@@ -1,3 +1,4 @@
+/* $Id: UIStatusBarEditorWindow.h $ */
/** @file
* VBox Qt GUI - UIStatusBarEditorWindow class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.h
index 91dab1f..61a5a4e 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIVMCloseDialog.h
@@ -1,3 +1,4 @@
+/* $Id: UIVMCloseDialog.h $ */
/** @file
* VBox Qt GUI - UIVMCloseDialog class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIKeyboardHandlerFullscreen.h b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIKeyboardHandlerFullscreen.h
index 3bbd93f..714bc54 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIKeyboardHandlerFullscreen.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIKeyboardHandlerFullscreen.h
@@ -1,3 +1,4 @@
+/* $Id: UIKeyboardHandlerFullscreen.h $ */
/** @file
* VBox Qt GUI - UIKeyboardHandlerFullscreen class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp
index 1f8f60a..ef68d96 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.cpp
@@ -341,6 +341,10 @@ void UIMachineLogicFullscreen::sltCheckForRequestedVisualStateType()
if (!uisession()->isRunning() && !uisession()->isPaused())
return;
+ /* Do not try to change visual-state type in 'manual override' mode: */
+ if (isManualOverrideMode())
+ return;
+
/* Check requested visual-state types: */
switch (uisession()->requestedVisualState())
{
@@ -388,13 +392,6 @@ void UIMachineLogicFullscreen::sltInvokePopupMenu()
}
}
-#ifdef Q_WS_MAC
-void UIMachineLogicFullscreen::sltChangePresentationMode(bool /* fEnabled */)
-{
- setPresentationModeEnabled(true);
-}
-#endif /* Q_WS_MAC */
-
void UIMachineLogicFullscreen::sltScreenLayoutChanged()
{
LogRel(("UIMachineLogicFullscreen::sltScreenLayoutChanged: Multi-screen layout changed.\n"));
@@ -406,8 +403,6 @@ void UIMachineLogicFullscreen::sltScreenLayoutChanged()
/* Make sure all machine-window(s) have proper geometry: */
foreach (UIMachineWindow *pMachineWindow, machineWindows())
pMachineWindow->showInNecessaryMode();
- /* Update 'presentation mode': */
- setPresentationModeEnabled(true);
}
/* Revalidate native fullscreen for ML and next: */
else revalidateNativeFullScreen();
@@ -503,17 +498,6 @@ void UIMachineLogicFullscreen::prepareActionConnections()
this, SLOT(sltChangeVisualStateToScale()));
}
-#ifdef Q_WS_MAC
-void UIMachineLogicFullscreen::prepareOtherConnections()
-{
- /* Make sure 'presentation mode' preference handling
- * is updated at runtime for Lion and previous: */
- if (vboxGlobal().osRelease() <= MacOSXRelease_Lion)
- connect(gEDataManager, SIGNAL(sigPresentationModeChange(bool)),
- this, SLOT(sltChangePresentationMode(bool)));
-}
-#endif /* Q_WS_MAC */
-
void UIMachineLogicFullscreen::prepareMachineWindows()
{
/* Do not create machine-window(s) if they created already: */
@@ -554,9 +538,6 @@ void UIMachineLogicFullscreen::prepareMachineWindows()
this, SLOT(sltScreenLayoutChanged()));
#ifdef Q_WS_MAC
- /* Activate 'presentation mode': */
- setPresentationModeEnabled(true);
-
/* For ML and next: */
if (vboxGlobal().osRelease() > MacOSXRelease_Lion)
{
@@ -635,11 +616,6 @@ void UIMachineLogicFullscreen::cleanupMachineWindows()
/* Destroy machine-window(s): */
foreach (UIMachineWindow *pMachineWindow, machineWindows())
UIMachineWindow::destroy(pMachineWindow);
-
-#ifdef Q_WS_MAC
- /* Deactivate 'presentation mode': */
- setPresentationModeEnabled(false);
-#endif/* Q_WS_MAC */
}
void UIMachineLogicFullscreen::cleanupActionConnections()
@@ -681,37 +657,6 @@ void UIMachineLogicFullscreen::cleanupActionGroups()
}
#ifdef Q_WS_MAC
-void UIMachineLogicFullscreen::setPresentationModeEnabled(bool fEnabled)
-{
- /* Should we enable it? */
- if (fEnabled)
- {
- /* For Lion and previous: */
- if (vboxGlobal().osRelease() <= MacOSXRelease_Lion)
- {
- /* Check if we have screen which contains the Dock or the Menubar (which hasn't to be the same),
- * only than the 'presentation mode' have to be changed. */
- if (m_pScreenLayout->isHostTaskbarCovert())
- {
- if (gEDataManager->presentationModeEnabled(vboxGlobal().managedVMUuid()))
- SetSystemUIMode(kUIModeAllHidden, 0);
- else
- SetSystemUIMode(kUIModeAllSuppressed, 0);
- }
- }
- /* For ML and next: */
- else
- {
- /* I am not sure we have to check anything here.
- * Without 'presentation mode' native fullscreen works pretty bad,
- * so we have to enable it anyway: */
- SetSystemUIMode(kUIModeAllSuppressed, 0);
- }
- }
- /* Should we disable it? */
- else SetSystemUIMode(kUIModeNormal, 0);
-}
-
void UIMachineLogicFullscreen::revalidateNativeFullScreen(UIMachineWindow *pMachineWindow)
{
/* Make sure that is full-screen machine-window: */
@@ -771,9 +716,6 @@ void UIMachineLogicFullscreen::revalidateNativeFullScreen(UIMachineWindow *pMach
LogRel(("UIMachineLogicFullscreen::revalidateNativeFullScreen: "
"Ask machine-window #%d to enter native fullscreen.\n", (int)uScreenID));
- /* Update 'presentation mode': */
- setPresentationModeEnabled(true);
-
/* Make sure window have proper geometry and shown: */
pMachineWindow->showInNecessaryMode();
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.h b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.h
index 07b14c1..d09560f 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineLogicFullscreen.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineLogicFullscreen.h $ */
/** @file
* VBox Qt GUI - UIMachineLogicFullscreen class declaration.
*/
@@ -99,10 +100,6 @@ private slots:
/** Invokes popup-menu. */
void sltInvokePopupMenu();
-#ifdef RT_OS_DARWIN
- void sltChangePresentationMode(bool fEnabled);
-#endif /* RT_OS_DARWIN */
-
/** Updates machine-window(s) location/size on screen-layout changes. */
void sltScreenLayoutChanged();
@@ -118,24 +115,16 @@ private:
/* Prepare helpers: */
void prepareActionGroups();
void prepareActionConnections();
-#ifdef Q_WS_MAC
- void prepareOtherConnections();
-#endif /* Q_WS_MAC */
void prepareMachineWindows();
void prepareMenu();
/* Cleanup helpers: */
void cleanupMenu();
void cleanupMachineWindows();
-#ifdef Q_WS_MAC
- //void cleanupOtherConnections() {}
-#endif /* Q_WS_MAC */
void cleanupActionConnections();
void cleanupActionGroups();
#ifdef Q_WS_MAC
- void setPresentationModeEnabled(bool fEnabled);
-
/** Mac OS X: Revalidates 'fullscreen' mode for @a pMachineWindow. */
void revalidateNativeFullScreen(UIMachineWindow *pMachineWindow);
/** Mac OS X: Revalidates 'fullscreen' mode for all windows. */
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineViewFullscreen.h b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineViewFullscreen.h
index ac7da21..2040348 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineViewFullscreen.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineViewFullscreen.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineViewFullscreen.h $ */
/** @file
* VBox Qt GUI - UIMachineViewFullscreen class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.h b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.h
index a7068a3..b046e0f 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/fullscreen/UIMachineWindowFullscreen.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineWindowFullscreen.h $ */
/** @file
* VBox Qt GUI - UIMachineWindowFullscreen class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIKeyboardHandlerNormal.h b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIKeyboardHandlerNormal.h
index c56361d..b97c750 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIKeyboardHandlerNormal.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIKeyboardHandlerNormal.h
@@ -1,3 +1,4 @@
+/* $Id: UIKeyboardHandlerNormal.h $ */
/** @file
* VBox Qt GUI - UIKeyboardHandlerNormal class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
index 1468f50..da44278 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.cpp
@@ -71,6 +71,10 @@ void UIMachineLogicNormal::sltCheckForRequestedVisualStateType()
if (!uisession()->isRunning() && !uisession()->isPaused())
return;
+ /* Do not try to change visual-state type in 'manual override' mode: */
+ if (isManualOverrideMode())
+ return;
+
/* Check requested visual-state types: */
switch (uisession()->requestedVisualState())
{
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.h b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.h
index f23af46..850b83a 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineLogicNormal.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineLogicNormal.h $ */
/** @file
* VBox Qt GUI - UIMachineLogicNormal class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineViewNormal.h b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineViewNormal.h
index 34332f3..d06a937 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineViewNormal.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineViewNormal.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineViewNormal.h $ */
/** @file
* VBox Qt GUI - UIMachineViewNormal class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.h b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.h
index 273173f..e2975a5 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineWindowNormal.h $ */
/** @file
* VBox Qt GUI - UIMachineWindowNormal class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIKeyboardHandlerScale.h b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIKeyboardHandlerScale.h
index f9c0eb9..515ccea 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIKeyboardHandlerScale.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIKeyboardHandlerScale.h
@@ -1,3 +1,4 @@
+/* $Id: UIKeyboardHandlerScale.h $ */
/** @file
* VBox Qt GUI - UIKeyboardHandlerScale class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.h b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.h
index 2028629..c1ccdea 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineLogicScale.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineLogicScale.h $ */
/** @file
* VBox Qt GUI - UIMachineLogicScale class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.h b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.h
index 4b0d4ce..01365d6 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineViewScale.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineViewScale.h $ */
/** @file
* VBox Qt GUI - UIMachineViewScale class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.h b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.h
index 143faf5..59b97b7 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineWindowScale.h $ */
/** @file
* VBox Qt GUI - UIMachineWindowScale class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIKeyboardHandlerSeamless.h b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIKeyboardHandlerSeamless.h
index a034f51..a7fb5cd 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIKeyboardHandlerSeamless.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIKeyboardHandlerSeamless.h
@@ -1,3 +1,4 @@
+/* $Id: UIKeyboardHandlerSeamless.h $ */
/** @file
* VBox Qt GUI - UIKeyboardHandlerSeamless class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp
index d7a9470..5b72b26 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.cpp
@@ -131,6 +131,10 @@ void UIMachineLogicSeamless::sltCheckForRequestedVisualStateType()
if (!uisession()->isRunning() && !uisession()->isPaused())
return;
+ /* Do not try to change visual-state type in 'manual override' mode: */
+ if (isManualOverrideMode())
+ return;
+
/* If 'seamless' visual-state type is no more supported: */
if (!uisession()->isGuestSupportsSeamless())
{
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.h b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.h
index e5d2691..fee9979 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineLogicSeamless.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineLogicSeamless.h $ */
/** @file
* VBox Qt GUI - UIMachineLogicSeamless class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineViewSeamless.h b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineViewSeamless.h
index e98448c..b8f54b0 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineViewSeamless.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineViewSeamless.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineViewSeamless.h $ */
/** @file
* VBox Qt GUI - UIMachineViewSeamless class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineWindowSeamless.h b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineWindowSeamless.h
index cf0b124..947eb1f 100644
--- a/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineWindowSeamless.h
+++ b/src/VBox/Frontends/VirtualBox/src/runtime/seamless/UIMachineWindowSeamless.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineWindowSeamless.h $ */
/** @file
* VBox Qt GUI - UIMachineWindowSeamless class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
index bc0c36a..d14c171 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.cpp
@@ -548,16 +548,16 @@ protected:
};
-class UIActionStateCommonStartOrShow : public UIActionPolymorphic
+class UIActionStateCommonStartOrShow : public UIActionPolymorphicMenu
{
Q_OBJECT;
public:
UIActionStateCommonStartOrShow(UIActionPool *pParent)
- : UIActionPolymorphic(pParent,
- ":/vm_start_32px.png", ":/vm_start_16px.png",
- ":/vm_start_disabled_32px.png", ":/vm_start_disabled_16px.png") {}
+ : UIActionPolymorphicMenu(pParent,
+ ":/vm_start_32px.png", ":/vm_start_16px.png",
+ ":/vm_start_disabled_32px.png", ":/vm_start_disabled_16px.png") {}
protected:
@@ -572,6 +572,7 @@ protected:
{
case 0:
{
+ showMenu();
setName(QApplication::translate("UIActionPool", "S&tart"));
setStatusTip(QApplication::translate("UIActionPool", "Start the selected virtual machines"));
setToolTip(text().remove('&').remove('.') +
@@ -580,6 +581,7 @@ protected:
}
case 1:
{
+ hideMenu();
setName(QApplication::translate("UIActionPool", "S&how"));
setStatusTip(QApplication::translate("UIActionPool", "Switch to the windows of the selected virtual machines"));
setToolTip(text().remove('&').remove('.') +
@@ -592,6 +594,81 @@ protected:
}
};
+class UIActionSimpleStartNormal : public UIActionSimple
+{
+ Q_OBJECT;
+
+public:
+
+ UIActionSimpleStartNormal(UIActionPool *pParent)
+ : UIActionSimple(pParent,
+ ":/vm_start_32px.png", ":/vm_start_16px.png",
+ ":/vm_start_disabled_32px.png", ":/vm_start_disabled_16px.png") {}
+
+protected:
+
+ QString shortcutExtraDataID() const
+ {
+ return QString("StartVMNormal");
+ }
+
+ void retranslateUi()
+ {
+ setName(QApplication::translate("UIActionPool", "&Normal Start"));
+ setStatusTip(QApplication::translate("UIActionPool", "Start the selected virtual machines"));
+ }
+};
+
+class UIActionSimpleStartHeadless : public UIActionSimple
+{
+ Q_OBJECT;
+
+public:
+
+ UIActionSimpleStartHeadless(UIActionPool *pParent)
+ : UIActionSimple(pParent,
+ ":/vm_start_32px.png", ":/vm_start_16px.png",
+ ":/vm_start_disabled_32px.png", ":/vm_start_disabled_16px.png") {}
+
+protected:
+
+ QString shortcutExtraDataID() const
+ {
+ return QString("StartVMHeadless");
+ }
+
+ void retranslateUi()
+ {
+ setName(QApplication::translate("UIActionPool", "&Headless Start"));
+ setStatusTip(QApplication::translate("UIActionPool", "Start the selected virtual machines in the background"));
+ }
+};
+
+class UIActionSimpleStartDetachable : public UIActionSimple
+{
+ Q_OBJECT;
+
+public:
+
+ UIActionSimpleStartDetachable(UIActionPool *pParent)
+ : UIActionSimple(pParent,
+ ":/vm_start_32px.png", ":/vm_start_16px.png",
+ ":/vm_start_disabled_32px.png", ":/vm_start_disabled_16px.png") {}
+
+protected:
+
+ QString shortcutExtraDataID() const
+ {
+ return QString("StartVMDetachable");
+ }
+
+ void retranslateUi()
+ {
+ setName(QApplication::translate("UIActionPool", "&Detachable Start"));
+ setStatusTip(QApplication::translate("UIActionPool", "Start the selected virtual machines with the option of continuing them in the background"));
+ }
+};
+
class UIActionToggleCommonPauseAndResume : public UIActionToggle
{
Q_OBJECT;
@@ -949,7 +1026,10 @@ void UIActionPoolSelector::preparePool()
m_pool[UIActionIndexST_M_Group_S_Add] = new UIActionSimpleGroupAdd(this);
m_pool[UIActionIndexST_M_Group_S_Rename] = new UIActionSimpleGroupRename(this);
m_pool[UIActionIndexST_M_Group_S_Remove] = new UIActionSimpleGroupRemove(this);
- m_pool[UIActionIndexST_M_Group_P_StartOrShow] = new UIActionStateCommonStartOrShow(this);
+ m_pool[UIActionIndexST_M_Group_M_StartOrShow] = new UIActionStateCommonStartOrShow(this);
+ m_pool[UIActionIndexST_M_Group_M_StartOrShow_S_StartNormal] = new UIActionSimpleStartNormal(this);
+ m_pool[UIActionIndexST_M_Group_M_StartOrShow_S_StartHeadless] = new UIActionSimpleStartHeadless(this);
+ m_pool[UIActionIndexST_M_Group_M_StartOrShow_S_StartDetachable] = new UIActionSimpleStartDetachable(this);
m_pool[UIActionIndexST_M_Group_T_Pause] = new UIActionToggleCommonPauseAndResume(this);
m_pool[UIActionIndexST_M_Group_S_Reset] = new UIActionSimpleCommonReset(this);
m_pool[UIActionIndexST_M_Group_M_Close] = new UIActionMenuClose(this);
@@ -971,7 +1051,10 @@ void UIActionPoolSelector::preparePool()
m_pool[UIActionIndexST_M_Machine_S_Clone] = new UIActionSimpleMachineClone(this);
m_pool[UIActionIndexST_M_Machine_S_Remove] = new UIActionSimpleMachineRemove(this);
m_pool[UIActionIndexST_M_Machine_S_AddGroup] = new UIActionSimpleMachineAddGroup(this);
- m_pool[UIActionIndexST_M_Machine_P_StartOrShow] = new UIActionStateCommonStartOrShow(this);
+ m_pool[UIActionIndexST_M_Machine_M_StartOrShow] = new UIActionStateCommonStartOrShow(this);
+ m_pool[UIActionIndexST_M_Machine_M_StartOrShow_S_StartNormal] = new UIActionSimpleStartNormal(this);
+ m_pool[UIActionIndexST_M_Machine_M_StartOrShow_S_StartHeadless] = new UIActionSimpleStartHeadless(this);
+ m_pool[UIActionIndexST_M_Machine_M_StartOrShow_S_StartDetachable] = new UIActionSimpleStartDetachable(this);
m_pool[UIActionIndexST_M_Machine_T_Pause] = new UIActionToggleCommonPauseAndResume(this);
m_pool[UIActionIndexST_M_Machine_S_Reset] = new UIActionSimpleCommonReset(this);
m_pool[UIActionIndexST_M_Machine_M_Close] = new UIActionMenuClose(this);
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
index 77ad348..ae0f5a5 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIActionPoolSelector.h
@@ -1,3 +1,4 @@
+/* $Id: UIActionPoolSelector.h $ */
/** @file
* VBox Qt GUI - UIActionPoolSelector class declaration.
*/
@@ -45,7 +46,10 @@ enum UIActionIndexST
UIActionIndexST_M_Group_S_Add,
UIActionIndexST_M_Group_S_Rename,
UIActionIndexST_M_Group_S_Remove,
- UIActionIndexST_M_Group_P_StartOrShow,
+ UIActionIndexST_M_Group_M_StartOrShow,
+ UIActionIndexST_M_Group_M_StartOrShow_S_StartNormal,
+ UIActionIndexST_M_Group_M_StartOrShow_S_StartHeadless,
+ UIActionIndexST_M_Group_M_StartOrShow_S_StartDetachable,
UIActionIndexST_M_Group_T_Pause,
UIActionIndexST_M_Group_S_Reset,
UIActionIndexST_M_Group_M_Close,
@@ -67,7 +71,10 @@ enum UIActionIndexST
UIActionIndexST_M_Machine_S_Clone,
UIActionIndexST_M_Machine_S_Remove,
UIActionIndexST_M_Machine_S_AddGroup,
- UIActionIndexST_M_Machine_P_StartOrShow,
+ UIActionIndexST_M_Machine_M_StartOrShow,
+ UIActionIndexST_M_Machine_M_StartOrShow_S_StartNormal,
+ UIActionIndexST_M_Machine_M_StartOrShow_S_StartHeadless,
+ UIActionIndexST_M_Machine_M_StartOrShow_S_StartDetachable,
UIActionIndexST_M_Machine_T_Pause,
UIActionIndexST_M_Machine_S_Reset,
UIActionIndexST_M_Machine_M_Close,
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
index 8bf5722..46f5bf4 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.cpp
@@ -25,6 +25,7 @@
# include <QStatusBar>
# include <QResizeEvent>
# include <QStackedWidget>
+# include <QToolButton>
# include <QTimer>
/* Local includes: */
@@ -457,14 +458,72 @@ void UISelectorWindow::sltPerformStartOrShowAction()
foreach (UIVMItem *pItem, items)
{
/* Check if current item could be started/showed: */
- if (!isActionEnabled(UIActionIndexST_M_Group_P_StartOrShow, QList<UIVMItem*>() << pItem))
+ if (!isActionEnabled(UIActionIndexST_M_Group_M_StartOrShow, QList<UIVMItem*>() << pItem))
continue;
/* Launch/show current VM: */
CMachine machine = pItem->machine();
- vboxGlobal().launchMachine(machine, qApp->keyboardModifiers() == Qt::ShiftModifier ?
- VBoxGlobal::LaunchMode_Headless :
- VBoxGlobal::LaunchMode_Default);
+ vboxGlobal().launchMachine(machine,
+ UIVMItem::isItemRunningHeadless(pItem) ? VBoxGlobal::LaunchMode_Separate :
+ qApp->keyboardModifiers() == Qt::ShiftModifier ? VBoxGlobal::LaunchMode_Headless :
+ VBoxGlobal::LaunchMode_Default);
+ }
+}
+
+void UISelectorWindow::sltPerformStartNormal()
+{
+ /* Get selected items: */
+ QList<UIVMItem*> items = currentItems();
+ AssertMsgReturnVoid(!items.isEmpty(), ("At least one item should be selected!\n"));
+
+ /* For every selected item: */
+ foreach (UIVMItem *pItem, items)
+ {
+ /* Check if current item could be started/showed: */
+ if (!isActionEnabled(UIActionIndexST_M_Group_M_StartOrShow, QList<UIVMItem*>() << pItem))
+ continue;
+
+ /* Launch/show current VM: */
+ CMachine machine = pItem->machine();
+ vboxGlobal().launchMachine(machine, VBoxGlobal::LaunchMode_Default);
+ }
+}
+
+void UISelectorWindow::sltPerformStartHeadless()
+{
+ /* Get selected items: */
+ QList<UIVMItem*> items = currentItems();
+ AssertMsgReturnVoid(!items.isEmpty(), ("At least one item should be selected!\n"));
+
+ /* For every selected item: */
+ foreach (UIVMItem *pItem, items)
+ {
+ /* Check if current item could be started/showed: */
+ if (!isActionEnabled(UIActionIndexST_M_Group_M_StartOrShow, QList<UIVMItem*>() << pItem))
+ continue;
+
+ /* Launch/show current VM: */
+ CMachine machine = pItem->machine();
+ vboxGlobal().launchMachine(machine, VBoxGlobal::LaunchMode_Headless);
+ }
+}
+
+void UISelectorWindow::sltPerformStartDetachable()
+{
+ /* Get selected items: */
+ QList<UIVMItem*> items = currentItems();
+ AssertMsgReturnVoid(!items.isEmpty(), ("At least one item should be selected!\n"));
+
+ /* For every selected item: */
+ foreach (UIVMItem *pItem, items)
+ {
+ /* Check if current item could be started/showed: */
+ if (!isActionEnabled(UIActionIndexST_M_Group_M_StartOrShow, QList<UIVMItem*>() << pItem))
+ continue;
+
+ /* Launch/show current VM: */
+ CMachine machine = pItem->machine();
+ vboxGlobal().launchMachine(machine, VBoxGlobal::LaunchMode_Separate);
}
}
@@ -887,7 +946,7 @@ void UISelectorWindow::sltCurrentVMItemChanged(bool fRefreshDetails, bool fRefre
"at the top of the window.</p>"
"<p>You can press the <b>%1</b> key to get instant help, "
"or visit "
- "<a href=http://www.virtualbox.org>www.virtualbox.org</a> "
+ "<a href=https://www.virtualbox.org>www.virtualbox.org</a> "
"for the latest information and news.</p>")
.arg(QKeySequence(QKeySequence::HelpContents).toString(QKeySequence::NativeText)));
}
@@ -1106,6 +1165,12 @@ void UISelectorWindow::prepareMenuBar()
prepareMenuFile(actionPool()->action(UIActionIndexST_M_File)->menu());
menuBar()->addMenu(actionPool()->action(UIActionIndexST_M_File)->menu());
+ /* Prepare 'Group' / 'Start or Show' menu: */
+ prepareMenuGroupStartOrShow(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow)->menu());
+
+ /* Prepare 'Machine' / 'Start or Show' menu: */
+ prepareMenuMachineStartOrShow(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow)->menu());
+
/* Prepare 'Group' / 'Close' menu: */
prepareMenuGroupClose(actionPool()->action(UIActionIndexST_M_Group_M_Close)->menu());
@@ -1176,7 +1241,7 @@ void UISelectorWindow::prepareMenuGroup(QMenu *pMenu)
pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_S_Rename));
pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_S_Remove));
pMenu->addSeparator();
- pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_P_StartOrShow));
+ pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow));
pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_T_Pause));
pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_S_Reset));
pMenu->addMenu(actionPool()->action(UIActionIndexST_M_Group_M_Close)->menu());
@@ -1195,7 +1260,7 @@ void UISelectorWindow::prepareMenuGroup(QMenu *pMenu)
<< actionPool()->action(UIActionIndexST_M_Group_S_Add)
<< actionPool()->action(UIActionIndexST_M_Group_S_Rename)
<< actionPool()->action(UIActionIndexST_M_Group_S_Remove)
- << actionPool()->action(UIActionIndexST_M_Group_P_StartOrShow)
+ << actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow)
<< actionPool()->action(UIActionIndexST_M_Group_T_Pause)
<< actionPool()->action(UIActionIndexST_M_Group_S_Reset)
<< actionPool()->action(UIActionIndexST_M_Group_S_Discard)
@@ -1220,7 +1285,7 @@ void UISelectorWindow::prepareMenuMachine(QMenu *pMenu)
pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_Remove));
pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_AddGroup));
pMenu->addSeparator();
- pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow));
+ pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow));
pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_T_Pause));
pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_Reset));
pMenu->addMenu(actionPool()->action(UIActionIndexST_M_Machine_M_Close)->menu());
@@ -1241,7 +1306,7 @@ void UISelectorWindow::prepareMenuMachine(QMenu *pMenu)
<< actionPool()->action(UIActionIndexST_M_Machine_S_Clone)
<< actionPool()->action(UIActionIndexST_M_Machine_S_Remove)
<< actionPool()->action(UIActionIndexST_M_Machine_S_AddGroup)
- << actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow)
+ << actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow)
<< actionPool()->action(UIActionIndexST_M_Machine_T_Pause)
<< actionPool()->action(UIActionIndexST_M_Machine_S_Reset)
<< actionPool()->action(UIActionIndexST_M_Machine_S_Discard)
@@ -1252,6 +1317,40 @@ void UISelectorWindow::prepareMenuMachine(QMenu *pMenu)
<< actionPool()->action(UIActionIndexST_M_Machine_S_SortParent);
}
+void UISelectorWindow::prepareMenuGroupStartOrShow(QMenu *pMenu)
+{
+ /* Do not touch if filled already: */
+ if (!pMenu->isEmpty())
+ return;
+
+ /* Populate 'Group' / 'Start or Show' menu: */
+ pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartNormal));
+ pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartHeadless));
+ pMenu->addAction(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartDetachable));
+
+ /* Remember action list: */
+ m_groupActions << actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartNormal)
+ << actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartHeadless)
+ << actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartDetachable);
+}
+
+void UISelectorWindow::prepareMenuMachineStartOrShow(QMenu *pMenu)
+{
+ /* Do not touch if filled already: */
+ if (!pMenu->isEmpty())
+ return;
+
+ /* Populate 'Machine' / 'Start or Show' menu: */
+ pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartNormal));
+ pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartHeadless));
+ pMenu->addAction(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartDetachable));
+
+ /* Remember action list: */
+ m_machineActions << actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartNormal)
+ << actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartHeadless)
+ << actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartDetachable);
+}
+
void UISelectorWindow::prepareMenuGroupClose(QMenu *pMenu)
{
/* Do not touch if filled already: */
@@ -1314,8 +1413,8 @@ void UISelectorWindow::prepareWidgets()
mVMToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
mVMToolBar->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_New));
mVMToolBar->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_Settings));
- mVMToolBar->addAction(actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow));
mVMToolBar->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_Discard));
+ mVMToolBar->addAction(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow));
/* Prepare graphics VM list: */
m_pChooser = new UIGChooser(this);
@@ -1384,7 +1483,7 @@ void UISelectorWindow::prepareConnections()
/* 'Group' menu connections: */
connect(actionPool()->action(UIActionIndexST_M_Group_S_Add), SIGNAL(triggered()), this, SLOT(sltShowAddMachineDialog()));
- connect(actionPool()->action(UIActionIndexST_M_Group_P_StartOrShow), SIGNAL(triggered()), this, SLOT(sltPerformStartOrShowAction()));
+ connect(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow), SIGNAL(triggered()), this, SLOT(sltPerformStartOrShowAction()));
connect(actionPool()->action(UIActionIndexST_M_Group_T_Pause), SIGNAL(toggled(bool)), this, SLOT(sltPerformPauseResumeAction(bool)));
connect(actionPool()->action(UIActionIndexST_M_Group_S_Reset), SIGNAL(triggered()), this, SLOT(sltPerformResetAction()));
connect(actionPool()->action(UIActionIndexST_M_Group_S_Discard), SIGNAL(triggered()), this, SLOT(sltPerformDiscardAction()));
@@ -1396,7 +1495,7 @@ void UISelectorWindow::prepareConnections()
connect(actionPool()->action(UIActionIndexST_M_Machine_S_Add), SIGNAL(triggered()), this, SLOT(sltShowAddMachineDialog()));
connect(actionPool()->action(UIActionIndexST_M_Machine_S_Settings), SIGNAL(triggered()), this, SLOT(sltShowMachineSettingsDialog()));
connect(actionPool()->action(UIActionIndexST_M_Machine_S_Clone), SIGNAL(triggered()), this, SLOT(sltShowCloneMachineWizard()));
- connect(actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow), SIGNAL(triggered()), this, SLOT(sltPerformStartOrShowAction()));
+ connect(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow), SIGNAL(triggered()), this, SLOT(sltPerformStartOrShowAction()));
connect(actionPool()->action(UIActionIndexST_M_Machine_T_Pause), SIGNAL(toggled(bool)), this, SLOT(sltPerformPauseResumeAction(bool)));
connect(actionPool()->action(UIActionIndexST_M_Machine_S_Reset), SIGNAL(triggered()), this, SLOT(sltPerformResetAction()));
connect(actionPool()->action(UIActionIndexST_M_Machine_S_Discard), SIGNAL(triggered()), this, SLOT(sltPerformDiscardAction()));
@@ -1404,6 +1503,16 @@ void UISelectorWindow::prepareConnections()
connect(actionPool()->action(UIActionIndexST_M_Machine_S_ShowInFileManager), SIGNAL(triggered()), this, SLOT(sltShowMachineInFileManager()));
connect(actionPool()->action(UIActionIndexST_M_Machine_S_CreateShortcut), SIGNAL(triggered()), this, SLOT(sltPerformCreateShortcutAction()));
+ /* 'Group/Start or Show' menu connections: */
+ connect(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartNormal), SIGNAL(triggered()), this, SLOT(sltPerformStartNormal()));
+ connect(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartHeadless), SIGNAL(triggered()), this, SLOT(sltPerformStartHeadless()));
+ connect(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartDetachable), SIGNAL(triggered()), this, SLOT(sltPerformStartDetachable()));
+
+ /* 'Machine/Start or Show' menu connections: */
+ connect(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartNormal), SIGNAL(triggered()), this, SLOT(sltPerformStartNormal()));
+ connect(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartHeadless), SIGNAL(triggered()), this, SLOT(sltPerformStartHeadless()));
+ connect(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartDetachable), SIGNAL(triggered()), this, SLOT(sltPerformStartDetachable()));
+
/* 'Group/Close' menu connections: */
connect(actionPool()->action(UIActionIndexST_M_Group_M_Close)->menu(), SIGNAL(aboutToShow()), this, SLOT(sltGroupCloseMenuAboutToShow()));
connect(actionPool()->action(UIActionIndexST_M_Group_M_Close_S_SaveState), SIGNAL(triggered()), this, SLOT(sltPerformSaveAction()));
@@ -1447,6 +1556,7 @@ void UISelectorWindow::prepareConnections()
connect(gVBoxEvents, SIGNAL(sigSnapshotTake(QString, QString)), this, SLOT(sltSnapshotChanged(QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotDelete(QString, QString)), this, SLOT(sltSnapshotChanged(QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotChange(QString, QString)), this, SLOT(sltSnapshotChanged(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotRestore(QString, QString)), this, SLOT(sltSnapshotChanged(QString)));
}
void UISelectorWindow::loadSettings()
@@ -1557,7 +1667,6 @@ void UISelectorWindow::updateActionsAppearance()
/* Enable/disable group actions: */
actionPool()->action(UIActionIndexST_M_Group_S_Rename)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_S_Rename, items));
actionPool()->action(UIActionIndexST_M_Group_S_Remove)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_S_Remove, items));
- actionPool()->action(UIActionIndexST_M_Group_P_StartOrShow)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_P_StartOrShow, items));
actionPool()->action(UIActionIndexST_M_Group_T_Pause)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_T_Pause, items));
actionPool()->action(UIActionIndexST_M_Group_S_Reset)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_S_Reset, items));
actionPool()->action(UIActionIndexST_M_Group_S_Discard)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_S_Discard, items));
@@ -1572,7 +1681,6 @@ void UISelectorWindow::updateActionsAppearance()
actionPool()->action(UIActionIndexST_M_Machine_S_Clone)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_S_Clone, items));
actionPool()->action(UIActionIndexST_M_Machine_S_Remove)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_S_Remove, items));
actionPool()->action(UIActionIndexST_M_Machine_S_AddGroup)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_S_AddGroup, items));
- actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_P_StartOrShow, items));
actionPool()->action(UIActionIndexST_M_Machine_T_Pause)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_T_Pause, items));
actionPool()->action(UIActionIndexST_M_Machine_S_Reset)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_S_Reset, items));
actionPool()->action(UIActionIndexST_M_Machine_S_Discard)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_S_Discard, items));
@@ -1582,6 +1690,18 @@ void UISelectorWindow::updateActionsAppearance()
actionPool()->action(UIActionIndexST_M_Machine_S_CreateShortcut)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_S_CreateShortcut, items));
actionPool()->action(UIActionIndexST_M_Machine_S_SortParent)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_S_SortParent, items));
+ /* Enable/disable group-start-or-show actions: */
+ actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_M_StartOrShow, items));
+ actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartNormal)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_M_StartOrShow_S_StartNormal, items));
+ actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartHeadless)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_M_StartOrShow_S_StartHeadless, items));
+ actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow_S_StartDetachable)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_M_StartOrShow_S_StartDetachable, items));
+
+ /* Enable/disable machine-start-or-show actions: */
+ actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_M_StartOrShow, items));
+ actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartNormal)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_M_StartOrShow_S_StartNormal, items));
+ actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartHeadless)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_M_StartOrShow_S_StartHeadless, items));
+ actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow_S_StartDetachable)->setEnabled(isActionEnabled(UIActionIndexST_M_Machine_M_StartOrShow_S_StartDetachable, items));
+
/* Enable/disable group-close actions: */
actionPool()->action(UIActionIndexST_M_Group_M_Close)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_M_Close, items));
actionPool()->action(UIActionIndexST_M_Group_M_Close_S_SaveState)->setEnabled(isActionEnabled(UIActionIndexST_M_Group_M_Close_S_SaveState, items));
@@ -1597,13 +1717,19 @@ void UISelectorWindow::updateActionsAppearance()
/* Start/Show action is deremined by 1st item: */
if (pItem && pItem->accessible())
{
- actionPool()->action(UIActionIndexST_M_Group_P_StartOrShow)->toActionPolymorphic()->setState(UIVMItem::isItemPoweredOff(pItem) ? 0 : 1);
- actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow)->toActionPolymorphic()->setState(UIVMItem::isItemPoweredOff(pItem) ? 0 : 1);
+ actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow)->toActionPolymorphicMenu()->setState(UIVMItem::isItemPoweredOff(pItem) ? 0 : 1);
+ actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow)->toActionPolymorphicMenu()->setState(UIVMItem::isItemPoweredOff(pItem) ? 0 : 1);
+ QToolButton *pButton = qobject_cast<QToolButton*>(mVMToolBar->widgetForAction(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow)));
+ if (pButton)
+ pButton->setPopupMode(UIVMItem::isItemPoweredOff(pItem) ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup);
}
else
{
- actionPool()->action(UIActionIndexST_M_Group_P_StartOrShow)->toActionPolymorphic()->setState(0);
- actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow)->toActionPolymorphic()->setState(0);
+ actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow)->toActionPolymorphicMenu()->setState(0);
+ actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow)->toActionPolymorphicMenu()->setState(0);
+ QToolButton *pButton = qobject_cast<QToolButton*>(mVMToolBar->widgetForAction(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow)));
+ if (pButton)
+ pButton->setPopupMode(UIVMItem::isItemPoweredOff(pItem) ? QToolButton::MenuButtonPopup : QToolButton::DelayedPopup);
}
/* Pause/Resume action is deremined by 1st started item: */
@@ -1672,8 +1798,14 @@ bool UISelectorWindow::isActionEnabled(int iActionIndex, const QList<UIVMItem*>
!m_pChooser->isAllItemsOfOneGroupSelected() &&
isItemsPoweredOff(items);
}
- case UIActionIndexST_M_Group_P_StartOrShow:
- case UIActionIndexST_M_Machine_P_StartOrShow:
+ case UIActionIndexST_M_Group_M_StartOrShow:
+ case UIActionIndexST_M_Group_M_StartOrShow_S_StartNormal:
+ case UIActionIndexST_M_Group_M_StartOrShow_S_StartHeadless:
+ case UIActionIndexST_M_Group_M_StartOrShow_S_StartDetachable:
+ case UIActionIndexST_M_Machine_M_StartOrShow:
+ case UIActionIndexST_M_Machine_M_StartOrShow_S_StartNormal:
+ case UIActionIndexST_M_Machine_M_StartOrShow_S_StartHeadless:
+ case UIActionIndexST_M_Machine_M_StartOrShow_S_StartDetachable:
{
return !m_pChooser->isGroupSavingInProgress() &&
isAtLeastOneItemCanBeStartedOrShowed(items);
@@ -1837,7 +1969,7 @@ bool UISelectorWindow::isAtLeastOneItemCanBeStartedOrShowed(const QList<UIVMItem
foreach (UIVMItem *pItem, items)
{
if ((UIVMItem::isItemPoweredOff(pItem) && UIVMItem::isItemEditable(pItem)) ||
- (UIVMItem::isItemStarted(pItem) && pItem->canSwitchTo()))
+ (UIVMItem::isItemStarted(pItem) && (pItem->canSwitchTo() || UIVMItem::isItemRunningHeadless(pItem))))
return true;
}
return false;
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h
index 839b518..d04f321 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UISelectorWindow.h
@@ -1,3 +1,4 @@
+/* $Id: UISelectorWindow.h $ */
/** @file
* VBox Qt GUI - UISelectorWindow class declaration.
*/
@@ -86,6 +87,9 @@ private slots:
const QString &strId = QString());
void sltShowCloneMachineWizard();
void sltPerformStartOrShowAction();
+ void sltPerformStartNormal();
+ void sltPerformStartHeadless();
+ void sltPerformStartDetachable();
void sltPerformDiscardAction();
void sltPerformPauseResumeAction(bool fPause);
void sltPerformResetAction();
@@ -124,6 +128,8 @@ private:
void prepareMenuFile(QMenu *pMenu);
void prepareMenuGroup(QMenu *pMenu);
void prepareMenuMachine(QMenu *pMenu);
+ void prepareMenuGroupStartOrShow(QMenu *pMenu);
+ void prepareMenuMachineStartOrShow(QMenu *pMenu);
void prepareMenuGroupClose(QMenu *pMenu);
void prepareMenuMachineClose(QMenu *pMenu);
void prepareStatusBar();
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.h b/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.h
index fe4cc0a..3b3924b 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVMDesktop.h
@@ -1,3 +1,4 @@
+/* $Id: UIVMDesktop.h $ */
/** @file
*
* VBox frontends: Qt GUI ("VirtualBox"):
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVMItem.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UIVMItem.cpp
index c424fe8..cdb257a 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVMItem.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVMItem.cpp
@@ -433,29 +433,28 @@ bool UIVMItem::switchTo()
/* static */
bool UIVMItem::isItemEditable(UIVMItem *pItem)
{
- return pItem->accessible() &&
+ return pItem &&
+ pItem->accessible() &&
pItem->sessionState() == KSessionState_Unlocked;
}
/* static */
bool UIVMItem::isItemSaved(UIVMItem *pItem)
{
- if (pItem->accessible() &&
- pItem->machineState() == KMachineState_Saved)
- return true;
- return false;
+ return pItem &&
+ pItem->accessible() &&
+ pItem->machineState() == KMachineState_Saved;
}
/* static */
bool UIVMItem::isItemPoweredOff(UIVMItem *pItem)
{
- if (pItem->accessible() &&
- (pItem->machineState() == KMachineState_PoweredOff ||
- pItem->machineState() == KMachineState_Saved ||
- pItem->machineState() == KMachineState_Teleported ||
- pItem->machineState() == KMachineState_Aborted))
- return true;
- return false;
+ return pItem &&
+ pItem->accessible() &&
+ (pItem->machineState() == KMachineState_PoweredOff ||
+ pItem->machineState() == KMachineState_Saved ||
+ pItem->machineState() == KMachineState_Teleported ||
+ pItem->machineState() == KMachineState_Aborted);
}
/* static */
@@ -467,32 +466,49 @@ bool UIVMItem::isItemStarted(UIVMItem *pItem)
/* static */
bool UIVMItem::isItemRunning(UIVMItem *pItem)
{
- if (pItem->accessible() &&
- (pItem->machineState() == KMachineState_Running ||
- pItem->machineState() == KMachineState_Teleporting ||
- pItem->machineState() == KMachineState_LiveSnapshotting))
- return true;
- return false;
+ return pItem &&
+ pItem->accessible() &&
+ (pItem->machineState() == KMachineState_Running ||
+ pItem->machineState() == KMachineState_Teleporting ||
+ pItem->machineState() == KMachineState_LiveSnapshotting);
}
/* static */
-bool UIVMItem::isItemPaused(UIVMItem *pItem)
+bool UIVMItem::isItemRunningHeadless(UIVMItem *pItem)
{
- if (pItem->accessible() &&
- (pItem->machineState() == KMachineState_Paused ||
- pItem->machineState() == KMachineState_TeleportingPausedVM))
- return true;
+ if (isItemRunning(pItem))
+ {
+ /* Open session to determine which frontend VM is started with: */
+ CSession session = vboxGlobal().openExistingSession(pItem->id());
+ if (!session.isNull())
+ {
+ /* Acquire the session type: */
+ const QString strSessionType = session.GetMachine().GetSessionType();
+ /* Close the session early: */
+ session.UnlockMachine();
+ /* Check whether we are in 'headless' session type: */
+ if (strSessionType.compare("headless", Qt::CaseInsensitive) == 0)
+ return true;
+ }
+ }
return false;
+}
+/* static */
+bool UIVMItem::isItemPaused(UIVMItem *pItem)
+{
+ return pItem &&
+ pItem->accessible() &&
+ (pItem->machineState() == KMachineState_Paused ||
+ pItem->machineState() == KMachineState_TeleportingPausedVM);
}
/* static */
bool UIVMItem::isItemStuck(UIVMItem *pItem)
{
- if (pItem->accessible() &&
- pItem->machineState() == KMachineState_Stuck)
- return true;
- return false;
+ return pItem &&
+ pItem->accessible() &&
+ pItem->machineState() == KMachineState_Stuck;
}
QString UIVMItemMimeData::m_type = "application/org.virtualbox.gui.vmselector.uivmitem";
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVMItem.h b/src/VBox/Frontends/VirtualBox/src/selector/UIVMItem.h
index 49e84ee..28920c9 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVMItem.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVMItem.h
@@ -1,3 +1,4 @@
+/* $Id: UIVMItem.h $ */
/** @file
* VBox Qt GUI - UIVMItem class declarations.
*/
@@ -78,6 +79,7 @@ public:
static bool isItemPoweredOff(UIVMItem *pItem);
static bool isItemStarted(UIVMItem *pItem);
static bool isItemRunning(UIVMItem *pItem);
+ static bool isItemRunningHeadless(UIVMItem *pItem);
static bool isItemPaused(UIVMItem *pItem);
static bool isItemStuck(UIVMItem *pItem);
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.cpp
index 6933c7b..a13757c 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.cpp
@@ -87,7 +87,8 @@ UIVirtualBoxEventHandler::UIVirtualBoxEventHandler()
<< KVBoxEventType_OnSessionStateChanged
<< KVBoxEventType_OnSnapshotTaken
<< KVBoxEventType_OnSnapshotDeleted
- << KVBoxEventType_OnSnapshotChanged;
+ << KVBoxEventType_OnSnapshotChanged
+ << KVBoxEventType_OnSnapshotRestored;
eventSourceVirtualBox.RegisterListener(m_mainEventListener, vboxEvents, TRUE);
AssertWrapperOk(eventSourceVirtualBox);
@@ -116,6 +117,9 @@ UIVirtualBoxEventHandler::UIVirtualBoxEventHandler()
connect(pListener->getWrapped(), SIGNAL(sigSnapshotChange(QString, QString)),
this, SIGNAL(sigSnapshotChange(QString, QString)),
Qt::QueuedConnection);
+ connect(pListener->getWrapped(), SIGNAL(sigSnapshotRestore(QString, QString)),
+ this, SIGNAL(sigSnapshotRestore(QString, QString)),
+ Qt::QueuedConnection);
}
UIVirtualBoxEventHandler::~UIVirtualBoxEventHandler()
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.h b/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.h
index 87a3499..ed31176 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVirtualBoxEventHandler.h
@@ -1,3 +1,4 @@
+/* $Id: UIVirtualBoxEventHandler.h $ */
/** @file
* VBox Qt GUI - UIVirtualBoxEventHandler class declaration.
*/
@@ -45,6 +46,8 @@ signals:
void sigSnapshotDelete(QString strId, QString strSnapshotId);
/** Notifies about snapshot with @a strSnapshotId was changed for the machine with @a strId. */
void sigSnapshotChange(QString strId, QString strSnapshotId);
+ /** Notifies about snapshot with @a strSnapshotId was restored for the machine with @a strId. */
+ void sigSnapshotRestore(QString strId, QString strSnapshotId);
public:
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/VBoxSnapshotsWgt.h b/src/VBox/Frontends/VirtualBox/src/selector/VBoxSnapshotsWgt.h
index 68abfbb..3b303b9 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/VBoxSnapshotsWgt.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/VBoxSnapshotsWgt.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxSnapshotsWgt.h $ */
/** @file
* VBox Qt GUI - VBoxSnapshotsWgt class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooser.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooser.h
index 8e5058f..e45eb8e 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooser.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooser.h
@@ -1,3 +1,4 @@
+/* $Id: UIGChooser.h $ */
/** @file
* VBox Qt GUI - UIGChooser class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserHandlerKeyboard.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserHandlerKeyboard.h
index 6406acd..f6e0469 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserHandlerKeyboard.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserHandlerKeyboard.h
@@ -1,3 +1,4 @@
+/* $Id: UIGChooserHandlerKeyboard.h $ */
/** @file
* VBox Qt GUI - UIGChooserHandlerKeyboard class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserHandlerMouse.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserHandlerMouse.h
index 42acd88..74bf2a0 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserHandlerMouse.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserHandlerMouse.h
@@ -1,3 +1,4 @@
+/* $Id: UIGChooserHandlerMouse.h $ */
/** @file
* VBox Qt GUI - UIGChooserHandlerMouse class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h
index 82d9c2f..a60fb38 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItem.h
@@ -1,3 +1,4 @@
+/* $Id: UIGChooserItem.h $ */
/** @file
* VBox Qt GUI - UIGChooserItem class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h
index 62bd2ca..afd5b63 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemGroup.h
@@ -1,3 +1,4 @@
+/* $Id: UIGChooserItemGroup.h $ */
/** @file
* VBox Qt GUI - UIGChooserItemGroup class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp
index b0ad45e..ec7804c 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.cpp
@@ -1149,7 +1149,7 @@ void UIGChooserItemMachine::prepare()
actionPool()->action(UIActionIndexST_M_Machine_S_Settings), SLOT(trigger()),
Qt::QueuedConnection);
connect(m_pStartButton, SIGNAL(sigButtonClicked()),
- actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow), SLOT(trigger()),
+ actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow), SLOT(trigger()),
Qt::QueuedConnection);
connect(m_pPauseButton, SIGNAL(sigButtonClicked()),
actionPool()->action(UIActionIndexST_M_Machine_T_Pause), SLOT(trigger()),
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h
index 1ef47b8..d7b39b9 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserItemMachine.h
@@ -1,3 +1,4 @@
+/* $Id: UIGChooserItemMachine.h $ */
/** @file
* VBox Qt GUI - UIGChooserItemMachine class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.cpp b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.cpp
index e6cde32..15095a9 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.cpp
@@ -542,7 +542,7 @@ QString UIGChooserModel::uniqueGroupName(UIGChooserItem *pRoot)
void UIGChooserModel::activateMachineItem()
{
- actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow)->activate(QAction::Trigger);
+ actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow)->activate(QAction::Trigger);
}
void UIGChooserModel::setCurrentDragObject(QDrag *pDragObject)
@@ -1185,7 +1185,7 @@ void UIGChooserModel::prepareContextMenu()
m_pContextMenuGroup->addAction(actionPool()->action(UIActionIndexST_M_Group_S_Rename));
m_pContextMenuGroup->addAction(actionPool()->action(UIActionIndexST_M_Group_S_Remove));
m_pContextMenuGroup->addSeparator();
- m_pContextMenuGroup->addAction(actionPool()->action(UIActionIndexST_M_Group_P_StartOrShow));
+ m_pContextMenuGroup->addAction(actionPool()->action(UIActionIndexST_M_Group_M_StartOrShow));
m_pContextMenuGroup->addAction(actionPool()->action(UIActionIndexST_M_Group_T_Pause));
m_pContextMenuGroup->addAction(actionPool()->action(UIActionIndexST_M_Group_S_Reset));
m_pContextMenuGroup->addMenu(actionPool()->action(UIActionIndexST_M_Group_M_Close)->menu());
@@ -1206,7 +1206,7 @@ void UIGChooserModel::prepareContextMenu()
m_pContextMenuMachine->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_Remove));
m_pContextMenuMachine->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_AddGroup));
m_pContextMenuMachine->addSeparator();
- m_pContextMenuMachine->addAction(actionPool()->action(UIActionIndexST_M_Machine_P_StartOrShow));
+ m_pContextMenuMachine->addAction(actionPool()->action(UIActionIndexST_M_Machine_M_StartOrShow));
m_pContextMenuMachine->addAction(actionPool()->action(UIActionIndexST_M_Machine_T_Pause));
m_pContextMenuMachine->addAction(actionPool()->action(UIActionIndexST_M_Machine_S_Reset));
m_pContextMenuMachine->addMenu(actionPool()->action(UIActionIndexST_M_Machine_M_Close)->menu());
@@ -1282,6 +1282,8 @@ void UIGChooserModel::prepareConnections()
this, SLOT(sltSnapshotChanged(QString, QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotChange(QString, QString)),
this, SLOT(sltSnapshotChanged(QString, QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotRestore(QString, QString)),
+ this, SLOT(sltSnapshotChanged(QString, QString)));
}
void UIGChooserModel::loadLastSelectedItem()
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.h
index 4271b41..13e90b5 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserModel.h
@@ -1,3 +1,4 @@
+/* $Id: UIGChooserModel.h $ */
/** @file
* VBox Qt GUI - UIGChooserModel class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserView.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserView.h
index af44072..e0f78af 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserView.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/chooser/UIGChooserView.h
@@ -1,3 +1,4 @@
+/* $Id: UIGChooserView.h $ */
/** @file
* VBox Qt GUI - UIGChooserView class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetails.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetails.h
index aa28d18..3cb2f93 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetails.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetails.h
@@ -1,3 +1,4 @@
+/* $Id: UIGDetails.h $ */
/** @file
* VBox Qt GUI - UIGDetails class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h
index 5ac7956..091f927 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElement.h
@@ -1,3 +1,4 @@
+/* $Id: UIGDetailsElement.h $ */
/** @file
* VBox Qt GUI - UIGDetailsElement class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
index 3d380b3..9be3f9f 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.cpp
@@ -32,6 +32,7 @@
# include "UIIconPool.h"
# include "UIConverter.h"
# include "UIGraphicsTextPane.h"
+# include "UIMessageCenter.h"
/* COM includes: */
# include "CSystemProperties.h"
@@ -409,31 +410,65 @@ void UIGDetailsUpdateThreadDisplay::run()
/* Gather information: */
if (machine().GetAccessible())
{
+ /* Damn GetExtraData should be const already :( */
+ CMachine localMachine = machine();
+
/* Video memory: */
m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Memory", "details (display)"),
- QApplication::translate("UIGDetails", "%1 MB", "details").arg(machine().GetVRAMSize()));
+ QApplication::translate("UIGDetails", "%1 MB", "details").arg(localMachine.GetVRAMSize()));
/* Screen count: */
- int cGuestScreens = machine().GetMonitorCount();
+ int cGuestScreens = localMachine.GetMonitorCount();
if (cGuestScreens > 1)
m_text << UITextTableLine(QApplication::translate("UIGDetails", "Screens", "details (display)"),
QString::number(cGuestScreens));
+ /* Get scale-factor value: */
+ const QString strScaleFactor = localMachine.GetExtraData(UIExtraDataDefs::GUI_ScaleFactor);
+ {
+ /* Try to convert loaded data to double: */
+ bool fOk = false;
+ double dValue = strScaleFactor.toDouble(&fOk);
+ /* Invent the default value: */
+ if (!fOk || !dValue)
+ dValue = 1.0;
+ /* Append information: */
+ if (dValue != 1.0)
+ m_text << UITextTableLine(QApplication::translate("UIGDetails", "Scale-factor", "details (display)"),
+ QString::number(dValue, 'f', 2));
+ }
+
+#ifdef Q_WS_MAC
+ /* Get 'Unscaled HiDPI Video Output' mode value: */
+ const QString strUnscaledHiDPIMode = localMachine.GetExtraData(UIExtraDataDefs::GUI_HiDPI_UnscaledOutput);
+ {
+ /* Try to convert loaded data to bool: */
+ const bool fEnabled = strUnscaledHiDPIMode.compare("true", Qt::CaseInsensitive) == 0 ||
+ strUnscaledHiDPIMode.compare("yes", Qt::CaseInsensitive) == 0 ||
+ strUnscaledHiDPIMode.compare("on", Qt::CaseInsensitive) == 0 ||
+ strUnscaledHiDPIMode == "1";
+ /* Append information: */
+ if (fEnabled)
+ m_text << UITextTableLine(QApplication::translate("UIGDetails", "Unscaled HiDPI Video Output", "details (display)"),
+ QApplication::translate("UIGDetails", "Enabled", "details (display/Unscaled HiDPI Video Output)"));
+ }
+#endif /* Q_WS_MAC */
+
QStringList acceleration;
#ifdef VBOX_WITH_VIDEOHWACCEL
/* 2D acceleration: */
- if (machine().GetAccelerate2DVideoEnabled())
+ if (localMachine.GetAccelerate2DVideoEnabled())
acceleration << QApplication::translate("UIGDetails", "2D Video", "details (display)");
#endif /* VBOX_WITH_VIDEOHWACCEL */
/* 3D acceleration: */
- if (machine().GetAccelerate3DEnabled())
+ if (localMachine.GetAccelerate3DEnabled())
acceleration << QApplication::translate("UIGDetails", "3D", "details (display)");
if (!acceleration.isEmpty())
m_text << UITextTableLine(QApplication::translate("UIGDetails", "Acceleration", "details (display)"),
acceleration.join(", "));
/* VRDE info: */
- CVRDEServer srv = machine().GetVRDEServer();
+ CVRDEServer srv = localMachine.GetVRDEServer();
if (!srv.isNull())
{
if (srv.GetEnabled())
@@ -445,14 +480,14 @@ void UIGDetailsUpdateThreadDisplay::run()
}
/* Video Capture info: */
- if (machine().GetVideoCaptureEnabled())
+ if (localMachine.GetVideoCaptureEnabled())
{
m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture File", "details (display/video capture)"),
- machine().GetVideoCaptureFile());
+ localMachine.GetVideoCaptureFile());
m_text << UITextTableLine(QApplication::translate("UIGDetails", "Video Capture Attributes", "details (display/video capture)"),
QApplication::translate("UIGDetails", "Frame Size: %1x%2, Frame Rate: %3fps, Bit Rate: %4kbps")
- .arg(machine().GetVideoCaptureWidth()).arg(machine().GetVideoCaptureHeight())
- .arg(machine().GetVideoCaptureFPS()).arg(machine().GetVideoCaptureRate()));
+ .arg(localMachine.GetVideoCaptureWidth()).arg(localMachine.GetVideoCaptureHeight())
+ .arg(localMachine.GetVideoCaptureFPS()).arg(localMachine.GetVideoCaptureRate()));
}
else
{
@@ -522,6 +557,11 @@ void UIGDetailsUpdateThreadStorage::run()
{
/* Prepare current storage slot: */
StorageSlot attachmentSlot(controller.GetBus(), attachment.GetPort(), attachment.GetDevice());
+ AssertMsg(controller.isOk(),
+ ("Unable to acquire controller data: %s\n",
+ msgCenter().formatRC(controller.lastRC()).toAscii().constData()));
+ if (!controller.isOk())
+ continue;
/* Prepare attachment information: */
QString strAttachmentInfo = vboxGlobal().details(attachment.GetMedium(), false, false);
/* That temporary hack makes sure 'Inaccessible' word is always bold: */
@@ -1068,34 +1108,35 @@ void UIGDetailsUpdateThreadUI::run()
/* Damn GetExtraData should be const already :( */
CMachine localMachine = machine();
- /* Get scale-factor value: */
- const QString strScaleFactor = localMachine.GetExtraData(UIExtraDataDefs::GUI_ScaleFactor);
+#ifndef Q_WS_MAC
+ /* Get menu-bar availability status: */
+ const QString strMenubarEnabled = localMachine.GetExtraData(UIExtraDataDefs::GUI_MenuBar_Enabled);
{
- /* Try to convert loaded data to double: */
- bool fOk = false;
- double dValue = strScaleFactor.toDouble(&fOk);
- /* Invent the default value: */
- if (!fOk || !dValue)
- dValue = 1.0;
+ /* Try to convert loaded data to bool: */
+ const bool fEnabled = !(strMenubarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
+ strMenubarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
+ strMenubarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
+ strMenubarEnabled == "0");
/* Append information: */
- m_text << UITextTableLine(QApplication::translate("UIGDetails", "Scale-factor", "details (user interface)"), QString::number(dValue, 'f', 2));
+ m_text << UITextTableLine(QApplication::translate("UIGDetails", "Menu-bar", "details (user interface)"),
+ fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/menu-bar)") :
+ QApplication::translate("UIGDetails", "Disabled", "details (user interface/menu-bar)"));
}
+#endif /* !Q_WS_MAC */
-#ifdef Q_WS_MAC
- /* Get 'Unscaled HiDPI Video Output' mode value: */
- const QString strUnscaledHiDPIMode = localMachine.GetExtraData(UIExtraDataDefs::GUI_HiDPI_UnscaledOutput);
+ /* Get status-bar availability status: */
+ const QString strStatusbarEnabled = localMachine.GetExtraData(UIExtraDataDefs::GUI_StatusBar_Enabled);
{
/* Try to convert loaded data to bool: */
- const bool fEnabled = strUnscaledHiDPIMode.compare("true", Qt::CaseInsensitive) == 0 ||
- strUnscaledHiDPIMode.compare("yes", Qt::CaseInsensitive) == 0 ||
- strUnscaledHiDPIMode.compare("on", Qt::CaseInsensitive) == 0 ||
- strUnscaledHiDPIMode == "1";
+ const bool fEnabled = !(strStatusbarEnabled.compare("false", Qt::CaseInsensitive) == 0 ||
+ strStatusbarEnabled.compare("no", Qt::CaseInsensitive) == 0 ||
+ strStatusbarEnabled.compare("off", Qt::CaseInsensitive) == 0 ||
+ strStatusbarEnabled == "0");
/* Append information: */
- if (fEnabled)
- m_text << UITextTableLine(QApplication::translate("UIGDetails", "Unscaled HiDPI Video Output", "details (user interface)"),
- QApplication::translate("UIGDetails", "Enabled", "details (user interface/Unscaled HiDPI Video Output)"));
+ m_text << UITextTableLine(QApplication::translate("UIGDetails", "Status-bar", "details (user interface)"),
+ fEnabled ? QApplication::translate("UIGDetails", "Enabled", "details (user interface/status-bar)") :
+ QApplication::translate("UIGDetails", "Disabled", "details (user interface/status-bar)"));
}
-#endif /* Q_WS_MAC */
#ifndef Q_WS_MAC
/* Get mini-toolbar availability status: */
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h
index c2559ad..0e140db 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsElements.h
@@ -1,3 +1,4 @@
+/* $Id: UIGDetailsElements.h $ */
/** @file
* VBox Qt GUI - UIGDetailsElements class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsGroup.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsGroup.h
index 3abea27..c1bf8d6 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsGroup.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsGroup.h
@@ -1,3 +1,4 @@
+/* $Id: UIGDetailsGroup.h $ */
/** @file
* VBox Qt GUI - UIGDetailsGroup class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsItem.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsItem.h
index 04f44d3..9422d39 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsItem.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsItem.h
@@ -1,3 +1,4 @@
+/* $Id: UIGDetailsItem.h $ */
/** @file
* VBox Qt GUI - UIGDetailsItem class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.h
index 60b1209..a615e1c 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsModel.h
@@ -1,3 +1,4 @@
+/* $Id: UIGDetailsModel.h $ */
/** @file
* VBox Qt GUI - UIGDetailsModel class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp
index b258129..da7ef57 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.cpp
@@ -343,6 +343,7 @@ void UIGDetailsSet::prepareConnections()
connect(gVBoxEvents, SIGNAL(sigSnapshotTake(QString, QString)), this, SLOT(sltMachineAttributesChange(QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotDelete(QString, QString)), this, SLOT(sltMachineAttributesChange(QString)));
connect(gVBoxEvents, SIGNAL(sigSnapshotChange(QString, QString)), this, SLOT(sltMachineAttributesChange(QString)));
+ connect(gVBoxEvents, SIGNAL(sigSnapshotRestore(QString, QString)), this, SLOT(sltMachineAttributesChange(QString)));
/* Meidum-enumeration connections: */
connect(&vboxGlobal(), SIGNAL(sigMediumEnumerationStarted()), this, SLOT(sltUpdateAppearance()));
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.h
index fa5de1d..35e5562 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsSet.h
@@ -1,3 +1,4 @@
+/* $Id: UIGDetailsSet.h $ */
/** @file
* VBox Qt GUI - UIGDetailsSet class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsView.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsView.h
index a2debeb..f0957b1 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsView.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGDetailsView.h
@@ -1,3 +1,4 @@
+/* $Id: UIGDetailsView.h $ */
/** @file
* VBox Qt GUI - UIGDetailsView class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGMachinePreview.h b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGMachinePreview.h
index 750b116..ee66346 100644
--- a/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGMachinePreview.h
+++ b/src/VBox/Frontends/VirtualBox/src/selector/graphics/details/UIGMachinePreview.h
@@ -1,3 +1,4 @@
+/* $Id: UIGMachinePreview.h $ */
/** @file
* VBox Qt GUI - UIGMachinePreview class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.h b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.h
index 6ecc047..cf6027d 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UISettingsDefs.h $ */
/** @file
* VBox Qt GUI - Header with definitions and functions related to settings configuration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp
index 665dbff..c08236c 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.cpp
@@ -46,14 +46,12 @@
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
-
#ifdef Q_WS_MAC
# if MAC_LEOPARD_STYLE
# define VBOX_GUI_WITH_TOOLBAR_SETTINGS
# endif
#endif
-
/* Settings Dialog Constructor: */
UISettingsDialog::UISettingsDialog(QWidget *pParent)
/* Parent class: */
@@ -66,7 +64,6 @@ UISettingsDialog::UISettingsDialog(QWidget *pParent)
, m_fPolished(false)
/* Loading/saving stuff: */
, m_pSerializeProcess(0)
- , m_pSerializeProgress(0)
, m_fLoaded(false)
, m_fSaved(false)
/* Status-bar stuff: */
@@ -124,6 +121,8 @@ UISettingsDialog::UISettingsDialog(QWidget *pParent)
/* Prepare process-bar: */
m_pProcessBar = new QProgressBar;
+ m_pProcessBar->setMaximum(100);
+ m_pProcessBar->setMinimum(0);
/* Prepare warning-pane: */
m_pWarningPane = new UIWarningPane;
@@ -158,11 +157,6 @@ UISettingsDialog::~UISettingsDialog()
delete m_pSerializeProcess;
m_pSerializeProcess = 0;
}
- if (serializeProgress())
- {
- delete m_pSerializeProgress;
- m_pSerializeProgress = 0;
- }
/* Recall popup-pane if any: */
popupCenter().recall(m_pStack, "SettingsDialogWarning");
@@ -224,11 +218,6 @@ void UISettingsDialog::sltMarkLoaded()
delete m_pSerializeProcess;
m_pSerializeProcess = 0;
}
- if (serializeProgress())
- {
- delete m_pSerializeProgress;
- m_pSerializeProgress = 0;
- }
/* Mark as loaded: */
m_fLoaded = true;
@@ -242,11 +231,6 @@ void UISettingsDialog::sltMarkSaved()
delete m_pSerializeProcess;
m_pSerializeProcess = 0;
}
- if (serializeProgress())
- {
- delete m_pSerializeProgress;
- m_pSerializeProgress = 0;
- }
/* Mark as saved: */
m_fSaved = true;
@@ -258,9 +242,9 @@ void UISettingsDialog::sltHandleProcessStarted()
m_pStatusBar->setCurrentWidget(m_pProcessBar);
}
-void UISettingsDialog::sltHandlePageProcessed()
+void UISettingsDialog::sltHandleProcessProgressChange(int iValue)
{
- m_pProcessBar->setValue(m_pProcessBar->value() + 1);
+ m_pProcessBar->setValue(iValue);
if (m_pProcessBar->value() == m_pProcessBar->maximum())
{
if (!m_fValid || !m_fSilent)
@@ -282,16 +266,18 @@ void UISettingsDialog::loadData(QVariant &data)
{
/* Configure settings loader: */
connect(m_pSerializeProcess, SIGNAL(sigNotifyAboutProcessStarted()), this, SLOT(sltHandleProcessStarted()));
- connect(m_pSerializeProcess, SIGNAL(sigNotifyAboutPagePostprocessed(int)), this, SLOT(sltHandlePageProcessed()));
+ connect(m_pSerializeProcess, SIGNAL(sigNotifyAboutProcessProgressChanged(int)), this, SLOT(sltHandleProcessProgressChange(int)));
connect(m_pSerializeProcess, SIGNAL(sigNotifyAboutProcessFinished()), this, SLOT(sltMarkLoaded()));
+
/* Raise current page priority: */
m_pSerializeProcess->raisePriorityOfPage(m_pSelector->currentId());
+
/* Start settings loader: */
m_pSerializeProcess->start();
- }
- /* Upload data finally: */
- data = m_pSerializeProcess->data();
+ /* Upload data finally: */
+ data = m_pSerializeProcess->data();
+ }
}
void UISettingsDialog::saveData(QVariant &data)
@@ -299,20 +285,30 @@ void UISettingsDialog::saveData(QVariant &data)
/* Mark as not saved: */
m_fSaved = false;
- /* Create settings saver: */
- QWidget *pDlgParent = windowManager().realParentWindow(window());
- m_pSerializeProgress = new UISettingsSerializerProgress(pDlgParent, UISettingsSerializer::Save,
- data, m_pSelector->settingPages());
- AssertPtrReturnVoid(m_pSerializeProgress);
+ /* Create the 'settings saver': */
+ QPointer<UISettingsSerializerProgress> pDlgSerializeProgress =
+ new UISettingsSerializerProgress(this, UISettingsSerializer::Save,
+ data, m_pSelector->settingPages());
+ AssertPtrReturnVoid(static_cast<UISettingsSerializerProgress*>(pDlgSerializeProgress));
{
- /* Make setting saver the temporary parent for all the sub-dialogs: */
- windowManager().registerNewParent(m_pSerializeProgress, pDlgParent);
- /* Start settings saver: */
- m_pSerializeProgress->exec();
- }
+ /* Make the 'settings saver' temporary parent for all sub-dialogs: */
+ windowManager().registerNewParent(pDlgSerializeProgress, windowManager().realParentWindow(this));
+
+ /* Execute the 'settings saver': */
+ pDlgSerializeProgress->exec();
+
+ /* Any modal dialog can be destroyed in own event-loop
+ * as a part of application termination procedure..
+ * We have to check if the dialog still valid. */
+ if (pDlgSerializeProgress)
+ {
+ /* Upload 'settings saver' data: */
+ data = pDlgSerializeProgress->data();
- /* Upload data finally: */
- data = m_pSerializeProgress->data();
+ /* Delete the 'settings saver': */
+ delete pDlgSerializeProgress;
+ }
+ }
}
void UISettingsDialog::retranslateUi()
@@ -351,15 +347,6 @@ void UISettingsDialog::setConfigurationAccessLevel(ConfigurationAccessLevel newC
pPage->setConfigurationAccessLevel(configurationAccessLevel());
}
-QString UISettingsDialog::titleExtension() const
-{
-#ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
- return m_pSelector->itemText(m_pSelector->currentId());
-#else
- return tr("Settings");
-#endif
-}
-
void UISettingsDialog::addItem(const QString &strBigIcon,
const QString &strMediumIcon,
const QString &strSmallIcon,
@@ -374,9 +361,6 @@ void UISettingsDialog::addItem(const QString &strBigIcon,
{
/* Add stack-widget page if created: */
m_pages[cId] = m_pStack->addWidget(pPage);
- /* Update process-bar: */
- m_pProcessBar->setMinimum(0);
- m_pProcessBar->setMaximum(m_pStack->count());
}
/* Assign validator if necessary: */
if (pSettingsPage)
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.h b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.h
index 8e62f22..bfe6a60 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialog.h
@@ -1,3 +1,4 @@
+/* $Id: UISettingsDialog.h $ */
/** @file
* VBox Qt GUI - UISettingsDialog class declaration.
*/
@@ -32,7 +33,6 @@ class UIWarningPane;
class VBoxSettingsSelector;
class UISettingsPage;
class UISettingsSerializer;
-class UISettingsSerializerProgress;
/* Using declarations: */
using namespace UISettingsDefs;
@@ -66,14 +66,12 @@ protected slots:
/* Handlers for process bar: */
void sltHandleProcessStarted();
- void sltHandlePageProcessed();
+ void sltHandleProcessProgressChange(int iValue);
protected:
/** Returns the serialize process instance. */
UISettingsSerializer* serializeProcess() const { return m_pSerializeProcess; }
- /** Returns the serialize progress instance. */
- UISettingsSerializerProgress* serializeProgress() const { return m_pSerializeProgress; }
/** Loads the @a data. */
void loadData(QVariant &data);
@@ -95,10 +93,10 @@ protected:
/** Defines configuration access level. */
void setConfigurationAccessLevel(ConfigurationAccessLevel newConfigurationAccessLevel);
- /* Dialog title: */
+ /** Returns the dialog title extension. */
+ virtual QString titleExtension() const = 0;
+ /** Returns the dialog title. */
virtual QString title() const = 0;
- /* Dialog title extension: */
- virtual QString titleExtension() const;
/* Add settings page: */
void addItem(const QString &strBigIcon, const QString &strMediumIcon, const QString &strSmallIcon,
@@ -144,8 +142,6 @@ private:
/** Holds the serialize process instance. */
UISettingsSerializer *m_pSerializeProcess;
- /** Holds the serialize progress instance. */
- UISettingsSerializerProgress *m_pSerializeProgress;
/* Loading/saving stuff: */
bool m_fLoaded;
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
index 6271ec9..8b6fa0a 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.cpp
@@ -60,6 +60,12 @@
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
+#ifdef Q_WS_MAC
+# if MAC_LEOPARD_STYLE
+# define VBOX_GUI_WITH_TOOLBAR_SETTINGS
+# endif
+#endif
+
UISettingsDialogGlobal::UISettingsDialogGlobal(QWidget *pParent,
const QString &strCategory /* = QString() */,
const QString &strControl /* = QString() */)
@@ -279,6 +285,15 @@ void UISettingsDialogGlobal::retranslateUi()
setWindowTitle(title());
}
+QString UISettingsDialogGlobal::titleExtension() const
+{
+#ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
+ return m_pSelector->itemText(m_pSelector->currentId());
+#else /* VBOX_GUI_WITH_TOOLBAR_SETTINGS */
+ return tr("Preferences");
+#endif /* !VBOX_GUI_WITH_TOOLBAR_SETTINGS */
+}
+
QString UISettingsDialogGlobal::title() const
{
return tr("VirtualBox - %1").arg(titleExtension());
@@ -639,6 +654,15 @@ void UISettingsDialogMachine::retranslateUi()
setWindowTitle(title());
}
+QString UISettingsDialogMachine::titleExtension() const
+{
+#ifdef VBOX_GUI_WITH_TOOLBAR_SETTINGS
+ return m_pSelector->itemText(m_pSelector->currentId());
+#else /* VBOX_GUI_WITH_TOOLBAR_SETTINGS */
+ return tr("Settings");
+#endif /* !VBOX_GUI_WITH_TOOLBAR_SETTINGS */
+}
+
QString UISettingsDialogMachine::title() const
{
QString strDialogTitle;
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.h b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.h
index 769abfb..d86b6a8 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsDialogSpecific.h
@@ -1,3 +1,4 @@
+/* $Id: UISettingsDialogSpecific.h $ */
/** @file
* VBox Qt GUI - UISettingsDialogSpecific class declaration.
*/
@@ -46,6 +47,9 @@ protected:
void retranslateUi();
+ /** Returns the dialog title extension. */
+ QString titleExtension() const;
+ /** Returns the dialog title. */
QString title() const;
private:
@@ -72,6 +76,9 @@ protected:
void retranslateUi();
+ /** Returns the dialog title extension. */
+ QString titleExtension() const;
+ /** Returns the dialog title. */
QString title() const;
void recorrelate(UISettingsPage *pSettingsPage);
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsPage.h b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsPage.h
index 67e1b80..f79c420 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsPage.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsPage.h
@@ -1,3 +1,4 @@
+/* $Id: UISettingsPage.h $ */
/** @file
* VBox Qt GUI - UISettingsPage class declaration.
*/
@@ -77,6 +78,20 @@ class UISettingsPage : public QIWithRetranslateUI<QWidget>
{
Q_OBJECT;
+signals:
+
+ /** Notifies listeners about particular operation progress change.
+ * @param iOperations holds the number of operations CProgress have,
+ * @param strOperation holds the description of the current CProgress operation,
+ * @param iOperation holds the index of the current CProgress operation,
+ * @param iPercent holds the percentage of the current CProgress operation. */
+ void sigOperationProgressChange(ulong iOperations, QString strOperation,
+ ulong iOperation, ulong iPercent);
+
+ /** Notifies listeners about particular COM error.
+ * @param strErrorInfo holds the details of the error happened. */
+ void sigOperationProgressError(QString strErrorInfo);
+
public:
/* Load data to cache from corresponding external object(s),
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.cpp b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.cpp
index a25ed1a..e846685 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.cpp
@@ -20,9 +20,16 @@
#else /* !VBOX_WITH_PRECOMPILED_HEADERS */
/* Qt includes: */
# include <QTimer>
+# include <QLabel>
+# include <QHBoxLayout>
+# include <QVBoxLayout>
+# include <QProgressBar>
/* GUI includes: */
# include "UISettingsSerializer.h"
+# include "UIMessageCenter.h"
# include "UISettingsPage.h"
+# include "UIIconPool.h"
+# include "QILabel.h"
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
UISettingsSerializer::UISettingsSerializer(QObject *pParent, SerializationDirection direction,
@@ -81,21 +88,27 @@ void UISettingsSerializer::start(Priority priority /* = InheritPriority */)
void UISettingsSerializer::sltHandleProcessedPage(int iPageId)
{
+ /* Make sure such page present: */
+ AssertReturnVoid(m_pages.contains(iPageId));
+
+ /* Get the page being processed: */
+ UISettingsPage *pSettingsPage = m_pages.value(iPageId);
+
/* If serializer loads settings: */
if (m_direction == Load)
{
- /* If such page present: */
- if (m_pages.contains(iPageId))
- {
- /* We should fetch internal page cache: */
- UISettingsPage *pSettingsPage = m_pages[iPageId];
- pSettingsPage->setValidatorBlocked(true);
- pSettingsPage->getFromCache();
- pSettingsPage->setValidatorBlocked(false);
- }
+ /* We should fetch internal page cache: */
+ pSettingsPage->setValidatorBlocked(true);
+ pSettingsPage->getFromCache();
+ pSettingsPage->setValidatorBlocked(false);
}
- /* Notify listeners about page postprocessed: */
- emit sigNotifyAboutPagePostprocessed(iPageId);
+
+ /* Add processed page into corresponding map: */
+ m_pagesDone.insert(iPageId, pSettingsPage);
+
+ /* Notify listeners about process reached n%: */
+ const int iValue = 100 * m_pagesDone.size() / m_pages.size();
+ emit sigNotifyAboutProcessProgressChanged(iValue);
}
void UISettingsSerializer::sltHandleProcessedPages()
@@ -114,8 +127,9 @@ void UISettingsSerializer::sltHandleProcessedPages()
foreach (UISettingsPage *pPage, m_pages.values())
pPage->revalidate();
}
- /* Notify listeners about pages postprocessed: */
- emit sigNotifyAboutPagesPostprocessed();
+
+ /* Notify listeners about process reached 100%: */
+ emit sigNotifyAboutProcessProgressChanged(100);
}
void UISettingsSerializer::run()
@@ -138,6 +152,10 @@ void UISettingsSerializer::run()
if (m_iIdOfHighPriorityPage != -1)
m_iIdOfHighPriorityPage = -1;
/* Process this page if its enabled: */
+ connect(pPage, SIGNAL(sigOperationProgressChange(ulong, QString, ulong, ulong)),
+ this, SIGNAL(sigOperationProgressChange(ulong, QString, ulong, ulong)));
+ connect(pPage, SIGNAL(sigOperationProgressError(QString)),
+ this, SIGNAL(sigOperationProgressError(QString)));
if (pPage->isEnabled())
{
if (m_direction == Load)
@@ -146,6 +164,10 @@ void UISettingsSerializer::run()
pPage->saveFromCacheTo(m_data);
}
/* Remember what page was processed: */
+ disconnect(pPage, SIGNAL(sigOperationProgressChange(ulong, QString, ulong, ulong)),
+ this, SIGNAL(sigOperationProgressChange(ulong, QString, ulong, ulong)));
+ disconnect(pPage, SIGNAL(sigOperationProgressError(QString)),
+ this, SIGNAL(sigOperationProgressError(QString)));
pPage->setProcessed(true);
/* Remove processed page from our map: */
pages.remove(pPage->id());
@@ -168,13 +190,19 @@ void UISettingsSerializer::run()
COMBase::CleanupCOM();
}
+QString UISettingsSerializerProgress::m_strProgressDescriptionTemplate = QString("<compact elipsis=\"middle\">%1 (%2/%3)</compact>");
+
UISettingsSerializerProgress::UISettingsSerializerProgress(QWidget *pParent, UISettingsSerializer::SerializationDirection direction,
const QVariant &data, const UISettingsPageList &pages)
- : QIWithRetranslateUI<QProgressDialog>(pParent)
+ : QIWithRetranslateUI<QIDialog>(pParent)
, m_direction(direction)
, m_data(data)
, m_pages(pages)
, m_pSerializer(0)
+ , m_pLabelOperationProgress(0)
+ , m_pBarOperationProgress(0)
+ , m_pLabelSubOperationProgress(0)
+ , m_pBarSubOperationProgress(0)
{
/* Prepare: */
prepare();
@@ -188,7 +216,7 @@ int UISettingsSerializerProgress::exec()
emit sigAskForProcessStart();
/* Call to base-class: */
- return QIWithRetranslateUI<QProgressDialog>::exec();
+ return QIWithRetranslateUI<QIDialog>::exec();
}
QVariant& UISettingsSerializerProgress::data()
@@ -201,8 +229,7 @@ void UISettingsSerializerProgress::prepare()
{
/* Configure self: */
setWindowModality(Qt::WindowModal);
- setMinimumDuration(0);
- setCancelButton(0);
+ setWindowTitle(parentWidget()->windowTitle());
connect(this, SIGNAL(sigAskForProcessStart()),
this, SLOT(sltStartProcess()), Qt::QueuedConnection);
@@ -211,25 +238,106 @@ void UISettingsSerializerProgress::prepare()
AssertPtrReturnVoid(m_pSerializer);
{
/* Install progress handler: */
- connect(m_pSerializer, SIGNAL(sigNotifyAboutPagePostprocessed(int)),
- this, SLOT(sltAdvanceProgressValue()));
- connect(m_pSerializer, SIGNAL(sigNotifyAboutPagesPostprocessed()),
- this, SLOT(sltAdvanceProgressValue()));
+ connect(m_pSerializer, SIGNAL(sigNotifyAboutProcessProgressChanged(int)),
+ this, SLOT(sltHandleProcessProgressChange(int)));
+ connect(m_pSerializer, SIGNAL(sigOperationProgressChange(ulong, QString, ulong, ulong)),
+ this, SLOT(sltHandleOperationProgressChange(ulong, QString, ulong, ulong)));
+ connect(m_pSerializer, SIGNAL(sigOperationProgressError(QString)),
+ this, SLOT(sltHandleOperationProgressError(QString)));
}
- /* Set maximum/minimum/current values: */
- setMaximum(m_pSerializer->pageCount() + 1);
- setMinimum(0);
- setValue(0);
+ /* Create layout: */
+ QVBoxLayout *pLayout = new QVBoxLayout(this);
+ AssertPtrReturnVoid(pLayout);
+ {
+ /* Create top layout: */
+ QHBoxLayout *pLayoutTop = new QHBoxLayout;
+ AssertPtrReturnVoid(pLayoutTop);
+ {
+ /* Create pixmap layout: */
+ QVBoxLayout *pLayoutPixmap = new QVBoxLayout;
+ AssertPtrReturnVoid(pLayoutPixmap);
+ {
+ /* Create pixmap label: */
+ QLabel *pLabelPixmap = new QLabel;
+ AssertPtrReturnVoid(pLabelPixmap);
+ {
+ /* Configure label: */
+ const QIcon icon = UIIconPool::iconSet(":/progress_settings_90px.png");
+ pLabelPixmap->setPixmap(icon.pixmap(icon.availableSizes().first()));
+ /* Add label into layout: */
+ pLayoutPixmap->addWidget(pLabelPixmap);
+ }
+ /* Add stretch: */
+ pLayoutPixmap->addStretch();
+ /* Add layout into parent: */
+ pLayoutTop->addLayout(pLayoutPixmap);
+ }
+ /* Create progress layout: */
+ QVBoxLayout *pLayoutProgress = new QVBoxLayout;
+ AssertPtrReturnVoid(pLayoutProgress);
+ {
+ /* Create operation progress label: */
+ m_pLabelOperationProgress = new QLabel;
+ AssertPtrReturnVoid(m_pLabelOperationProgress);
+ {
+ /* Add label into layout: */
+ pLayoutProgress->addWidget(m_pLabelOperationProgress);
+ }
+ /* Create operation progress bar: */
+ m_pBarOperationProgress = new QProgressBar;
+ AssertPtrReturnVoid(m_pBarOperationProgress);
+ {
+ /* Configure progress bar: */
+ m_pBarOperationProgress->setMinimumWidth(300);
+ m_pBarOperationProgress->setMaximum(100);
+ m_pBarOperationProgress->setMinimum(0);
+ m_pBarOperationProgress->setValue(0);
+ /* Add bar into layout: */
+ pLayoutProgress->addWidget(m_pBarOperationProgress);
+ }
+ /* Create sub-operation progress label: */
+ m_pLabelSubOperationProgress = new QILabel;
+ AssertPtrReturnVoid(m_pLabelSubOperationProgress);
+ {
+ /* Configure label: */
+ m_pLabelSubOperationProgress->hide();
+ m_pLabelSubOperationProgress->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed));
+ /* Add label into layout: */
+ pLayoutProgress->addWidget(m_pLabelSubOperationProgress);
+ }
+ /* Create sub-operation progress bar: */
+ m_pBarSubOperationProgress = new QProgressBar;
+ AssertPtrReturnVoid(m_pBarSubOperationProgress);
+ {
+ /* Configure progress bar: */
+ m_pBarSubOperationProgress->hide();
+ m_pBarSubOperationProgress->setMinimumWidth(300);
+ m_pBarSubOperationProgress->setMaximum(100);
+ m_pBarSubOperationProgress->setMinimum(0);
+ m_pBarSubOperationProgress->setValue(0);
+ /* Add bar into layout: */
+ pLayoutProgress->addWidget(m_pBarSubOperationProgress);
+ }
+ /* Add stretch: */
+ pLayoutProgress->addStretch();
+ /* Add layout into parent: */
+ pLayoutTop->addLayout(pLayoutProgress);
+ }
+ /* Add layout into parent: */
+ pLayout->addLayout(pLayoutTop);
+ }
+ }
}
void UISettingsSerializerProgress::retranslateUi()
{
- /* Translate title: */
+ /* Translate operation progress label: */
+ AssertPtrReturnVoid(m_pLabelOperationProgress);
switch (m_pSerializer->direction())
{
- case UISettingsSerializer::Load: setLabelText(tr("Loading Settings...")); break;
- case UISettingsSerializer::Save: setLabelText(tr("Saving Settings...")); break;
+ case UISettingsSerializer::Load: m_pLabelOperationProgress->setText(tr("Loading Settings...")); break;
+ case UISettingsSerializer::Save: m_pLabelOperationProgress->setText(tr("Saving Settings...")); break;
}
}
@@ -250,3 +358,31 @@ void UISettingsSerializerProgress::sltStartProcess()
m_pSerializer->start();
}
+void UISettingsSerializerProgress::sltHandleProcessProgressChange(int iValue)
+{
+ /* Update the operation progress-bar with incoming value: */
+ AssertPtrReturnVoid(m_pBarOperationProgress);
+ m_pBarOperationProgress->setValue(iValue);
+ /* Hide the progress-dialog upon reaching the 100% progress: */
+ if (iValue == m_pBarOperationProgress->maximum())
+ hide();
+}
+
+void UISettingsSerializerProgress::sltHandleOperationProgressChange(ulong iOperations, QString strOperation,
+ ulong iOperation, ulong iPercent)
+{
+ /* Update the sub-operation progress label and bar: */
+ AssertPtrReturnVoid(m_pLabelSubOperationProgress);
+ AssertPtrReturnVoid(m_pBarSubOperationProgress);
+ m_pLabelSubOperationProgress->show();
+ m_pBarSubOperationProgress->show();
+ m_pLabelSubOperationProgress->setText(m_strProgressDescriptionTemplate.arg(strOperation).arg(iOperation).arg(iOperations));
+ m_pBarSubOperationProgress->setValue(iPercent);
+}
+
+void UISettingsSerializerProgress::sltHandleOperationProgressError(QString strErrorInfo)
+{
+ /* Show the error message: */
+ msgCenter().cannotSaveSettings(strErrorInfo, this);
+}
+
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.h b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.h
index e21f988..a120cd1 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/UISettingsSerializer.h
@@ -1,3 +1,4 @@
+/* $Id: UISettingsSerializer.h $ */
/** @file
* VBox Qt GUI - UISettingsSerializer class declaration.
*/
@@ -21,16 +22,19 @@
#include <QThread>
#include <QVariant>
#include <QWaitCondition>
-#include <QProgressDialog>
#include <QMutex>
#include <QList>
#include <QMap>
/* GUI includes: */
#include "QIWithRetranslateUI.h"
+#include "QIDialog.h"
/* Forward declarations: */
class UISettingsPage;
+class QProgressBar;
+class QILabel;
+class QLabel;
/* Type definitions: */
typedef QList<UISettingsPage*> UISettingsPageList;
@@ -44,21 +48,29 @@ class UISettingsSerializer : public QThread
signals:
- /** Notifies GUI thread about process has been started. */
+ /** Notifies listeners about process has been started. */
void sigNotifyAboutProcessStarted();
+ /** Notifies listeners about process reached @a iValue. */
+ void sigNotifyAboutProcessProgressChanged(int iValue);
+ /** Notifies listeners about process has been finished. */
+ void sigNotifyAboutProcessFinished();
/** Notifies GUI thread about some page was processed. */
void sigNotifyAboutPageProcessed(int iPageId);
/** Notifies GUI thread about all pages were processed. */
void sigNotifyAboutPagesProcessed();
- /** Notifies listeners about some page was post-processed. */
- void sigNotifyAboutPagePostprocessed(int iPageId);
- /** Notifies listeners about all pages were post-processed. */
- void sigNotifyAboutPagesPostprocessed();
+ /** Notifies listeners about particular operation progress change.
+ * @param iOperations holds the number of operations CProgress have,
+ * @param strOperation holds the description of the current CProgress operation,
+ * @param iOperation holds the index of the current CProgress operation,
+ * @param iPercent holds the percentage of the current CProgress operation. */
+ void sigOperationProgressChange(ulong iOperations, QString strOperation,
+ ulong iOperation, ulong iPercent);
- /** Notifies listeners about process has been finished. */
- void sigNotifyAboutProcessFinished();
+ /** Notifies listeners about particular COM error.
+ * @param strErrorInfo holds the details of the error happened. */
+ void sigOperationProgressError(QString strErrorInfo);
public:
@@ -113,6 +125,8 @@ protected:
QVariant m_data;
/** Holds the page(s) to load/save the data to/from. */
UISettingsPageMap m_pages;
+ /** Holds the page(s) to load/save the data to/from for which that task was done. */
+ UISettingsPageMap m_pagesDone;
/** Holds whether the save was complete. */
bool m_fSavingComplete;
@@ -124,9 +138,9 @@ protected:
QWaitCondition m_condition;
};
-/** QProgressDialog reimplementation used to
+/** QIDialog reimplementation used to
* reflect the settings serialization operation. */
-class UISettingsSerializerProgress : public QIWithRetranslateUI<QProgressDialog>
+class UISettingsSerializerProgress : public QIWithRetranslateUI<QIDialog>
{
Q_OBJECT;
@@ -170,8 +184,20 @@ private slots:
/** Starts the process. */
void sltStartProcess();
- /** Advances the current progress value. */
- void sltAdvanceProgressValue() { setValue(value() + 1); }
+ /** Handles process progress change to @a iValue. */
+ void sltHandleProcessProgressChange(int iValue);
+
+ /** Handles particular operation progress change.
+ * @param iOperations holds the number of operations CProgress have,
+ * @param strOperation holds the description of the current CProgress operation,
+ * @param iOperation holds the index of the current CProgress operation,
+ * @param iPercent holds the percentage of the current CProgress operation. */
+ void sltHandleOperationProgressChange(ulong iOperations, QString strOperation,
+ ulong iOperation, ulong iPercent);
+
+ /** Handles particular COM error.
+ * @param strErrorInfo holds the details of the error happened. */
+ void sltHandleOperationProgressError(QString strErrorInfo);
private:
@@ -185,6 +211,19 @@ private:
/** Holds the pointer to the thread loading/saving settings in async mode. */
UISettingsSerializer *m_pSerializer;
+
+ /** Holds the operation progress label. */
+ QLabel *m_pLabelOperationProgress;
+ /** Holds the operation progress bar. */
+ QProgressBar *m_pBarOperationProgress;
+
+ /** Holds the sub-operation progress label. */
+ QILabel *m_pLabelSubOperationProgress;
+ /** Holds the sub-operation progress bar. */
+ QProgressBar *m_pBarSubOperationProgress;
+
+ /** Holds the template for the sub-operation progress label. */
+ static QString m_strProgressDescriptionTemplate;
};
#endif /* !___UISettingsSerializer_h___ */
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/VBoxSettingsSelector.h b/src/VBox/Frontends/VirtualBox/src/settings/VBoxSettingsSelector.h
index 9e94833..bddf24b 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/VBoxSettingsSelector.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/VBoxSettingsSelector.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxSettingsSelector.h $ */
/** @file
* VBox Qt GUI - VBoxSettingsSelector class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsDisplay.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsDisplay.h
index cd4a5ba..5f7e1f6 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsDisplay.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsDisplay.h
@@ -1,3 +1,4 @@
+/* $Id: UIGlobalSettingsDisplay.h $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsDisplay class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsExtension.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsExtension.h
index 5f85465..7ca13c4 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsExtension.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsExtension.h
@@ -1,3 +1,4 @@
+/* $Id: UIGlobalSettingsExtension.h $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsExtension class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.cpp b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.cpp
index 81503e5..5d8596d 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.cpp
@@ -34,10 +34,6 @@ UIGlobalSettingsGeneral::UIGlobalSettingsGeneral()
/* Apply UI decorations: */
Ui::UIGlobalSettingsGeneral::setupUi(this);
-#ifndef Q_WS_MAC
- m_pLabelPresentationMode->hide();
- m_pCheckBoxPresentationMode->hide();
-#endif /* !Q_WS_MAC */
/* Hide checkbox for now: */
m_pLabelHostScreenSaver->hide();
m_pCheckBoxHostScreenSaver->hide();
@@ -61,9 +57,6 @@ void UIGlobalSettingsGeneral::loadToCacheFrom(QVariant &data)
/* Load to cache: */
m_cache.m_strDefaultMachineFolder = m_properties.GetDefaultMachineFolder();
m_cache.m_strVRDEAuthLibrary = m_properties.GetVRDEAuthLibrary();
-#ifdef Q_WS_MAC
- m_cache.m_fPresentationModeEnabled = m_settings.presentationModeEnabled();
-#endif /* Q_WS_MAC */
m_cache.m_fHostScreenSaverDisabled = m_settings.hostScreenSaverDisabled();
/* Upload properties & settings to data: */
@@ -77,9 +70,6 @@ void UIGlobalSettingsGeneral::getFromCache()
/* Fetch from cache: */
m_pSelectorMachineFolder->setPath(m_cache.m_strDefaultMachineFolder);
m_pSelectorVRDPLibName->setPath(m_cache.m_strVRDEAuthLibrary);
-#ifdef Q_WS_MAC
- m_pCheckBoxPresentationMode->setChecked(m_cache.m_fPresentationModeEnabled);
-#endif /* Q_WS_MAC */
m_pCheckBoxHostScreenSaver->setChecked(m_cache.m_fHostScreenSaverDisabled);
}
@@ -90,9 +80,6 @@ void UIGlobalSettingsGeneral::putToCache()
/* Upload to cache: */
m_cache.m_strDefaultMachineFolder = m_pSelectorMachineFolder->path();
m_cache.m_strVRDEAuthLibrary = m_pSelectorVRDPLibName->path();
-#ifdef Q_WS_MAC
- m_cache.m_fPresentationModeEnabled = m_pCheckBoxPresentationMode->isChecked();
-#endif /* Q_WS_MAC */
m_cache.m_fHostScreenSaverDisabled = m_pCheckBoxHostScreenSaver->isChecked();
}
@@ -108,9 +95,6 @@ void UIGlobalSettingsGeneral::saveFromCacheTo(QVariant &data)
m_properties.SetDefaultMachineFolder(m_cache.m_strDefaultMachineFolder);
if (m_properties.isOk() && m_pSelectorVRDPLibName->isModified())
m_properties.SetVRDEAuthLibrary(m_cache.m_strVRDEAuthLibrary);
-#ifdef Q_WS_MAC
- m_settings.setPresentationModeEnabled(m_cache.m_fPresentationModeEnabled);
-#endif /* Q_WS_MAC */
m_settings.setHostScreenSaverDisabled(m_cache.m_fHostScreenSaverDisabled);
/* Upload properties & settings to data: */
@@ -122,8 +106,7 @@ void UIGlobalSettingsGeneral::setOrderAfter(QWidget *pWidget)
/* Configure navigation: */
setTabOrder(pWidget, m_pSelectorMachineFolder);
setTabOrder(m_pSelectorMachineFolder, m_pSelectorVRDPLibName);
- setTabOrder(m_pSelectorVRDPLibName, m_pCheckBoxPresentationMode);
- setTabOrder(m_pCheckBoxPresentationMode, m_pCheckBoxHostScreenSaver);
+ setTabOrder(m_pSelectorVRDPLibName, m_pCheckBoxHostScreenSaver);
}
void UIGlobalSettingsGeneral::retranslateUi()
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.h
index 2884c91..bf00550 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.h
@@ -1,3 +1,4 @@
+/* $Id: UIGlobalSettingsGeneral.h $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsGeneral class declaration.
*/
@@ -26,9 +27,6 @@ struct UISettingsCacheGlobalGeneral
{
QString m_strDefaultMachineFolder;
QString m_strVRDEAuthLibrary;
-#ifdef Q_WS_MAC
- bool m_fPresentationModeEnabled;
-#endif /* Q_WS_MAC */
bool m_fHostScreenSaverDisabled;
};
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.ui b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.ui
index 54ca27a..7e8b0cf 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.ui
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsGeneral.ui
@@ -71,29 +71,6 @@
</widget>
</item>
<item row="2" column="0">
- <widget class="QLabel" name="m_pLabelPresentationMode">
- <property name="text">
- <string>&Dock and Menubar:</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy">
- <cstring>m_pCheckBoxPresentationMode</cstring>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QCheckBox" name="m_pCheckBoxPresentationMode">
- <property name="text">
- <string>Auto-Show in Fullscreen</string>
- </property>
- <property name="whatsThis">
- <string>When checked, the host dock and menu bar will be shown when the virtual machine is in fullscreen mode.</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
<widget class="QLabel" name="m_pLabelHostScreenSaver">
<property name="text">
<string>&Host Screensaver:</string>
@@ -106,7 +83,7 @@
</property>
</widget>
</item>
- <item row="3" column="1">
+ <item row="2" column="1">
<widget class="QCheckBox" name="m_pCheckBoxHostScreenSaver">
<property name="whatsThis">
<string>When checked, the host screensaver will be disabled whenever a virtual machine is running.</string>
@@ -116,7 +93,7 @@
</property>
</widget>
</item>
- <item row="4" column="0" colspan="3">
+ <item row="3" column="0" colspan="3">
<spacer>
<property name="orientation">
<enum>Qt::Vertical</enum>
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.h
index dc5752d..6c2a84f 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.h
@@ -1,3 +1,4 @@
+/* $Id: UIGlobalSettingsInput.h $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsInput class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsLanguage.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsLanguage.h
index cf16317..0f44d55 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsLanguage.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsLanguage.h
@@ -1,3 +1,4 @@
+/* $Id: UIGlobalSettingsLanguage.h $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsLanguage class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h
index d0d69ef..8a8c8c0 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetwork.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsNetwork class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsHost.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsHost.h
index 3584a3b..351485e 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsHost.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsHost.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsNetworkDetailsHost class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h
index 4e99edb..85a1524 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsNetworkDetailsNAT.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsNetworkDetailsNAT class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsPortForwardingDlg.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsPortForwardingDlg.h
index b3d7c71..ebc9a23 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsPortForwardingDlg.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsPortForwardingDlg.h
@@ -1,3 +1,4 @@
+/* $Id: UIGlobalSettingsPortForwardingDlg.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsPortForwardingDlg class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.h
index cc1ec75..ef072ba 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsProxy.h
@@ -1,3 +1,4 @@
+/* $Id: UIGlobalSettingsProxy.h $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsProxy class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsUpdate.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsUpdate.h
index 07abc8d..137e100 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsUpdate.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsUpdate.h
@@ -1,3 +1,4 @@
+/* $Id: UIGlobalSettingsUpdate.h $ */
/** @file
* VBox Qt GUI - UIGlobalSettingsUpdate class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsAudio.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsAudio.h
index e3e74bd..1c199cd 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsAudio.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsAudio.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsAudio.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsAudio class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp
index e528a6a..2e7240d 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2008-2014 Oracle Corporation
+ * Copyright (C) 2008-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -25,7 +25,7 @@
/* GUI includes: */
# include "QIWidgetValidator.h"
# include "UIMachineSettingsDisplay.h"
-# include "UIMessageCenter.h"
+# include "UIExtraDataManager.h"
# include "UIConverter.h"
# include "VBoxGlobal.h"
@@ -36,7 +36,6 @@
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
-
UIMachineSettingsDisplay::UIMachineSettingsDisplay()
: m_iMinVRAM(0)
, m_iMaxVRAM(0)
@@ -100,9 +99,13 @@ void UIMachineSettingsDisplay::loadToCacheFrom(QVariant &data)
/* Prepare display data: */
UIDataSettingsMachineDisplay displayData;
- /* Cache Video data: */
+ /* Cache Screen data: */
displayData.m_iCurrentVRAM = m_machine.GetVRAMSize();
displayData.m_cGuestScreenCount = m_machine.GetMonitorCount();
+ displayData.m_dScaleFactor = gEDataManager->scaleFactor(m_machine.GetId());
+#ifdef Q_WS_MAC
+ displayData.m_fUseUnscaledHiDPIOutput = gEDataManager->useUnscaledHiDPIOutput(m_machine.GetId());
+#endif /* Q_WS_MAC */
displayData.m_f3dAccelerationEnabled = m_machine.GetAccelerate3DEnabled();
#ifdef VBOX_WITH_VIDEOHWACCEL
displayData.m_f2dAccelerationEnabled = m_machine.GetAccelerate2DVideoEnabled();
@@ -148,8 +151,12 @@ void UIMachineSettingsDisplay::getFromCache()
/* Get display data from cache: */
const UIDataSettingsMachineDisplay &displayData = m_cache.base();
- /* Load Video data to page: */
+ /* Load Screen data to page: */
m_pEditorVideoScreenCount->setValue(displayData.m_cGuestScreenCount);
+ m_pEditorGuestScreenScale->setValue(displayData.m_dScaleFactor * 100);
+#ifdef Q_WS_MAC
+ m_pCheckBoxUnscaledHiDPIOutput->setChecked(displayData.m_fUseUnscaledHiDPIOutput);
+#endif /* Q_WS_MAC */
m_pCheckbox3D->setChecked(displayData.m_f3dAccelerationEnabled);
#ifdef VBOX_WITH_VIDEOHWACCEL
m_pCheckbox2DVideo->setChecked(displayData.m_f2dAccelerationEnabled);
@@ -192,9 +199,13 @@ void UIMachineSettingsDisplay::putToCache()
/* Prepare display data: */
UIDataSettingsMachineDisplay displayData = m_cache.base();
- /* Gather Video data from page: */
+ /* Gather Screen data from page: */
displayData.m_iCurrentVRAM = m_pEditorVideoMemorySize->value();
displayData.m_cGuestScreenCount = m_pEditorVideoScreenCount->value();
+ displayData.m_dScaleFactor = (double)m_pEditorGuestScreenScale->value() / 100;
+#ifdef Q_WS_MAC
+ displayData.m_fUseUnscaledHiDPIOutput = m_pCheckBoxUnscaledHiDPIOutput->isChecked();
+#endif /* Q_WS_MAC */
displayData.m_f3dAccelerationEnabled = m_pCheckbox3D->isChecked();
#ifdef VBOX_WITH_VIDEOHWACCEL
displayData.m_f2dAccelerationEnabled = m_pCheckbox2DVideo->isChecked();
@@ -237,10 +248,9 @@ void UIMachineSettingsDisplay::saveFromCacheTo(QVariant &data)
/* Get display data from cache: */
const UIDataSettingsMachineDisplay &displayData = m_cache.data();
- /* Make sure machine is 'offline': */
+ /* Store Screen data: */
if (isMachineOffline())
{
- /* Store Video data: */
m_machine.SetVRAMSize(displayData.m_iCurrentVRAM);
m_machine.SetMonitorCount(displayData.m_cGuestScreenCount);
m_machine.SetAccelerate3DEnabled(displayData.m_f3dAccelerationEnabled);
@@ -248,6 +258,13 @@ void UIMachineSettingsDisplay::saveFromCacheTo(QVariant &data)
m_machine.SetAccelerate2DVideoEnabled(displayData.m_f2dAccelerationEnabled);
#endif /* VBOX_WITH_VIDEOHWACCEL */
}
+ if (isMachineInValidMode())
+ {
+ gEDataManager->setScaleFactor(displayData.m_dScaleFactor, m_machine.GetId());
+#ifdef Q_WS_MAC
+ gEDataManager->setUseUnscaledHiDPIOutput(displayData.m_fUseUnscaledHiDPIOutput, m_machine.GetId());
+#endif /* Q_WS_MAC */
+ }
/* Check if Remote Display server still valid: */
CVRDEServer remoteDisplayServer = m_machine.GetVRDEServer();
@@ -315,7 +332,7 @@ bool UIMachineSettingsDisplay::validate(QList<UIValidationMessage> &messages)
/* Pass by default: */
bool fPass = true;
- /* Video tab: */
+ /* Screen tab: */
{
/* Prepare message: */
UIValidationMessage message;
@@ -367,7 +384,7 @@ bool UIMachineSettingsDisplay::validate(QList<UIValidationMessage> &messages)
{
message.second << tr("The virtual machine is set up to use hardware graphics acceleration "
"and the operating system hint is set to Windows Vista or later. "
- "For best performance you should set the machine's video memory to at least b>%1</b>.")
+ "For best performance you should set the machine's video memory to at least <b>%1</b>.")
.arg(vboxGlobal().formatSize(uNeedBytes, 0, FormatSize_RoundUp));
}
}
@@ -396,11 +413,12 @@ bool UIMachineSettingsDisplay::validate(QList<UIValidationMessage> &messages)
message.first = VBoxGlobal::removeAccelMark(m_pTabWidget->tabText(1));
#ifdef VBOX_WITH_EXTPACK
+ /* VRDE Extension Pack presence test: */
CExtPack extPack = vboxGlobal().virtualBox().GetExtensionPackManager().Find(GUI_ExtPackName);
if (m_pCheckboxRemoteDisplay->isChecked() && (extPack.isNull() || !extPack.GetUsable()))
{
message.second << tr("Remote Display is currently enabled for this virtual machine. "
- "However, this requires the <b>%1</b> to be installed. "
+ "However, this requires the <i>%1</i> to be installed. "
"Please install the Extension Pack from the VirtualBox download site as "
"otherwise your VM will be started with Remote Display disabled.")
.arg(GUI_ExtPackName);
@@ -432,13 +450,16 @@ bool UIMachineSettingsDisplay::validate(QList<UIValidationMessage> &messages)
void UIMachineSettingsDisplay::setOrderAfter(QWidget *pWidget)
{
- /* Video tab-order: */
+ /* Screen tab-order: */
setTabOrder(pWidget, m_pTabWidget->focusProxy());
setTabOrder(m_pTabWidget->focusProxy(), m_pSliderVideoMemorySize);
setTabOrder(m_pSliderVideoMemorySize, m_pEditorVideoMemorySize);
setTabOrder(m_pEditorVideoMemorySize, m_pSliderVideoScreenCount);
setTabOrder(m_pSliderVideoScreenCount, m_pEditorVideoScreenCount);
- setTabOrder(m_pEditorVideoScreenCount, m_pCheckbox3D);
+ setTabOrder(m_pEditorVideoScreenCount, m_pSliderGuestScreenScale);
+ setTabOrder(m_pSliderGuestScreenScale, m_pEditorGuestScreenScale);
+ setTabOrder(m_pEditorGuestScreenScale, m_pCheckBoxUnscaledHiDPIOutput);
+ setTabOrder(m_pCheckBoxUnscaledHiDPIOutput, m_pCheckbox3D);
#ifdef VBOX_WITH_VIDEOHWACCEL
setTabOrder(m_pCheckbox3D, m_pCheckbox2DVideo);
setTabOrder(m_pCheckbox2DVideo, m_pCheckboxRemoteDisplay);
@@ -469,7 +490,7 @@ void UIMachineSettingsDisplay::retranslateUi()
/* Translate uic generated strings: */
Ui::UIMachineSettingsDisplay::retranslateUi(this);
- /* Video stuff: */
+ /* Screen stuff: */
CSystemProperties sys = vboxGlobal().virtualBox().GetSystemProperties();
m_pLabelVideoMemorySizeMin->setText(tr("<qt>%1 MB</qt>").arg(m_iMinVRAM));
m_pLabelVideoMemorySizeMax->setText(tr("<qt>%1 MB</qt>").arg(m_iMaxVRAMVisible));
@@ -499,11 +520,37 @@ void UIMachineSettingsDisplay::polishPage()
/* Get system data from cache: */
const UIDataSettingsMachineDisplay &displayData = m_cache.base();
- /* Video tab: */
- m_pContainerVideo->setEnabled(isMachineOffline());
+ /* Screen tab: */
+ m_pLabelVideoMemorySize->setEnabled(isMachineOffline());
+ m_pSliderVideoMemorySize->setEnabled(isMachineOffline());
+ m_pLabelVideoMemorySizeMin->setEnabled(isMachineOffline());
+ m_pLabelVideoMemorySizeMax->setEnabled(isMachineOffline());
+ m_pEditorVideoMemorySize->setEnabled(isMachineOffline());
+ m_pLabelVideoMemoryUnit->setEnabled(isMachineOffline());
+ m_pLabelVideoScreenCount->setEnabled(isMachineOffline());
+ m_pSliderVideoScreenCount->setEnabled(isMachineOffline());
+ m_pLabelVideoScreenCountMin->setEnabled(isMachineOffline());
+ m_pLabelVideoScreenCountMax->setEnabled(isMachineOffline());
+ m_pEditorVideoScreenCount->setEnabled(isMachineOffline());
+ m_pLabelGuestScreenScale->setEnabled(isMachineInValidMode());
+ m_pSliderGuestScreenScale->setEnabled(isMachineInValidMode());
+ m_pLabelGuestScreenScaleMin->setEnabled(isMachineInValidMode());
+ m_pLabelGuestScreenScaleMax->setEnabled(isMachineInValidMode());
+ m_pEditorGuestScreenScale->setEnabled(isMachineInValidMode());
+#ifdef Q_WS_MAC
+ m_pLabelHiDPI->setEnabled(isMachineInValidMode());
+ m_pCheckBoxUnscaledHiDPIOutput->setEnabled(isMachineInValidMode());
+#else /* !Q_WS_MAC */
+ m_pLabelHiDPI->hide();
+ m_pCheckBoxUnscaledHiDPIOutput->hide();
+#endif /* !Q_WS_MAC */
+ m_pLabelVideoOptions->setEnabled(isMachineOffline());
+ m_pCheckbox3D->setEnabled(isMachineOffline());
#ifdef VBOX_WITH_VIDEOHWACCEL
- m_pCheckbox2DVideo->setEnabled(VBoxGlobal::isAcceleration2DVideoAvailable());
-#endif /* VBOX_WITH_VIDEOHWACCEL */
+ m_pCheckbox2DVideo->setEnabled(isMachineOffline() && VBoxGlobal::isAcceleration2DVideoAvailable());
+#else /* !VBOX_WITH_VIDEOHWACCEL */
+ m_pCheckbox2DVideo->hide();
+#endif /* !VBOX_WITH_VIDEOHWACCEL */
/* Remote Display tab: */
m_pTabWidget->setTabEnabled(1, displayData.m_fRemoteDisplayServerSupported);
@@ -573,6 +620,22 @@ void UIMachineSettingsDisplay::sltHandleVideoScreenCountEditorChange()
revalidate();
}
+void UIMachineSettingsDisplay::sltHandleGuestScreenScaleSliderChange()
+{
+ /* Apply proposed scale-factor: */
+ m_pEditorGuestScreenScale->blockSignals(true);
+ m_pEditorGuestScreenScale->setValue(m_pSliderGuestScreenScale->value());
+ m_pEditorGuestScreenScale->blockSignals(false);
+}
+
+void UIMachineSettingsDisplay::sltHandleGuestScreenScaleEditorChange()
+{
+ /* Apply proposed scale-factor: */
+ m_pSliderGuestScreenScale->blockSignals(true);
+ m_pSliderGuestScreenScale->setValue(m_pEditorGuestScreenScale->value());
+ m_pSliderGuestScreenScale->blockSignals(false);
+}
+
void UIMachineSettingsDisplay::sltHandleVideoCaptureCheckboxToggle()
{
/* Video Capture options should be enabled only if:
@@ -689,7 +752,7 @@ void UIMachineSettingsDisplay::prepare()
Ui::UIMachineSettingsDisplay::setupUi(this);
/* Prepare tabs: */
- prepareVideoTab();
+ prepareScreenTab();
prepareRemoteDisplayTab();
prepareVideoCaptureTab();
@@ -700,7 +763,7 @@ void UIMachineSettingsDisplay::prepare()
retranslateUi();
}
-void UIMachineSettingsDisplay::prepareVideoTab()
+void UIMachineSettingsDisplay::prepareScreenTab()
{
/* Prepare memory-size slider: */
CSystemProperties sys = vboxGlobal().virtualBox().GetSystemProperties();
@@ -742,10 +805,20 @@ void UIMachineSettingsDisplay::prepareVideoTab()
m_pEditorVideoScreenCount->setMaximum(cMaxGuestScreens);
connect(m_pEditorVideoScreenCount, SIGNAL(valueChanged(int)), this, SLOT(sltHandleVideoScreenCountEditorChange()));
-#ifndef VBOX_WITH_VIDEOHWACCEL
- /* Hide check-box if not supported: */
- m_pCheckbox2DVideo->setVisible(false);
-#endif /* VBOX_WITH_VIDEOHWACCEL */
+ /* Prepare scale-factor slider: */
+ m_pSliderGuestScreenScale->setMinimum(100);
+ m_pSliderGuestScreenScale->setMaximum(200);
+ m_pSliderGuestScreenScale->setPageStep(10);
+ m_pSliderGuestScreenScale->setSingleStep(1);
+ m_pSliderGuestScreenScale->setTickInterval(10);
+ m_pSliderGuestScreenScale->setSnappingEnabled(true);
+ connect(m_pSliderGuestScreenScale, SIGNAL(valueChanged(int)), this, SLOT(sltHandleGuestScreenScaleSliderChange()));
+
+ /* Prepare scale-factor editor: */
+ m_pEditorGuestScreenScale->setMinimum(100);
+ m_pEditorGuestScreenScale->setMaximum(200);
+ vboxGlobal().setMinimumWidthAccordingSymbolCount(m_pEditorGuestScreenScale, 5);
+ connect(m_pEditorGuestScreenScale, SIGNAL(valueChanged(int)), this, SLOT(sltHandleGuestScreenScaleEditorChange()));
}
void UIMachineSettingsDisplay::prepareRemoteDisplayTab()
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.h
index 5fb571d..8b3ccc3 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsDisplay.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsDisplay class declaration.
*/
@@ -34,6 +35,10 @@ struct UIDataSettingsMachineDisplay
UIDataSettingsMachineDisplay()
: m_iCurrentVRAM(0)
, m_cGuestScreenCount(0)
+ , m_dScaleFactor(1.0)
+#ifdef Q_WS_MAC
+ , m_fUseUnscaledHiDPIOutput(false)
+#endif /* Q_WS_MAC */
, m_f3dAccelerationEnabled(false)
#ifdef VBOX_WITH_VIDEOHWACCEL
, m_f2dAccelerationEnabled(false)
@@ -58,6 +63,10 @@ struct UIDataSettingsMachineDisplay
{
return (m_iCurrentVRAM == other.m_iCurrentVRAM) &&
(m_cGuestScreenCount == other.m_cGuestScreenCount) &&
+ (m_dScaleFactor == other.m_dScaleFactor) &&
+#ifdef Q_WS_MAC
+ (m_fUseUnscaledHiDPIOutput == other.m_fUseUnscaledHiDPIOutput) &&
+#endif /* Q_WS_MAC */
(m_f3dAccelerationEnabled == other.m_f3dAccelerationEnabled) &&
#ifdef VBOX_WITH_VIDEOHWACCEL
(m_f2dAccelerationEnabled == other.m_f2dAccelerationEnabled) &&
@@ -84,6 +93,10 @@ struct UIDataSettingsMachineDisplay
/* Variables: Video stuff: */
int m_iCurrentVRAM;
int m_cGuestScreenCount;
+ double m_dScaleFactor;
+#ifdef Q_WS_MAC
+ bool m_fUseUnscaledHiDPIOutput;
+#endif /* Q_WS_MAC */
bool m_f3dAccelerationEnabled;
#ifdef VBOX_WITH_VIDEOHWACCEL
bool m_f2dAccelerationEnabled;
@@ -159,11 +172,13 @@ protected:
private slots:
- /* Handlers: Video stuff: */
+ /* Handlers: Screen stuff: */
void sltHandleVideoMemorySizeSliderChange();
void sltHandleVideoMemorySizeEditorChange();
void sltHandleVideoScreenCountSliderChange();
void sltHandleVideoScreenCountEditorChange();
+ void sltHandleGuestScreenScaleSliderChange();
+ void sltHandleGuestScreenScaleEditorChange();
/* Handlers: Video Capture stuff: */
void sltHandleVideoCaptureCheckboxToggle();
@@ -179,8 +194,8 @@ private:
/** Prepare routine. */
void prepare();
- /** Prepare routine: Video tab. */
- void prepareVideoTab();
+ /** Prepare routine: Screen tab. */
+ void prepareScreenTab();
/** Prepare routine: Remote Display tab. */
void prepareRemoteDisplayTab();
/** Prepare routine: Video Capture tab. */
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.ui b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.ui
index 08898e3..2f6af32 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.ui
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsDisplay.ui
@@ -27,7 +27,7 @@
<widget class="QITabWidget" name="m_pTabWidget">
<widget class="QWidget" name="m_pTabVideo">
<attribute name="title">
- <string>&Video</string>
+ <string>&Screen</string>
</attribute>
<layout class="QVBoxLayout" name="m_pLayoutTabVideo">
<item>
@@ -153,16 +153,106 @@
</widget>
</item>
<item row="4" column="0">
+ <widget class="QLabel" name="m_pLabelGuestScreenScale">
+ <property name="text">
+ <string>Scale Factor:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" rowspan="2">
+ <layout class="QGridLayout" name="m_pLayoutGuestScreenScaleSlider">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0" colspan="3">
+ <widget class="QIAdvancedSlider" name="m_pSliderGuestScreenScale">
+ <property name="whatsThis">
+ <string>Controls the guest screen scale factor.</string>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="m_pLabelGuestScreenScaleMin">
+ <property name="text">
+ <string>100%</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <spacer name="m_pSpacerGuestScreenScale">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="m_pLabelGuestScreenScaleMax">
+ <property name="text">
+ <string>200%</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="4" column="2">
+ <widget class="QSpinBox" name="m_pEditorGuestScreenScale">
+ <property name="whatsThis">
+ <string>Controls the guest screen scale factor.</string>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="m_pLabelHiDPI">
+ <property name="text">
+ <string>HiDPI:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1" colspan="2">
+ <widget class="QCheckBox" name="m_pCheckBoxUnscaledHiDPIOutput">
+ <property name="sizePolicy">
+ <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="whatsThis">
+ <string>When checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</string>
+ </property>
+ <property name="text">
+ <string>Use &Unscaled HiDPI Output</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
<widget class="QLabel" name="m_pLabelVideoOptions">
<property name="text">
- <string>Extended Features:</string>
+ <string>Acceleration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
- <item row="4" column="1" colspan="2">
+ <item row="7" column="1" colspan="2">
<widget class="QCheckBox" name="m_pCheckbox3D">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
@@ -178,7 +268,7 @@
</property>
</widget>
</item>
- <item row="5" column="1" colspan="2">
+ <item row="8" column="1" colspan="2">
<widget class="QCheckBox" name="m_pCheckbox2DVideo">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp
index a700102..3fd42d3 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp
@@ -24,11 +24,14 @@
/* GUI includes: */
# include "QIWidgetValidator.h"
# include "UIMachineSettingsGeneral.h"
- #include "UIModalWindowManager.h"
+# include "UIModalWindowManager.h"
+# include "UIProgressDialog.h"
# include "UIMessageCenter.h"
# include "UIConverter.h"
/* COM includes: */
# include "CMedium.h"
+# include "CExtPack.h"
+# include "CExtPackManager.h"
# include "CMediumAttachment.h"
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
@@ -327,25 +330,25 @@ void UIMachineSettingsGeneral::saveFromCacheTo(QVariant &data)
QString strOldPasswordId = encryptedMedium.key(medium.GetId());
QString strOldPassword = encryptionPasswords.value(strOldPasswordId);
-// printf(" Medium: %s, old password = %s, new cipher = %s, new password = %s, new password id = %s\n",
-// medium.GetId().toAscii().constData(),
-// strOldPassword.toAscii().constData(),
-// strNewCipher.toAscii().constData(),
-// strNewPassword.toAscii().constData(),
-// strNewPasswordId.toAscii().constData());
-
/* Update encryption: */
- CProgress progress = medium.ChangeEncryption(strOldPassword,
- strNewCipher,
- strNewPassword,
- strNewPasswordId);
-// if (!medium.isOk())
-// printf(" Medium API Error, rc = %s\n", msgCenter().formatRC(medium.lastRC()).toAscii().constData());
- progress.WaitForCompletion(-1);
-// if (!progress.isOk())
-// printf(" Progress API Error, rc = %s\n", msgCenter().formatRC(progress.lastRC()).toAscii().constData());
-// if (progress.GetResultCode() != 0)
-// printf(" Progress Processing Error, rc = %s\n", msgCenter().formatRC(progress.GetResultCode()).toAscii().constData());
+ CProgress cprogress = medium.ChangeEncryption(strOldPassword,
+ strNewCipher,
+ strNewPassword,
+ strNewPasswordId);
+ if (!medium.isOk())
+ {
+ QMetaObject::invokeMethod(this, "sigOperationProgressError", Qt::BlockingQueuedConnection,
+ Q_ARG(QString, UIMessageCenter::formatErrorInfo(medium)));
+ continue;
+ }
+ UIProgress uiprogress(cprogress);
+ connect(&uiprogress, SIGNAL(sigProgressChange(ulong, QString, ulong, ulong)),
+ this, SIGNAL(sigOperationProgressChange(ulong, QString, ulong, ulong)),
+ Qt::QueuedConnection);
+ connect(&uiprogress, SIGNAL(sigProgressError(QString)),
+ this, SIGNAL(sigOperationProgressError(QString)),
+ Qt::BlockingQueuedConnection);
+ uiprogress.run(350);
}
}
}
@@ -396,6 +399,19 @@ bool UIMachineSettingsGeneral::validate(QList<UIValidationMessage> &messages)
AssertPtrReturn(m_pCheckBoxEncryption, false);
if (m_pCheckBoxEncryption->isChecked())
{
+#ifdef VBOX_WITH_EXTPACK
+ /* Encryption Extension Pack presence test: */
+ const CExtPack extPack = vboxGlobal().virtualBox().GetExtensionPackManager().Find(GUI_ExtPackName);
+ if (extPack.isNull() || !extPack.GetUsable())
+ {
+ message.second << tr("You are trying to encrypt this virtual machine. "
+ "However, this requires the <i>%1</i> to be installed. "
+ "Please install the Extension Pack from the VirtualBox download site.")
+ .arg(GUI_ExtPackName);
+ fPass = false;
+ }
+#endif /* VBOX_WITH_EXTPACK */
+
/* Cipher should be chosen if once changed: */
AssertPtrReturn(m_pComboCipher, false);
if (!m_cache.base().m_fEncryptionEnabled ||
@@ -403,7 +419,9 @@ bool UIMachineSettingsGeneral::validate(QList<UIValidationMessage> &messages)
{
if (m_pComboCipher->currentIndex() == 0)
message.second << tr("Encryption cipher type not specified.");
+ fPass = false;
}
+
/* Password should be entered and confirmed if once changed: */
AssertPtrReturn(m_pEditorEncryptionPassword, false);
AssertPtrReturn(m_pEditorEncryptionPasswordConfirm, false);
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.h
index 6990bb9..5bbe53f 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsGeneral.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsGeneral class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.cpp
index f0e849a..8a9c8b5 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.cpp
@@ -23,11 +23,9 @@
# include "UIMachineSettingsInterface.h"
# include "UIExtraDataManager.h"
# include "UIActionPool.h"
-# include "VBoxGlobal.h"
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
-
UIMachineSettingsInterface::UIMachineSettingsInterface(const QString strMachineID)
: m_strMachineID(strMachineID)
, m_pActionPool(0)
@@ -56,10 +54,7 @@ void UIMachineSettingsInterface::loadToCacheFrom(QVariant &data)
UIDataSettingsMachineInterface interfaceData;
/* Cache interface data: */
- interfaceData.m_dScaleFactor = gEDataManager->scaleFactor(m_machine.GetId());
-#ifdef Q_WS_MAC
- interfaceData.m_fUseUnscaledHiDPIOutput = gEDataManager->useUnscaledHiDPIOutput(m_machine.GetId());
-#else /* !Q_WS_MAC */
+#ifndef Q_WS_MAC
interfaceData.m_fShowMiniToolBar = gEDataManager->miniToolbarEnabled(m_machine.GetId());
interfaceData.m_fMiniToolBarAtTop = gEDataManager->miniToolbarAlignment(m_machine.GetId()) == Qt::AlignTop;
#endif /* !Q_WS_MAC */
@@ -79,13 +74,12 @@ void UIMachineSettingsInterface::getFromCache()
const UIDataSettingsMachineInterface &interfaceData = m_cache.base();
/* Prepare interface data: */
- m_pEditorGuestScreenScale->setValue(interfaceData.m_dScaleFactor * 100);
-#ifdef Q_WS_MAC
- m_pCheckBoxUnscaledHiDPIOutput->setChecked(interfaceData.m_fUseUnscaledHiDPIOutput);
-#else /* !Q_WS_MAC */
+#ifndef Q_WS_MAC
m_pCheckBoxShowMiniToolBar->setChecked(interfaceData.m_fShowMiniToolBar);
m_pComboToolBarAlignment->setChecked(interfaceData.m_fMiniToolBarAtTop);
-#endif /* !Q_WS_MAC */
+#else /* Q_WS_MAC */
+ Q_UNUSED(interfaceData);
+#endif /* Q_WS_MAC */
/* Polish page finally: */
polishPage();
@@ -102,10 +96,7 @@ void UIMachineSettingsInterface::putToCache()
UIDataSettingsMachineInterface interfaceData = m_cache.base();
/* Gather interface data from page: */
- interfaceData.m_dScaleFactor = (double)m_pEditorGuestScreenScale->value() / 100;
-#ifdef Q_WS_MAC
- interfaceData.m_fUseUnscaledHiDPIOutput = m_pCheckBoxUnscaledHiDPIOutput->isChecked();
-#else /* !Q_WS_MAC */
+#ifndef Q_WS_MAC
interfaceData.m_fShowMiniToolBar = m_pCheckBoxShowMiniToolBar->isChecked();
interfaceData.m_fMiniToolBarAtTop = m_pComboToolBarAlignment->isChecked();
#endif /* !Q_WS_MAC */
@@ -130,13 +121,12 @@ void UIMachineSettingsInterface::saveFromCacheTo(QVariant &data)
/* Store interface data: */
if (isMachineInValidMode())
{
- gEDataManager->setScaleFactor(interfaceData.m_dScaleFactor, m_machine.GetId());
-#ifdef Q_WS_MAC
- gEDataManager->setUseUnscaledHiDPIOutput(interfaceData.m_fUseUnscaledHiDPIOutput, m_machine.GetId());
-#else /* !Q_WS_MAC */
+#ifndef Q_WS_MAC
gEDataManager->setMiniToolbarEnabled(interfaceData.m_fShowMiniToolBar, m_machine.GetId());
gEDataManager->setMiniToolbarAlignment(interfaceData.m_fMiniToolBarAtTop ? Qt::AlignTop : Qt::AlignBottom, m_machine.GetId());
-#endif /* !Q_WS_MAC */
+#else /* Q_WS_MAC */
+ Q_UNUSED(interfaceData);
+#endif /* Q_WS_MAC */
}
}
@@ -147,10 +137,7 @@ void UIMachineSettingsInterface::saveFromCacheTo(QVariant &data)
void UIMachineSettingsInterface::setOrderAfter(QWidget *pWidget)
{
/* Tab-order: */
- setTabOrder(pWidget, m_pSliderGuestScreenScale);
- setTabOrder(m_pSliderGuestScreenScale, m_pEditorGuestScreenScale);
- setTabOrder(m_pEditorGuestScreenScale, m_pCheckBoxUnscaledHiDPIOutput);
- setTabOrder(m_pCheckBoxUnscaledHiDPIOutput, m_pCheckBoxShowMiniToolBar);
+ setTabOrder(pWidget, m_pCheckBoxShowMiniToolBar);
setTabOrder(m_pCheckBoxShowMiniToolBar, m_pComboToolBarAlignment);
}
@@ -164,20 +151,11 @@ void UIMachineSettingsInterface::polishPage()
{
/* Polish interface availability: */
m_pMenuBarEditor->setEnabled(isMachineInValidMode());
- m_pLabelGuestScreenScale->setEnabled(isMachineInValidMode());
- m_pSliderGuestScreenScale->setEnabled(isMachineInValidMode());
- m_pLabelGuestScreenScaleMin->setEnabled(isMachineInValidMode());
- m_pLabelGuestScreenScaleMax->setEnabled(isMachineInValidMode());
- m_pEditorGuestScreenScale->setEnabled(isMachineInValidMode());
#ifdef Q_WS_MAC
- m_pLabelHiDPI->setEnabled(isMachineInValidMode());
- m_pCheckBoxUnscaledHiDPIOutput->setEnabled(isMachineInValidMode());
m_pLabelMiniToolBar->hide();
m_pCheckBoxShowMiniToolBar->hide();
m_pComboToolBarAlignment->hide();
#else /* !Q_WS_MAC */
- m_pLabelHiDPI->hide();
- m_pCheckBoxUnscaledHiDPIOutput->hide();
m_pLabelMiniToolBar->setEnabled(isMachineInValidMode());
m_pCheckBoxShowMiniToolBar->setEnabled(isMachineInValidMode());
m_pComboToolBarAlignment->setEnabled(isMachineInValidMode() && m_pCheckBoxShowMiniToolBar->isChecked());
@@ -185,22 +163,6 @@ void UIMachineSettingsInterface::polishPage()
m_pStatusBarEditor->setEnabled(isMachineInValidMode());
}
-void UIMachineSettingsInterface::sltHandleGuestScreenScaleSliderChange()
-{
- /* Apply proposed scale-factor: */
- m_pEditorGuestScreenScale->blockSignals(true);
- m_pEditorGuestScreenScale->setValue(m_pSliderGuestScreenScale->value());
- m_pEditorGuestScreenScale->blockSignals(false);
-}
-
-void UIMachineSettingsInterface::sltHandleGuestScreenScaleEditorChange()
-{
- /* Apply proposed scale-factor: */
- m_pSliderGuestScreenScale->blockSignals(true);
- m_pSliderGuestScreenScale->setValue(m_pEditorGuestScreenScale->value());
- m_pSliderGuestScreenScale->blockSignals(false);
-}
-
void UIMachineSettingsInterface::prepare()
{
/* Apply UI decorations: */
@@ -214,21 +176,6 @@ void UIMachineSettingsInterface::prepare()
m_pMenuBarEditor->setMachineID(m_strMachineID);
m_pStatusBarEditor->setMachineID(m_strMachineID);
- /* Prepare scale-factor slider: */
- m_pSliderGuestScreenScale->setMinimum(100);
- m_pSliderGuestScreenScale->setMaximum(200);
- m_pSliderGuestScreenScale->setPageStep(10);
- m_pSliderGuestScreenScale->setSingleStep(1);
- m_pSliderGuestScreenScale->setTickInterval(10);
- m_pSliderGuestScreenScale->setSnappingEnabled(true);
- connect(m_pSliderGuestScreenScale, SIGNAL(valueChanged(int)), this, SLOT(sltHandleGuestScreenScaleSliderChange()));
-
- /* Prepare scale-factor editor: */
- m_pEditorGuestScreenScale->setMinimum(100);
- m_pEditorGuestScreenScale->setMaximum(200);
- vboxGlobal().setMinimumWidthAccordingSymbolCount(m_pEditorGuestScreenScale, 5);
- connect(m_pEditorGuestScreenScale, SIGNAL(valueChanged(int)), this, SLOT(sltHandleGuestScreenScaleEditorChange()));
-
/* Translate finally: */
retranslateUi();
}
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.h
index b6921a6..ba86576 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsInterface.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsInterface class declaration.
*/
@@ -29,11 +30,8 @@ struct UIDataSettingsMachineInterface
{
/* Constructor: */
UIDataSettingsMachineInterface()
- : m_dScaleFactor(1.0)
-#ifdef Q_WS_MAC
- , m_fUseUnscaledHiDPIOutput(false)
-#else /* !Q_WS_MAC */
- , m_fShowMiniToolBar(false)
+#ifndef Q_WS_MAC
+ : m_fShowMiniToolBar(false)
, m_fMiniToolBarAtTop(false)
#endif /* !Q_WS_MAC */
{}
@@ -41,14 +39,13 @@ struct UIDataSettingsMachineInterface
/* Functions: */
bool equal(const UIDataSettingsMachineInterface &other) const
{
- return (m_dScaleFactor == other.m_dScaleFactor)
-#ifdef Q_WS_MAC
- && (m_fUseUnscaledHiDPIOutput == other.m_fUseUnscaledHiDPIOutput)
-#else /* !Q_WS_MAC */
- && (m_fShowMiniToolBar == other.m_fShowMiniToolBar)
- && (m_fMiniToolBarAtTop == other.m_fMiniToolBarAtTop)
-#endif /* !Q_WS_MAC */
- ;
+#ifndef Q_WS_MAC
+ return (m_fShowMiniToolBar == other.m_fShowMiniToolBar) &&
+ (m_fMiniToolBarAtTop == other.m_fMiniToolBarAtTop);
+#else /* Q_WS_MAC */
+ Q_UNUSED(other);
+ return true;
+#endif /* Q_WS_MAC */
}
/* Operators: */
@@ -56,10 +53,7 @@ struct UIDataSettingsMachineInterface
bool operator!=(const UIDataSettingsMachineInterface &other) const { return !equal(other); }
/* Variables: */
- double m_dScaleFactor;
-#ifdef Q_WS_MAC
- bool m_fUseUnscaledHiDPIOutput;
-#else /* !Q_WS_MAC */
+#ifndef Q_WS_MAC
bool m_fShowMiniToolBar;
bool m_fMiniToolBarAtTop;
#endif /* !Q_WS_MAC */
@@ -107,12 +101,6 @@ protected:
/* Helper: Polishing stuff: */
void polishPage();
-private slots:
-
- /* Handlers: Guest-screen scale-factor stuff: */
- void sltHandleGuestScreenScaleSliderChange();
- void sltHandleGuestScreenScaleEditorChange();
-
private:
/** Prepare routine. */
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.ui b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.ui
index 12c0212..93c4c73 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.ui
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsInterface.ui
@@ -37,96 +37,6 @@
</widget>
</item>
<item row="1" column="0">
- <widget class="QLabel" name="m_pLabelGuestScreenScale">
- <property name="text">
- <string>Screen Scale Factor:</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="1" rowspan="2">
- <layout class="QGridLayout" name="m_pLayoutGuestScreenScaleSlider">
- <property name="spacing">
- <number>0</number>
- </property>
- <item row="0" column="0" colspan="3">
- <widget class="QIAdvancedSlider" name="m_pSliderGuestScreenScale">
- <property name="whatsThis">
- <string>This setting determines the guest screen scale factor.</string>
- </property>
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="m_pLabelGuestScreenScaleMin">
- <property name="text">
- <string>100%</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <spacer name="m_pSpacerGuestScreenScale">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>0</width>
- <height>0</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="1" column="2">
- <widget class="QLabel" name="m_pLabelGuestScreenScaleMax">
- <property name="text">
- <string>200%</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="2">
- <widget class="QSpinBox" name="m_pEditorGuestScreenScale">
- <property name="whatsThis">
- <string>This setting determines the guest screen scale factor.</string>
- </property>
- <property name="suffix">
- <string>%</string>
- </property>
- </widget>
- </item>
- <item row="3" column="0">
- <widget class="QLabel" name="m_pLabelHiDPI">
- <property name="text">
- <string>HiDPI:</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="3" column="1" colspan="2">
- <widget class="QCheckBox" name="m_pCheckBoxUnscaledHiDPIOutput">
- <property name="sizePolicy">
- <sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="whatsThis">
- <string>If checked, guest screen contents will not be scaled up to compensate for high host screen resolutions.</string>
- </property>
- <property name="text">
- <string>Use &Unscaled HiDPI Output</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
<widget class="QLabel" name="m_pLabelMiniToolBar">
<property name="text">
<string>Mini ToolBar:</string>
@@ -136,7 +46,7 @@
</property>
</widget>
</item>
- <item row="4" column="1" colspan="2">
+ <item row="1" column="1" colspan="2">
<widget class="QCheckBox" name="m_pCheckBoxShowMiniToolBar">
<property name="sizePolicy">
<sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding">
@@ -155,7 +65,7 @@
</property>
</widget>
</item>
- <item row="5" column="1" colspan="2">
+ <item row="2" column="1" colspan="2">
<widget class="QCheckBox" name="m_pComboToolBarAlignment">
<property name="sizePolicy">
<sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding">
@@ -174,7 +84,7 @@
</property>
</widget>
</item>
- <item row="6" column="0" colspan="3">
+ <item row="3" column="0" colspan="3">
<spacer name="m_pSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -187,7 +97,7 @@
</property>
</spacer>
</item>
- <item row="7" column="0" colspan="3">
+ <item row="4" column="0" colspan="3">
<widget class="UIStatusBarEditorWidget" name="m_pStatusBarEditor">
<property name="sizePolicy">
<sizepolicy vsizetype="Fixed" hsizetype="MinimumExpanding">
@@ -204,11 +114,6 @@
</widget>
<customwidgets>
<customwidget>
- <class>QIAdvancedSlider</class>
- <extends>QSlider</extends>
- <header>QIAdvancedSlider.h</header>
- </customwidget>
- <customwidget>
<class>UIMenuBarEditorWidget</class>
<extends>QWidget</extends>
<header>UIMenuBarEditorWindow.h</header>
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h
index 5b7cdaf..5065877 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsNetwork.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsNetwork.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsNetwork class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.h
index d0f4c15..e1b2045 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsParallel.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsParallel.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsParallel class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsPortForwardingDlg.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsPortForwardingDlg.h
index 637c8d6..eb5ee0f 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsPortForwardingDlg.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsPortForwardingDlg.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsPortForwardingDlg.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsPortForwardingDlg class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSF.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSF.h
index 42efd1b..439117a 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSF.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSF.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsSF.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsSF class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSFDetails.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSFDetails.h
index 602fc16..80c1ef0 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSFDetails.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSFDetails.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsSFDetails.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsSFDetails class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp
index 6f4c901..e69579f 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.cpp
@@ -114,7 +114,7 @@ void UIMachineSettingsSerial::fetchPortData(const UICacheSettingsMachineSerialPo
mLeIRQ->setText(QString::number(portData.m_uIRQ));
mLeIOPort->setText("0x" + QString::number(portData.m_uIOBase, 16).toUpper());
mCbMode->setCurrentIndex(mCbMode->findText(gpConverter->toString(portData.m_hostMode)));
- mCbPipe->setChecked(portData.m_fServer);
+ mCbPipe->setChecked(!portData.m_fServer);
mLePath->setText(portData.m_strPath);
/* Ensure everything is up-to-date */
@@ -130,7 +130,7 @@ void UIMachineSettingsSerial::uploadPortData(UICacheSettingsMachineSerialPort &p
portData.m_fPortEnabled = mGbSerial->isChecked();
portData.m_uIRQ = mLeIRQ->text().toULong(NULL, 0);
portData.m_uIOBase = mLeIOPort->text().toULong (NULL, 0);
- portData.m_fServer = mCbPipe->isChecked();
+ portData.m_fServer = !mCbPipe->isChecked();
portData.m_hostMode = gpConverter->fromString<KPortMode>(mCbMode->currentText());
portData.m_strPath = QDir::toNativeSeparators(mLePath->text());
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.h
index 58f320d..51c7ee9 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsSerial.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsSerial class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.ui b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.ui
index 6db1c3c..f86baac 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.ui
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSerial.ui
@@ -173,10 +173,10 @@
</property>
</spacer>
</item>
- <item row="2" column="1" colspan="2" >
+ <item row="2" column="1" colspan="5" >
<widget class="QCheckBox" name="mCbPipe" >
<property name="whatsThis" >
- <string>If checked, the pipe or socket specified in the <b>Port Path</b> field will be created by the virtual machine when it starts. Otherwise, the virtual machine will assume that the pipe or socket exists and try to use it.</string>
+ <string>If checked, the virtual machine will assume that the pipe or socket specified in the <b>Path/Address</b> field exists and try to use it. Otherwise, the pipe or socket will be created by the virtual machine when it starts.</string>
</property>
<property name="text" >
<string>&Connect to existing pipe/socket</string>
@@ -199,12 +199,7 @@
<item row="3" column="1" colspan="6" >
<widget class="QLineEdit" name="mLePath" >
<property name="whatsThis" >
- <string>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host, examples:
-"\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.
-In <b>Host Device</b> mode: Holds the host serial device name; examples: "COM1" or "/dev/ttyS0".
-In <b>Raw file</b> mode: file-path on the host system, where serial output will be dumped.
-In <b>TCP</b> mode: Holds TCP "port" when in server mode, or "hostname:port" or when in client mode.
-</string>
+ <string><p>In <b>Host Pipe</b> mode: Holds the path to the serial port's pipe on the host. Examples: "\\.\pipe\myvbox" or "/tmp/myvbox", for Windows and UNIX-like systems respectively.</p><p>In <b>Host Device</b> mode: Holds the host serial device name. Examples: "COM1" or "/dev/ttyS0".</p><p>In <b>Raw File</b> mode: Holds the file-path on the host system, where the serial output will be dumped.</p><p>In <b>TCP</b> mode: Holds the TCP [...]
</property>
</widget>
</item>
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
index 783a79b..9ee694e 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.cpp
@@ -865,6 +865,11 @@ QString AttachmentItem::attUsage() const
return mAttUsage;
}
+QString AttachmentItem::attEncryptionPasswordID() const
+{
+ return m_strAttEncryptionPasswordID;
+}
+
void AttachmentItem::cache()
{
UIMedium medium = vboxGlobal().medium(mAttMediumId);
@@ -879,6 +884,7 @@ void AttachmentItem::cache()
mAttSize = medium.size (true);
mAttLogicalSize = medium.logicalSize (true);
mAttLocation = medium.location (true);
+ m_strAttEncryptionPasswordID = QString("--");
if (medium.isNull())
{
mAttFormat = QString("--");
@@ -891,6 +897,9 @@ void AttachmentItem::cache()
{
mAttFormat = QString("%1 (%2)").arg(medium.hardDiskType(true)).arg(medium.hardDiskFormat(true));
mAttDetails = medium.storageDetails();
+ const QString strAttEncryptionPasswordID = medium.encryptionPasswordID();
+ if (!strAttEncryptionPasswordID.isNull())
+ m_strAttEncryptionPasswordID = strAttEncryptionPasswordID;
break;
}
case KDeviceType_DVD:
@@ -1376,6 +1385,13 @@ QVariant StorageModel::data (const QModelIndex &aIndex, int aRole) const
return static_cast <AttachmentItem*> (item)->attUsage();
return QString();
}
+ case R_AttEncryptionPasswordID:
+ {
+ if (AbstractItem *pItem = static_cast<AbstractItem*>(aIndex.internalPointer()))
+ if (pItem->rtti() == AbstractItem::Type_AttachmentItem)
+ return static_cast<AttachmentItem*>(pItem)->attEncryptionPasswordID();
+ return QString();
+ }
case R_Margin:
{
return 4;
@@ -2021,6 +2037,7 @@ UIMachineSettingsStorage::UIMachineSettingsStorage()
mLbHDDetailsValue->setFullSizeSelection (true);
mLbLocationValue->setFullSizeSelection (true);
mLbUsageValue->setFullSizeSelection (true);
+ m_pLabelEncryptionValue->setFullSizeSelection(true);
/* Setup connections: */
connect(&vboxGlobal(), SIGNAL(sigMediumEnumerated(const QString&)),
@@ -2780,6 +2797,7 @@ void UIMachineSettingsStorage::getInformation()
mLbHDDetailsValue->setText (compressText (mStorageModel->data (index, StorageModel::R_AttDetails).toString()));
mLbLocationValue->setText (compressText (mStorageModel->data (index, StorageModel::R_AttLocation).toString()));
mLbUsageValue->setText (compressText (mStorageModel->data (index, StorageModel::R_AttUsage).toString()));
+ m_pLabelEncryptionValue->setText(compressText(mStorageModel->data(index, StorageModel::R_AttEncryptionPasswordID).toString()));
/* Showing Attachment Page */
mSwRightPane->setCurrentIndex (2);
@@ -3380,6 +3398,9 @@ void UIMachineSettingsStorage::updateAdditionalObjects (KDeviceType aType)
mLbHDDetails->setVisible (aType == KDeviceType_HardDisk);
mLbHDDetailsValue->setVisible (aType == KDeviceType_HardDisk);
+
+ m_pLabelEncryption->setVisible(aType == KDeviceType_HardDisk);
+ m_pLabelEncryptionValue->setVisible(aType == KDeviceType_HardDisk);
}
QString UIMachineSettingsStorage::generateUniqueName (const QString &aTemplate) const
@@ -3964,6 +3985,8 @@ void UIMachineSettingsStorage::polishPage()
mLbLocationValue->setEnabled(isMachineInValidMode());
mLbUsage->setEnabled(isMachineInValidMode());
mLbUsageValue->setEnabled(isMachineInValidMode());
+ m_pLabelEncryption->setEnabled(isMachineInValidMode());
+ m_pLabelEncryptionValue->setEnabled(isMachineInValidMode());
/* Update action states: */
updateActionsState();
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
index 890f201..7e5f9f3 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsStorage.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsStorage class declaration.
*/
@@ -372,6 +373,7 @@ public:
QString attFormat() const;
QString attDetails() const;
QString attUsage() const;
+ QString attEncryptionPasswordID() const;
private:
@@ -409,6 +411,7 @@ private:
QString mAttFormat;
QString mAttDetails;
QString mAttUsage;
+ QString m_strAttEncryptionPasswordID;
};
/* Storage Model */
@@ -463,6 +466,7 @@ public:
R_AttFormat,
R_AttDetails,
R_AttUsage,
+ R_AttEncryptionPasswordID,
R_Margin,
R_Spacing,
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.ui b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.ui
index 5a1cb2e..306cb6a 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.ui
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsStorage.ui
@@ -570,7 +570,27 @@
</property>
</widget>
</item>
- <item row="12" column="0" colspan="3" >
+ <item row="12" column="1">
+ <widget class="QLabel" name="m_pLabelEncryption">
+ <property name="text">
+ <string>Encrypted with key:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="2">
+ <widget class="QILabel" name="m_pLabelEncryptionValue">
+ <property name="sizePolicy">
+ <sizepolicy vsizetype="Preferred" hsizetype="Ignored">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="13" column="0" colspan="3" >
<spacer name="mSp6" >
<property name="orientation" >
<enum>Qt::Vertical</enum>
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.h
index eebffbc..9598893 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsSystem.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsSystem.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsSystem class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp
index 5756801..c6d2c74 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp
@@ -500,7 +500,7 @@ bool UIMachineSettingsUSB::validate(QList<UIValidationMessage> &messages)
bool fPass = true;
#ifdef VBOX_WITH_EXTPACK
- /* USB 2.0 Extension Pack presence test: */
+ /* USB 2.0/3.0 Extension Pack presence test: */
CExtPack extPack = vboxGlobal().virtualBox().GetExtensionPackManager().Find(GUI_ExtPackName);
if ( mGbUSB->isChecked()
&& (mRbUSB2->isChecked() || mRbUSB3->isChecked())
@@ -508,10 +508,10 @@ bool UIMachineSettingsUSB::validate(QList<UIValidationMessage> &messages)
{
/* Prepare message: */
UIValidationMessage message;
- message.second << tr("USB 2.0 is currently enabled for this virtual machine. "
- "However, this requires the <b>%1</b> to be installed. "
+ message.second << tr("USB 2.0/3.0 is currently enabled for this virtual machine. "
+ "However, this requires the <i>%1</i> to be installed. "
"Please install the Extension Pack from the VirtualBox download site "
- "or disable USB 2.0 to be able to start the machine.")
+ "or disable USB 2.0/3.0 to be able to start the machine.")
.arg(GUI_ExtPackName);
/* Serialize message: */
if (!message.second.isEmpty())
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.h
index 10cfd01..b8c7c9c 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsUSB.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsUSB class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSBFilterDetails.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSBFilterDetails.h
index bb81a16..0e7743e 100644
--- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSBFilterDetails.h
+++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSBFilterDetails.h
@@ -1,3 +1,4 @@
+/* $Id: UIMachineSettingsUSBFilterDetails.h $ */
/** @file
* VBox Qt GUI - UIMachineSettingsUSBFilterDetails class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.h
index d43a3ff..133552c 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceEditorWidget.h
@@ -1,3 +1,4 @@
+/* $Id: UIApplianceEditorWidget.h $ */
/** @file
* VBox Qt GUI - UIApplianceEditorWidget class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceExportEditorWidget.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceExportEditorWidget.h
index ac5d026..2ac0173 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceExportEditorWidget.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceExportEditorWidget.h
@@ -1,3 +1,4 @@
+/* $Id: UIApplianceExportEditorWidget.h $ */
/** @file
* VBox Qt GUI - UIApplianceExportEditorWidget class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceImportEditorWidget.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceImportEditorWidget.h
index 90fc636..5c5070e 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceImportEditorWidget.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIApplianceImportEditorWidget.h
@@ -1,3 +1,4 @@
+/* $Id: UIApplianceImportEditorWidget.h $ */
/** @file
* VBox Qt GUI - UIApplianceImportEditorWidget class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIBar.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIBar.h
index b5fdf9c..259fd70 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIBar.h
@@ -1,3 +1,4 @@
+/* $Id: UIBar.h $ */
/** @file
* VBox Qt GUI - UIBar class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIBootTable.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIBootTable.h
index b0098dc..0a113ab 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIBootTable.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIBootTable.h
@@ -1,3 +1,4 @@
+/* $Id: UIBootTable.h $ */
/** @file
* VBox Qt GUI - UIBootTable class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.cpp
old mode 100755
new mode 100644
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.h
index 5ed29af..ecbb623 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIFilmContainer.h
@@ -1,3 +1,4 @@
+/* $Id: UIFilmContainer.h $ */
/** @file
* VBox Qt GUI - UIFilmContainer class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.h
index 473ce9a..465cc43 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHostComboEditor.h
@@ -1,3 +1,4 @@
+/* $Id: UIHostComboEditor.h $ */
/** @file
* VBox Qt GUI - VirtualBox Qt extensions: UIHostComboEditor class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h
index 592bca0..d16230e 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h
@@ -1,3 +1,4 @@
+/* $Id: UIHotKeyEditor.h $ */
/** @file
* VBox Qt GUI - VirtualBox Qt extensions: UIHotKeyEditor class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.h b/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.h
index f068536..cfe2c36 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UILineTextEdit.h
@@ -1,3 +1,4 @@
+/* $Id: UILineTextEdit.h $ */
/** @file
* VBox Qt GUI - UILineTextEdit class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIMenuBar.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIMenuBar.h
index b646b80..f2ab95b 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIMenuBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIMenuBar.h
@@ -1,3 +1,4 @@
+/* $Id: UIMenuBar.h $ */
/** @file
* VBox Qt GUI - UIMenuBar class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIMiniToolBar.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIMiniToolBar.h
index 5467ae4..6e1e885 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIMiniToolBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIMiniToolBar.h
@@ -1,3 +1,4 @@
+/* $Id: UIMiniToolBar.h $ */
/** @file
* VBox Qt GUI - UIMiniToolBar class declaration (fullscreen/seamless).
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.h b/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.h
index fd64a33..02127d8 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UINameAndSystemEditor.h
@@ -1,3 +1,4 @@
+/* $Id: UINameAndSystemEditor.h $ */
/** @file
* VBox Qt GUI - UINameAndSystemEditor class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupBox.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupBox.h
index 84e0a8f..00285d4 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupBox.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupBox.h
@@ -1,3 +1,4 @@
+/* $Id: UIPopupBox.h $ */
/** @file
* VBox Qt GUI - UIPopupBox/UIPopupBoxGroup classes declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPane.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPane.h
index 6fdb5aa..a431f7e 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPane.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPane.h
@@ -1,3 +1,4 @@
+/* $Id: UIPopupPane.h $ */
/** @file
* VBox Qt GUI - UIPopupPane class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPaneButtonPane.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPaneButtonPane.h
index eefad67..2ca5859 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPaneButtonPane.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPaneButtonPane.h
@@ -1,3 +1,4 @@
+/* $Id: UIPopupPaneButtonPane.h $ */
/** @file
* VBox Qt GUI - UIPopupPaneButtonPane class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPaneTextPane.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPaneTextPane.h
index b41c448..61810c9 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPaneTextPane.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupPaneTextPane.h
@@ -1,3 +1,4 @@
+/* $Id: UIPopupPaneTextPane.h $ */
/** @file
* VBox Qt GUI - UIPopupPaneTextPane class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupStack.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupStack.h
index 5484a74..49e985f 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupStack.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupStack.h
@@ -1,3 +1,4 @@
+/* $Id: UIPopupStack.h $ */
/** @file
* VBox Qt GUI - UIPopupStack class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupStackViewport.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupStackViewport.h
index d5ea39e..c5d0ba4 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupStackViewport.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIPopupStackViewport.h
@@ -1,3 +1,4 @@
+/* $Id: UIPopupStackViewport.h $ */
/** @file
* VBox Qt GUI - UIPopupStackViewport class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.h
index ba1b637..e04606c 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIPortForwardingTable.h
@@ -1,3 +1,4 @@
+/* $Id: UIPortForwardingTable.h $ */
/** @file
* VBox Qt GUI - UIPortForwardingTable class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp
index 8060e8c..1b721a8 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp
@@ -29,11 +29,12 @@
/* GUI includes: */
# include "UIProgressDialog.h"
+# include "UIMessageCenter.h"
+# include "UISpecialControls.h"
+# include "UIModalWindowManager.h"
# include "QIDialogButtonBox.h"
# include "QILabel.h"
-# include "UISpecialControls.h"
# include "VBoxGlobal.h"
-# include "UIModalWindowManager.h"
# ifdef Q_WS_MAC
# include "VBoxUtils-darwin.h"
# endif /* Q_WS_MAC */
@@ -131,6 +132,14 @@ UIProgressDialog::UIProgressDialog(CProgress &progress,
QTimer::singleShot(cMinDuration, this, SLOT(show()));
}
+UIProgressDialog::~UIProgressDialog()
+{
+ /* Wait for CProgress to complete: */
+ m_progress.WaitForCompletion(-1);
+ /* Call the timer event handling delegate: */
+ handleTimerEvent();
+}
+
void UIProgressDialog::retranslateUi()
{
m_strCancel = tr("Canceling...");
@@ -200,7 +209,27 @@ void UIProgressDialog::reject()
sltCancelOperation();
}
-void UIProgressDialog::timerEvent(QTimerEvent* /* pEvent */)
+void UIProgressDialog::timerEvent(QTimerEvent*)
+{
+ /* Call the timer event handling delegate: */
+ handleTimerEvent();
+}
+
+void UIProgressDialog::closeEvent(QCloseEvent *pEvent)
+{
+ if (m_fCancelEnabled)
+ sltCancelOperation();
+ else
+ pEvent->ignore();
+}
+
+void UIProgressDialog::sltCancelOperation()
+{
+ m_pCancelBtn->setEnabled(false);
+ m_progress.Cancel();
+}
+
+void UIProgressDialog::handleTimerEvent()
{
/* We should hide progress-dialog
* if it was already finalized but not yet closed.
@@ -313,17 +342,77 @@ void UIProgressDialog::timerEvent(QTimerEvent* /* pEvent */)
m_pEtaLbl->setText(m_strCancel);
}
-void UIProgressDialog::closeEvent(QCloseEvent *pEvent)
+
+UIProgress::UIProgress(CProgress &progress, QObject *pParent /* = 0 */)
+ : QObject(pParent)
+ , m_progress(progress)
+ , m_cOperations(m_progress.GetOperationCount())
+ , m_fEnded(false)
{
- if (m_fCancelEnabled)
- sltCancelOperation();
- else
- pEvent->ignore();
}
-void UIProgressDialog::sltCancelOperation()
+void UIProgress::run(int iRefreshInterval)
{
- m_pCancelBtn->setEnabled(false);
- m_progress.Cancel();
+ /* Make sure the CProgress still valid: */
+ if (!m_progress.isOk())
+ return;
+
+ /* Start the refresh timer: */
+ int id = startTimer(iRefreshInterval);
+
+ /* Create a local event-loop: */
+ {
+ QEventLoop eventLoop;
+ m_pEventLoop = &eventLoop;
+
+ /* Guard ourself for the case
+ * we destroyed ourself in our event-loop: */
+ QPointer<UIProgress> guard = this;
+
+ /* Start the blocking event-loop: */
+ eventLoop.exec();
+
+ /* Are we still valid? */
+ if (guard.isNull())
+ return;
+
+ m_pEventLoop = 0;
+ }
+
+ /* Kill the refresh timer: */
+ killTimer(id);
+}
+
+void UIProgress::timerEvent(QTimerEvent*)
+{
+ /* Make sure the UIProgress still 'running': */
+ if (m_fEnded)
+ return;
+
+ /* If progress had failed or finished: */
+ if (!m_progress.isOk() || m_progress.GetCompleted())
+ {
+ /* Notify listeners about the operation progress error: */
+ if (!m_progress.isOk() || m_progress.GetResultCode() != 0)
+ emit sigProgressError(UIMessageCenter::formatErrorInfo(m_progress));
+
+ /* Exit from the event-loop if there is any: */
+ if (m_pEventLoop)
+ m_pEventLoop->exit();
+
+ /* Mark UIProgress as 'ended': */
+ m_fEnded = true;
+
+ /* Return early: */
+ return;
+ }
+
+ /* If CProgress was not yet canceled: */
+ if (!m_progress.GetCanceled())
+ {
+ /* Notify listeners about the operation progress update: */
+ emit sigProgressChange(m_cOperations, m_progress.GetOperationDescription(),
+ m_progress.GetOperation() + 1, m_progress.GetPercent());
+ }
}
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.h
index 3809518..68e4664 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.h
@@ -1,3 +1,4 @@
+/* $Id: UIProgressDialog.h $ */
/** @file
* VBox Qt GUI - UIProgressDialog class declaration.
*/
@@ -47,9 +48,11 @@ class UIProgressDialog: public QIWithRetranslateUI2<QIDialog>
public:
- /* Constructor/destructor: */
+ /** Constructor. */
UIProgressDialog(CProgress &progress, const QString &strTitle,
QPixmap *pImage = 0, int cMinDuration = 2000, QWidget *pParent = 0);
+ /** Destructor. */
+ ~UIProgressDialog();
/* API: Run stuff: */
int run(int aRefreshInterval);
@@ -78,6 +81,9 @@ private slots:
private:
+ /** Timer event handling delegate. */
+ void handleTimerEvent();
+
/* Variables: */
CProgress &m_progress;
QLabel *m_pImageLbl;
@@ -94,5 +100,56 @@ private:
static const char *m_spcszOpDescTpl;
};
+/** QObject reimplementation allowing to effectively track the CProgress object completion
+ * (w/o using CProgress::waitForCompletion() and w/o blocking the calling thread in any other way for too long).
+ * @note The CProgress instance is passed as a non-const reference to the constructor
+ * (to memorize COM errors if they happen), and therefore must not be destroyed
+ * before the created UIProgress instance is destroyed.
+ * @todo To be moved to separate files. */
+class UIProgress : public QObject
+{
+ Q_OBJECT;
+
+signals:
+
+ /** Notifies listeners about wrapped CProgress change.
+ * @param iOperations holds the number of operations CProgress have,
+ * @param strOperation holds the description of the current CProgress operation,
+ * @param iOperation holds the index of the current CProgress operation,
+ * @param iPercent holds the percentage of the current CProgress operation. */
+ void sigProgressChange(ulong iOperations, QString strOperation,
+ ulong iOperation, ulong iPercent);
+
+ /** Notifies listeners about particular COM error.
+ * @param strErrorInfo holds the details of the error happened. */
+ void sigProgressError(QString strErrorInfo);
+
+public:
+
+ /** Constructor passing @a pParent to the base-class.
+ * @param progress holds the CProgress to be wrapped. */
+ UIProgress(CProgress &progress, QObject *pParent = 0);
+
+ /** Starts the UIProgress by entering the personal event-loop.
+ * @param iRefreshInterval holds the refresh interval to check
+ * for the CProgress updates with. */
+ void run(int iRefreshInterval);
+
+private:
+
+ /** Timer @a pEvent reimplementation. */
+ virtual void timerEvent(QTimerEvent *pEvent);
+
+ /** Holds the wrapped CProgress reference. */
+ CProgress &m_progress;
+ /** Holds the number of operations wrapped CProgress have. */
+ const ulong m_cOperations;
+ /** Holds whether the UIProgress ended. */
+ bool m_fEnded;
+
+ /** Holds the personal event-loop. */
+ QPointer<QEventLoop> m_pEventLoop;
+};
+
#endif /* __UIProgressDialog_h__ */
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UISpacerWidgets.h b/src/VBox/Frontends/VirtualBox/src/widgets/UISpacerWidgets.h
index b879b3d..93783d5 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UISpacerWidgets.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UISpacerWidgets.h
@@ -1,3 +1,4 @@
+/* $Id: UISpacerWidgets.h $ */
/** @file
* VBox Qt GUI - UISpacerWidgets declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UISpecialControls.h b/src/VBox/Frontends/VirtualBox/src/widgets/UISpecialControls.h
index 0f89b6e..ba08842 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UISpecialControls.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UISpecialControls.h
@@ -1,3 +1,4 @@
+/* $Id: UISpecialControls.h $ */
/** @file
* VBox Qt GUI - VBoxSpecialButtons declarations.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIToolBar.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIToolBar.h
index 98f6d24..3a5078e 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIToolBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIToolBar.h
@@ -1,3 +1,4 @@
+/* $Id: UIToolBar.h $ */
/** @file
* VBox Qt GUI - UIToolBar class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIWarningPane.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIWarningPane.h
index 9f785b1..eb4370d 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/UIWarningPane.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIWarningPane.h
@@ -1,3 +1,4 @@
+/* $Id: UIWarningPane.h $ */
/** @file
* VBox Qt GUI - UIWarningPane class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.h b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.h
index 9aa05ca..23ad0e0 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxFilePathSelectorWidget.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxFilePathSelectorWidget.h $ */
/** @file
* VBox Qt GUI - VirtualBox Qt extensions: VBoxFilePathSelectorWidget class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxGuestRAMSlider.h b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxGuestRAMSlider.h
index d0ab782..8b8a3c0 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxGuestRAMSlider.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxGuestRAMSlider.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxGuestRAMSlider.h $ */
/** @file
* VBox Qt GUI - VBoxGuestRAMSlider class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.h b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.h
index ff5b117..5ab973e 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxMediaComboBox.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxMediaComboBox.h $ */
/** @file
* VBox Qt GUI - VBoxMediaComboBox class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxOSTypeSelectorButton.h b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxOSTypeSelectorButton.h
index 5557bf4..9a6e4db 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxOSTypeSelectorButton.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxOSTypeSelectorButton.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxOSTypeSelectorButton.h $ */
/** @file
* VBox Qt GUI - VBoxOSTypeSelectorButton class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.h b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.h
index d1b7ca0..c689a80 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsButton.h
@@ -1,3 +1,4 @@
+/* $Id: UIGraphicsButton.h $ */
/** @file
* VBox Qt GUI - UIGraphicsButton class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.h b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.h
index a4e9740..38f6ec0 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsRotatorButton.h
@@ -1,3 +1,4 @@
+/* $Id: UIGraphicsRotatorButton.h $ */
/** @file
* VBox Qt GUI - UIGraphicsRotatorButton class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsTextPane.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsTextPane.cpp
index f560d8f..2311485 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsTextPane.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsTextPane.cpp
@@ -1,10 +1,10 @@
/* $Id: UIGraphicsTextPane.cpp $ */
/** @file
- * VBox Qt GUI - UIGraphicsTextPane and UITask class implementation.
+ * VBox Qt GUI - UIGraphicsTextPane class implementation.
*/
/*
- * Copyright (C) 2012-2014 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -20,19 +20,18 @@
#else /* !VBOX_WITH_PRECOMPILED_HEADERS */
/* Qt includes: */
-# include <QApplication>
# include <QPainter>
+# include <QTextLayout>
+# include <QApplication>
+# include <QFontMetrics>
+# include <QGraphicsSceneHoverEvent>
/* GUI includes: */
# include "UIGraphicsTextPane.h"
+# include "UIRichTextString.h"
#endif /* !VBOX_WITH_PRECOMPILED_HEADERS */
-#include <QFontMetrics>
-#include <QGraphicsSceneHoverEvent>
-#include <QTextLayout>
-
-
UIGraphicsTextPane::UIGraphicsTextPane(QIGraphicsWidget *pParent, QPaintDevice *pPaintDevice)
: QIGraphicsWidget(pParent)
, m_pPaintDevice(pPaintDevice)
@@ -361,49 +360,15 @@ QTextLayout* UIGraphicsTextPane::buildTextLayout(const QFont &font, QPaintDevice
/* Prepare variables: */
QFontMetrics fm(font, pPaintDevice);
int iLeading = fm.leading();
- QString strModifiedText(strText);
- QList<QTextLayout::FormatRange> formatRangeList;
- /* Handle bold sub-strings: */
- QRegExp boldRegExp("<b>([\\s\\S]+)</b>");
- boldRegExp.setMinimal(true);
- while (boldRegExp.indexIn(strModifiedText) != -1)
- {
- /* Prepare format: */
- QTextLayout::FormatRange formatRange;
- QFont font = formatRange.format.font();
- font.setBold(true);
- formatRange.format.setFont(font);
- formatRange.start = boldRegExp.pos(0);
- formatRange.length = boldRegExp.cap(1).size();
- /* Add format range to list: */
- formatRangeList << formatRange;
- /* Replace sub-string: */
- strModifiedText.replace(boldRegExp.cap(0), boldRegExp.cap(1));
- }
-
- /* Handle anchored sub-strings: */
- QRegExp anchoredRegExp("<a href=([^>]+)>([^<>]+)</a>");
- anchoredRegExp.setMinimal(true);
- while (anchoredRegExp.indexIn(strModifiedText) != -1)
- {
- /* Prepare format: */
- QTextLayout::FormatRange formatRange;
- formatRange.format.setAnchor(true);
- formatRange.format.setAnchorHref(anchoredRegExp.cap(1));
- if (formatRange.format.anchorHref() == strHoveredAnchor)
- formatRange.format.setForeground(qApp->palette().color(QPalette::Link));
- formatRange.start = anchoredRegExp.pos(0);
- formatRange.length = anchoredRegExp.cap(2).size();
- /* Add format range to list: */
- formatRangeList << formatRange;
- /* Replace sub-string: */
- strModifiedText.replace(anchoredRegExp.cap(0), anchoredRegExp.cap(2));
- }
+ /* Parse incoming string with UIRichTextString capabilities: */
+ //printf("Text: {%s}\n", strText.toAscii().constData());
+ UIRichTextString ms(strText);
+ ms.setHoveredAnchor(strHoveredAnchor);
/* Create layout; */
- QTextLayout *pTextLayout = new QTextLayout(strModifiedText, font, pPaintDevice);
- pTextLayout->setAdditionalFormats(formatRangeList);
+ QTextLayout *pTextLayout = new QTextLayout(ms.toString(), font, pPaintDevice);
+ pTextLayout->setAdditionalFormats(ms.formatRanges());
/* Configure layout: */
QTextOption textOption;
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsTextPane.h b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsTextPane.h
index 2fbfc31..8c0b526 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsTextPane.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsTextPane.h
@@ -1,9 +1,10 @@
+/* $Id: UIGraphicsTextPane.h $ */
/** @file
* VBox Qt GUI - UIGraphicsTextPane class declaration.
*/
/*
- * Copyright (C) 2012-2014 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -129,3 +130,4 @@ private:
};
#endif /* !___UIGraphicsTextPane_h___ */
+
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsToolBar.h b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsToolBar.h
index c566bfe..a86f148 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsToolBar.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsToolBar.h
@@ -1,3 +1,4 @@
+/* $Id: UIGraphicsToolBar.h $ */
/** @file
* VBox Qt GUI - UIGraphicsToolBar class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsZoomButton.h b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsZoomButton.h
index 6c937ae..416651b 100644
--- a/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsZoomButton.h
+++ b/src/VBox/Frontends/VirtualBox/src/widgets/graphics/UIGraphicsZoomButton.h
@@ -1,3 +1,4 @@
+/* $Id: UIGraphicsZoomButton.h $ */
/** @file
* VBox Qt GUI - UIGraphicsZoomButton class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.h b/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.h
index 02f8d41..704e452 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/UIWizard.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizard.h $ */
/** @file
* VBox Qt GUI - UIWizard class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.h b/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.h
index ec7dbf6..73653ac 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/UIWizardPage.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardPage.h $ */
/** @file
* VBox Qt GUI - UIWizardPage class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.h
index 570a09b..5646500 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVD.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVD.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVD class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.h
index fa290fa..fae44c6 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic1.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVDPageBasic1.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVDPageBasic1 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.h
index 6d8724b..68a5cd0 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic2.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVDPageBasic2.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVDPageBasic2 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.h
index ccab55b..7e06b74 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic3.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVDPageBasic3.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVDPageBasic3 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.h
index c74b790..778629d 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageBasic4.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVDPageBasic4.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVDPageBasic4 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.h
index f5801a8..bd9f9e9 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevd/UIWizardCloneVDPageExpert.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVDPageExpert.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVDPageExpert class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.h
index 6a18fcd..6e7f367 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVM.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVM.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVM class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.h
index b1cc4b9..9c81aa6 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic1.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVMPageBasic1.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVMPageBasic1 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.h
index b0ba968..8fb0e92 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic2.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVMPageBasic2.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVMPageBasic2 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.h
index 86c3b33..3ff3296 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageBasic3.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVMPageBasic3.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVMPageBasic3 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.h b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.h
index b1c90ed..f13c122 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/clonevm/UIWizardCloneVMPageExpert.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardCloneVMPageExpert.h $ */
/** @file
* VBox Qt GUI - UIWizardCloneVMPageExpert class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp
index 71b18b5..5a9fec6 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.cpp
@@ -31,6 +31,7 @@
# include "UIWizardExportAppPageBasic3.h"
# include "UIWizardExportAppPageBasic4.h"
# include "UIWizardExportAppPageExpert.h"
+# include "UIAddDiskEncryptionPasswordDialog.h"
# include "UIMessageCenter.h"
/* COM includes: */
@@ -131,6 +132,59 @@ bool UIWizardExportApp::exportAppliance()
bool UIWizardExportApp::exportVMs(CAppliance &appliance)
{
+ /* Get the map of the password IDs: */
+ EncryptedMediumMap encryptedMediums;
+ foreach (const QString &strPasswordId, appliance.GetPasswordIds())
+ foreach (const QString &strMediumId, appliance.GetMediumIdsForPasswordId(strPasswordId))
+ encryptedMediums.insert(strPasswordId, strMediumId);
+
+ /* Ask for the disk encryption passwords if necessary: */
+ if (!encryptedMediums.isEmpty())
+ {
+ /* Create corresponding dialog: */
+ QPointer<UIAddDiskEncryptionPasswordDialog> pDlg =
+ new UIAddDiskEncryptionPasswordDialog(this,
+ window()->windowTitle(),
+ encryptedMediums);
+
+ /* Execute the dialog: */
+ if (pDlg->exec() == QDialog::Accepted)
+ {
+ /* Acquire the passwords provided: */
+ const EncryptionPasswordMap encryptionPasswords = pDlg->encryptionPasswords();
+
+ /* Delete the dialog: */
+ delete pDlg;
+
+ /* Make sure the passwords were really provided: */
+ AssertReturn(!encryptionPasswords.isEmpty(), false);
+
+ /* Provide appliance with passwords if possible: */
+ appliance.AddPasswords(encryptionPasswords.keys().toVector(),
+ encryptionPasswords.values().toVector());
+ if (!appliance.isOk())
+ {
+ /* Warn the user about failure: */
+ msgCenter().cannotAddDiskEncryptionPassword(appliance);
+
+ return false;
+ }
+ }
+ else
+ {
+ /* Any modal dialog can be destroyed in own event-loop
+ * as a part of application termination procedure..
+ * We have to check if the dialog still valid. */
+ if (pDlg)
+ {
+ /* Delete the dialog: */
+ delete pDlg;
+ }
+
+ return false;
+ }
+ }
+
/* Write the appliance: */
QVector<KExportOptions> options;
if (field("manifestSelected").toBool())
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h
index 83b92f0..eb3e677 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportApp.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardExportApp.h $ */
/** @file
* VBox Qt GUI - UIWizardExportApp class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppDefs.h b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppDefs.h
index 39c37f6..42b6996 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardExportAppDefs.h $ */
/** @file
* VBox Qt GUI - UIWizardExportAppDefs class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h
index 1736db9..6fc362c 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic1.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardExportAppPageBasic1.h $ */
/** @file
* VBox Qt GUI - UIWizardExportAppPageBasic1 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h
index 12b900a..29d9d04 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic2.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardExportAppPageBasic2.h $ */
/** @file
* VBox Qt GUI - UIWizardExportAppPageBasic2 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h
index 6aaf175..c2feb00 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic3.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardExportAppPageBasic3.h $ */
/** @file
* VBox Qt GUI - UIWizardExportAppPageBasic3 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.h b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.h
index a53b4b3..eada62f 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageBasic4.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardExportAppPageBasic4.h $ */
/** @file
* VBox Qt GUI - UIWizardExportAppPageBasic4 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp
index 6eefebb..06431aa 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.cpp
@@ -199,8 +199,8 @@ UIWizardExportAppPageExpert::UIWizardExportAppPageExpert(const QStringList &sele
void UIWizardExportAppPageExpert::sltVMSelectionChangeHandler()
{
/* Call to base-class: */
- refreshApplianceSettingsWidget();
refreshCurrentSettings();
+ refreshApplianceSettingsWidget();
/* Broadcast complete-change: */
emit completeChanged();
@@ -257,8 +257,8 @@ void UIWizardExportAppPageExpert::initializePage()
retranslateUi();
/* Call to base-class: */
- refreshApplianceSettingsWidget();
refreshCurrentSettings();
+ refreshApplianceSettingsWidget();
}
bool UIWizardExportAppPageExpert::isComplete() const
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h
index 0a0d954..96a9437 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/exportappliance/UIWizardExportAppPageExpert.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardExportAppPageExpert.h $ */
/** @file
* VBox Qt GUI - UIWizardExportAppPageExpert class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.h b/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.h
index 650b26c..d3d8896 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRun.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardFirstRun.h $ */
/** @file
* VBox Qt GUI - UIWizardFirstRun class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic.h b/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic.h
index 30b84cd..dd62cdd 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/firstrun/UIWizardFirstRunPageBasic.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardFirstRunPageBasic.h $ */
/** @file
* VBox Qt GUI - UIWizardFirstRunPageBasic class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.h b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.h
index 2744351..17ad76c 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportApp.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardImportApp.h $ */
/** @file
* VBox Qt GUI - UIWizardImportApp class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppDefs.h b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppDefs.h
index e9e4653..023cb01 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppDefs.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppDefs.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardImportAppDefs.h $ */
/** @file
* VBox Qt GUI - UIWizardImportAppDefs class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.h b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.h
index bf169fb..d88d2ef 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic1.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardImportAppPageBasic1.h $ */
/** @file
* VBox Qt GUI - UIWizardImportAppPageBasic1 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.h b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.h
index b84057b..450547e 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageBasic2.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardImportAppPageBasic2.h $ */
/** @file
* VBox Qt GUI - UIWizardImportAppPageBasic2 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.h b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.h
index 9477fcb..d5e34c0 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/importappliance/UIWizardImportAppPageExpert.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardImportAppPageExpert.h $ */
/** @file
* VBox Qt GUI - UIWizardImportAppPageExpert class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.h
index 25f5c43..85c5ec8 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVD.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVD.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVD class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.h
index a788be2..d59c72c 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic1.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVDPageBasic1.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVDPageBasic1 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.h
index a6cacda..2c74bfc 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic2.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVDPageBasic2.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVDPageBasic2 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.h
index 101673d..78c3342 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageBasic3.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVDPageBasic3.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVDPageBasic3 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.h
index b199e7e..94b7642 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvd/UIWizardNewVDPageExpert.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVDPageExpert.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVDPageExpert class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.h
index 0ff128a..729fa95 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVM.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVM.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVM class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp
index 8872355..84a68ac 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.cpp
@@ -107,12 +107,12 @@ static const osTypePattern gs_OSTypePattern[] =
{ QRegExp( "(mac.*10[.,]{0,1}7)|(os.*x.*10[.,]{0,1}7)|(mac.*ML)|(os.*x.*ML)|(Mount)", Qt::CaseInsensitive), "MacOS108_64" },
{ QRegExp( "(mac.*10[.,]{0,1}8)|(os.*x.*10[.,]{0,1}8)|(Lion)", Qt::CaseInsensitive), "MacOS107_64" },
{ QRegExp( "(mac.*10[.,]{0,1}9)|(os.*x.*10[.,]{0,1}9)|(mac.*mav)|(os.*x.*mav)|(Mavericks)", Qt::CaseInsensitive), "MacOS109_64" },
- { QRegExp("((Mac)|(Tig)|(Leop)|(os[ ]*x)).*64", Qt::CaseInsensitive), "MacOS_64" },
- { QRegExp("((Mac)|(Tig)|(Leop)|(os[ ]*x)).*32", Qt::CaseInsensitive), "MacOS" },
+ { QRegExp("((Mac)|(Tig)|(Leop)|(Yose)|(os[ ]*x)).*64", Qt::CaseInsensitive), "MacOS_64" },
+ { QRegExp("((Mac)|(Tig)|(Leop)|(Yose)|(os[ ]*x)).*32", Qt::CaseInsensitive), "MacOS" },
/* Code names for Linux distributions: */
- { QRegExp("((edgy)|(feisty)|(gutsy)|(hardy)|(intrepid)|(jaunty)|(karmic)|(lucid)|(maverick)|(natty)|(oneiric)|(precise)|(quantal)|(raring)|(saucy)|(trusty)).*64", Qt::CaseInsensitive), "Ubuntu_64" },
- { QRegExp("((edgy)|(feisty)|(gutsy)|(hardy)|(intrepid)|(jaunty)|(karmic)|(lucid)|(maverick)|(natty)|(oneiric)|(precise)|(quantal)|(raring)|(saucy)|(trusty)).*32", Qt::CaseInsensitive), "Ubuntu" },
+ { QRegExp("((edgy)|(feisty)|(gutsy)|(hardy)|(intrepid)|(jaunty)|(karmic)|(lucid)|(maverick)|(natty)|(oneiric)|(precise)|(quantal)|(raring)|(saucy)|(trusty)|(utopic)|(vivid)).*64", Qt::CaseInsensitive), "Ubuntu_64" },
+ { QRegExp("((edgy)|(feisty)|(gutsy)|(hardy)|(intrepid)|(jaunty)|(karmic)|(lucid)|(maverick)|(natty)|(oneiric)|(precise)|(quantal)|(raring)|(saucy)|(trusty)|(utopic)|(vivid)).*32", Qt::CaseInsensitive), "Ubuntu" },
{ QRegExp("((sarge)|(etch)|(lenny)|(squeeze)|(wheezy)|(jessie)|(sid)).*64", Qt::CaseInsensitive), "Debian_64" },
{ QRegExp("((sarge)|(etch)|(lenny)|(squeeze)|(wheezy)|(jessie)|(sid)).*32", Qt::CaseInsensitive), "Debian" },
{ QRegExp("((moonshine)|(werewolf)|(sulphur)|(cambridge)|(leonidas)|(constantine)|(goddard)|(laughlin)|(lovelock)|(verne)|(beefy)|(spherical)).*64", Qt::CaseInsensitive), "Fedora_64" },
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.h
index 92903b8..ad720b4 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic1.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVMPageBasic1.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVMPageBasic1 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.h
index eb9db2e..650319c 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic2.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVMPageBasic2.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVMPageBasic2 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.h
index 1aac5cb..419aa4c 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageBasic3.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVMPageBasic3.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVMPageBasic3 class declaration.
*/
diff --git a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.h b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.h
index a92163c..c45dd90 100644
--- a/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.h
+++ b/src/VBox/Frontends/VirtualBox/src/wizards/newvm/UIWizardNewVMPageExpert.h
@@ -1,3 +1,4 @@
+/* $Id: UIWizardNewVMPageExpert.h $ */
/** @file
* VBox Qt GUI - UIWizardNewVMPageExpert class declaration.
*/
diff --git a/src/VBox/GuestHost/DragAndDrop/DnDDir.cpp b/src/VBox/GuestHost/DragAndDrop/DnDDir.cpp
index e5bbd92..2238580 100644
--- a/src/VBox/GuestHost/DragAndDrop/DnDDir.cpp
+++ b/src/VBox/GuestHost/DragAndDrop/DnDDir.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2014 Oracle Corporation
+ * Copyright (C) 2014-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -26,14 +26,33 @@
#include <VBox/GuestHost/DragAndDrop.h>
-int DnDDirCreateDroppedFilesEx(const char *pszPath,
- char *pszDropDir, size_t cbDropDir)
+int DnDDirDroppedAddFile(PDNDDIRDROPPEDFILES pDir, const char *pszFile)
+{
+ AssertPtrReturn(pDir, VERR_INVALID_POINTER);
+ AssertPtrReturn(pszFile, VERR_INVALID_POINTER);
+
+ if (!pDir->lstFiles.contains(pszFile))
+ pDir->lstFiles.append(pszFile);
+ return VINF_SUCCESS;
+}
+
+int DnDDirDroppedAddDir(PDNDDIRDROPPEDFILES pDir, const char *pszDir)
+{
+ AssertPtrReturn(pDir, VERR_INVALID_POINTER);
+ AssertPtrReturn(pszDir, VERR_INVALID_POINTER);
+
+ if (!pDir->lstDirs.contains(pszDir))
+ pDir->lstDirs.append(pszDir);
+ return VINF_SUCCESS;
+}
+
+int DnDDirDroppedFilesCreateAndOpenEx(const char *pszPath, PDNDDIRDROPPEDFILES pDir)
{
AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
- AssertPtrReturn(pszDropDir, VERR_INVALID_POINTER);
- AssertReturn(cbDropDir, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pDir, VERR_INVALID_POINTER);
- if (RTStrPrintf(pszDropDir, cbDropDir, "%s", pszPath) <= 0)
+ char pszDropDir[RTPATH_MAX];
+ if (RTStrPrintf(pszDropDir, sizeof(pszDropDir), "%s", pszPath) <= 0)
return VERR_NO_MEMORY;
/** @todo On Windows we also could use the registry to override
@@ -41,7 +60,7 @@ int DnDDirCreateDroppedFilesEx(const char *pszPath,
* can be used. */
/* Append our base drop directory. */
- int rc = RTPathAppend(pszDropDir, cbDropDir, "VirtualBox Dropped Files");
+ int rc = RTPathAppend(pszDropDir, sizeof(pszDropDir), "VirtualBox Dropped Files"); /** @todo Make this tag configurable? */
if (RT_FAILURE(rc))
return rc;
@@ -63,28 +82,104 @@ int DnDDirCreateDroppedFilesEx(const char *pszPath,
if (RT_FAILURE(rc))
return rc;
- rc = RTPathAppend(pszDropDir, cbDropDir, pszTime);
+ rc = RTPathAppend(pszDropDir, sizeof(pszDropDir), pszTime);
if (RT_FAILURE(rc))
return rc;
/* Create it (only accessible by the current user) */
- return RTDirCreateUniqueNumbered(pszDropDir, cbDropDir, RTFS_UNIX_IRWXU, 3, '-');
+ rc = RTDirCreateUniqueNumbered(pszDropDir, sizeof(pszDropDir), RTFS_UNIX_IRWXU, 3, '-');
+ if (RT_SUCCESS(rc))
+ {
+ PRTDIR phDir;
+ rc = RTDirOpen(&phDir, pszDropDir);
+ if (RT_SUCCESS(rc))
+ {
+ pDir->hDir = phDir;
+ pDir->strPathAbs = pszDropDir;
+ }
+ }
+
+ return rc;
}
-int DnDDirCreateDroppedFiles(char *pszDropDir, size_t cbDropDir)
+int DnDDirDroppedFilesCreateAndOpenTemp(PDNDDIRDROPPEDFILES pDir)
{
- AssertPtrReturn(pszDropDir, VERR_INVALID_POINTER);
- AssertReturn(cbDropDir, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pDir, VERR_INVALID_POINTER);
char szTemp[RTPATH_MAX];
- /* Get the user's temp directory. Don't use the user's root directory (or
+ /*
+ * Get the user's temp directory. Don't use the user's root directory (or
* something inside it) because we don't know for how long/if the data will
- * be kept after the guest OS used it. */
+ * be kept after the guest OS used it.
+ */
int rc = RTPathTemp(szTemp, sizeof(szTemp));
if (RT_FAILURE(rc))
return rc;
- return DnDDirCreateDroppedFilesEx(szTemp, pszDropDir, cbDropDir);
+ return DnDDirDroppedFilesCreateAndOpenEx(szTemp, pDir);
+}
+
+int DnDDirDroppedFilesClose(PDNDDIRDROPPEDFILES pDir, bool fRemove)
+{
+ AssertPtrReturn(pDir, VERR_INVALID_POINTER);
+
+ int rc = RTDirClose(pDir->hDir);
+ if (RT_SUCCESS(rc))
+ {
+ pDir->lstDirs.clear();
+ pDir->lstFiles.clear();
+
+ if (fRemove)
+ {
+ /* Try removing the (empty) drop directory in any case. */
+ rc = RTDirRemove(pDir->strPathAbs.c_str());
+ if (RT_SUCCESS(rc)) /* Only clear if successfully removed. */
+ pDir->strPathAbs = "";
+ }
+ }
+
+ return rc;
+}
+
+const char *DnDDirDroppedFilesGetDirAbs(PDNDDIRDROPPEDFILES pDir)
+{
+ AssertPtrReturn(pDir, NULL);
+ return pDir->strPathAbs.c_str();
+}
+
+int DnDDirDroppedFilesRollback(PDNDDIRDROPPEDFILES pDir)
+{
+ AssertPtrReturn(pDir, VERR_INVALID_POINTER);
+
+ if (pDir->strPathAbs.isEmpty())
+ return VINF_SUCCESS;
+
+ int rc = VINF_SUCCESS;
+ int rc2;
+
+ /* Rollback by removing any stuff created.
+ * Note: Only remove empty directories, never ever delete
+ * anything recursive here! Steam (tm) knows best ... :-) */
+ for (size_t i = 0; i < pDir->lstFiles.size(); i++)
+ {
+ rc2 = RTFileDelete(pDir->lstFiles.at(i).c_str());
+ if (RT_SUCCESS(rc))
+ rc = rc2;
+ }
+
+ for (size_t i = 0; i < pDir->lstDirs.size(); i++)
+ {
+ rc2 = RTDirRemove(pDir->lstDirs.at(i).c_str());
+ if (RT_SUCCESS(rc))
+ rc = rc2;
+ }
+
+ /* Try to remove the empty root dropped files directory as well. */
+ rc2 = RTDirRemove(pDir->strPathAbs.c_str());
+ if (RT_SUCCESS(rc))
+ rc = rc2;
+
+ return rc;
}
diff --git a/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp b/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp
index c5eabc5..79544ca 100644
--- a/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp
+++ b/src/VBox/GuestHost/DragAndDrop/DnDURIList.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2014 Oracle Corporation
+ * Copyright (C) 2014-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -33,186 +33,9 @@
#include <VBox/GuestHost/DragAndDrop.h>
-DnDURIObject::DnDURIObject(Type type,
- const RTCString &strSrcPath,
- const RTCString &strDstPath,
- uint32_t fMode, uint64_t cbSize)
- : m_Type(type)
- , m_strSrcPath(strSrcPath)
- , m_strDstPath(strDstPath)
- , m_fMode(fMode)
- , m_cbSize(cbSize)
- , m_cbProcessed(0)
-{
- RT_ZERO(u);
-}
-
-DnDURIObject::~DnDURIObject(void)
-{
- closeInternal();
-}
-
-void DnDURIObject::closeInternal(void)
-{
- if (m_Type == File)
- {
- if (u.m_hFile)
- {
- RTFileClose(u.m_hFile);
- u.m_hFile = NULL;
- }
- }
-}
-
-bool DnDURIObject::IsComplete(void) const
-{
- bool fComplete = false;
-
- Assert(m_cbProcessed <= m_cbSize);
- if (m_cbProcessed == m_cbSize)
- fComplete = true;
-
- switch (m_Type)
- {
- case File:
- if (!fComplete)
- fComplete = !u.m_hFile;
- break;
-
- case Directory:
- fComplete = true;
- break;
-
- default:
- break;
- }
-
- return fComplete;
-}
-
-/* static */
-/** @todo Put this into an own class like DnDURIPath : public RTCString? */
-int DnDURIObject::RebaseURIPath(RTCString &strPath,
- const RTCString &strBaseOld,
- const RTCString &strBaseNew)
-{
- int rc;
- const char *pszPath = RTUriPath(strPath.c_str());
- if (pszPath)
- {
- const char *pszPathStart = pszPath;
- const char *pszBaseOld = strBaseOld.c_str();
- if ( pszBaseOld
- && RTPathStartsWith(pszPath, pszBaseOld))
- {
- pszPathStart += strlen(pszBaseOld);
- }
-
- rc = VINF_SUCCESS;
-
- if (RT_SUCCESS(rc))
- {
- char *pszPathNew = RTPathJoinA(strBaseNew.c_str(), pszPathStart);
- if (pszPathNew)
- {
- char *pszPathURI = RTUriCreate("file" /* pszScheme */, "/" /* pszAuthority */,
- pszPathNew /* pszPath */,
- NULL /* pszQuery */, NULL /* pszFragment */);
- if (pszPathURI)
- {
-#ifdef DEBUG_andy
- LogFlowFunc(("Rebasing \"%s\" to \"%s\"", strPath.c_str(), pszPathURI));
-#endif
- strPath = RTCString(pszPathURI) + "\r\n";
- RTStrFree(pszPathURI);
-
- rc = VINF_SUCCESS;
- }
- else
- rc = VERR_INVALID_PARAMETER;
-
- RTStrFree(pszPathNew);
- }
- else
- rc = VERR_NO_MEMORY;
- }
- }
- else
- rc = VERR_INVALID_PARAMETER;
-
-#ifdef DEBUG_andy
- LogFlowFuncLeaveRC(rc);
-#endif
- return rc;
-}
-
-int DnDURIObject::Read(void *pvBuf, uint32_t cbToRead, uint32_t *pcbRead)
-{
- AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
- AssertReturn(cbToRead, VERR_INVALID_PARAMETER);
- /* pcbRead is optional. */
-
- int rc;
- switch (m_Type)
- {
- case File:
- {
- if (!u.m_hFile)
- {
- /* Open files on the source with RTFILE_O_DENY_WRITE to prevent races
- * where the OS writes to the file while the destination side transfers
- * it over. */
- rc = RTFileOpen(&u.m_hFile, m_strSrcPath.c_str(),
- RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE);
- }
- else
- rc = VINF_SUCCESS;
-
- bool fDone = false;
- if (RT_SUCCESS(rc))
- {
- size_t cbRead;
- rc = RTFileRead(u.m_hFile, pvBuf, cbToRead, &cbRead);
- if (RT_SUCCESS(rc))
- {
- if (pcbRead)
- *pcbRead = (uint32_t)cbRead;
-
- m_cbProcessed += cbRead;
- Assert(m_cbProcessed <= m_cbSize);
-
- /* End of file reached or error occurred? */
- if ( m_cbProcessed == m_cbSize
- || RT_FAILURE(rc))
- {
- closeInternal();
- }
- }
- }
-
- break;
- }
-
- case Directory:
- {
- rc = VINF_SUCCESS;
- break;
- }
-
- default:
- rc = VERR_NOT_IMPLEMENTED;
- break;
- }
-
- LogFlowFunc(("Returning strSourcePath=%s, rc=%Rrc\n",
- m_strSrcPath.c_str(), rc));
- return rc;
-}
-
-/*** */
-
DnDURIList::DnDURIList(void)
- : m_cbTotal(0)
+ : m_cTotal(0)
+ , m_cbTotal(0)
{
}
@@ -255,18 +78,20 @@ int DnDURIList::appendPathRecursive(const char *pcszPath, size_t cbBaseLen,
: DnDURIObject::File,
pcszPath, &pcszPath[cbBaseLen],
objInfo.Attr.fMode, cbSize));
+ m_cTotal++;
m_cbTotal += cbSize;
#ifdef DEBUG_andy
- LogFlowFunc(("strSrcPath=%s, strDstPath=%s, fMode=0x%x, cbSize=%RU64, cbTotal=%zu\n",
- pcszPath, &pcszPath[cbBaseLen], objInfo.Attr.fMode, cbSize, m_cbTotal));
+ LogFlowFunc(("strSrcPath=%s, strDstPath=%s, fMode=0x%x, cbSize=%RU64, cTotal=%RU32, cbTotal=%zu\n",
+ pcszPath, &pcszPath[cbBaseLen], objInfo.Attr.fMode, cbSize, m_cTotal, m_cbTotal));
#endif
- PRTDIR hDir;
/* We have to try to open even symlinks, cause they could
* be symlinks to directories. */
+ PRTDIR hDir;
rc = RTDirOpen(&hDir, pcszPath);
+
/* The following error happens when this was a symlink
- * to an file or a regular file. */
+ * to a file or a regular file. */
if ( rc == VERR_PATH_NOT_FOUND
|| rc == VERR_NOT_A_DIRECTORY)
return VINF_SUCCESS;
@@ -325,14 +150,16 @@ int DnDURIList::appendPathRecursive(const char *pcszPath, size_t cbBaseLen,
m_lstTree.append(DnDURIObject(DnDURIObject::File,
pszNewFile, &pszNewFile[cbBaseLen],
objInfo1.Attr.fMode, cbSize));
+ m_cTotal++;
m_cbTotal += cbSize;
+#ifdef DEBUG_andy
+ LogFlowFunc(("strSrcPath=%s, strDstPath=%s, fMode=0x%x, cbSize=%RU64, cTotal=%RU32, cbTotal=%zu\n",
+ pszNewFile, &pszNewFile[cbBaseLen], objInfo1.Attr.fMode, cbSize, m_cTotal, m_cbTotal));
+#endif
}
else /* Handle symlink directories. */
rc = appendPathRecursive(pszNewFile, cbBaseLen, fFlags);
-#ifdef DEBUG_andy
- LogFlowFunc(("strSrcPath=%s, strDstPath=%s, fMode=0x%x, cbSize=%RU64, cbTotal=%zu\n",
- pszNewFile, &pszNewFile[cbBaseLen], objInfo1.Attr.fMode, cbSize, m_cbTotal));
-#endif
+
RTStrFree(pszNewFile);
}
else
@@ -341,6 +168,7 @@ int DnDURIList::appendPathRecursive(const char *pcszPath, size_t cbBaseLen,
}
default:
+ /* Just ignore the rest. */
break;
}
}
@@ -434,12 +262,12 @@ int DnDURIList::AppendURIPath(const char *pszURI, uint32_t fFlags)
: pszFileName - pszFilePath;
char *pszRoot = &pszFilePath[cbBase];
m_lstRoot.append(pszRoot);
+ m_cTotal++;
#ifdef DEBUG_andy
LogFlowFunc(("pszFilePath=%s, pszFileName=%s, pszRoot=%s\n",
pszFilePath, pszFileName, pszRoot));
#endif
- rc = appendPathRecursive(pszFilePath, cbBase,
- fFlags);
+ rc = appendPathRecursive(pszFilePath, cbBase, fFlags);
}
else
rc = VERR_NOT_FOUND;
@@ -495,6 +323,9 @@ void DnDURIList::Clear(void)
void DnDURIList::RemoveFirst(void)
{
+ if (m_lstTree.isEmpty())
+ return;
+
DnDURIObject &curPath = m_lstTree.first();
uint64_t cbSize = curPath.GetSize();
@@ -504,8 +335,7 @@ void DnDURIList::RemoveFirst(void)
m_lstTree.removeFirst();
}
-int DnDURIList::RootFromURIData(const void *pvData, size_t cbData,
- uint32_t fFlags)
+int DnDURIList::RootFromURIData(const void *pvData, size_t cbData, uint32_t fFlags)
{
AssertPtrReturn(pvData, VERR_INVALID_POINTER);
AssertReturn(cbData, VERR_INVALID_PARAMETER);
@@ -531,7 +361,10 @@ int DnDURIList::RootFromURIData(const void *pvData, size_t cbData,
{
rc = DnDPathSanitize(pszFilePath, strlen(pszFilePath));
if (RT_SUCCESS(rc))
+ {
m_lstRoot.append(pszFilePath);
+ m_cTotal++;
+ }
RTStrFree(pszFilePath);
}
@@ -545,7 +378,7 @@ int DnDURIList::RootFromURIData(const void *pvData, size_t cbData,
return rc;
}
-RTCString DnDURIList::RootToString(const RTCString &strBasePath /* = "" */,
+RTCString DnDURIList::RootToString(const RTCString &strPathBase /* = "" */,
const RTCString &strSeparator /* = "\r\n" */)
{
RTCString strRet;
@@ -555,18 +388,16 @@ RTCString DnDURIList::RootToString(const RTCString &strBasePath /* = "" */,
#ifdef DEBUG_andy
LogFlowFunc(("pszCurRoot=%s\n", pszCurRoot));
#endif
- if (strBasePath.isNotEmpty())
+ if (strPathBase.isNotEmpty())
{
- char *pszPath = RTPathJoinA(strBasePath.c_str(), pszCurRoot);
+ char *pszPath = RTPathJoinA(strPathBase.c_str(), pszCurRoot);
if (pszPath)
{
char *pszPathURI = RTUriFileCreate(pszPath);
if (pszPathURI)
{
strRet += RTCString(pszPathURI) + strSeparator;
-#ifdef DEBUG_andy
LogFlowFunc(("URI: %s\n", strRet.c_str()));
-#endif
RTStrFree(pszPathURI);
}
else
@@ -582,9 +413,7 @@ RTCString DnDURIList::RootToString(const RTCString &strBasePath /* = "" */,
if (pszPathURI)
{
strRet += RTCString(pszPathURI) + strSeparator;
-#ifdef DEBUG_andy
LogFlowFunc(("URI: %s\n", strRet.c_str()));
-#endif
RTStrFree(pszPathURI);
}
else
diff --git a/src/VBox/GuestHost/DragAndDrop/DnDURIObject.cpp b/src/VBox/GuestHost/DragAndDrop/DnDURIObject.cpp
new file mode 100644
index 0000000..f5bc2c8
--- /dev/null
+++ b/src/VBox/GuestHost/DragAndDrop/DnDURIObject.cpp
@@ -0,0 +1,402 @@
+/* $Id: DnDURIObject.cpp $ */
+/** @file
+ * DnD: URI object class. For handling creation/reading/writing to files and directories
+ * on host or guest side.
+ */
+
+/*
+ * Copyright (C) 2014-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+/******************************************************************************
+ * Header Files *
+ ******************************************************************************/
+
+#include <iprt/dir.h>
+#include <iprt/file.h>
+#include <iprt/fs.h>
+#include <iprt/path.h>
+#include <iprt/uri.h>
+
+#ifdef LOG_GROUP
+ #undef LOG_GROUP
+#endif
+#define LOG_GROUP LOG_GROUP_GUEST_DND
+#include <VBox/log.h>
+
+#include <VBox/GuestHost/DragAndDrop.h>
+
+DnDURIObject::DnDURIObject(void)
+ : m_Type(Unknown)
+ , m_fMode(0)
+ , m_cbSize(0)
+ , m_cbProcessed(0)
+{
+ RT_ZERO(u);
+}
+
+DnDURIObject::DnDURIObject(Type type,
+ const RTCString &strSrcPath /* = 0 */,
+ const RTCString &strDstPath /* = 0 */,
+ uint32_t fMode /* = 0 */, uint64_t cbSize /* = 0 */)
+ : m_Type(type)
+ , m_strSrcPath(strSrcPath)
+ , m_strTgtPath(strDstPath)
+ , m_fMode(fMode)
+ , m_cbSize(cbSize)
+ , m_cbProcessed(0)
+{
+ switch (m_Type)
+ {
+ case File:
+ u.m_hFile = NULL;
+ break;
+
+ case Directory:
+ break;
+
+ default:
+ break;
+ }
+}
+
+DnDURIObject::~DnDURIObject(void)
+{
+ closeInternal();
+}
+
+void DnDURIObject::closeInternal(void)
+{
+ if (m_Type == File)
+ {
+ if (u.m_hFile)
+ {
+ RTFileClose(u.m_hFile);
+ u.m_hFile = NULL;
+ }
+ }
+}
+
+void DnDURIObject::Close(void)
+{
+ switch (m_Type)
+ {
+ case File:
+ {
+ if (u.m_hFile != NULL)
+ {
+ int rc2 = RTFileClose(u.m_hFile);
+ AssertRC(rc2);
+
+ u.m_hFile = NULL;
+ }
+ break;
+ }
+
+ case Directory:
+ break;
+
+ default:
+ break;
+ }
+}
+
+bool DnDURIObject::IsComplete(void) const
+{
+ bool fComplete;
+
+ switch (m_Type)
+ {
+ case File:
+ Assert(m_cbProcessed <= m_cbSize);
+ fComplete = m_cbProcessed == m_cbSize;
+ break;
+
+ case Directory:
+ fComplete = true;
+ break;
+
+ default:
+ fComplete = true;
+ break;
+ }
+
+ return fComplete;
+}
+
+bool DnDURIObject::IsOpen(void) const
+{
+ bool fIsOpen;
+
+ switch (m_Type)
+ {
+ case File:
+ fIsOpen = u.m_hFile != NULL;
+ break;
+
+ case Directory:
+ fIsOpen = true;
+ break;
+
+ default:
+ fIsOpen = false;
+ break;
+ }
+
+ return fIsOpen;
+}
+
+int DnDURIObject::Open(Dest enmDest, uint64_t fOpen /* = 0 */, uint32_t fMode /* = 0 */)
+{
+ return OpenEx( enmDest == Source
+ ? m_strSrcPath : m_strTgtPath
+ , m_Type, enmDest, fOpen, fMode, 0 /* fFlags */);
+}
+
+int DnDURIObject::OpenEx(const RTCString &strPath, Type enmType, Dest enmDest,
+ uint64_t fOpen /* = 0 */, uint32_t fMode /* = 0 */, uint32_t fFlags /* = 0 */)
+{
+ int rc = VINF_SUCCESS;
+
+ switch (enmDest)
+ {
+ case Source:
+ m_strSrcPath = strPath;
+ break;
+
+ case Target:
+ m_strTgtPath = strPath;
+ break;
+
+ default:
+ rc = VERR_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if ( RT_SUCCESS(rc)
+ && fOpen) /* Opening mode specified? */
+ {
+ switch (enmType)
+ {
+ case File:
+ {
+ if (!u.m_hFile)
+ {
+ /* Open files on the source with RTFILE_O_DENY_WRITE to prevent races
+ * where the OS writes to the file while the destination side transfers
+ * it over. */
+ rc = RTFileOpen(&u.m_hFile, strPath.c_str(), fOpen);
+ LogFlowFunc(("strPath=%s, enmType=%ld, enmDest=%ld, rc=%Rrc\n", strPath.c_str(), enmType, enmDest, rc));
+ if (RT_SUCCESS(rc))
+ rc = RTFileGetSize(u.m_hFile, &m_cbSize);
+ if (RT_SUCCESS(rc)
+ && fMode)
+ {
+ rc = RTFileSetMode(u.m_hFile, fMode);
+ }
+ if (RT_SUCCESS(rc))
+ {
+ LogFlowFunc(("cbSize=%RU64, fMode=%RU32\n", m_cbSize, m_fMode));
+ m_cbProcessed = 0;
+ }
+ }
+ else
+ rc = VINF_SUCCESS;
+
+ break;
+ }
+
+ case Directory:
+ rc = VINF_SUCCESS;
+ break;
+
+ default:
+ rc = VERR_NOT_IMPLEMENTED;
+ break;
+ }
+ }
+
+ if (RT_SUCCESS(rc))
+ m_Type = enmType;
+
+ return rc;
+}
+
+/* static */
+/** @todo Put this into an own class like DnDURIPath : public RTCString? */
+int DnDURIObject::RebaseURIPath(RTCString &strPath,
+ const RTCString &strBaseOld /* = "" */,
+ const RTCString &strBaseNew /* = "" */)
+{
+ int rc;
+ const char *pszPath = RTUriPath(strPath.c_str());
+ if (!pszPath)
+ pszPath = strPath.c_str();
+ if (pszPath)
+ {
+ const char *pszPathStart = pszPath;
+ const char *pszBaseOld = strBaseOld.c_str();
+ if ( pszBaseOld
+ && RTPathStartsWith(pszPath, pszBaseOld))
+ {
+ pszPathStart += strlen(pszBaseOld);
+ }
+
+ rc = VINF_SUCCESS;
+
+ if (RT_SUCCESS(rc))
+ {
+ char *pszPathNew = RTPathJoinA(strBaseNew.c_str(), pszPathStart);
+ if (pszPathNew)
+ {
+ char *pszPathURI = RTUriCreate("file" /* pszScheme */, "/" /* pszAuthority */,
+ pszPathNew /* pszPath */,
+ NULL /* pszQuery */, NULL /* pszFragment */);
+ if (pszPathURI)
+ {
+ LogFlowFunc(("Rebasing \"%s\" to \"%s\"\n", strPath.c_str(), pszPathURI));
+
+ strPath = RTCString(pszPathURI) + "\r\n";
+ RTStrFree(pszPathURI);
+
+ rc = VINF_SUCCESS;
+ }
+ else
+ rc = VERR_INVALID_PARAMETER;
+
+ RTStrFree(pszPathNew);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ }
+ }
+ else
+ rc = VERR_INVALID_PARAMETER;
+
+ return rc;
+}
+
+int DnDURIObject::Read(void *pvBuf, size_t cbBuf, uint32_t *pcbRead)
+{
+ AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
+ AssertReturn(cbBuf, VERR_INVALID_PARAMETER);
+ /* pcbRead is optional. */
+
+ size_t cbRead = 0;
+
+ int rc;
+ switch (m_Type)
+ {
+ case File:
+ {
+ rc = OpenEx(m_strSrcPath, File, Source,
+ /* Use some sensible defaults. */
+ RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE, 0 /* fFlags */);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTFileRead(u.m_hFile, pvBuf, cbBuf, &cbRead);
+ if (RT_SUCCESS(rc))
+ {
+ m_cbProcessed += cbRead;
+ Assert(m_cbProcessed <= m_cbSize);
+
+ /* End of file reached or error occurred? */
+ if ( m_cbSize
+ && m_cbProcessed == m_cbSize)
+ {
+ rc = VINF_EOF;
+ }
+ }
+ }
+
+ break;
+ }
+
+ case Directory:
+ {
+ rc = VINF_SUCCESS;
+ break;
+ }
+
+ default:
+ rc = VERR_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ if (pcbRead)
+ *pcbRead = (uint32_t)cbRead;
+ }
+
+ LogFlowFunc(("Returning strSourcePath=%s, cbRead=%zu, rc=%Rrc\n", m_strSrcPath.c_str(), cbRead, rc));
+ return rc;
+}
+
+void DnDURIObject::Reset(void)
+{
+ Close();
+
+ m_Type = Unknown;
+ m_strSrcPath = "";
+ m_strTgtPath = "";
+ m_fMode = 0;
+ m_cbSize = 0;
+ m_cbProcessed = 0;
+}
+
+int DnDURIObject::Write(const void *pvBuf, size_t cbBuf, uint32_t *pcbWritten)
+{
+ AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
+ AssertReturn(cbBuf, VERR_INVALID_PARAMETER);
+ /* pcbWritten is optional. */
+
+ size_t cbWritten = 0;
+
+ int rc;
+ switch (m_Type)
+ {
+ case File:
+ {
+ rc = OpenEx(m_strTgtPath, File, Target,
+ /* Use some sensible defaults. */
+ RTFILE_O_OPEN_CREATE | RTFILE_O_DENY_WRITE | RTFILE_O_WRITE, 0 /* fFlags */);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTFileWrite(u.m_hFile, pvBuf, cbBuf, &cbWritten);
+ if (RT_SUCCESS(rc))
+ m_cbProcessed += cbWritten;
+ }
+
+ break;
+ }
+
+ case Directory:
+ {
+ rc = VINF_SUCCESS;
+ break;
+ }
+
+ default:
+ rc = VERR_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ if (pcbWritten)
+ *pcbWritten = (uint32_t)cbWritten;
+ }
+
+ LogFlowFunc(("Returning strSourcePath=%s, cbWritten=%zu, rc=%Rrc\n", m_strSrcPath.c_str(), cbWritten, rc));
+ return rc;
+}
+
diff --git a/src/VBox/GuestHost/DragAndDrop/Makefile.kmk b/src/VBox/GuestHost/DragAndDrop/Makefile.kmk
index 7aaaefc..6c9f982 100644
--- a/src/VBox/GuestHost/DragAndDrop/Makefile.kmk
+++ b/src/VBox/GuestHost/DragAndDrop/Makefile.kmk
@@ -1,10 +1,10 @@
# $Id: Makefile.kmk $
## @file
-# Sub-Makefile for the shared DnD code for both host and guest.
+# Sub-Makefile for the shared DnD code for both, host and guest.
#
#
-# Copyright (C) 2014 Oracle Corporation
+# Copyright (C) 2014-2015 Oracle Corporation
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
@@ -22,7 +22,8 @@ VBOX_DND_GUESTHOST_FILES := \
DnDDir.cpp \
DnDMIME.cpp \
DnDPath.cpp \
- DnDURIList.cpp
+ DnDURIList.cpp \
+ DnDURIObject.cpp
#
# DnDGuestR3Lib - For tools on the guest side,
diff --git a/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp b/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp
index 18b69cc..7c0d101 100644
--- a/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp
+++ b/src/VBox/GuestHost/HGSMI/HGSMICommon.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -57,14 +57,14 @@
* }
*/
-static uint32_t hgsmiHashBegin (void)
+static uint32_t hgsmiHashBegin(void)
{
return 0;
}
-static uint32_t hgsmiHashProcess (uint32_t hash,
- const void *pvData,
- size_t cbData)
+static uint32_t hgsmiHashProcess(uint32_t hash,
+ const void *pvData,
+ size_t cbData)
{
const uint8_t *pu8Data = (const uint8_t *)pvData;
@@ -78,7 +78,7 @@ static uint32_t hgsmiHashProcess (uint32_t hash,
return hash;
}
-static uint32_t hgsmiHashEnd (uint32_t hash)
+static uint32_t hgsmiHashEnd(uint32_t hash)
{
hash += (hash << 3);
hash ^= (hash >> 11);
@@ -87,69 +87,30 @@ static uint32_t hgsmiHashEnd (uint32_t hash)
return hash;
}
-uint32_t HGSMIChecksum (HGSMIOFFSET offBuffer,
- const HGSMIBUFFERHEADER *pHeader,
- const HGSMIBUFFERTAIL *pTail)
+uint32_t HGSMIChecksum(HGSMIOFFSET offBuffer,
+ const HGSMIBUFFERHEADER *pHeader,
+ const HGSMIBUFFERTAIL *pTail)
{
- uint32_t u32Checksum = hgsmiHashBegin ();
+ uint32_t u32Checksum = hgsmiHashBegin();
- u32Checksum = hgsmiHashProcess (u32Checksum, &offBuffer, sizeof (offBuffer));
- u32Checksum = hgsmiHashProcess (u32Checksum, pHeader, sizeof (HGSMIBUFFERHEADER));
- u32Checksum = hgsmiHashProcess (u32Checksum, pTail, RT_OFFSETOF(HGSMIBUFFERTAIL, u32Checksum));
+ u32Checksum = hgsmiHashProcess(u32Checksum, &offBuffer, sizeof(offBuffer));
+ u32Checksum = hgsmiHashProcess(u32Checksum, pHeader, sizeof(HGSMIBUFFERHEADER));
+ u32Checksum = hgsmiHashProcess(u32Checksum, pTail, RT_OFFSETOF(HGSMIBUFFERTAIL, u32Checksum));
- return hgsmiHashEnd (u32Checksum);
+ return hgsmiHashEnd(u32Checksum);
}
-static HGSMIOFFSET hgsmiBufferInitializeSingle (const HGSMIAREA *pArea,
- HGSMIBUFFERHEADER *pHeader,
- uint32_t u32DataSize,
- uint8_t u8Channel,
- uint16_t u16ChannelInfo)
-{
- if ( !pArea
- || !pHeader)
- {
- return HGSMIOFFSET_VOID;
- }
-
- /* Buffer must be within the area:
- * * header data size do not exceed the maximum data size;
- * * buffer address is greater than the area base address;
- * * buffer address is lower than the maximum allowed for the given data size.
- */
- HGSMISIZE cbMaximumDataSize = pArea->offLast - pArea->offBase;
-
- if ( u32DataSize > cbMaximumDataSize
- || (uint8_t *)pHeader < pArea->pu8Base
- || (uint8_t *)pHeader > pArea->pu8Base + cbMaximumDataSize - u32DataSize)
- {
- return HGSMIOFFSET_VOID;
- }
-
- HGSMIOFFSET offBuffer = HGSMIPointerToOffset (pArea, pHeader);
-
- pHeader->u8Flags = HGSMI_BUFFER_HEADER_F_SEQ_SINGLE;
- pHeader->u32DataSize = u32DataSize;
- pHeader->u8Channel = u8Channel;
- pHeader->u16ChannelInfo = u16ChannelInfo;
- memset (pHeader->u.au8Union, 0, sizeof (pHeader->u.au8Union));
-
- HGSMIBUFFERTAIL *pTail = HGSMIBufferTail (pHeader);
-
- pTail->u32Reserved = 0;
- pTail->u32Checksum = HGSMIChecksum (offBuffer, pHeader, pTail);
-
- return offBuffer;
-}
-
-int HGSMIAreaInitialize (HGSMIAREA *pArea, void *pvBase, HGSMISIZE cbArea, HGSMIOFFSET offBase)
+int HGSMIAreaInitialize(HGSMIAREA *pArea,
+ void *pvBase,
+ HGSMISIZE cbArea,
+ HGSMIOFFSET offBase)
{
uint8_t *pu8Base = (uint8_t *)pvBase;
if ( !pArea /* Check that the area: */
- || cbArea < HGSMIBufferMinimumSize () /* Large enough. */
- || pu8Base + cbArea < pu8Base /* No address space wrap. */
- || offBase > UINT32_C(0xFFFFFFFF) - cbArea /* Area within the 32 bit space: offBase + cbMem <= 0xFFFFFFFF */
+ || cbArea < HGSMIBufferMinimumSize() /* large enough; */
+ || pu8Base + cbArea < pu8Base /* no address space wrap; */
+ || offBase > UINT32_C(0xFFFFFFFF) - cbArea /* area within the 32 bit space: offBase + cbMem <= 0xFFFFFFFF. */
)
{
return VERR_INVALID_PARAMETER;
@@ -157,111 +118,80 @@ int HGSMIAreaInitialize (HGSMIAREA *pArea, void *pvBase, HGSMISIZE cbArea, HGSMI
pArea->pu8Base = pu8Base;
pArea->offBase = offBase;
- pArea->offLast = cbArea - HGSMIBufferMinimumSize () + offBase;
+ pArea->offLast = cbArea - HGSMIBufferMinimumSize() + offBase;
pArea->cbArea = cbArea;
return VINF_SUCCESS;
}
-void HGSMIAreaClear (HGSMIAREA *pArea)
+void HGSMIAreaClear(HGSMIAREA *pArea)
{
if (pArea)
{
- memset (pArea, 0, sizeof (HGSMIAREA));
+ RT_ZERO(*pArea);
}
}
/* Initialize the memory buffer including its checksum.
* No changes alloed to the header and the tail after that.
*/
-HGSMIOFFSET HGSMIBufferInitializeSingle (const HGSMIAREA *pArea,
- HGSMIBUFFERHEADER *pHeader,
- HGSMISIZE cbBuffer,
- uint8_t u8Channel,
- uint16_t u16ChannelInfo)
+HGSMIOFFSET HGSMIBufferInitializeSingle(const HGSMIAREA *pArea,
+ HGSMIBUFFERHEADER *pHeader,
+ HGSMISIZE cbBuffer,
+ uint8_t u8Channel,
+ uint16_t u16ChannelInfo)
{
- if (cbBuffer < HGSMIBufferMinimumSize ())
+ if ( !pArea
+ || !pHeader
+ || cbBuffer < HGSMIBufferMinimumSize())
{
return HGSMIOFFSET_VOID;
}
- return hgsmiBufferInitializeSingle (pArea, pHeader, cbBuffer - HGSMIBufferMinimumSize (), u8Channel, u16ChannelInfo);
-}
-
-void HGSMIHeapSetupUninitialized(HGSMIHEAP *pHeap)
-{
- RT_ZERO(*pHeap);
- pHeap->u32HeapType = HGSMI_HEAP_TYPE_NULL;
-}
+ /* Buffer must be within the area:
+ * * header data size do not exceed the maximum data size;
+ * * buffer address is greater than the area base address;
+ * * buffer address is lower than the maximum allowed for the given data size.
+ */
+ HGSMISIZE cbMaximumDataSize = pArea->offLast - pArea->offBase;
+ uint32_t u32DataSize = cbBuffer - HGSMIBufferMinimumSize();
-int HGSMIHeapRelocate (HGSMIHEAP *pHeap,
- uint32_t u32HeapType,
- void *pvBase,
- uint32_t offHeapHandle,
- uintptr_t offDelta,
- HGSMISIZE cbArea,
- HGSMIOFFSET offBase)
-{
- if ( !pHeap
- || !pvBase)
+ if ( u32DataSize > cbMaximumDataSize
+ || (uint8_t *)pHeader < pArea->pu8Base
+ || (uint8_t *)pHeader > pArea->pu8Base + cbMaximumDataSize - u32DataSize)
{
- return VERR_INVALID_PARAMETER;
+ return HGSMIOFFSET_VOID;
}
- int rc = HGSMIAreaInitialize (&pHeap->area, pvBase, cbArea, offBase);
+ HGSMIOFFSET offBuffer = HGSMIPointerToOffset(pArea, pHeader);
- if (RT_SUCCESS (rc))
- {
- if (u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
- {
- pHeap->u.hOff = (RTHEAPOFFSET)((uint8_t *)pvBase + offHeapHandle);
- }
- else if (u32HeapType == HGSMI_HEAP_TYPE_POINTER)
- {
- pHeap->u.hPtr = (RTHEAPSIMPLE)((uint8_t *)pvBase + offHeapHandle);
- rc = RTHeapSimpleRelocate (pHeap->u.hPtr, offDelta); AssertRC(rc);
- }
- else
- {
- /* HGSMI_HEAP_TYPE_MA does not need the relocation. */
- rc = VERR_NOT_SUPPORTED;
- }
+ pHeader->u8Flags = HGSMI_BUFFER_HEADER_F_SEQ_SINGLE;
+ pHeader->u32DataSize = u32DataSize;
+ pHeader->u8Channel = u8Channel;
+ pHeader->u16ChannelInfo = u16ChannelInfo;
+ RT_ZERO(pHeader->u.au8Union);
- if (RT_SUCCESS(rc))
- {
- pHeap->cRefs = 0;
- pHeap->u32HeapType = u32HeapType;
- }
- else
- {
- HGSMIAreaClear (&pHeap->area);
- }
- }
+ HGSMIBUFFERTAIL *pTail = HGSMIBufferTailFromPtr(pHeader, u32DataSize);
+ pTail->u32Reserved = 0;
+ pTail->u32Checksum = HGSMIChecksum(offBuffer, pHeader, pTail);
- return rc;
+ return offBuffer;
}
-int HGSMIHeapRestoreMA(HGSMIHEAP *pHeap,
- void *pvBase,
- HGSMISIZE cbArea,
- HGSMIOFFSET offBase,
- uint32_t cBlocks,
- HGSMIOFFSET *paDescriptors,
- HGSMISIZE cbMaxBlock,
- HGSMIENV *pEnv)
+int HGSMIHeapSetup(HGSMIHEAP *pHeap,
+ void *pvBase,
+ HGSMISIZE cbArea,
+ HGSMIOFFSET offBase,
+ const HGSMIENV *pEnv)
{
- int rc = HGSMIAreaInitialize(&pHeap->area, pvBase, cbArea, offBase);
+ AssertPtrReturn(pHeap, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pvBase, VERR_INVALID_PARAMETER);
- if (RT_SUCCESS (rc))
+ int rc = HGSMIAreaInitialize(&pHeap->area, pvBase, cbArea, offBase);
+ if (RT_SUCCESS(rc))
{
- rc = HGSMIMAInit(&pHeap->u.ma, &pHeap->area, paDescriptors, cBlocks, cbMaxBlock, pEnv);
-
- if (RT_SUCCESS(rc))
- {
- pHeap->cRefs = 0;
- pHeap->u32HeapType = HGSMI_HEAP_TYPE_MA;
- }
- else
+ rc = HGSMIMAInit(&pHeap->ma, &pHeap->area, NULL, 0, 0, pEnv);
+ if (RT_FAILURE(rc))
{
HGSMIAreaClear(&pHeap->area);
}
@@ -270,248 +200,146 @@ int HGSMIHeapRestoreMA(HGSMIHEAP *pHeap,
return rc;
}
-int HGSMIHeapSetup (HGSMIHEAP *pHeap,
- uint32_t u32HeapType,
- void *pvBase,
- HGSMISIZE cbArea,
- HGSMIOFFSET offBase,
- const HGSMIENV *pEnv)
+void HGSMIHeapDestroy(HGSMIHEAP *pHeap)
{
- if ( !pHeap
- || !pvBase)
+ if (pHeap)
{
- return VERR_INVALID_PARAMETER;
+ HGSMIMAUninit(&pHeap->ma);
+ RT_ZERO(*pHeap);
}
-
- int rc = HGSMIAreaInitialize (&pHeap->area, pvBase, cbArea, offBase);
-
- if (RT_SUCCESS (rc))
- {
- if (u32HeapType == HGSMI_HEAP_TYPE_MA)
- {
- rc = HGSMIMAInit(&pHeap->u.ma, &pHeap->area, NULL, 0, 0, pEnv);
- }
- else if (u32HeapType == HGSMI_HEAP_TYPE_POINTER)
- {
- rc = RTHeapSimpleInit (&pHeap->u.hPtr, pvBase, cbArea);
- }
- else if (u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
- {
- rc = RTHeapOffsetInit (&pHeap->u.hOff, pvBase, cbArea);
- }
- else
- {
- rc = VERR_NOT_SUPPORTED;
- }
-
- if (RT_SUCCESS (rc))
- {
- pHeap->cRefs = 0;
- pHeap->u32HeapType = u32HeapType;
- }
- else
- {
- HGSMIAreaClear (&pHeap->area);
- }
- }
-
- return rc;
}
-void HGSMIHeapDestroy (HGSMIHEAP *pHeap)
+void *HGSMIHeapAlloc(HGSMIHEAP *pHeap,
+ HGSMISIZE cbData,
+ uint8_t u8Channel,
+ uint16_t u16ChannelInfo)
{
- if (pHeap)
+ HGSMISIZE cbAlloc = HGSMIBufferRequiredSize(cbData);
+ HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIHeapBufferAlloc(pHeap, cbAlloc);
+ if (pHeader)
{
- if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_MA)
+ HGSMIOFFSET offBuffer = HGSMIBufferInitializeSingle(HGSMIHeapArea(pHeap), pHeader,
+ cbAlloc, u8Channel, u16ChannelInfo);
+ if (offBuffer == HGSMIOFFSET_VOID)
{
- HGSMIMAUninit(&pHeap->u.ma);
+ HGSMIHeapBufferFree(pHeap, pHeader);
+ pHeader = NULL;
}
- Assert(!pHeap->cRefs);
- HGSMIHeapSetupUninitialized(pHeap);
}
-}
-
-void *HGSMIHeapAlloc (HGSMIHEAP *pHeap,
- HGSMISIZE cbData,
- uint8_t u8Channel,
- uint16_t u16ChannelInfo)
-{
- HGSMISIZE cbAlloc = HGSMIBufferRequiredSize (cbData);
- HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIHeapBufferAlloc (pHeap, cbAlloc);
- if (!pHeader)
- return NULL;
-
- hgsmiBufferInitializeSingle (&pHeap->area, pHeader, cbData, u8Channel, u16ChannelInfo);
-
- return HGSMIBufferData (pHeader);
+ return pHeader? HGSMIBufferDataFromPtr(pHeader): NULL;
}
-HGSMIOFFSET HGSMIHeapBufferOffset (HGSMIHEAP *pHeap,
- void *pvData)
+void HGSMIHeapFree(HGSMIHEAP *pHeap,
+ void *pvData)
{
- HGSMIBUFFERHEADER *pHeader = HGSMIBufferHeaderFromData (pvData);
-
- HGSMIOFFSET offBuffer = HGSMIPointerToOffset (&pHeap->area, pHeader);
-
- return offBuffer;
-}
-
-void HGSMIHeapFree (HGSMIHEAP *pHeap,
- void *pvData)
-{
- if ( pvData
- && pHeap->u32HeapType != HGSMI_HEAP_TYPE_NULL)
+ if (pvData)
{
- HGSMIBUFFERHEADER *pHeader = HGSMIBufferHeaderFromData (pvData);
-
- HGSMIHeapBufferFree (pHeap, pHeader);
+ HGSMIBUFFERHEADER *pHeader = HGSMIBufferHeaderFromData(pvData);
+ HGSMIHeapBufferFree(pHeap, pHeader);
}
}
-void* HGSMIHeapBufferAlloc (HGSMIHEAP *pHeap, HGSMISIZE cbBuffer)
+void *HGSMIHeapBufferAlloc(HGSMIHEAP *pHeap,
+ HGSMISIZE cbBuffer)
{
- void* pvBuf = NULL;
- if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_MA)
- {
- pvBuf = HGSMIMAAlloc(&pHeap->u.ma, cbBuffer);
- }
- else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_POINTER)
- {
- pvBuf = RTHeapSimpleAlloc (pHeap->u.hPtr, cbBuffer, 0);
- }
- else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
- {
- pvBuf = RTHeapOffsetAlloc (pHeap->u.hOff, cbBuffer, 0);
- }
-
- if (pvBuf)
- {
- ++pHeap->cRefs;
- }
-
+ void *pvBuf = HGSMIMAAlloc(&pHeap->ma, cbBuffer);
return pvBuf;
}
void HGSMIHeapBufferFree(HGSMIHEAP *pHeap,
void *pvBuf)
{
- if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_MA)
- {
- HGSMIMAFree(&pHeap->u.ma, pvBuf);
- }
- else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_POINTER)
- {
- RTHeapSimpleFree (pHeap->u.hPtr, pvBuf);
- }
- else if (pHeap->u32HeapType == HGSMI_HEAP_TYPE_OFFSET)
- {
- RTHeapOffsetFree (pHeap->u.hOff, pvBuf);
- }
-
- --pHeap->cRefs;
+ HGSMIMAFree(&pHeap->ma, pvBuf);
}
-/* Verify that the given offBuffer points to a valid buffer, which is within the area.
+typedef struct HGSMIBUFFERCONTEXT
+{
+ const HGSMIBUFFERHEADER *pHeader; /* The original buffer header. */
+ void *pvData; /* Payload data in the buffer./ */
+ uint32_t cbData; /* Size of data */
+} HGSMIBUFFERCONTEXT;
+
+/** Verify that the given offBuffer points to a valid buffer, which is within the area.
+ *
+ * @returns VBox status and the buffer information in pBufferContext.
+ * @param pArea Area which supposed to contain the buffer.
+ * @param offBuffer The buffer location in the area.
+ * @param pBufferContext Where to write information about the buffer.
*/
-static const HGSMIBUFFERHEADER *hgsmiVerifyBuffer (const HGSMIAREA *pArea,
- HGSMIOFFSET offBuffer)
+static int hgsmiVerifyBuffer(const HGSMIAREA *pArea,
+ HGSMIOFFSET offBuffer,
+ HGSMIBUFFERCONTEXT *pBufferContext)
{
- AssertPtr(pArea);
+ LogFlowFunc(("buffer 0x%x, area %p %x [0x%x;0x%x]\n",
+ offBuffer, pArea->pu8Base, pArea->cbArea, pArea->offBase, pArea->offLast));
- LogFlowFunc(("buffer 0x%x, area %p %x [0x%x;0x%x]\n", offBuffer, pArea->pu8Base, pArea->cbArea, pArea->offBase, pArea->offLast));
+ int rc = VINF_SUCCESS;
if ( offBuffer < pArea->offBase
|| offBuffer > pArea->offLast)
{
- LogFunc(("offset 0x%x is outside the area [0x%x;0x%x]!!!\n", offBuffer, pArea->offBase, pArea->offLast));
+ LogFunc(("offset 0x%x is outside the area [0x%x;0x%x]!!!\n",
+ offBuffer, pArea->offBase, pArea->offLast));
+ rc = VERR_INVALID_PARAMETER;
HGSMI_STRICT_ASSERT_FAILED();
- return NULL;
}
-
- const HGSMIBUFFERHEADER *pHeader = (HGSMIBUFFERHEADER *)HGSMIOffsetToPointer (pArea, offBuffer);
-
- /* Quick check of the data size, it should be less than the maximum
- * data size for the buffer at this offset.
- */
- LogFlowFunc(("datasize check: pHeader->u32DataSize = 0x%x pArea->offLast - offBuffer = 0x%x\n", pHeader->u32DataSize, pArea->offLast - offBuffer));
- if (pHeader->u32DataSize <= pArea->offLast - offBuffer)
+ else
{
- HGSMIBUFFERTAIL *pTail = HGSMIBufferTail (pHeader);
+ void *pvBuffer = HGSMIOffsetToPointer(pArea, offBuffer);
+ HGSMIBUFFERHEADER header = *HGSMIBufferHeaderFromPtr(pvBuffer);
- /* At least both pHeader and pTail structures are in the area. Check the checksum. */
- uint32_t u32Checksum = HGSMIChecksum (offBuffer, pHeader, pTail);
+ /* Quick check of the data size, it should be less than the maximum
+ * data size for the buffer at this offset.
+ */
+ LogFlowFunc(("datasize check: header.u32DataSize = 0x%x pArea->offLast - offBuffer = 0x%x\n",
+ header.u32DataSize, pArea->offLast - offBuffer));
- LogFlowFunc(("checksum check: u32Checksum = 0x%x pTail->u32Checksum = 0x%x\n", u32Checksum, pTail->u32Checksum));
- if (u32Checksum == pTail->u32Checksum)
+ if (header.u32DataSize <= pArea->offLast - offBuffer)
{
- LogFlowFunc(("returning %p\n", pHeader));
- return pHeader;
+ HGSMIBUFFERTAIL tail = *HGSMIBufferTailFromPtr(pvBuffer, header.u32DataSize);
+
+ /* At least both header and tail structures are in the area. Check the checksum. */
+ uint32_t u32Checksum = HGSMIChecksum(offBuffer, &header, &tail);
+ LogFlowFunc(("checksum check: u32Checksum = 0x%x pTail->u32Checksum = 0x%x\n",
+ u32Checksum, tail.u32Checksum));
+ if (u32Checksum == tail.u32Checksum)
+ {
+ /* Success. */
+ pBufferContext->pHeader = HGSMIBufferHeaderFromPtr(pvBuffer);
+ pBufferContext->pvData = HGSMIBufferDataFromPtr(pvBuffer);
+ pBufferContext->cbData = header.u32DataSize;
+ }
+ else
+ {
+ LogFunc(("invalid checksum 0x%x, expected 0x%x!!!\n",
+ u32Checksum, tail.u32Checksum));
+ rc = VERR_INVALID_STATE;
+ HGSMI_STRICT_ASSERT_FAILED();
+ }
}
else
{
- LogFunc(("invalid checksum 0x%x, expected 0x%x!!!\n", u32Checksum, pTail->u32Checksum));
+ LogFunc(("invalid data size 0x%x, maximum is 0x%x!!!\n",
+ header.u32DataSize, pArea->offLast - offBuffer));
+ rc = VERR_TOO_MUCH_DATA;
HGSMI_STRICT_ASSERT_FAILED();
}
}
- else
- {
- LogFunc(("invalid data size 0x%x, maximum is 0x%x!!!\n", pHeader->u32DataSize, pArea->offLast - offBuffer));
- HGSMI_STRICT_ASSERT_FAILED();
- }
-
- LogFlowFunc(("returning NULL\n"));
- return NULL;
-}
-
-/* A wrapper to safely call the handler.
- */
-int HGSMIChannelHandlerCall (const HGSMICHANNELHANDLER *pHandler,
- const HGSMIBUFFERHEADER *pHeader)
-{
- LogFlowFunc(("pHandler %p, pHeader %p\n", pHandler, pHeader));
-
- int rc;
-
- Assert(pHandler && pHandler->pfnHandler);
-
- if ( pHandler
- && pHandler->pfnHandler)
- {
- void *pvBuffer = HGSMIBufferData (pHeader);
- HGSMISIZE cbBuffer = pHeader->u32DataSize;
-
- rc = pHandler->pfnHandler (pHandler->pvHandler, pHeader->u16ChannelInfo, pvBuffer, cbBuffer);
- }
- else
- {
- /* It is a NOOP case here. */
- rc = VINF_SUCCESS;
- }
-
- LogFlowFunc(("leave rc = %Rrc\n", rc));
return rc;
}
-/*
- * Process a guest buffer.
- * @thread EMT
+/** Helper to convert HGSMI channel index to the channel structure pointer.
+ *
+ * @returns Pointer to the channel data.
+ * @param pChannelInfo The channel pool.
+ * @param u8Channel The channel index.
*/
-static int hgsmiBufferProcess (const HGSMICHANNEL *pChannel,
- const HGSMIBUFFERHEADER *pHeader)
-{
- LogFlowFunc(("pChannel %p, pHeader %p\n", pChannel, pHeader));
-
- int rc = HGSMIChannelHandlerCall (&pChannel->handler,
- pHeader);
-
- return rc;
-}
-
-HGSMICHANNEL *HGSMIChannelFindById (HGSMICHANNELINFO * pChannelInfo,
- uint8_t u8Channel)
+HGSMICHANNEL *HGSMIChannelFindById(HGSMICHANNELINFO *pChannelInfo,
+ uint8_t u8Channel)
{
+ AssertCompile(RT_ELEMENTS(pChannelInfo->Channels) >= 0x100);
HGSMICHANNEL *pChannel = &pChannelInfo->Channels[u8Channel];
if (pChannel->u8Flags & HGSMI_CH_F_REGISTERED)
@@ -522,82 +350,84 @@ HGSMICHANNEL *HGSMIChannelFindById (HGSMICHANNELINFO * pChannelInfo,
return NULL;
}
-int HGSMIBufferProcess (HGSMIAREA *pArea,
- HGSMICHANNELINFO * pChannelInfo,
- HGSMIOFFSET offBuffer)
+/** Process a guest buffer.
+ *
+ * @returns VBox status.
+ * @param pArea Area which supposed to contain the buffer.
+ * @param pChannelInfo The channel pool.
+ * @param offBuffer The buffer location in the area.
+ */
+int HGSMIBufferProcess(const HGSMIAREA *pArea,
+ HGSMICHANNELINFO *pChannelInfo,
+ HGSMIOFFSET offBuffer)
{
LogFlowFunc(("pArea %p, offBuffer 0x%x\n", pArea, offBuffer));
- AssertPtr(pArea);
- AssertPtr(pChannelInfo);
-
- int rc = VERR_GENERAL_FAILURE;
-
-// VM_ASSERT_EMT(pIns->pVM);
+ AssertPtrReturn(pArea, VERR_INVALID_PARAMETER);
+ AssertPtrReturn(pChannelInfo, VERR_INVALID_PARAMETER);
/* Guest has prepared a command description at 'offBuffer'. */
- const HGSMIBUFFERHEADER *pHeader = hgsmiVerifyBuffer (pArea, offBuffer);
- Assert(pHeader);
- if (pHeader)
+ HGSMIBUFFERCONTEXT bufferContext;
+ int rc = hgsmiVerifyBuffer(pArea, offBuffer, &bufferContext);
+ if (RT_SUCCESS(rc))
{
/* Pass the command to the appropriate handler registered with this instance.
* Start with the handler list head, which is the preallocated HGSMI setup channel.
*/
- HGSMICHANNEL *pChannel = HGSMIChannelFindById (pChannelInfo, pHeader->u8Channel);
- Assert(pChannel);
+ const HGSMICHANNEL *pChannel = HGSMIChannelFindById(pChannelInfo, bufferContext.pHeader->u8Channel);
if (pChannel)
{
- hgsmiBufferProcess (pChannel, pHeader);
- HGSMI_STRICT_ASSERT(hgsmiVerifyBuffer (pArea, offBuffer) != NULL);
- rc = VINF_SUCCESS;
+ const HGSMICHANNELHANDLER *pHandler = &pChannel->handler;
+ if (pHandler->pfnHandler)
+ {
+ pHandler->pfnHandler(pHandler->pvHandler, bufferContext.pHeader->u16ChannelInfo,
+ bufferContext.pvData, bufferContext.cbData);
+ }
+ HGSMI_STRICT_ASSERT(RT_SUCCESS(hgsmiVerifyBuffer(pArea, offBuffer, &bufferContext)));
}
else
{
rc = VERR_INVALID_FUNCTION;
+ HGSMI_STRICT_ASSERT_FAILED();
}
}
- else
- {
- rc = VERR_INVALID_HANDLE;
-// LogRel(("HGSMI[%s]: ignored invalid guest buffer 0x%08X!!!\n", pIns->pszName, offBuffer));
- }
+
return rc;
}
-/* Register a new VBVA channel by index.
+/** Register a new HGSMI channel by index.
*
+ * @returns VBox status.
+ * @param pChannelInfo The channel pool managed by the caller.
+ * @param u8Channel Index of the channel.
+ * @param pszName Name of the channel (optional, allocated by the caller).
+ * @param pfnChannelHandler The channel callback.
+ * @param pvChannelHandler The callback pointer.
*/
-int HGSMIChannelRegister (HGSMICHANNELINFO * pChannelInfo,
- uint8_t u8Channel,
- const char *pszName,
- PFNHGSMICHANNELHANDLER pfnChannelHandler,
- void *pvChannelHandler,
- HGSMICHANNELHANDLER *pOldHandler)
+int HGSMIChannelRegister(HGSMICHANNELINFO *pChannelInfo,
+ uint8_t u8Channel,
+ const char *pszName,
+ PFNHGSMICHANNELHANDLER pfnChannelHandler,
+ void *pvChannelHandler)
{
- AssertPtrReturn(pOldHandler, VERR_INVALID_PARAMETER);
-
/* Check whether the channel is already registered. */
- HGSMICHANNEL *pChannel = HGSMIChannelFindById (pChannelInfo, u8Channel);
-
- if (!pChannel)
+ HGSMICHANNEL *pChannel = HGSMIChannelFindById(pChannelInfo, u8Channel);
+ if (pChannel)
{
- /* Channel is not yet registered. */
- pChannel = &pChannelInfo->Channels[u8Channel];
-
- pChannel->u8Flags = HGSMI_CH_F_REGISTERED;
- pChannel->u8Channel = u8Channel;
-
- pChannel->handler.pfnHandler = NULL;
- pChannel->handler.pvHandler = NULL;
-
- pChannel->pszName = pszName;
+ HGSMI_STRICT_ASSERT_FAILED();
+ return VERR_ALREADY_EXISTS;
}
- *pOldHandler = pChannel->handler;
+ /* Channel is not yet registered. */
+ pChannel = &pChannelInfo->Channels[u8Channel];
+
+ pChannel->u8Flags = HGSMI_CH_F_REGISTERED;
+ pChannel->u8Channel = u8Channel;
pChannel->handler.pfnHandler = pfnChannelHandler;
pChannel->handler.pvHandler = pvChannelHandler;
+ pChannel->pszName = pszName;
+
return VINF_SUCCESS;
}
-
diff --git a/src/VBox/GuestHost/OpenGL/error/error.py b/src/VBox/GuestHost/OpenGL/error/error.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.py b/src/VBox/GuestHost/OpenGL/glapi_parser/apiutil.py
old mode 100644
new mode 100755
diff --git a/src/VBox/GuestHost/OpenGL/include/chromium.h b/src/VBox/GuestHost/OpenGL/include/chromium.h
index 816aee9..b436ff2 100644
--- a/src/VBox/GuestHost/OpenGL/include/chromium.h
+++ b/src/VBox/GuestHost/OpenGL/include/chromium.h
@@ -781,7 +781,7 @@ typedef void (APIENTRY *crWindowSizeProc)(GLint window, GLint w, GLint h);
typedef void (APIENTRY *crWindowPositionProc)(GLint window, GLint x, GLint y);
typedef void (APIENTRY *crWindowShowProc)( GLint window, GLint flag );
-extern GLint APIENTRY crCreateContext(const char *dpyName, GLint visBits);
+extern GLint APIENTRY crCreateContext(char *dpyName, GLint visBits);
extern void APIENTRY crDestroyContext(GLint context);
extern void APIENTRY crMakeCurrent(GLint window, GLint context);
extern GLint APIENTRY crGetCurrentContext(void);
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_current.py b/src/VBox/GuestHost/OpenGL/packer/pack_current.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_currentheader.py b/src/VBox/GuestHost/OpenGL/packer/pack_currentheader.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_header.py b/src/VBox/GuestHost/OpenGL/packer/pack_header.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/packer/packer.py b/src/VBox/GuestHost/OpenGL/packer/packer.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/packer/packer_bbox.py b/src/VBox/GuestHost/OpenGL/packer/packer_bbox.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/spu_loader/dispatch.py b/src/VBox/GuestHost/OpenGL/spu_loader/dispatch.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/spu_loader/dispatchheader.py b/src/VBox/GuestHost/OpenGL/spu_loader/dispatchheader.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/spu_loader/glloader.py b/src/VBox/GuestHost/OpenGL/spu_loader/glloader.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/spu_loader/spuchange.py b/src/VBox/GuestHost/OpenGL/spu_loader/spuchange.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/spu_loader/spucopy.py b/src/VBox/GuestHost/OpenGL/spu_loader/spucopy.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/convert.py b/src/VBox/GuestHost/OpenGL/state_tracker/convert.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/dump_gen.py b/src/VBox/GuestHost/OpenGL/state_tracker/dump_gen.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_current.py b/src/VBox/GuestHost/OpenGL/state_tracker/state_current.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_defs.py b/src/VBox/GuestHost/OpenGL/state_tracker/state_defs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_funcs.py b/src/VBox/GuestHost/OpenGL/state_tracker/state_funcs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_get.py b/src/VBox/GuestHost/OpenGL/state_tracker/state_get.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c b/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c
index 277e013..c47b753 100644
--- a/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c
+++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_init.c
@@ -714,30 +714,31 @@ GLboolean crStateEnableDiffOnMakeCurrent(GLboolean fEnable)
void crStateMakeCurrent( CRContext *ctx )
{
CRContext *current = GetCurrentContext();
+ CRContext *pLocalCtx = ctx;
- if (ctx == NULL)
- ctx = defaultContext;
+ if (pLocalCtx == NULL)
+ pLocalCtx = defaultContext;
- if (current == ctx)
+ if (current == pLocalCtx)
return; /* no-op */
- CRASSERT(ctx);
+ CRASSERT(pLocalCtx);
if (g_bVBoxEnableDiffOnMakeCurrent && current) {
/* Check to see if the differencer exists first,
we may not have one, aka the packspu */
if (diff_api.AlphaFunc)
- crStateSwitchContext( current, ctx );
+ crStateSwitchContext( current, pLocalCtx );
}
#ifdef CHROMIUM_THREADSAFE
- SetCurrentContext(ctx);
+ SetCurrentContext(pLocalCtx);
#else
- __currentContext = ctx;
+ __currentContext = pLocalCtx;
#endif
/* ensure matrix state is also current */
- crStateMatrixMode(ctx->transform.matrixMode);
+ crStateMatrixMode(pLocalCtx->transform.matrixMode);
}
@@ -747,23 +748,24 @@ void crStateMakeCurrent( CRContext *ctx )
static void crStateSetCurrentEx( CRContext *ctx, GLboolean fCleanupDefault )
{
CRContext *current = GetCurrentContext();
+ CRContext *pLocalCtx = ctx;
- if (ctx == NULL && !fCleanupDefault)
- ctx = defaultContext;
+ if (pLocalCtx == NULL && !fCleanupDefault)
+ pLocalCtx = defaultContext;
- if (current == ctx)
+ if (current == pLocalCtx)
return; /* no-op */
#ifdef CHROMIUM_THREADSAFE
- SetCurrentContext(ctx);
+ SetCurrentContext(pLocalCtx);
#else
- __currentContext = ctx;
+ __currentContext = pLocalCtx;
#endif
- if (ctx)
+ if (pLocalCtx)
{
/* ensure matrix state is also current */
- crStateMatrixMode(ctx->transform.matrixMode);
+ crStateMatrixMode(pLocalCtx->transform.matrixMode);
}
}
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_isenabled.py b/src/VBox/GuestHost/OpenGL/state_tracker/state_isenabled.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/util/debug_opcodes.py b/src/VBox/GuestHost/OpenGL/util/debug_opcodes.py
old mode 100755
new mode 100644
diff --git a/src/VBox/GuestHost/OpenGL/util/error.c b/src/VBox/GuestHost/OpenGL/util/error.c
index d384d32..d142f87 100644
--- a/src/VBox/GuestHost/OpenGL/util/error.c
+++ b/src/VBox/GuestHost/OpenGL/util/error.c
@@ -14,18 +14,21 @@
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
-#if 1
#define LOG_GROUP LOG_GROUP_SHARED_CROPENGL
#include <iprt/string.h>
#include <iprt/stream.h>
#include <iprt/initterm.h>
+#include <iprt/asm.h>
#include <VBox/log.h>
#ifdef RT_OS_WINDOWS
# include <windows.h>
# include "cr_environment.h"
+# include "cr_error.h"
+# include "VBox/VBoxGuestLib.h"
+# include "iprt/initterm.h"
#endif
#include <signal.h>
@@ -93,14 +96,17 @@ DECLEXPORT(void) crError(const char *pszFormat, ...)
logMessageV("OpenGL Error: ", pszFormat, va);
va_end(va);
+#ifdef DEBUG
+ /* Let's interrupt App execution only on debug builds and return
+ * bad status to upper level on release ones. */
+# ifdef IN_GUEST
+ /* Trigger debugger's breakpoint handler. */
+ ASMBreakpoint();
+# else
/* Dump core or activate the debugger in debug builds. */
AssertFailed();
-
-#ifdef IN_GUEST
- /* Give things a chance to close down. */
- raise(SIGTERM);
- exit(1);
-#endif
+# endif
+#endif /* DEBUG */
}
DECLEXPORT(void) crWarning(const char *pszFormat, ...)
@@ -143,595 +149,7 @@ DECLEXPORT(void) crDebug(const char *pszFormat, ...)
}
}
-#else
-/* Copyright (c) 2001, Stanford University
- * All rights reserved
- *
- * See the file LICENSE.txt for information on redistributing this software.
- */
-
-#include "cr_environment.h"
-#include "cr_error.h"
-#include "cr_string.h"
-#include "cr_net.h"
-#include "cr_process.h"
-
-#ifdef WINDOWS
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <io.h>
-#include <fcntl.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <signal.h>
-
-#ifndef IN_GUEST
-#define LOG_GROUP LOG_GROUP_SHARED_CROPENGL
-#endif
-#if !defined(IN_GUEST) || defined(CR_DEBUG_BACKDOOR_ENABLE)
-#include <VBox/log.h>
-#endif
-
-#if defined(WINDOWS)
-# define CR_DEBUG_CONSOLE_ENABLE
-
-# include "Shlwapi.h"
-#endif
-
-#if defined(WINDOWS) && defined(IN_GUEST)
-# ifndef CR_DEBUG_BACKDOOR_ENABLE
-# error "CR_DEBUG_BACKDOOR_ENABLE is expected!"
-# endif
-#else
-# ifdef CR_DEBUG_BACKDOOR_ENABLE
-# error "CR_DEBUG_BACKDOOR_ENABLE is NOT expected!"
-# endif
-#endif
-
-
-#ifdef CR_DEBUG_BACKDOOR_ENABLE
-# include <VBoxDispMpLogger.h>
-# include <iprt/err.h>
-#endif
-
-
-static char my_hostname[256];
-#ifdef WINDOWS
-static HANDLE my_pid;
-#else
-static int my_pid = 0;
-#endif
-static int canada = 0;
-static int swedish_chef = 0;
-static int australia = 0;
-static int warnings_enabled = 1;
-
-#ifdef DEBUG_misha
-//int g_VBoxFbgFBreakDdi = 0;
-#define DebugBreak() Assert(0)
-#endif
-
-void __getHostInfo( void )
-{
- char *temp;
- /* on windows guests we're typically get called in a context of VBoxOGL!DllMain ( which calls VBoxOGLcrutil!crNetInit ),
- * which may lead to deadlocks..
- * Avoid it as it is needed for debugging purposes only */
-#if !defined(IN_GUEST) || !defined(RT_OS_WINDOWS)
- if ( crGetHostname( my_hostname, sizeof( my_hostname ) ) )
-#endif
- {
- crStrcpy( my_hostname, "????" );
- }
- temp = crStrchr( my_hostname, '.' );
- if (temp)
- {
- *temp = '\0';
- }
- my_pid = crGetPID();
-}
-
-static void __crCheckCanada(void)
-{
- static int first = 1;
- if (first)
- {
- const char *env = crGetenv( "CR_CANADA" );
- if (env)
- canada = 1;
- first = 0;
- }
-}
-
-static void __crCheckSwedishChef(void)
-{
- static int first = 1;
- if (first)
- {
- const char *env = crGetenv( "CR_SWEDEN" );
- if (env)
- swedish_chef = 1;
- first = 0;
- }
-}
-
-static void __crCheckAustralia(void)
-{
- static int first = 1;
- if (first)
- {
- const char *env = crGetenv( "CR_AUSTRALIA" );
- const char *env2 = crGetenv( "CR_AUSSIE" );
- if (env || env2)
- australia = 1;
- first = 0;
- }
-}
-
-static void outputChromiumMessage( FILE *output, char *str )
-{
- fprintf( output, "%s%s%s%s\n", str,
- swedish_chef ? " BORK BORK BORK!" : "",
- canada ? ", eh?" : "",
- australia ? ", mate!" : ""
- );
- fflush( output );
-}
-
-#ifdef WINDOWS
-static void crRedirectIOToConsole()
-{
- int hConHandle;
- HANDLE StdHandle;
- FILE *fp;
-
- AllocConsole();
-
- StdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
- hConHandle = _open_osfhandle((long)StdHandle, _O_TEXT);
- fp = _fdopen( hConHandle, "w" );
- *stdout = *fp;
- *stderr = *fp;
-
- StdHandle = GetStdHandle(STD_INPUT_HANDLE);
- hConHandle = _open_osfhandle((long)StdHandle, _O_TEXT);
- fp = _fdopen( hConHandle, "r" );
- *stdin = *fp;
-}
-#endif
-
-
-DECLEXPORT(void) crError(const char *format, ... )
-{
- va_list args;
- static char txt[8092];
- int offset;
-#ifdef WINDOWS
- DWORD err;
-#endif
-
- __crCheckCanada();
- __crCheckSwedishChef();
- __crCheckAustralia();
- if (!my_hostname[0])
- __getHostInfo();
-#ifdef WINDOWS
- if ((err = GetLastError()) != 0 && crGetenv( "CR_WINDOWS_ERRORS" ) != NULL )
- {
- static char buf[8092], *temp;
-
- SetLastError(0);
- sprintf( buf, "err=%d", err );
-
- FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, err,
- MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
- (LPTSTR) &temp, 0, NULL );
- if ( temp )
- {
- crStrncpy( buf, temp, sizeof(buf)-1 );
- buf[sizeof(buf)-1] = 0;
- }
-
- temp = buf + crStrlen(buf) - 1;
- while ( temp > buf && isspace( *temp ) )
- {
- *temp = '\0';
- temp--;
- }
-
- offset = sprintf( txt, "\t-----------------------\n\tWindows ERROR: %s\n\t----------------------\nCR Error(%s:%d): ", buf, my_hostname, my_pid );
- }
- else
- {
- offset = sprintf( txt, "OpenGL Error: ");
- }
-#else
- offset = sprintf( txt, "OpenGL Error: " );
-#endif
- va_start( args, format );
- vsprintf( txt + offset, format, args );
-#if defined(IN_GUEST)
- crDebug("%s", txt);
- outputChromiumMessage( stderr, txt );
-#else
- LogRel(("%s\n", txt));
-#endif
-#ifdef WINDOWS
- if (crGetenv( "CR_GUI_ERROR" ) != NULL)
- {
- MessageBox( NULL, txt, "Chromium Error", MB_OK );
- }
- else
- {
-#endif
- va_end( args );
-#ifdef WINDOWS
- }
-#if !defined(DEBUG_leo) && !defined(DEBUG_ll158262) && !defined(DEBUG_misha)
- if (crGetenv( "CR_DEBUG_ON_ERROR" ) != NULL)
-#endif
- {
- DebugBreak();
- }
-#endif
-
-#ifdef IN_GUEST
- /* Give chance for things to close down */
- raise( SIGTERM );
-
- exit(1);
-#endif
-}
-
-void crEnableWarnings(int onOff)
-{
- warnings_enabled = onOff;
-}
-
-#ifdef DEBUG_misha
-# undef crWarning
-#endif
-DECLEXPORT(void) crWarning(const char *format, ... )
-{
- if (warnings_enabled) {
- va_list args;
- static char txt[8092];
- int offset;
-
- __crCheckCanada();
- __crCheckSwedishChef();
- __crCheckAustralia();
- if (!my_hostname[0])
- __getHostInfo();
- offset = sprintf( txt, "OpenGL Warning: ");
- va_start( args, format );
- vsprintf( txt + offset, format, args );
-#if defined(IN_GUEST)
- crDebug("%s", txt);
- outputChromiumMessage( stderr, txt );
-#else
- LogRel(("%s\n", txt));
-#endif
- va_end( args );
-
-#if defined(WINDOWS) && defined(DEBUG) && !defined(IN_GUEST) && defined(DEBUG_misha)
- DebugBreak();
-#endif
- }
-}
-
-DECLEXPORT(void) crInfo(const char *format, ... )
-{
- va_list args;
- static char txt[8092];
- int offset;
-
- __crCheckCanada();
- __crCheckSwedishChef();
- __crCheckAustralia();
- if (!my_hostname[0])
- __getHostInfo();
- offset = sprintf( txt, "OpenGL Info: ");
- va_start( args, format );
- vsprintf( txt + offset, format, args );
-#if defined(IN_GUEST)
- crDebug("%s", txt);
- outputChromiumMessage( stderr, txt );
-#else
- LogRel(("%s\n", txt));
-#endif
- va_end( args );
-}
-
-#ifdef CR_DEBUG_BACKDOOR_ENABLE
-static DECLCALLBACK(void) crDebugBackdoorRt(char* pcszStr)
-{
- RTLogBackdoorPrintf("%s", pcszStr);
-}
-
-static DECLCALLBACK(void) crDebugBackdoorDispMp(char* pcszStr)
-{
- VBoxDispMpLoggerLog(pcszStr);
-}
-#endif
-
-
-#if defined(WINDOWS) /* && (!defined(DEBUG_misha) || !defined(IN_GUEST) ) */
-# define CR_DEBUG_DBGPRINT_ENABLE
-#endif
-
-#ifdef CR_DEBUG_DBGPRINT_ENABLE
-static void crDebugDbgPrint(const char *str)
-{
- OutputDebugString(str);
- OutputDebugString("\n");
-}
-
-static void crDebugDbgPrintF(const char * szString, ...)
-{
- char szBuffer[4096] = {0};
- va_list pArgList;
- va_start(pArgList, szString);
- vsprintf( szBuffer, szString, pArgList );
- va_end(pArgList);
-
- OutputDebugStringA(szBuffer);
-}
-
-static void crDebugDmlPrint(const char* pszDesc, const char* pszCmd)
-{
- crDebugDbgPrintF("<?dml?><exec cmd=\"%s\">%s</exec>, ( %s )\n", pszCmd, pszDesc, pszCmd);
-}
-
-
-DECLEXPORT(void) crDbgCmdPrint(const char *description1, const char *description2, const char *cmd, ...)
-{
- va_list args;
- char aTxt[8092];
- char aCmd[8092];
-
- sprintf( aTxt, "%s%s", description1, description2 );
-
- va_start( args, cmd );
-
- vsprintf( aCmd, cmd, args );
-
- va_end( args );
-
- crDebugDmlPrint(aTxt, aCmd);
-
- crDebug("%s: %s", aTxt, aCmd);
-}
-
-DECLEXPORT(void) crDbgCmdSymLoadPrint(const char *modName, const void*pvAddress)
-{
- static bool fEnable = false;
- static bool fInitialized = false;
- const char * pszName;
- static const char * pszModulePath = NULL;
-
- if (!fInitialized)
- {
-#ifndef DEBUG_misha
- if (crGetenv( "CR_DEBUG_MODULE_ENABLE" ))
-#endif
- {
- fEnable = true;
- }
-
- fInitialized = true;
- }
-
- if (!fEnable)
- return;
-
- pszName = PathFindFileNameA(modName);
-
- if (!pszModulePath)
- pszModulePath = crGetenv("CR_DEBUG_MODULE_PATH");
- if (!pszModulePath)
- pszModulePath = "c:\\Users\\senmk\\Downloads\\Data\\Data";
-
- crDbgCmdPrint("load modules for ", pszName, ".reload /i /f %s\\%s=%#p", pszModulePath, pszName, pvAddress);
-}
-
-#endif
-
-DECLEXPORT(void) crDebug(const char *format, ... )
-{
- va_list args;
- static char txt[8092];
- int offset;
-#ifdef WINDOWS
- DWORD err;
-#endif
- static FILE *output;
- static int first_time = 1;
- static int silent = 0;
-#ifdef CR_DEBUG_BACKDOOR_ENABLE
- typedef DECLCALLBACK(void) FNCRGEDUGBACKDOOR(char* pcszStr);
- typedef FNCRGEDUGBACKDOOR *PFNCRGEDUGBACKDOOR;
- static PFNCRGEDUGBACKDOOR pfnLogBackdoor = NULL;
-#endif
-#ifdef CR_DEBUG_DBGPRINT_ENABLE
- static int dbgPrintEnable = 0;
-#endif
-
- if (first_time)
- {
- const char *fname = crGetenv( "CR_DEBUG_FILE" );
- const char *fnamePrefix = crGetenv( "CR_DEBUG_FILE_PREFIX" );
- char str[2048];
-#ifdef CR_DEBUG_CONSOLE_ENABLE
- int logToConsole = 0;
-#endif
-#ifdef CR_DEBUG_BACKDOOR_ENABLE
- if (crGetenv( "CR_DEBUG_BACKDOOR" ))
- {
- int rc = VBoxDispMpLoggerInit();
- if (RT_SUCCESS(rc))
- pfnLogBackdoor = crDebugBackdoorDispMp;
- else
- pfnLogBackdoor = crDebugBackdoorRt;
- }
-#endif
-#ifdef CR_DEBUG_DBGPRINT_ENABLE
- if (crGetenv( "CR_DEBUG_DBGPRINT" ))
- {
- dbgPrintEnable = 1;
- }
-#endif
-
- if (!fname && fnamePrefix)
- {
- char pname[1024];
- if (crStrlen(fnamePrefix) < sizeof (str) - sizeof (pname) - 20)
- {
- crGetProcName(pname, 1024);
- sprintf(str,
-#ifdef RT_OS_WINDOWS
- "%s_%s_%u.txt", fnamePrefix, pname, GetCurrentProcessId()
-#else
- "%s_%s_%lu.txt", fnamePrefix, pname, crGetPID()
-#endif
- );
- fname = &str[0];
- }
- }
-
- first_time = 0;
- if (fname)
- {
- char debugFile[2048], *p;
- crStrcpy(debugFile, fname);
- p = crStrstr(debugFile, "%p");
- if (p) {
- /* replace %p with process number */
- unsigned long n = (unsigned long) crGetPID();
- sprintf(p, "%lu", n);
- }
- fname = debugFile;
- output = fopen( fname, "w" );
- if (!output)
- {
- crError( "Couldn't open debug log %s", fname );
- }
- }
- else
- {
-#ifdef CR_DEBUG_CONSOLE_ENABLE
- if (crGetenv( "CR_DEBUG_CONSOLE" ))
- {
- crRedirectIOToConsole();
- logToConsole = 1;
- }
-#endif
- output = stderr;
- }
-
-#if !defined(DEBUG)/* || defined(DEBUG_misha)*/
- /* Release mode: only emit crDebug messages if CR_DEBUG
- * or CR_DEBUG_FILE is set.
- */
- if (!fname && !crGetenv("CR_DEBUG")
-#ifdef CR_DEBUG_CONSOLE_ENABLE
- && !logToConsole
-#endif
-#ifdef CR_DEBUG_BACKDOOR_ENABLE
- && !pfnLogBackdoor
-#endif
-#ifdef CR_DEBUG_DBGPRINT_ENABLE
- && !dbgPrintEnable
-#endif
- )
- silent = 1;
-#endif
- }
-
- if (silent)
- return;
-
- __crCheckCanada();
- __crCheckSwedishChef();
- __crCheckAustralia();
- if (!my_hostname[0])
- __getHostInfo();
-
-#ifdef WINDOWS
- if ((err = GetLastError()) != 0 && crGetenv( "CR_WINDOWS_ERRORS" ) != NULL )
- {
- static char buf[8092], *temp;
-
- SetLastError(0);
- sprintf( buf, "err=%d", err );
-
- FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_MAX_WIDTH_MASK, NULL, err,
- MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
- (LPTSTR) &temp, 0, NULL );
- if ( temp )
- {
- crStrncpy( buf, temp, sizeof(buf)-1 );
- buf[sizeof(buf)-1] = 0;
- }
-
- temp = buf + crStrlen(buf) - 1;
- while ( temp > buf && isspace( *temp ) )
- {
- *temp = '\0';
- temp--;
- }
-
- offset = sprintf( txt, "\t-----------------------\n\tWindows ERROR: %s\n\t-----------------\nCR Debug(%s:%d): ", buf, my_hostname, my_pid );
- }
- else
- {
- offset = sprintf( txt, "[0x%x.0x%x] OpenGL Debug: ", GetCurrentProcessId(), crThreadID());
- }
-#else
- offset = sprintf( txt, "[0x%lx.0x%lx] OpenGL Debug: ", crGetPID(), crThreadID());
-#endif
- va_start( args, format );
- vsprintf( txt + offset, format, args );
-#ifdef CR_DEBUG_BACKDOOR_ENABLE
- if (pfnLogBackdoor)
- {
- pfnLogBackdoor(txt);
- }
-#endif
-#ifdef CR_DEBUG_DBGPRINT_ENABLE
- if (dbgPrintEnable)
- {
- crDebugDbgPrint(txt);
- }
-#endif
-#if defined(IN_GUEST)
- outputChromiumMessage( output, txt );
-#else
- if (!output
-#ifndef DEBUG_misha
- || output==stderr
-#endif
- )
- {
- LogRel(("%s\n", txt));
- }
- else
- {
- LogRel(("%s\n", txt));
- outputChromiumMessage(output, txt);
- }
-#endif
- va_end( args );
-}
-
-#if defined(DEBUG_misha) && defined(RT_OS_WINDOWS)
+#if defined(RT_OS_WINDOWS)
BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
{
(void) lpvReserved;
@@ -740,11 +158,28 @@ BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
{
case DLL_PROCESS_ATTACH:
{
+ int rc;
+ rc = RTR3InitDll(RTR3INIT_FLAGS_UNOBTRUSIVE); CRASSERT(rc);
+# ifdef IN_GUEST
+ rc = VbglR3Init();
+# endif
+ LogRel(("crUtill DLL loaded.\n"));
+# if defined(DEBUG_misha)
char aName[MAX_PATH];
- GetModuleFileNameA(hDLLInst, aName, RT_ELEMENTS(aName));
- crDbgCmdSymLoadPrint(aName, hDLLInst);
- break;
+ GetModuleFileNameA(hDLLInst, aName, RT_ELEMENTS(aName));
+ crDbgCmdSymLoadPrint(aName, hDLLInst);
+# endif
+ break;
}
+
+ case DLL_PROCESS_DETACH:
+ {
+ LogRel(("crUtill DLL unloaded."));
+# ifdef IN_GUEST
+ VbglR3Term();
+# endif
+ }
+
default:
break;
}
@@ -752,4 +187,3 @@ BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
return TRUE;
}
#endif
-#endif
diff --git a/src/VBox/GuestHost/OpenGL/util/hash.c b/src/VBox/GuestHost/OpenGL/util/hash.c
index 95f3ab6..46c782e 100644
--- a/src/VBox/GuestHost/OpenGL/util/hash.c
+++ b/src/VBox/GuestHost/OpenGL/util/hash.c
@@ -487,14 +487,15 @@ static unsigned int crHash( unsigned long key )
void crHashtableAdd( CRHashTable *h, unsigned long key, void *data )
{
+ unsigned int index = crHash(key);
CRHashNode *node = (CRHashNode *) crCalloc( sizeof( CRHashNode ) );
#ifdef CHROMIUM_THREADSAFE
crLockMutex(&h->mutex);
#endif
node->key = key;
node->data = data;
- node->next = h->buckets[crHash( key )];
- h->buckets[ crHash( key ) ] = node;
+ node->next = h->buckets[index];
+ h->buckets[index] = node;
h->num_elements++;
crHashIdPoolAllocId (h->idPool, key);
#ifdef CHROMIUM_THREADSAFE
diff --git a/src/VBox/HostDrivers/Support/SUPDrvGip.cpp b/src/VBox/HostDrivers/Support/SUPDrvGip.cpp
index 43e14e1..2dd3c2a 100644
--- a/src/VBox/HostDrivers/Support/SUPDrvGip.cpp
+++ b/src/VBox/HostDrivers/Support/SUPDrvGip.cpp
@@ -2388,7 +2388,7 @@ static DECLCALLBACK(void) supdrvGipSyncAndInvariantTimer(PRTTIMER pTimer, void *
{
PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
PSUPGLOBALINFOPAGE pGip = pDevExt->pGip;
- RTCCUINTREG fOldFlags = ASMIntDisableFlags(); /* No interruptions please (real problem on S10). */
+ RTCCUINTREG fEFlags = ASMIntDisableFlags(); /* No interruptions please (real problem on S10). */
uint64_t u64TSC = ASMReadTSC();
uint64_t u64NanoTS = RTTimeSystemNanoTS();
@@ -2422,7 +2422,7 @@ static DECLCALLBACK(void) supdrvGipSyncAndInvariantTimer(PRTTIMER pTimer, void *
supdrvGipUpdate(pDevExt, u64NanoTS, u64TSC, NIL_RTCPUID, iTick);
- ASMSetFlags(fOldFlags);
+ ASMSetFlags(fEFlags);
}
@@ -2435,7 +2435,7 @@ static DECLCALLBACK(void) supdrvGipSyncAndInvariantTimer(PRTTIMER pTimer, void *
static DECLCALLBACK(void) supdrvGipAsyncTimer(PRTTIMER pTimer, void *pvUser, uint64_t iTick)
{
PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser;
- RTCCUINTREG fOldFlags = ASMIntDisableFlags(); /* No interruptions please (real problem on S10). */
+ RTCCUINTREG fEFlags = ASMIntDisableFlags(); /* No interruptions please (real problem on S10). */
RTCPUID idCpu = RTMpCpuId();
uint64_t u64TSC = ASMReadTSC();
uint64_t NanoTS = RTTimeSystemNanoTS();
@@ -2446,7 +2446,7 @@ static DECLCALLBACK(void) supdrvGipAsyncTimer(PRTTIMER pTimer, void *pvUser, uin
else
supdrvGipUpdatePerCpu(pDevExt, NanoTS, u64TSC, idCpu, ASMGetApicId(), iTick);
- ASMSetFlags(fOldFlags);
+ ASMSetFlags(fEFlags);
}
diff --git a/src/VBox/HostDrivers/Support/SUPDrvIOC.h b/src/VBox/HostDrivers/Support/SUPDrvIOC.h
index f815e90..b09794a 100644
--- a/src/VBox/HostDrivers/Support/SUPDrvIOC.h
+++ b/src/VBox/HostDrivers/Support/SUPDrvIOC.h
@@ -1,4 +1,4 @@
-/* $Revision: 99089 $ */
+/* $Id: SUPDrvIOC.h $ */
/** @file
* VirtualBox Support Driver - IOCtl definitions.
*/
@@ -214,7 +214,7 @@ typedef SUPREQHDR *PSUPREQHDR;
* @todo Pending work on next major version change:
* - (nothing)
*/
-#define SUPDRV_IOC_VERSION 0x001f0005
+#define SUPDRV_IOC_VERSION 0x00200000
/** SUP_IOCTL_COOKIE. */
typedef struct SUPCOOKIE
@@ -1533,8 +1533,8 @@ AssertCompileSize(SUPTSCDELTAMEASURE, 6*4 + 4+1+1+1+1);
*/
#define SUP_IOCTL_TSC_READ SUP_CTL_CODE_SIZE(37, SUP_IOCTL_TSC_READ_SIZE)
#define SUP_IOCTL_TSC_READ_SIZE sizeof(SUPTSCREAD)
-#define SUP_IOCTL_TSC_READ_SIZE_IN sizeof(SUPTSCREAD)
-#define SUP_IOCTL_TSC_READ_SIZE_OUT sizeof(SUPREQHDR)
+#define SUP_IOCTL_TSC_READ_SIZE_IN sizeof(SUPREQHDR)
+#define SUP_IOCTL_TSC_READ_SIZE_OUT sizeof(SUPTSCREAD)
typedef struct SUPTSCREAD
{
/** The header. */
diff --git a/src/VBox/HostDrivers/Support/SUPDrvSem.cpp b/src/VBox/HostDrivers/Support/SUPDrvSem.cpp
index 25f10e9..7aba9f2 100644
--- a/src/VBox/HostDrivers/Support/SUPDrvSem.cpp
+++ b/src/VBox/HostDrivers/Support/SUPDrvSem.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 98413 $ */
+/* $Id: SUPDrvSem.cpp $ */
/** @file
* VBoxDrv - The VirtualBox Support Driver - Common OS agnostic.
*/
diff --git a/src/VBox/HostDrivers/Support/SUPLib.cpp b/src/VBox/HostDrivers/Support/SUPLib.cpp
index a926af6..85679bb 100644
--- a/src/VBox/HostDrivers/Support/SUPLib.cpp
+++ b/src/VBox/HostDrivers/Support/SUPLib.cpp
@@ -278,8 +278,8 @@ SUPR3DECL(int) SUPR3InitEx(bool fUnrestricted, PSUPDRVSESSION *ppSession)
CookieReq.Hdr.rc = VERR_INTERNAL_ERROR;
strcpy(CookieReq.u.In.szMagic, SUPCOOKIE_MAGIC);
CookieReq.u.In.u32ReqVersion = SUPDRV_IOC_VERSION;
- const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x001f0000
- ? 0x001f0004
+ const uint32_t uMinVersion = (SUPDRV_IOC_VERSION & 0xffff0000) == 0x00200000
+ ? 0x00200000
: SUPDRV_IOC_VERSION & 0xffff0000;
CookieReq.u.In.u32MinVersion = uMinVersion;
rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_COOKIE, &CookieReq, SUP_IOCTL_COOKIE_SIZE);
diff --git a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
index d1b0211..2eff2e1 100644
--- a/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
+++ b/src/VBox/HostDrivers/Support/darwin/SUPDrv-darwin.cpp
@@ -51,6 +51,7 @@
#include <iprt/alloc.h>
#include <iprt/power.h>
#include <iprt/dbg.h>
+#include <iprt/x86.h>
#include <VBox/err.h>
#include <VBox/log.h>
@@ -104,6 +105,7 @@ static kern_return_t VBoxDrvDarwinStop(struct kmod_info *pKModInfo, void *pvD
static int VBoxDrvDarwinOpen(dev_t Dev, int fFlags, int fDevType, struct proc *pProcess);
static int VBoxDrvDarwinClose(dev_t Dev, int fFlags, int fDevType, struct proc *pProcess);
static int VBoxDrvDarwinIOCtl(dev_t Dev, u_long iCmd, caddr_t pData, int fFlags, struct proc *pProcess);
+static int VBoxDrvDarwinIOCtlSMAP(dev_t Dev, u_long iCmd, caddr_t pData, int fFlags, struct proc *pProcess);
static int VBoxDrvDarwinIOCtlSlow(PSUPDRVSESSION pSession, u_long iCmd, caddr_t pData, struct proc *pProcess);
static int VBoxDrvDarwinErr2DarwinErr(int rc);
@@ -112,6 +114,7 @@ static IOReturn VBoxDrvDarwinSleepHandler(void *pvTarget, void *pvRefCon
RT_C_DECLS_END
static void vboxdrvDarwinResolveSymbols(void);
+static bool vboxdrvDarwinCpuHasSMAP(void);
/*******************************************************************************
@@ -274,6 +277,12 @@ static kern_return_t VBoxDrvDarwinStart(struct kmod_info *pKModInfo, void *pv
rc = RTSpinlockCreate(&g_Spinlock, RTSPINLOCK_FLAGS_INTERRUPT_SAFE, "VBoxDrvDarwin");
if (RT_SUCCESS(rc))
{
+ if (vboxdrvDarwinCpuHasSMAP())
+ {
+ LogRel(("disabling SMAP for VBoxDrvDarwinIOCtl\n"));
+ g_DevCW.d_ioctl = VBoxDrvDarwinIOCtlSMAP;
+ }
+
/*
* Registering ourselves as a character device.
*/
@@ -597,6 +606,30 @@ static int VBoxDrvDarwinIOCtl(dev_t Dev, u_long iCmd, caddr_t pData, int fFlags,
/**
+ * Alternative Device I/O Control entry point on hosts with SMAP support.
+ *
+ * @returns Darwin for slow IOCtls and VBox status code for the fast ones.
+ * @param Dev The device number (major+minor).
+ * @param iCmd The IOCtl command.
+ * @param pData Pointer to the data (if any it's a SUPDRVIOCTLDATA (kernel copy)).
+ * @param fFlags Flag saying we're a character device (like we didn't know already).
+ * @param pProcess The process issuing this request.
+ */
+static int VBoxDrvDarwinIOCtlSMAP(dev_t Dev, u_long iCmd, caddr_t pData, int fFlags, struct proc *pProcess)
+{
+ /*
+ * Allow VBox R0 code to touch R3 memory. Setting the AC bit disables the
+ * SMAP check.
+ */
+ RTCCUINTREG uFlags = ASMGetFlags();
+ ASMSetAC();
+ int rc = VBoxDrvDarwinIOCtl(Dev, iCmd, pData, fFlags, pProcess);
+ ASMSetFlags(uFlags);
+ return rc;
+}
+
+
+/**
* Worker for VBoxDrvDarwinIOCtl that takes the slow IOCtl functions.
*
* @returns Darwin errno.
@@ -1285,6 +1318,22 @@ static int VBoxDrvDarwinErr2DarwinErr(int rc)
return EPERM;
}
+/**
+ * Check if the CPU has SMAP support.
+ */
+static bool vboxdrvDarwinCpuHasSMAP(void)
+{
+ uint32_t uMaxId, uEAX, uEBX, uECX, uEDX;
+ ASMCpuId(0, &uMaxId, &uEBX, &uECX, &uEDX);
+ if ( ASMIsValidStdRange(uMaxId)
+ && uMaxId >= 0x00000007)
+ {
+ ASMCpuId_Idx_ECX(0x00000007, 0, &uEAX, &uEBX, &uECX, &uEDX);
+ if (uEBX & X86_CPUID_STEXT_FEATURE_EBX_SMAP)
+ return true;
+ }
+ return false;
+}
RTDECL(int) SUPR0Printf(const char *pszFormat, ...)
{
diff --git a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
index e79d863..c811058 100644
--- a/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
+++ b/src/VBox/HostDrivers/Support/linux/SUPDrv-linux.c
@@ -1,4 +1,4 @@
-/* $Rev: 99004 $ */
+/* $Rev: 99782 $ */
/** @file
* VBoxDrv - The VirtualBox Support Driver - Linux specifics.
*/
diff --git a/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp
index a5880fd..2c1a46e 100644
--- a/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp
+++ b/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyProcess-win.cpp
@@ -408,6 +408,7 @@ static int supHardNtVpFileMemCompareSection(PSUPHNTVPSTATE pThis, PSUPHNTVPIMAGE
else if (uRvaEnd >= uSkipEnd)
{
cbThis -= uSkipEnd - uRva;
+ pbFile += uSkipEnd - uRva;
uRva = uSkipEnd;
}
else
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk b/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk
index 69ba6f7..fbc5231 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk
+++ b/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk
@@ -511,12 +511,16 @@ else if1of ($(KBUILD_TARGET), linux solaris freebsd) ## @todo merge this with th
#
# vboxnetflt(.ko/.o/) - The lower case driver.
# Note! On Solaris the name has to be <= 8 chars long.
+# The DEBUG_HASH* stuff is for CONFIG_DYNAMIC_DEBUG-enabled kernels
#
ifdef VBOX_WITH_VBOXDRV
SYSMODS += vboxnetflt
vboxnetflt_TEMPLATE = VBOXR0DRV
vboxnetflt_NAME.solaris = vboxflt
- vboxnetflt_DEFS.linux = KBUILD_MODNAME=KBUILD_STR\(vboxnetflt\) KBUILD_BASENAME=KBUILD_STR\(vboxnetflt\) MODULE
+ vboxnetflt_DEFS.linux = \
+ KBUILD_MODNAME=KBUILD_STR\(vboxnetflt\) \
+ KBUILD_BASENAME=KBUILD_STR\(vboxnetflt\) \
+ MODULE DEBUG_HASH=2 DEBUG_HASH2=3
vboxnetflt_DEFS = IN_RT_R0
vboxnetflt_DEPS.solaris += $(VBOX_SVN_REV_KMK)
vboxnetflt_INCS.linux := \
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h b/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
index 497ddcd..eba8701 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
+++ b/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h
@@ -153,6 +153,8 @@ typedef struct VBOXNETFLTINS
bool volatile fSetPromiscuous;
/** The MAC address of the interface. */
RTMAC MacAddr;
+ /** PF_SYSTEM socket to listen for events (XXX: globals?) */
+ socket_t pSysSock;
/** @} */
# elif defined(RT_OS_LINUX)
/** @name Linux instance data
@@ -170,7 +172,9 @@ typedef struct VBOXNETFLTINS
bool volatile fPacketHandler;
/** The MAC address of the interface. */
RTMAC MacAddr;
- struct notifier_block Notifier;
+ struct notifier_block Notifier; /* netdevice */
+ struct notifier_block NotifierIPv4;
+ struct notifier_block NotifierIPv6;
struct packet_type PacketType;
# ifndef VBOXNETFLT_LINUX_NO_XMIT_QUEUE
struct sk_buff_head XmitQueue;
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp b/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp
index 44d5ffc..2ddecc9 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp
+++ b/src/VBox/HostDrivers/VBoxNetFlt/darwin/VBoxNetFlt-darwin.cpp
@@ -51,6 +51,7 @@
#include <sys/conf.h>
#include <sys/errno.h>
#include <sys/ioccom.h>
+#include <sys/filio.h>
#include <sys/malloc.h>
#include <sys/proc.h>
#include <sys/socket.h>
@@ -61,7 +62,13 @@ RT_C_DECLS_BEGIN /* Buggy 10.4 headers, fixed in 10.5. */
#include <sys/kpi_mbuf.h>
#include <net/kpi_interfacefilter.h>
RT_C_DECLS_END
+
+#include <sys/kpi_socket.h>
#include <net/if.h>
+#include <net/if_var.h>
+#include <netinet/in.h>
+#include <netinet/in_var.h>
+#include <netinet6/in6_var.h>
#define VBOXNETFLT_OS_SPECFIC 1
#include "../VBoxNetFltInternal.h"
@@ -86,6 +93,8 @@ RT_C_DECLS_END
RT_C_DECLS_BEGIN
static kern_return_t VBoxNetFltDarwinStart(struct kmod_info *pKModInfo, void *pvData);
static kern_return_t VBoxNetFltDarwinStop(struct kmod_info *pKModInfo, void *pvData);
+
+static void vboxNetFltDarwinSysSockUpcall(socket_t pSysSock, void *pvData, int fWait);
RT_C_DECLS_END
@@ -1293,13 +1302,262 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
if (pIfFilter)
iflt_detach(pIfFilter);
+
+ if (pThis->u.s.pSysSock != NULL)
+ {
+ sock_close(pThis->u.s.pSysSock);
+ pThis->u.s.pSysSock = NULL;
+ }
}
int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
{
NOREF(pvContext);
- return vboxNetFltDarwinAttachToInterface(pThis, false /* fRediscovery */);
+
+ int rc = vboxNetFltDarwinAttachToInterface(pThis, false /* fRediscovery */);
+ if (RT_FAILURE(rc))
+ return rc;
+
+ if (pThis->pSwitchPort->pfnNotifyHostAddress == NULL)
+ return rc;
+
+ /*
+ * XXX: uwe
+ *
+ * Learn host's IP addresses and set up notifications for changes.
+ * To avoid racing, set up notifications first.
+ *
+ * XXX: This should probably be global, since the only thing
+ * specific to ifnet here is its IPv6 link-local address.
+ */
+ errno_t error;
+
+ error = sock_socket(PF_SYSTEM, SOCK_RAW, SYSPROTO_EVENT,
+ vboxNetFltDarwinSysSockUpcall, pThis,
+ &pThis->u.s.pSysSock);
+ if (error != 0)
+ {
+ LogRel(("sock_socket(SYSPROTO_EVENT): error %d\n", error));
+ return rc;
+ }
+
+ int nbio = 1;
+ error = sock_ioctl(pThis->u.s.pSysSock, FIONBIO, &nbio);
+ if (error != 0)
+ {
+ LogRel(("FIONBIO: error %d\n", error));
+ sock_close(pThis->u.s.pSysSock);
+ return rc;
+ }
+
+ if (!sock_isnonblocking(pThis->u.s.pSysSock))
+ {
+ LogRel(("FIONBIO ok, but socket is blocking?!\n"));
+ sock_close(pThis->u.s.pSysSock);
+ return rc;
+ }
+
+ struct kev_request req;
+ req.vendor_code = KEV_VENDOR_APPLE;
+ req.kev_class = KEV_NETWORK_CLASS;
+ req.kev_subclass = KEV_ANY_SUBCLASS; /* need both INET and INET6, so have to request all */
+
+ error = sock_ioctl(pThis->u.s.pSysSock, SIOCSKEVFILT, &req);
+ if (error != 0)
+ {
+ LogRel(("SIOCSKEVFILT: error %d\n", error));
+ sock_close(pThis->u.s.pSysSock);
+ return rc;
+ }
+
+ ifnet_t pIfNet = pThis->u.s.pIfNet; /* already retained */
+
+ ifaddr_t *pIfAddrList;
+ error = ifnet_get_address_list(/* all interfaces*/ NULL, &pIfAddrList);
+ if (error != 0)
+ {
+ LogRel(("ifnet_get_address_list: error %d\n", error));
+ return rc;
+ }
+
+ for (ifaddr_t *pIfAddr = pIfAddrList; *pIfAddr != NULL; ++pIfAddr)
+ {
+ ifaddr_t ifa = *pIfAddr;
+ sa_family_t family = ifaddr_address_family(ifa);
+ struct sockaddr_storage ss;
+
+ error = ifaddr_address(ifa, (struct sockaddr *)&ss, sizeof(ss));
+ if (error != 0)
+ {
+ LogRel(("getting address family %d: error %d\n", family, error));
+ continue;
+ }
+
+ if (family == AF_INET)
+ {
+ struct sockaddr_in *sin = (struct sockaddr_in *)&ss;
+ u_int32_t u32Addr = ntohl(sin->sin_addr.s_addr);
+
+ if ((u32Addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
+ continue;
+
+ Log(("> inet %RTnaipv4\n", sin->sin_addr.s_addr));
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
+ /* :fAdded */ true, kIntNetAddrType_IPv4, &sin->sin_addr);
+ }
+ else if (family == AF_INET6)
+ {
+ struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ss;
+
+ if (IN6_IS_ADDR_LOOPBACK(&sin6->sin6_addr))
+ continue;
+
+ /* link-local from other interfaces are out of scope */
+ if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) && ifaddr_ifnet(ifa) != pIfNet)
+ continue;
+
+ Log(("> inet6 %RTnaipv6\n", &sin6->sin6_addr));
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
+ /* :fAdded */ true, kIntNetAddrType_IPv6, &sin6->sin6_addr);
+ }
+ }
+
+ ifnet_free_address_list(pIfAddrList);
+
+ /*
+ * Now that we've got current addresses, check for events that
+ * might have happened while we were working.
+ */
+ vboxNetFltDarwinSysSockUpcall(pThis->u.s.pSysSock, pThis, MBUF_DONTWAIT);
+
+ return rc;
+}
+
+
+static void vboxNetFltDarwinSysSockUpcall(socket_t pSysSock, void *pvData, int fWait)
+{
+ PVBOXNETFLTINS pThis = (PVBOXNETFLTINS)pvData;
+ errno_t error;
+
+ NOREF(fWait);
+
+ if (RT_UNLIKELY(pSysSock != pThis->u.s.pSysSock))
+ {
+ Log(("vboxNetFltDarwinSysSockUpcall: %p != %p?\n",
+ pSysSock, pThis->u.s.pSysSock));
+ return;
+ }
+
+ for (;;) {
+ mbuf_t m;
+ size_t len = sizeof(struct kern_event_msg) - sizeof(u_int32_t)
+ + sizeof(struct kev_in6_data);
+
+ error = sock_receivembuf(pSysSock, NULL, &m, 0, &len);
+ if (error == EWOULDBLOCK)
+ {
+ Log(("vboxNetFltDarwinSysSockUpcall: EWOULDBLOCK - we are done\n"));
+ error = 0;
+ break;
+ }
+ else if (error != 0)
+ {
+ Log(("sock_receivembuf: error %d\n", error));
+ break;
+ }
+
+ if (len < sizeof(struct kern_event_msg) - sizeof(u_int32_t))
+ {
+ Log(("vboxNetFltDarwinSysSockUpcall: %u bytes is too short\n",
+ (unsigned int)len));
+ mbuf_freem(m);
+ return;
+ }
+
+ struct kern_event_msg *msg = (struct kern_event_msg *)mbuf_data(m);
+ if (msg->kev_subclass == KEV_INET_SUBCLASS)
+ {
+ if (len - (sizeof(struct kern_event_msg) - sizeof(u_int32_t)) < sizeof(struct kev_in_data))
+ {
+ Log(("vboxNetFltDarwinSysSockUpcall: %u bytes is too short for KEV_INET_SUBCLASS\n",
+ (unsigned int)len));
+ mbuf_freem(m);
+ return;
+ }
+
+ struct kev_in_data *iev = (struct kev_in_data *)msg->event_data;
+ PCRTNETADDRU pAddr = (PCRTNETADDRU)&iev->ia_addr;
+ switch (msg->event_code)
+ {
+ case KEV_INET_NEW_ADDR:
+ Log(("KEV_INET_NEW_ADDR %RTnaipv4\n", pAddr->IPv4));
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
+ /* :fAdded */ true, kIntNetAddrType_IPv4, pAddr);
+ break;
+
+ case KEV_INET_ADDR_DELETED:
+ Log(("KEV_INET_ADDR_DELETED %RTnaipv4\n", pAddr->IPv4));
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
+ /* :fAdded */ false, kIntNetAddrType_IPv4, &iev->ia_addr);
+ break;
+
+ default:
+ Log(("KEV INET event %u addr %RTnaipv4\n", msg->event_code, pAddr->IPv4));
+ break;
+ }
+ }
+ else if (msg->kev_subclass == KEV_INET6_SUBCLASS)
+ {
+ if (len - (sizeof(struct kern_event_msg) - sizeof(u_int32_t)) < sizeof(struct kev_in6_data))
+ {
+ Log(("vboxNetFltDarwinSysSockUpcall: %u bytes is too short for KEV_INET6_SUBCLASS\n",
+ (unsigned int)len));
+ mbuf_freem(m);
+ return;
+ }
+
+ struct kev_in6_data *iev6 = (struct kev_in6_data *)msg->event_data;
+ PCRTNETADDRU pAddr = (PCRTNETADDRU)&iev6->ia_addr.sin6_addr;
+ switch (msg->event_code)
+ {
+ case KEV_INET6_NEW_USER_ADDR:
+ Log(("KEV_INET6_NEW_USER_ADDR: %RTnaipv6\n", pAddr));
+ goto kev_inet6_new;
+
+ case KEV_INET6_NEW_LL_ADDR:
+ Log(("KEV_INET6_NEW_LL_ADDR: %RTnaipv6\n", pAddr));
+ /* XXX: uwe: TODO: only interface we are attached to */
+ goto kev_inet6_new;
+
+ case KEV_INET6_NEW_RTADV_ADDR:
+ Log(("KEV_INET6_NEW_RTADV_ADDR: %RTnaipv6\n", pAddr));
+ goto kev_inet6_new;
+
+ kev_inet6_new:
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
+ /* :fAdded */ true, kIntNetAddrType_IPv6, pAddr);
+ break;
+
+ case KEV_INET6_ADDR_DELETED:
+ Log(("KEV_INET6_ADDR_DELETED: %RTnaipv6\n", pAddr));
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
+ /* :fAdded */ false, kIntNetAddrType_IPv6, pAddr);
+ break;
+
+ default:
+ Log(("KEV INET6 event %u addr %RTnaipv6\n", msg->event_code, pAddr));
+ break;
+ }
+ }
+ else
+ {
+ Log(("vboxNetFltDarwinSysSockUpcall: subclass %u ignored\n",
+ (unsigned)msg->kev_subclass));
+ }
+
+ mbuf_freem(m);
+ }
}
@@ -1313,6 +1571,7 @@ int vboxNetFltOsPreInitInstance(PVBOXNETFLTINS pThis)
pThis->u.s.fSetPromiscuous = false;
pThis->u.s.fNeedSetPromiscuous = false;
//pThis->u.s.MacAddr = {0};
+ pThis->u.s.pSysSock = NULL;
return VINF_SUCCESS;
}
diff --git a/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c b/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
index 1909f64..c2a51d2 100644
--- a/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
+++ b/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c
@@ -27,8 +27,11 @@
#include <linux/etherdevice.h>
#include <linux/rtnetlink.h>
#include <linux/miscdevice.h>
+#include <linux/inetdevice.h>
#include <linux/ip.h>
#include <linux/if_vlan.h>
+#include <net/if_inet6.h>
+#include <net/addrconf.h>
#include <VBox/log.h>
#include <VBox/err.h>
@@ -66,6 +69,18 @@
# define VBOX_FLT_XT_TO_INST(pXT) RT_FROM_MEMBER(pXT, VBOXNETFLTINS, u.s.XmitTask)
#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 34)
+# define VBOX_NETDEV_NAME(dev) netdev_name(dev)
+#else
+# define VBOX_NETDEV_NAME(dev) ((dev)->reg_state != NETREG_REGISTERED ? "(unregistered net_device)" : (dev)->name)
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
+# define VBOX_DEV_NET(dev) dev_net(dev)
+#else
+# define VBOX_DEV_NET(dev) ((dev)->nd_net)
+#endif
+
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22)
# define VBOX_SKB_RESET_NETWORK_HDR(skb) skb_reset_network_header(skb)
# define VBOX_SKB_RESET_MAC_HDR(skb) skb_reset_mac_header(skb)
@@ -1856,6 +1871,76 @@ static int vboxNetFltLinuxNotifierCallback(struct notifier_block *self, unsigned
return rc;
}
+#if 0 /* XXX: temporarily disable */
+static int vboxNetFltLinuxNotifierIPv4Callback(struct notifier_block *self, unsigned long ulEventType, void *ptr)
+{
+ PVBOXNETFLTINS pThis = RT_FROM_MEMBER(self, VBOXNETFLTINS, u.s.NotifierIPv4);
+ struct net_device *pDev;
+ struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
+ int rc = NOTIFY_OK;
+
+ pDev = vboxNetFltLinuxRetainNetDev(pThis);
+ Log(("VBoxNetFlt: %s: IPv4 event %s(0x%lx): addr %RTnaipv4 mask %RTnaipv4\n",
+ pDev ? VBOX_NETDEV_NAME(pDev) : "<???>",
+ vboxNetFltLinuxGetNetDevEventName(ulEventType), ulEventType,
+ ifa->ifa_address, ifa->ifa_mask));
+
+ if (pDev != NULL)
+ vboxNetFltLinuxReleaseNetDev(pThis, pDev);
+
+ if (pThis->pSwitchPort->pfnNotifyHostAddress)
+ {
+ bool fAdded;
+ if (ulEventType == NETDEV_UP)
+ fAdded = true;
+ else if (ulEventType == NETDEV_DOWN)
+ fAdded = false;
+ else
+ return NOTIFY_OK;
+
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort, fAdded,
+ kIntNetAddrType_IPv4, &ifa->ifa_local);
+ }
+
+ return rc;
+}
+
+
+static int vboxNetFltLinuxNotifierIPv6Callback(struct notifier_block *self, unsigned long ulEventType, void *ptr)
+{
+ PVBOXNETFLTINS pThis = RT_FROM_MEMBER(self, VBOXNETFLTINS, u.s.NotifierIPv6);
+ struct net_device *pDev;
+ struct inet6_ifaddr *ifa = (struct inet6_ifaddr *)ptr;
+ int rc = NOTIFY_OK;
+
+ pDev = vboxNetFltLinuxRetainNetDev(pThis);
+ Log(("VBoxNetFlt: %s: IPv6 event %s(0x%lx): %RTnaipv6\n",
+ pDev ? VBOX_NETDEV_NAME(pDev) : "<???>",
+ vboxNetFltLinuxGetNetDevEventName(ulEventType), ulEventType,
+ &ifa->addr));
+
+ if (pDev != NULL)
+ vboxNetFltLinuxReleaseNetDev(pThis, pDev);
+
+ if (pThis->pSwitchPort->pfnNotifyHostAddress)
+ {
+ bool fAdded;
+ if (ulEventType == NETDEV_UP)
+ fAdded = true;
+ else if (ulEventType == NETDEV_DOWN)
+ fAdded = false;
+ else
+ return NOTIFY_OK;
+
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort, fAdded,
+ kIntNetAddrType_IPv6, &ifa->addr);
+ }
+
+ return rc;
+}
+#endif /* 0 */
+
+
bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis)
{
return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost);
@@ -2052,6 +2137,10 @@ void vboxNetFltOsDeleteInstance(PVBOXNETFLTINS pThis)
));
dev_put(pDev);
}
+
+ unregister_inet6addr_notifier(&pThis->u.s.NotifierIPv6);
+ unregister_inetaddr_notifier(&pThis->u.s.NotifierIPv4);
+
Log(("vboxNetFltOsDeleteInstance: this=%p: Notifier removed.\n", pThis));
unregister_netdevice_notifier(&pThis->u.s.Notifier);
module_put(THIS_MODULE);
@@ -2079,6 +2168,96 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext)
|| !try_module_get(THIS_MODULE))
return VERR_INTNET_FLT_IF_FAILED;
+#if 0 /* XXX: temporarily disable */
+ if (pThis->pSwitchPort->pfnNotifyHostAddress)
+ {
+ struct net *net = VBOX_DEV_NET(pThis->u.s.pDev);
+ struct net_device *dev;
+
+#if !defined(for_each_netdev_rcu) /* introduced in 2.6.33 */
+ read_lock(&dev_base_lock);
+#endif
+ rcu_read_lock();
+
+#if !defined(for_each_netdev_rcu)
+ for_each_netdev(net, dev)
+#else
+ for_each_netdev_rcu(net, dev)
+#endif
+ {
+ struct in_device *in_dev;
+ struct inet6_dev *in6_dev;
+
+ /*
+ * IPv4
+ */
+ in_dev = __in_dev_get_rcu(dev);
+ if (in_dev != NULL)
+ {
+ for_ifa(in_dev) {
+ if (ifa->ifa_address == htonl(INADDR_LOOPBACK))
+ goto continue_netdev;
+
+ Log(("%s: %s: IPv4: addr %RTnaipv4 mask %RTnaipv4\n",
+ __FUNCTION__, VBOX_NETDEV_NAME(dev),
+ ifa->ifa_address, ifa->ifa_mask));
+
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
+ /* :fAdded */ true, kIntNetAddrType_IPv4, &ifa->ifa_address);
+ } endfor_ifa(in_dev);
+ }
+
+ /*
+ * IPv6
+ */
+ in6_dev = __in6_dev_get(dev);
+ if (in6_dev != NULL)
+ {
+ struct inet6_ifaddr *ifa;
+
+ read_lock_bh(&in6_dev->lock);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
+ list_for_each_entry(ifa, &in6_dev->addr_list, if_list)
+#else
+ for (ifa = in6_dev->addr_list; ifa != NULL; ifa = ifa->if_next)
+#endif
+ {
+ Log(("%s: %s: IPv6: addr %RTnaipv6/%u\n",
+ __FUNCTION__, VBOX_NETDEV_NAME(dev),
+ &ifa->addr, (unsigned)ifa->prefix_len));
+
+ pThis->pSwitchPort->pfnNotifyHostAddress(pThis->pSwitchPort,
+ /* :fAdded */ true, kIntNetAddrType_IPv6, &ifa->addr);
+ }
+ read_unlock_bh(&in6_dev->lock);
+ }
+
+ continue_netdev:
+ /* continue */;
+ }
+ rcu_read_unlock();
+#if !defined(for_each_netdev_rcu)
+ read_unlock(&dev_base_lock);
+#endif
+
+ Log(("%s: pfnNotifyHostAddress is set, register notifiers\n", __FUNCTION__));
+
+ pThis->u.s.NotifierIPv4.notifier_call = vboxNetFltLinuxNotifierIPv4Callback;
+ err = register_inetaddr_notifier(&pThis->u.s.NotifierIPv4);
+ if (err)
+ LogRel(("%s: failed to register IPv4 notifier: error %d\n",
+ __FUNCTION__, err));
+
+ pThis->u.s.NotifierIPv6.notifier_call = vboxNetFltLinuxNotifierIPv6Callback;
+ err = register_inet6addr_notifier(&pThis->u.s.NotifierIPv6);
+ if (err)
+ LogRel(("%s: failed to register IPv6 notifier: error %d\n",
+ __FUNCTION__, err));
+ }
+ else
+ Log(("%s: uwe: pfnNotifyHostAddress is NULL\n", __FUNCTION__));
+#endif
+
return VINF_SUCCESS;
}
diff --git a/src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c b/src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c
index 971ef7a..5ff080c 100644
--- a/src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c
+++ b/src/VBox/HostDrivers/VBoxPci/linux/VBoxPci-linux.c
@@ -923,7 +923,8 @@ int vboxPciOsDevRegisterIrqHandler(PVBOXRAWPCIINS pIns, PFNRAWPCIISR pfnHandler,
#else
/* We don't allow interrupts sharing */
-# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20)
+ /* XXX overhaul */
+# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 20) && LINUX_VERSION_CODE < KERNEL_VERSION(4, 1, 0)
IRQF_DISABLED, /* keep irqs disabled when calling the action handler */
# else
0,
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUSBMon.inf b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUSBMon.inf
index e4650df..7e8ec8f 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUSBMon.inf
+++ b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUSBMon.inf
@@ -34,7 +34,7 @@ CopyFiles = VBoxUSBMonitor.CopyFiles
VBoxUSBMon.sys
[DefaultInstall.NT.Services]
-AddService = VBoxUSBMon, 0x00000002, VBoxUSBMon_Service_Inst
+AddService = VBoxUSBMon, 0x00000002, VBoxUSBMon_Service_Inst, VBoxUSBMon_EventLog_Inst
[VBoxUSBMon_Service_Inst]
DisplayName = %VBoxUSBMon.SvcDesc%
@@ -44,6 +44,13 @@ StartType = 1 ; autostart to fix Vista problem
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %12%\VBoxUSBMon.sys
+[VBoxUSBMon_EventLog_Inst]
+AddReg = VBoxUSBMon_EventLog_AddReg
+
+[VBoxUSBMon_EventLog_AddReg]
+HKR,,EventMessageFile,0x00020000,"%%SystemRoot%%\System32\IoLogMsg.dll"
+HKR,,TypesSupported,0x00010001,7
+
[SourceDisksNames]
1 = %VBoxUSBMon.MediaDesc%
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp
index 597cb6b..f371544 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp
@@ -67,7 +67,7 @@ typedef struct VBOXUSBHUB_PNPHOOK_COMPLETION
#define VBOX_USB3PORT
#ifdef VBOX_USB3PORT
-#define VBOXUSBMON_MAXDRIVERS 3
+#define VBOXUSBMON_MAXDRIVERS 5
typedef struct VBOXUSB_PNPDRIVER
{
PDRIVER_OBJECT DriverObject;
@@ -1136,13 +1136,57 @@ NTSTATUS _stdcall VBoxUsbMonPnPHook(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
VBOX_PNPHOOKSTUB(0)
VBOX_PNPHOOKSTUB(1)
VBOX_PNPHOOKSTUB(2)
-AssertCompile(VBOXUSBMON_MAXDRIVERS == 3);
+VBOX_PNPHOOKSTUB(3)
+VBOX_PNPHOOKSTUB(4)
+AssertCompile(VBOXUSBMON_MAXDRIVERS == 5);
typedef struct VBOXUSBMONHOOKDRIVERWALKER
{
PDRIVER_OBJECT pDrvObj;
} VBOXUSBMONHOOKDRIVERWALKER, *PVBOXUSBMONHOOKDRIVERWALKER;
+/**
+ * Logs an error to the system event log.
+ *
+ * @param ErrCode Error to report to event log.
+ * @param ReturnedStatus Error that was reported by the driver to the caller.
+ * @param uErrId Unique error id representing the location in the driver.
+ * @param cbDumpData Number of bytes at pDumpData.
+ * @param pDumpData Pointer to data that will be added to the message (see 'details' tab).
+ */
+static void vboxUsbMonLogError(NTSTATUS ErrCode, NTSTATUS ReturnedStatus, ULONG uErrId, USHORT cbDumpData, PVOID pDumpData)
+{
+ PIO_ERROR_LOG_PACKET pErrEntry;
+
+
+ /* Truncate dumps that do not fit into IO_ERROR_LOG_PACKET. */
+ if (FIELD_OFFSET(IO_ERROR_LOG_PACKET, DumpData) + cbDumpData > ERROR_LOG_MAXIMUM_SIZE)
+ cbDumpData = ERROR_LOG_MAXIMUM_SIZE - FIELD_OFFSET(IO_ERROR_LOG_PACKET, DumpData);
+
+ pErrEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(g_VBoxUsbMonGlobals.pDevObj,
+ FIELD_OFFSET(IO_ERROR_LOG_PACKET, DumpData) + cbDumpData);
+ if (pErrEntry)
+ {
+ uint8_t *pDump = (uint8_t *)pErrEntry->DumpData;
+ if (cbDumpData)
+ memcpy(pDump, pDumpData, cbDumpData);
+ pErrEntry->MajorFunctionCode = 0;
+ pErrEntry->RetryCount = 0;
+ pErrEntry->DumpDataSize = cbDumpData;
+ pErrEntry->NumberOfStrings = 0;
+ pErrEntry->StringOffset = 0;
+ pErrEntry->ErrorCode = ErrCode;
+ pErrEntry->UniqueErrorValue = uErrId;
+ pErrEntry->FinalStatus = ReturnedStatus;
+ pErrEntry->IoControlCode = 0;
+ IoWriteErrorLogEntry(pErrEntry);
+ }
+ else
+ {
+ LOG(("Failed to allocate error log entry (cb=%d)\n", FIELD_OFFSET(IO_ERROR_LOG_PACKET, DumpData) + cbDumpData));
+ }
+}
+
static DECLCALLBACK(BOOLEAN) vboxUsbMonHookDrvObjWalker(PFILE_OBJECT pFile, PDEVICE_OBJECT pTopDo, PDEVICE_OBJECT pHubDo, PVOID pvContext)
{
PDRIVER_OBJECT pDrvObj = pHubDo->DriverObject;
@@ -1180,6 +1224,16 @@ static DECLCALLBACK(BOOLEAN) vboxUsbMonHookDrvObjWalker(PFILE_OBJECT pFile, PDEV
}
/* No empty slots! No reason to continue. */
LOG(("No empty slots!\n"));
+ ANSI_STRING ansiDrvName;
+ NTSTATUS Status = RtlUnicodeStringToAnsiString(&ansiDrvName, &pDrvObj->DriverName, true);
+ if (Status != STATUS_SUCCESS)
+ {
+ ansiDrvName.Length = 0;
+ LOG(("RtlUnicodeStringToAnsiString failed with 0x%x", Status));
+ }
+ vboxUsbMonLogError(IO_ERR_INSUFFICIENT_RESOURCES, STATUS_SUCCESS, 1, ansiDrvName.Length, ansiDrvName.Buffer);
+ if (Status == STATUS_SUCCESS)
+ RtlFreeAnsiString(&ansiDrvName);
return FALSE;
}
@@ -1859,7 +1913,9 @@ NTSTATUS _stdcall DriverEntry(PDRIVER_OBJECT pDrvObj, PUNICODE_STRING pRegPath)
VBOX_PNPHOOKSTUB_INIT(0);
VBOX_PNPHOOKSTUB_INIT(1);
VBOX_PNPHOOKSTUB_INIT(2);
- AssertCompile(VBOXUSBMON_MAXDRIVERS == 3);
+ VBOX_PNPHOOKSTUB_INIT(3);
+ VBOX_PNPHOOKSTUB_INIT(4);
+ AssertCompile(VBOXUSBMON_MAXDRIVERS == 5);
#endif /* VBOX_USB3PORT */
KeInitializeEvent(&g_VBoxUsbMonGlobals.OpenSynchEvent, SynchronizationEvent, TRUE /* signaled */);
IoInitializeRemoveLock(&g_VBoxUsbMonGlobals.RmLock, VBOXUSBMON_MEMTAG, 1, 100);
diff --git a/src/VBox/HostServices/DragAndDrop/dndmanager.cpp b/src/VBox/HostServices/DragAndDrop/dndmanager.cpp
index 25df135..1cbbb9e 100644
--- a/src/VBox/HostServices/DragAndDrop/dndmanager.cpp
+++ b/src/VBox/HostServices/DragAndDrop/dndmanager.cpp
@@ -1,10 +1,10 @@
/* $Id: dndmanager.cpp $ */
/** @file
- * Drag and Drop manager.
+ * Drag and Drop manager: Handling of DnD messages on the host side.
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -33,584 +33,79 @@
#include <iprt/uri.h>
/******************************************************************************
- * Private declarations *
- ******************************************************************************/
-
-typedef DECLCALLBACK(int) FNDNDPRIVATEPROGRESS(size_t cbDone, void *pvUser);
-typedef FNDNDPRIVATEPROGRESS *PFNDNDPRIVATEPROGRESS;
-
-/**
- * Internal DnD message class for informing the
- * guest about a new directory.
- *
- * @see DnDHGSendDataMessage
- */
-class DnDHGSendDirPrivate: public DnDMessage
-{
-public:
-
- DnDHGSendDirPrivate(DnDURIObject URIObject,
- PFNDNDPRIVATEPROGRESS pfnProgressCallback, void *pvProgressUser)
- : m_URIObject(URIObject)
- , m_pfnProgressCallback(pfnProgressCallback)
- , m_pvProgressUser(pvProgressUser)
- {
- RTCString strPath = m_URIObject.GetDestPath();
- LogFlowFunc(("strPath=%s (%zu)\n", strPath.c_str(), strPath.length()));
-
- VBOXHGCMSVCPARM paTmpParms[3];
- paTmpParms[0].setString(strPath.c_str());
- paTmpParms[1].setUInt32((uint32_t)(strPath.length() + 1));
- paTmpParms[2].setUInt32(m_URIObject.GetMode());
-
- m_pNextMsg = new HGCM::Message(DragAndDropSvc::HOST_DND_HG_SND_DIR, 3, paTmpParms);
- }
-
-public:
-
- int currentMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
- {
- int rc = DnDMessage::currentMessage(uMsg, cParms, paParms);
- /* Advance progress info */
- if ( RT_SUCCESS(rc)
- && m_pfnProgressCallback)
- rc = m_pfnProgressCallback(m_URIObject.GetSize(), m_pvProgressUser);
-
- return rc;
- }
-
-protected:
-
- DnDURIObject m_URIObject;
-
- /* Progress stuff. */
- PFNDNDPRIVATEPROGRESS m_pfnProgressCallback;
- void *m_pvProgressUser;
-};
-
-/**
- * Internal DnD message class for informing the guest about a new file.
- *
- * @see DnDHGSendDataMessage
- */
-class DnDHGSendFilePrivate: public DnDMessage
-{
-public:
-
- DnDHGSendFilePrivate(DnDURIObject URIObject,
- PFNDNDPRIVATEPROGRESS pfnProgressCallback, void *pvProgressUser);
- virtual ~DnDHGSendFilePrivate(void);
-
-public:
-
- int currentMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
-
-protected:
-
- DnDURIObject m_URIObject;
- /** Skeleton parameters for the next upcoming message in case
- * the file data didn't fit completely into the first one. */
- VBOXHGCMSVCPARM m_aSkelParms[5];
-
- /* Progress stuff. */
- PFNDNDPRIVATEPROGRESS m_pfnProgressCallback;
- void *m_pvProgressUser;
-};
-
-/**
- * Internal DnD message class for informing the guest about new drag & drop
- * data.
- *
- * @see DnDHGSendDataMessage
- */
-class DnDHGSendDataMessagePrivate: public DnDMessage
-{
-public:
-
- DnDHGSendDataMessagePrivate(uint32_t uMsg, uint32_t cParms,
- VBOXHGCMSVCPARM paParms[],
- PFNDNDPRIVATEPROGRESS pfnProgressCallback, void *pvProgressUser);
- int currentMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
-
-protected:
- size_t m_cbSize;
- size_t m_cbDone;
-
- /* Progress stuff. */
- PFNDNDPRIVATEPROGRESS m_pfnProgressCallback;
- void *m_pvProgressUser;
-};
-
-/******************************************************************************
- * Implementation *
- ******************************************************************************/
-
-/******************************************************************************
- * DnDHGSendFilePrivate *
- ******************************************************************************/
-
-DnDHGSendFilePrivate::DnDHGSendFilePrivate(DnDURIObject URIObject,
- PFNDNDPRIVATEPROGRESS pfnProgressCallback, void *pvProgressUser)
- : m_URIObject(URIObject)
- , m_pfnProgressCallback(pfnProgressCallback)
- , m_pvProgressUser(pvProgressUser)
-{
- LogFlowFunc(("strPath=%s (%zu)\n",
- m_URIObject.GetDestPath().c_str(), m_URIObject.GetDestPath().length()));
-
- m_aSkelParms[0].setString(m_URIObject.GetDestPath().c_str()); /* pvName */
- m_aSkelParms[1].setUInt32((uint32_t)(m_URIObject.GetDestPath().length() + 1)); /* cbName */
- m_aSkelParms[2].setPointer(NULL, 0); /* pvData */
- m_aSkelParms[3].setUInt32(0); /* cbData */
- m_aSkelParms[4].setUInt32(m_URIObject.GetMode()); /* fMode */
-
- m_pNextMsg = new HGCM::Message(DragAndDropSvc::HOST_DND_HG_SND_FILE, 5, m_aSkelParms);
-}
-
-DnDHGSendFilePrivate::~DnDHGSendFilePrivate(void)
-{
-}
-
-int DnDHGSendFilePrivate::currentMessage(uint32_t uMsg, uint32_t cParms,
- VBOXHGCMSVCPARM paParms[])
-{
- if (!m_pNextMsg)
- return VERR_NO_DATA;
-
- int rc = m_pNextMsg->getData(uMsg, cParms, paParms);
- clearNextMsg();
- if (RT_FAILURE(rc))
- return rc;
-
- uint32_t cbRead;
- if (RT_SUCCESS(rc))
- {
- /* Get buffer size + pointer to buffer from guest side. */
- uint32_t cbToRead = paParms[2].u.pointer.size; /* cbData */
- Assert(cbToRead);
- void *pvBuf = paParms[2].u.pointer.addr; /* pvData */
- AssertPtr(pvBuf);
-
- rc = m_URIObject.Read(pvBuf, cbToRead, &cbRead);
- LogFlowFunc(("Read %RU32 bytes (%RU32 bytes buffer) for \"%s\", rc=%Rrc\n",
- cbRead, cbToRead, m_URIObject.GetDestPath().c_str(), rc));
-
- if (RT_LIKELY(RT_SUCCESS(rc)))
- {
- /* Tell the guest the actual size read. */
- paParms[3].setUInt32((uint32_t)cbRead); /* cbData */
- }
- }
-
- if (RT_SUCCESS(rc))
- {
- if (!m_URIObject.IsComplete())
- {
- try
- {
- /* More data needed to send over. Prepare the next message. */
- m_pNextMsg = new HGCM::Message(DragAndDropSvc::HOST_DND_HG_SND_FILE, 5 /* cParms */,
- m_aSkelParms);
- }
- catch(std::bad_alloc &)
- {
- rc = VERR_NO_MEMORY;
- }
- }
-
- /* Advance progress info. */
- if ( RT_SUCCESS(rc)
- && m_pfnProgressCallback)
- {
- rc = m_pfnProgressCallback(cbRead, m_pvProgressUser);
- }
- }
-
- return rc;
-}
-
-/******************************************************************************
- * DnDHGSendDataMessagePrivate *
- ******************************************************************************/
-
-DnDHGSendDataMessagePrivate::DnDHGSendDataMessagePrivate(uint32_t uMsg, uint32_t cParms,
- VBOXHGCMSVCPARM paParms[],
- PFNDNDPRIVATEPROGRESS pfnProgressCallback,
- void *pvProgressUser)
- : m_cbSize(paParms[4].u.uint32)
- , m_cbDone(0)
- , m_pfnProgressCallback(pfnProgressCallback)
- , m_pvProgressUser(pvProgressUser)
-{
- /* Create the initial data message. This might throw
- * a bad_alloc exception. */
- m_pNextMsg = new HGCM::Message(uMsg, cParms, paParms);
-}
-
-int DnDHGSendDataMessagePrivate::currentMessage(uint32_t uMsg, uint32_t cParms,
- VBOXHGCMSVCPARM paParms[])
-{
- /** @todo Don't copy the data parts ... just move the data pointer in
- * the original data ptr. */
- if (!m_pNextMsg)
- return VERR_NO_DATA;
-
- int rc = VINF_SUCCESS;
-
- HGCM::Message *pCurMsg = m_pNextMsg;
- AssertPtr(pCurMsg);
-
- m_pNextMsg = 0;
- rc = pCurMsg->getData(uMsg, cParms, paParms);
-
- /* Depending on the current message, the data pointer is on a
- * different position (HOST_DND_HG_SND_DATA=3;
- * HOST_DND_HG_SND_MORE_DATA=0). */
- int iPos = uMsg == DragAndDropSvc::HOST_DND_HG_SND_DATA ? 3 : 0;
- m_cbDone += paParms[iPos + 1].u.uint32;
-
- /* Info + data send already? */
- if (rc == VERR_BUFFER_OVERFLOW)
- {
- paParms[iPos + 1].u.uint32 = paParms[iPos].u.pointer.size;
- VBOXHGCMSVCPARM paTmpParms[2];
- void *pvOldData;
- uint32_t cOldData;
- pCurMsg->getParmPtrInfo(iPos, &pvOldData, &cOldData);
- paTmpParms[0].setPointer(static_cast<uint8_t*>(pvOldData) + paParms[iPos].u.pointer.size, cOldData - paParms[iPos].u.pointer.size);
- paTmpParms[1].setUInt32(cOldData - paParms[iPos].u.pointer.size);
-
- try
- {
- m_pNextMsg = new HGCM::Message(DragAndDropSvc::HOST_DND_HG_SND_MORE_DATA, 2, paTmpParms);
- }
- catch(std::bad_alloc &)
- {
- rc = VERR_NO_MEMORY;
- }
- }
-
- if (pCurMsg)
- delete pCurMsg;
-
- /* Advance progress info. */
- if ( RT_SUCCESS(rc)
- && m_pfnProgressCallback)
- {
- rc = m_pfnProgressCallback(m_cbDone, m_pvProgressUser);
- }
-
- return rc;
-}
-
-/******************************************************************************
- * DnDHGSendDataMessage *
- ******************************************************************************/
-
-/*
- * This class is a meta message class. It doesn't consist of any own message
- * data, but handle the meta info, the data itself as well as any files or
- * directories which have to be transfered to the guest.
- */
-DnDHGSendDataMessage::DnDHGSendDataMessage(uint32_t uMsg, uint32_t cParms,
- VBOXHGCMSVCPARM paParms[],
- PFNDNDPROGRESS pfnProgressCallback,
- void *pvProgressUser)
- : m_cbTotal(0)
- , m_cbTransfered(0)
- , m_pfnProgressCallback(pfnProgressCallback)
- , m_pvProgressUser(pvProgressUser)
-{
- if (cParms < 5) /* Paranoia. */
- return;
-
- const char *pszFormat = static_cast<const char*>(paParms[1].u.pointer.addr);
- uint32_t cbFormat = paParms[1].u.pointer.size;
-
- int rc = VINF_SUCCESS;
- RTCString strNewURIs;
-
- /* Do we need to build up a file tree? */
- if (DnDMIMEHasFileURLs(pszFormat, cbFormat))
- {
- const char *pszList = static_cast<const char*>(paParms[3].u.pointer.addr);
- AssertPtr(pszList);
- uint32_t cbList = paParms[3].u.pointer.size;
- Assert(cbList);
-
- LogFlowFunc(("Old data (%RU32 bytes): '%s'\n", cbList, pszList));
-
- /* The list is separated by newline (even if only one file is listed). */
- RTCList<RTCString> lstURIOrg
- = RTCString(pszList, cbList).split("\r\n");
- if (!lstURIOrg.isEmpty())
- {
- rc = m_lstURI.AppendURIPathsFromList(lstURIOrg, 0 /* fFlags */);
- if (RT_SUCCESS(rc))
- {
- /* Add the total size of all meta data + files transferred to
- * the message's total byte count. */
- m_cbTotal += m_lstURI.TotalBytes();
-
- /* We have to change the actual DnD data. Remove any host paths and
- * just decode the filename into the new data. The Guest Additions will
- * add the correct path again before sending the DnD drop event to
- * some window. */
- strNewURIs = m_lstURI.RootToString();
-
- /* Note: We don't delete the old pointer here, cause this is done
- * by the caller. We just use the RTString data, which has the
- * scope of this ctor. This is enough cause the data is copied in
- * the DnDHGSendDataMessagePrivate anyway. */
- paParms[3].u.pointer.addr = (void *)strNewURIs.c_str();
- paParms[3].u.pointer.size = (uint32_t)(strNewURIs.length() + 1);
- paParms[4].u.uint32 = (uint32_t)(strNewURIs.length() + 1);
-
- LogFlowFunc(("Set new data (%RU32 bytes): '%s'\n",
- paParms[3].u.pointer.size,
- (const char*)paParms[3].u.pointer.addr));
- }
- }
- }
-
- /* Add the size of the data to the todo list. */
- m_cbTotal += paParms[4].u.uint32;
- LogFlowFunc(("cbTotal=%zu\n", m_cbTotal));
-
- /* The first message is the meta info for the data and the data itself. */
- m_pNextPathMsg = new DnDHGSendDataMessagePrivate(uMsg, cParms, paParms,
- &DnDHGSendDataMessage::progressCallback, this);
-}
-
-DnDHGSendDataMessage::~DnDHGSendDataMessage(void)
-{
- if (m_pNextPathMsg)
- delete m_pNextPathMsg;
-}
-
-HGCM::Message* DnDHGSendDataMessage::nextHGCMMessage(void)
-{
- if (!m_pNextPathMsg)
- return NULL;
-
- return m_pNextPathMsg->nextHGCMMessage();
-}
-
-int DnDHGSendDataMessage::currentMessageInfo(uint32_t *puMsg, uint32_t *pcParms)
-{
- if (!m_pNextPathMsg)
- return VERR_NO_DATA;
-
- return m_pNextPathMsg->currentMessageInfo(puMsg, pcParms);
-}
-
-int DnDHGSendDataMessage::currentMessage(uint32_t uMsg,
- uint32_t cParms, VBOXHGCMSVCPARM paParms[])
-{
- if (!m_pNextPathMsg)
- return VERR_NO_DATA;
-
- /* Fill the data out of our current queued message. */
- int rc = m_pNextPathMsg->currentMessage(uMsg, cParms, paParms);
- /* Has this message more data to deliver? */
- if (!m_pNextPathMsg->isMessageWaiting())
- {
- delete m_pNextPathMsg;
- m_pNextPathMsg = NULL;
- }
-
- /* File/directory data to send? */
- if (!m_pNextPathMsg)
- {
- if (m_lstURI.IsEmpty())
- return rc;
-
- /* Create new messages based on our internal path list. Currently
- * this could be directories or regular files. */
- const DnDURIObject &nextObj = m_lstURI.First();
- try
- {
- uint32_t fMode = nextObj.GetMode();
- LogFlowFunc(("Processing srcPath=%s, dstPath=%s, fMode=0x%x, cbSize=%RU32, fIsDir=%RTbool, fIsFile=%RTbool\n",
- nextObj.GetSourcePath().c_str(), nextObj.GetDestPath().c_str(),
- fMode, nextObj.GetSize(),
- RTFS_IS_DIRECTORY(fMode), RTFS_IS_FILE(fMode)));
-
- if (RTFS_IS_DIRECTORY(fMode))
- m_pNextPathMsg = new DnDHGSendDirPrivate(nextObj,
- &DnDHGSendDataMessage::progressCallback /* pfnProgressCallback */,
- this /* pvProgressUser */);
- else if (RTFS_IS_FILE(fMode))
- m_pNextPathMsg = new DnDHGSendFilePrivate(nextObj,
- &DnDHGSendDataMessage::progressCallback /* pfnProgressCallback */,
- this /* pvProgressUser */);
- else
- AssertMsgFailedReturn(("fMode=0x%x is not supported for srcPath=%s, dstPath=%s\n",
- fMode, nextObj.GetSourcePath().c_str(), nextObj.GetDestPath().c_str()),
- VERR_NO_DATA);
-
- m_lstURI.RemoveFirst();
- }
- catch(std::bad_alloc &)
- {
- rc = VERR_NO_MEMORY;
- }
- }
-
- return rc;
-}
-
-int DnDHGSendDataMessage::progressCallback(size_t cbDone, void *pvUser)
-{
- AssertPtrReturn(pvUser, VERR_INVALID_POINTER);
-
- DnDHGSendDataMessage *pSelf = static_cast<DnDHGSendDataMessage *>(pvUser);
- AssertPtr(pSelf);
-
- /* How many bytes are transfered already. */
- pSelf->m_cbTransfered += cbDone;
-
- /* Advance progress info. */
- int rc = VINF_SUCCESS;
- if ( pSelf->m_pfnProgressCallback
- && pSelf->m_cbTotal)
- {
- AssertMsg(pSelf->m_cbTransfered <= pSelf->m_cbTotal,
- ("More bytes transferred (%zu) than expected (%zu), cbDone=%zu\n",
- pSelf->m_cbTransfered, pSelf->m_cbTotal, cbDone));
-
- unsigned uPercentage = (unsigned)((uint64_t)pSelf->m_cbTransfered * 100 / pSelf->m_cbTotal);
- rc = pSelf->m_pfnProgressCallback(RT_MIN(uPercentage, 100),
- DragAndDropSvc::DND_PROGRESS_RUNNING,
- VINF_SUCCESS /* rc */, pSelf->m_pvProgressUser);
- }
-
- return rc;
-}
-
-/******************************************************************************
* DnDManager *
******************************************************************************/
-int DnDManager::addMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
+int DnDManager::addMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[], bool fAppend /* = true */)
{
int rc = VINF_SUCCESS;
+ LogFlowFunc(("uMsg=%RU32, cParms=%RU32, fAppend=%RTbool\n", uMsg, cParms, fAppend));
+
try
{
+ DnDMessage *pMessage = NULL;
+
switch (uMsg)
{
case DragAndDropSvc::HOST_DND_HG_EVT_ENTER:
{
clear();
LogFlowFunc(("HOST_DND_HG_EVT_ENTER\n"));
-
- /* Verify parameter count and types. */
- if ( cParms != 7
- || paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* screen id */
- || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* x-pos */
- || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* y-pos */
- || paParms[3].type != VBOX_HGCM_SVC_PARM_32BIT /* default action */
- || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT /* allowed actions */
- || paParms[5].type != VBOX_HGCM_SVC_PARM_PTR /* data */
- || paParms[6].type != VBOX_HGCM_SVC_PARM_32BIT /* size */)
- rc = VERR_INVALID_PARAMETER;
- else
- {
- m_fOpInProcess = true;
- DnDGenericMessage *pMessage = new DnDGenericMessage(uMsg, cParms, paParms);
- m_dndMessageQueue.append(pMessage);
- }
break;
}
case DragAndDropSvc::HOST_DND_HG_EVT_MOVE:
{
LogFlowFunc(("HOST_DND_HG_EVT_MOVE\n"));
-
- /* Verify parameter count and types. */
- if ( cParms != 7
- || paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* screen id */
- || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* x-pos */
- || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* y-pos */
- || paParms[3].type != VBOX_HGCM_SVC_PARM_32BIT /* default action */
- || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT /* allowed actions */
- || paParms[5].type != VBOX_HGCM_SVC_PARM_PTR /* data */
- || paParms[6].type != VBOX_HGCM_SVC_PARM_32BIT /* size */)
- {
- rc = VERR_INVALID_PARAMETER;
- }
- else
- {
- m_fOpInProcess = true;
- DnDGenericMessage *pMessage = new DnDGenericMessage(uMsg, cParms, paParms);
- m_dndMessageQueue.append(pMessage);
- }
break;
}
case DragAndDropSvc::HOST_DND_HG_EVT_LEAVE:
{
LogFlowFunc(("HOST_DND_HG_EVT_LEAVE\n"));
-
- /* Verify parameter count and types. */
- if (cParms != 0)
- rc = VERR_INVALID_PARAMETER;
- else
- {
- DnDGenericMessage *pMessage = new DnDGenericMessage(uMsg, cParms, paParms);
- m_dndMessageQueue.append(pMessage);
- }
-
- m_fOpInProcess = false;
break;
}
case DragAndDropSvc::HOST_DND_HG_EVT_DROPPED:
{
LogFlowFunc(("HOST_DND_HG_EVT_DROPPED\n"));
+ break;
+ }
- /* Verify parameter count and types. */
- if ( cParms != 7
- || paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* screen id */
- || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* x-pos */
- || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* y-pos */
- || paParms[3].type != VBOX_HGCM_SVC_PARM_32BIT /* default action */
- || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT /* allowed actions */
- || paParms[5].type != VBOX_HGCM_SVC_PARM_PTR /* data */
- || paParms[6].type != VBOX_HGCM_SVC_PARM_32BIT /* size */)
- {
- rc = VERR_INVALID_PARAMETER;
- }
- else
- {
- DnDGenericMessage *pMessage = new DnDGenericMessage(uMsg, cParms, paParms);
- m_dndMessageQueue.append(pMessage);
- }
+ case DragAndDropSvc::HOST_DND_HG_EVT_CANCEL:
+ {
+ LogFlowFunc(("HOST_DND_HG_EVT_CANCEL\n"));
+
+ pMessage = new DnDHGCancelMessage();
break;
}
case DragAndDropSvc::HOST_DND_HG_SND_DATA:
{
LogFlowFunc(("HOST_DND_HG_SND_DATA\n"));
+ break;
+ }
- /* Verify parameter count and types. */
- if ( cParms != 5
- || paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* screen id */
- || paParms[1].type != VBOX_HGCM_SVC_PARM_PTR /* format */
- || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* format size */
- || paParms[3].type != VBOX_HGCM_SVC_PARM_PTR /* data */
- || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT /* data size */)
- {
- rc = VERR_INVALID_PARAMETER;
- }
- else
- {
- DnDHGSendDataMessage *pMessage =
- new DnDHGSendDataMessage(uMsg, cParms, paParms,
- m_pfnProgressCallback, m_pvProgressUser);
- m_dndMessageQueue.append(pMessage);
- }
+ case DragAndDropSvc::HOST_DND_HG_SND_DIR:
+ {
+ LogFlowFunc(("HOST_DND_HG_SND_DIR\n"));
+ break;
+ }
+
+ /* New since protocol version 2 (VBox 5.0). */
+ case DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR:
+ {
+ LogFlowFunc(("HOST_DND_HG_SND_FILE_HDR\n"));
+ break;
+ }
+
+ case DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA:
+ {
+ LogFlowFunc(("HOST_DND_HG_SND_FILE\n"));
+
+ /* No parameter verification here as, depending on the protocol version
+ * being used, the parameter count + types might change. */
break;
}
@@ -625,11 +120,6 @@ int DnDManager::addMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paPar
{
rc = VERR_INVALID_PARAMETER;
}
- else
- {
- DnDGenericMessage *pMessage = new DnDGenericMessage(uMsg, cParms, paParms);
- m_dndMessageQueue.append(pMessage);
- }
break;
}
@@ -645,19 +135,6 @@ int DnDManager::addMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paPar
{
rc = VERR_INVALID_PARAMETER;
}
- else
- {
- try
- {
- DnDGenericMessage *pMessage
- = new DnDGenericMessage(uMsg, cParms, paParms);
- m_dndMessageQueue.append(pMessage);
- }
- catch(std::bad_alloc &)
- {
- rc = VERR_NO_MEMORY;
- }
- }
break;
}
#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
@@ -666,6 +143,14 @@ int DnDManager::addMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paPar
rc = VERR_NOT_IMPLEMENTED;
break;
}
+
+ if (!pMessage) /* Generic message needed? */
+ pMessage = new DnDGenericMessage(uMsg, cParms, paParms);
+
+ if (fAppend)
+ m_dndMessageQueue.append(pMessage);
+ else
+ m_dndMessageQueue.prepend(pMessage);
}
catch(std::bad_alloc &)
{
@@ -691,18 +176,13 @@ int DnDManager::nextMessageInfo(uint32_t *puMsg, uint32_t *pcParms)
AssertPtrReturn(puMsg, VERR_INVALID_POINTER);
AssertPtrReturn(pcParms, VERR_INVALID_POINTER);
- int rc = VINF_SUCCESS;
-
+ int rc;
if (m_pCurMsg)
rc = m_pCurMsg->currentMessageInfo(puMsg, pcParms);
else
{
if (m_dndMessageQueue.isEmpty())
- {
rc = VERR_NO_DATA;
-// if (m_pfnProgressCallback)
-// m_pfnProgressCallback(100.0, DragAndDropSvc::DND_OP_CANCELLED, m_pvProgressUser);
- }
else
rc = m_dndMessageQueue.first()->currentMessageInfo(puMsg, pcParms);
}
@@ -742,8 +222,7 @@ int DnDManager::nextMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paPa
* the operation, we need to cleanup all pending events and inform the progress
* callback about our exit.
*/
- if ( RT_FAILURE(rc)
- && m_pfnProgressCallback)
+ if (RT_FAILURE(rc))
{
/* Clear any pending messages. */
clear();
@@ -753,12 +232,21 @@ int DnDManager::nextMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paPa
* due to an error. */
try
{
+ if (rc == VERR_CANCELLED)
+ LogFlowFunc(("Operation was cancelled\n"));
+
Assert(!m_pCurMsg);
m_pCurMsg = new DnDHGCancelMessage();
- m_pfnProgressCallback(100 /* Percent */,
- rc == VERR_CANCELLED
- ? DragAndDropSvc::DND_PROGRESS_CANCELLED
- : DragAndDropSvc::DND_PROGRESS_ERROR, rc, m_pvProgressUser);
+
+ if (m_pfnProgressCallback)
+ {
+ LogFlowFunc(("Notifying host about aborting operation (%Rrc) ...\n", rc));
+ m_pfnProgressCallback( rc == VERR_CANCELLED
+ ? DragAndDropSvc::DND_PROGRESS_CANCELLED
+ : DragAndDropSvc::DND_PROGRESS_ERROR,
+ 100 /* Percent */, rc,
+ m_pvProgressUser);
+ }
}
catch(std::bad_alloc &)
{
@@ -775,7 +263,7 @@ void DnDManager::clear(void)
if (m_pCurMsg)
{
delete m_pCurMsg;
- m_pCurMsg = 0;
+ m_pCurMsg = NULL;
}
while (!m_dndMessageQueue.isEmpty())
@@ -785,3 +273,25 @@ void DnDManager::clear(void)
}
}
+/**
+ * Triggers a rescheduling of the manager's message queue by setting the first
+ * message available in the queue as the current one to process.
+ *
+ * @return IPRT status code. VERR_NO_DATA if not message to process is available at
+ * the time of calling.
+ */
+int DnDManager::doReschedule(void)
+{
+ LogFlowFunc(("Rescheduling ...\n"));
+
+ if (!m_dndMessageQueue.isEmpty())
+ {
+ m_pCurMsg = m_dndMessageQueue.first();
+ m_dndMessageQueue.removeFirst();
+
+ return VINF_SUCCESS;
+ }
+
+ return VERR_NO_DATA;
+}
+
diff --git a/src/VBox/HostServices/DragAndDrop/dndmanager.h b/src/VBox/HostServices/DragAndDrop/dndmanager.h
index 7855501..f665280 100644
--- a/src/VBox/HostServices/DragAndDrop/dndmanager.h
+++ b/src/VBox/HostServices/DragAndDrop/dndmanager.h
@@ -3,7 +3,7 @@
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -24,7 +24,7 @@
#include <iprt/cpp/ministring.h>
#include <iprt/cpp/list.h>
-typedef DECLCALLBACK(int) FNDNDPROGRESS(unsigned uPercentage, uint32_t uState, int rc, void *pvUser);
+typedef DECLCALLBACK(int) FNDNDPROGRESS(uint32_t uState, uint32_t uPercentage, int rc, void *pvUser);
typedef FNDNDPROGRESS *PFNDNDPROGRESS;
/**
@@ -107,43 +107,7 @@ public:
};
/**
- * DnD message class for informing the guest about a new drop data event.
- */
-class DnDHGSendDataMessage: public DnDMessage
-{
-public:
-
- DnDHGSendDataMessage(uint32_t uMsg, uint32_t cParms,
- VBOXHGCMSVCPARM paParms[],
- PFNDNDPROGRESS pfnProgressCallback, void *pvProgressUser);
-
- virtual ~DnDHGSendDataMessage(void);
-
- HGCM::Message* nextHGCMMessage(void);
- int currentMessageInfo(uint32_t *puMsg, uint32_t *pcParms);
- int currentMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
-
- bool isMessageWaiting(void) const { return !!m_pNextPathMsg; }
-
-protected:
-
- static DECLCALLBACK(int) progressCallback(size_t cbDone, void *pvUser);
-
- DnDMessage *m_pNextPathMsg;
-
- DnDURIList m_lstURI;
- /* Total message size (in bytes). */
- size_t m_cbTotal;
- /* Transferred message size (in bytes). */
- size_t m_cbTransfered;
-
- PFNDNDPROGRESS m_pfnProgressCallback;
- void *m_pvProgressUser;
-};
-
-/**
- * DnD message class for informing the guest to cancel any currently and
- * pending activities.
+ * DnD message class for informing the guest to cancel any current (and pending) activities.
*/
class DnDHGCancelMessage: public DnDMessage
{
@@ -166,8 +130,7 @@ class DnDManager
public:
DnDManager(PFNDNDPROGRESS pfnProgressCallback, void *pvProgressUser)
- : m_pCurMsg(0)
- , m_fOpInProcess(false)
+ : m_pCurMsg(NULL)
, m_pfnProgressCallback(pfnProgressCallback)
, m_pvProgressUser(pvProgressUser)
{}
@@ -177,22 +140,19 @@ public:
clear();
}
- int addMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
+ int addMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[], bool fAppend = true);
HGCM::Message *nextHGCMMessage(void);
int nextMessageInfo(uint32_t *puMsg, uint32_t *pcParms);
int nextMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
void clear(void);
-
- bool hasActiveOperation(void) const { return m_fOpInProcess; }
+ int doReschedule(void);
private:
DnDMessage *m_pCurMsg;
RTCList<DnDMessage*> m_dndMessageQueue;
- bool m_fOpInProcess;
-
/* Progress stuff */
PFNDNDPROGRESS m_pfnProgressCallback;
void *m_pvProgressUser;
diff --git a/src/VBox/HostServices/DragAndDrop/service.cpp b/src/VBox/HostServices/DragAndDrop/service.cpp
index c78ea30..f4330ed 100644
--- a/src/VBox/HostServices/DragAndDrop/service.cpp
+++ b/src/VBox/HostServices/DragAndDrop/service.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -59,41 +59,51 @@
#endif
#define LOG_GROUP LOG_GROUP_GUEST_DND
+#include <map>
+
#include "dndmanager.h"
/******************************************************************************
* Service class declaration *
******************************************************************************/
+/** Map holding pointers to HGCM clients. Key is the (unique) HGCM client ID. */
+typedef std::map<uint32_t, HGCM::Client*> DnDClientMap;
+
/**
* Specialized drag & drop service class.
*/
-class DragAndDropService: public HGCM::AbstractService<DragAndDropService>
+class DragAndDropService : public HGCM::AbstractService<DragAndDropService>
{
public:
explicit DragAndDropService(PVBOXHGCMSVCHELPERS pHelpers)
: HGCM::AbstractService<DragAndDropService>(pHelpers)
- , m_pManager(0)
- , m_cClients(0)
- {}
+ , m_pManager(NULL) {}
protected:
- /* HGCM service implementation */
+
int init(VBOXHGCMSVCFNTABLE *pTable);
- int uninit();
+ int uninit(void);
int clientConnect(uint32_t u32ClientID, void *pvClient);
int clientDisconnect(uint32_t u32ClientID, void *pvClient);
void guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32ClientID, void *pvClient, uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
int hostCall(uint32_t u32Function, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
- static DECLCALLBACK(int) progressCallback(uint32_t uPercentage, uint32_t uState, int rc, void *pvUser);
int modeSet(uint32_t u32Mode);
inline uint32_t modeGet() { return m_u32Mode; };
- DnDManager *m_pManager;
+protected:
- uint32_t m_cClients;
+ static DECLCALLBACK(int) progressCallback(uint32_t uStatus, uint32_t uPercentage, int rc, void *pvUser);
+
+protected:
+
+ DnDManager *m_pManager;
+ /** Map of all connected clients. */
+ DnDClientMap m_clientMap;
+ /** List of all clients which are queued up (deferred return) and ready
+ * to process new commands. */
RTCList<HGCM::Client*> m_clientQueue;
uint32_t m_u32Mode;
};
@@ -113,40 +123,85 @@ int DragAndDropService::init(VBOXHGCMSVCFNTABLE *pTable)
/* Drag'n drop mode is disabled by default. */
modeSet(VBOX_DRAG_AND_DROP_MODE_OFF);
- m_pManager = new DnDManager(&DragAndDropService::progressCallback, this);
+ int rc = VINF_SUCCESS;
- return VINF_SUCCESS;
+ try
+ {
+ m_pManager = new DnDManager(&DragAndDropService::progressCallback, this);
+ }
+ catch(std::bad_alloc &)
+ {
+ rc = VERR_NO_MEMORY;
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
}
int DragAndDropService::uninit(void)
{
- delete m_pManager;
+ if (m_pManager)
+ {
+ delete m_pManager;
+ m_pManager = NULL;
+ }
return VINF_SUCCESS;
}
int DragAndDropService::clientConnect(uint32_t u32ClientID, void *pvClient)
{
- LogFlowFunc(("New client (%RU32) connected\n", u32ClientID));
- if (m_cClients < UINT32_MAX)
- m_cClients++;
- else
+ if (m_clientMap.size() >= UINT8_MAX) /* Don't allow too much clients at the same time. */
+ {
AssertMsgFailed(("Maximum number of clients reached\n"));
+ return VERR_BUFFER_OVERFLOW;
+ }
+
+ int rc = VINF_SUCCESS;
/*
- * Clear the message queue as soon as a new clients connect
- * to ensure that every client has the same state.
+ * Add client to our client map.
*/
- if (m_pManager)
- m_pManager->clear();
+ if (m_clientMap.find(u32ClientID) != m_clientMap.end())
+ rc = VERR_ALREADY_EXISTS;
- return VINF_SUCCESS;
+ if (RT_SUCCESS(rc))
+ {
+ try
+ {
+ m_clientMap[u32ClientID] = new HGCM::Client(u32ClientID);
+ }
+ catch(std::bad_alloc &)
+ {
+ rc = VERR_NO_MEMORY;
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Clear the message queue as soon as a new clients connect
+ * to ensure that every client has the same state.
+ */
+ if (m_pManager)
+ m_pManager->clear();
+ }
+ }
+
+ LogFlowFunc(("Client %RU32 connected, rc=%Rrc\n", u32ClientID, rc));
+ return rc;
}
int DragAndDropService::clientDisconnect(uint32_t u32ClientID, void *pvClient)
{
- /* Remove all waiters with this u32ClientID. */
- for (size_t i = 0; i < m_clientQueue.size(); )
+ /* Client not found? Bail out early. */
+ DnDClientMap::iterator itClient = m_clientMap.find(u32ClientID);
+ if (itClient == m_clientMap.end())
+ return VERR_NOT_FOUND;
+
+ /*
+ * Remove from waiters queue.
+ */
+ for (size_t i = 0; i < m_clientQueue.size(); i++)
{
HGCM::Client *pClient = m_clientQueue.at(i);
if (pClient->clientId() == u32ClientID)
@@ -156,11 +211,20 @@ int DragAndDropService::clientDisconnect(uint32_t u32ClientID, void *pvClient)
m_clientQueue.removeAt(i);
delete pClient;
+
+ break;
}
- else
- i++;
}
+ /*
+ * Remove from client map and deallocate.
+ */
+ AssertPtr(itClient->second);
+ delete itClient->second;
+
+ m_clientMap.erase(itClient);
+
+ LogFlowFunc(("Client %RU32 disconnected\n", u32ClientID));
return VINF_SUCCESS;
}
@@ -196,6 +260,7 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
switch (u32Function)
{
case DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG:
+ {
if (modeGet() != VBOX_DRAG_AND_DROP_MODE_OFF)
{
rc = VINF_SUCCESS;
@@ -206,8 +271,15 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
rc = VINF_HGCM_ASYNC_EXECUTE;
}
break;
+ }
+
+ /* Note: New since protocol version 2. */
+ case DragAndDropSvc::GUEST_DND_CONNECT:
+ /* Fall through is intentional. */
case DragAndDropSvc::GUEST_DND_HG_ACK_OP:
case DragAndDropSvc::GUEST_DND_HG_REQ_DATA:
+ case DragAndDropSvc::GUEST_DND_HG_EVT_PROGRESS:
+ {
if ( modeGet() == VBOX_DRAG_AND_DROP_MODE_BIDIRECTIONAL
|| modeGet() == VBOX_DRAG_AND_DROP_MODE_HOST_TO_GUEST)
{
@@ -216,11 +288,15 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
else
LogFlowFunc(("Host -> Guest DnD mode disabled, ignoring request\n"));
break;
+ }
+
case DragAndDropSvc::GUEST_DND_GH_ACK_PENDING:
case DragAndDropSvc::GUEST_DND_GH_SND_DATA:
case DragAndDropSvc::GUEST_DND_GH_SND_DIR:
- case DragAndDropSvc::GUEST_DND_GH_SND_FILE:
+ case DragAndDropSvc::GUEST_DND_GH_SND_FILE_HDR:
+ case DragAndDropSvc::GUEST_DND_GH_SND_FILE_DATA:
case DragAndDropSvc::GUEST_DND_GH_EVT_ERROR:
+ {
#ifdef VBOX_WITH_DRAG_AND_DROP_GH
if ( modeGet() == VBOX_DRAG_AND_DROP_MODE_BIDIRECTIONAL
|| modeGet() == VBOX_DRAG_AND_DROP_MODE_GUEST_TO_HOST)
@@ -231,6 +307,8 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
#endif
LogFlowFunc(("Guest -> Host DnD mode disabled, ignoring request\n"));
break;
+ }
+
default:
/* Reach through to DnD manager. */
rc = VINF_SUCCESS;
@@ -241,15 +319,30 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
LogFlowFunc(("Mode (%RU32) check rc=%Rrc\n", modeGet(), rc));
#endif
+#define DO_HOST_CALLBACK(); \
+ if ( RT_SUCCESS(rc) \
+ && m_pfnHostCallback) \
+ { \
+ rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data)); \
+ }
+
if (rc == VINF_SUCCESS) /* Note: rc might be VINF_HGCM_ASYNC_EXECUTE! */
{
+ DnDClientMap::iterator itClient = m_clientMap.find(u32ClientID);
+ Assert(itClient != m_clientMap.end());
+
+ HGCM::Client *pClient = itClient->second;
+ AssertPtr(pClient);
+
switch (u32Function)
{
- /* Note: Older VBox versions with enabled DnD guest->host support (< 4.4)
+ /*
+ * Note: Older VBox versions with enabled DnD guest->host support (< 5.0)
* used the same message ID (300) for GUEST_DND_GET_NEXT_HOST_MSG and
* HOST_DND_GH_REQ_PENDING, which led this service returning
* VERR_INVALID_PARAMETER when the guest wanted to actually
- * handle HOST_DND_GH_REQ_PENDING. */
+ * handle HOST_DND_GH_REQ_PENDING.
+ */
case DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG:
{
LogFlowFunc(("GUEST_DND_GET_NEXT_HOST_MSG\n"));
@@ -257,19 +350,66 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
|| paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* message */
|| paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* parameter count */
|| paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* blocking */)
+ {
rc = VERR_INVALID_PARAMETER;
+ }
else
{
- rc = m_pManager->nextMessageInfo(&paParms[0].u.uint32, &paParms[1].u.uint32);
- if ( RT_FAILURE(rc)
- && paParms[2].u.uint32) /* Blocking? */
+ rc = m_pManager->nextMessageInfo(&paParms[0].u.uint32 /* uMsg */, &paParms[1].u.uint32 /* cParms */);
+ if (RT_FAILURE(rc)) /* No queued messages available? */
{
- /* Defer client returning. */
- rc = VINF_HGCM_ASYNC_EXECUTE;
+ if (m_pfnHostCallback) /* Try asking the host. */
+ {
+ DragAndDropSvc::VBOXDNDCBHGGETNEXTHOSTMSG data;
+ data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_HG_GET_NEXT_HOST_MSG;
+ rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ if (RT_SUCCESS(rc))
+ {
+ paParms[0].u.uint32 = data.uMsg; /* uMsg */
+ paParms[1].u.uint32 = data.cParms; /* cParms */
+ /* Note: paParms[2] was set by the guest as blocking flag. */
+ }
+ }
+ else
+ rc = VERR_NOT_FOUND;
+
+ if (RT_FAILURE(rc))
+ rc = m_pManager->nextMessage(u32Function, cParms, paParms);
+
+ /* Some error occurred? */
+ if ( RT_FAILURE(rc)
+ && paParms[2].u.uint32) /* Blocking flag set? */
+ {
+ /* Defer client returning. */
+ rc = VINF_HGCM_ASYNC_EXECUTE;
+ }
}
}
break;
}
+ case DragAndDropSvc::GUEST_DND_CONNECT:
+ {
+ LogFlowFunc(("GUEST_DND_CONNECT\n"));
+ if ( cParms != 2
+ || paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* protocol version */
+ || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* additional connection flags */)
+ rc = VERR_INVALID_PARAMETER;
+ else
+ {
+ uint32_t uProtocol;
+ rc = paParms[0].getUInt32(&uProtocol); /* Get protocol version. */
+ if (RT_SUCCESS(rc))
+ rc = pClient->setProtocol(uProtocol);
+ if (RT_SUCCESS(rc))
+ {
+ /** @todo Handle connection flags (paParms[1]). */
+ }
+
+ /* Note: Does not reach the host; the client's protocol version
+ * is only kept in this service. */
+ }
+ break;
+ }
case DragAndDropSvc::GUEST_DND_HG_ACK_OP:
{
LogFlowFunc(("GUEST_DND_HG_ACK_OP\n"));
@@ -280,9 +420,8 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
{
DragAndDropSvc::VBOXDNDCBHGACKOPDATA data;
data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_HG_ACK_OP;
- paParms[0].getUInt32(&data.uAction); /* Get drop action. */
- if (m_pfnHostCallback)
- rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ rc = paParms[0].getUInt32(&data.uAction); /* Get drop action. */
+ DO_HOST_CALLBACK();
}
break;
}
@@ -296,10 +435,29 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
{
DragAndDropSvc::VBOXDNDCBHGREQDATADATA data;
data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_HG_REQ_DATA;
- uint32_t cTmp;
- paParms[0].getPointer((void**)&data.pszFormat, &cTmp);
- if (m_pfnHostCallback)
- rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ rc = paParms[0].getPointer((void**)&data.pszFormat, &data.cbFormat);
+ DO_HOST_CALLBACK();
+ }
+ break;
+ }
+ case DragAndDropSvc::GUEST_DND_HG_EVT_PROGRESS:
+ {
+ LogFlowFunc(("GUEST_DND_HG_EVT_PROGRESS\n"));
+ if ( cParms != 3
+ || paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* status */
+ || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* percent */
+ || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* rc */)
+ rc = VERR_INVALID_PARAMETER;
+ else
+ {
+ DragAndDropSvc::VBOXDNDCBHGEVTPROGRESSDATA data;
+ data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_HG_EVT_PROGRESS;
+ rc = paParms[0].getUInt32(&data.uStatus);
+ if (RT_SUCCESS(rc))
+ rc = paParms[1].getUInt32(&data.uPercentage);
+ if (RT_SUCCESS(rc))
+ rc = paParms[2].getUInt32(&data.rc);
+ DO_HOST_CALLBACK();
}
break;
}
@@ -309,19 +467,19 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
LogFlowFunc(("GUEST_DND_GH_ACK_PENDING\n"));
if ( cParms != 3
|| paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* defaction */
- || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* allactions */
+ || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* alloctions */
|| paParms[2].type != VBOX_HGCM_SVC_PARM_PTR /* format */)
rc = VERR_INVALID_PARAMETER;
else
{
DragAndDropSvc::VBOXDNDCBGHACKPENDINGDATA data;
data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_GH_ACK_PENDING;
- paParms[0].getUInt32(&data.uDefAction);
- paParms[1].getUInt32(&data.uAllActions);
- uint32_t cTmp;
- paParms[2].getPointer((void**)&data.pszFormat, &cTmp);
- if (m_pfnHostCallback)
- rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ rc = paParms[0].getUInt32(&data.uDefAction);
+ if (RT_SUCCESS(rc))
+ rc = paParms[1].getUInt32(&data.uAllActions);
+ if (RT_SUCCESS(rc))
+ rc = paParms[2].getPointer((void**)&data.pszFormat, &data.cbFormat);
+ DO_HOST_CALLBACK();
}
break;
}
@@ -336,10 +494,10 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
{
DragAndDropSvc::VBOXDNDCBSNDDATADATA data;
data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_GH_SND_DATA;
- paParms[0].getPointer((void**)&data.pvData, &data.cbData);
- paParms[1].getUInt32(&data.cbTotalSize);
- if (m_pfnHostCallback)
- rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ rc = paParms[0].getPointer((void**)&data.pvData, &data.cbData);
+ if (RT_SUCCESS(rc))
+ rc = paParms[1].getUInt32(&data.cbTotalSize);
+ DO_HOST_CALLBACK();
}
break;
}
@@ -356,44 +514,112 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
DragAndDropSvc::VBOXDNDCBSNDDIRDATA data;
data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_GH_SND_DIR;
uint32_t cTmp;
- paParms[0].getPointer((void**)&data.pszPath, &cTmp);
- paParms[1].getUInt32(&data.cbPath);
- paParms[2].getUInt32(&data.fMode);
-#ifdef DEBUG_andy
- LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x\n",
- data.pszPath, data.cbPath, data.fMode));
-#endif
- if (m_pfnHostCallback)
- rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ rc = paParms[0].getPointer((void**)&data.pszPath, &cTmp);
+ if (RT_SUCCESS(rc))
+ rc = paParms[1].getUInt32(&data.cbPath);
+ if (RT_SUCCESS(rc))
+ rc = paParms[2].getUInt32(&data.fMode);
+
+ LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x\n", data.pszPath, data.cbPath, data.fMode));
+ DO_HOST_CALLBACK();
}
break;
}
- case DragAndDropSvc::GUEST_DND_GH_SND_FILE:
+ /* Note: Since protocol v2 (>= VBox 5.0). */
+ case DragAndDropSvc::GUEST_DND_GH_SND_FILE_HDR:
{
- LogFlowFunc(("GUEST_DND_GH_SND_FILE\n"));
- if ( cParms != 5
- || paParms[0].type != VBOX_HGCM_SVC_PARM_PTR /* file path */
- || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* file path length */
- || paParms[2].type != VBOX_HGCM_SVC_PARM_PTR /* file data */
- || paParms[3].type != VBOX_HGCM_SVC_PARM_32BIT /* file data length */
- || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT /* creation mode */)
+ LogFlowFunc(("GUEST_DND_GH_SND_FILE_HDR\n"));
+ if ( cParms != 6
+ || paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT /* context ID */
+ || paParms[1].type != VBOX_HGCM_SVC_PARM_PTR /* file path */
+ || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* file path length */
+ || paParms[3].type != VBOX_HGCM_SVC_PARM_32BIT /* flags */
+ || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT /* file mode */
+ || paParms[5].type != VBOX_HGCM_SVC_PARM_64BIT /* file size */)
rc = VERR_INVALID_PARAMETER;
else
{
- DragAndDropSvc::VBOXDNDCBSNDFILEDATA data;
- data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_GH_SND_FILE;
+ DragAndDropSvc::VBOXDNDCBSNDFILEHDRDATA data;
+ data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_GH_SND_FILE_HDR;
uint32_t cTmp;
- paParms[0].getPointer((void**)&data.pszFilePath, &cTmp);
- paParms[1].getUInt32(&data.cbFilePath);
- paParms[2].getPointer((void**)&data.pvData, &data.cbData);
- /* paParms[3] is cbData. */
- paParms[4].getUInt32(&data.fMode);
-#ifdef DEBUG_andy
- LogFlowFunc(("pszFilePath=%s, cbData=%RU32, pvData=0x%p, fMode=0x%x\n",
- data.pszFilePath, data.cbData, data.pvData, data.fMode));
-#endif
- if (m_pfnHostCallback)
- rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ /* paParms[0] is context ID; unused yet. */
+ rc = paParms[1].getPointer((void**)&data.pszFilePath, &cTmp);
+ if (RT_SUCCESS(rc))
+ rc = paParms[2].getUInt32(&data.cbFilePath);
+ if (RT_SUCCESS(rc))
+ rc = paParms[3].getUInt32(&data.fFlags);
+ if (RT_SUCCESS(rc))
+ rc = paParms[4].getUInt32(&data.fMode);
+ if (RT_SUCCESS(rc))
+ rc = paParms[5].getUInt64(&data.cbSize);
+
+ LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x, cbSize=%RU64\n",
+ data.pszFilePath, data.cbFilePath, data.fMode, data.cbSize));
+ DO_HOST_CALLBACK();
+ }
+ break;
+ }
+ case DragAndDropSvc::GUEST_DND_GH_SND_FILE_DATA:
+ {
+ LogFlowFunc(("GUEST_DND_GH_SND_FILE_DATA\n"));
+
+ switch (pClient->protocol())
+ {
+ case 2: /* Protocol version 2 only sends the next data chunks to reduce traffic. */
+ {
+ if ( cParms != 3
+ /* paParms[0] is context ID; unused yet. */
+ || paParms[1].type != VBOX_HGCM_SVC_PARM_PTR /* file data */
+ || paParms[2].type != VBOX_HGCM_SVC_PARM_32BIT /* file data length */)
+ {
+ rc = VERR_INVALID_PARAMETER;
+ }
+ else
+ {
+ DragAndDropSvc::VBOXDNDCBSNDFILEDATADATA data;
+ data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_GH_SND_FILE_DATA;
+ /* paParms[0] is context ID; unused yet. */
+ rc = paParms[1].getPointer((void**)&data.pvData, &data.cbData);
+ if (RT_SUCCESS(rc))
+ rc = paParms[2].getUInt32(&data.cbData);
+
+ LogFlowFunc(("cbData=%RU32, pvData=0x%p\n", data.cbData, data.pvData));
+ DO_HOST_CALLBACK();
+ }
+ break;
+ }
+ default:
+ {
+ if ( cParms != 5
+ || paParms[0].type != VBOX_HGCM_SVC_PARM_PTR /* file path */
+ || paParms[1].type != VBOX_HGCM_SVC_PARM_32BIT /* file path length */
+ || paParms[2].type != VBOX_HGCM_SVC_PARM_PTR /* file data */
+ || paParms[3].type != VBOX_HGCM_SVC_PARM_32BIT /* file data length */
+ || paParms[4].type != VBOX_HGCM_SVC_PARM_32BIT /* creation mode */)
+ {
+ rc = VERR_INVALID_PARAMETER;
+ }
+ else
+ {
+ DragAndDropSvc::VBOXDNDCBSNDFILEDATADATA data;
+ data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_GH_SND_FILE_DATA;
+ uint32_t cTmp;
+ rc = paParms[0].getPointer((void**)&data.u.v1.pszFilePath, &cTmp);
+ if (RT_SUCCESS(rc))
+ rc = paParms[1].getUInt32(&data.u.v1.cbFilePath);
+ if (RT_SUCCESS(rc))
+ rc = paParms[2].getPointer((void**)&data.pvData, &cTmp);
+ if (RT_SUCCESS(rc))
+ rc = paParms[3].getUInt32(&data.cbData);
+ if (RT_SUCCESS(rc))
+ rc = paParms[4].getUInt32(&data.u.v1.fMode);
+
+ LogFlowFunc(("pszFilePath=%s, cbData=%RU32, pvData=0x%p, fMode=0x%x\n",
+ data.u.v1.pszFilePath, data.cbData, data.pvData, data.u.v1.fMode));
+ DO_HOST_CALLBACK();
+ }
+ break;
+ }
}
break;
}
@@ -409,11 +635,11 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_GH_EVT_ERROR;
uint32_t rcOp;
- paParms[0].getUInt32(&rcOp);
- data.rc = rcOp;
+ rc = paParms[0].getUInt32(&rcOp);
+ if (RT_SUCCESS(rc))
+ data.rc = rcOp;
- if (m_pfnHostCallback)
- rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ DO_HOST_CALLBACK();
}
break;
}
@@ -422,14 +648,34 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
{
/* All other messages are handled by the DnD manager. */
rc = m_pManager->nextMessage(u32Function, cParms, paParms);
+ if (rc == VERR_NO_DATA) /* Manager has no new messsages? Try asking the host. */
+ {
+ if (m_pfnHostCallback)
+ {
+ DragAndDropSvc::VBOXDNDCBHGGETNEXTHOSTMSGDATA data;
+ data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_HG_GET_NEXT_HOST_MSG_DATA;
+ data.uMsg = u32Function;
+ data.cParms = cParms;
+ data.paParms = paParms;
+
+ rc = m_pfnHostCallback(m_pvHostData, u32Function, &data, sizeof(data));
+ if (RT_SUCCESS(rc))
+ {
+ cParms = data.cParms;
+ paParms = data.paParms;
+ }
+ }
+ }
break;
}
}
}
- /* If async execution is requested, we didn't notify the guest yet about
+ /*
+ * If async execution is requested, we didn't notify the guest yet about
* completion. The client is queued into the waiters list and will be
- * notified as soon as a new event is available. */
+ * notified as soon as a new event is available.
+ */
if (rc == VINF_HGCM_ASYNC_EXECUTE)
{
m_clientQueue.append(new HGCM::Client(u32ClientID, callHandle,
@@ -448,7 +694,8 @@ void DragAndDropService::guestCall(VBOXHGCMCALLHANDLE callHandle, uint32_t u32Cl
int DragAndDropService::hostCall(uint32_t u32Function,
uint32_t cParms, VBOXHGCMSVCPARM paParms[])
{
- LogFlowFunc(("u32Function=%RU32, cParms=%RU32\n", u32Function, cParms));
+ LogFlowFunc(("u32Function=%RU32, cParms=%RU32, cClients=%zu, cQueue=%zu\n",
+ u32Function, cParms, m_clientMap.size(), m_clientQueue.size()));
int rc;
if (u32Function == DragAndDropSvc::HOST_DND_SET_MODE)
@@ -462,40 +709,52 @@ int DragAndDropService::hostCall(uint32_t u32Function,
}
else if (modeGet() != VBOX_DRAG_AND_DROP_MODE_OFF)
{
- if (!m_clientQueue.isEmpty()) /* At least one client on the guest connected? */
+ if (m_clientMap.size()) /* At least one client on the guest connected? */
{
- rc = m_pManager->addMessage(u32Function, cParms, paParms);
+ rc = m_pManager->addMessage(u32Function, cParms, paParms, true /* fAppend */);
if (RT_SUCCESS(rc))
{
- HGCM::Client *pClient = m_clientQueue.first();
- AssertPtr(pClient);
-
- /* Check if this was a request for getting the next host
- * message. If so, return the message id and the parameter
- * count. The message itself has to be queued. */
- uint32_t uMsg = pClient->message();
- if (uMsg == DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG)
+ if (m_clientQueue.size()) /* Any clients in our queue ready for processing the next command? */
{
- LogFlowFunc(("Client %RU32 is waiting for next host msg\n", pClient->clientId()));
-
- uint32_t uMsg1;
- uint32_t cParms1;
- rc = m_pManager->nextMessageInfo(&uMsg1, &cParms1);
- if (RT_SUCCESS(rc))
+ HGCM::Client *pClient = m_clientQueue.first();
+ AssertPtr(pClient);
+
+ /*
+ * Check if this was a request for getting the next host
+ * message. If so, return the message ID and the parameter
+ * count. The message itself has to be queued.
+ */
+ uint32_t uMsg = pClient->message();
+ if (uMsg == DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG)
{
- pClient->addMessageInfo(uMsg1, cParms1);
- if (m_pHelpers)
- m_pHelpers->pfnCallComplete(pClient->handle(), rc);
-
- m_clientQueue.removeFirst();
- delete pClient;
+ LogFlowFunc(("Client %RU32 is waiting for next host msg\n", pClient->clientId()));
+
+ uint32_t uMsg1;
+ uint32_t cParms1;
+ rc = m_pManager->nextMessageInfo(&uMsg1, &cParms1);
+ if (RT_SUCCESS(rc))
+ {
+ pClient->addMessageInfo(uMsg1, cParms1);
+ if ( m_pHelpers
+ && m_pHelpers->pfnCallComplete)
+ {
+ m_pHelpers->pfnCallComplete(pClient->handle(), rc);
+ }
+
+ m_clientQueue.removeFirst();
+
+ delete pClient;
+ pClient = NULL;
+ }
+ else
+ AssertMsgFailed(("m_pManager::nextMessageInfo failed with rc=%Rrc\n", rc));
}
else
- AssertMsgFailed(("m_pManager::nextMessageInfo failed with rc=%Rrc\n", rc));
+ AssertMsgFailed(("Client ID=%RU32 in wrong state with uMsg=%RU32\n",
+ pClient->clientId(), uMsg));
}
else
- AssertMsgFailed(("Client ID=%RU32 in wrong state with uMsg=%RU32\n",
- pClient->clientId(), uMsg));
+ LogFlowFunc(("All clients busy; delaying execution\n"));
}
else
AssertMsgFailed(("Adding new message of type=%RU32 failed with rc=%Rrc\n",
@@ -503,9 +762,11 @@ int DragAndDropService::hostCall(uint32_t u32Function,
}
else
{
- /* Tell the host that the guest does not support drag'n drop.
+ /*
+ * Tell the host that the guest does not support drag'n drop.
* This might happen due to not installed Guest Additions or
- * not running VBoxTray/VBoxClient. */
+ * not running VBoxTray/VBoxClient.
+ */
rc = VERR_NOT_SUPPORTED;
}
}
@@ -515,11 +776,11 @@ int DragAndDropService::hostCall(uint32_t u32Function,
rc = VERR_ACCESS_DENIED;
}
- LogFlowFunc(("rc=%Rrc\n", rc));
+ LogFlowFuncLeaveRC(rc);
return rc;
}
-DECLCALLBACK(int) DragAndDropService::progressCallback(uint32_t uPercentage, uint32_t uState, int rc, void *pvUser)
+DECLCALLBACK(int) DragAndDropService::progressCallback(uint32_t uStatus, uint32_t uPercentage, int rc, void *pvUser)
{
AssertPtrReturn(pvUser, VERR_INVALID_POINTER);
@@ -528,13 +789,14 @@ DECLCALLBACK(int) DragAndDropService::progressCallback(uint32_t uPercentage, uin
if (pSelf->m_pfnHostCallback)
{
- LogFlowFunc(("GUEST_DND_HG_EVT_PROGRESS: uPercentage=%RU32, uState=%RU32, rc=%Rrc\n",
- uPercentage, uState, rc));
+ LogFlowFunc(("GUEST_DND_HG_EVT_PROGRESS: uStatus=%RU32, uPercentage=%RU32, rc=%Rrc\n",
+ uStatus, uPercentage, rc));
+
DragAndDropSvc::VBOXDNDCBHGEVTPROGRESSDATA data;
data.hdr.u32Magic = DragAndDropSvc::CB_MAGIC_DND_HG_EVT_PROGRESS;
data.uPercentage = RT_MIN(uPercentage, 100);
- data.uState = uState;
- data.rc = rc;
+ data.uStatus = uStatus;
+ data.rc = rc; /** @todo uin32_t vs. int. */
return pSelf->m_pfnHostCallback(pSelf->m_pvHostData,
DragAndDropSvc::GUEST_DND_HG_EVT_PROGRESS,
diff --git a/src/VBox/HostServices/GuestControl/gctrl.cpp b/src/VBox/HostServices/GuestControl/gctrl.cpp
index cdbe920..0a5aaf5 100644
--- a/src/VBox/HostServices/GuestControl/gctrl.cpp
+++ b/src/VBox/HostServices/GuestControl/gctrl.cpp
@@ -58,7 +58,7 @@ int gctrlPrepareExecArgv(char *pszArgs, void **ppvList, uint32_t *pcbList, uint3
{
char **ppaArg;
int iArgs;
- int rc = RTGetOptArgvFromString(&ppaArg, &iArgs, pszArgs, NULL);
+ int rc = RTGetOptArgvFromString(&ppaArg, &iArgs, pszArgs, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, NULL);
if (RT_SUCCESS(rc))
{
char *pszTemp = NULL;
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_dispatch.py b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_dispatch.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_dispatch_header.py b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_dispatch_header.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_get.py b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_get.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_retval.py b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_retval.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/crserverlib/server_simpleget.py b/src/VBox/HostServices/SharedOpenGL/crserverlib/server_simpleget.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/expando/expando.py b/src/VBox/HostServices/SharedOpenGL/expando/expando.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/unpacker/unpack.py b/src/VBox/HostServices/SharedOpenGL/unpacker/unpack.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_extend.py b/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_extend.py
old mode 100755
new mode 100644
diff --git a/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_header.py b/src/VBox/HostServices/SharedOpenGL/unpacker/unpack_header.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Installer/linux/vboxdrv-pardus.py b/src/VBox/Installer/linux/vboxdrv-pardus.py
old mode 100755
new mode 100644
diff --git a/src/VBox/Installer/win/UserInterface.wxi b/src/VBox/Installer/win/UserInterface.wxi
index f3bc1ee..1905851 100644
--- a/src/VBox/Installer/win/UserInterface.wxi
+++ b/src/VBox/Installer/win/UserInterface.wxi
@@ -294,8 +294,15 @@
</Control>
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.ButtonText_Next)">
<?if $(env.VBOX_WITH_QTGUI) = "yes" ?>
+ <!--
+ uncomment next two lines if there is a need in wizard page VBoxSelectionNetworkTypeDlg
+ don't forget to comment one line after
+ -->
+ <!--
<Publish Event="NewDialog" Value="VBoxSelectionNetworkTypeDlg"><![CDATA[VersionNT >= 600]]></Publish>
<Publish Event="NewDialog" Value="VBoxCustomize2Dlg"><![CDATA[VersionNT < 600]]></Publish>
+ -->
+ <Publish Event="NewDialog" Value="VBoxCustomize2Dlg"/>
<?else ?>
<Publish Event="NewDialog" Value="VBoxVerifyReadyDlg">1</Publish>
<?endif ?>
@@ -408,9 +415,15 @@
</Control>
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17"
Text="!(loc.ButtonText_Back)">
+ <!--
+ uncomment next two lines if there is a need in wizard page VBoxSelectionNetworkTypeDlg
+ don't forget to comment one line after
+ -->
+ <!--
<Publish Event="NewDialog" Value="VBoxSelectionNetworkTypeDlg"><![CDATA[VersionNT >= 600]]></Publish>
<Publish Event="NewDialog" Value="VBoxCustomizeDlg"><![CDATA[VersionNT < 600]]></Publish>
-
+ -->
+ <Publish Event="NewDialog" Value="VBoxCustomizeDlg"/>
</Control>
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17"
Text="!(loc.ButtonText_Cancel)">
diff --git a/src/VBox/Main/Makefile.kmk b/src/VBox/Main/Makefile.kmk
index ef755b8..b4e8f51 100644
--- a/src/VBox/Main/Makefile.kmk
+++ b/src/VBox/Main/Makefile.kmk
@@ -4,7 +4,7 @@
#
#
-# Copyright (C) 2004-2014 Oracle Corporation
+# Copyright (C) 2004-2015 Oracle Corporation
#
# This file is part of VirtualBox Open Source Edition (OSE), as
# available from http://www.virtualbox.org. This file is free software;
@@ -282,6 +282,7 @@ VBoxSVC_DEFS = \
$(if $(VBOX_WITH_LINUX_COMPILER_H),VBOX_WITH_LINUX_COMPILER_H,) \
$(if $(VBOX_WITH_RESOURCE_USAGE_API),VBOX_WITH_RESOURCE_USAGE_API,) \
$(if $(VBOX_WITH_PDM_ASYNC_COMPLETION),VBOX_WITH_PDM_ASYNC_COMPLETION,) \
+ $(if $(VBOX_WITH_DBUS),VBOX_WITH_DBUS,) \
$(if $(VBOX_WITH_DBUS),$(if $(VBOX_USB_WITH_DBUS),VBOX_USB_WITH_DBUS,),) \
$(if $(VBOX_USB_WITH_SYSFS),VBOX_USB_WITH_SYSFS,) \
$(if $(VBOX_USB_WITH_INOTIFY),VBOX_USB_WITH_INOTIFY,) \
@@ -429,6 +430,7 @@ VBoxSVC_SOURCES.win = \
VBoxSVC_SOURCES.linux = \
src-server/linux/HostHardwareLinux.cpp \
src-server/linux/HostDnsServiceLinux.cpp \
+ $(if $(VBOX_WITH_DBUS),src-server/linux/HostPowerLinux.cpp) \
src-server/HostDnsServiceResolvConf.cpp
VBoxSVC_SOURCES.solaris = \
@@ -676,6 +678,7 @@ VBoxC_LIBS += \
$(if-expr "$(LIB_VMM)" == "$(VBOX_LIB_VMM_LAZY)",$(LIB_REM),) \
$(VBOX_LIB_VMM_LAZY)
VBoxC_LIBS.win += \
+ $(PATH_SDK_$(VBOX_WINPSDK)_LIB)/psapi.lib \
$(PATH_TOOL_$(VBOX_VCC_TOOL)_LIB)/delayimp.lib
ifdef VBOX_WITH_NETFLT
VBoxC_LIBS.win += \
@@ -738,11 +741,6 @@ VBoxC_SOURCES = \
src-client/DisplaySourceBitmapImpl.cpp \
src-client/EmulatedUSBImpl.cpp \
src-client/GuestImpl.cpp \
- src-client/GuestDirectoryImpl.cpp \
- src-client/GuestFileImpl.cpp \
- src-client/GuestFsObjInfoImpl.cpp \
- src-client/GuestProcessImpl.cpp \
- src-client/GuestSessionImpl.cpp \
src-client/GuestCtrlImpl.cpp \
src-client/KeyboardImpl.cpp \
src-client/MachineDebuggerImpl.cpp \
@@ -771,7 +769,12 @@ VBoxC_SOURCES.win = \
ifdef VBOX_WITH_GUEST_CONTROL
VBoxC_SOURCES += \
src-client/GuestSessionImplTasks.cpp \
- src-client/GuestCtrlPrivate.cpp
+ src-client/GuestCtrlPrivate.cpp \
+ src-client/GuestDirectoryImpl.cpp \
+ src-client/GuestFileImpl.cpp \
+ src-client/GuestFsObjInfoImpl.cpp \
+ src-client/GuestProcessImpl.cpp \
+ src-client/GuestSessionImpl.cpp
endif
ifdef VBOX_WITH_DRAG_AND_DROP
VBoxC_SOURCES += \
diff --git a/src/VBox/Main/cbinding/VBoxCAPIGlue.c b/src/VBox/Main/cbinding/VBoxCAPIGlue.c
index 78f11d0..9ee6ed7 100644
--- a/src/VBox/Main/cbinding/VBoxCAPIGlue.c
+++ b/src/VBox/Main/cbinding/VBoxCAPIGlue.c
@@ -1,4 +1,4 @@
-/* $Revision: 97943 $ */
+/* $Id: VBoxCAPIGlue.c $ */
/** @file
* Glue code for dynamically linking to VBoxCAPI.
*/
diff --git a/src/VBox/Main/cbinding/tstCAPIGlue.c b/src/VBox/Main/cbinding/tstCAPIGlue.c
index 8ed90cd..fcca3cf 100644
--- a/src/VBox/Main/cbinding/tstCAPIGlue.c
+++ b/src/VBox/Main/cbinding/tstCAPIGlue.c
@@ -1,4 +1,4 @@
-/* $Revision: 96182 $ */
+/* $Id: tstCAPIGlue.c $ */
/** @file tstCAPIGlue.c
* Demonstrator program to illustrate use of C bindings of Main API.
*
diff --git a/src/VBox/Main/glue/initterm.cpp b/src/VBox/Main/glue/initterm.cpp
index dbc493c..989c2fb 100644
--- a/src/VBox/Main/glue/initterm.cpp
+++ b/src/VBox/Main/glue/initterm.cpp
@@ -325,7 +325,6 @@ HRESULT Initialize(bool fGui)
/* this is the first initialization */
gXPCOMInitCount = 1;
- bool const fInitEventQueues = true;
/* prepare paths for registry files */
char szCompReg[RTPATH_MAX];
@@ -558,7 +557,7 @@ HRESULT Shutdown()
}
else
{
- isOnMainThread = PR_TRUE;
+ isOnMainThread = RTThreadIsMain(RTThreadSelf());
rc = NS_OK;
}
diff --git a/src/VBox/Main/glue/vboxapi.py b/src/VBox/Main/glue/vboxapi.py
old mode 100755
new mode 100644
index 93d46f0..ce79dca
--- a/src/VBox/Main/glue/vboxapi.py
+++ b/src/VBox/Main/glue/vboxapi.py
@@ -16,7 +16,7 @@ __copyright__ = \
VirtualBox OSE distribution. VirtualBox OSE is distributed in the
hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
"""
-__version__ = "$Revision: 98839 $"
+__version__ = "$Revision: 99962 $"
# Note! To set Python bitness on OSX use 'export VERSIONER_PYTHON_PREFER_32_BIT=yes'
@@ -292,6 +292,19 @@ class PlatformBase(object):
_ = sAttrib
return None
+ def setArray(self, oInterface, sAttrib, aoArray):
+ """
+ Sets the value (aoArray) of the array attribute 'sAttrib' in
+ interface 'oInterface'.
+
+ This is for hiding platform specific differences in attributes
+ setting arrays.
+ """
+ _ = oInterface
+ _ = sAttrib
+ _ = aoArray
+ return None
+
def initPerThread(self):
"""
Does backend specific initialization for the calling thread.
@@ -550,6 +563,9 @@ class PlatformMSCOM(PlatformBase):
def getArray(self, oInterface, sAttrib):
return oInterface.__getattr__(sAttrib)
+ def setArray(self, oInterface, sAttrib, aoArray):
+ return oInterface.__setattr__(sAttrib, aoArray)
+
def initPerThread(self):
import pythoncom
pythoncom.CoInitializeEx(0)
@@ -753,6 +769,9 @@ class PlatformXPCOM(PlatformBase):
def getArray(self, oInterface, sAttrib):
return oInterface.__getattr__('get' + ComifyName(sAttrib))()
+ def setArray(self, oInterface, sAttrib, aoArray):
+ return oInterface.__getattr__('set' + ComifyName(sAttrib))(aoArray)
+
def initPerThread(self):
import xpcom
xpcom._xpcom.AttachThread()
@@ -878,6 +897,9 @@ class PlatformWEBSERVICE(PlatformBase):
def getArray(self, oInterface, sAttrib):
return oInterface.__getattr__(sAttrib)
+ def setArray(self, oInterface, sAttrib, aoArray):
+ return oInterface.__setattr__(sAttrib, aoArray)
+
def waitForEvents(self, timeout):
# Webservices cannot do that yet
return 2
@@ -1039,6 +1061,10 @@ class VirtualBoxManager(object):
""" See PlatformBase::getArray(). """
return self.platform.getArray(oInterface, sAttrib)
+ def setArray(self, oInterface, sAttrib, aoArray):
+ """ See PlatformBase::setArray(). """
+ return self.platform.setArray(oInterface, sAttrib, aoArray)
+
def createListener(self, oImplClass, dArgs=None):
""" See PlatformBase::createListener(). """
return self.platform.createListener(oImplClass, dArgs)
diff --git a/src/VBox/Main/glue/xpcom/helpers.cpp b/src/VBox/Main/glue/xpcom/helpers.cpp
index 53f0ab5..215433d 100644
--- a/src/VBox/Main/glue/xpcom/helpers.cpp
+++ b/src/VBox/Main/glue/xpcom/helpers.cpp
@@ -1,3 +1,4 @@
+/* $Id: helpers.cpp $ */
/** @file
*
* COM helper functions for XPCOM
diff --git a/src/VBox/Main/idl/VirtualBox.xidl b/src/VBox/Main/idl/VirtualBox.xidl
index 85e057c..f77f0ec 100644
--- a/src/VBox/Main/idl/VirtualBox.xidl
+++ b/src/VBox/Main/idl/VirtualBox.xidl
@@ -944,7 +944,7 @@
<enum
name="CPUPropertyType"
- uuid="52bc41f4-a279-45da-88ab-3a1d86fb73eb"
+ uuid="ed4094c1-d00e-483a-93e9-7163549ebd6e"
>
<desc>
Virtual CPU property type. This enumeration represents possible values of the
@@ -960,19 +960,13 @@
is not available, it will not be reported.
</desc>
</const>
- <const name="Synthetic" value="2">
- <desc>
- This setting determines whether VirtualBox will expose a synthetic CPU to the guest to allow
- teleporting between host systems that differ significantly.
- </desc>
- </const>
- <const name="LongMode" value="3">
+ <const name="LongMode" value="2">
<desc>
This setting determines whether VirtualBox will advertise long mode
(i.e. 64-bit guest support) and let the guest enter it.
</desc>
</const>
- <const name="TripleFaultReset" value="4">
+ <const name="TripleFaultReset" value="3">
<desc>
This setting determines whether a triple fault within a guest will trigger an internal
error condition and stop the VM (default) or reset the virtual CPU and continue execution.
@@ -2352,7 +2346,7 @@
<li>With a "HardDisk" device type, the file must be a hard disk image
in one of the formats supported by VirtualBox (see
<link to="ISystemProperties::mediumFormats" />).
- After the storage unit is successfully created and this method succeeds,
+ After the storage unit is successfully created and this method succeeds,
if the medium is a base medium, it
will be added to the <link to="#hardDisks"/> array attribute. </li>
<li>With a "DVD" device type, the file must be an ISO 9960 CD/DVD image.
@@ -2812,25 +2806,6 @@
<const name="WebDav" value="4" />
</enum>
- <enum
- name="VFSFileType"
- uuid="714333cd-44e2-415f-a245-d378fa9b1242"
- >
- <desc>
- File types known by VFSExplorer.
- </desc>
-
- <const name="Unknown" value="1" />
- <const name="Fifo" value="2" />
- <const name="DevChar" value="3" />
- <const name="Directory" value="4" />
- <const name="DevBlock" value="5" />
- <const name="File" value="6" />
- <const name="SymLink" value="7" />
- <const name="Socket" value="8" />
- <const name="WhiteOut" value="9" />
- </enum>
-
<interface
name="IVFSExplorer" extends="$unknown"
uuid="fb220201-2fd3-47e2-a5dc-2c2431d833cc"
@@ -2891,7 +2866,7 @@
</param>
<param name="types" type="unsigned long" safearray="yes" dir="out">
- <desc>The list of types for the entries.</desc>
+ <desc>The list of types for the entries. <link to="FsObjType"/></desc>
</param>
<param name="sizes" type="long long" safearray="yes" dir="out">
@@ -2992,7 +2967,7 @@
<interface
name="IAppliance" extends="$unknown"
- uuid="d9432012-2740-499f-b3b3-0991da3679f3"
+ uuid="a529d52c-cf23-4936-9150-e8a6ce77fdad"
wsmap="managed"
>
<desc>
@@ -3255,7 +3230,20 @@
</desc>
<param name="identifiers" type="wstring" dir="return" safearray="yes">
- The list of password identifiers required on success.
+ The list of password identifiers required for export on success.
+ </param>
+ </method>
+
+ <method name="getMediumIdsForPasswordId">
+ <desc>
+ Returns a list of medium identifiers which use the given password identifier.
+ </desc>
+
+ <param name="passwordId" type="wstring" dir="in">
+ The password identifier to get the medium identifiers for.
+ </param>
+ <param name="identifiers" type="uuid" mod="string" dir="return" safearray="yes">
+ The list of medium identifiers returned on success.
</param>
</method>
@@ -3591,7 +3579,7 @@
<interface
name="IInternalMachineControl" extends="$unknown"
- uuid="f0b3bf6e-c609-4d5e-9fd7-77537a52c31b"
+ uuid="2cfec73b-4447-4ff8-bae5-e4306e6197e8"
internal="yes"
wsmap="suppress"
>
@@ -3818,6 +3806,11 @@
The flags of the property.
</desc>
</param>
+ <param name="notify" type="boolean" dir="return">
+ <desc>
+ Returns if a guest property change notification event should be fired.
+ </desc>
+ </param>
</method>
<method name="lockMedia">
@@ -4061,7 +4054,7 @@
<attribute name="guestAddress" type="long" readonly="yes">
<desc>
- Address of device on the guest.
+ Address of device in the guest.
</desc>
</attribute>
@@ -4176,7 +4169,7 @@
<interface
name="IMachine" extends="$unknown"
- uuid="bfe5287a-5fbc-4ceb-9f0e-7fb317e78681"
+ uuid="701464d0-7284-42e9-b7b3-894cf31536b7"
wsmap="managed"
wrap-hint-server-addinterfaces="IInternalMachineControl"
wrap-hint-server="manualaddinterfaces"
@@ -4393,6 +4386,18 @@
</desc>
</attribute>
+ <attribute name="CPUIDPortabilityLevel" type="unsigned long">
+ <desc>Virtual CPUID portability level, the higher number the fewer newer
+ or vendor specific CPU feature is reported to the guest (via the CPUID
+ instruction). The default level of zero (0) means that all virtualized
+ feautres supported by the host is pass thru to the guest. While the
+ three (3) is currently the level supressing the most features.
+
+ Exactly which of the CPUID features are left out by the VMM at which
+ level is subject to change with each major version.
+ </desc>
+ </attribute>
+
<attribute name="memorySize" type="unsigned long">
<desc>System memory size in megabytes.</desc>
</attribute>
@@ -5139,6 +5144,11 @@
For details on the teleportation progress operation, see
<link to="IConsole::powerUp"/>.
+<!-- TODO/r=bird: What about making @a environment into a smart array? Guess
+this predates our safe array support by a year or so... Dmitry wrote the text here, right?
+Just rename it to @a environmentChanges and shorten the documentation to say the string
+are applied onto the server environment putenv style, i.e. "VAR=VALUE" for setting/replacing
+and "VAR" for unsetting. -->
The @a environment argument is a string containing definitions of
environment variables in the following format:
<pre>
@@ -9891,7 +9901,7 @@
<const name="Locked" value="3">
<desc>A guest user has locked its account. This might
include running a password-protected screensaver
- on the guest.
+ in the guest.
<note>This property is not implemented yet!</note>
</desc>
</const>
@@ -9914,7 +9924,7 @@
reporting contiguous idle times up to 49.7 days per user.</note>
The event will be triggered if a guest user is not active for
at least 5 seconds. This threshold can be adjusted by either altering
- VBoxService's command line on the guest to
+ VBoxService's command line in the guest to
<pre>--vminfo-user-idle-threshold <ms></pre>
, or by setting the per-VM guest property
<pre>/VirtualBox/GuestAdd/VBoxService/--vminfo-user-idle-threshold <ms></pre>
@@ -9975,19 +9985,23 @@
</enum>
<enum
- name="FileSeekType"
- uuid="1b73f4f3-3515-4073-a506-76878d9e2541"
+ name="FileSeekOrigin"
+ uuid="ad32f789-4279-4530-979c-f16892e1c263"
>
<desc>
- File seeking types.
+ What a file seek (<link to="IFile::seek"/>) is relative to.
</desc>
- <const name="Set" value="0">
- <desc>Seek from the start of the file.</desc>
+ <const name="Begin" value="0">
+ <desc>Seek from the beginning of the file.</desc>
</const>
<const name="Current" value="1">
<desc>Seek from the current file position.</desc>
</const>
+ <const name="End" value="2">
+ <desc>Seek relative to the end of the file. To seek to the position two
+ bytes from the end of the file, specify -2 as the seek offset.</desc>
+ </const>
</enum>
<enum
@@ -10060,7 +10074,7 @@
To wait for a guest process to terminate after it has been
created by <link to="IGuestSession::processCreate"/> or <link to="IGuestSession::processCreateEx"/>
- one would specify ProcessWaitResult_Terminate.
+ one would specify ProcessWaitFor_Terminate.
If a guest process has been started with ProcessCreateFlag_WaitForStdOut
a client can wait with ProcessWaitResult_StdOut for new data to arrive on
@@ -10088,15 +10102,12 @@
</const>
<const name="Timeout" value="5">
<desc>
- The waiting operation timed out. This also will happen
- when no event has been occurred matching the
- current waiting flags in a <link to="IProcess::waitFor"/> call.
+ The waiting operation timed out. Also use if the guest process has
+ timed out in the guest side (kill attempted).
</desc>
</const>
<const name="StdIn" value="6">
- <desc>
- The process signalled that stdin became available for writing
- and that the process awaits input now.</desc>
+ <desc>The process signalled that stdin became available for writing.</desc>
</const>
<const name="StdOut" value="7">
<desc>Data on stdout became available for reading.</desc>
@@ -10113,26 +10124,67 @@
</enum>
<enum
- name="CopyFileFlag"
- uuid="23f79fdf-738a-493d-b80b-42d607c9b916"
+ name="FileCopyFlag"
+ uuid="791909d7-4c64-2fa4-4303-adb10658d347"
>
<desc>
File copying flags.
+ <note>Not flags are implemented yet.</note>
</desc>
<const name="None" value="0">
<desc>No flag set.</desc>
</const>
- <const name="Recursive" value="1">
- <desc>Copy directories recursively.
- This flag is not implemented yet.</desc>
+ <const name="NoReplace" value="1">
+ <!-- Would make more sense to not replace by default, however we the GAs
+ only supports replacing as of writing, so we currently have no choice. -->
+ <desc>
+ Do not replace the destination file if it exists.
+ <note>This flag is not implemented yet.</note>
+ </desc>
</const>
- <const name="Update" value="2">
- <desc>Only copy when the source file is newer than the destination file
- or when the destination file is missing. This flag is not implemented
- yet.</desc>
+ <const name="FollowLinks" value="2">
+ <desc>
+ Follow symbolic links.
+ <note>This flag is not implemented yet.</note>
+ </desc>
</const>
- <const name="FollowLinks" value="4">
- <desc>Follow symbolic links. This flag is not implemented yet.</desc>
+ <const name="Update" value="4">
+ <desc>
+ Only copy when the source file is newer than the destination file
+ or when the destination file is missing.
+ <note>This flag is not implemented yet.</note>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FsObjMoveFlags"
+ uuid="98fdd11f-4063-ac60-5737-e49092aab95f"
+ >
+ <desc>
+ File moving flags.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="Replace" value="1">
+ <desc>
+ Replace the destination file, symlink, etc if it exists, however this
+ does not allow replacing any directories.
+ </desc>
+ </const>
+ <const name="FollowLinks" value="2">
+ <desc>
+ Follow symbolic links in the final components or not (only applied to
+ the given source and target paths, not to anything else).
+ </desc>
+ </const>
+ <const name="AllowDirectoryMoves" value="4">
+ <desc>
+ Allow moving directories accross file system boundraries. Because it
+ is could be a big undertaking, we require extra assurance that we
+ should do it when requested.
+ </desc>
</const>
</enum>
@@ -10152,11 +10204,33 @@
</enum>
<enum
+ name="DirectoryCopyFlags"
+ uuid="cc500f0c-4a54-88c9-56b3-7e9310416da7"
+ >
+ <desc>
+ Directory copying flags.
+ <note>Not flags are implemented yet.</note>
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ <const name="CopyIntoExisting" value="1">
+ <desc>Allow copying into an existing destination directory.</desc>
+ </const>
+ <!-- Later, basically have to see what cp and xcopy offers. -->
+ </enum>
+
+ <enum
name="DirectoryRemoveRecFlag"
uuid="455aabf0-7692-48f6-9061-f21579b65769"
>
<desc>
Directory recursive removement flags.
+ <note>
+ WARNING!! THE FLAGS ARE CURRENTLY IGNORED. THE METHOD APPLIES
+ <link to="DirectoryRemoveRecFlag_ContentAndDir"/> REGARDLESS
+ OF THE INPUT.
+ </note>
</desc>
<const name="None" value="0">
@@ -10171,33 +10245,32 @@
</enum>
<enum
- name="PathRenameFlag"
- uuid="f3baa09f-c758-453d-b91c-c7787d76351d"
+ name="FsObjRenameFlag"
+ uuid="59bbf3a1-4e23-d7cf-05d5-ccae32080ed2"
>
<desc>
- Path renaming flags.
+ Flags for use when renaming file system objects (files, directories,
+ symlink, etc), see <link to="IGuestSession::fsObjRename"/>.
</desc>
- <const name="None" value="0">
- <desc>No flag set.</desc>
+ <const name="NoReplace" value="0">
+ <desc>Do not replace any destination object.</desc>
</const>
- <const name="NoReplace" value="1">
- <desc>Do not replace anything.</desc>
- </const>
- <const name="Replace" value="2">
- <desc>This will replace attempt any target which isn't a directory.</desc>
- </const>
- <const name="NoSymlinks" value="4">
- <desc>Don't allow symbolic links as part of the path.</desc>
+ <const name="Replace" value="1">
+ <desc>This will attempt to replace any destination object other except
+ directories. (The default is to fail if the destination exists.)</desc>
</const>
</enum>
<enum
name="ProcessCreateFlag"
- uuid="35192799-bfde-405d-9bea-c735ab9998e4"
+ uuid="be8c8dbd-4a76-e9ac-20df-468e86edf383"
>
<desc>
Guest process execution flags.
+ <note>The values are passed to the guest additions, so its not possible
+ to change (move) or reuse values.here. See EXECUTEPROCESSFLAG_XXX
+ in GuestControlSvc.h.</note>
</desc>
<const name="None" value="0">
@@ -10223,7 +10296,20 @@
<desc>The guest process waits until all data from stderr is read out.</desc>
</const>
<const name="ExpandArguments" value="64">
- <desc>Expands environment variables in process arguments.</desc>
+ <desc>Expands environment variables in process arguments.
+ <note>
+ This is not yet implemented and is currently silently ignored.
+ We will document the protocolVersion number for this feature once it
+ appears, so don't use it till then.
+ </note>
+ </desc>
+ </const>
+ <const name="UnquotedArguments" value="128">
+ <desc>Work around for Windows and OS/2 applications not following normal
+ argument quoting and escaping rules. The arguments are passed to the
+ application without any extra quoting, just a single space between each.
+ <note>Present since VirtualBox 4.3.28 and 5.0 beta 3.</note>
+ </desc>
</const>
</enum>
@@ -10248,7 +10334,8 @@
uuid="37794668-f8f1-4714-98a5-6f8fa2ed0118"
>
<desc>
- Symbolic link types.
+ Symbolic link types. This is significant when creating links on the
+ Windows platform, ignored elsewhere.
</desc>
<const name="Unknown" value="0">
@@ -10258,7 +10345,7 @@
<desc>The link targets a directory.</desc>
</const>
<const name="File" value="2">
- <desc>The link targets a file (or whatever else).</desc>
+ <desc>The link targets a file (or whatever else except directories).</desc>
</const>
</enum>
@@ -10350,6 +10437,145 @@
</enum>
<enum
+ name="PathStyle"
+ uuid="97303a5b-42e8-0a55-d16f-d2a92c295261"
+ >
+ <desc>
+ The path style of a system.
+ (Values matches the RTPATH_STR_F_STYLE_XXX defines in iprt/path.h!)
+ </desc>
+ <const name="DOS" value="1">
+ <desc>DOS-style paths with forward and backward slashes, drive
+ letters and UNC. Known from DOS, OS/2 and Windows.</desc>
+ </const>
+ <const name="UNIX" value="2">
+ <desc>UNIX-style paths with forward slashes only.</desc>
+ </const>
+ <const name="Unknown" value="8">
+ <desc>
+ The path style is not known, most likely because the guest additions
+ aren't active yet.
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileAccessMode"
+ uuid="231a578f-47fb-ea30-3b3e-8489558227f0"
+ >
+ <desc>
+ File open access mode for use with <link to="IGuestSession::fileOpen"/>
+ and <link to="IGuestSession::fileOpenEx"/>.
+ </desc>
+ <const name="ReadOnly" value="1">
+ <desc>Open the file only with read access.</desc>
+ </const>
+ <const name="WriteOnly" value="2">
+ <desc>Open the file only with write access.</desc>
+ </const>
+ <const name="ReadWrite" value="3">
+ <desc>Open the file with both read and write access.</desc>
+ </const>
+ <const name="AppendOnly" value="4">
+ <desc>Open the file for appending only, no read or seek access.
+ <note>Not yet implemented.</note>
+ </desc>
+ </const>
+ <const name="AppendRead" value="5">
+ <desc>Open the file for appending and read. Writes always goes to the
+ end of the file while reads are done at the current or specified file
+ position.
+ <note>Not yet implemented.</note>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileOpenAction"
+ uuid="12bc97e2-4fc6-a8b4-4f84-0cbf4ab970d2"
+ >
+ <desc>
+ What action <link to="IGuestSession::fileOpen"/> and <link to="IGuestSession::fileOpenEx"/>
+ should take whether the file being opened exists or not.
+ </desc>
+ <const name="OpenExisting" value="1">
+ <desc>Opens an existing file, fails if no file exists. (Was "oe".)</desc>
+ </const>
+ <const name="OpenOrCreate" value="2">
+ <desc>Opens an existing file, creates a new one if no file exists. (Was "oc".)</desc>
+ </const>
+ <const name="CreateNew" value="3">
+ <desc>Creates a new file is no file exists, fails if there is a file there already. (Was "ce".)</desc>
+ </const>
+ <const name="CreateOrReplace" value="4">
+ <desc>
+ Creates a new file, replace any existing file. (Was "ca".)
+ <note>
+ Currently undefined whether we will inherit mode and ACLs from the
+ existing file or replace them.
+ </note>
+ </desc>
+ </const>
+ <const name="OpenExistingTruncated" value="5">
+ <desc>Opens and truncate an existing file, fails if no file exists. (Was "ot".)</desc>
+ </const>
+ <const name="AppendOrCreate" value="99">
+ <desc>Opens an existing file and places the file pointer at the end of
+ the file, creates the file if it does not exist. This action implies
+ write access. (Was "oa".)
+ <note>
+ <!-- @todo r=bird: See iprt/file.h, RTFILE_O_APPEND - not an action/disposition!
+ Moving the file pointer to the end, is almost fine, but impliying 'write' access
+ isn't. That is something that is exclusively reserved for the opening mode. -->
+ Deprecated. Only here for historical reasons. Do not use!
+ </note>
+ </desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileSharingMode"
+ uuid="f87dfe58-425b-c5ba-7d6d-22adeea25de1"
+ >
+ <desc>
+ File sharing mode for <link to="IGuestSession::fileOpenEx"/>.
+ </desc>
+ <const name="Read" value="1">
+ <desc>Only share read access to the file.</desc>
+ </const>
+ <const name="Write" value="2">
+ <desc>Only share write access to the file.</desc>
+ </const>
+ <const name="ReadWrite" value="3">
+ <desc>Share both read and write access to the file, but deny deletion.</desc>
+ </const>
+ <const name="Delete" value="4">
+ <desc>Only share delete access, denying read and write.</desc>
+ </const>
+ <const name="ReadDelete" value="5">
+ <desc>Share read and delete access to the file, denying writing.</desc>
+ </const>
+ <const name="WriteDelete" value="6">
+ <desc>Share write and delete access to the file, denying reading.</desc>
+ </const>
+ <const name="All" value="7">
+ <desc>Share all access, i.e. read, write and delete, to the file.</desc>
+ </const>
+ </enum>
+
+ <enum
+ name="FileOpenExFlags"
+ uuid="9d62017b-ddd3-4e5a-a08e-14d1c23bbac1"
+ >
+ <desc>
+ Open flags for <link to="IGuestSession::fileOpenEx"/>.
+ </desc>
+ <const name="None" value="0">
+ <desc>No flag set.</desc>
+ </const>
+ </enum>
+
+ <enum
name="FileStatus"
uuid="8c86468b-b97b-4080-8914-e29f5b0abd2c"
>
@@ -10382,38 +10608,39 @@
<enum
name="FsObjType"
- uuid="a1ed437c-b3c3-4ca2-b19c-4239d658d5e8"
+ uuid="34a0d1aa-491e-e209-e150-84964d6cee5f"
>
<desc>
- File system object type.
+ File system object (file) types.
</desc>
-
- <const name="Undefined" value="0">
- <desc>Type is undefined / unknown.</desc>
+ <const name="Unknown" value="1">
+ <desc>Used either if the object has type that is not in this enum, or
+ if the type has not yet been determined or set.</desc>
</const>
- <const name="FIFO" value="1">
- <desc>Named pipe.</desc>
+ <const name="Fifo" value="2">
+ <desc>FIFO or named pipe, depending on the platform/terminology.</desc>
</const>
- <const name="DevChar" value="10">
+ <const name="DevChar" value="3">
<desc>Character device.</desc>
</const>
- <const name="DevBlock" value="11">
- <desc>Block device.</desc>
- </const>
- <const name="Directory" value="50">
+ <const name="Directory" value="4">
<desc>Directory.</desc>
</const>
- <const name="File" value="80">
- <desc>File.</desc>
+ <const name="DevBlock" value="5">
+ <desc>Block device.</desc>
+ </const>
+ <const name="File" value="6">
+ <desc>Regular file.</desc>
</const>
- <const name="Symlink" value="100">
- <desc>Symlink.</desc>
+ <const name="Symlink" value="7">
+ <desc>Symbolic link.</desc>
</const>
- <const name="Socket" value="200">
+ <const name="Socket" value="8">
<desc>Socket.</desc>
</const>
- <const name="Whiteout" value="400">
- <desc>Whiteout.</desc>
+ <const name="WhiteOut" value="9">
+ <desc>A white-out file. Found in union mounts where it is used for
+ hiding files after deletion, I think. </desc>
</const>
</enum>
@@ -10455,15 +10682,25 @@
<const name="NoSymlinks" value="1">
<desc>Don't allow symbolic links as part of the path.</desc>
</const>
+<!-- r=bird: need a "NoFollowSymlinks" value here. IPRT probably needs that too. -->
</enum>
<interface
name="IDnDBase" extends="$unknown"
- uuid="b15cf9ca-4078-4786-a1be-af773a36e19f"
+ uuid="a9630a67-7238-4b0e-9a58-364b1dd3d032"
wsmap="managed"
>
<desc>Base abstract interface for drag'n drop.</desc>
+ <attribute name="formats" type="wstring" safearray="yes" readonly="yes">
+ <desc>Returns all supported drag'n drop formats.</desc>
+ </attribute>
+
+ <attribute name="protocolVersion" type="unsigned long" readonly="yes">
+ <desc>Returns the protocol version which is used to communicate
+ with the guest.</desc>
+ </attribute>
+
<method name="isFormatSupported" >
<desc>
Checks if a specific drag'n drop MIME / Content-type format is supported.
@@ -10494,10 +10731,6 @@
</param>
</method>
- <attribute name="formats" type="wstring" safearray="yes" readonly="yes">
- <desc>Returns all supported drag'n drop formats.</desc>
- </attribute>
-
</interface>
<interface
@@ -10570,19 +10803,19 @@
<interface
name="IGuestDnDSource" extends="IDnDSource"
- uuid="280955c0-de67-4297-8179-6274a82a2fc0"
+ uuid="dedfb5d9-4c1b-edf7-fdf3-c1be6827dc28"
wsmap="managed"
>
-
<desc>
Implementation of the <link to="IDnDSource" /> object
for source drag'n drop operations on the guest.
</desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
name="IDnDTarget" extends="IDnDBase"
- uuid="2366c45c-4633-41a1-9fa6-0ef9f244434c"
+ uuid="25ac16fa-316d-4934-9a7f-fe02f6739bef"
wsmap="managed"
>
<desc>Abstract interface for handling drag'n drop targets.</desc>
@@ -10699,7 +10932,7 @@
<method name="sendData">
<desc>
- Sends data to the target.
+ Initiates sending data to the target.
<result name="VBOX_E_VM_ERROR">
VMM device is not available.
@@ -10720,6 +10953,22 @@
</param>
</method>
+ <method name="cancel">
+ <desc>
+ Requests cancelling the current operation. The target can veto
+ the request in case the operation is not cancelable at the moment.
+
+ <result name="VBOX_E_VM_ERROR">
+ VMM device is not available.
+ </result>
+
+ </desc>
+
+ <param name="veto" type="boolean" dir="return">
+ <desc>Whether the target has vetoed cancelling the operation.</desc>
+ </param>
+ </method>
+
</interface>
<interface
@@ -10727,51 +10976,69 @@
uuid="50ce4b51-0ff7-46b7-a138-3c6e5ac946b4"
wsmap="managed"
>
-
<desc>
Implementation of the <link to="IDnDTarget" /> object
for target drag'n drop operations on the guest.
</desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
name="IGuestSession" extends="$unknown"
- uuid="5b28703c-07b6-4fcb-afba-ac199b309752"
+ uuid="3cbf62cf-c9cd-48c6-9623-d1dbe54ca557"
wsmap="managed"
>
<desc>
- A guest session represents one impersonated user account on the guest, so
+ A guest session represents one impersonated user account in the guest, so
every operation will use the same credentials specified when creating
the session object via <link to="IGuest::createSession"/>.
There can be a maximum of 32 sessions at once per VM, whereas session 0
- is reserved for the root session. This root session is controlling all
- other guest sessions and also is responsible for actions which require
- system level privileges. Each guest session keeps track of its started
- guest processes, opened guest files or guest directories.
- To work on guest files or directories a guest session offers methods to open
- or create such objects (see <link to="IGuestSession::fileOpen"/> or
- <link to="IGuestSession::directoryOpen"/> for example).
+ is reserved for the root session.
+<!-- r=bird: Is the root session part of the maximum of 32?? Not really clear. -->
+ This root session is controlling all other guest sessions and also is
+ responsible for actions which require system level privileges.
+
+ Each guest session keeps track of the guest directories and files that
+ it opened as well as guest processes it has created. To work on guest
+ files or directories a guest session offers methods to open or create
+ such objects (see <link to="IGuestSession::fileOpen"/> or
+ <link to="IGuestSession::directoryOpen"/> for instance). Similarly,
+ there a methods for creating guest processes.
+
+ There can be up to 2048 objects (guest processes, files and directories)
+ a time per guest session. Exceeding the limit will result in an error.
+<!-- @todo r=bird: Add specific VBOX_E_XXX error for this and document it here! -->
When done with either of these objects, including the guest session itself,
use the appropriate close() method to let the object do its cleanup work.
- Every guest session has its own environment variable block which gets
- automatically applied when starting a new guest process via
- <link to="IGuestSession::processCreate"/> or <link to="IGuestSession::processCreateEx"/>.
- To override (or unset) certain environment variables already set by the
- guest session, one can specify a per-process environment block when using
- one of the both above mentioned process creation calls.
+ Closing a session via <link to="IGuestSession::close" /> will try to close
+ all the mentioned objects above unless these objects are still used by
+ a client.
+
+ A set of environment variables changes is associated with each session
+ (<link to="IGuestSession::environmentChanges"/>). These are applied to
+ the base environment of the impersonated guest user when creating a new
+ guest process. For additional flexibility the <link to="IGuestSession::processCreate"/>
+ and <link to="IGuestSession::processCreateEx"/> methods allows you to
+ specify individual environment changes for each process you create.
+ With newer guest addition versions, the base environment is also made
+ available via <link to="IGuestSession::environmentBase"/>. (One reason
+ for why we record changes to a base environment instead of working
+ directly on an environment block is that we need to be compatible
+ with older guest additions. Another reason is that this way it is always
+ possible to undo all the changes you've scheduled.)
</desc>
<attribute name="user" type="wstring" readonly="yes">
<desc>Returns the user name used by this session to impersonate
- users on the guest.
+ users in the guest.
</desc>
</attribute>
<attribute name="domain" type="wstring" readonly="yes">
<desc>Returns the domain name used by this session to impersonate
- users on the guest.
+ users in the guest.
</desc>
</attribute>
<attribute name="name" type="wstring" readonly="yes">
@@ -10782,9 +11049,10 @@
</attribute>
<attribute name="timeout" type="unsigned long">
<desc>
+<!-- r=bird: Using 'Returns' for writable attributes is misleading. -->
Returns the session timeout (in ms).
<result name="E_NOTIMPL">
- The method is not implemented yet.
+ This attribute is not implemented yet.
</result>
</desc>
</attribute>
@@ -10795,9 +11063,34 @@
<attribute name="status" type="GuestSessionStatus" readonly="yes">
<desc>Returns the current session status.</desc>
</attribute>
- <attribute name="environment" type="wstring" safearray="yes">
+ <attribute name="environmentChanges" type="wstring" safearray="yes">
<desc>
- Returns the current session environment.
+ The set of scheduled environment changes to the base environment of the
+ session. They are in putenv format, i.e. "VAR=VALUE" for setting and
+ "VAR" for unsetting. One entry per variable (change). The changes are
+ applied when creating new guest processes.
+
+ This is writable, so to undo all the scheduled changes, assign it an
+ empty array.
+ </desc>
+ </attribute>
+ <attribute name="environmentBase" type="wstring" safearray="yes" readonly="yes">
+ <desc>
+ The base environment of the session. They are on the "VAR=VALUE" form,
+ one array entry per variable.
+ <!-- @todo/TODO/FIXME: This doesn't end up in the PDF.
+ <result name="VBOX_E_NOT_SUPPORTED">If the guest additions does not
+ support the session base environment feature. Support for this was
+ introduced with protocol version XXX.</result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">If the guest additions has
+ yet to report the session base environment.</result> -->
+
+ Access fails with VBOX_E_NOT_SUPPORTED if the guest additions does not
+ support the session base environment feature. Support for this was
+ introduced with protocol version XXXX.
+
+ Access fails with VBOX_E_INVALID_OBJECT_STATE if the guest additions
+ has yet to report the session base environment.
</desc>
</attribute>
<attribute name="processes" type="IGuestProcess" readonly="yes" safearray="yes">
@@ -10805,6 +11098,20 @@
Returns all current guest processes.
</desc>
</attribute>
+ <attribute name="pathStyle" type="PathStyle" readonly="yes">
+ <desc>
+ The style of paths used by the guest. Handy for giving the right kind
+ of path specifications to <link to="IGuestSession::fileOpen"/> and similar methods.
+ </desc>
+ </attribute>
+ <attribute name="currentDirectory" type="wstring">
+ <desc>
+ The current directory of the session. Guest path style.
+ <result name="E_NOTIMPL">
+ This attribute is not implemented yet.
+ </result>
+ </desc>
+ </attribute>
<attribute name="directories" type="IGuestDirectory" readonly="yes" safearray="yes">
<desc>
Returns all currently opened guest directories.
@@ -10826,76 +11133,113 @@
Closes this session. All opened guest directories, files and
processes which are not referenced by clients anymore will be
closed. Guest processes which fall into this category and still
- are running on the guest will be terminated automatically.
+ are running in the guest will be terminated automatically.
</desc>
</method>
- <method name="copyFrom">
+ <!-- Directory related methods. -->
+
+ <method name="directoryCopy">
<desc>
- Copies a file from guest to the host.
+ Recursively copies a directory from one guest location to another.
- <result name="VBOX_E_IPRT_ERROR">
- Error starting the copy operation.
+ <result name="E_NOTIMPL">
+ Not yet implemented.
</result>
</desc>
<param name="source" type="wstring" dir="in">
- <desc>Source file on the guest to copy to the host.</desc>
+ <desc>The path to the directory to copy (in the guest). Guest path style.</desc>
</param>
- <param name="dest" type="wstring" dir="in">
- <desc>Destination file name on the host.</desc>
+ <param name="destination" type="wstring" dir="in">
+ <desc>The path to the target directory (in the guest). Unless the
+ <link to="DirectoryCopyFlags::CopyIntoExisting"/> flag is given, the
+ directory shall not already exist. Guest path style.</desc>
</param>
- <param name="flags" type="CopyFileFlag" dir="in" safearray="yes">
- <desc>Copy flags; see <link to="CopyFileFlag"/> for more information.</desc>
+ <param name="flags" type="DirectoryCopyFlags" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryCopyFlags"/> values.</desc>
</param>
<param name="progress" type="IProgress" dir="return">
- <desc>Progress object to track the operation completion.</desc>
+ <desc>Progress object to track the operation to completion.</desc>
</param>
</method>
- <method name="copyTo">
+ <method name="directoryCopyFromGuest">
<desc>
- Copies a file from host to the guest.
+ Recursively copies a directory from the guest to the host.
- <result name="VBOX_E_IPRT_ERROR">
- Error starting the copy operation.
+ <result name="E_NOTIMPL">
+ Not yet implemented.
</result>
</desc>
<param name="source" type="wstring" dir="in">
- <desc>Source file on the host to copy to the guest.</desc>
+ <desc>Path to the directory on the guest side that should be copied to
+ the host. Guest path style.</desc>
</param>
- <param name="dest" type="wstring" dir="in">
- <desc>Destination file name on the guest.</desc>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the directory on the host. Unless the
+ <link to="DirectoryCopyFlags::CopyIntoExisting"/> flag is given, the
+ directory shall not already exist. Host path style.</desc>
</param>
- <param name="flags" type="CopyFileFlag" dir="in" safearray="yes">
- <desc>Copy flags; see <link to="CopyFileFlag"/> for more information.</desc>
+ <param name="flags" type="DirectoryCopyFlags" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryCopyFlags"/> values.</desc>
</param>
<param name="progress" type="IProgress" dir="return">
- <desc>Progress object to track the operation completion.</desc>
+ <desc>Progress object to track the operation to completion.</desc>
+ </param>
+ </method>
+
+ <method name="directoryCopyToGuest">
+ <desc>
+ Recursively copies a directory from the host to the guest.
+
+ <result name="E_NOTIMPL">
+ Not yet implemented.
+ </result>
+ </desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>Path to the directory on the host side that should be copied to
+ the guest. Host path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the file in the guest. Unless the
+ <link to="DirectoryCopyFlags::CopyIntoExisting"/> flag is given, the
+ directory shall not already exist. Guest style path.</desc>
+ </param>
+ <param name="flags" type="DirectoryCopyFlags" dir="in" safearray="yes">
+ <desc>Zero or more <link to="DirectoryCopyFlags"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
</param>
</method>
<method name="directoryCreate">
<desc>
- Create a directory on the guest.
+ Creates a directory in the guest.
<result name="VBOX_E_IPRT_ERROR">
Error while creating the directory.
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>Full path of directory to create.</desc>
+ <desc>Path to the directory directory to be created. Guest path style.</desc>
</param>
<param name="mode" type="unsigned long" dir="in">
- <desc>File creation mode.</desc>
+ <desc>
+ The UNIX-style access mode mask to create the directory with.
+ Whether/how all three access groups and associated access rights are
+ realized is guest OS dependent. The API does the best it can on each
+ OS.
+ </desc>
</param>
<param name="flags" type="DirectoryCreateFlag" dir="in" safearray="yes">
- <desc>Creation flags; see <link to="DirectoryCreateFlag"/> for more information.</desc>
+ <desc>Zero or more <link to="DirectoryCreateFlag"/> flags.</desc>
</param>
</method>
<method name="directoryCreateTemp">
<desc>
- Create a temporary directory on the guest.
+ Creates a temporary directory in the guest.
<result name="VBOX_E_NOT_SUPPORTED">
The operation is not possible as requested on this particular
@@ -10918,36 +11262,53 @@
alphanumeric string to produce a unique name.</desc>
</param>
<param name="mode" type="unsigned long" dir="in">
- <desc>The mode of the directory to create. Use 0700 unless there are
- reasons not to. This parameter is ignored if "secure" is specified.
- </desc>
+ <desc>
+ The UNIX-style access mode mask to create the directory with.
+ Whether/how all three access groups and associated access rights are
+ realized is guest OS dependent. The API does the best it can on each
+ OS.
+
+ This parameter is ignore if the @a secure parameter is set to @c true.
+ <note>It is strongly recommended to use 0700.</note>
+ </desc>
</param>
<param name="path" type="wstring" dir="in">
- <desc>The absolute path to create the temporary directory in.</desc>
+ <desc>The path to the directory in which the temporary directory should
+ be created. Guest path style.</desc>
</param>
<param name="secure" type="boolean" dir="in">
- <desc>Whether to fail if the directory can not be securely created.
+ <desc>
+ Whether to fail if the directory can not be securely created.
Currently this means that another unprivileged user cannot
manipulate the path specified or remove the temporary directory
after it has been created. Also causes the mode specified to be
- ignored. May not be supported on all guest types.</desc>
+ ignored. May not be supported on all guest types.
+ </desc>
</param>
<param name="directory" type="wstring" dir="return">
- <desc>On success this will contain the name of the directory created
- with full path.</desc>
+ <desc>On success this will contain the full path to the created
+ directory. Guest path style.</desc>
</param>
</method>
<method name="directoryExists">
<desc>
- Checks whether a directory exists on the guest or not.
+ Checks whether a directory exists in the guest or not.
<result name="VBOX_E_IPRT_ERROR">
Error while checking existence of the directory specified.
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>Directory to check existence for.</desc>
+ <desc>Path to the directory to check if exists. Guest path style.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ If @c true, symbolic links in the final component will be followed
+ and the existance of the symlink target made the question for this method.
+ If @c false, a symbolic link in the final component will make the
+ method return @c false (because a symlink isn't a directory).
+ </desc>
</param>
<param name="exists" type="boolean" dir="return">
<desc>Returns @c true if the directory exists, @c false if not.</desc>
@@ -10956,8 +11317,11 @@
<method name="directoryOpen">
<desc>
- Opens a directory and creates a <link to="IGuestDirectory"/> object that
- can be used for further operations.
+ Opens a directory in the guest and creates a <link to="IGuestDirectory"/>
+ object that can be used for further operations.
+
+ <note>This method follows symbolic links by default at the moment, this
+ may change in the future.</note>
<result name="VBOX_E_OBJECT_NOT_FOUND">
Directory to open was not found.
@@ -10967,56 +11331,59 @@
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>Full path to file to open.</desc>
+ <desc>Path to the directory to open. Guest path style.</desc>
</param>
<param name="filter" type="wstring" dir="in">
- <desc>Open filter to apply. This can include wildcards like ? and *.</desc>
+ <desc>Optional directory listing filter to apply. This uses the DOS/NT
+ style wildcard characters '?' and '*'.</desc>
</param>
<param name="flags" type="DirectoryOpenFlag" dir="in" safearray="yes">
- <desc>Open flags; see <link to="DirectoryOpenFlag"/> for more information.</desc>
+ <desc>Zero or more <link to="DirectoryOpenFlag"/> flags.</desc>
</param>
<param name="directory" type="IGuestDirectory" dir="return">
<desc><link to="IGuestDirectory"/> object containing the opened directory.</desc>
</param>
</method>
- <method name="directoryQueryInfo">
- <desc>
- Queries information of a directory on the guest.
-
- <result name="VBOX_E_OBJECT_NOT_FOUND">
- Directory to query information for was not found.
- </result>
- <result name="VBOX_E_IPRT_ERROR">
- Error querying information.
- </result>
- </desc>
- <param name="path" type="wstring" dir="in">
- <desc>Directory to query information for.</desc>
- </param>
- <param name="info" type="IGuestFsObjInfo" dir="return">
- <desc><link to="IGuestFsObjInfo"/> object containing the queried information.</desc>
- </param>
- </method>
-
<method name="directoryRemove">
<desc>
- Removes a guest directory if not empty.
+ Removes a guest directory if empty.
+
+ <note>Symbolic links in the final component will not be followed,
+ instead an not-a-directory error is reported.</note>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>Full path of directory to remove.</desc>
+ <desc>Path to the directory that should be removed. Guest path style.</desc>
</param>
</method>
<method name="directoryRemoveRecursive">
<desc>
Removes a guest directory recursively.
+
+<!-- Add this back when the warning can be removed:
+ Unless <link to="DirectoryRemoveRecFlag_ContentAndDir"/> or
+ <link to="DirectoryRemoveRecFlag_ContentOnly"/> is given, only the
+ directory structure is removed. Which means it will fail if there are
+ directories which are not empty in the directory tree @a path points to.
+-->
+
+ <note> WARNING!! THE FLAGS ARE NOT CURRENTLY IMPLEMENTED. THE IMPLEMENTATION
+ WORKS AS IF FLAGS WAS SET TO <link to="DirectoryRemoveRecFlag_ContentAndDir"/>.
+ </note>
+
+ <note>If the final path component is a symbolic link, this method will
+ fail as it can only be applied to directories.</note>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>Full path of directory to remove recursively.</desc>
+ <desc>Path of the directory that is to be removed recursively. Guest
+ path style.</desc>
</param>
<param name="flags" type="DirectoryRemoveRecFlag" dir="in" safearray="yes">
- <desc>Remove flags; see <link to="DirectoryRemoveRecFlag"/> for more information.</desc>
+ <desc>Zero or more <link to="DirectoryRemoveRecFlag"/> flags.
+ <note>WARNING! SPECIFYING <link to="DirectoryRemoveRecFlag::ContentAndDir"/> IS
+ MANDATORY AT THE MOMENT!!</note>
+ </desc>
</param>
<param name="progress" type="IProgress" dir="return">
<desc>Progress object to track the operation completion. This is not implemented
@@ -11024,102 +11391,168 @@
</param>
</method>
- <method name="directoryRename">
+ <!-- Environment related methods. -->
+
+ <method name="environmentScheduleSet">
<desc>
- Renames a directory on the guest.
+ Schedules setting an environment variable when creating the next guest
+ process. This affects the <link to="IGuestSession::environmentChanges"/>
+ attribute.
</desc>
- <param name="source" type="wstring" dir="in">
- <desc>Source directory to rename.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the environment variable to set. This cannot be empty
+ nor can it contain any equal signs.</desc>
</param>
- <param name="dest" type="wstring" dir="in">
- <desc>Destination directory to rename the source to.</desc>
+ <param name="value" type="wstring" dir="in">
+ <desc>Value to set the session environment variable to.</desc>
</param>
- <param name="flags" type="PathRenameFlag" dir="in" safearray="yes">
- <desc>Rename flags; see <link to="PathRenameFlag"/> for more information.</desc>
+ </method>
+
+ <method name="environmentScheduleUnset">
+ <desc>
+ Schedules unsetting (removing) an environment variable when creating
+ the next guest process. This affects the
+ <link to="IGuestSession::environmentChanges"/> attribute.
+ </desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the environment variable to unset. This cannot be empty
+ nor can it contain any equal signs.</desc>
</param>
</method>
- <method name="directorySetACL">
+ <method name="environmentGetBaseVariable">
<desc>
- Sets the ACL (Access Control List) of a guest directory.
+ Gets an environment variable from the session's base environment
+ (<link to="IGuestSession::environmentBase"/>).
- <result name="E_NOTIMPL">
- The method is not implemented yet.
- </result>
+ <result name="VBOX_E_NOT_SUPPORTED">If the guest additions does not
+ support the session base environment feature. Support for this was
+ introduced with protocol version XXXX.</result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">If the guest additions has
+ yet to report the session base environment.</result>
</desc>
- <param name="path" type="wstring" dir="in">
- <desc>Full path of directory to set the ACL for.</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the environment variable to get.This cannot be empty
+ nor can it contain any equal signs.</desc>
</param>
- <param name="acl" type="wstring" dir="in">
- <desc>Actual ACL string to set. Must comply with the guest OS.</desc>
+ <param name="value" type="wstring" dir="return">
+ <desc>
+ The value of the variable. Empty if not found. To deal with
+ variables that may have empty values, use
+ <link to="IGuestSession::environmentDoesBaseVariableExist"/>.
+ </desc>
</param>
</method>
- <method name="environmentClear">
+ <method name="environmentDoesBaseVariableExist">
<desc>
- Clears (deletes) all session environment variables.
+ Checks if the given environment variable exists in the session's base
+ environment (<link to="IGuestSession::environmentBase"/>).
- <result name="VBOX_E_IPRT_ERROR">
- Error while clearing the session environment variables.
- </result>
+ <result name="VBOX_E_NOT_SUPPORTED">If the guest additions does not
+ support the session base environment feature. Support for this was
+ introduced with protocol version XXXX.</result>
+ <result name="VBOX_E_INVALID_OBJECT_STATE">If the guest additions has
+ yet to report the session base environment.</result>
</desc>
+ <param name="name" type="wstring" dir="in">
+ <desc>Name of the environment variable to look for. This cannot be
+ empty nor can it contain any equal signs.</desc>
+ </param>
+ <param name="exists" type="boolean" dir="return">
+ <desc>TRUE if the variable exists, FALSE if not.</desc>
+ </param>
</method>
- <method name="environmentGet">
+ <!-- File related methods. -->
+
+ <method name="fileCopy">
<desc>
- Gets the value of a session environment variable.
+ Copies a file from one guest location to another.
- <result name="VBOX_E_IPRT_ERROR">
- Error while getting the value of the session environment variable.
+ <note>Will overwrite the destination file unless
+ <link to="FileCopyFlag::NoReplace"/> is specified.</note>
+
+ <result name="E_NOTIMPL">
+ Not yet implemented.
</result>
</desc>
- <param name="name" type="wstring" dir="in">
- <desc>Name of session environment variable to get the value for.</desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>The path to the file to copy (in the guest). Guest path style.</desc>
</param>
- <param name="value" type="wstring" dir="return">
- <desc>
- Value of the session environment variable specified. If this variable
- does not exist and empty value will be returned.
- </desc>
+ <param name="destination" type="wstring" dir="in">
+ <desc>The path to the target file (in the guest). This cannot be a
+ directory. Guest path style.</desc>
+ </param>
+ <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
</param>
</method>
- <method name="environmentSet">
+ <method name="fileCopyFromGuest">
<desc>
- Sets a session environment variable.
+ Copies a file from the guest to the host.
+
+ <note>Will overwrite the destination file unless
+ <link to="FileCopyFlag::NoReplace"/> is specified.</note>
<result name="VBOX_E_IPRT_ERROR">
- Error while setting the session environment variable.
+ Error starting the copy operation.
</result>
</desc>
- <param name="name" type="wstring" dir="in">
- <desc>Name of session environment variable to set.</desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>Path to the file on the guest side that should be copied to the
+ host. Guest path style.</desc>
</param>
- <param name="value" type="wstring" dir="in">
- <desc>Value to set the session environment variable to.</desc>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the file on the host (file, not directory). Host
+ path style.</desc>
+ </param>
+ <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
</param>
</method>
- <method name="environmentUnset">
+ <method name="fileCopyToGuest">
<desc>
- Unsets a session environment variable.
+ Copies a file from the host to the guest.
+
+ <note>Will overwrite the destination file unless
+ <link to="FileCopyFlag::NoReplace"/> is specified.</note>
<result name="VBOX_E_IPRT_ERROR">
- Error while unsetting the session environment variable.
+ Error starting the copy operation.
</result>
</desc>
- <param name="name" type="wstring" dir="in">
- <desc>Name of session environment variable to unset (clear).</desc>
+ <param name="source" type="wstring" dir="in">
+ <desc>Path to the file on the host side that should be copied to the
+ guest. Host path style.</desc>
+ </param>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to put the file in the guest (file, not directory). Guest
+ style path.</desc>
+ </param>
+ <param name="flags" type="FileCopyFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileCopyFlag"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
</param>
</method>
<method name="fileCreateTemp">
<desc>
- Creates a temporary file on the guest.
+ Creates a temporary file in the guest.
<result name="VBOX_E_NOT_SUPPORTED">
The operation is not possible as requested on this particular
- guest type.
+ guest OS.
</result>
<result name="E_INVALIDARG">
Invalid argument. This includes an incorrectly formatted template,
@@ -11139,12 +11572,19 @@
</desc>
</param>
<param name="mode" type="unsigned long" dir="in">
- <desc>The mode of the file to create. Use 0700 unless there are
- reasons not to. This parameter is ignored if "secure" is specified.
- </desc>
+ <desc>
+ The UNIX-style access mode mask to create the file with.
+ Whether/how all three access groups and associated access rights are
+ realized is guest OS dependent. The API does the best it can on each
+ OS.
+
+ This parameter is ignore if the @a secure parameter is set to @c true.
+ <note>It is strongly recommended to use 0600.</note>
+ </desc>
</param>
<param name="path" type="wstring" dir="in">
- <desc>The absolute path to create the temporary file in.</desc>
+ <desc>The path to the directory in which the temporary file should be
+ created.</desc>
</param>
<param name="secure" type="boolean" dir="in">
<desc>Whether to fail if the file can not be securely created.
@@ -11162,40 +11602,69 @@
<method name="fileExists">
<desc>
- Checks whether a file exists on the guest or not.
+ Checks whether a regular file exists in the guest or not.
<result name="VBOX_E_IPRT_ERROR">
Error while checking existence of the file specified.
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>File to check existence for.</desc>
+ <desc>Path to the alleged regular file. Guest path style.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ If @c true, symbolic links in the final component will be followed
+ and the existance of the symlink target made the question for this method.
+ If @c false, a symbolic link in the final component will make the
+ method return @c false (because a symlink isn't a regular file).
+ </desc>
</param>
<param name="exists" type="boolean" dir="return">
- <desc>Returns @c true if the file exists, @c false if not.</desc>
+ <desc>Returns @c true if the file exists, @c false if not. @c false is
+ also return if this @a path does not point to a file object.</desc>
</param>
</method>
- <method name="fileRemove">
+ <method name="fileOpen">
<desc>
- Removes a single file on the guest.
+ Opens a file and creates a <link to="IGuestFile"/> object that
+ can be used for further operations.
<result name="VBOX_E_OBJECT_NOT_FOUND">
- File to remove was not found.
+ File to open was not found.
</result>
<result name="VBOX_E_IPRT_ERROR">
- Error while removing the file.
+ Error while opening the file.
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>Path to the file to remove.</desc>
+ <desc>Path to file to open. Guest path style.</desc>
+ </param>
+ <param name="accessMode" type="FileAccessMode" dir="in">
+ <desc>The file access mode (read, write and/or append).
+ See <link to="FileAccessMode"/> for details.</desc>
+ </param>
+ <param name="openAction" type="FileOpenAction" dir="in">
+ <desc>What action to take depending on whether the file exists or not.
+ See <link to="FileOpenAction"/> for details.</desc>
+ </param>
+ <param name="creationMode" type="unsigned long" dir="in">
+ <desc>
+ The UNIX-style access mode mask to create the file with if @a openAction
+ requested the file to be created (otherwise ignored). Whether/how all
+ three access groups and associated access rights are realized is guest
+ OS dependent. The API does the best it can on each OS.
+ </desc>
+ </param>
+ <param name="file" type="IGuestFile" dir="return">
+ <desc><link to="IGuestFile"/> object representing the opened file.</desc>
</param>
</method>
- <method name="fileOpen">
+ <method name="fileOpenEx">
<desc>
Opens a file and creates a <link to="IGuestFile"/> object that
- can be used for further operations.
+ can be used for further operations, extended version.
<result name="VBOX_E_OBJECT_NOT_FOUND">
File to open was not found.
@@ -11205,209 +11674,283 @@
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>Full path to file to open.</desc>
+ <desc>Path to file to open. Guest path style.</desc>
</param>
- <param name="openMode" type="wstring" dir="in">
- <desc>The file opening mode. This describes the wanted access to a file, whereas
- the parameter must be one of the following:
- <ul>
- <li><tt>"r"</tt>: Opens a file for reading.</li>
- <li><tt>"r+"</tt>: Opens a file for reading and writing.</li>
- <li><tt>"w"</tt>: Opens a file for writing.</li>
- <li><tt>"w+"</tt>: Opens a file for writing and reading.</li>
- </ul>
- </desc>
+ <param name="accessMode" type="FileAccessMode" dir="in">
+ <desc>The file access mode (read, write and/or append).
+ See <link to="FileAccessMode"/> for details.</desc>
</param>
- <param name="disposition" type="wstring" dir="in">
- <desc>The file disposition. This describes the action to take in case a
- file exists or does not exist, whereas the parameter must be one of the
- following:
- <ul>
- <li><tt>"ca"</tt>: Creates a new file, always. Overwrites an existing file.</li>
- <li><tt>"ce"</tt>: Creates a new file if it does not exist. Fail if exist.</li>
- <li><tt>"oa"</tt>: Opens an existing file and places the file pointer at the
- end of the file, if opened with write access. Create the file if it does not exist.</li>
- <li><tt>"oc"</tt>: Opens an existing file or create it if it does not exist.</li>
- <li><tt>"oe"</tt>: Opens an existing file or fail if it does not exist.</li>
- <li><tt>"ot"</tt>: Opens and truncate an existing file or fail if it does not exist.</li>
- </ul>
+ <param name="openAction" type="FileOpenAction" dir="in">
+ <desc>What action to take depending on whether the file exists or not.
+ See <link to="FileOpenAction"/> for details.</desc>
+ </param>
+ <param name="sharingMode" type="FileSharingMode" dir="in">
+ <desc>The file sharing mode in the guest. This parameter is currently
+ ignore for all guest OSes. It will in the future be implemented for
+ Windows, OS/2 and maybe Solaris guests only, the others will ignore it.
+ Use <link to="FileSharingMode::All"/>.
</desc>
</param>
<param name="creationMode" type="unsigned long" dir="in">
- <desc>The mode to create the file with. Must be a three-digit octal number which
- represents the access rights for the file.</desc>
+ <desc>
+ The UNIX-style access mode mask to create the file with if @a openAction
+ requested the file to be created (otherwise ignored). Whether/how all
+ three access groups and associated access rights are realized is guest
+ OS dependent. The API does the best it can on each OS.
+ </desc>
+ </param>
+ <param name="flags" type="FileOpenExFlags" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FileOpenExFlags"/> values. </desc>
</param>
<param name="file" type="IGuestFile" dir="return">
<desc><link to="IGuestFile"/> object representing the opened file.</desc>
</param>
</method>
- <method name="fileOpenEx">
+ <method name="fileQuerySize">
<desc>
- Opens a file and creates a <link to="IGuestFile"/> object that
- can be used for further operations, extended version.
+ Queries the size of a regular file in the guest.
<result name="VBOX_E_OBJECT_NOT_FOUND">
- File to open was not found.
+ File to was not found.
</result>
<result name="VBOX_E_IPRT_ERROR">
- Error while opening the file.
+ Error querying file size.
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>Full path to file to open.</desc>
+ <desc>Path to the file which size is requested. Guest path style.</desc>
</param>
- <param name="openMode" type="wstring" dir="in">
- <desc>The file opening mode. This describes the wanted access to a file, whereas
- the parameter must be one of the following:
- <ul>
- <li><tt>"r"</tt>: Opens a file for reading.</li>
- <li><tt>"r+"</tt>: Opens a file for reading and writing.</li>
- <li><tt>"w"</tt>: Opens a file for writing.</li>
- <li><tt>"w+"</tt>: Opens a file for writing and reading.</li>
- </ul>
- </desc>
- </param>
- <param name="disposition" type="wstring" dir="in">
- <desc>The file disposition. This describes the action to take in case a
- file exists or does not exist, whereas the parameter must be one of the
- following:
- <ul>
- <li><tt>"ca"</tt>: Creates a new file, always. Overwrites an existing file.</li>
- <li><tt>"ce"</tt>: Creates a new file if it does not exist. Fail if exist.</li>
- <li><tt>"oa"</tt>: Opens an existing file and places the file pointer at the
- end of the file, if opened with write access. Create the file if it does not exist.</li>
- <li><tt>"oc"</tt>: Opens an existing file or create it if it does not exist.</li>
- <li><tt>"oe"</tt>: Opens an existing file or fail if it does not exist.</li>
- <li><tt>"ot"</tt>: Opens and truncate an existing file or fail if it does not exist.</li>
- </ul>
- </desc>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ It @c true, symbolic links in the final path component will be
+ followed to their target, and the size of the target is returned.
+ If @c false, symbolic links in the final path component will make
+ the method call fail (symblink is not a regular file).
+ </desc>
</param>
- <param name="sharingMode" type="wstring" dir="in">
- <desc>The file sharing mode on the guest. This parameter
- is not implemented yet. Pass an empty string here.</desc>
+ <param name="size" type="long long" dir="return">
+ <desc>Queried file size.</desc>
</param>
- <param name="creationMode" type="unsigned long" dir="in">
- <desc>The mode to create the file with. Must be a three-digit octal number which
- represents the access rights for the file.</desc>
+ </method>
+
+ <!-- File System Object Level -->
+
+ <method name="fsObjExists">
+ <desc>
+ Checks whether a file system object (file, directory, etc) exists in
+ the guest or not.
+
+ <result name="VBOX_E_IPRT_ERROR">
+ Error while checking existence of the file specified.
+ </result>
+ </desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Path to the file system object to check the existance of. Guest
+ path style.</desc>
</param>
- <param name="offset" type="long long" dir="in">
- <desc>The initial read/write offset (in bytes).</desc>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ If @c true, symbolic links in the final component will be followed
+ and the method will instead check if the target exists.
+ If @c false, symbolic links in the final component will satisfy the
+ method and it will return @c true in @a exists.
+ </desc>
</param>
- <param name="file" type="IGuestFile" dir="return">
- <desc><link to="IGuestFile"/> object representing the opened file.</desc>
+ <param name="exists" type="boolean" dir="return">
+ <desc>Returns @c true if the file exists, @c false if not.</desc>
</param>
</method>
- <method name="fileQueryInfo">
+ <method name="fsObjQueryInfo">
<desc>
- Queries information of a file on the guest.
+ Queries information about a file system object (file, directory, etc)
+ in the guest.
<result name="VBOX_E_OBJECT_NOT_FOUND">
- File to query information for was not found.
+ The file system object was not found.
</result>
<result name="VBOX_E_IPRT_ERROR">
- Error querying information.
+ Error while querying information.
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>File to query information for.</desc>
+ <desc>Path to the file system object to gather information about.
+ Guest path style.</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ Information about symbolic links is returned if @c false. Otherwise,
+ symbolic links are followed and the returned information concerns
+ itself with the symlink target if @c true.
+ </desc>
</param>
<param name="info" type="IGuestFsObjInfo" dir="return">
- <desc><link to="IGuestFsObjInfo"/> object containing the queried information.</desc>
+ <desc><link to="IGuestFsObjInfo"/> object containing the information.</desc>
</param>
</method>
- <method name="fileQuerySize">
+ <method name="fsObjRemove">
<desc>
- Queries the size of a file on the guest.
+ Removes a file system object (file, symlink, etc) in the guest. Will
+ not work on directories, use <link to="IGuestSession::directoryRemove"/>
+ to remove directories.
+
+ <note>This method will remove symbolic links in the final path
+ component, not follow them.</note>
+ <result name="E_NOTIMPL">
+ The method has not been implemented yet.
+ </result>
<result name="VBOX_E_OBJECT_NOT_FOUND">
- File to rename was not found.
+ The file system object was not found.
</result>
<result name="VBOX_E_IPRT_ERROR">
- Error querying file size.
+ For most other errors. We know this is unhelpful, will fix shortly...
</result>
</desc>
<param name="path" type="wstring" dir="in">
- <desc>File to query the size for.</desc>
+ <desc>Path to the file system object to remove. Guest style path.</desc>
</param>
- <param name="size" type="long long" dir="return">
- <desc>Queried file size.</desc>
+ </method>
+
+ <method name="fsObjRename">
+ <desc>
+ Renames a file system object (file, directory, symlink, etc) in the
+ guest.
+
+ <result name="VBOX_E_OBJECT_NOT_FOUND">
+ The file system object was not found.
+ </result>
+ <result name="VBOX_E_IPRT_ERROR">
+ For most other errors. We know this is unhelpful, will fix shortly...
+ </result>
+ </desc>
+ <param name="oldPath" type="wstring" dir="in">
+ <desc>The current path to the object. Guest path style.</desc>
+ </param>
+ <param name="newPath" type="wstring" dir="in">
+ <desc>The new path to the object. Guest path style.</desc>
+ </param>
+ <param name="flags" type="FsObjRenameFlag" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FsObjRenameFlag"/> values.</desc>
</param>
</method>
- <method name="fileRename">
+ <method name="fsObjMove">
<desc>
- Renames a file on the guest.
+ Moves a file system object (file, directory, symlink, etc) from one
+ guest location to another.
+
+ This differs from <link to="IGuestSession::fsObjRename"/> in that it
+ can move accross file system boundraries. In that case it will
+ perform a copy and then delete the original. For directories, this
+ can take a while and is subject to races.
+
+ <result name="E_NOTIMPL">
+ Not yet implemented.
+ </result>
</desc>
<param name="source" type="wstring" dir="in">
- <desc>Source file to rename.</desc>
+ <desc>Path to the file to move. Guest path style.</desc>
</param>
- <param name="dest" type="wstring" dir="in">
- <desc>Destination file to rename the source to.</desc>
+ <param name="destination" type="wstring" dir="in">
+ <desc>Where to move the file to (file, not directory). Guest path
+ style.</desc>
</param>
- <param name="flags" type="PathRenameFlag" dir="in" safearray="yes">
- <desc>Rename flags; see <link to="PathRenameFlag"/> for more information.</desc>
+ <param name="flags" type="FsObjMoveFlags" dir="in" safearray="yes">
+ <desc>Zero or more <link to="FsObjMoveFlags"/> values.</desc>
+ </param>
+ <param name="progress" type="IProgress" dir="return">
+ <desc>Progress object to track the operation to completion.</desc>
</param>
</method>
- <method name="fileSetACL">
+ <method name="fsObjSetACL">
<desc>
- Sets the ACL (Access Control List) of a file on the guest.
+ Sets the access control list (ACL) of a file system object (file,
+ directory, etc) in the guest.
<result name="E_NOTIMPL">
The method is not implemented yet.
</result>
</desc>
- <param name="file" type="wstring" dir="in">
- <desc>Full path of file to set the ACL for.</desc>
+ <param name="path" type="wstring" dir="in">
+ <desc>Full path of the file system object which ACL to set</desc>
+ </param>
+ <param name="followSymlinks" type="boolean" dir="in">
+ <desc>
+ If @c true symbolic links in the final component will be followed,
+ otherwise, if @c false, the method will work directly on a symbolic
+ link in the final component.
+ </desc>
</param>
<param name="acl" type="wstring" dir="in">
- <desc>Actual ACL string to set. Must comply with the guest OS.</desc>
+ <desc>The ACL specification string. To-be-defined.</desc>
+ </param>
+ <param name="mode" type="unsigned long" dir="in">
+ <desc>UNIX-style mode mask to use if @a acl is empty. As mention in
+ <link to="IGuestSession::directoryCreate"/> this is realized on
+ a best effort basis and the exact behavior depends on the Guest OS.
+ </desc>
</param>
</method>
+ <!-- Process methods -->
+
<method name="processCreate">
<desc>
- Creates a new process running on the guest. The new process will be
+ Creates a new process running in the guest. The new process will be
started asynchronously, meaning on return of this function it is not
- guaranteed that the guest process is in a started state. To wait for
+ be guaranteed that the guest process is in a started state. To wait for
successful startup, use the <link to="IProcess::waitFor"/> call.
<note>
- Starting at VirtualBox 4.2 guest process execution by default is limited
+ Starting at VirtualBox 4.2 guest process execution by is default limited
to serve up to 255 guest processes at a time. If all 255 guest processes
- are still active and running, creating a new guest process will result in an
- appropriate error message.
+ are active and running, creating a new guest process will result in an
+ error.
- If ProcessCreateFlag_WaitForStdOut and / or respectively ProcessCreateFlag_WaitForStdErr
- is / are set, the guest process will not exit until all data from the specified
- stream(s) is / are read out.
+ If ProcessCreateFlag_WaitForStdOut and/or ProcessCreateFlag_WaitForStdErr
+ are set, the guest process will not enter the terminated state until
+ all data from the specified streams have been read read.
</note>
<result name="VBOX_E_IPRT_ERROR">
Error creating guest process.
</result>
</desc>
- <param name="command" type="wstring" dir="in">
+ <param name="executable" type="wstring" dir="in">
<desc>
- Full path name of the command to execute on the guest; the
- commands has to exists in the guest VM in order to be executed.
+ Full path to the file to execute in the guest. The file has to
+ exists in the guest VM with executable right to the session user in
+ order to succeed. If empty/null, the first entry in the
+ @a arguments array will be used instead (i.e. argv[0]).
</desc>
</param>
<param name="arguments" type="wstring" dir="in" safearray="yes">
- <desc>Array of arguments passed to the execution command.</desc>
+ <desc>Array of arguments passed to the new process.
+ <note>
+ Starting with VirtualBox 5.0 this array starts with argument 0
+ instead of argument 1 as in previous versions. Whether the zeroth
+ argument can be passed to the guest depends on the VBoxService
+ version running there. If you depend on this, check that the
+ <link to="IGuestSession::protocolVersion"/> is 3 or higher.
+ </note>
+ </desc>
</param>
- <param name="environment" type="wstring" dir="in" safearray="yes">
+ <param name="environmentChanges" type="wstring" dir="in" safearray="yes">
<desc>
- Environment variables that can be set while the command is being
- executed, in form of "NAME=VALUE"; one pair per entry. To unset a
- variable just set its name ("NAME") without a value.
+ Set of environment changes to complement
+ <link to="IGuestSession::environmentChanges"/>. Takes precedence
+ over the session ones. The changes are in putenv format, i.e.
+ "VAR=VALUE" for setting and "VAR" for unsetting.
- This parameter can be used to override environment variables set by
- the guest session, which will be applied to the newly started process
- in any case.
+ The changes are applied to the base environment of the impersonated
+ guest user (<link to="IGuestSession::environmentBase"/>) when
+ creating the process. (This is done on the guest side of things in
+ order to be compatible with older guest additions. That is one of
+ the motivations for not passing in the whole environment here.)
</desc>
</param>
<param name="flags" type="ProcessCreateFlag" dir="in" safearray="yes">
@@ -11431,35 +11974,48 @@
<method name="processCreateEx">
<desc>
- Creates a new process running on the guest. Extended version for
- also setting the process priority and affinity.
+ Creates a new process running in the guest with the extended options
+ for setting the process priority and affinity.
See <link to="IGuestSession::processCreate"/> for more information.
</desc>
- <param name="command" type="wstring" dir="in">
+ <param name="executable" type="wstring" dir="in">
<desc>
- Full path name of the command to execute on the guest; the
- commands has to exists in the guest VM in order to be executed.
+ Full path to the file to execute in the guest. The file has to
+ exists in the guest VM with executable right to the session user in
+ order to succeed. If empty/null, the first entry in the
+ @a arguments array will be used instead (i.e. argv[0]).
</desc>
</param>
<param name="arguments" type="wstring" dir="in" safearray="yes">
- <desc>Array of arguments passed to the execution command.</desc>
+ <desc>Array of arguments passed to the new process.
+ <note>
+ Starting with VirtualBox 5.0 this array starts with argument 0
+ instead of argument 1 as in previous versions. Whether the zeroth
+ argument can be passed to the guest depends on the VBoxService
+ version running there. If you depend on this, check that the
+ <link to="IGuestSession::protocolVersion"/> is 3 or higher.
+ </note>
+ </desc>
</param>
- <param name="environment" type="wstring" dir="in" safearray="yes">
+ <param name="environmentChanges" type="wstring" dir="in" safearray="yes">
<desc>
- Environment variables that can be set while the command is being
- executed, in form of "NAME=VALUE"; one pair per entry. To unset a
- variable just set its name ("NAME") without a value.
+ Set of environment changes to complement
+ <link to="IGuestSession::environmentChanges"/>. Takes precedence
+ over the session ones. The changes are in putenv format, i.e.
+ "VAR=VALUE" for setting and "VAR" for unsetting.
- This parameter can be used to override environment variables set by
- the guest session, which will be applied to the newly started process
- in any case.
+ The changes are applied to the base environment of the impersonated
+ guest user (<link to="IGuestSession::environmentBase"/>) when
+ creating the process. (This is done on the guest side of things in
+ order to be compatible with older guest additions. That is one of
+ the motivations for not passing in the whole environment here.)
</desc>
</param>
<param name="flags" type="ProcessCreateFlag" dir="in" safearray="yes">
<desc>
- Process creation flags;
- see <link to="ProcessCreateFlag"/> for more information.
+ Process creation flags, see <link to="ProcessCreateFlag"/> for
+ detailed description of available flags.
</desc>
</param>
<param name="timeoutMS" type="unsigned long" dir="in">
@@ -11472,13 +12028,20 @@
</param>
<param name="priority" type="ProcessPriority" dir="in">
<desc>
- Process priority to use for execution;
- see see <link to="ProcessPriority"/> for more information.</desc>
+ Process priority to use for execution, see <link to="ProcessPriority"/>
+ for available priority levels.
+ <note>This is silently ignored if not supported by guest additions.</note>
+ </desc>
</param>
<param name="affinity" type="long" dir="in" safearray="yes">
<desc>
- Process affinity to use for execution. This parameter
- is not implemented yet.
+ Processor affinity to set for the new process. This is a list of
+ guest CPU numbers the process is allowed to run on.
+ <note>
+ This is silently ignored if the guest does not support setting the
+ affinity of processes, or if the guest additions does not implemet
+ this feature.
+ </note>
</desc>
</param>
<param name="guestProcess" type="IGuestProcess" dir="return">
@@ -11498,92 +12061,76 @@
</param>
</method>
+ <!-- Symbolic link methods -->
+
<method name="symlinkCreate">
<desc>
- Creates a symbolic link on the guest.
+ Creates a symbolic link in the guest.
<result name="E_NOTIMPL">
The method is not implemented yet.
</result>
</desc>
- <param name="source" type="wstring" dir="in">
- <desc>The name of the symbolic link.</desc>
+ <param name="symlink" type="wstring" dir="in">
+ <desc>Path to the symbolic link that should be created. Guest path
+ style.</desc>
</param>
<param name="target" type="wstring" dir="in">
- <desc>The path to the symbolic link target.</desc>
+ <desc>
+ The path to the symbolic link target. If not an absolute, this will
+ be relative to the @a symlink location at access time. Guest path
+ style.
+ </desc>
</param>
<param name="type" type="SymlinkType" dir="in">
<desc>
- The symbolic link type;
- see <link to="SymlinkReadFlag"/> for more information.
+ The symbolic link type (mainly for Windows). See <link to="SymlinkType"/>
+ for more information.
</desc>
</param>
</method>
<method name="symlinkExists">
<desc>
- Checks whether a symbolic link exists on the guest or not.
+ Checks whether a symbolic link exists in the guest.
<result name="E_NOTIMPL">
The method is not implemented yet.
</result>
</desc>
<param name="symlink" type="wstring" dir="in">
- <desc>Symbolic link to check existence for.</desc>
+ <desc>Path to the alleged symbolic link. Guest path style.</desc>
</param>
<param name="exists" type="boolean" dir="return">
- <desc>Returns @c true if the symbolic link exists, @c false if not.</desc>
+ <desc>
+ Returns @c true if the symbolic link exists. Returns @c false if it
+ does not exist, if the file system object identified by the path is
+ not a symbolic link, or if the object type is inaccessible to the
+ user, or if the @a symlink argument is empty.
+ </desc>
</param>
</method>
<method name="symlinkRead">
<desc>
- Reads a symbolic link on the guest.
+ Reads the target value of a symbolic link in the guest.
<result name="E_NOTIMPL">
The method is not implemented yet.
</result>
</desc>
<param name="symlink" type="wstring" dir="in">
- <desc>Full path to symbolic link to read.</desc>
+ <desc>Path to the symbolic link to read.</desc>
</param>
<param name="flags" type="SymlinkReadFlag" dir="in" safearray="yes">
- <desc>
- Read flags; see <link to="SymlinkReadFlag"/> for more information.
- </desc>
+ <desc>Zero or more <link to="SymlinkReadFlag"/> values.</desc>
</param>
<param name="target" type="wstring" dir="return">
- <desc>
- Target of the symbolic link pointing to, if found.
- </desc>
+ <desc>Target value of the symbolic link. Guest path style.</desc>
</param>
</method>
- <method name="symlinkRemoveDirectory">
- <desc>
- Removes a symbolic link on the guest if it's a directory.
-
- <result name="E_NOTIMPL">
- The method is not implemented yet.
- </result>
- </desc>
- <param name="path" type="wstring" dir="in">
- <desc>Symbolic link to remove.</desc>
- </param>
- </method>
-
- <method name="symlinkRemoveFile">
- <desc>
- Removes a symbolic link on the guest if it's a file.
-
- <result name="E_NOTIMPL">
- The method is not implemented yet.
- </result>
- </desc>
- <param name="file" type="wstring" dir="in">
- <desc>Symbolic link to remove.</desc>
- </param>
- </method>
+ <!-- Session wait methods -->
<method name="waitFor">
<desc>
@@ -11638,7 +12185,7 @@
<interface
name="IProcess" extends="$unknown"
- uuid="5a4fe06d-8cb1-40ff-ac9e-9676e32f706e"
+ uuid="064cf1ca-4c0f-50b5-8f8e-e8b4bfa76c33"
wsmap="managed"
>
<desc>
@@ -11652,12 +12199,12 @@
</attribute>
<attribute name="environment" type="wstring" readonly="yes" safearray="yes">
<desc>
- The environment block this process is using during execution.
+ The initial process environment. Not yet implemented.
</desc>
</attribute>
<attribute name="eventSource" type="IEventSource" readonly="yes">
<desc>
- Event source for VirtualBox events.
+ Event source for process events.
</desc>
</attribute>
<attribute name="executablePath" type="wstring" readonly="yes">
@@ -11827,13 +12374,14 @@
<interface
name="IGuestProcess" extends="IProcess"
- uuid="dfa39a36-5d43-4840-a025-67ea956b3111"
+ uuid="35cf4b3f-4453-4f3e-c9b8-5686939c80b6"
wsmap="managed"
>
<desc>
Implementation of the <link to="IProcess" /> object
- for processes on the guest.
+ for processes the host has started in the guest.
</desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -11846,15 +12394,11 @@
</desc>
<attribute name="directoryName" type="wstring" readonly="yes">
- <desc>
- Full path of directory.
- </desc>
+ <desc>The path specified when opening the directory.</desc>
</attribute>
<attribute name="filter" type="wstring" readonly="yes">
- <desc>
- The open filter.
- </desc>
+ <desc>Directory listing filter to (specified when opening the directory).</desc>
</attribute>
<method name="close">
@@ -11876,50 +12420,42 @@
<link to="IFsObjInfo"/>.</desc>
</param>
</method>
+
+ <!-- Would be useful to add queryInfo() and setACL() here later, but at
+ present IPRT isn't doing a race free job with the former and doesn't
+ have the latter. So, let it be for now. -->
+
</interface>
<interface
name="IGuestDirectory" extends="IDirectory"
- uuid="af4a8ce0-0725-42b7-8826-46e3c7ba7357"
+ uuid="cc830458-4974-a19c-4dc6-cc98c2269626"
wsmap="managed"
>
<desc>
Implementation of the <link to="IDirectory" /> object
- for directories on the guest.
+ for directories in the guest.
</desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
name="IFile" extends="$unknown"
- uuid="5ec56ea3-b55d-4bdb-8c4f-5f9fb26b894b"
+ uuid="540804bf-4ca6-dd43-800c-bfb9765f96fe"
wsmap="managed"
>
<desc>
Abstract parent interface for files handled by VirtualBox.
</desc>
- <attribute name="creationMode" type="unsigned long" readonly="yes">
- <desc>
- The creation mode.
- </desc>
- </attribute>
- <attribute name="disposition" type="wstring" readonly="yes">
- <desc>
- The disposition mode.
- </desc>
- </attribute>
+
<attribute name="eventSource" type="IEventSource" readonly="yes">
<desc>
- Event source for guest session events.
- </desc>
- </attribute>
- <attribute name="fileName" type="wstring" readonly="yes">
- <desc>
- Full path of the actual file name of this file.
+ Event source for file events.
</desc>
</attribute>
<attribute name="id" type="unsigned long" readonly="yes">
<desc>
- The file's ID.
+ The ID VirtualBox internally assigned to the open file.
</desc>
</attribute>
<attribute name="initialSize" type="long long" readonly="yes">
@@ -11927,14 +12463,18 @@
The initial size in bytes when opened.
</desc>
</attribute>
- <attribute name="openMode" type="wstring" readonly="yes">
- <desc>
- The open mode.
- </desc>
- </attribute>
<attribute name="offset" type="long long" readonly="yes">
<desc>
- Current read/write offset in bytes.
+ The current file position.
+
+ The file current position always applies to the <link to="IFile::read"/>
+ method, which updates it upon return. Same goes for the <link to="IFile::write"/>
+ method except when <link to="IFile::accessMode"/> is <link to="FileAccessMode::AppendOnly"/>
+ or <link to="FileAccessMode::AppendRead"/>, where it will always write
+ to the end of the file and will leave this attribute unchanged.
+
+ The <link to="IFile::seek"/> is used to change this attribute without
+ transfering any file data like read and write does.
</desc>
</attribute>
<attribute name="status" type="FileStatus" readonly="yes">
@@ -11943,6 +12483,25 @@
</desc>
</attribute>
+ <!-- The following attributes just remembers the fileOpen parameters for you.
+ Nice for introspection and probably doesn't cost us much. -->
+ <attribute name="fileName" type="wstring" readonly="yes">
+ <desc>Full path of the actual file name of this file.
+ <!-- r=bird: The 'actual' file name is too tough, we cannot guarentee
+ that on unix guests. Seeing how IGuestDirectory did things,
+ I'm questioning the 'Full path' part too. Not urgent to check. -->
+ </desc>
+ </attribute>
+ <attribute name="creationMode" type="unsigned long" readonly="yes">
+ <desc>The UNIX-style creation mode specified when opening the file.</desc>
+ </attribute>
+ <attribute name="openAction" type="FileOpenAction" readonly="yes">
+ <desc>The opening action specified when opening the file.</desc>
+ </attribute>
+ <attribute name="accessMode" type="FileAccessMode" readonly="yes">
+ <desc>The file access mode.</desc>
+ </attribute>
+
<method name="close">
<desc>
Closes this file. After closing operations like reading data,
@@ -11964,6 +12523,23 @@
</param>
</method>
+ <method name="querySize">
+ <!-- Can also be gotten via seek(Current, 0), but this is easier to us.
+ This is a query method both to match IGuestSession::fileQuerySize to
+ highlight that it is a value that is not cacheable as others may be
+ changing the file concurrently (image reading /var/log/messages). -->
+ <desc>
+ Queries the current file size.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="size" type="long long" dir="return">
+ <desc>Queried file size.</desc>
+ </param>
+ </method>
+
<method name="read">
<desc>
Reads data from this file.
@@ -12013,20 +12589,24 @@
<method name="seek">
<desc>
- Changes the read and write position of this file.
+ Changes the current file position of this file.
- <result name="E_NOTIMPL">
- The method is not implemented yet.
- </result>
+ The file current position always applies to the <link to="IFile::read"/>
+ method. Same for the <link to="IFile::write"/> method it except when
+ the <link to="IFile::accessMode"/> is <link to="FileAccessMode::AppendOnly"/>
+ or <link to="FileAccessMode::AppendRead"/>.
</desc>
<param name="offset" type="long long" dir="in">
- <desc>Offset to seek.</desc>
+ <desc>Offset to seek relative to the position specified by @a whence.</desc>
</param>
- <param name="whence" type="FileSeekType" dir="in">
+ <param name="whence" type="FileSeekOrigin" dir="in">
<desc>
- Seek mode; see <link to="FileSeekType"/> for more information.
+ One of the <link to="FileSeekOrigin"/> seek starting points.
</desc>
</param>
+ <param name="newOffset" type="long long" dir="return">
+ <desc>The new file offset after the seek operation.</desc>
+ </param>
</method>
<method name="setACL">
@@ -12038,7 +12618,26 @@
</result>
</desc>
<param name="acl" type="wstring" dir="in">
- <desc>ACL string to set.</desc>
+ <desc>The ACL specification string. To-be-defined.</desc>
+ </param>
+ <param name="mode" type="unsigned long" dir="in">
+ <desc>UNIX-style mode mask to use if @a acl is empty. As mention in
+ <link to="IGuestSession::directoryCreate"/> this is realized on
+ a best effort basis and the exact behavior depends on the Guest OS.
+ </desc>
+ </param>
+ </method>
+
+ <method name="setSize">
+ <desc>
+ Changes the file size.
+
+ <result name="E_NOTIMPL">
+ The method is not implemented yet.
+ </result>
+ </desc>
+ <param name="size" type="long long" dir="in">
+ <desc>The new file size.</desc>
</param>
</method>
@@ -12095,18 +12694,19 @@
<interface
name="IGuestFile" extends="IFile"
- uuid="60661aec-145f-4d11-b80e-8ea151598093"
+ uuid="92f21dc0-44de-1653-b717-2ebf0ca9b664"
wsmap="managed"
>
<desc>
Implementation of the <link to="IFile" /> object
- for files on the guest.
+ for files in the guest.
</desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
name="IFsObjInfo" extends="$unknown"
- uuid="4047ba30-7006-4966-ae86-94164e5e20eb"
+ uuid="37b30bc6-4506-58e4-bc43-fbbca92b4548"
wsmap="managed"
>
<desc>
@@ -12216,13 +12816,14 @@
<interface
name="IGuestFsObjInfo" extends="IFsObjInfo"
- uuid="d5cf678e-3484-4e4a-ac55-329e15462e18"
+ uuid="6620db85-44e0-ca69-e9e0-d4907ceccbe5"
wsmap="managed"
>
<desc>
Represents the guest implementation of the
<link to="IFsObjInfo" /> object.
</desc>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -12431,35 +13032,23 @@
To wait for successful startup, use the <link to="IGuestSession::waitFor"/>
call.
- A guest session represents one impersonated user account on the guest, so
+ A guest session represents one impersonated user account in the guest, so
every operation will use the same credentials specified when creating
the session object via <link to="IGuest::createSession"/>. Anonymous
sessions, that is, sessions without specifying a valid
- user account on the guest are not allowed due to security reasons.
+ user account in the guest are not allowed reasons of security.
- There can be a maximum of 32 sessions at once per VM. Each session keeps
- track of its started guest processes, opened guest files or guest directories.
- To work on guest files or directories a guest session offers methods to open
- or create such objects (see <link to="IGuestSession::fileOpen"/> or
- <link to="IGuestSession::directoryOpen"/> for example).
+ There can be a maximum of 32 sessions at once per VM. An error will
+ be returned if this has been reached. <!-- This should actually read:
+ VBOX_E_IPRT_ERROR will be return if this limit has been reached.
+ However, keep in mind that VBOX_E_IPRT_ERROR can be returned for about
+ 88 unrelated reasons, so you don't know what happend unless you parse
+ the error text. (bird) -->
+<!-- @todo r=bird: Seriously, add an dedicated VBOX_E_MAX_GUEST_SESSIONS status
+for this condition. Do the same for all other maximums and things that could be
+useful to the API client. -->
- There can be up to 2048 objects (guest processes, files or directories)
- a time per guest session. Exceeding the limit will result in an appropriate
- error message.
-
- When done with either of these objects, including the guest session itself,
- use the appropriate close() method to let the object do its cleanup work.
-
- Every guest session has its own environment variable block which gets
- automatically applied when starting a new guest process via
- <link to="IGuestSession::processCreate"/> or <link to="IGuestSession::processCreateEx"/>.
- To override (or unset) certain environment variables already set by the
- guest session, one can specify a per-process environment block when using
- one of the both above mentioned process creation calls.
-
- Closing a session via <link to="IGuestSession::close" /> will try to close
- all the mentioned objects above unless these objects are still used by
- a client.
+ For more information please consult <link to="IGuestSession"/>
</desc>
<param name="user" type="wstring" dir="in">
<desc>
@@ -12543,7 +13132,7 @@
<desc>
Optional command line arguments to use for the Guest Additions
installer. Useful for retrofitting features which weren't installed
- before on the guest.
+ before in the guest.
</desc>
</param>
<param name="flags" type="AdditionsUpdateFlag" dir="in" safearray="yes">
@@ -14654,7 +15243,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
</desc>
<param name="currentPassword" type="wstring" dir="in">
<desc>
- The olcurrentd password the medium is protected with. Use an empty string to indicate
+ The current password the medium is protected with. Use an empty string to indicate
that the medium isn't encrypted.
</desc>
</param>
@@ -17769,7 +18358,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
<interface
name="IAudioAdapter" extends="$unknown"
- uuid="921873db-5f3f-4b69-91f9-7be9e535a2cb"
+ uuid="280cc7f7-eddc-48b6-9bbb-5b1e8d761c0e"
wsmap="managed"
>
<desc>
@@ -17784,6 +18373,18 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
the VM is not running.
</desc>
</attribute>
+ <attribute name="enabledIn" type="boolean">
+ <desc>
+ Flag whether the audio adapter is enabled for audio
+ input. Only relevant if the adapter is enabled.
+ </desc>
+ </attribute>
+ <attribute name="enabledOut" type="boolean">
+ <desc>
+ Flag whether the audio adapter is enabled for audio
+ output. Only relevant if the adapter is enabled.
+ </desc>
+ </attribute>
<attribute name="audioController" type="AudioControllerType">
<desc>
The audio hardware we emulate.
@@ -20978,7 +21579,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
A new snapshot of the machine has been taken.
<see><link to="ISnapshot"/></see>
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -20997,7 +21598,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
<see><link to="ISnapshot"/></see>
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21009,7 +21610,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
Snapshot of the given machine has been restored.
<see><link to="ISnapshot"/></see>
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21021,7 +21622,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
Snapshot properties (name and/or description) have been changed.
<see><link to="ISnapshot"/></see>
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21180,7 +21781,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
Interested callees should query IGuest attributes to
find out what has changed.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21247,7 +21848,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
<link to="IMachine::mediumAttachments">medium attachment</link>
changes.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21741,7 +22342,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
Notification when a guest file changed its current offset.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21770,7 +22371,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
Notification when data has been written to a guest file.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21784,7 +22385,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
Interested callees should use IVRDEServer methods and attributes to
find out what has changed.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21797,7 +22398,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
should use <link to="IConsole::VRDEServerInfo">IVRDEServerInfo</link>
attributes to find out what is the current status.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21808,7 +22409,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
<desc>
Notification when video capture settings have changed.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -21822,7 +22423,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
Interested callees should use IUSBController methods and attributes to
find out what has changed.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -22015,7 +22616,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
<interface
name="IVetoEvent" extends="IEvent"
- uuid="9a1a4130-69fe-472f-ac10-c6fa25d75007"
+ uuid="7c5e945f-2354-4267-883f-2f417d216519"
wsmap="managed"
>
<desc>Base abstract interface for veto events.</desc>
@@ -22053,6 +22654,35 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
</param>
</method>
+ <method name="addApproval">
+ <desc>
+ Adds an approval on this event.
+ </desc>
+ <param name="reason" type="wstring" dir="in">
+ <desc>
+ Reason for approval, could be null or empty string.
+ </desc>
+ </param>
+ </method>
+
+ <method name="isApproved">
+ <desc>
+ If this event was approved.
+ </desc>
+ <param name="result" type="boolean" dir="return" />
+ </method>
+
+ <method name="getApprovals">
+ <desc>
+ Current approval reason list, if size is 0 - no approvals.
+ </desc>
+ <param name="result" type="wstring" dir="return" safearray="yes">
+ <desc>
+ Array of reasons for approval provided by different event handlers.
+ </desc>
+ </param>
+ </method>
+
</interface>
<interface
@@ -22101,7 +22731,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
remain valid at least until the next
<link to="IConsole::state">machine state</link> change.
</desc>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<interface
@@ -22431,9 +23061,13 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
</interface>
<!-- base class for modification events -->
- <interface name="INATNetworkAlterEvent" extends="INATNetworkChangedEvent"
- uuid="3f5a0822-163a-43b1-ad16-8d58b0ef6e75"
- wsmap="managed" autogen="VBoxEvent" id="OnNATNetworkAlter"/>
+ <interface
+ name="INATNetworkAlterEvent" extends="INATNetworkChangedEvent"
+ uuid="d947adf5-4022-dc80-5535-6fb116815604"
+ wsmap="managed" autogen="VBoxEvent" id="OnNATNetworkAlter"
+ >
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </interface>
<interface name="INATNetworkCreationDeletionEvent" extends="INATNetworkAlterEvent"
uuid="8d984a7e-b855-40b8-ab0c-44d3515b4528"
@@ -22468,7 +23102,7 @@ Snapshot 1 (B.vdi) Snapshot 1 (B.vdi)
wsmap="managed" autogen="VBoxEvent" id="OnHostNameResolutionConfigurationChange"
dtracename="HostNameResCfgChangeEvent"
>
- <attribute name="midlDoesNotLikEmptyInterfaces" readonly="yes" type="boolean"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
</interface>
<module name="VBoxSVC" context="LocalServer">
diff --git a/src/VBox/Main/idl/apiwrap-server.xsl b/src/VBox/Main/idl/apiwrap-server.xsl
index 2d79a1d..fcf9ce2 100644
--- a/src/VBox/Main/idl/apiwrap-server.xsl
+++ b/src/VBox/Main/idl/apiwrap-server.xsl
@@ -509,6 +509,15 @@ public:
</xsl:call-template>
</xsl:variable>
+ <!-- interface santiy check, prevents crashes -->
+ <xsl:if test="(count(attribute) + count(method)) = 0">
+ <xsl:message terminate="yes">
+ Interface <xsl:value-of select="@name"/> is empty which causes midl generated proxy
+ stubs to crash. Please add a dummy:<xsl:value-of select="$G_sNewLine"/>
+ <attribute name="midlDoesNotLikeEmptyInterfaces" readonly="yes" type="boolean"/>
+ </xsl:message>
+ </xsl:if>
+
<xsl:choose>
<xsl:when test="$generating = 'sources'">
<xsl:if test="(position() mod 2) = $reminder">
@@ -1112,6 +1121,10 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
</xsl:call-template>
</xsl:variable>
+ <xsl:if test="$attrbasename = 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text> //</xsl:text>
+ </xsl:if>
+
<xsl:value-of select="concat(' virtual HRESULT get', $attrbasename, '(')"/>
<xsl:variable name="passAutoCaller">
<xsl:call-template name="checkoption">
@@ -1182,7 +1195,12 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
<xsl:with-param name="dir">out</xsl:with-param>
</xsl:call-template>
<xsl:text>)
-{
+{</xsl:text>
+ <xsl:if test="$attrbasename = 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text>
+#if 0 /* This is a dummy attribute */</xsl:text>
+ </xsl:if>
+ <xsl:text>
LogRelFlow(("{%p} %s: enter </xsl:text>
<xsl:apply-templates select="@type" mode="logparamtext">
<xsl:with-param name="dir" select="'out'"/>
@@ -1209,7 +1227,7 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
<xsl:apply-templates select="@type" mode="paramvalconversion2tmpvar">
<xsl:with-param name="dir" select="'out'"/>
</xsl:apply-templates>
- <xsl:if test="$attrbasename != 'MidlDoesNotLikEmptyInterfaces'">
+ <xsl:if test="$attrbasename != 'MidlDoesNotLikeEmptyInterfaces'">
<xsl:text>
#ifdef VBOX_WITH_DTRACE_R3_MAIN
</xsl:text>
@@ -1248,7 +1266,7 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
</xsl:apply-templates>
<xsl:text>);
</xsl:text>
- <xsl:if test="$attrbasename != 'MidlDoesNotLikEmptyInterfaces'">
+ <xsl:if test="$attrbasename != 'MidlDoesNotLikeEmptyInterfaces'">
<xsl:text>
#ifdef VBOX_WITH_DTRACE_R3_MAIN
</xsl:text>
@@ -1266,7 +1284,7 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
catch (HRESULT hrc2)
{
hrc = hrc2;</xsl:text>
- <xsl:if test="$attrbasename != 'MidlDoesNotLikEmptyInterfaces'">
+ <xsl:if test="$attrbasename != 'MidlDoesNotLikeEmptyInterfaces'">
<xsl:text>
#ifdef VBOX_WITH_DTRACE_R3_MAIN
</xsl:text>
@@ -1282,7 +1300,7 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
catch (...)
{
hrc = VirtualBoxBase::handleUnexpectedExceptions(this, RT_SRC_POS);</xsl:text>
- <xsl:if test="$attrbasename != 'MidlDoesNotLikEmptyInterfaces'">
+ <xsl:if test="$attrbasename != 'MidlDoesNotLikeEmptyInterfaces'">
<xsl:text>
#ifdef VBOX_WITH_DTRACE_R3_MAIN
</xsl:text>
@@ -1308,7 +1326,14 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
<xsl:with-param name="isref" select="''"/>
</xsl:apply-templates>
<xsl:text>, hrc));
- return hrc;
+ return hrc;</xsl:text>
+ <xsl:if test="$attrbasename = 'MidlDoesNotLikeEmptyInterfaces'">
+ <xsl:text>
+#else /* dummy attribute */
+ return E_FAIL;
+#endif /* dummy attribute */</xsl:text>
+ </xsl:if>
+ <xsl:text>
}
</xsl:text>
<xsl:if test="not(@readonly) or @readonly!='yes'">
@@ -1449,7 +1474,7 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
</xsl:choose>
</xsl:variable>
- <xsl:if test="@name != 'midlDoesNotLikEmptyInterfaces'">
+ <xsl:if test="@name != 'midlDoesNotLikeEmptyInterfaces'">
<xsl:text> probe </xsl:text>
<!-- <xsl:value-of select="concat($dtracetopclass, '__get__', $dtraceattrname, '__enter(struct ', $topclass)"/> -->
<xsl:value-of select="concat($dtracetopclass, '__get__', $dtraceattrname, '__enter(void')"/>
@@ -1464,7 +1489,7 @@ Returns empty if not needed, non-empty ('yes') if needed. -->
<xsl:text>);
</xsl:text>
</xsl:if>
- <xsl:if test="(not(@readonly) or @readonly!='yes') and @name != 'midlDoesNotLikEmptyInterfaces'">
+ <xsl:if test="(not(@readonly) or @readonly!='yes') and @name != 'midlDoesNotLikeEmptyInterfaces'">
<xsl:text> probe </xsl:text>
<!-- <xsl:value-of select="concat($topclass, '__set__', $dtraceattrname, '__enter(struct ', $topclass, ' *a_pThis, ')"/>-->
<xsl:value-of select="concat($topclass, '__set__', $dtraceattrname, '__enter(void *a_pThis, ')"/>
diff --git a/src/VBox/Main/idl/comimpl.xsl b/src/VBox/Main/idl/comimpl.xsl
index 2d2024c..6d4c67d 100644
--- a/src/VBox/Main/idl/comimpl.xsl
+++ b/src/VBox/Main/idl/comimpl.xsl
@@ -279,7 +279,7 @@
</xsl:otherwise>
</xsl:choose>
- <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikEmptyInterfaces']">
+ <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikeEmptyInterfaces']">
<xsl:variable name="aName" select="concat('a_', at name)"/>
<xsl:variable name="aTypeName">
<xsl:call-template name="typeIdl2Back">
@@ -555,6 +555,18 @@
{
return mEvent->GetVetos(ComSafeArrayOutArg(aVetos));
}
+ STDMETHOD(AddApproval)(IN_BSTR aReason)
+ {
+ return mEvent->AddApproval(aReason);
+ }
+ STDMETHOD(IsApproved)(BOOL *aResult)
+ {
+ return mEvent->IsApproved(aResult);
+ }
+ STDMETHOD(GetApprovals)(ComSafeArrayOut(BSTR, aReasons))
+ {
+ return mEvent->GetApprovals(ComSafeArrayOutArg(aReasons));
+ }
private:
ComObjPtr<VBoxVetoEvent> mEvent;
]]></xsl:text>
@@ -786,7 +798,7 @@ HRESULT VBoxEventDesc::reinit(VBoxEventType_T aType, ...)
</xsl:otherwise>
</xsl:choose>
- <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikEmptyInterfaces']">
+ <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikeEmptyInterfaces']">
<xsl:variable name="aName" select="concat('a_', at name)"/>
<xsl:variable name="aTypeName">
<xsl:call-template name="typeIdl2Back">
@@ -824,7 +836,7 @@ HRESULT VBoxEventDesc::reinit(VBoxEventType_T aType, ...)
</xsl:otherwise>
</xsl:choose>
- <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikEmptyInterfaces']">
+ <xsl:for-each select="key('G_keyInterfacesByName', $name)/attribute[@name != 'midlDoesNotLikeEmptyInterfaces']">
<xsl:variable name="aName" select="concat('a_', at name)"/>
<xsl:choose>
<xsl:when test="@safearray='yes'">
diff --git a/src/VBox/Main/include/AdditionsFacilityImpl.h b/src/VBox/Main/include/AdditionsFacilityImpl.h
index 2eae0c0..59d78ad 100644
--- a/src/VBox/Main/include/AdditionsFacilityImpl.h
+++ b/src/VBox/Main/include/AdditionsFacilityImpl.h
@@ -1,3 +1,4 @@
+/* $Id: AdditionsFacilityImpl.h $ */
/** @file
* VirtualBox COM class implementation
*/
diff --git a/src/VBox/Main/include/ApplianceImpl.h b/src/VBox/Main/include/ApplianceImpl.h
index 71303cf..b6050a6 100644
--- a/src/VBox/Main/include/ApplianceImpl.h
+++ b/src/VBox/Main/include/ApplianceImpl.h
@@ -105,6 +105,7 @@ private:
ComPtr<IProgress> &aProgress);
HRESULT getWarnings(std::vector<com::Utf8Str> &aWarnings);
HRESULT getPasswordIds(std::vector<com::Utf8Str> &aIdentifiers);
+ HRESULT getMediumIdsForPasswordId(const com::Utf8Str &aPasswordId, std::vector<com::Guid> &aIdentifiers);
HRESULT addPasswords(const std::vector<com::Utf8Str> &aIdentifiers,
const std::vector<com::Utf8Str> &aPasswords);
diff --git a/src/VBox/Main/include/ApplianceImplPrivate.h b/src/VBox/Main/include/ApplianceImplPrivate.h
index e02aa58..d123192 100644
--- a/src/VBox/Main/include/ApplianceImplPrivate.h
+++ b/src/VBox/Main/include/ApplianceImplPrivate.h
@@ -1,3 +1,4 @@
+/* $Id: ApplianceImplPrivate.h $ */
/** @file
* VirtualBox Appliance private data definitions
*/
@@ -33,6 +34,8 @@ class VirtualSystemDescription;
typedef std::pair<Utf8Str, Utf8Str> STRPAIR;
+typedef std::vector<com::Guid> GUIDVEC;
+
/* Describe a location for the import/export. The location could be a file on a
* local hard disk or a remote target based on the supported inet protocols. */
struct LocationInfo
@@ -104,6 +107,8 @@ struct Appliance::Data
/** Sequence of password identifiers to encrypt disk images during export. */
std::vector<com::Utf8Str> m_vecPasswordIdentifiers;
+ /** Map to get all medium identifiers assoicated with a given password identifier. */
+ std::map<com::Utf8Str, GUIDVEC> m_mapPwIdToMediumIds;
/** Secret key store used to hold the passwords during export. */
SecretKeyStore *m_pSecretKeyStore;
/** Number of passwords provided. */
diff --git a/src/VBox/Main/include/AudioAdapterImpl.h b/src/VBox/Main/include/AudioAdapterImpl.h
index bc8a557..4d9004f 100644
--- a/src/VBox/Main/include/AudioAdapterImpl.h
+++ b/src/VBox/Main/include/AudioAdapterImpl.h
@@ -56,6 +56,10 @@ private:
// wrapped IAudioAdapter properties
HRESULT getEnabled(BOOL *aEnabled);
HRESULT setEnabled(BOOL aEnabled);
+ HRESULT getEnabledIn(BOOL *aEnabled);
+ HRESULT setEnabledIn(BOOL aEnabled);
+ HRESULT getEnabledOut(BOOL *aEnabled);
+ HRESULT setEnabledOut(BOOL aEnabled);
HRESULT getAudioDriver(AudioDriverType_T *aAudioDriver);
HRESULT setAudioDriver(AudioDriverType_T aAudioDriver);
HRESULT getAudioController(AudioControllerType_T *aAudioController);
diff --git a/src/VBox/Main/include/AudioSnifferInterface.h b/src/VBox/Main/include/AudioSnifferInterface.h
index e7461f5..036eae0 100644
--- a/src/VBox/Main/include/AudioSnifferInterface.h
+++ b/src/VBox/Main/include/AudioSnifferInterface.h
@@ -1,3 +1,4 @@
+/* $Id: AudioSnifferInterface.h $ */
/** @file
* VirtualBox Driver interface to Audio Sniffer device
*/
diff --git a/src/VBox/Main/include/AutoCaller.h b/src/VBox/Main/include/AutoCaller.h
index 1f190a8..8950325 100644
--- a/src/VBox/Main/include/AutoCaller.h
+++ b/src/VBox/Main/include/AutoCaller.h
@@ -1,3 +1,4 @@
+/* $Id: AutoCaller.h $ */
/** @file
*
* VirtualBox object caller handling definitions
diff --git a/src/VBox/Main/include/AutoStateDep.h b/src/VBox/Main/include/AutoStateDep.h
index fa5a3a1..f90dec9 100644
--- a/src/VBox/Main/include/AutoStateDep.h
+++ b/src/VBox/Main/include/AutoStateDep.h
@@ -1,3 +1,4 @@
+/* $Id: AutoStateDep.h $ */
#ifndef ____H_AUTOSTATEDEP
#define ____H_AUTOSTATEDEP
diff --git a/src/VBox/Main/include/AutostartDb.h b/src/VBox/Main/include/AutostartDb.h
index 541766e..a516224 100644
--- a/src/VBox/Main/include/AutostartDb.h
+++ b/src/VBox/Main/include/AutostartDb.h
@@ -1,3 +1,4 @@
+/* $Id: AutostartDb.h $ */
/** @file
* Main - Autostart database Interfaces.
*/
diff --git a/src/VBox/Main/include/BandwidthControlImpl.h b/src/VBox/Main/include/BandwidthControlImpl.h
index a9bc07f..e47ac0e 100644
--- a/src/VBox/Main/include/BandwidthControlImpl.h
+++ b/src/VBox/Main/include/BandwidthControlImpl.h
@@ -1,3 +1,4 @@
+/* $Id: BandwidthControlImpl.h $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/include/BandwidthGroupImpl.h b/src/VBox/Main/include/BandwidthGroupImpl.h
index ace58f9..784af40 100644
--- a/src/VBox/Main/include/BandwidthGroupImpl.h
+++ b/src/VBox/Main/include/BandwidthGroupImpl.h
@@ -1,3 +1,4 @@
+/* $Id: BandwidthGroupImpl.h $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/include/ConsoleImpl.h b/src/VBox/Main/include/ConsoleImpl.h
index 5209452..f98d0d2 100644
--- a/src/VBox/Main/include/ConsoleImpl.h
+++ b/src/VBox/Main/include/ConsoleImpl.h
@@ -145,6 +145,7 @@ public:
#endif
const ComPtr<IMachine> &i_machine() const { return mMachine; }
+ const Bstr &i_getId() const { return mstrUuid; }
bool i_useHostClipboard() { return mfUseHostClipboard; }
@@ -974,6 +975,9 @@ private:
/** Local machine state value. */
MachineState_T mMachineState;
+ /** Machine uuid string. */
+ Bstr mstrUuid;
+
/** Pointer to the progress object of a live cancelable task.
*
* This is currently only used by Console::Teleport(), but is intended to later
diff --git a/src/VBox/Main/include/DisplayUtils.h b/src/VBox/Main/include/DisplayUtils.h
index e69784e..ae805db 100644
--- a/src/VBox/Main/include/DisplayUtils.h
+++ b/src/VBox/Main/include/DisplayUtils.h
@@ -1,3 +1,4 @@
+/* $Id: DisplayUtils.h $ */
/** @file
* Display helper declarations
*/
diff --git a/src/VBox/Main/include/EventImpl.h b/src/VBox/Main/include/EventImpl.h
index 52b5746..faade26 100644
--- a/src/VBox/Main/include/EventImpl.h
+++ b/src/VBox/Main/include/EventImpl.h
@@ -78,6 +78,9 @@ private:
HRESULT addVeto(const com::Utf8Str &aReason);
HRESULT isVetoed(BOOL *aResult);
HRESULT getVetos(std::vector<com::Utf8Str> &aResult);
+ HRESULT addApproval(const com::Utf8Str &aReason);
+ HRESULT isApproved(BOOL *aResult);
+ HRESULT getApprovals(std::vector<com::Utf8Str> &aResult);
struct Data;
Data* m;
diff --git a/src/VBox/Main/include/GuestCtrlImplPrivate.h b/src/VBox/Main/include/GuestCtrlImplPrivate.h
index 4952f44..84d7b45 100644
--- a/src/VBox/Main/include/GuestCtrlImplPrivate.h
+++ b/src/VBox/Main/include/GuestCtrlImplPrivate.h
@@ -1,10 +1,10 @@
+/* $Id: GuestCtrlImplPrivate.h $ */
/** @file
- *
* Internal helpers/structures for guest control functionality.
*/
/*
- * Copyright (C) 2011-2013 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -19,9 +19,12 @@
#define ____H_GUESTIMPLPRIVATE
#include "ConsoleImpl.h"
+#include "Global.h"
#include <iprt/asm.h>
+#include <iprt/env.h>
#include <iprt/semaphore.h>
+#include <iprt/cpp/utils.h>
#include <VBox/com/com.h>
#include <VBox/com/ErrorInfo.h>
@@ -58,48 +61,516 @@ struct GuestCredentials
};
-typedef std::vector <Utf8Str> GuestEnvironmentArray;
-class GuestEnvironment
+
+/**
+ * Wrapper around the RTEnv API, unusable base class.
+ *
+ * @remarks Feel free to elevate this class to iprt/cpp/env.h as RTCEnv.
+ */
+class GuestEnvironmentBase
{
public:
+ /**
+ * Default constructor.
+ *
+ * The user must invoke one of the init methods before using the object.
+ */
+ GuestEnvironmentBase(void)
+ : m_hEnv(NIL_RTENV)
+ , m_cRefs(1)
+ { }
- int BuildEnvironmentBlock(void **ppvEnv, size_t *pcbEnv, uint32_t *pcEnvVars);
+ /**
+ * Destructor.
+ */
+ virtual ~GuestEnvironmentBase(void)
+ {
+ Assert(m_cRefs <= 1);
+ int rc = RTEnvDestroy(m_hEnv); AssertRC(rc);
+ m_hEnv = NIL_RTENV;
+ }
- void Clear(void);
+ /**
+ * Retains a reference to this object.
+ * @returns New reference count.
+ * @remarks Sharing an object is currently only safe if no changes are made to
+ * it because RTENV does not yet implement any locking. For the only
+ * purpose we need this, implementing IGuestProcess::environment by
+ * using IGuestSession::environmentBase, that's fine as the session
+ * base environment is immutable.
+ */
+ uint32_t retain(void)
+ {
+ uint32_t cRefs = ASMAtomicIncU32(&m_cRefs);
+ Assert(cRefs > 1); Assert(cRefs < _1M);
+ return cRefs;
- int CopyFrom(const GuestEnvironmentArray &environment);
+ }
+ /** Useful shortcut. */
+ uint32_t retainConst(void) const { return unconst(this)->retain(); }
- int CopyTo(GuestEnvironmentArray &environment);
+ /**
+ * Releases a reference to this object, deleting the object when reaching zero.
+ * @returns New reference count.
+ */
+ uint32_t release(void)
+ {
+ uint32_t cRefs = ASMAtomicDecU32(&m_cRefs);
+ Assert(cRefs < _1M);
+ if (cRefs == 0)
+ delete this;
+ return cRefs;
+ }
- static void FreeEnvironmentBlock(void *pvEnv);
+ /** Useful shortcut. */
+ uint32_t releaseConst(void) const { return unconst(this)->retain(); }
- Utf8Str Get(const Utf8Str &strKey);
+ /**
+ * Checks if the environment has been successfully initialized or not.
+ *
+ * @returns @c true if initialized, @c false if not.
+ */
+ bool isInitialized(void) const
+ {
+ return m_hEnv != NIL_RTENV;
+ }
- Utf8Str Get(size_t nPos);
+ /**
+ * Returns the variable count.
+ * @return Number of variables.
+ * @sa RTEnvCountEx
+ */
+ uint32_t count(void) const
+ {
+ return RTEnvCountEx(m_hEnv);
+ }
+
+ /**
+ * Deletes the environment change record entirely.
+ *
+ * The count() method will return zero after this call.
+ *
+ * @sa RTEnvReset
+ */
+ void reset(void)
+ {
+ int rc = RTEnvReset(m_hEnv);
+ AssertRC(rc);
+ }
+
+ /**
+ * Exports the environment change block as an array of putenv style strings.
+ *
+ *
+ * @returns VINF_SUCCESS or VERR_NO_MEMORY.
+ * @param pArray The output array.
+ */
+ int queryPutEnvArray(std::vector<com::Utf8Str> *pArray) const
+ {
+ uint32_t cVars = RTEnvCountEx(m_hEnv);
+ try
+ {
+ pArray->resize(cVars);
+ for (uint32_t iVar = 0; iVar < cVars; iVar++)
+ {
+ const char *psz = RTEnvGetByIndexRawEx(m_hEnv, iVar);
+ AssertReturn(psz, VERR_INTERNAL_ERROR_3); /* someone is racing us! */
+ (*pArray)[iVar] = psz;
+ }
+ return VINF_SUCCESS;
+ }
+ catch (std::bad_alloc &)
+ {
+ return VERR_NO_MEMORY;
+ }
+ }
- bool Has(const Utf8Str &strKey);
+ /**
+ * Applies an array of putenv style strings.
+ *
+ * @returns IPRT status code.
+ * @param rArray The array with the putenv style strings.
+ * @sa RTEnvPutEnvEx
+ */
+ int applyPutEnvArray(const std::vector<com::Utf8Str> &rArray)
+ {
+ size_t cArray = rArray.size();
+ for (size_t i = 0; i < cArray; i++)
+ {
+ int rc = RTEnvPutEx(m_hEnv, rArray[i].c_str());
+ if (RT_FAILURE(rc))
+ return rc;
+ }
+ return VINF_SUCCESS;
+ }
- int Set(const Utf8Str &strKey, const Utf8Str &strValue);
+ /**
+ * Applies the changes from another environment to this.
+ *
+ * @returns IPRT status code.
+ * @param rChanges Reference to an environment which variables will be
+ * imported and, if it's a change record, schedule
+ * variable unsets will be applied.
+ * @sa RTEnvApplyChanges
+ */
+ int applyChanges(const GuestEnvironmentBase &rChanges)
+ {
+ return RTEnvApplyChanges(m_hEnv, rChanges.m_hEnv);
+ }
- int Set(const Utf8Str &strPair);
- size_t Size(void);
+ /**
+ * See RTEnvQueryUtf8Block for details.
+ * @returns IPRT status code.
+ * @param ppszzBlock Where to return the block pointer.
+ * @param pcbBlock Where to optionally return the block size.
+ * @sa RTEnvQueryUtf8Block
+ */
+ int queryUtf8Block(char **ppszzBlock, size_t *pcbBlock)
+ {
+ return RTEnvQueryUtf8Block(m_hEnv, true /*fSorted*/, ppszzBlock, pcbBlock);
+ }
- int Unset(const Utf8Str &strKey);
+ /**
+ * Frees what queryUtf8Block returned, NULL ignored.
+ * @sa RTEnvFreeUtf8Block
+ */
+ static void freeUtf8Block(char *pszzBlock)
+ {
+ return RTEnvFreeUtf8Block(pszzBlock);
+ }
-public:
+ /**
+ * Applies a block on the format returned by queryUtf8Block.
+ *
+ * @returns IPRT status code.
+ * @param pszzBlock Pointer to the block.
+ * @param cbBlock The size of the block.
+ * @param fNoEqualMeansUnset Whether the lack of a '=' (equal) sign in a
+ * string means it should be unset (@c true), or if
+ * it means the variable should be defined with an
+ * empty value (@c false, the default).
+ * @todo move this to RTEnv!
+ */
+ int copyUtf8Block(const char *pszzBlock, size_t cbBlock, bool fNoEqualMeansUnset = false)
+ {
+ int rc = VINF_SUCCESS;
+ while (cbBlock > 0 && *pszzBlock != '\0')
+ {
+ const char *pszEnd = (const char *)memchr(pszzBlock, '\0', cbBlock);
+ if (!pszEnd)
+ return VERR_BUFFER_UNDERFLOW;
+ int rc2;
+ if (fNoEqualMeansUnset || strchr(pszzBlock, '='))
+ rc2 = RTEnvPutEx(m_hEnv, pszzBlock);
+ else
+ rc2 = RTEnvSetEx(m_hEnv, pszzBlock, "");
+ if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
+ rc = rc2;
+
+ /* Advance. */
+ cbBlock -= pszEnd - pszzBlock;
+ if (cbBlock < 2)
+ return VERR_BUFFER_UNDERFLOW;
+ cbBlock--;
+ pszzBlock = pszEnd + 1;
+ }
- GuestEnvironment& operator=(const GuestEnvironmentArray &that);
+ /* The remainder must be zero padded. */
+ if (RT_SUCCESS(rc))
+ {
+ if (ASMMemIsAll8(pszzBlock, cbBlock, 0))
+ return VINF_SUCCESS;
+ return VERR_TOO_MUCH_DATA;
+ }
+ return rc;
+ }
- GuestEnvironment& operator=(const GuestEnvironment &that);
-protected:
+ /**
+ * Get an environment variable.
+ *
+ * @returns IPRT status code.
+ * @param rName The variable name.
+ * @param pValue Where to return the value.
+ * @sa RTEnvGetEx
+ */
+ int getVariable(const com::Utf8Str &rName, com::Utf8Str *pValue) const
+ {
+ size_t cchNeeded;
+ int rc = RTEnvGetEx(m_hEnv, rName.c_str(), NULL, 0, &cchNeeded);
+ if ( RT_SUCCESS(rc)
+ || rc == VERR_BUFFER_OVERFLOW)
+ {
+ try
+ {
+ pValue->reserve(cchNeeded + 1);
+ rc = RTEnvGetEx(m_hEnv, rName.c_str(), pValue->mutableRaw(), pValue->capacity(), NULL);
+ pValue->jolt();
+ }
+ catch (std::bad_alloc &)
+ {
+ rc = VERR_NO_STR_MEMORY;
+ }
+ }
+ return rc;
+ }
- int appendToEnvBlock(const char *pszEnv, void **ppvList, size_t *pcbList, uint32_t *pcEnvVars);
+ /**
+ * Checks if the given variable exists.
+ *
+ * @returns @c true if it exists, @c false if not or if it's an scheduled unset
+ * in a environment change record.
+ * @param rName The variable name.
+ * @sa RTEnvExistEx
+ */
+ bool doesVariableExist(const com::Utf8Str &rName) const
+ {
+ return RTEnvExistEx(m_hEnv, rName.c_str());
+ }
+
+ /**
+ * Set an environment variable.
+ *
+ * @returns IPRT status code.
+ * @param rName The variable name.
+ * @param rValue The value of the variable.
+ * @sa RTEnvSetEx
+ */
+ int setVariable(const com::Utf8Str &rName, const com::Utf8Str &rValue)
+ {
+ return RTEnvSetEx(m_hEnv, rName.c_str(), rValue.c_str());
+ }
+
+ /**
+ * Unset an environment variable.
+ *
+ * @returns IPRT status code.
+ * @param rName The variable name.
+ * @sa RTEnvUnsetEx
+ */
+ int unsetVariable(const com::Utf8Str &rName)
+ {
+ return RTEnvUnsetEx(m_hEnv, rName.c_str());
+ }
protected:
+ /**
+ * Copy constructor.
+ * @throws HRESULT
+ */
+ GuestEnvironmentBase(const GuestEnvironmentBase &rThat, bool fChangeRecord)
+ : m_hEnv(NIL_RTENV)
+ , m_cRefs(1)
+ {
+ int rc = cloneCommon(rThat, fChangeRecord);
+ if (RT_FAILURE(rc))
+ throw (Global::vboxStatusCodeToCOM(rc));
+ }
+
+ /**
+ * Common clone/copy method with type conversion abilities.
+ *
+ * @returns IPRT status code.
+ * @param rThat The object to clone.
+ * @param fChangeRecord Whether the this instance is a change record (true)
+ * or normal (false) environment.
+ */
+ int cloneCommon(const GuestEnvironmentBase &rThat, bool fChangeRecord)
+ {
+ int rc = VINF_SUCCESS;
+ RTENV hNewEnv = NIL_RTENV;
+ if (rThat.m_hEnv != NIL_RTENV)
+ {
+ if (RTEnvIsChangeRecord(rThat.m_hEnv) == fChangeRecord)
+ rc = RTEnvClone(&hNewEnv, rThat.m_hEnv);
+ else
+ {
+ /* Need to type convert it. */
+ if (fChangeRecord)
+ rc = RTEnvCreateChangeRecord(&hNewEnv);
+ else
+ rc = RTEnvCreate(&hNewEnv);
+ if (RT_SUCCESS(rc))
+ {
+ rc = RTEnvApplyChanges(hNewEnv, rThat.m_hEnv);
+ if (RT_FAILURE(rc))
+ RTEnvDestroy(hNewEnv);
+ }
+ }
+
+ }
+ if (RT_SUCCESS(rc))
+ {
+ RTEnvDestroy(m_hEnv);
+ m_hEnv = hNewEnv;
+ }
+ return rc;
+ }
+
- std::map <Utf8Str, Utf8Str> mEnvironment;
+ /** The environment change record. */
+ RTENV m_hEnv;
+ /** Reference counter. */
+ uint32_t volatile m_cRefs;
+};
+
+class GuestEnvironmentChanges;
+
+
+/**
+ * Wrapper around the RTEnv API for a normal environment.
+ */
+class GuestEnvironment : public GuestEnvironmentBase
+{
+public:
+ /**
+ * Default constructor.
+ *
+ * The user must invoke one of the init methods before using the object.
+ */
+ GuestEnvironment(void)
+ : GuestEnvironmentBase()
+ { }
+
+ /**
+ * Copy operator.
+ * @param rThat The object to copy.
+ * @throws HRESULT
+ */
+ GuestEnvironment(const GuestEnvironment &rThat)
+ : GuestEnvironmentBase(rThat, false /*fChangeRecord*/)
+ { }
+
+ /**
+ * Copy operator.
+ * @param rThat The object to copy.
+ * @throws HRESULT
+ */
+ GuestEnvironment(const GuestEnvironmentBase &rThat)
+ : GuestEnvironmentBase(rThat, false /*fChangeRecord*/)
+ { }
+
+ /**
+ * Initialize this as a normal environment block.
+ * @returns IPRT status code.
+ */
+ int initNormal(void)
+ {
+ AssertReturn(m_hEnv == NIL_RTENV, VERR_WRONG_ORDER);
+ return RTEnvCreate(&m_hEnv);
+ }
+
+ /**
+ * Replaces this environemnt with that in @a rThat.
+ *
+ * @returns IPRT status code
+ * @param rThat The environment to copy. If it's a different type
+ * we'll convert the data to a normal environment block.
+ */
+ int copy(const GuestEnvironmentBase &rThat)
+ {
+ return cloneCommon(rThat, false /*fChangeRecord*/);
+ }
+
+ /**
+ * @copydoc copy()
+ */
+ GuestEnvironment &operator=(const GuestEnvironmentBase &rThat)
+ {
+ int rc = cloneCommon(rThat, true /*fChangeRecord*/);
+ if (RT_FAILURE(rc))
+ throw (Global::vboxStatusCodeToCOM(rc));
+ return *this;
+ }
+
+ /** @copydoc copy() */
+ GuestEnvironment &operator=(const GuestEnvironment &rThat)
+ { return operator=((const GuestEnvironmentBase &)rThat); }
+
+ /** @copydoc copy() */
+ GuestEnvironment &operator=(const GuestEnvironmentChanges &rThat)
+ { return operator=((const GuestEnvironmentBase &)rThat); }
+
+};
+
+
+/**
+ * Wrapper around the RTEnv API for a environment change record.
+ *
+ * This class is used as a record of changes to be applied to a different
+ * environment block (in VBoxService before launching a new process).
+ */
+class GuestEnvironmentChanges : public GuestEnvironmentBase
+{
+public:
+ /**
+ * Default constructor.
+ *
+ * The user must invoke one of the init methods before using the object.
+ */
+ GuestEnvironmentChanges(void)
+ : GuestEnvironmentBase()
+ { }
+
+ /**
+ * Copy operator.
+ * @param rThat The object to copy.
+ * @throws HRESULT
+ */
+ GuestEnvironmentChanges(const GuestEnvironmentChanges &rThat)
+ : GuestEnvironmentBase(rThat, true /*fChangeRecord*/)
+ { }
+
+ /**
+ * Copy operator.
+ * @param rThat The object to copy.
+ * @throws HRESULT
+ */
+ GuestEnvironmentChanges(const GuestEnvironmentBase &rThat)
+ : GuestEnvironmentBase(rThat, true /*fChangeRecord*/)
+ { }
+
+ /**
+ * Initialize this as a environment change record.
+ * @returns IPRT status code.
+ */
+ int initChangeRecord(void)
+ {
+ AssertReturn(m_hEnv == NIL_RTENV, VERR_WRONG_ORDER);
+ return RTEnvCreateChangeRecord(&m_hEnv);
+ }
+
+ /**
+ * Replaces this environemnt with that in @a rThat.
+ *
+ * @returns IPRT status code
+ * @param rThat The environment to copy. If it's a different type
+ * we'll convert the data to a set of changes.
+ */
+ int copy(const GuestEnvironmentBase &rThat)
+ {
+ return cloneCommon(rThat, true /*fChangeRecord*/);
+ }
+
+ /**
+ * @copydoc copy()
+ */
+ GuestEnvironmentChanges &operator=(const GuestEnvironmentBase &rThat)
+ {
+ int rc = cloneCommon(rThat, true /*fChangeRecord*/);
+ if (RT_FAILURE(rc))
+ throw (Global::vboxStatusCodeToCOM(rc));
+ return *this;
+ }
+
+ /** @copydoc copy() */
+ GuestEnvironmentChanges &operator=(const GuestEnvironmentChanges &rThat)
+ { return operator=((const GuestEnvironmentBase &)rThat); }
+
+ /** @copydoc copy() */
+ GuestEnvironmentChanges &operator=(const GuestEnvironment &rThat)
+ { return operator=((const GuestEnvironmentBase &)rThat); }
};
@@ -126,17 +597,20 @@ struct GuestFileOpenInfo
{
/** The filename. */
Utf8Str mFileName;
- /** Then file's opening mode. */
- Utf8Str mOpenMode;
- /** The file's disposition mode. */
- Utf8Str mDisposition;
- /** The file's sharing mode.
- **@todo Not implemented yet.*/
- Utf8Str mSharingMode;
+ /** The file access mode. */
+ FileAccessMode_T mAccessMode;
+ /** String translation of mFileAccessMode for the GAs. */
+ const char *mpszAccessMode;
+ /** The file open action. */
+ FileOpenAction_T mOpenAction;
+ /** String translation of mOpenAction for the GAs. */
+ const char *mpszOpenAction;
+ /** The file sharing mode. */
+ FileSharingMode_T mSharingMode;
/** Octal creation mode. */
uint32_t mCreationMode;
- /** The initial offset on open. */
- uint64_t mInitialOffset;
+ /** Extended open flags (currently none defined). */
+ uint32_t mfOpenEx;
};
@@ -219,10 +693,12 @@ public:
/** The process' friendly name. */
Utf8Str mName;
- /** The actual command to execute. */
- Utf8Str mCommand;
+ /** The executable. */
+ Utf8Str mExecutable;
+ /** Arguments vector (starting with argument \#0). */
ProcessArguments mArguments;
- GuestEnvironment mEnvironment;
+ /** The process environment change record. */
+ GuestEnvironmentChanges mEnvironmentChanges;
/** Process creation flags. */
uint32_t mFlags;
ULONG mTimeoutMS;
@@ -654,14 +1130,25 @@ protected:
protected:
- /**
- * Commom parameters for all derived objects, when then have
- * an own mData structure to keep their specific data around.
- */
-
+ /** @name Common parameters for all derived objects. They have their own
+ * mData structure to keep their specific data around.
+ * @{ */
/** Pointer to parent session. Per definition
* this objects *always* lives shorter than the
- * parent. */
+ * parent.
+ * @todo r=bird: When wanting to use mSession in the
+ * IGuestProcess::getEnvironment() implementation I wanted to access
+ * GuestSession::mData::mpBaseEnvironment. Seeing the comment in
+ * GuestProcess::terminate() saying:
+ * "Now only API clients still can hold references to it."
+ * and recalling seeing similar things in VirtualBox.xidl or some such place,
+ * I'm wondering how this "per definition" behavior is enforced. Is there any
+ * GuestProcess:uninit() call or similar magic that invalidates objects that
+ * GuestSession loses track of in place like GuestProcess::terminate() that I've
+ * failed to spot?
+ *
+ * Please enlighten me.
+ */
GuestSession *mSession;
/** The object ID -- must be unique for each guest
* object and is encoded into the context ID. Must
@@ -670,6 +1157,7 @@ protected:
* For guest processes this is the internal PID,
* for guest files this is the internal file ID. */
uint32_t mObjectID;
+ /** @} */
};
-#endif // ____H_GUESTIMPLPRIVATE
+#endif // !____H_GUESTIMPLPRIVATE
diff --git a/src/VBox/Main/include/GuestDnDPrivate.h b/src/VBox/Main/include/GuestDnDPrivate.h
index 6046dbe..a08647a 100644
--- a/src/VBox/Main/include/GuestDnDPrivate.h
+++ b/src/VBox/Main/include/GuestDnDPrivate.h
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -19,80 +19,383 @@
#ifndef ____H_GUESTDNDPRIVATE
#define ____H_GUESTDNDPRIVATE
+#include <iprt/dir.h>
+#include <iprt/file.h>
+
#include "VBox/hgcmsvc.h" /* For PVBOXHGCMSVCPARM. */
+#include "VBox/GuestHost/DragAndDrop.h"
-/* Forward prototype declarations. */
+/**
+ * Forward prototype declarations.
+ */
class Guest;
+class GuestDnDBase;
+class GuestDnDResponse;
+class GuestDnDSource;
+class GuestDnDTarget;
class Progress;
+class GuestDnDCallbackEvent
+{
+public:
+
+ GuestDnDCallbackEvent(void)
+ : mSemEvent(NIL_RTSEMEVENT)
+ , mRc(VINF_SUCCESS) { }
+
+ virtual ~GuestDnDCallbackEvent(void);
+
+public:
+
+ int Reset(void);
+
+ int Notify(int rc);
+
+ int Result(void) const { return mRc; }
+
+ int Wait(RTMSINTERVAL msTimeout);
+
+protected:
+
+ /** Event semaphore to notify on error/completion. */
+ RTSEMEVENT mSemEvent;
+ /** Callback result. */
+ int mRc;
+};
+
+/**
+ * Structure for keeping the (URI) data to be sent/received.
+ */
+typedef struct GuestDnDData
+{
+ GuestDnDData(void)
+ : cbToProcess(0)
+ , cbProcessed(0) { }
+
+ void Reset(void)
+ {
+ vecData.clear();
+ cbToProcess = 0;
+ cbProcessed = 0;
+ }
+
+ /** Array (vector) of guest DnD data. This might be an URI list, according
+ * to the format being set. */
+ std::vector<BYTE> vecData;
+ /** Overall size (in bytes) of data to send. */
+ uint64_t cbToProcess;
+ /** Overall size (in bytes) of processed file data. */
+ uint64_t cbProcessed;
+
+} GuestDnDData;
+
+/**
+ * Structure for keeping around URI (list) data.
+ */
+typedef struct GuestDnDURIData
+{
+ GuestDnDURIData(void)
+ : pvScratchBuf(NULL)
+ , cbScratchBuf(0) { }
+
+ virtual ~GuestDnDURIData(void)
+ {
+ Reset();
+ }
+
+ void Reset(void)
+ {
+ lstURI.Clear();
+#if 0 /* Currently the scratch buffer will be maintained elswewhere. */
+ if (pvScratchBuf)
+ {
+ RTMemFree(pvScratchBuf);
+ pvScratchBuf = NULL;
+ }
+ cbScratchBuf = 0;
+#else
+ pvScratchBuf = NULL;
+ cbScratchBuf = 0;
+#endif
+ }
+
+ DNDDIRDROPPEDFILES mDropDir;
+ /** (Non-recursive) List of root URI objects to receive. */
+ DnDURIList lstURI;
+ /** Current object to receive. */
+ DnDURIObject objURI;
+ /** Pointer to an optional scratch buffer to use for
+ * doing the actual chunk transfers. */
+ void *pvScratchBuf;
+ /** Size (in bytes) of scratch buffer. */
+ size_t cbScratchBuf;
+
+} GuestDnDURIData;
+
+/**
+ * Context structure for sending data to the guest.
+ */
+typedef struct SENDDATACTX
+{
+ /** Pointer to guest target class this context belongs to. */
+ GuestDnDTarget *mpTarget;
+ /** Pointer to guest response class this context belongs to. */
+ GuestDnDResponse *mpResp;
+ /** Flag indicating whether a file transfer is active and
+ * initiated by the host. */
+ bool mIsActive;
+ /** Target (VM) screen ID. */
+ uint32_t mScreenID;
+ /** Drag'n drop format to send. */
+ com::Utf8Str mFormat;
+ /** Drag'n drop data to send.
+ * This can be arbitrary data or an URI list. */
+ GuestDnDData mData;
+ /** URI data structure. */
+ GuestDnDURIData mURI;
+ /** Callback event to use. */
+ GuestDnDCallbackEvent mCallback;
+
+} SENDDATACTX, *PSENDDATACTX;
+
+/**
+ * Context structure for receiving data from the guest.
+ */
+typedef struct RECVDATACTX
+{
+ /** Pointer to guest source class this context belongs to. */
+ GuestDnDSource *mpSource;
+ /** Pointer to guest response class this context belongs to. */
+ GuestDnDResponse *mpResp;
+ /** Flag indicating whether a file transfer is active and
+ * initiated by the host. */
+ bool mIsActive;
+ /** Drag'n drop format to send. */
+ com::Utf8Str mFormat;
+ /** Desired drop action to perform on the host.
+ * Needed to tell the guest if data has to be
+ * deleted e.g. when moving instead of copying. */
+ uint32_t mAction;
+ /** Drag'n drop received from the guest.
+ * This can be arbitrary data or an URI list. */
+ GuestDnDData mData;
+ /** URI data structure. */
+ GuestDnDURIData mURI;
+ /** Callback event to use. */
+ GuestDnDCallbackEvent mCallback;
+
+} RECVDATACTX, *PRECVDATACTX;
+
+/**
+ * Simple structure for a buffered guest DnD message.
+ */
+class GuestDnDMsg
+{
+public:
+
+ GuestDnDMsg(void)
+ : uMsg(0)
+ , cParms(0)
+ , cParmsAlloc(0)
+ , paParms(NULL) { }
+
+ virtual ~GuestDnDMsg(void)
+ {
+ if (paParms)
+ {
+ /* Remove deep copies. */
+ for (uint32_t i = 0; i < cParms; i++)
+ {
+ if ( paParms[i].type == VBOX_HGCM_SVC_PARM_PTR
+ && paParms[i].u.pointer.addr)
+ {
+ RTMemFree(paParms[i].u.pointer.addr);
+ }
+ }
+
+ delete paParms;
+ }
+ }
+
+public:
+
+ PVBOXHGCMSVCPARM getNextParam(void)
+ {
+ if (cParms >= cParmsAlloc)
+ {
+ paParms = (PVBOXHGCMSVCPARM)RTMemRealloc(paParms, (cParmsAlloc + 4) * sizeof(VBOXHGCMSVCPARM));
+ if (!paParms)
+ throw VERR_NO_MEMORY;
+ RT_BZERO(&paParms[cParmsAlloc], 4 * sizeof(VBOXHGCMSVCPARM));
+ cParmsAlloc += 4;
+ }
+
+ return &paParms[cParms++];
+ }
+
+ uint32_t getCount(void) const { return cParms; }
+ PVBOXHGCMSVCPARM getParms(void) const { return paParms; }
+ uint32_t getType(void) const { return uMsg; }
+
+ int setNextPointer(void *pvBuf, uint32_t cbBuf)
+ {
+ AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
+ AssertReturn(cbBuf, VERR_INVALID_PARAMETER);
+
+ PVBOXHGCMSVCPARM pParm = getNextParam();
+ if (!pParm)
+ return VERR_NO_MEMORY;
+
+ void *pvTmp = RTMemDup(pvBuf, cbBuf);
+ if (!pvTmp)
+ {
+ RTMemFree(pParm);
+ return VERR_NO_MEMORY;
+ }
+
+ pParm->setPointer(pvTmp, cbBuf);
+ return VINF_SUCCESS;
+ }
+
+ int setNextString(const char *pszString)
+ {
+ PVBOXHGCMSVCPARM pParm = getNextParam();
+ if (!pParm)
+ return VERR_NO_MEMORY;
+
+ char *pszTemp = RTStrDup(pszString);
+ if (!pszTemp)
+ {
+ RTMemFree(pParm);
+ return VERR_NO_MEMORY;
+ }
+
+ pParm->setString(pszTemp);
+ return VINF_SUCCESS;
+ }
+
+ int setNextUInt32(uint32_t u32Val)
+ {
+ PVBOXHGCMSVCPARM pParm = getNextParam();
+ if (!pParm)
+ return VERR_NO_MEMORY;
+
+ pParm->setUInt32(u32Val);
+ return VINF_SUCCESS;
+ }
+
+ int setNextUInt64(uint64_t u64Val)
+ {
+ PVBOXHGCMSVCPARM pParm = getNextParam();
+ if (!pParm)
+ return VERR_NO_MEMORY;
+
+ pParm->setUInt64(u64Val);
+ return VINF_SUCCESS;
+ }
+
+ void setType(uint32_t uMsgType) { uMsg = uMsgType; }
+
+protected:
+
+ /** Message type. */
+ uint32_t uMsg;
+ /** Message parameters. */
+ uint32_t cParms;
+ /** Size of array. */
+ uint32_t cParmsAlloc;
+ /** Array of HGCM parameters */
+ PVBOXHGCMSVCPARM paParms;
+};
+
+/** Guest DnD callback function definition. */
+typedef DECLCALLBACKPTR(int, PFNGUESTDNDCALLBACK) (uint32_t uMsg, void *pvParms, size_t cbParms, void *pvUser);
+
/**
- * Class for handling drag'n drop responses from
- * the guest side.
+ * Structure for keeping a guest DnD callback.
+ * Each callback can handle one HGCM message, however, multiple HGCM messages can be registered
+ * to the same callback (function).
*/
+typedef struct GuestDnDCallback
+{
+ GuestDnDCallback(void)
+ : uMessgage(0)
+ , pfnCallback(NULL)
+ , pvUser(NULL) { }
+
+ GuestDnDCallback(PFNGUESTDNDCALLBACK pvCB, uint32_t uMsg, void *pvUsr = NULL)
+ : uMessgage(uMsg)
+ , pfnCallback(pvCB)
+ , pvUser(pvUsr) { }
+
+ /** The HGCM message ID to handle. */
+ uint32_t uMessgage;
+ /** Pointer to callback function. */
+ PFNGUESTDNDCALLBACK pfnCallback;
+ /** Pointer to user-supplied data. */
+ void *pvUser;
+
+} GuestDnDCallback;
+
+/** Contains registered callback pointers for specific HGCM message types. */
+typedef std::map<uint32_t, GuestDnDCallback> GuestDnDCallbackMap;
+
class GuestDnDResponse
{
public:
GuestDnDResponse(const ComObjPtr<Guest>& pGuest);
-
virtual ~GuestDnDResponse(void);
public:
- int notifyAboutGuestResponse(void);
- int waitForGuestResponse(RTMSINTERVAL msTimeout = 500);
+ int notifyAboutGuestResponse(void) const;
+ int waitForGuestResponse(RTMSINTERVAL msTimeout = 500) const;
+
+ void setAllActions(uint32_t a) { m_allActions = a; }
+ uint32_t allActions(void) const { return m_allActions; }
void setDefAction(uint32_t a) { m_defAction = a; }
uint32_t defAction(void) const { return m_defAction; }
- void setAllActions(uint32_t a) { m_allActions = a; }
- uint32_t allActions() const { return m_allActions; }
-
void setFormat(const Utf8Str &strFormat) { m_strFormat = strFormat; }
Utf8Str format(void) const { return m_strFormat; }
- void setDropDir(const Utf8Str &strDropDir) { m_strDropDir = strDropDir; }
- Utf8Str dropDir(void) const { return m_strDropDir; }
-
- int dataAdd(const void *pvData, uint32_t cbData, uint32_t *pcbCurSize);
- int dataSetStatus(size_t cbDataAdd, size_t cbDataTotal = 0);
void reset(void);
- const void *data(void) { return m_pvData; }
- size_t size(void) const { return m_cbData; }
+ bool isProgressCanceled(void) const;
+ int setCallback(uint32_t uMsg, PFNGUESTDNDCALLBACK pfnCallback, void *pvUser = NULL);
int setProgress(unsigned uPercentage, uint32_t uState, int rcOp = VINF_SUCCESS);
HRESULT resetProgress(const ComObjPtr<Guest>& pParent);
HRESULT queryProgressTo(IProgress **ppProgress);
- int writeToFile(const char *pszPath, size_t cbPath, void *pvData, size_t cbData, uint32_t fMode);
+public:
+
+ /** @name HGCM callback handling.
+ @{ */
+ int onDispatch(uint32_t u32Function, void *pvParms, uint32_t cbParms);
+ /** @} */
public:
Utf8Str errorToString(const ComObjPtr<Guest>& pGuest, int guestRc);
-private:
- RTSEMEVENT m_EventSem;
- uint32_t m_defAction;
- uint32_t m_allActions;
- Utf8Str m_strFormat;
-
- /** The actual MIME data.*/
- void *m_pvData;
- /** Size (in bytes) of MIME data. */
- uint32_t m_cbData;
-
- size_t m_cbDataCurrent;
- size_t m_cbDataTotal;
- /** Dropped files directory on the host. */
- Utf8Str m_strDropDir;
- /** The handle of the currently opened file being written to
- * or read from. */
- RTFILE m_hFile;
- Utf8Str m_strFile;
-
- ComObjPtr<Guest> m_parent;
- ComObjPtr<Progress> m_progress;
+protected:
+
+ /** Pointer to context this class is tied to. */
+ void *m_pvCtx;
+ RTSEMEVENT m_EventSem;
+ uint32_t m_defAction;
+ uint32_t m_allActions;
+ Utf8Str m_strFormat;
+
+ /** Pointer to IGuest parent object. */
+ ComObjPtr<Guest> m_parent;
+ /** Pointer to associated progress object. Optional. */
+ ComObjPtr<Progress> m_progress;
+ /** Callback map. */
+ GuestDnDCallbackMap m_mapCallbacks;
};
/**
@@ -171,17 +474,6 @@ protected:
GuestDnDResponse *m_pResponse;
/** @} */
-protected:
-
-#ifdef VBOX_WITH_DRAG_AND_DROP_GH
- /** @name Dispatch handlers for the HGCM callbacks.
- * @{ */
- int onGHSendData(GuestDnDResponse *pResp, const void *pvData, size_t cbData, size_t cbTotalSize);
- int onGHSendDir(GuestDnDResponse *pResp, const char *pszPath, size_t cbPath, uint32_t fMode);
- int onGHSendFile(GuestDnDResponse *pResp, const char *pszPath, size_t cbPath, void *pvData, size_t cbData, uint32_t fMode);
- /** @} */
-#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
-
private:
/** Staic pointer to singleton instance. */
@@ -191,6 +483,9 @@ private:
/** Access to the GuestDnD's singleton instance. */
#define GuestDnDInst() GuestDnD::getInstance()
+/** List of pointers to guest DnD Messages. */
+typedef std::list<GuestDnDMsg *> GuestDnDMsgList;
+
/**
* IDnDBase class implementation for sharing code between
* IGuestDnDSource and IGuestDnDTarget implementation.
@@ -203,24 +498,52 @@ protected:
protected:
- /** Shared IDnDBase method implementations.
+ /** Shared (internal) IDnDBase method implementations.
+ * @{ */
+ HRESULT i_isFormatSupported(const com::Utf8Str &aFormat, BOOL *aSupported);
+ HRESULT i_getFormats(std::vector<com::Utf8Str> &aFormats);
+ HRESULT i_addFormats(const std::vector<com::Utf8Str> &aFormats);
+ HRESULT i_removeFormats(const std::vector<com::Utf8Str> &aFormats);
+
+ HRESULT i_getProtocolVersion(ULONG *puVersion);
+ /** @} */
+
+protected:
+
+ int getProtocolVersion(uint32_t *puVersion);
+
+ /** @name Functions for handling a simple host HGCM message queue.
* @{ */
- HRESULT isFormatSupported(const com::Utf8Str &aFormat, BOOL *aSupported);
- HRESULT getFormats(std::vector<com::Utf8Str> &aFormats);
- HRESULT addFormats(const std::vector<com::Utf8Str> &aFormats);
- HRESULT removeFormats(const std::vector<com::Utf8Str> &aFormats);
+ int msgQueueAdd(GuestDnDMsg *pMsg);
+ GuestDnDMsg *msgQueueGetNext(void);
+ void msgQueueRemoveNext(void);
+ void msgQueueClear(void);
/** @} */
+ int sendCancel(void);
+ int waitForEvent(RTMSINTERVAL msTimeout, GuestDnDCallbackEvent &Event, GuestDnDResponse *pResp);
+
protected:
- /** @name Attributes.
+ /** @name Public attributes (through getters/setters).
* @{ */
/** Pointer to guest implementation. */
- const ComObjPtr<Guest> m_pGuest;
+ const ComObjPtr<Guest> m_pGuest;
/** List of supported MIME/Content-type formats. */
- std::vector<com::Utf8Str> m_strFormats;
+ std::vector<com::Utf8Str> m_strFormats;
/** @} */
-};
+ struct
+ {
+ /** Flag indicating whether a drop operation currently
+ * is in progress or not. */
+ bool mfTransferIsPending;
+ /** The DnD protocol version to use, depending on the
+ * installed Guest Additions. */
+ uint32_t mProtocolVersion;
+ /** Outgoing message queue. */
+ GuestDnDMsgList mListOutgoing;
+ } mDataBase;
+};
#endif /* ____H_GUESTDNDPRIVATE */
diff --git a/src/VBox/Main/include/GuestDnDSourceImpl.h b/src/VBox/Main/include/GuestDnDSourceImpl.h
index d423d2e..c9b35bc 100644
--- a/src/VBox/Main/include/GuestDnDSourceImpl.h
+++ b/src/VBox/Main/include/GuestDnDSourceImpl.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2014 Oracle Corporation
+ * Copyright (C) 2014-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -21,9 +21,12 @@
#include "GuestDnDSourceWrap.h"
#include "GuestDnDPrivate.h"
+struct RECVDATACTX;
+typedef struct RECVDATACTX *PRECVDATACTX;
+
class ATL_NO_VTABLE GuestDnDSource :
public GuestDnDSourceWrap,
- protected GuestDnDBase
+ public GuestDnDBase
{
public:
/** @name COM and internal init/term/mapping cruft.
@@ -45,6 +48,8 @@ private:
HRESULT getFormats(std::vector<com::Utf8Str> &aFormats);
HRESULT addFormats(const std::vector<com::Utf8Str> &aFormats);
HRESULT removeFormats(const std::vector<com::Utf8Str> &aFormats);
+
+ HRESULT getProtocolVersion(ULONG *aProtocolVersion);
/** @} */
/** Private wrapped @name IDnDSource methods.
@@ -56,11 +61,42 @@ private:
protected:
- /** @name Attributes.
+#ifdef VBOX_WITH_DRAG_AND_DROP_GH
+ /** @name Dispatch handlers for the HGCM callbacks.
+ * @{ */
+ int i_onReceiveData(PRECVDATACTX pCtx, const void *pvData, uint32_t cbData, uint64_t cbTotalSize);
+ int i_onReceiveDir(PRECVDATACTX pCtx, const char *pszPath, uint32_t cbPath, uint32_t fMode);
+ int i_onReceiveFileHdr(PRECVDATACTX pCtx, const char *pszPath, uint32_t cbPath, uint64_t cbSize, uint32_t fMode, uint32_t fFlags);
+ int i_onReceiveFileData(PRECVDATACTX pCtx, const void *pvData, uint32_t cbData);
+ /** @} */
+#endif
+
+protected:
+
+ static DECLCALLBACK(int) i_receiveDataThread(RTTHREAD Thread, void *pvUser);
+
+ /** @name Callbacks for dispatch handler.
* @{ */
- /** Pointer to guest implementation. */
- const ComObjPtr<Guest> m_pGuest;
+ static DECLCALLBACK(int) i_receiveRawDataCallback(uint32_t uMsg, void *pvParms, size_t cbParms, void *pvUser);
+ static DECLCALLBACK(int) i_receiveURIDataCallback(uint32_t uMsg, void *pvParms, size_t cbParms, void *pvUser);
/** @} */
+
+protected:
+
+ int i_receiveData(PRECVDATACTX pCtx, RTMSINTERVAL msTimeout);
+ int i_receiveRawData(PRECVDATACTX pCtx, RTMSINTERVAL msTimeout);
+ int i_receiveURIData(PRECVDATACTX pCtx, RTMSINTERVAL msTimeout);
+ int i_updateProcess(PRECVDATACTX pCtx, uint32_t cbDataAdd);
+
+protected:
+
+ struct
+ {
+ /** Maximum data block size (in bytes) the source can handle. */
+ uint32_t mcbBlockSize;
+ /** The context for receiving data from the guest. */
+ RECVDATACTX mRecvCtx;
+ } mData;
};
#endif /* !____H_GUESTDNDSOURCEIMPL */
diff --git a/src/VBox/Main/include/GuestDnDTargetImpl.h b/src/VBox/Main/include/GuestDnDTargetImpl.h
index 40ebc0c..c5b2d9a 100644
--- a/src/VBox/Main/include/GuestDnDTargetImpl.h
+++ b/src/VBox/Main/include/GuestDnDTargetImpl.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2014 Oracle Corporation
+ * Copyright (C) 2014-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -21,9 +21,15 @@
#include "GuestDnDTargetWrap.h"
#include "GuestDnDPrivate.h"
+#include <VBox/GuestHost/DragAndDrop.h>
+#include <VBox/HostServices/DragAndDropSvc.h>
+
+struct SENDDATACTX;
+typedef struct SENDDATACTX *PSENDDATACTX;
+
class ATL_NO_VTABLE GuestDnDTarget :
public GuestDnDTargetWrap,
- protected GuestDnDBase
+ public GuestDnDBase
{
public:
/** @name COM and internal init/term/mapping cruft.
@@ -45,6 +51,8 @@ private:
HRESULT getFormats(std::vector<com::Utf8Str> &aFormats);
HRESULT addFormats(const std::vector<com::Utf8Str> &aFormats);
HRESULT removeFormats(const std::vector<com::Utf8Str> &aFormats);
+
+ HRESULT getProtocolVersion(ULONG *aProtocolVersion);
/** @} */
/** Private wrapped @name IDnDTarget methods.
@@ -54,15 +62,33 @@ private:
HRESULT leave(ULONG aScreenId);
HRESULT drop(ULONG aScreenId, ULONG aX, ULONG aY, DnDAction_T aDefaultAction, const std::vector<DnDAction_T> &aAllowedActions, const std::vector<com::Utf8Str> &aFormats, com::Utf8Str &aFormat, DnDAction_T *aResultAction);
HRESULT sendData(ULONG aScreenId, const com::Utf8Str &aFormat, const std::vector<BYTE> &aData, ComPtr<IProgress> &aProgress);
+ HRESULT cancel(BOOL *aVeto);
/** @} */
protected:
- /** @name Attributes.
- * @{ */
- /** Pointer to guest implementation. */
- const ComObjPtr<Guest> m_pGuest;
- /** @} */
+ static DECLCALLBACK(int) i_sendDataThread(RTTHREAD Thread, void *pvUser);
+ static DECLCALLBACK(int) i_sendURIDataCallback(uint32_t uMsg, void *pvParms, size_t cbParms, void *pvUser);
+
+protected:
+
+ int i_cancelOperation(void);
+ int i_sendData(PSENDDATACTX pCtx, RTMSINTERVAL msTimeout);
+ int i_sendDirectory(PSENDDATACTX pCtx, GuestDnDMsg *pMsg, DnDURIObject &aDirectory);
+ int i_sendFile(PSENDDATACTX pCtx, GuestDnDMsg *pMsg, DnDURIObject &aFile);
+ int i_sendFileData(PSENDDATACTX pCtx, GuestDnDMsg *pMsg, DnDURIObject &aFile);
+ int i_sendURIData(PSENDDATACTX pCtx, RTMSINTERVAL msTimeout);
+ int i_sendRawData(PSENDDATACTX pCtx, RTMSINTERVAL msTimeout);
+ int i_sendURIDataLoop(PSENDDATACTX pCtx, GuestDnDMsg *pMsg);
+
+protected:
+
+ struct
+ {
+ bool mfTransferIsPending;
+ /** Maximum data block size (in bytes) the target can handle. */
+ uint32_t mcbBlockSize;
+ } mData;
};
#endif /* !____H_GUESTDNDTARGETIMPL */
diff --git a/src/VBox/Main/include/GuestFileImpl.h b/src/VBox/Main/include/GuestFileImpl.h
index e517bf5..5940270 100644
--- a/src/VBox/Main/include/GuestFileImpl.h
+++ b/src/VBox/Main/include/GuestFileImpl.h
@@ -71,23 +71,24 @@ public:
private:
- /** Wrapped @name IGuestFile properties.
+ /** @name Wrapped IGuestFile properties.
* @{ */
HRESULT getCreationMode(ULONG *aCreationMode);
- HRESULT getDisposition(com::Utf8Str &aDisposition);
HRESULT getEventSource(ComPtr<IEventSource> &aEventSource);
- HRESULT getFileName(com::Utf8Str &aFileName);
HRESULT getId(ULONG *aId);
HRESULT getInitialSize(LONG64 *aInitialSize);
- HRESULT getOpenMode(com::Utf8Str &aOpenMode);
HRESULT getOffset(LONG64 *aOffset);
HRESULT getStatus(FileStatus_T *aStatus);
+ HRESULT getFileName(com::Utf8Str &aFileName);
+ HRESULT getAccessMode(FileAccessMode_T *aAccessMode);
+ HRESULT getOpenAction(FileOpenAction_T *aOpenAction);
/** @} */
- /** Wrapped @name IGuestFile methods.
+ /** @name Wrapped IGuestFile methods.
* @{ */
HRESULT close();
HRESULT queryInfo(ComPtr<IFsObjInfo> &aObjInfo);
+ HRESULT querySize(LONG64 *aSize);
HRESULT read(ULONG aToRead,
ULONG aTimeoutMS,
std::vector<BYTE> &aData);
@@ -96,8 +97,11 @@ private:
ULONG aTimeoutMS,
std::vector<BYTE> &aData);
HRESULT seek(LONG64 aOffset,
- FileSeekType_T aWhence);
- HRESULT setACL(const com::Utf8Str &aAcl);
+ FileSeekOrigin_T aWhence,
+ LONG64 *aNewOffset);
+ HRESULT setACL(const com::Utf8Str &aAcl,
+ ULONG aMode);
+ HRESULT setSize(LONG64 aSize);
HRESULT write(const std::vector<BYTE> &aData,
ULONG aTimeoutMS,
ULONG *aWritten);
diff --git a/src/VBox/Main/include/GuestImpl.h b/src/VBox/Main/include/GuestImpl.h
index 12be116..b7e5214 100644
--- a/src/VBox/Main/include/GuestImpl.h
+++ b/src/VBox/Main/include/GuestImpl.h
@@ -1,3 +1,4 @@
+/* $Id: GuestImpl.h $ */
/** @file
* VirtualBox COM class implementation
*/
@@ -25,12 +26,15 @@
#include <VBox/vmm/stam.h>
#include "AdditionsFacilityImpl.h"
-#include "GuestCtrlImplPrivate.h"
+#ifdef VBOX_WITH_GUEST_CONTROL
+# include "GuestCtrlImplPrivate.h"
+# include "GuestSessionImpl.h"
+#endif
#ifdef VBOX_WITH_DRAG_AND_DROP
# include "GuestDnDSourceImpl.h"
# include "GuestDnDTargetImpl.h"
#endif
-#include "GuestSessionImpl.h"
+#include "EventImpl.h"
#include "HGCM.h"
typedef enum
@@ -70,8 +74,8 @@ public:
#ifdef VBOX_WITH_GUEST_CONTROL
/** Static callback for handling guest control notifications. */
static DECLCALLBACK(int) i_notifyCtrlDispatcher(void *pvExtension, uint32_t u32Function, void *pvData, uint32_t cbData);
- static DECLCALLBACK(void) i_staticUpdateStats(RTTIMERLR hTimerLR, void *pvUser, uint64_t iTick);
#endif
+ static DECLCALLBACK(void) i_staticUpdateStats(RTTIMERLR hTimerLR, void *pvUser, uint64_t iTick);
/** @} */
public:
@@ -94,9 +98,10 @@ public:
{
return setErrorInternal(aResultCode, getStaticClassIID(), getStaticComponentName(), aText, false, true);
}
+ uint32_t i_getAdditionsVersion(void) { return mData.mAdditionsVersionFull; }
+ VBOXOSTYPE i_getGuestOSType(void) { return mData.mOSType; }
#ifdef VBOX_WITH_GUEST_CONTROL
int i_dispatchToSession(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
- uint32_t i_getAdditionsVersion(void) { return mData.mAdditionsVersionFull; }
int i_sessionRemove(GuestSession *pSession);
int i_sessionCreate(const GuestSessionStartupInfo &ssInfo, const GuestCredentials &guestCreds,
ComObjPtr<GuestSession> &pGuestSession);
@@ -171,15 +176,18 @@ private:
typedef std::map< AdditionsFacilityType_T, ComObjPtr<AdditionsFacility> >::iterator FacilityMapIter;
typedef std::map< AdditionsFacilityType_T, ComObjPtr<AdditionsFacility> >::const_iterator FacilityMapIterConst;
+#ifdef VBOX_WITH_GUEST_CONTROL
/** Map for keeping the guest sessions. The primary key marks the guest session ID. */
typedef std::map <uint32_t, ComObjPtr<GuestSession> > GuestSessions;
+#endif
struct Data
{
- Data() : mAdditionsRunLevel(AdditionsRunLevelType_None)
+ Data() : mOSType(VBOXOSTYPE_Unknown), mAdditionsRunLevel(AdditionsRunLevelType_None)
, mAdditionsVersionFull(0), mAdditionsRevision(0), mAdditionsFeatures(0)
{ }
+ VBOXOSTYPE mOSType; /**@< For internal used. VBOXOSTYPE_Unknown if not reported. */
Utf8Str mOSTypeId;
FacilityMap mFacilityMap;
AdditionsRunLevelType_T mAdditionsRunLevel;
@@ -188,8 +196,10 @@ private:
uint32_t mAdditionsRevision;
uint32_t mAdditionsFeatures;
Utf8Str mInterfaceVersion;
+#ifdef VBOX_WITH_GUEST_CONTROL
GuestSessions mGuestSessions;
uint32_t mNextSessionID;
+#endif
} mData;
ULONG mMemoryBalloonSize;
@@ -204,13 +214,13 @@ private:
const ComObjPtr<Console> mParent;
-#ifdef VBOX_WITH_GUEST_CONTROL
/**
* This can safely be used without holding any locks.
* An AutoCaller suffices to prevent it being destroy while in use and
* internally there is a lock providing the necessary serialization.
*/
const ComObjPtr<EventSource> mEventSource;
+#ifdef VBOX_WITH_GUEST_CONTROL
/** General extension callback for guest control. */
HGCMSVCEXTHANDLE mhExtCtrl;
#endif
diff --git a/src/VBox/Main/include/GuestOSTypeImpl.h b/src/VBox/Main/include/GuestOSTypeImpl.h
index ddbacd9..9862dfa 100644
--- a/src/VBox/Main/include/GuestOSTypeImpl.h
+++ b/src/VBox/Main/include/GuestOSTypeImpl.h
@@ -1,3 +1,4 @@
+/* $Id: GuestOSTypeImpl.h $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/include/GuestProcessImpl.h b/src/VBox/Main/include/GuestProcessImpl.h
index 2860191..f376bf6 100644
--- a/src/VBox/Main/include/GuestProcessImpl.h
+++ b/src/VBox/Main/include/GuestProcessImpl.h
@@ -21,6 +21,8 @@
#include "GuestCtrlImplPrivate.h"
#include "GuestProcessWrap.h"
+#include <iprt/cpp/utils.h>
+
class Console;
class GuestSession;
@@ -36,7 +38,8 @@ public:
* @{ */
DECLARE_EMPTY_CTOR_DTOR(GuestProcess)
- int init(Console *aConsole, GuestSession *aSession, ULONG aProcessID, const GuestProcessStartupInfo &aProcInfo);
+ int init(Console *aConsole, GuestSession *aSession, ULONG aProcessID,
+ const GuestProcessStartupInfo &aProcInfo, const GuestEnvironment *pBaseEnv);
void uninit(void);
HRESULT FinalConstruct(void);
void FinalRelease(void);
@@ -136,6 +139,12 @@ private:
{
/** The process startup information. */
GuestProcessStartupInfo mProcess;
+ /** Reference to the immutable session base environment. NULL if the
+ * environment feature isn't supported.
+ * @remarks If there is proof that the uninit order of GuestSession and
+ * this class is what GuestObjectBase claims, then this isn't
+ * strictly necessary. */
+ GuestEnvironment const *mpSessionBaseEnv;
/** Exit code if process has been terminated. */
LONG mExitCode;
/** PID reported from the guest. */
@@ -145,6 +154,17 @@ private:
/** The last returned process status
* returned from the guest side. */
int mLastError;
+
+ Data(void) : mpSessionBaseEnv(NULL)
+ { }
+ ~Data(void)
+ {
+ if (mpSessionBaseEnv)
+ {
+ mpSessionBaseEnv->releaseConst();
+ mpSessionBaseEnv = NULL;
+ }
+ }
} mData;
};
diff --git a/src/VBox/Main/include/GuestSessionImpl.h b/src/VBox/Main/include/GuestSessionImpl.h
index 0c75cab..1f93c06 100644
--- a/src/VBox/Main/include/GuestSessionImpl.h
+++ b/src/VBox/Main/include/GuestSessionImpl.h
@@ -203,7 +203,7 @@ protected:
fFlags(aFlags),
mProcInfo(startupInfo)
{
- mProcInfo.mCommand = strDest;
+ mProcInfo.mExecutable = strDest;
if (mProcInfo.mName.isEmpty())
mProcInfo.mName = strDest;
}
@@ -267,9 +267,13 @@ private:
HRESULT setTimeout(ULONG aTimeout);
HRESULT getProtocolVersion(ULONG *aProtocolVersion);
HRESULT getStatus(GuestSessionStatus_T *aStatus);
- HRESULT getEnvironment(std::vector<com::Utf8Str> &aEnvironment);
- HRESULT setEnvironment(const std::vector<com::Utf8Str> &aEnvironment);
+ HRESULT getEnvironmentChanges(std::vector<com::Utf8Str> &aEnvironmentChanges);
+ HRESULT setEnvironmentChanges(const std::vector<com::Utf8Str> &aEnvironmentChanges);
+ HRESULT getEnvironmentBase(std::vector<com::Utf8Str> &aEnvironmentBase);
HRESULT getProcesses(std::vector<ComPtr<IGuestProcess> > &aProcesses);
+ HRESULT getPathStyle(PathStyle_T *aPathStyle);
+ HRESULT getCurrentDirectory(com::Utf8Str &aCurrentDirectory);
+ HRESULT setCurrentDirectory(const com::Utf8Str &aCurrentDirectory);
HRESULT getDirectories(std::vector<ComPtr<IGuestDirectory> > &aDirectories);
HRESULT getFiles(std::vector<ComPtr<IGuestFile> > &aFiles);
HRESULT getEventSource(ComPtr<IEventSource> &aEventSource);
@@ -278,14 +282,19 @@ private:
/** Wrapped @name IGuestSession methods.
* @{ */
HRESULT close();
- HRESULT copyFrom(const com::Utf8Str &aSource,
- const com::Utf8Str &aDest,
- const std::vector<CopyFileFlag_T> &aFlags,
- ComPtr<IProgress> &aProgress);
- HRESULT copyTo(const com::Utf8Str &aSource,
- const com::Utf8Str &aDest,
- const std::vector<CopyFileFlag_T> &aFlags,
- ComPtr<IProgress> &aProgress);
+
+ HRESULT directoryCopy(const com::Utf8Str &aSource,
+ const com::Utf8Str &aDestination,
+ const std::vector<DirectoryCopyFlags_T> &aFlags,
+ ComPtr<IProgress> &aProgress);
+ HRESULT directoryCopyFromGuest(const com::Utf8Str &aSource,
+ const com::Utf8Str &aDestination,
+ const std::vector<DirectoryCopyFlags_T> &aFlags,
+ ComPtr<IProgress> &aProgress);
+ HRESULT directoryCopyToGuest(const com::Utf8Str &aSource,
+ const com::Utf8Str &aDestination,
+ const std::vector<DirectoryCopyFlags_T> &aFlags,
+ ComPtr<IProgress> &aProgress);
HRESULT directoryCreate(const com::Utf8Str &aPath,
ULONG aMode,
const std::vector<DirectoryCreateFlag_T> &aFlags);
@@ -295,57 +304,77 @@ private:
BOOL aSecure,
com::Utf8Str &aDirectory);
HRESULT directoryExists(const com::Utf8Str &aPath,
+ BOOL aFollowSymlinks,
BOOL *aExists);
HRESULT directoryOpen(const com::Utf8Str &aPath,
const com::Utf8Str &aFilter,
const std::vector<DirectoryOpenFlag_T> &aFlags,
ComPtr<IGuestDirectory> &aDirectory);
- HRESULT directoryQueryInfo(const com::Utf8Str &aPath,
- ComPtr<IGuestFsObjInfo> &aInfo);
HRESULT directoryRemove(const com::Utf8Str &aPath);
HRESULT directoryRemoveRecursive(const com::Utf8Str &aPath,
const std::vector<DirectoryRemoveRecFlag_T> &aFlags,
ComPtr<IProgress> &aProgress);
- HRESULT directoryRename(const com::Utf8Str &aSource,
- const com::Utf8Str &aDest,
- const std::vector<PathRenameFlag_T> &aFlags);
- HRESULT directorySetACL(const com::Utf8Str &aPath,
- const com::Utf8Str &aAcl);
- HRESULT environmentClear();
- HRESULT environmentGet(const com::Utf8Str &aName,
- com::Utf8Str &aValue);
- HRESULT environmentSet(const com::Utf8Str &aName,
- const com::Utf8Str &aValue);
- HRESULT environmentUnset(const com::Utf8Str &aName);
+ HRESULT environmentScheduleSet(const com::Utf8Str &aName,
+ const com::Utf8Str &aValue);
+ HRESULT environmentScheduleUnset(const com::Utf8Str &aName);
+ HRESULT environmentGetBaseVariable(const com::Utf8Str &aName,
+ com::Utf8Str &aValue);
+ HRESULT environmentDoesBaseVariableExist(const com::Utf8Str &aName,
+ BOOL *aExists);
+
+ HRESULT fileCopy(const com::Utf8Str &aSource,
+ const com::Utf8Str &aDestination,
+ const std::vector<FileCopyFlag_T> &aFlags,
+ ComPtr<IProgress> &aProgress);
+ HRESULT fileCopyToGuest(const com::Utf8Str &aSource,
+ const com::Utf8Str &aDestination,
+ const std::vector<FileCopyFlag_T> &aFlags,
+ ComPtr<IProgress> &aProgress);
+ HRESULT fileCopyFromGuest(const com::Utf8Str &aSource,
+ const com::Utf8Str &aDestination,
+ const std::vector<FileCopyFlag_T> &aFlags,
+ ComPtr<IProgress> &aProgress);
HRESULT fileCreateTemp(const com::Utf8Str &aTemplateName,
ULONG aMode,
const com::Utf8Str &aPath,
BOOL aSecure,
ComPtr<IGuestFile> &aFile);
HRESULT fileExists(const com::Utf8Str &aPath,
+ BOOL aFollowSymlinks,
BOOL *aExists);
- HRESULT fileRemove(const com::Utf8Str &aPath);
HRESULT fileOpen(const com::Utf8Str &aPath,
- const com::Utf8Str &aOpenMode,
- const com::Utf8Str &aDisposition,
+ FileAccessMode_T aAccessMode,
+ FileOpenAction_T aOpenAction,
ULONG aCreationMode,
ComPtr<IGuestFile> &aFile);
HRESULT fileOpenEx(const com::Utf8Str &aPath,
- const com::Utf8Str &aOpenMode,
- const com::Utf8Str &aDisposition,
- const com::Utf8Str &aSharingMode,
+ FileAccessMode_T aAccessMode,
+ FileOpenAction_T aOpenAction,
+ FileSharingMode_T aSharingMode,
ULONG aCreationMode,
- LONG64 aOffset,
+ const std::vector<FileOpenExFlags_T> &aFlags,
ComPtr<IGuestFile> &aFile);
- HRESULT fileQueryInfo(const com::Utf8Str &aPath,
- ComPtr<IGuestFsObjInfo> &aInfo);
HRESULT fileQuerySize(const com::Utf8Str &aPath,
+ BOOL aFollowSymlinks,
LONG64 *aSize);
- HRESULT fileRename(const com::Utf8Str &aSource,
- const com::Utf8Str &aDest,
- const std::vector<PathRenameFlag_T> &aFlags);
- HRESULT fileSetACL(const com::Utf8Str &aFile,
- const com::Utf8Str &aAcl);
+ HRESULT fsObjExists(const com::Utf8Str &aPath,
+ BOOL aFollowSymlinks,
+ BOOL *pfExists);
+ HRESULT fsObjQueryInfo(const com::Utf8Str &aPath,
+ BOOL aFollowSymlinks,
+ ComPtr<IGuestFsObjInfo> &aInfo);
+ HRESULT fsObjRemove(const com::Utf8Str &aPath);
+ HRESULT fsObjRename(const com::Utf8Str &aOldPath,
+ const com::Utf8Str &aNewPath,
+ const std::vector<FsObjRenameFlag_T> &aFlags);
+ HRESULT fsObjMove(const com::Utf8Str &aSource,
+ const com::Utf8Str &aDestination,
+ const std::vector<FsObjMoveFlags_T> &aFlags,
+ ComPtr<IProgress> &aProgress);
+ HRESULT fsObjSetACL(const com::Utf8Str &aPath,
+ BOOL aFollowSymlinks,
+ const com::Utf8Str &aAcl,
+ ULONG aMode);
HRESULT processCreate(const com::Utf8Str &aCommand,
const std::vector<com::Utf8Str> &aArguments,
const std::vector<com::Utf8Str> &aEnvironment,
@@ -370,8 +399,6 @@ private:
HRESULT symlinkRead(const com::Utf8Str &aSymlink,
const std::vector<SymlinkReadFlag_T> &aFlags,
com::Utf8Str &aTarget);
- HRESULT symlinkRemoveDirectory(const com::Utf8Str &aPath);
- HRESULT symlinkRemoveFile(const com::Utf8Str &aFile);
HRESULT waitFor(ULONG aWaitFor,
ULONG aTimeoutMS,
GuestSessionWaitResult_T *aReason);
@@ -390,6 +417,7 @@ private:
public:
/** @name Public internal methods.
+ * @todo r=bird: Most of these are public for no real reason...
* @{ */
int i_closeSession(uint32_t uFlags, uint32_t uTimeoutMS, int *pGuestRc);
inline bool i_directoryExists(uint32_t uDirID, ComObjPtr<GuestDirectory> *pDir);
@@ -400,7 +428,7 @@ public:
Utf8Str &strName, int *pGuestRc);
int i_directoryOpenInternal(const GuestDirectoryOpenInfo &openInfo,
ComObjPtr<GuestDirectory> &pDirectory, int *pGuestRc);
- int i_directoryQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
+ int i_directoryQueryInfoInternal(const Utf8Str &strPath, bool fFollowSymlinks, GuestFsObjData &objData, int *pGuestRc);
int i_dispatchToDirectory(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
int i_dispatchToFile(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
int i_dispatchToObject(PVBOXGUESTCTRLHOSTCBCTX pCtxCb, PVBOXGUESTCTRLHOSTCALLBACK pSvcCb);
@@ -410,11 +438,10 @@ public:
int i_fileRemoveFromList(GuestFile *pFile);
int i_fileRemoveInternal(const Utf8Str &strPath, int *pGuestRc);
int i_fileOpenInternal(const GuestFileOpenInfo &openInfo, ComObjPtr<GuestFile> &pFile, int *pGuestRc);
- int i_fileQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
- int i_fileQuerySizeInternal(const Utf8Str &strPath, int64_t *pllSize, int *pGuestRc);
- int i_fsQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc);
- const GuestCredentials &i_getCredentials(void);
- const GuestEnvironment &i_getEnvironment(void);
+ int i_fileQueryInfoInternal(const Utf8Str &strPath, bool fFollowSymlinks, GuestFsObjData &objData, int *pGuestRc);
+ int i_fileQuerySizeInternal(const Utf8Str &strPath, bool fFollowSymlinks, int64_t *pllSize, int *pGuestRc);
+ int i_fsQueryInfoInternal(const Utf8Str &strPath, bool fFollowSymlinks, GuestFsObjData &objData, int *pGuestRc);
+ const GuestCredentials &i_getCredentials(void);
EventSource *i_getEventSource(void) { return mEventSource; }
Utf8Str i_getName(void);
ULONG i_getId(void) { return mData.mSession.mID; }
@@ -431,7 +458,7 @@ public:
int i_pathRenameInternal(const Utf8Str &strSource, const Utf8Str &strDest, uint32_t uFlags,
int *pGuestRc);
int i_processRemoveFromList(GuestProcess *pProcess);
- int i_processCreateExInteral(GuestProcessStartupInfo &procInfo, ComObjPtr<GuestProcess> &pProgress);
+ int i_processCreateExInternal(GuestProcessStartupInfo &procInfo, ComObjPtr<GuestProcess> &pProgress);
inline bool i_processExists(uint32_t uProcessID, ComObjPtr<GuestProcess> *pProcess);
inline int i_processGetByPID(ULONG uPID, ComObjPtr<GuestProcess> *pProcess);
int i_sendCommand(uint32_t uFunction, uint32_t uParms, PVBOXHGCMSVCPARM paParms);
@@ -440,7 +467,7 @@ public:
int i_signalWaiters(GuestSessionWaitResult_T enmWaitResult, int rc /*= VINF_SUCCESS */);
int i_startTaskAsync(const Utf8Str &strTaskDesc, GuestSessionTask *pTask,
ComObjPtr<Progress> &pProgress);
- int i_queryInfo(void);
+ int i_determineProtocolVersion(void);
int i_waitFor(uint32_t fWaitFlags, ULONG uTimeoutMS, GuestSessionWaitResult_T &waitResult, int *pGuestRc);
int i_waitForStatusChange(GuestWaitEvent *pEvent, uint32_t fWaitFlags, uint32_t uTimeoutMS,
GuestSessionStatus_T *pSessionStatus, int *pGuestRc);
@@ -469,9 +496,13 @@ private:
GuestSessionStartupInfo mSession;
/** The session's current status. */
GuestSessionStatus_T mStatus;
- /** The session's environment block. Can be
- * overwritten/extended by ProcessCreate(Ex). */
- GuestEnvironment mEnvironment;
+ /** The set of environment changes for the session for use when
+ * creating new guest processes. */
+ GuestEnvironmentChanges mEnvironmentChanges;
+ /** Pointer to the immutable base environment for the session.
+ * @note This is not allocated until the guest reports it to the host. It is
+ * also shared with child processes. */
+ GuestEnvironment const *mpBaseEnvironment;
/** Directory objects bound to this session. */
SessionDirectories mDirectories;
/** File objects bound to this session. */
@@ -490,6 +521,32 @@ private:
/** The last returned session status
* returned from the guest side. */
int mRC;
+
+ Data(void)
+ : mpBaseEnvironment(NULL)
+ { }
+ Data(const Data &rThat)
+ : mCredentials(rThat.mCredentials)
+ , mSession(rThat.mSession)
+ , mStatus(rThat.mStatus)
+ , mEnvironmentChanges(rThat.mEnvironmentChanges)
+ , mpBaseEnvironment(NULL)
+ , mDirectories(rThat.mDirectories)
+ , mFiles(rThat.mFiles)
+ , mProcesses(rThat.mProcesses)
+ , mProtocolVersion(rThat.mProtocolVersion)
+ , mTimeout(rThat.mTimeout)
+ , mNumObjects(rThat.mNumObjects)
+ , mRC(rThat.mRC)
+ { }
+ ~Data(void)
+ {
+ if (mpBaseEnvironment)
+ {
+ mpBaseEnvironment->releaseConst();
+ mpBaseEnvironment = NULL;
+ }
+ }
} mData;
};
diff --git a/src/VBox/Main/include/HGCM.h b/src/VBox/Main/include/HGCM.h
index acf1528..d7348d6 100644
--- a/src/VBox/Main/include/HGCM.h
+++ b/src/VBox/Main/include/HGCM.h
@@ -1,3 +1,4 @@
+/* $Id: HGCM.h $ */
/** @file
* HGCM - Host-Guest Communication Manager.
*/
diff --git a/src/VBox/Main/include/HGCMObjects.h b/src/VBox/Main/include/HGCMObjects.h
index 27c9c96..b6ea9a9 100644
--- a/src/VBox/Main/include/HGCMObjects.h
+++ b/src/VBox/Main/include/HGCMObjects.h
@@ -1,3 +1,4 @@
+/* $Id: HGCMObjects.h $ */
/** @file
*
* HGCMObjects - Host-Guest Communication Manager objects header.
diff --git a/src/VBox/Main/include/HGCMThread.h b/src/VBox/Main/include/HGCMThread.h
index ab0abcc..f50ad1a 100644
--- a/src/VBox/Main/include/HGCMThread.h
+++ b/src/VBox/Main/include/HGCMThread.h
@@ -1,3 +1,4 @@
+/* $Id: HGCMThread.h $ */
/** @file
* HGCMThread - Host-Guest Communication Manager worker threads header.
*/
diff --git a/src/VBox/Main/include/HostPower.h b/src/VBox/Main/include/HostPower.h
index c7774c3..6f28873 100644
--- a/src/VBox/Main/include/HostPower.h
+++ b/src/VBox/Main/include/HostPower.h
@@ -1,3 +1,4 @@
+/* $Id: HostPower.h $ */
/** @file
*
* VirtualBox interface to host's power notification service
@@ -22,6 +23,10 @@
#include <vector>
+#ifdef RT_OS_LINUX
+# include <VBox/dbus.h>
+#endif
+
#ifdef RT_OS_DARWIN
# include <IOKit/pwr_mgt/IOPMLib.h>
# include <Carbon/Carbon.h>
@@ -58,6 +63,29 @@ private:
HWND mHwnd;
RTTHREAD mThread;
};
+#elif defined(RT_OS_LINUX)
+/**
+ * The Linux hosted Power Service.
+ */
+class HostPowerServiceLinux : public HostPowerService
+{
+public:
+
+ HostPowerServiceLinux(VirtualBox *aVirtualBox);
+ virtual ~HostPowerServiceLinux();
+
+private:
+
+ static DECLCALLBACK(int) powerChangeNotificationThread(RTTHREAD ThreadSelf, void *pInstance);
+
+ /* Private member vars */
+ /** Our message thread. */
+ RTTHREAD mThread;
+ /** Our (private) connection to the DBus. Closing this will cause the
+ * message thread to exit. */
+ DBusConnection *mpConnection;
+};
+
# elif defined(RT_OS_DARWIN) /* RT_OS_WINDOWS */
/**
* The Darwin hosted Power Service.
diff --git a/src/VBox/Main/include/MachineImpl.h b/src/VBox/Main/include/MachineImpl.h
index d5e423a..ca154a5 100644
--- a/src/VBox/Main/include/MachineImpl.h
+++ b/src/VBox/Main/include/MachineImpl.h
@@ -283,11 +283,11 @@ public:
BOOL mAccelerate2DVideoEnabled;
BOOL mPAEEnabled;
settings::Hardware::LongModeType mLongMode;
- BOOL mSyntheticCpu;
BOOL mTripleFaultReset;
ULONG mCPUCount;
BOOL mCPUHotPlugEnabled;
ULONG mCpuExecutionCap;
+ uint32_t mCpuIdPortabilityLevel;
BOOL mAccelerate3DEnabled;
BOOL mHPETEnabled;
@@ -865,6 +865,8 @@ private:
HRESULT setCPUHotPlugEnabled(BOOL aCPUHotPlugEnabled);
HRESULT getCPUExecutionCap(ULONG *aCPUExecutionCap);
HRESULT setCPUExecutionCap(ULONG aCPUExecutionCap);
+ HRESULT getCPUIDPortabilityLevel(ULONG *aCPUIDPortabilityLevel);
+ HRESULT setCPUIDPortabilityLevel(ULONG aCPUIDPortabilityLevel);
HRESULT getMemorySize(ULONG *aMemorySize);
HRESULT setMemorySize(ULONG aMemorySize);
HRESULT getMemoryBalloonSize(ULONG *aMemoryBalloonSize);
@@ -1229,7 +1231,8 @@ private:
HRESULT pushGuestProperty(const com::Utf8Str &aName,
const com::Utf8Str &aValue,
LONG64 aTimestamp,
- const com::Utf8Str &aFlags);
+ const com::Utf8Str &aFlags,
+ BOOL *aNotify);
HRESULT lockMedia();
HRESULT unlockMedia();
HRESULT ejectMedium(const ComPtr<IMediumAttachment> &aAttachment,
@@ -1377,7 +1380,8 @@ private:
HRESULT pushGuestProperty(const com::Utf8Str &aName,
const com::Utf8Str &aValue,
LONG64 aTimestamp,
- const com::Utf8Str &aFlags);
+ const com::Utf8Str &aFlags,
+ BOOL *aNotify);
HRESULT lockMedia();
HRESULT unlockMedia();
HRESULT ejectMedium(const ComPtr<IMediumAttachment> &aAttachment,
diff --git a/src/VBox/Main/include/MachineImplCloneVM.h b/src/VBox/Main/include/MachineImplCloneVM.h
index 6fa79a2..89b0e34 100644
--- a/src/VBox/Main/include/MachineImplCloneVM.h
+++ b/src/VBox/Main/include/MachineImplCloneVM.h
@@ -1,3 +1,4 @@
+/* $Id: MachineImplCloneVM.h $ */
/** @file
* Definition of MachineCloneVM
*/
diff --git a/src/VBox/Main/include/Matching.h b/src/VBox/Main/include/Matching.h
index 2f01f69..7f6b8f6 100644
--- a/src/VBox/Main/include/Matching.h
+++ b/src/VBox/Main/include/Matching.h
@@ -1,3 +1,4 @@
+/* $Id: Matching.h $ */
/** @file
*
* Declaration of template classes that provide simple API to
diff --git a/src/VBox/Main/include/MediumAttachmentImpl.h b/src/VBox/Main/include/MediumAttachmentImpl.h
index a84a008..28ab860 100644
--- a/src/VBox/Main/include/MediumAttachmentImpl.h
+++ b/src/VBox/Main/include/MediumAttachmentImpl.h
@@ -1,3 +1,4 @@
+/* $Id: $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/include/ObjectState.h b/src/VBox/Main/include/ObjectState.h
index a269621..0ce0f73 100644
--- a/src/VBox/Main/include/ObjectState.h
+++ b/src/VBox/Main/include/ObjectState.h
@@ -1,3 +1,4 @@
+/* $Id: ObjectState.h $ */
/** @file
*
* VirtualBox object state handling definitions
diff --git a/src/VBox/Main/include/RemoteUSBBackend.h b/src/VBox/Main/include/RemoteUSBBackend.h
index baf47a4..4fc8ea4 100644
--- a/src/VBox/Main/include/RemoteUSBBackend.h
+++ b/src/VBox/Main/include/RemoteUSBBackend.h
@@ -1,3 +1,4 @@
+/* $Id: RemoteUSBBackend.h $ */
/** @file
*
* VirtualBox Remote USB backend
diff --git a/src/VBox/Main/include/SecretKeyStore.h b/src/VBox/Main/include/SecretKeyStore.h
index c10dd00..af62b62 100644
--- a/src/VBox/Main/include/SecretKeyStore.h
+++ b/src/VBox/Main/include/SecretKeyStore.h
@@ -1,3 +1,4 @@
+/* $Id: SecretKeyStore.h $ */
/** @file
* Main - Secret key interface.
*/
diff --git a/src/VBox/Main/include/SessionImpl.h b/src/VBox/Main/include/SessionImpl.h
index 1298065..8e0f376 100644
--- a/src/VBox/Main/include/SessionImpl.h
+++ b/src/VBox/Main/include/SessionImpl.h
@@ -1,3 +1,4 @@
+/* $Id: SessionImpl.h $ */
/** @file
* VBox Client Session COM Class definition
*/
diff --git a/src/VBox/Main/include/SharedFolderImpl.h b/src/VBox/Main/include/SharedFolderImpl.h
index 9f304a5..b9e8c84 100644
--- a/src/VBox/Main/include/SharedFolderImpl.h
+++ b/src/VBox/Main/include/SharedFolderImpl.h
@@ -1,3 +1,4 @@
+/* $Id: SharedFolderImpl.h $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/include/VFSExplorerImpl.h b/src/VBox/Main/include/VFSExplorerImpl.h
index 6497280..d21530d 100644
--- a/src/VBox/Main/include/VFSExplorerImpl.h
+++ b/src/VBox/Main/include/VFSExplorerImpl.h
@@ -76,7 +76,7 @@ private:
Data *m;
/* Private member methods */
- VFSFileType_T i_RTToVFSFileType(int aType) const;
+ FsObjType_T i_iprtToVfsObjType(RTFMODE aType) const;
HRESULT i_updateFS(TaskVFSExplorer *aTask);
HRESULT i_deleteFS(TaskVFSExplorer *aTask);
diff --git a/src/VBox/Main/include/VMMDev.h b/src/VBox/Main/include/VMMDev.h
index 3fe366a..3f6d65e 100644
--- a/src/VBox/Main/include/VMMDev.h
+++ b/src/VBox/Main/include/VMMDev.h
@@ -1,3 +1,4 @@
+/* $Id: VMMDev.h $ */
/** @file
* VirtualBox Driver interface to VMM device
*/
diff --git a/src/VBox/Main/include/VirtualBoxBase.h b/src/VBox/Main/include/VirtualBoxBase.h
index 6b6c937..e84fe9a 100644
--- a/src/VBox/Main/include/VirtualBoxBase.h
+++ b/src/VBox/Main/include/VirtualBoxBase.h
@@ -1,3 +1,4 @@
+/* $Id: VirtualBoxBase.h $ */
/** @file
* VirtualBox COM base classes definition
*/
@@ -756,12 +757,17 @@ public:
const char *aComponent,
Utf8Str aText,
bool aWarning,
- bool aLogIt);
+ bool aLogIt,
+ LONG aResultDetail = 0);
static void clearError(void);
HRESULT setError(HRESULT aResultCode);
HRESULT setError(HRESULT aResultCode, const char *pcsz, ...);
HRESULT setError(const ErrorInfo &ei);
+ HRESULT setErrorVrc(int vrc);
+ HRESULT setErrorVrc(int vrc, const char *pcszMsgFmt, ...);
+ HRESULT setErrorBoth(HRESULT hrc, int vrc);
+ HRESULT setErrorBoth(HRESULT hrc, int vrc, const char *pcszMsgFmt, ...);
HRESULT setWarning(HRESULT aResultCode, const char *pcsz, ...);
HRESULT setErrorNoLog(HRESULT aResultCode, const char *pcsz, ...);
diff --git a/src/VBox/Main/include/VirtualBoxErrorInfoImpl.h b/src/VBox/Main/include/VirtualBoxErrorInfoImpl.h
index d7e1d02..9e247f1 100644
--- a/src/VBox/Main/include/VirtualBoxErrorInfoImpl.h
+++ b/src/VBox/Main/include/VirtualBoxErrorInfoImpl.h
@@ -1,3 +1,4 @@
+/* $Id: VirtualBoxErrorInfoImpl.h $ */
/** @file
* VirtualBoxErrorInfo COM class definition.
*/
diff --git a/src/VBox/Main/include/netif.h b/src/VBox/Main/include/netif.h
index bd61892..7f3bfd4 100644
--- a/src/VBox/Main/include/netif.h
+++ b/src/VBox/Main/include/netif.h
@@ -1,3 +1,4 @@
+/* $Id: netif.h $ */
/** @file
* Main - Network Interfaces.
*/
diff --git a/src/VBox/Main/include/objectslist.h b/src/VBox/Main/include/objectslist.h
index f0c443c..c506dd8 100644
--- a/src/VBox/Main/include/objectslist.h
+++ b/src/VBox/Main/include/objectslist.h
@@ -1,3 +1,4 @@
+/* $Id: objectslist.h $ */
/** @file
*
* List of COM objects
diff --git a/src/VBox/Main/include/vbox-libhal.h b/src/VBox/Main/include/vbox-libhal.h
index 5697b20..890fb28 100644
--- a/src/VBox/Main/include/vbox-libhal.h
+++ b/src/VBox/Main/include/vbox-libhal.h
@@ -1,3 +1,4 @@
+/* $Id: vbox-libhal.h $ */
/** @file
*
* Module to dynamically load libhal and libdbus and load all symbols
diff --git a/src/VBox/Main/include/vector.h b/src/VBox/Main/include/vector.h
index b831aca..abcf0a6 100644
--- a/src/VBox/Main/include/vector.h
+++ b/src/VBox/Main/include/vector.h
@@ -1,3 +1,4 @@
+/* $Id: vector.h $ */
/** @file
* STL-inspired vector implementation in C
* @note functions in this file are inline to prevent warnings about
diff --git a/src/VBox/Main/include/win/resource.h b/src/VBox/Main/include/win/resource.h
index 160e473..854e1e2 100644
--- a/src/VBox/Main/include/win/resource.h
+++ b/src/VBox/Main/include/win/resource.h
@@ -1,3 +1,4 @@
+/* $Id: resource.h $ */
/** @file
*
* Resource definitions
diff --git a/src/VBox/Main/src-all/DisplayResampleImage.cpp b/src/VBox/Main/src-all/DisplayResampleImage.cpp
index d46bffa..b656fbb 100644
--- a/src/VBox/Main/src-all/DisplayResampleImage.cpp
+++ b/src/VBox/Main/src-all/DisplayResampleImage.cpp
@@ -1,3 +1,4 @@
+/* $Id: DisplayResampleImage.cpp $ */
/** @file
* Image resampling code, used for snapshot thumbnails.
*/
diff --git a/src/VBox/Main/src-all/EventImpl.cpp b/src/VBox/Main/src-all/EventImpl.cpp
index fde124e..96e09e1 100644
--- a/src/VBox/Main/src-all/EventImpl.cpp
+++ b/src/VBox/Main/src-all/EventImpl.cpp
@@ -227,6 +227,7 @@ HRESULT VBoxEvent::waitProcessed(LONG aTimeout, BOOL *aResult)
}
typedef std::list<Utf8Str> VetoList;
+typedef std::list<Utf8Str> ApprovalList;
struct VBoxVetoEvent::Data
{
Data() :
@@ -235,6 +236,7 @@ struct VBoxVetoEvent::Data
ComObjPtr<VBoxEvent> mEvent;
BOOL mVetoed;
VetoList mVetoList;
+ ApprovalList mApprovalList;
};
HRESULT VBoxVetoEvent::FinalConstruct()
@@ -271,6 +273,7 @@ HRESULT VBoxVetoEvent::init(IEventSource *aSource, VBoxEventType_T aType)
m->mVetoed = FALSE;
m->mVetoList.clear();
+ m->mApprovalList.clear();
/* Confirm a successful initialization */
autoInitSpan.setSucceeded();
@@ -351,6 +354,30 @@ HRESULT VBoxVetoEvent::getVetos(std::vector<com::Utf8Str> &aResult)
}
+HRESULT VBoxVetoEvent::addApproval(const com::Utf8Str &aReason)
+{
+ // AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+ m->mApprovalList.push_back(aReason);
+ return S_OK;
+}
+
+HRESULT VBoxVetoEvent::isApproved(BOOL *aResult)
+{
+ // AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+ *aResult = !m->mApprovalList.empty();
+ return S_OK;
+}
+
+HRESULT VBoxVetoEvent::getApprovals(std::vector<com::Utf8Str> &aResult)
+{
+ // AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+ aResult.resize(m->mApprovalList.size());
+ size_t i = 0;
+ for (ApprovalList::const_iterator it = m->mApprovalList.begin(); it != m->mApprovalList.end(); ++it, ++i)
+ aResult[i] = (*it);
+ return S_OK;
+}
+
static const int FirstEvent = (int)VBoxEventType_LastWildcard + 1;
static const int LastEvent = (int)VBoxEventType_Last;
static const int NumEvents = LastEvent - FirstEvent;
diff --git a/src/VBox/Main/src-all/Logging.cpp b/src/VBox/Main/src-all/Logging.cpp
index 21f9de6..17b0797 100644
--- a/src/VBox/Main/src-all/Logging.cpp
+++ b/src/VBox/Main/src-all/Logging.cpp
@@ -1,3 +1,4 @@
+/* $Id: Logging.cpp $ */
/** @file
*
* VirtualBox Main Logging
diff --git a/src/VBox/Main/src-all/SharedFolderImpl.cpp b/src/VBox/Main/src-all/SharedFolderImpl.cpp
index 42e6ec3..bcf2483 100644
--- a/src/VBox/Main/src-all/SharedFolderImpl.cpp
+++ b/src/VBox/Main/src-all/SharedFolderImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: SharedFolderImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/src-all/VirtualBoxBase.cpp b/src/VBox/Main/src-all/VirtualBoxBase.cpp
index ba292b6..9319522 100644
--- a/src/VBox/Main/src-all/VirtualBoxBase.cpp
+++ b/src/VBox/Main/src-all/VirtualBoxBase.cpp
@@ -36,6 +36,7 @@
#include "AutoCaller.h"
#include "VirtualBoxErrorInfoImpl.h"
#include "Logging.h"
+#include "Global.h"
#include "VBox/com/ErrorInfo.h"
#include "VBox/com/MultiResult.h"
@@ -167,13 +168,14 @@ HRESULT VirtualBoxBase::setErrorInternal(HRESULT aResultCode,
const char *pcszComponent,
Utf8Str aText,
bool aWarning,
- bool aLogIt)
+ bool aLogIt,
+ LONG aResultDetail /* = 0*/)
{
/* whether multi-error mode is turned on */
bool preserve = MultiResult::isMultiEnabled();
if (aLogIt)
- LogRel(("%s [COM]: aRC=%Rhrc (%#08x) aIID={%RTuuid} aComponent={%s} aText={%s}, preserve=%RTbool\n",
+ LogRel(("%s [COM]: aRC=%Rhrc (%#08x) aIID={%RTuuid} aComponent={%s} aText={%s}, preserve=%RTbool aResultDetail=%d\n",
aWarning ? "WARNING" : "ERROR",
aResultCode,
aResultCode,
@@ -181,7 +183,8 @@ HRESULT VirtualBoxBase::setErrorInternal(HRESULT aResultCode,
pcszComponent,
aText.c_str(),
aWarning,
- preserve));
+ preserve,
+ aResultDetail));
/* these are mandatory, others -- not */
AssertReturn((!aWarning && FAILED(aResultCode)) ||
@@ -258,7 +261,7 @@ HRESULT VirtualBoxBase::setErrorInternal(HRESULT aResultCode,
Assert(SUCCEEDED(rc) || curInfo.isNull());
/* set the current error info and preserve the previous one if any */
- rc = info->init(aResultCode, aIID, pcszComponent, aText, curInfo);
+ rc = info->initEx(aResultCode, aResultDetail, aIID, pcszComponent, aText, curInfo);
if (FAILED(rc)) break;
ComPtr<IErrorInfo> err;
@@ -302,7 +305,7 @@ HRESULT VirtualBoxBase::setErrorInternal(HRESULT aResultCode,
Assert(SUCCEEDED(rc) || curInfo.isNull());
/* set the current error info and preserve the previous one if any */
- rc = info->init(aResultCode, aIID, pcszComponent, Bstr(aText), curInfo);
+ rc = info->initEx(aResultCode, aResultDetail, aIID, pcszComponent, Bstr(aText), curInfo);
if (FAILED(rc)) break;
ComPtr<nsIException> ex;
@@ -503,6 +506,105 @@ HRESULT VirtualBoxBase::setError(const com::ErrorInfo &ei)
}
/**
+ * Converts the VBox status code a COM one and sets the error info.
+ *
+ * The VBox status code is made available to the API user via
+ * IVirtualBoxErrorInfo::resultDetail attribute.
+ *
+ * @param vrc The VBox status code.
+ * @return COM status code appropriate for @a vrc.
+ *
+ * @sa VirtualBoxBase::setError(HRESULT)
+ */
+HRESULT VirtualBoxBase::setErrorVrc(int vrc)
+{
+ return setErrorInternal(Global::vboxStatusCodeToCOM(vrc),
+ this->getClassIID(),
+ this->getComponentName(),
+ Utf8Str("%Rrc", vrc),
+ false /* aWarning */,
+ true /* aLogIt */,
+ vrc /* aResultDetail */);
+}
+
+/**
+ * Converts the VBox status code a COM one and sets the error info.
+ *
+ * @param vrc The VBox status code.
+ * @param pcszMsgFmt Error message format string.
+ * @param ... Argument specified in the @a pcszMsgFmt
+ * @return COM status code appropriate for @a vrc.
+ *
+ * @sa VirtualBoxBase::setError(HRESULT, const char *, ...)
+ */
+HRESULT VirtualBoxBase::setErrorVrc(int vrc, const char *pcszMsgFmt, ...)
+{
+ va_list va;
+ va_start(va, pcszMsgFmt);
+ HRESULT hrc = setErrorInternal(Global::vboxStatusCodeToCOM(vrc),
+ this->getClassIID(),
+ this->getComponentName(),
+ Utf8Str(pcszMsgFmt, va),
+ false /* aWarning */,
+ true /* aLogIt */,
+ vrc /* aResultDetail */);
+ va_end(va);
+ return hrc;
+}
+
+/**
+ * Sets error info with both a COM status and an VBox status code.
+ *
+ * The VBox status code is made available to the API user via
+ * IVirtualBoxErrorInfo::resultDetail attribute.
+ *
+ * @param hrc The COM status code to return.
+ * @param vrc The VBox status code.
+ * @return Most likely @hrc, see setErrorInternal.
+ *
+ * @sa VirtualBoxBase::setError(HRESULT)
+ */
+HRESULT VirtualBoxBase::setErrorBoth(HRESULT hrc, int vrc)
+{
+ return setErrorInternal(hrc,
+ this->getClassIID(),
+ this->getComponentName(),
+ Utf8Str("%Rrc", vrc),
+ false /* aWarning */,
+ true /* aLogIt */,
+ vrc /* aResultDetail */);
+}
+
+/**
+ * Sets error info with a message and both a COM status and an VBox status code.
+ *
+ * The VBox status code is made available to the API user via
+ * IVirtualBoxErrorInfo::resultDetail attribute.
+ *
+ * @param hrc The COM status code to return.
+ * @param vrc The VBox status code.
+ * @param pcszMsgFmt Error message format string.
+ * @param ... Argument specified in the @a pcszMsgFmt
+ * @return Most likely @hrc, see setErrorInternal.
+ *
+ * @sa VirtualBoxBase::setError(HRESULT, const char *, ...)
+ */
+HRESULT VirtualBoxBase::setErrorBoth(HRESULT hrc, int vrc, const char *pcszMsgFmt, ...)
+{
+ va_list va;
+ va_start(va, pcszMsgFmt);
+ hrc = setErrorInternal(hrc,
+ this->getClassIID(),
+ this->getComponentName(),
+ Utf8Str(pcszMsgFmt, va),
+ false /* aWarning */,
+ true /* aLogIt */,
+ vrc /* aResultDetail */);
+ va_end(va);
+ return hrc;
+}
+
+/**
* Like setError(), but sets the "warning" bit in the call to setErrorInternal().
* @param aResultCode
* @param pcsz
diff --git a/src/VBox/Main/src-all/VirtualBoxErrorInfoImpl.cpp b/src/VBox/Main/src-all/VirtualBoxErrorInfoImpl.cpp
index 96ade44..405e5c5 100644
--- a/src/VBox/Main/src-all/VirtualBoxErrorInfoImpl.cpp
+++ b/src/VBox/Main/src-all/VirtualBoxErrorInfoImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: VirtualBoxErrorInfoImpl.cpp $ */
/** @file
*
* VirtualBoxErrorInfo COM class implementation
diff --git a/src/VBox/Main/src-client/AdditionsFacilityImpl.cpp b/src/VBox/Main/src-client/AdditionsFacilityImpl.cpp
index d6e9754..c0bd7c2 100644
--- a/src/VBox/Main/src-client/AdditionsFacilityImpl.cpp
+++ b/src/VBox/Main/src-client/AdditionsFacilityImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: AdditionsFacilityImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/src-client/ClientTokenHolder.cpp b/src/VBox/Main/src-client/ClientTokenHolder.cpp
index 07ad83e..d7d17bc 100644
--- a/src/VBox/Main/src-client/ClientTokenHolder.cpp
+++ b/src/VBox/Main/src-client/ClientTokenHolder.cpp
@@ -1,3 +1,4 @@
+/* $Id: ClientTokenHolder.cpp $ */
/** @file
*
* VirtualBox API client session token holder (in the client process)
diff --git a/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/VBox/Main/src-client/ConsoleImpl.cpp
index 3065360..343ffdb 100644
--- a/src/VBox/Main/src-client/ConsoleImpl.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl.cpp
@@ -265,7 +265,7 @@ public:
{
}
- STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent * aEvent)
+ STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent *aEvent)
{
switch(aType)
{
@@ -277,12 +277,9 @@ public:
HRESULT rc = E_FAIL;
Assert(pNREv);
- Bstr interestedId;
- rc = pMachine->COMGETTER(Id)(interestedId.asOutParam());
- AssertComRC(rc);
rc = pNREv->COMGETTER(MachineId)(id.asOutParam());
AssertComRC(rc);
- if (id != interestedId)
+ if (id != mConsole->i_getId())
break;
/* now we can operate with redirects */
NATProtocol_T proto;
@@ -341,6 +338,7 @@ public:
default:
AssertFailed();
}
+
return S_OK;
}
private:
@@ -477,6 +475,9 @@ HRESULT Console::init(IMachine *aMachine, IInternalMachineControl *aControl, Loc
rc = mMachine->COMGETTER(State)(&mMachineState);
AssertComRCReturnRC(rc);
+ rc = mMachine->COMGETTER(Id)(mstrUuid.asOutParam());
+ AssertComRCReturnRC(rc);
+
#ifdef VBOX_WITH_EXTPACK
unconst(mptrExtPackManager).createObject();
rc = mptrExtPackManager->initExtPackManager(NULL, VBOXEXTPACKCTX_VM_PROCESS);
@@ -1064,14 +1065,10 @@ int Console::i_VRDPClientLogon(uint32_t u32ClientId, const char *pszUser, const
return VERR_ACCESS_DENIED;
}
- Bstr id;
- HRESULT hrc = mMachine->COMGETTER(Id)(id.asOutParam());
- Guid uuid = Guid(id);
-
- AssertComRCReturn(hrc, VERR_ACCESS_DENIED);
+ Guid uuid = Guid(i_getId());
AuthType_T authType = AuthType_Null;
- hrc = mVRDEServer->COMGETTER(AuthType)(&authType);
+ HRESULT hrc = mVRDEServer->COMGETTER(AuthType)(&authType);
AssertComRCReturn(hrc, VERR_ACCESS_DENIED);
ULONG authTimeout = 0;
@@ -1418,16 +1415,12 @@ void Console::i_VRDPClientDisconnect(uint32_t u32ClientId,
#endif
}
- Bstr uuid;
- HRESULT hrc = mMachine->COMGETTER(Id)(uuid.asOutParam());
- AssertComRC(hrc);
-
AuthType_T authType = AuthType_Null;
- hrc = mVRDEServer->COMGETTER(AuthType)(&authType);
+ HRESULT hrc = mVRDEServer->COMGETTER(AuthType)(&authType);
AssertComRC(hrc);
if (authType == AuthType_External)
- mConsoleVRDPServer->AuthDisconnect(uuid, u32ClientId);
+ mConsoleVRDPServer->AuthDisconnect(i_getId(), u32ClientId);
#ifdef VBOX_WITH_GUEST_PROPS
i_guestPropertiesVRDPUpdateDisconnect(u32ClientId);
@@ -1761,10 +1754,12 @@ DECLCALLBACK(int) Console::i_doGuestPropNotification(void *pvExtension,
Bstr value(pCBData->pcszValue);
Bstr flags(pCBData->pcszFlags);
ComObjPtr<Console> pConsole = reinterpret_cast<Console *>(pvExtension);
+ BOOL fNotify = FALSE;
HRESULT hrc = pConsole->mControl->PushGuestProperty(name.raw(),
value.raw(),
pCBData->u64Timestamp,
- flags.raw());
+ flags.raw(),
+ &fNotify);
if (SUCCEEDED(hrc))
rc = VINF_SUCCESS;
else
@@ -1773,6 +1768,8 @@ DECLCALLBACK(int) Console::i_doGuestPropNotification(void *pvExtension,
hrc, pCBData->pcszName, pCBData->pcszValue, pCBData->pcszFlags));
rc = Global::vboxStatusCodeFromCOM(hrc);
}
+ if (fNotify)
+ fireGuestPropertyChangedEvent(pConsole->mEventSource, pConsole->i_getId().raw(), name.raw(), value.raw(), flags.raw());
return rc;
}
@@ -2994,7 +2991,7 @@ HRESULT Console::createSharedFolder(const com::Utf8Str &aName, const com::Utf8St
SharedFolderDataMap::const_iterator it;
if (i_findOtherSharedFolder(aName, it))
{
- rc = removeSharedFolder(aName);
+ rc = i_removeSharedFolder(aName);
if (FAILED(rc))
return rc;
}
@@ -3020,8 +3017,6 @@ HRESULT Console::removeSharedFolder(const com::Utf8Str &aName)
{
LogFlowThisFunc(("Entering for '%s'\n", aName.c_str()));
- Utf8Str strName(aName);
-
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
/// @todo see @todo in AttachUSBDevice() about the Paused state
@@ -3053,20 +3048,20 @@ HRESULT Console::removeSharedFolder(const com::Utf8Str &aName)
* folder. */
/* first, remove the given folder */
- rc = removeSharedFolder(strName);
+ rc = i_removeSharedFolder(aName);
if (FAILED(rc)) return rc;
/* first, remove the machine or the global folder if there is any */
SharedFolderDataMap::const_iterator it;
- if (i_findOtherSharedFolder(strName, it))
+ if (i_findOtherSharedFolder(aName, it))
{
- rc = i_createSharedFolder(strName, it->second);
+ rc = i_createSharedFolder(aName, it->second);
/* don't check rc here because we need to remove the console
* folder from the collection even on failure */
}
}
- m_mapSharedFolders.erase(strName);
+ m_mapSharedFolders.erase(aName);
/* Notify console callbacks after the folder is removed from the list. */
alock.release();
@@ -5669,10 +5664,8 @@ HRESULT Console::i_onExtraDataChange(IN_BSTR aMachineId, IN_BSTR aKey, IN_BSTR a
HRESULT hrc = S_OK;
Bstr idMachine(aMachineId);
- Bstr idSelf;
- hrc = mMachine->COMGETTER(Id)(idSelf.asOutParam());
if ( FAILED(hrc)
- || idMachine != idSelf)
+ || idMachine != i_getId())
return hrc;
/* don't do anything if the VM isn't running */
@@ -6207,12 +6200,13 @@ HRESULT Console::i_pause(Reason_T aReason)
case MachineState_Paused:
case MachineState_TeleportingPausedVM:
case MachineState_OnlineSnapshotting:
-
- /* Remove any keys which are supposed to be removed on a suspend. */
- if ( aReason == Reason_HostSuspend
- || aReason == Reason_HostBatteryLow)
- i_removeSecretKeysOnSuspend();
-
+ /* Remove any keys which are supposed to be removed on a suspend. */
+ if ( aReason == Reason_HostSuspend
+ || aReason == Reason_HostBatteryLow)
+ {
+ i_removeSecretKeysOnSuspend();
+ return S_OK;
+ }
return setError(VBOX_E_INVALID_VM_STATE, tr("Already paused"));
default:
@@ -6229,7 +6223,7 @@ HRESULT Console::i_pause(Reason_T aReason)
LogFlowThisFunc(("Sending PAUSE request...\n"));
if (aReason != Reason_Unspecified)
- LogRel(("Pausing VM execution, reason \"%s\"\n", Global::stringifyReason(aReason)));
+ LogRel(("Pausing VM execution, reason '%s'\n", Global::stringifyReason(aReason)));
/** @todo r=klaus make use of aReason */
VMSUSPENDREASON enmReason = VMSUSPENDREASON_USER;
@@ -6275,7 +6269,7 @@ HRESULT Console::i_resume(Reason_T aReason, AutoWriteLock &alock)
LogFlowThisFunc(("Sending RESUME request...\n"));
if (aReason != Reason_Unspecified)
- LogRel(("Resuming VM execution, reason \"%s\"\n", Global::stringifyReason(aReason)));
+ LogRel(("Resuming VM execution, reason '%s'\n", Global::stringifyReason(aReason)));
int vrc;
if (VMR3GetStateU(ptrVM.rawUVM()) == VMSTATE_CREATED)
@@ -6292,7 +6286,16 @@ HRESULT Console::i_resume(Reason_T aReason, AutoWriteLock &alock)
{
VMRESUMEREASON enmReason = VMRESUMEREASON_USER;
if (aReason == Reason_HostResume)
+ {
+ /*
+ * Host resume may be called multiple times successively. We don't want to VMR3Resume->vmR3Resume->vmR3TrySetState()
+ * to assert on us, hence check for the VM state here and bail if it's already in the 'running' state.
+ * See @bugref{3495}.
+ */
enmReason = VMRESUMEREASON_HOST_RESUME;
+ if (VMR3GetStateU(ptrVM.rawUVM()) == VMSTATE_RUNNING)
+ return S_OK;
+ }
else if (aReason == Reason_Snapshot)
enmReason = VMRESUMEREASON_STATE_SAVED;
@@ -6357,7 +6360,7 @@ HRESULT Console::i_saveState(Reason_T aReason, const ComPtr<IProgress> &aProgres
tr("Saving the execution state is disabled for this VM"));
if (aReason != Reason_Unspecified)
- LogRel(("Saving state of VM, reason \"%s\"\n", Global::stringifyReason(aReason)));
+ LogRel(("Saving state of VM, reason '%s'\n", Global::stringifyReason(aReason)));
/* ensure the directory for the saved state file exists */
{
@@ -6703,8 +6706,10 @@ HRESULT Console::i_onShowWindow(BOOL aCheck, BOOL *aCanShow, LONG64 *aWinId)
if (pCanShowEvent)
{
BOOL fVetoed = FALSE;
+ BOOL fApproved = FALSE;
pCanShowEvent->IsVetoed(&fVetoed);
- *aCanShow = !fVetoed;
+ pCanShowEvent->IsApproved(&fApproved);
+ *aCanShow = fApproved || !fVetoed;
}
else
{
@@ -7730,7 +7735,7 @@ HRESULT Console::i_setMachineState(MachineState_T aMachineState,
{
LogThisFunc(("machineState=%s -> %s aUpdateServer=%RTbool\n",
Global::stringifyMachineState(mMachineState), Global::stringifyMachineState(aMachineState), aUpdateServer));
- LogRel(("Console: machine state changed to %s\n", Global::stringifyMachineState(aMachineState)));
+ LogRel(("Console: Machine state changed to '%s'\n", Global::stringifyMachineState(aMachineState)));
mMachineState = aMachineState;
/// @todo (dmik)
@@ -7890,7 +7895,7 @@ HRESULT Console::i_fetchSharedFolders(BOOL aGlobal)
|| m_mapGlobalSharedFolders.find(strName) != m_mapGlobalSharedFolders.end()
)
{
- rc = removeSharedFolder(strName);
+ rc = i_removeSharedFolder(strName);
if (FAILED(rc)) throw rc;
}
@@ -7917,7 +7922,7 @@ HRESULT Console::i_fetchSharedFolders(BOOL aGlobal)
else
{
/* remove the outdated machine folder */
- rc = removeSharedFolder(it->first);
+ rc = i_removeSharedFolder(it->first);
if (FAILED(rc)) throw rc;
/* create the global folder if there is any */
diff --git a/src/VBox/Main/src-client/ConsoleImpl2.cpp b/src/VBox/Main/src-client/ConsoleImpl2.cpp
index 6f68a1d..0646c20 100644
--- a/src/VBox/Main/src-client/ConsoleImpl2.cpp
+++ b/src/VBox/Main/src-client/ConsoleImpl2.cpp
@@ -120,9 +120,6 @@
#ifdef VBOX_WITH_EXTPACK
# include "ExtPackManagerImpl.h"
#endif
-#if defined(RT_OS_DARWIN)
-# include "IOKit/IOKitLib.h"
-#endif
/*******************************************************************************
@@ -131,72 +128,6 @@
static Utf8Str *GetExtraDataBoth(IVirtualBox *pVirtualBox, IMachine *pMachine, const char *pszName, Utf8Str *pStrValue);
-
-#if defined(RT_OS_DARWIN)
-
-static int DarwinSmcKey(char *pabKey, uint32_t cbKey)
-{
- /*
- * Method as described in Amit Singh's article:
- * http://osxbook.com/book/bonus/chapter7/tpmdrmmyth/
- */
- typedef struct
- {
- uint32_t key;
- uint8_t pad0[22];
- uint32_t datasize;
- uint8_t pad1[10];
- uint8_t cmd;
- uint32_t pad2;
- uint8_t data[32];
- } AppleSMCBuffer;
-
- AssertReturn(cbKey >= 65, VERR_INTERNAL_ERROR);
-
- io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
- IOServiceMatching("AppleSMC"));
- if (!service)
- return VERR_NOT_FOUND;
-
- io_connect_t port = (io_connect_t)0;
- kern_return_t kr = IOServiceOpen(service, mach_task_self(), 0, &port);
- IOObjectRelease(service);
-
- if (kr != kIOReturnSuccess)
- return RTErrConvertFromDarwin(kr);
-
- AppleSMCBuffer inputStruct = { 0, {0}, 32, {0}, 5, };
- AppleSMCBuffer outputStruct;
- size_t cbOutputStruct = sizeof(outputStruct);
-
- for (int i = 0; i < 2; i++)
- {
- inputStruct.key = (uint32_t)(i == 0 ? 'OSK0' : 'OSK1');
- kr = IOConnectCallStructMethod((mach_port_t)port,
- (uint32_t)2,
- (const void *)&inputStruct,
- sizeof(inputStruct),
- (void *)&outputStruct,
- &cbOutputStruct);
- if (kr != kIOReturnSuccess)
- {
- IOServiceClose(port);
- return RTErrConvertFromDarwin(kr);
- }
-
- for (int j = 0; j < 32; j++)
- pabKey[j + i*32] = outputStruct.data[j];
- }
-
- IOServiceClose(port);
-
- pabKey[64] = 0;
-
- return VINF_SUCCESS;
-}
-
-#endif /* RT_OS_DARWIN */
-
/* Darwin compile kludge */
#undef PVM
@@ -272,18 +203,12 @@ static int getSmcDeviceKey(IVirtualBox *pVirtualBox, IMachine *pMachine, Utf8Str
return VINF_SUCCESS;
#ifdef RT_OS_DARWIN
+
/*
- * Query it here and now.
+ * Work done in EFI/DevSmc
*/
- char abKeyBuf[65];
- int rc = DarwinSmcKey(abKeyBuf, sizeof(abKeyBuf));
- if (SUCCEEDED(rc))
- {
- *pStrKey = abKeyBuf;
- *pfGetKeyFromRealSMC = true;
- return rc;
- }
- LogRel(("Warning: DarwinSmcKey failed with rc=%Rrc!\n", rc));
+ *pfGetKeyFromRealSMC = true;
+ int rc = VINF_SUCCESS;
#else
/*
@@ -818,6 +743,151 @@ DECLCALLBACK(int) Console::i_configConstructor(PUVM pUVM, PVM pVM, void *pvConso
}
+#ifdef RT_OS_WINDOWS
+#include <psapi.h>
+
+/**
+ * Report versions of installed drivers to release log.
+ */
+static void reportDriverVersions(void)
+{
+ DWORD err;
+ HRESULT hrc;
+ LPVOID aDrivers[1024];
+ LPVOID *pDrivers = aDrivers;
+ UINT cNeeded = 0;
+ TCHAR szSystemRoot[MAX_PATH];
+ TCHAR *pszSystemRoot = szSystemRoot;
+ LPVOID pVerInfo = NULL;
+ DWORD cbVerInfo = 0;
+
+ do
+ {
+ cNeeded = GetWindowsDirectory(szSystemRoot, RT_ELEMENTS(szSystemRoot));
+ if (cNeeded == 0)
+ {
+ err = GetLastError();
+ hrc = HRESULT_FROM_WIN32(err);
+ AssertLogRelMsgFailed(("GetWindowsDirectory failed, hr=%Rhrc (0x%x) err=%u\n",
+ hrc, hrc, err));
+ break;
+ }
+ else if (cNeeded > RT_ELEMENTS(szSystemRoot))
+ {
+ /* The buffer is too small, allocate big one. */
+ pszSystemRoot = (TCHAR *)RTMemTmpAlloc(cNeeded * sizeof(_TCHAR));
+ if (!pszSystemRoot)
+ {
+ AssertLogRelMsgFailed(("RTMemTmpAlloc failed to allocate %d bytes\n", cNeeded));
+ break;
+ }
+ if (GetWindowsDirectory(pszSystemRoot, cNeeded) == 0)
+ {
+ err = GetLastError();
+ hrc = HRESULT_FROM_WIN32(err);
+ AssertLogRelMsgFailed(("GetWindowsDirectory failed, hr=%Rhrc (0x%x) err=%u\n",
+ hrc, hrc, err));
+ break;
+ }
+ }
+
+ DWORD cbNeeded = 0;
+ if (!EnumDeviceDrivers(aDrivers, sizeof(aDrivers), &cbNeeded) || cbNeeded > sizeof(aDrivers))
+ {
+ pDrivers = (LPVOID *)RTMemTmpAlloc(cbNeeded);
+ if (!EnumDeviceDrivers(pDrivers, cbNeeded, &cbNeeded))
+ {
+ err = GetLastError();
+ hrc = HRESULT_FROM_WIN32(err);
+ AssertLogRelMsgFailed(("EnumDeviceDrivers failed, hr=%Rhrc (0x%x) err=%u\n",
+ hrc, hrc, err));
+ break;
+ }
+ }
+
+ LogRel(("Installed Drivers:\n"));
+
+ TCHAR szDriver[1024];
+ int cDrivers = cbNeeded / sizeof(pDrivers[0]);
+ for (int i = 0; i < cDrivers; i++)
+ {
+ if (GetDeviceDriverBaseName(pDrivers[i], szDriver, sizeof(szDriver) / sizeof(szDriver[0])))
+ {
+ if (_tcsnicmp(TEXT("vbox"), szDriver, 4))
+ continue;
+ }
+ else
+ continue;
+ if (GetDeviceDriverFileName(pDrivers[i], szDriver, sizeof(szDriver) / sizeof(szDriver[0])))
+ {
+ _TCHAR szTmpDrv[1024];
+ _TCHAR *pszDrv = szDriver;
+ if (!_tcsncmp(TEXT("\\SystemRoot"), szDriver, 11))
+ {
+ _tcscpy_s(szTmpDrv, pszSystemRoot);
+ _tcsncat_s(szTmpDrv, szDriver + 11, sizeof(szTmpDrv) / sizeof(szTmpDrv[0]) - _tclen(pszSystemRoot));
+ pszDrv = szTmpDrv;
+ }
+ else if (!_tcsncmp(TEXT("\\??\\"), szDriver, 4))
+ pszDrv = szDriver + 4;
+
+ /* Allocate a buffer for version info. Reuse if large enough. */
+ DWORD cbNewVerInfo = GetFileVersionInfoSize(pszDrv, NULL);
+ if (cbNewVerInfo > cbVerInfo)
+ {
+ if (pVerInfo)
+ RTMemTmpFree(pVerInfo);
+ cbVerInfo = cbNewVerInfo;
+ pVerInfo = RTMemTmpAlloc(cbVerInfo);
+ if (!pVerInfo)
+ {
+ AssertLogRelMsgFailed(("RTMemTmpAlloc failed to allocate %d bytes\n", cbVerInfo));
+ break;
+ }
+ }
+
+ if (GetFileVersionInfo(pszDrv, NULL, cbVerInfo, pVerInfo))
+ {
+ UINT cbSize = 0;
+ LPBYTE lpBuffer = NULL;
+ if (VerQueryValue(pVerInfo, TEXT("\\"), (VOID FAR* FAR*)&lpBuffer, &cbSize))
+ {
+ if (cbSize)
+ {
+ VS_FIXEDFILEINFO *pFileInfo = (VS_FIXEDFILEINFO *)lpBuffer;
+ if (pFileInfo->dwSignature == 0xfeef04bd)
+ {
+ LogRel((" %ls (Version: %d.%d.%d.%d)\n", pszDrv,
+ (pFileInfo->dwFileVersionMS >> 16) & 0xffff,
+ (pFileInfo->dwFileVersionMS >> 0) & 0xffff,
+ (pFileInfo->dwFileVersionLS >> 16) & 0xffff,
+ (pFileInfo->dwFileVersionLS >> 0) & 0xffff));
+ }
+ }
+ }
+ }
+ }
+ }
+
+ }
+ while (0);
+
+ if (pVerInfo)
+ RTMemTmpFree(pVerInfo);
+
+ if (pDrivers != aDrivers)
+ RTMemTmpFree(pDrivers);
+
+ if (pszSystemRoot != szSystemRoot)
+ RTMemTmpFree(pszSystemRoot);
+}
+#else /* !RT_OS_WINDOWS */
+static void reportDriverVersions(void)
+{
+}
+#endif /* !RT_OS_WINDOWS */
+
+
/**
* Worker for configConstructor.
*
@@ -909,6 +979,8 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
ULONG maxNetworkAdapters;
hrc = systemProperties->GetMaxNetworkAdapters(chipsetType, &maxNetworkAdapters); H();
+
+ reportDriverVersions();
/*
* Get root node first.
* This is the only node in the tree.
@@ -1035,17 +1107,16 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
InsertConfigInteger(pCPUM, "MaxIntelFamilyModelStep", uMaxIntelFamilyModelStep);
}
- /* Synthetic CPU */
- BOOL fSyntheticCpu = false;
- hrc = pMachine->GetCPUProperty(CPUPropertyType_Synthetic, &fSyntheticCpu); H();
- InsertConfigInteger(pCPUM, "SyntheticCpu", fSyntheticCpu);
+ /* CPU Portability level, */
+ ULONG uCpuIdPortabilityLevel = 0;
+ hrc = pMachine->COMGETTER(CPUIDPortabilityLevel)(&uCpuIdPortabilityLevel); H();
+ InsertConfigInteger(pCPUM, "PortableCpuIdLevel", uCpuIdPortabilityLevel);
/* Physical Address Extension (PAE) */
BOOL fEnablePAE = false;
hrc = pMachine->GetCPUProperty(CPUPropertyType_PAE, &fEnablePAE); H();
InsertConfigInteger(pRoot, "EnablePAE", fEnablePAE);
-
/*
* Hardware virtualization extensions.
*/
@@ -1448,7 +1519,8 @@ int Console::i_configConstructorInner(PUVM pUVM, PVM pVM, AutoWriteLock *pAlock)
rc = getSmcDeviceKey(virtualBox, pMachine, &strKey, &fGetKeyFromRealSMC);
AssertRCReturn(rc, rc);
- InsertConfigString(pCfg, "DeviceKey", strKey);
+ if (!fGetKeyFromRealSMC)
+ InsertConfigString(pCfg, "DeviceKey", strKey);
InsertConfigInteger(pCfg, "GetKeyFromRealSMC", fGetKeyFromRealSMC);
}
@@ -3619,10 +3691,13 @@ int Console::i_configMediumAttachment(const char *pcszDevice,
PCFGMNODE pCfg = NULL;
/* Create correct instance. */
- if (!fHotplug && !fAttachDetach)
- InsertConfigNode(pCtlInst, Utf8StrFmt("%d", lPort).c_str(), &pCtlInst);
- else if (fAttachDetach)
- pCtlInst = CFGMR3GetChildF(pCtlInst, "%d/", lPort);
+ if (!fHotplug)
+ {
+ if (!fAttachDetach)
+ InsertConfigNode(pCtlInst, Utf8StrFmt("%d", lPort).c_str(), &pCtlInst);
+ else
+ pCtlInst = CFGMR3GetChildF(pCtlInst, "%d/", lPort);
+ }
if (!fAttachDetach)
InsertConfigNode(pCtlInst, "Config", &pCfg);
diff --git a/src/VBox/Main/src-client/DisplaySourceBitmapImpl.cpp b/src/VBox/Main/src-client/DisplaySourceBitmapImpl.cpp
index 3c20264..cf4734a 100644
--- a/src/VBox/Main/src-client/DisplaySourceBitmapImpl.cpp
+++ b/src/VBox/Main/src-client/DisplaySourceBitmapImpl.cpp
@@ -131,7 +131,7 @@ int DisplaySourceBitmap::initSourceBitmap(unsigned aScreenId,
ULONG ulBytesPerLine = 0;
BitmapFormat_T bitmapFormat = BitmapFormat_Opaque;
- if (pFBInfo->pu8FramebufferVRAM && pFBInfo->u16BitsPerPixel == 32)
+ if (pFBInfo->pu8FramebufferVRAM && pFBInfo->u16BitsPerPixel == 32 && !pFBInfo->fDisabled)
{
/* From VRAM. */
LogFunc(("%d from VRAM\n", aScreenId));
@@ -173,6 +173,10 @@ int DisplaySourceBitmap::initSourceBitmap(unsigned aScreenId,
m.ulBitsPerPixel = ulBitsPerPixel;
m.ulBytesPerLine = ulBytesPerLine;
m.bitmapFormat = bitmapFormat;
+ if (pFBInfo->fDisabled)
+ {
+ RT_BZERO(pAddress, ulBytesPerLine * ulHeight);
+ }
}
return rc;
diff --git a/src/VBox/Main/src-client/DrvAudioVRDE.cpp b/src/VBox/Main/src-client/DrvAudioVRDE.cpp
index 3471773..1de44ab 100644
--- a/src/VBox/Main/src-client/DrvAudioVRDE.cpp
+++ b/src/VBox/Main/src-client/DrvAudioVRDE.cpp
@@ -215,40 +215,36 @@ static DECLCALLBACK(int) drvAudioVRDEPlayOut(PPDMIHOSTAUDIO pInterface, PPDMAUDI
PVRDESTREAMOUT pVRDEStrmOut = (PVRDESTREAMOUT)pHstStrmOut;
AssertPtrReturn(pVRDEStrmOut, VERR_INVALID_POINTER);
- /*
- * Just call the VRDP server with the data.
- */
uint32_t live = drvAudioHstOutSamplesLive(pHstStrmOut, NULL /* pcStreamsLive */);
uint64_t now = PDMDrvHlpTMGetVirtualTime(pDrv->pDrvIns);
uint64_t ticks = now - pVRDEStrmOut->old_ticks;
uint64_t ticks_per_second = PDMDrvHlpTMGetVirtualFreq(pDrv->pDrvIns);
+ /* Minimize the rounding error: samples = int((ticks * freq) / ticks_per_second + 0.5). */
uint32_t cSamplesPlayed = (int)((2 * ticks * pHstStrmOut->Props.uHz + ticks_per_second) / ticks_per_second / 2);
- if (!cSamplesPlayed)
+
+ /* Don't play more than available. */
+ if (cSamplesPlayed > live)
cSamplesPlayed = live;
+ /* Remember when samples were consumed. */
+ pVRDEStrmOut->old_ticks = now;
+
VRDEAUDIOFORMAT format = VRDE_AUDIO_FMT_MAKE(pHstStrmOut->Props.uHz,
pHstStrmOut->Props.cChannels,
pHstStrmOut->Props.cBits,
pHstStrmOut->Props.fSigned);
- pVRDEStrmOut->old_ticks = now;
-
- int cSamplesToSend = live;
-
-/* if (!cSamplesToSend)
- {
- if (pcSamplesPlayed)
- pcSamplesPlayed = 0;
-
- return 0;
- }*/
+ int cSamplesToSend = cSamplesPlayed;
LogFlowFunc(("uFreq=%RU32, cChan=%RU8, cBits=%RU8, fSigned=%RTbool, enmFormat=%ld, cSamplesToSend=%RU32\n",
pHstStrmOut->Props.uHz, pHstStrmOut->Props.cChannels,
pHstStrmOut->Props.cBits, pHstStrmOut->Props.fSigned,
format, cSamplesToSend));
+ /*
+ * Call the VRDP server with the data.
+ */
uint32_t cReadTotal = 0;
PPDMAUDIOSAMPLE pSamples;
@@ -356,6 +352,8 @@ static DECLCALLBACK(int) drvAudioVRDEControlIn(PPDMIHOSTAUDIO pInterface, PPDMAU
pDrv->pConsoleVRDPServer->SendAudioInputEnd(NULL /* pvUserCtx */);
rc = VINF_SUCCESS;
}
+ else
+ rc = VERR_INVALID_PARAMETER;
return rc;
}
diff --git a/src/VBox/Main/src-client/GuestCtrlImpl.cpp b/src/VBox/Main/src-client/GuestCtrlImpl.cpp
index 37e9725..a94cffd 100644
--- a/src/VBox/Main/src-client/GuestCtrlImpl.cpp
+++ b/src/VBox/Main/src-client/GuestCtrlImpl.cpp
@@ -16,8 +16,10 @@
*/
#include "GuestImpl.h"
-#include "GuestSessionImpl.h"
-#include "GuestCtrlImplPrivate.h"
+#ifdef VBOX_WITH_GUEST_CONTROL
+# include "GuestSessionImpl.h"
+# include "GuestCtrlImplPrivate.h"
+#endif
#include "Global.h"
#include "ConsoleImpl.h"
@@ -49,10 +51,16 @@
#include <VBox/log.h>
+/*
+ * This #ifdef goes almost to the end of the file where there are a couple of
+ * IGuest method implementations.
+ */
+#ifdef VBOX_WITH_GUEST_CONTROL
+
+
// public methods only for internal purposes
/////////////////////////////////////////////////////////////////////////////
-#ifdef VBOX_WITH_GUEST_CONTROL
/**
* Static callback function for receiving updates on guest control commands
* from the guest. Acts as a dispatcher for the actual class instance.
@@ -111,110 +119,6 @@ DECLCALLBACK(int) Guest::i_notifyCtrlDispatcher(void *pvExtension,
LogFlowFunc(("Returning rc=%Rrc\n", rc));
return rc;
}
-#endif /* VBOX_WITH_GUEST_CONTROL */
-
-HRESULT Guest::updateGuestAdditions(const com::Utf8Str &aSource, const std::vector<com::Utf8Str> &aArguments,
- const std::vector<AdditionsUpdateFlag_T> &aFlags, ComPtr<IProgress> &aProgress)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else /* VBOX_WITH_GUEST_CONTROL */
-
- /* Validate flags. */
- uint32_t fFlags = AdditionsUpdateFlag_None;
- if (aFlags.size())
- for (size_t i = 0; i < aFlags.size(); ++i)
- fFlags |= aFlags[i];
-
- if (fFlags && !(fFlags & AdditionsUpdateFlag_WaitForUpdateStartOnly))
- return setError(E_INVALIDARG, tr("Unknown flags (%#x)"), fFlags);
-
- int rc = VINF_SUCCESS;
-
- ProcessArguments aArgs;
- aArgs.resize(0);
-
- if (aArguments.size())
- {
- try
- {
- for (size_t i = 0; i < aArguments.size(); ++i)
- aArgs.push_back(aArguments[i]);
- }
- catch(std::bad_alloc &)
- {
- rc = VERR_NO_MEMORY;
- }
- }
-
- HRESULT hr = S_OK;
-
- /*
- * Create an anonymous session. This is required to run the Guest Additions
- * update process with administrative rights.
- */
- GuestSessionStartupInfo startupInfo;
- startupInfo.mName = "Updating Guest Additions";
-
- GuestCredentials guestCreds;
- RT_ZERO(guestCreds);
-
- ComObjPtr<GuestSession> pSession;
- if (RT_SUCCESS(rc))
- rc = i_sessionCreate(startupInfo, guestCreds, pSession);
- if (RT_FAILURE(rc))
- {
- switch (rc)
- {
- case VERR_MAX_PROCS_REACHED:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Maximum number of concurrent guest sessions (%ld) reached"),
- VBOX_GUESTCTRL_MAX_SESSIONS);
- break;
-
- /** @todo Add more errors here. */
-
- default:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Could not create guest session: %Rrc"), rc);
- break;
- }
- }
- else
- {
- Assert(!pSession.isNull());
- int guestRc;
- rc = pSession->i_startSessionInternal(&guestRc);
- if (RT_FAILURE(rc))
- {
- /** @todo Handle guestRc! */
-
- hr = setError(VBOX_E_IPRT_ERROR, tr("Could not open guest session: %Rrc"), rc);
- }
- else
- {
- try
- {
- ComObjPtr<Progress> pProgress;
- SessionTaskUpdateAdditions *pTask = new SessionTaskUpdateAdditions(pSession /* GuestSession */,
- aSource, aArgs, fFlags);
- rc = pSession->i_startTaskAsync(tr("Updating Guest Additions"), pTask, pProgress);
- if (RT_SUCCESS(rc))
- {
- /* Return progress to the caller. */
- hr = pProgress.queryInterfaceTo(aProgress.asOutParam());
- }
- else
- hr = setError(VBOX_E_IPRT_ERROR,
- tr("Starting task for updating Guest Additions on the guest failed: %Rrc"), rc);
- }
- catch(std::bad_alloc &)
- {
- hr = E_OUTOFMEMORY;
- }
- }
- }
- return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
// private methods
/////////////////////////////////////////////////////////////////////////////
@@ -469,6 +373,9 @@ inline bool Guest::i_sessionExists(uint32_t uSessionID)
return (itSessions == mData.mGuestSessions.end()) ? false : true;
}
+#endif /* VBOX_WITH_GUEST_CONTROL */
+
+
// implementation of public methods
/////////////////////////////////////////////////////////////////////////////
HRESULT Guest::createSession(const com::Utf8Str &aUser, const com::Utf8Str &aPassword, const com::Utf8Str &aDomain,
@@ -573,3 +480,106 @@ HRESULT Guest::findSession(const com::Utf8Str &aSessionName, std::vector<ComPtr<
#endif /* VBOX_WITH_GUEST_CONTROL */
}
+HRESULT Guest::updateGuestAdditions(const com::Utf8Str &aSource, const std::vector<com::Utf8Str> &aArguments,
+ const std::vector<AdditionsUpdateFlag_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+#ifndef VBOX_WITH_GUEST_CONTROL
+ ReturnComNotImplemented();
+#else /* VBOX_WITH_GUEST_CONTROL */
+
+ /* Validate flags. */
+ uint32_t fFlags = AdditionsUpdateFlag_None;
+ if (aFlags.size())
+ for (size_t i = 0; i < aFlags.size(); ++i)
+ fFlags |= aFlags[i];
+
+ if (fFlags && !(fFlags & AdditionsUpdateFlag_WaitForUpdateStartOnly))
+ return setError(E_INVALIDARG, tr("Unknown flags (%#x)"), fFlags);
+
+ int rc = VINF_SUCCESS;
+
+ ProcessArguments aArgs;
+ aArgs.resize(0);
+
+ if (aArguments.size())
+ {
+ try
+ {
+ for (size_t i = 0; i < aArguments.size(); ++i)
+ aArgs.push_back(aArguments[i]);
+ }
+ catch(std::bad_alloc &)
+ {
+ rc = VERR_NO_MEMORY;
+ }
+ }
+
+ HRESULT hr = S_OK;
+
+ /*
+ * Create an anonymous session. This is required to run the Guest Additions
+ * update process with administrative rights.
+ */
+ GuestSessionStartupInfo startupInfo;
+ startupInfo.mName = "Updating Guest Additions";
+
+ GuestCredentials guestCreds;
+ RT_ZERO(guestCreds);
+
+ ComObjPtr<GuestSession> pSession;
+ if (RT_SUCCESS(rc))
+ rc = i_sessionCreate(startupInfo, guestCreds, pSession);
+ if (RT_FAILURE(rc))
+ {
+ switch (rc)
+ {
+ case VERR_MAX_PROCS_REACHED:
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Maximum number of concurrent guest sessions (%ld) reached"),
+ VBOX_GUESTCTRL_MAX_SESSIONS);
+ break;
+
+ /** @todo Add more errors here. */
+
+ default:
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Could not create guest session: %Rrc"), rc);
+ break;
+ }
+ }
+ else
+ {
+ Assert(!pSession.isNull());
+ int guestRc;
+ rc = pSession->i_startSessionInternal(&guestRc);
+ if (RT_FAILURE(rc))
+ {
+ /** @todo Handle guestRc! */
+
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Could not open guest session: %Rrc"), rc);
+ }
+ else
+ {
+ try
+ {
+ ComObjPtr<Progress> pProgress;
+ SessionTaskUpdateAdditions *pTask = new SessionTaskUpdateAdditions(pSession /* GuestSession */,
+ aSource, aArgs, fFlags);
+ rc = pSession->i_startTaskAsync(tr("Updating Guest Additions"), pTask, pProgress);
+ if (RT_SUCCESS(rc))
+ {
+ /* Return progress to the caller. */
+ hr = pProgress.queryInterfaceTo(aProgress.asOutParam());
+ }
+ else
+ hr = setError(VBOX_E_IPRT_ERROR,
+ tr("Starting task for updating Guest Additions on the guest failed: %Rrc"), rc);
+ }
+ catch(std::bad_alloc &)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+ }
+ }
+ return hr;
+#endif /* VBOX_WITH_GUEST_CONTROL */
+}
+
diff --git a/src/VBox/Main/src-client/GuestCtrlPrivate.cpp b/src/VBox/Main/src-client/GuestCtrlPrivate.cpp
index 5d0e778..18fd212 100644
--- a/src/VBox/Main/src-client/GuestCtrlPrivate.cpp
+++ b/src/VBox/Main/src-client/GuestCtrlPrivate.cpp
@@ -1,11 +1,10 @@
/* $Id: GuestCtrlPrivate.cpp $ */
/** @file
- *
* Internal helpers/structures for guest control functionality.
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -19,6 +18,9 @@
/******************************************************************************
* Header Files *
******************************************************************************/
+#ifndef VBOX_WITH_GUEST_CONTROL
+# error "VBOX_WITH_GUEST_CONTROL must defined in this file"
+#endif
#include "GuestCtrlImplPrivate.h"
#include "GuestSessionImpl.h"
#include "VMMDev.h"
@@ -36,258 +38,7 @@
#define LOG_GROUP LOG_GROUP_GUEST_CONTROL
#include <VBox/log.h>
-/******************************************************************************
- * Structures and Typedefs *
- ******************************************************************************/
-
-int GuestEnvironment::BuildEnvironmentBlock(void **ppvEnv, size_t *pcbEnv, uint32_t *pcEnvVars)
-{
- AssertPtrReturn(ppvEnv, VERR_INVALID_POINTER);
- /* Rest is optional. */
-
- size_t cbEnv = 0;
- uint32_t cEnvVars = 0;
-
- int rc = VINF_SUCCESS;
-
- size_t cEnv = mEnvironment.size();
- if (cEnv)
- {
- std::map<Utf8Str, Utf8Str>::const_iterator itEnv = mEnvironment.begin();
- for (; itEnv != mEnvironment.end() && RT_SUCCESS(rc); itEnv++)
- {
- char *pszEnv;
- if (!RTStrAPrintf(&pszEnv, "%s=%s", itEnv->first.c_str(), itEnv->second.c_str()))
- {
- rc = VERR_NO_MEMORY;
- break;
- }
- AssertPtr(pszEnv);
- rc = appendToEnvBlock(pszEnv, ppvEnv, &cbEnv, &cEnvVars);
- RTStrFree(pszEnv);
- }
- Assert(cEnv == cEnvVars);
- }
-
- if (pcbEnv)
- *pcbEnv = cbEnv;
- if (pcEnvVars)
- *pcEnvVars = cEnvVars;
-
- return rc;
-}
-
-void GuestEnvironment::Clear(void)
-{
- mEnvironment.clear();
-}
-
-int GuestEnvironment::CopyFrom(const GuestEnvironmentArray &environment)
-{
- int rc = VINF_SUCCESS;
-
- for (GuestEnvironmentArray::const_iterator it = environment.begin();
- it != environment.end() && RT_SUCCESS(rc);
- ++it)
- {
- rc = Set((*it));
- }
-
- return rc;
-}
-
-int GuestEnvironment::CopyTo(GuestEnvironmentArray &environment)
-{
- size_t s = 0;
- for (std::map<Utf8Str, Utf8Str>::const_iterator it = mEnvironment.begin();
- it != mEnvironment.end();
- ++it, ++s)
- {
- environment[s] = Bstr(it->first + "=" + it->second).raw();
- }
-
- return VINF_SUCCESS;
-}
-
-/* static */
-void GuestEnvironment::FreeEnvironmentBlock(void *pvEnv)
-{
- if (pvEnv)
- RTMemFree(pvEnv);
-}
-
-Utf8Str GuestEnvironment::Get(size_t nPos)
-{
- size_t curPos = 0;
- std::map<Utf8Str, Utf8Str>::const_iterator it = mEnvironment.begin();
- for (; it != mEnvironment.end() && curPos < nPos;
- ++it, ++curPos) { }
-
- if (it != mEnvironment.end())
- return Utf8Str(it->first + "=" + it->second);
-
- return Utf8Str("");
-}
-
-Utf8Str GuestEnvironment::Get(const Utf8Str &strKey)
-{
- std::map <Utf8Str, Utf8Str>::const_iterator itEnv = mEnvironment.find(strKey);
- Utf8Str strRet;
- if (itEnv != mEnvironment.end())
- strRet = itEnv->second;
- return strRet;
-}
-
-bool GuestEnvironment::Has(const Utf8Str &strKey)
-{
- std::map <Utf8Str, Utf8Str>::const_iterator itEnv = mEnvironment.find(strKey);
- return (itEnv != mEnvironment.end());
-}
-
-int GuestEnvironment::Set(const Utf8Str &strKey, const Utf8Str &strValue)
-{
- /** @todo Do some validation using regex. */
- if (strKey.isEmpty())
- return VERR_INVALID_PARAMETER;
-
- int rc = VINF_SUCCESS;
- const char *pszString = strKey.c_str();
- while (*pszString != '\0' && RT_SUCCESS(rc))
- {
- if ( !RT_C_IS_ALNUM(*pszString)
- && !RT_C_IS_GRAPH(*pszString))
- rc = VERR_INVALID_PARAMETER;
- *pszString++;
- }
-
- if (RT_SUCCESS(rc))
- mEnvironment[strKey] = strValue;
-
- return rc;
-}
-
-int GuestEnvironment::Set(const Utf8Str &strPair)
-{
- RTCList<RTCString> listPair = strPair.split("=", RTCString::KeepEmptyParts);
- /* Skip completely empty pairs. Note that we still need pairs with a valid
- * (set) key and an empty value. */
- if (listPair.size() <= 1)
- return VINF_SUCCESS;
-
- int rc = VINF_SUCCESS;
- size_t p = 0;
- while (p < listPair.size() && RT_SUCCESS(rc))
- {
- Utf8Str strKey = listPair.at(p++);
- if ( strKey.isEmpty()
- || strKey.equals("=")) /* Skip pairs with empty keys (e.g. "=FOO"). */
- {
- break;
- }
- Utf8Str strValue;
- if (p < listPair.size()) /* Does the list also contain a value? */
- strValue = listPair.at(p++);
-
-#ifdef DEBUG
- LogFlowFunc(("strKey=%s, strValue=%s\n",
- strKey.c_str(), strValue.c_str()));
-#endif
- rc = Set(strKey, strValue);
- }
-
- return rc;
-}
-
-size_t GuestEnvironment::Size(void)
-{
- return mEnvironment.size();
-}
-
-int GuestEnvironment::Unset(const Utf8Str &strKey)
-{
- std::map <Utf8Str, Utf8Str>::iterator itEnv = mEnvironment.find(strKey);
- if (itEnv != mEnvironment.end())
- {
- mEnvironment.erase(itEnv);
- return VINF_SUCCESS;
- }
- return VERR_NOT_FOUND;
-}
-
-GuestEnvironment& GuestEnvironment::operator=(const GuestEnvironmentArray &that)
-{
- CopyFrom(that);
- return *this;
-}
-
-GuestEnvironment& GuestEnvironment::operator=(const GuestEnvironment &that)
-{
- for (std::map<Utf8Str, Utf8Str>::const_iterator it = that.mEnvironment.begin();
- it != that.mEnvironment.end();
- ++it)
- {
- mEnvironment[it->first] = it->second;
- }
-
- return *this;
-}
-
-/**
- * Appends environment variables to the environment block.
- *
- * Each var=value pair is separated by the null character ('\\0'). The whole
- * block will be stored in one blob and disassembled on the guest side later to
- * fit into the HGCM param structure.
- *
- * @returns VBox status code.
- *
- * @param pszEnvVar The environment variable=value to append to the
- * environment block.
- * @param ppvList This is actually a pointer to a char pointer
- * variable which keeps track of the environment block
- * that we're constructing.
- * @param pcbList Pointer to the variable holding the current size of
- * the environment block. (List is a misnomer, go
- * ahead a be confused.)
- * @param pcEnvVars Pointer to the variable holding count of variables
- * stored in the environment block.
- */
-int GuestEnvironment::appendToEnvBlock(const char *pszEnv, void **ppvList, size_t *pcbList, uint32_t *pcEnvVars)
-{
- int rc = VINF_SUCCESS;
- size_t cchEnv = strlen(pszEnv); Assert(cchEnv >= 2);
- if (*ppvList)
- {
- size_t cbNewLen = *pcbList + cchEnv + 1; /* Include zero termination. */
- char *pvTmp = (char *)RTMemRealloc(*ppvList, cbNewLen);
- if (pvTmp == NULL)
- rc = VERR_NO_MEMORY;
- else
- {
- memcpy(pvTmp + *pcbList, pszEnv, cchEnv);
- pvTmp[cbNewLen - 1] = '\0'; /* Add zero termination. */
- *ppvList = (void **)pvTmp;
- }
- }
- else
- {
- char *pszTmp;
- if (RTStrAPrintf(&pszTmp, "%s", pszEnv) >= 0)
- {
- *ppvList = (void **)pszTmp;
- /* Reset counters. */
- *pcEnvVars = 0;
- *pcbList = 0;
- }
- }
- if (RT_SUCCESS(rc))
- {
- *pcbList += cchEnv + 1; /* Include zero termination. */
- *pcEnvVars += 1; /* Increase env variable count. */
- }
- return rc;
-}
int GuestFsObjData::FromLs(const GuestProcessStreamBlock &strmBlk)
{
@@ -311,7 +62,7 @@ int GuestFsObjData::FromLs(const GuestProcessStreamBlock &strmBlk)
mType = FsObjType_Directory;
/** @todo Add more types! */
else
- mType = FsObjType_Undefined;
+ mType = FsObjType_Unknown;
/* Object size. */
rc = strmBlk.GetInt64Ex("st_size", &mObjectSize);
if (RT_FAILURE(rc)) throw rc;
@@ -377,7 +128,7 @@ int GuestFsObjData::FromStat(const GuestProcessStreamBlock &strmBlk)
mType = FsObjType_Directory;
/** @todo Add more types! */
else
- mType = FsObjType_Undefined;
+ mType = FsObjType_Unknown;
/* Object size. */
rc = strmBlk.GetInt64Ex("st_size", &mObjectSize);
if (RT_FAILURE(rc)) throw rc;
diff --git a/src/VBox/Main/src-client/GuestDirectoryImpl.cpp b/src/VBox/Main/src-client/GuestDirectoryImpl.cpp
index 17039ca..9db7f3a 100644
--- a/src/VBox/Main/src-client/GuestDirectoryImpl.cpp
+++ b/src/VBox/Main/src-client/GuestDirectoryImpl.cpp
@@ -1,11 +1,10 @@
-
/* $Id: GuestDirectoryImpl.cpp $ */
/** @file
* VirtualBox Main - Guest directory handling.
*/
/*
- * Copyright (C) 2012-2013 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -20,6 +19,9 @@
/*******************************************************************************
* Header Files *
*******************************************************************************/
+#ifndef VBOX_WITH_GUEST_CONTROL
+# error "VBOX_WITH_GUEST_CONTROL must defined in this file"
+#endif
#include "GuestDirectoryImpl.h"
#include "GuestSessionImpl.h"
#include "GuestCtrlImplPrivate.h"
@@ -72,10 +74,6 @@ int GuestDirectory::init(Console *pConsole, GuestSession *pSession,
AutoInitSpan autoInitSpan(this);
AssertReturn(autoInitSpan.isOk(), E_FAIL);
-#ifndef VBOX_WITH_GUEST_CONTROL
- autoInitSpan.setSucceeded();
- return VINF_SUCCESS;
-#else
int vrc = bindToSession(pConsole, pSession, uDirID /* Object ID */);
if (RT_SUCCESS(vrc))
{
@@ -90,7 +88,7 @@ int GuestDirectory::init(Console *pConsole, GuestSession *pSession,
/* Start the directory process on the guest. */
GuestProcessStartupInfo procInfo;
procInfo.mName = Utf8StrFmt(tr("Reading directory \"%s\""), openInfo.mPath.c_str());
- procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_LS);
+ procInfo.mExecutable= Utf8Str(VBOXSERVICE_TOOL_LS);
procInfo.mTimeoutMS = 5 * 60 * 1000; /* 5 minutes timeout. */
procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
@@ -123,7 +121,6 @@ int GuestDirectory::init(Console *pConsole, GuestSession *pSession,
autoInitSpan.setFailed();
return vrc;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
/**
@@ -264,9 +261,6 @@ HRESULT GuestDirectory::i_setErrorExternal(VirtualBoxBase *pInterface, int guest
/////////////////////////////////////////////////////////////////////////////
HRESULT GuestDirectory::close()
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoCaller autoCaller(this);
@@ -304,14 +298,10 @@ HRESULT GuestDirectory::close()
LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestDirectory::read(ComPtr<IFsObjInfo> &aObjInfo)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoCaller autoCaller(this);
@@ -406,6 +396,5 @@ HRESULT GuestDirectory::read(ComPtr<IFsObjInfo> &aObjInfo)
LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
diff --git a/src/VBox/Main/src-client/GuestDnDPrivate.cpp b/src/VBox/Main/src-client/GuestDnDPrivate.cpp
index a459096..d9499a4 100644
--- a/src/VBox/Main/src-client/GuestDnDPrivate.cpp
+++ b/src/VBox/Main/src-client/GuestDnDPrivate.cpp
@@ -5,7 +5,7 @@
*/
/*
- * Copyright (C) 2011-2014 Oracle Corporation
+ * Copyright (C) 2011-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -36,6 +36,7 @@
# include <VBox/GuestHost/DragAndDrop.h>
# include <VBox/HostServices/DragAndDropSvc.h>
+# include <VBox/version.h>
# ifdef LOG_GROUP
# undef LOG_GROUP
@@ -158,19 +159,45 @@
* (both in the host and the guest).
*/
+GuestDnDCallbackEvent::~GuestDnDCallbackEvent(void)
+{
+ if (NIL_RTSEMEVENT != mSemEvent)
+ RTSemEventDestroy(mSemEvent);
+}
+
+int GuestDnDCallbackEvent::Reset(void)
+{
+ int rc = VINF_SUCCESS;
+
+ if (NIL_RTSEMEVENT == mSemEvent)
+ rc = RTSemEventCreate(&mSemEvent);
+
+ mRc = VINF_SUCCESS;
+ return rc;
+}
+
+int GuestDnDCallbackEvent::Notify(int rc)
+{
+ mRc = rc;
+ return RTSemEventSignal(mSemEvent);
+}
+
+int GuestDnDCallbackEvent::Wait(RTMSINTERVAL msTimeout)
+{
+ return RTSemEventWait(mSemEvent, msTimeout);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
GuestDnDResponse::GuestDnDResponse(const ComObjPtr<Guest>& pGuest)
: m_EventSem(NIL_RTSEMEVENT)
, m_defAction(0)
, m_allActions(0)
- , m_pvData(0)
- , m_cbData(0)
- , m_cbDataCurrent(0)
- , m_cbDataTotal(0)
- , m_hFile(NIL_RTFILE)
, m_parent(pGuest)
{
int rc = RTSemEventCreate(&m_EventSem);
- AssertRC(rc);
+ if (RT_FAILURE(rc))
+ throw rc;
}
GuestDnDResponse::~GuestDnDResponse(void)
@@ -181,32 +208,6 @@ GuestDnDResponse::~GuestDnDResponse(void)
AssertRC(rc);
}
-int GuestDnDResponse::dataAdd(const void *pvData, uint32_t cbData,
- uint32_t *pcbCurSize)
-{
- AssertPtrReturn(pvData, VERR_INVALID_POINTER);
- AssertReturn(cbData, VERR_INVALID_PARAMETER);
- /* pcbCurSize is optional. */
-
- int rc = VINF_SUCCESS;
-
- /** @todo Make reallocation scheme a bit smarter here. */
- m_pvData = RTMemRealloc(m_pvData, m_cbData + cbData);
- if (m_pvData)
- {
- memcpy(&static_cast<uint8_t*>(m_pvData)[m_cbData],
- pvData, cbData);
- m_cbData += cbData;
-
- if (pcbCurSize)
- *pcbCurSize = m_cbData;
- }
- else
- rc = VERR_NO_MEMORY;
-
- return rc;
-}
-
/* static */
Utf8Str GuestDnDResponse::errorToString(const ComObjPtr<Guest>& pGuest, int guestRc)
{
@@ -241,7 +242,7 @@ Utf8Str GuestDnDResponse::errorToString(const ComObjPtr<Guest>& pGuest, int gues
return strError;
}
-int GuestDnDResponse::notifyAboutGuestResponse(void)
+int GuestDnDResponse::notifyAboutGuestResponse(void) const
{
return RTSemEventSignal(m_EventSem);
}
@@ -250,190 +251,265 @@ void GuestDnDResponse::reset(void)
{
LogFlowThisFuncEnter();
- m_defAction = 0;
+ m_defAction = 0;
m_allActions = 0;
- m_strDropDir = "";
- m_strFormat = "";
+ m_strFormat = "";
+}
+
+HRESULT GuestDnDResponse::resetProgress(const ComObjPtr<Guest>& pParent)
+{
+ m_progress.setNull();
- if (m_pvData)
+ HRESULT hr = m_progress.createObject();
+ if (SUCCEEDED(hr))
{
- RTMemFree(m_pvData);
- m_pvData = NULL;
+ hr = m_progress->init(static_cast<IGuest *>(pParent),
+ Bstr(pParent->tr("Dropping data")).raw(),
+ TRUE /* aCancelable */);
}
- m_cbData = 0;
- m_cbDataCurrent = 0;
- m_cbDataTotal = 0;
- if (m_hFile != NIL_RTFILE)
+ return hr;
+}
+
+bool GuestDnDResponse::isProgressCanceled(void) const
+{
+ BOOL fCanceled;
+ if (!m_progress.isNull())
{
- RTFileClose(m_hFile);
- m_hFile = NIL_RTFILE;
+ HRESULT hr = m_progress->COMGETTER(Canceled)(&fCanceled);
+ AssertComRC(hr);
}
- m_strFile = "";
+ else
+ fCanceled = TRUE;
+
+ return RT_BOOL(fCanceled);
}
-HRESULT GuestDnDResponse::resetProgress(const ComObjPtr<Guest>& pParent)
+int GuestDnDResponse::setCallback(uint32_t uMsg, PFNGUESTDNDCALLBACK pfnCallback, void *pvUser /* = NULL */)
{
- m_progress.setNull();
- HRESULT rc = m_progress.createObject();
- if (SUCCEEDED(rc))
+ GuestDnDCallbackMap::iterator it = m_mapCallbacks.find(uMsg);
+
+ /* Add. */
+ if (pfnCallback)
{
- rc = m_progress->init(static_cast<IGuest*>(pParent),
- Bstr(pParent->tr("Dropping data")).raw(),
- FALSE /* fCancelable */);
+ if (it == m_mapCallbacks.end())
+ {
+ m_mapCallbacks[uMsg] = GuestDnDCallback(pfnCallback, uMsg, pvUser);
+ return VINF_SUCCESS;
+ }
+
+ AssertMsgFailed(("Callback for message %RU32 already registered\n", uMsg));
+ return VERR_ALREADY_EXISTS;
}
- return rc;
+
+ /* Remove. */
+ if (it != m_mapCallbacks.end())
+ m_mapCallbacks.erase(it);
+
+ return VINF_SUCCESS;
}
int GuestDnDResponse::setProgress(unsigned uPercentage,
- uint32_t uState, int rcOp /* = VINF_SUCCESS */)
+ uint32_t uStatus, int rcOp /* = VINF_SUCCESS */)
{
- LogFlowFunc(("uPercentage=%RU32, uState=%RU32, rcOp=%Rrc\n",
- uPercentage, uState, rcOp));
+ LogFlowFunc(("uStatus=%RU32, uPercentage=%RU32, rcOp=%Rrc\n",
+ uStatus, uPercentage, rcOp));
- int vrc = VINF_SUCCESS;
+ int rc = VINF_SUCCESS;
if (!m_progress.isNull())
{
BOOL fCompleted;
HRESULT hr = m_progress->COMGETTER(Completed)(&fCompleted);
+ AssertComRC(hr);
+
+ BOOL fCanceled;
+ hr = m_progress->COMGETTER(Canceled)(&fCanceled);
+ AssertComRC(hr);
+
+ LogFlowFunc(("Current: fCompleted=%RTbool, fCanceled=%RTbool\n", fCompleted, fCanceled));
+
if (!fCompleted)
{
- if (uState == DragAndDropSvc::DND_PROGRESS_ERROR)
+ switch (uStatus)
{
- hr = m_progress->i_notifyComplete(VBOX_E_IPRT_ERROR,
- COM_IIDOF(IGuest),
- m_parent->getComponentName(),
- GuestDnDResponse::errorToString(m_parent, rcOp).c_str());
- reset();
- }
- else if (uState == DragAndDropSvc::DND_PROGRESS_CANCELLED)
- {
- hr = m_progress->Cancel();
- if (SUCCEEDED(hr))
- vrc = VERR_CANCELLED;
-
- reset();
- }
- else /* uState == DragAndDropSvc::DND_PROGRESS_RUNNING */
- {
- hr = m_progress->SetCurrentOperationProgress(uPercentage);
- AssertComRC(hr);
- if ( uState == DragAndDropSvc::DND_PROGRESS_COMPLETE
- || uPercentage >= 100)
+ case DragAndDropSvc::DND_PROGRESS_ERROR:
+ {
+ hr = m_progress->i_notifyComplete(VBOX_E_IPRT_ERROR,
+ COM_IIDOF(IGuest),
+ m_parent->getComponentName(),
+ GuestDnDResponse::errorToString(m_parent, rcOp).c_str());
+ reset();
+ break;
+ }
+
+ case DragAndDropSvc::DND_PROGRESS_CANCELLED:
+ {
hr = m_progress->i_notifyComplete(S_OK);
+ AssertComRC(hr);
+
+ reset();
+ break;
+ }
+
+ case DragAndDropSvc::DND_PROGRESS_RUNNING:
+ case DragAndDropSvc::DND_PROGRESS_COMPLETE:
+ {
+ if (!fCanceled)
+ {
+ hr = m_progress->SetCurrentOperationProgress(uPercentage);
+ AssertComRC(hr);
+ if ( uStatus == DragAndDropSvc::DND_PROGRESS_COMPLETE
+ || uPercentage >= 100)
+ {
+ hr = m_progress->i_notifyComplete(S_OK);
+ AssertComRC(hr);
+ }
+ }
+ break;
+ }
+
+ default:
+ break;
}
}
+
+ hr = m_progress->COMGETTER(Completed)(&fCompleted);
+ AssertComRC(hr);
+ hr = m_progress->COMGETTER(Canceled)(&fCanceled);
+ AssertComRC(hr);
+
+ LogFlowFunc(("New: fCompleted=%RTbool, fCanceled=%RTbool\n", fCompleted, fCanceled));
}
- return vrc;
+ LogFlowFuncLeaveRC(rc);
+ return rc;
}
-int GuestDnDResponse::dataSetStatus(size_t cbDataAdd, size_t cbDataTotal /* = 0 */)
+int GuestDnDResponse::onDispatch(uint32_t u32Function, void *pvParms, uint32_t cbParms)
{
- if (cbDataTotal)
- {
-#ifndef DEBUG_andy
- AssertMsg(m_cbDataTotal <= cbDataTotal, ("New data size must not be smaller (%zu) than old value (%zu)\n",
- cbDataTotal, m_cbDataTotal));
-#endif
- LogFlowFunc(("Updating total data size from %zu to %zu\n", m_cbDataTotal, cbDataTotal));
- m_cbDataTotal = cbDataTotal;
- }
- AssertMsg(m_cbDataTotal, ("m_cbDataTotal must not be <= 0\n"));
+ LogFlowFunc(("u32Function=%RU32, pvParms=%p, cbParms=%RU32\n", u32Function, pvParms, cbParms));
- m_cbDataCurrent += cbDataAdd;
- unsigned int cPercentage = RT_MIN(m_cbDataCurrent * 100.0 / m_cbDataTotal, 100);
+ int rc = VERR_WRONG_ORDER; /* Play safe. */
+ bool fTryCallbacks = false;
- /** @todo Don't use anonymous enums (uint32_t). */
- uint32_t uStatus = DragAndDropSvc::DND_PROGRESS_RUNNING;
- if (m_cbDataCurrent >= m_cbDataTotal)
- uStatus = DragAndDropSvc::DND_PROGRESS_COMPLETE;
+ switch (u32Function)
+ {
+ case DragAndDropSvc::GUEST_DND_HG_ACK_OP:
+ {
+ DragAndDropSvc::PVBOXDNDCBHGACKOPDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBHGACKOPDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGACKOPDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_ACK_OP == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
-#ifdef DEBUG_andy
- LogFlowFunc(("Updating transfer status (%zu/%zu), status=%ld\n",
- m_cbDataCurrent, m_cbDataTotal, uStatus));
-#else
- AssertMsg(m_cbDataCurrent <= m_cbDataTotal,
- ("More data transferred (%zu) than initially announced (%zu), cbDataAdd=%zu\n",
- m_cbDataCurrent, m_cbDataTotal, cbDataAdd));
-#endif
- int rc = setProgress(cPercentage, uStatus);
+ setDefAction(pCBData->uAction);
+ rc = notifyAboutGuestResponse();
+ break;
+ }
- /** @todo For now we instantly confirm the cancel. Check if the
- * guest should first clean up stuff itself and than really confirm
- * the cancel request by an extra message. */
- if (rc == VERR_CANCELLED)
- rc = setProgress(100, DragAndDropSvc::DND_PROGRESS_CANCELLED);
+ case DragAndDropSvc::GUEST_DND_HG_REQ_DATA:
+ {
+ DragAndDropSvc::PVBOXDNDCBHGREQDATADATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBHGREQDATADATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGREQDATADATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_REQ_DATA == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
- LogFlowFuncLeaveRC(rc);
- return rc;
-}
+ if ( pCBData->cbFormat == 0
+ || pCBData->cbFormat > _64K)
+ {
+ rc = VERR_INVALID_PARAMETER;
+ }
+ else
+ {
+ setFormat(pCBData->pszFormat);
-HRESULT GuestDnDResponse::queryProgressTo(IProgress **ppProgress)
-{
- return m_progress.queryInterfaceTo(ppProgress);
-}
+ rc = VINF_SUCCESS;
+ }
-int GuestDnDResponse::waitForGuestResponse(RTMSINTERVAL msTimeout /*= 500 */)
-{
- int rc = RTSemEventWait(m_EventSem, msTimeout);
-#ifdef DEBUG_andy
- LogFlowFunc(("msTimeout=%RU32, rc=%Rrc\n", msTimeout, rc));
-#endif
- return rc;
-}
+ int rc2 = notifyAboutGuestResponse();
+ if (RT_SUCCESS(rc))
+ rc = rc2;
+ break;
+ }
-int GuestDnDResponse::writeToFile(const char *pszPath, size_t cbPath,
- void *pvData, size_t cbData, uint32_t fMode)
-{
- /** @todo Support locking more than one file at a time! We
- * might want to have a table in DnDGuestImpl which
- * keeps those file pointers around, or extend the
- * actual protocol for explicit open calls.
- *
- * For now we only keep one file open at a time, so if
- * a client does alternating writes to different files
- * this function will close the old and re-open the new
- * file on every call. */
- int rc;
- if ( m_hFile == NIL_RTFILE
- || m_strFile != pszPath)
- {
- char *pszFile = RTPathJoinA(m_strDropDir.c_str(), pszPath);
- if (pszFile)
+ case DragAndDropSvc::GUEST_DND_HG_EVT_PROGRESS:
{
- RTFILE hFile;
- /** @todo Respect fMode! */
- rc = RTFileOpen(&hFile, pszFile,
- RTFILE_O_OPEN_CREATE | RTFILE_O_DENY_WRITE
- | RTFILE_O_WRITE | RTFILE_O_APPEND);
+ DragAndDropSvc::PVBOXDNDCBHGEVTPROGRESSDATA pCBData =
+ reinterpret_cast<DragAndDropSvc::PVBOXDNDCBHGEVTPROGRESSDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGEVTPROGRESSDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_EVT_PROGRESS == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ rc = setProgress(pCBData->uPercentage, pCBData->uStatus, pCBData->rc);
if (RT_SUCCESS(rc))
+ rc = notifyAboutGuestResponse();
+ break;
+ }
+#ifdef VBOX_WITH_DRAG_AND_DROP_GH
+ case DragAndDropSvc::GUEST_DND_GH_ACK_PENDING:
+ {
+ DragAndDropSvc::PVBOXDNDCBGHACKPENDINGDATA pCBData =
+ reinterpret_cast<DragAndDropSvc::PVBOXDNDCBGHACKPENDINGDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBGHACKPENDINGDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_ACK_PENDING == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ if ( pCBData->cbFormat == 0
+ || pCBData->cbFormat > _64K)
+ {
+ rc = VERR_INVALID_PARAMETER;
+ }
+ else
{
- LogFlowFunc(("Opening \"%s\" (fMode=0x%x) for writing ...\n",
- pszFile, fMode));
+ setFormat (pCBData->pszFormat);
+ setDefAction (pCBData->uDefAction);
+ setAllActions(pCBData->uAllActions);
- m_hFile = hFile;
- m_strFile = pszPath;
+ rc = VINF_SUCCESS;
}
- RTStrFree(pszFile);
+ int rc2 = notifyAboutGuestResponse();
+ if (RT_SUCCESS(rc))
+ rc = rc2;
+ break;
+ }
+#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
+ default:
+ /* * Try if the event is covered by a registered callback. */
+ fTryCallbacks = true;
+ break;
+ }
+
+ /*
+ * Try the host's installed callbacks (if any).
+ */
+ if (fTryCallbacks)
+ {
+ GuestDnDCallbackMap::const_iterator it = m_mapCallbacks.find(u32Function);
+ if (it != m_mapCallbacks.end())
+ {
+ AssertPtr(it->second.pfnCallback);
+ rc = it->second.pfnCallback(u32Function, pvParms, cbParms, it->second.pvUser);
}
else
- rc = VERR_NO_MEMORY;
+ rc = VERR_NO_DATA; /* Tell the guest. */
}
- else
- rc = VINF_SUCCESS;
- if (RT_SUCCESS(rc))
- {
- rc = RTFileWrite(m_hFile, pvData, cbData,
- NULL /* No partial writes */);
+ LogFlowFunc(("Returning rc=%Rrc\n", rc));
+ return rc;
+}
- if (RT_SUCCESS(rc))
- rc = dataSetStatus(cbData);
- }
+HRESULT GuestDnDResponse::queryProgressTo(IProgress **ppProgress)
+{
+ return m_progress.queryInterfaceTo(ppProgress);
+}
+int GuestDnDResponse::waitForGuestResponse(RTMSINTERVAL msTimeout /*= 500 */) const
+{
+ int rc = RTSemEventWait(m_EventSem, msTimeout);
+#ifdef DEBUG_andy
+ LogFlowFunc(("msTimeout=%RU32, rc=%Rrc\n", msTimeout, rc));
+#endif
return rc;
}
@@ -506,14 +582,33 @@ int GuestDnD::hostCall(uint32_t u32Function, uint32_t cParms, PVBOXHGCMSVCPARM p
if (!pVMMDev)
return VERR_COM_OBJECT_NOT_FOUND;
- int rc = pVMMDev->hgcmHostCall("VBoxDragAndDropSvc", u32Function,
- cParms, paParms);
- LogFlowFunc(("uMsg=%RU32, cParms=%RU32, rc=%Rrc\n",
- u32Function, cParms, rc));
+ int rc = pVMMDev->hgcmHostCall("VBoxDragAndDropSvc", u32Function, cParms, paParms);
+ LogFlowFunc(("uMsg=%RU32, cParms=%RU32, rc=%Rrc\n", u32Function, cParms, rc));
return rc;
}
/* static */
+DECLCALLBACK(int) GuestDnD::notifyDnDDispatcher(void *pvExtension, uint32_t u32Function,
+ void *pvParms, uint32_t cbParms)
+{
+ LogFlowFunc(("pvExtension=%p, u32Function=%RU32, pvParms=%p, cbParms=%RU32\n",
+ pvExtension, u32Function, pvParms, cbParms));
+
+ GuestDnD *pGuestDnD = reinterpret_cast<GuestDnD*>(pvExtension);
+ AssertPtrReturn(pGuestDnD, VERR_INVALID_POINTER);
+
+ /** @todo In case we need to handle multiple guest DnD responses at a time this
+ * would be the place to lookup and dispatch to those. For the moment we
+ * only have one response -- simple. */
+ GuestDnDResponse *pResp = pGuestDnD->m_pResponse;
+ if (pResp)
+ return pResp->onDispatch(u32Function, pvParms, cbParms);
+
+ return VERR_NOT_SUPPORTED;
+}
+
+
+/* static */
com::Utf8Str GuestDnD::toFormatString(const std::vector<com::Utf8Str> &lstSupportedFormats,
const std::vector<com::Utf8Str> &lstFormats)
{
@@ -636,246 +731,199 @@ void GuestDnD::toMainActions(uint32_t uActions,
vecActions.push_back(lstActions.at(i));
}
-/* static */
-DECLCALLBACK(int) GuestDnD::notifyDnDDispatcher(void *pvExtension, uint32_t u32Function,
- void *pvParms, uint32_t cbParms)
-{
- LogFlowFunc(("pvExtension=%p, u32Function=%RU32, pvParms=%p, cbParms=%RU32\n",
- pvExtension, u32Function, pvParms, cbParms));
-
- GuestDnD *pGuestDnD = reinterpret_cast<GuestDnD*>(pvExtension);
- AssertPtrReturn(pGuestDnD, VERR_INVALID_POINTER);
-
- GuestDnDResponse *pResp = pGuestDnD->m_pResponse;
- AssertPtrReturn(pResp, VERR_INVALID_POINTER);
-
- int rc;
- switch (u32Function)
- {
- case DragAndDropSvc::GUEST_DND_HG_ACK_OP:
- {
- DragAndDropSvc::PVBOXDNDCBHGACKOPDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBHGACKOPDATA>(pvParms);
- AssertPtr(pCBData);
- AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGACKOPDATA) == cbParms, VERR_INVALID_PARAMETER);
- AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_ACK_OP == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
-
- pResp->setDefAction(pCBData->uAction);
-
- rc = pResp->notifyAboutGuestResponse();
- break;
- }
-
- case DragAndDropSvc::GUEST_DND_HG_REQ_DATA:
- {
- DragAndDropSvc::PVBOXDNDCBHGREQDATADATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBHGREQDATADATA>(pvParms);
- AssertPtr(pCBData);
- AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGREQDATADATA) == cbParms, VERR_INVALID_PARAMETER);
- AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_REQ_DATA == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
-
- pResp->setFormat(pCBData->pszFormat);
-
- rc = pResp->notifyAboutGuestResponse();
- break;
- }
-
- case DragAndDropSvc::GUEST_DND_HG_EVT_PROGRESS:
- {
- DragAndDropSvc::PVBOXDNDCBHGEVTPROGRESSDATA pCBData =
- reinterpret_cast <DragAndDropSvc::PVBOXDNDCBHGEVTPROGRESSDATA>(pvParms);
- AssertPtr(pCBData);
- AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGEVTPROGRESSDATA) == cbParms, VERR_INVALID_PARAMETER);
- AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_EVT_PROGRESS == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
-
- rc = pResp->setProgress(pCBData->uPercentage, pCBData->uState, pCBData->rc);
- break;
- }
-
-# ifdef VBOX_WITH_DRAG_AND_DROP_GH
- case DragAndDropSvc::GUEST_DND_GH_ACK_PENDING:
- {
- DragAndDropSvc::PVBOXDNDCBGHACKPENDINGDATA pCBData =
- reinterpret_cast <DragAndDropSvc::PVBOXDNDCBGHACKPENDINGDATA>(pvParms);
- AssertPtr(pCBData);
- AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBGHACKPENDINGDATA) == cbParms, VERR_INVALID_PARAMETER);
- AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_ACK_PENDING == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
-
- pResp->setFormat(pCBData->pszFormat);
- pResp->setDefAction(pCBData->uDefAction);
- pResp->setAllActions(pCBData->uAllActions);
-
- rc = pResp->notifyAboutGuestResponse();
- break;
- }
-
- case DragAndDropSvc::GUEST_DND_GH_SND_DATA:
- {
- DragAndDropSvc::PVBOXDNDCBSNDDATADATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBSNDDATADATA>(pvParms);
- AssertPtr(pCBData);
- AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBSNDDATADATA) == cbParms, VERR_INVALID_PARAMETER);
- AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_SND_DATA == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+///////////////////////////////////////////////////////////////////////////////
- rc = pGuestDnD->onGHSendData(pResp, pCBData->pvData, pCBData->cbData,
- pCBData->cbTotalSize);
- break;
- }
+GuestDnDBase::GuestDnDBase(void)
+{
+ mDataBase.mfTransferIsPending = false;
- case DragAndDropSvc::GUEST_DND_GH_SND_DIR:
- {
- DragAndDropSvc::PVBOXDNDCBSNDDIRDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBSNDDIRDATA>(pvParms);
- AssertPtr(pCBData);
- AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBSNDDIRDATA) == cbParms, VERR_INVALID_PARAMETER);
- AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_SND_DIR == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+ /*
+ * Initialize public attributes.
+ */
+ m_strFormats = GuestDnDInst()->defaultFormats();
+}
- rc = pGuestDnD->onGHSendDir(pResp, pCBData->pszPath, pCBData->cbPath, pCBData->fMode);
- break;
- }
+HRESULT GuestDnDBase::i_isFormatSupported(const com::Utf8Str &aFormat, BOOL *aSupported)
+{
+ *aSupported = std::find(m_strFormats.begin(),
+ m_strFormats.end(), aFormat) != m_strFormats.end()
+ ? TRUE : FALSE;
+ return S_OK;
+}
- case DragAndDropSvc::GUEST_DND_GH_SND_FILE:
- {
- DragAndDropSvc::PVBOXDNDCBSNDFILEDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBSNDFILEDATA>(pvParms);
- AssertPtr(pCBData);
- AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBSNDFILEDATA) == cbParms, VERR_INVALID_PARAMETER);
- AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_SND_FILE == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+HRESULT GuestDnDBase::i_getFormats(std::vector<com::Utf8Str> &aFormats)
+{
+ aFormats = m_strFormats;
- rc = pGuestDnD->onGHSendFile(pResp, pCBData->pszFilePath, pCBData->cbFilePath,
- pCBData->pvData, pCBData->cbData, pCBData->fMode);
- break;
- }
+ return S_OK;
+}
- case DragAndDropSvc::GUEST_DND_GH_EVT_ERROR:
+HRESULT GuestDnDBase::i_addFormats(const std::vector<com::Utf8Str> &aFormats)
+{
+ for (size_t i = 0; i < aFormats.size(); ++i)
+ {
+ Utf8Str strFormat = aFormats.at(i);
+ if (std::find(m_strFormats.begin(),
+ m_strFormats.end(), strFormat) == m_strFormats.end())
{
- DragAndDropSvc::PVBOXDNDCBEVTERRORDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBEVTERRORDATA>(pvParms);
- AssertPtr(pCBData);
- AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBEVTERRORDATA) == cbParms, VERR_INVALID_PARAMETER);
- AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_EVT_ERROR == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
-
- /* Cleanup. */
- pResp->reset();
- rc = pResp->setProgress(100, DragAndDropSvc::DND_PROGRESS_ERROR, pCBData->rc);
- break;
+ m_strFormats.push_back(strFormat);
}
-# endif /* VBOX_WITH_DRAG_AND_DROP_GH */
- default:
- rc = VERR_NOT_SUPPORTED; /* Tell the guest. */
- break;
}
- LogFlowFunc(("Returning rc=%Rrc\n", rc));
- return rc;
+ return S_OK;
}
-# ifdef VBOX_WITH_DRAG_AND_DROP_GH
-int GuestDnD::onGHSendData(GuestDnDResponse *pResp,
- const void *pvData, size_t cbData, size_t cbTotalSize)
+HRESULT GuestDnDBase::i_removeFormats(const std::vector<com::Utf8Str> &aFormats)
{
- AssertPtrReturn(pResp, VERR_INVALID_POINTER);
- AssertPtrReturn(pvData, VERR_INVALID_POINTER);
- AssertReturn(cbData, VERR_INVALID_PARAMETER);
- AssertReturn(cbTotalSize, VERR_INVALID_PARAMETER);
-
- int rc = pResp->dataAdd(pvData, cbData, NULL /* Current size */);
- if (RT_SUCCESS(rc))
- rc = pResp->dataSetStatus(cbData, cbTotalSize);
+ for (size_t i = 0; i < aFormats.size(); ++i)
+ {
+ Utf8Str strFormat = aFormats.at(i);
+ std::vector<com::Utf8Str>::iterator itFormat = std::find(m_strFormats.begin(),
+ m_strFormats.end(), strFormat);
+ if (itFormat != m_strFormats.end())
+ m_strFormats.erase(itFormat);
+ }
- LogFlowFuncLeaveRC(rc);
- return rc;
+ return S_OK;
}
-int GuestDnD::onGHSendDir(GuestDnDResponse *pResp,
- const char *pszPath, size_t cbPath, uint32_t fMode)
+HRESULT GuestDnDBase::i_getProtocolVersion(ULONG *puVersion)
{
- AssertPtrReturn(pResp, VERR_INVALID_POINTER);
- AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
- AssertReturn(cbPath, VERR_INVALID_PARAMETER);
+ int rc = getProtocolVersion((uint32_t *)puVersion);
+ return RT_SUCCESS(rc) ? S_OK : E_FAIL;
+}
- LogFlowFunc(("pszPath=%s, cbPath=%zu, fMode=0x%x\n",
- pszPath, cbPath, fMode));
+int GuestDnDBase::getProtocolVersion(uint32_t *puVersion)
+{
+ AssertPtrReturn(puVersion, VERR_INVALID_POINTER);
int rc;
- char *pszDir = RTPathJoinA(pResp->dropDir().c_str(), pszPath);
- if (pszDir)
+
+ uint32_t uVer, uVerAdditions = 0;
+ if ( m_pGuest
+ && (uVerAdditions = m_pGuest->i_getAdditionsVersion()) > 0)
{
- rc = RTDirCreateFullPath(pszDir, fMode);
- RTStrFree(pszDir);
+ uint32_t uVBoxMajor = VBOX_FULL_VERSION_GET_MAJOR(uVerAdditions);
+ uint32_t uVBoxMinor = VBOX_FULL_VERSION_GET_MINOR(uVerAdditions);
+
+#if 0 /*def DEBUG_andy*/
+ /* Hardcode the to-used protocol version; nice for testing side effects. */
+ uVer = 2;
+#else
+ uVer = ( uVBoxMajor >= 5)
+ ? 2 /* VBox 5.0 and up: Protocol version 2. */
+ : 1; /* VBox <= 4.3: Protocol version 1. */
+ /* Build revision is ignored. */
+#endif
+
+ LogFlowThisFunc(("uVerAdditions=%RU32 (%RU32.%RU32)\n", uVerAdditions, uVBoxMajor, uVBoxMinor));
+ rc = VINF_SUCCESS;
}
else
- rc = VERR_NO_MEMORY;
+ {
+ uVer = 1; /* Fallback. */
+ rc = VERR_NOT_FOUND;
+ }
- if (RT_SUCCESS(rc))
- rc = pResp->dataSetStatus(cbPath);
+ LogFlowThisFunc(("uVer=%RU32, uVerAdditions=%RU32, rc=%Rrc\n", uVer, uVerAdditions, rc));
- LogFlowFuncLeaveRC(rc);
+ *puVersion = uVer;
return rc;
}
-int GuestDnD::onGHSendFile(GuestDnDResponse *pResp,
- const char *pszPath, size_t cbPath,
- void *pvData, size_t cbData, uint32_t fMode)
+int GuestDnDBase::msgQueueAdd(GuestDnDMsg *pMsg)
{
- AssertPtrReturn(pResp, VERR_INVALID_POINTER);
- AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
- AssertReturn(cbPath, VERR_INVALID_PARAMETER);
-
- LogFlowFunc(("pszPath=%s, cbPath=%zu, fMode=0x%x\n",
- pszPath, cbPath, fMode));
-
- int rc = pResp->writeToFile(pszPath, cbPath,
- pvData, cbData, fMode);
- LogFlowFuncLeaveRC(rc);
- return rc;
+ mDataBase.mListOutgoing.push_back(pMsg);
+ return VINF_SUCCESS;
}
-# endif /* VBOX_WITH_DRAG_AND_DROP_GH */
-///////////////////////////////////////////////////////////////////////////////
-
-GuestDnDBase::GuestDnDBase(void)
+GuestDnDMsg *GuestDnDBase::msgQueueGetNext(void)
{
- m_strFormats = GuestDnDInst()->defaultFormats();
+ if (mDataBase.mListOutgoing.empty())
+ return NULL;
+ return mDataBase.mListOutgoing.front();
}
-HRESULT GuestDnDBase::isFormatSupported(const com::Utf8Str &aFormat, BOOL *aSupported)
+void GuestDnDBase::msgQueueRemoveNext(void)
{
- *aSupported = std::find(m_strFormats.begin(),
- m_strFormats.end(), aFormat) != m_strFormats.end()
- ? TRUE : FALSE;
- return S_OK;
+ if (!mDataBase.mListOutgoing.empty())
+ {
+ GuestDnDMsg *pMsg = mDataBase.mListOutgoing.front();
+ if (pMsg)
+ delete pMsg;
+ mDataBase.mListOutgoing.pop_front();
+ }
}
-HRESULT GuestDnDBase::getFormats(std::vector<com::Utf8Str> &aFormats)
+void GuestDnDBase::msgQueueClear(void)
{
- aFormats = m_strFormats;
+ GuestDnDMsgList::iterator itMsg = mDataBase.mListOutgoing.begin();
+ while (itMsg != mDataBase.mListOutgoing.end())
+ {
+ delete *itMsg;
+ }
- return S_OK;
+ mDataBase.mListOutgoing.clear();
}
-HRESULT GuestDnDBase::addFormats(const std::vector<com::Utf8Str> &aFormats)
+int GuestDnDBase::sendCancel(void)
{
- for (size_t i = 0; i < aFormats.size(); ++i)
+ LogFlowFunc(("Generating cancel request ...\n"));
+
+ int rc;
+ try
{
- Utf8Str strFormat = aFormats.at(i);
- if (std::find(m_strFormats.begin(),
- m_strFormats.end(), strFormat) == m_strFormats.end())
- {
- m_strFormats.push_back(strFormat);
- }
+ GuestDnDMsg *pMsgCancel = new GuestDnDMsg();
+ pMsgCancel->setType(DragAndDropSvc::HOST_DND_HG_EVT_CANCEL);
+
+ rc = msgQueueAdd(pMsgCancel);
+ }
+ catch(std::bad_alloc & /*e*/)
+ {
+ rc = VERR_NO_MEMORY;
}
- return S_OK;
+ return rc;
}
-HRESULT GuestDnDBase::removeFormats(const std::vector<com::Utf8Str> &aFormats)
+/** @todo GuestDnDResponse *pResp needs to go. */
+int GuestDnDBase::waitForEvent(RTMSINTERVAL msTimeout, GuestDnDCallbackEvent &Event, GuestDnDResponse *pResp)
{
- for (size_t i = 0; i < aFormats.size(); ++i)
+ int rc;
+
+ uint64_t tsStart = RTTimeMilliTS();
+ do
{
- Utf8Str strFormat = aFormats.at(i);
- std::vector<com::Utf8Str>::iterator itFormat = std::find(m_strFormats.begin(),
- m_strFormats.end(), strFormat);
- if (itFormat != m_strFormats.end())
- m_strFormats.erase(itFormat);
- }
+ /*
+ * Wait until our desired callback triggered the
+ * wait event. As we don't want to block if the guest does not
+ * respond, so do busy waiting here.
+ */
+ rc = Event.Wait(500 /* ms */);
+ if (RT_SUCCESS(rc))
+ {
+ rc = Event.Result();
+ LogFlowFunc(("Callback done, result is %Rrc\n", rc));
+ break;
+ }
+ else if (rc == VERR_TIMEOUT) /* Continue waiting. */
+ rc = VINF_SUCCESS;
- return S_OK;
-}
+ if ( msTimeout != RT_INDEFINITE_WAIT
+ && RTTimeMilliTS() - tsStart > msTimeout)
+ {
+ rc = VERR_TIMEOUT;
+ }
+ else if (pResp->isProgressCanceled())
+ {
+ pResp->setProgress(100 /* Percent */, DragAndDropSvc::DND_PROGRESS_CANCELLED);
+ rc = VERR_CANCELLED;
+ }
+
+ } while (RT_SUCCESS(rc));
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
#endif /* VBOX_WITH_DRAG_AND_DROP */
diff --git a/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp b/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp
index 8b23fbe..a761a3e 100644
--- a/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp
+++ b/src/VBox/Main/src-client/GuestDnDSourceImpl.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2014 Oracle Corporation
+ * Copyright (C) 2014-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -22,10 +22,17 @@
#include "GuestImpl.h"
#include "GuestDnDSourceImpl.h"
#include "GuestDnDPrivate.h"
+#include "ConsoleImpl.h"
#include "Global.h"
#include "AutoCaller.h"
+#include <iprt/asm.h>
+#include <iprt/dir.h>
+#include <iprt/file.h>
+#include <iprt/path.h>
+#include <iprt/uri.h>
+
#include <iprt/cpp/utils.h> /* For unconst(). */
#include <VBox/com/array.h>
@@ -38,6 +45,50 @@
#define LOG_GROUP LOG_GROUP_GUEST_DND
#include <VBox/log.h>
+/**
+ * Base class for a source task.
+ */
+class GuestDnDSourceTask
+{
+public:
+
+ GuestDnDSourceTask(GuestDnDSource *pSource)
+ : mSource(pSource),
+ mRC(VINF_SUCCESS) { }
+
+ virtual ~GuestDnDSourceTask(void) { }
+
+ int getRC(void) const { return mRC; }
+ bool isOk(void) const { return RT_SUCCESS(mRC); }
+ const ComObjPtr<GuestDnDSource> &getSource(void) const { return mSource; }
+
+protected:
+
+ const ComObjPtr<GuestDnDSource> mSource;
+ int mRC;
+};
+
+/**
+ * Task structure for receiving data from a source using
+ * a worker thread.
+ */
+class RecvDataTask : public GuestDnDSourceTask
+{
+public:
+
+ RecvDataTask(GuestDnDSource *pSource, PRECVDATACTX pCtx)
+ : GuestDnDSourceTask(pSource)
+ , mpCtx(pCtx) { }
+
+ virtual ~RecvDataTask(void) { }
+
+ PRECVDATACTX getCtx(void) { return mpCtx; }
+
+protected:
+
+ /** Pointer to receive data context. */
+ PRECVDATACTX mpCtx;
+};
// constructor / destructor
/////////////////////////////////////////////////////////////////////////////
@@ -46,6 +97,12 @@ DEFINE_EMPTY_CTOR_DTOR(GuestDnDSource)
HRESULT GuestDnDSource::FinalConstruct(void)
{
+ /* Set the maximum block size this source can handle to 64K. This always has
+ * been hardcoded until now. */
+ /* Note: Never ever rely on information from the guest; the host dictates what and
+ * how to do something, so try to negogiate a sensible value here later. */
+ mData.mcbBlockSize = _64K; /** @todo Make this configurable. */
+
LogFlowThisFunc(("\n"));
return BaseFinalConstruct();
}
@@ -94,8 +151,7 @@ void GuestDnDSource::uninit(void)
// implementation of wrapped IDnDBase methods.
/////////////////////////////////////////////////////////////////////////////
-HRESULT GuestDnDSource::isFormatSupported(const com::Utf8Str &aFormat,
- BOOL *aSupported)
+HRESULT GuestDnDSource::isFormatSupported(const com::Utf8Str &aFormat, BOOL *aSupported)
{
#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
ReturnComNotImplemented();
@@ -106,7 +162,7 @@ HRESULT GuestDnDSource::isFormatSupported(const com::Utf8Str &aFormat,
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- return GuestDnDBase::isFormatSupported(aFormat, aSupported);
+ return GuestDnDBase::i_isFormatSupported(aFormat, aSupported);
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
@@ -121,7 +177,7 @@ HRESULT GuestDnDSource::getFormats(std::vector<com::Utf8Str> &aFormats)
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- return GuestDnDBase::getFormats(aFormats);
+ return GuestDnDBase::i_getFormats(aFormats);
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
@@ -136,7 +192,7 @@ HRESULT GuestDnDSource::addFormats(const std::vector<com::Utf8Str> &aFormats)
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- return GuestDnDBase::addFormats(aFormats);
+ return GuestDnDBase::i_addFormats(aFormats);
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
@@ -151,17 +207,30 @@ HRESULT GuestDnDSource::removeFormats(const std::vector<com::Utf8Str> &aFormats)
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- return GuestDnDBase::removeFormats(aFormats);
+ return GuestDnDBase::i_removeFormats(aFormats);
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
-// implementation of wrapped IDnDTarget methods.
+HRESULT GuestDnDSource::getProtocolVersion(ULONG *aProtocolVersion)
+{
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
+ ReturnComNotImplemented();
+#else /* VBOX_WITH_DRAG_AND_DROP */
+
+ AutoCaller autoCaller(this);
+ if (FAILED(autoCaller.rc())) return autoCaller.rc();
+
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ return GuestDnDBase::i_getProtocolVersion(aProtocolVersion);
+#endif /* VBOX_WITH_DRAG_AND_DROP */
+}
+
+// implementation of wrapped IDnDSource methods.
/////////////////////////////////////////////////////////////////////////////
-HRESULT GuestDnDSource::dragIsPending(ULONG uScreenId,
- std::vector<com::Utf8Str> &aFormats,
- std::vector<DnDAction_T> &aAllowedActions,
- DnDAction_T *aDefaultAction)
+HRESULT GuestDnDSource::dragIsPending(ULONG uScreenId, std::vector<com::Utf8Str> &aFormats,
+ std::vector<DnDAction_T> &aAllowedActions, DnDAction_T *aDefaultAction)
{
#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
ReturnComNotImplemented();
@@ -170,17 +239,19 @@ HRESULT GuestDnDSource::dragIsPending(ULONG uScreenId,
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc())) return autoCaller.rc();
+ /* Determine guest DnD protocol to use. */
+ GuestDnDBase::getProtocolVersion(&mDataBase.mProtocolVersion);
+
/* Default is ignoring the action. */
DnDAction_T defaultAction = DnDAction_Ignore;
HRESULT hr = S_OK;
- VBOXHGCMSVCPARM paParms[1];
- int i = 0;
- paParms[i++].setUInt32(uScreenId);
+ GuestDnDMsg Msg;
+ Msg.setType(DragAndDropSvc::HOST_DND_GH_REQ_PENDING);
+ Msg.setNextUInt32(uScreenId);
- int rc = GuestDnDInst()->hostCall(DragAndDropSvc::HOST_DND_GH_REQ_PENDING,
- i, paParms);
+ int rc = GuestDnDInst()->hostCall(Msg.getType(), Msg.getCount(), Msg.getParms());
if (RT_SUCCESS(rc))
{
bool fFetchResult = true;
@@ -207,82 +278,70 @@ HRESULT GuestDnDSource::dragIsPending(ULONG uScreenId,
*aDefaultAction = defaultAction;
}
- if (RT_FAILURE(rc))
- hr = setError(VBOX_E_IPRT_ERROR,
- tr("Unable to retrieve pending status (%Rrc)\n"), rc);
-
LogFlowFunc(("hr=%Rhrc, defaultAction=0x%x\n", hr, defaultAction));
return hr;
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
-HRESULT GuestDnDSource::drop(const com::Utf8Str &aFormat,
- DnDAction_T aAction, ComPtr<IProgress> &aProgress)
+HRESULT GuestDnDSource::drop(const com::Utf8Str &aFormat, DnDAction_T aAction, ComPtr<IProgress> &aProgress)
{
#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
+ AutoCaller autoCaller(this);
+ if (FAILED(autoCaller.rc())) return autoCaller.rc();
+
/* Input validation. */
if (RT_UNLIKELY((aFormat.c_str()) == NULL || *(aFormat.c_str()) == '\0'))
return setError(E_INVALIDARG, tr("No drop format specified"));
- AutoCaller autoCaller(this);
- if (FAILED(autoCaller.rc())) return autoCaller.rc();
-
uint32_t uAction = GuestDnD::toHGCMAction(aAction);
- /* If there is no usable action, ignore this request. */
- if (isDnDIgnoreAction(uAction))
+ if (isDnDIgnoreAction(uAction)) /* If there is no usable action, ignore this request. */
return S_OK;
- HRESULT hr = S_OK;
+ /* Note: At the moment we only support one transfer at a time. */
+ if (ASMAtomicReadBool(&mDataBase.mfTransferIsPending))
+ return setError(E_INVALIDARG, tr("Another drop operation already is in progress"));
- const char *pcszFormat = aFormat.c_str();
- bool fNeedsDropDir = DnDMIMENeedsDropDir(pcszFormat, strlen(pcszFormat));
- LogFlowFunc(("strFormat=%s, uAction=0x%x, fNeedsDropDir=%RTbool\n",
- pcszFormat, uAction, fNeedsDropDir));
+ ASMAtomicWriteBool(&mDataBase.mfTransferIsPending, true);
+ /* Dito. */
GuestDnDResponse *pResp = GuestDnDInst()->response();
- if (pResp)
- {
- /* Reset any old data. */
- pResp->reset();
- pResp->resetProgress(m_pGuest);
+ AssertPtr(pResp);
- /* Set the format we are going to retrieve to have it around
- * when retrieving the data later. */
- pResp->setFormat(aFormat);
+ HRESULT hr = pResp->resetProgress(m_pGuest);
+ if (FAILED(hr))
+ return hr;
- if (fNeedsDropDir)
- {
- char szDropDir[RTPATH_MAX];
- int rc = DnDDirCreateDroppedFiles(szDropDir, sizeof(szDropDir));
- LogFlowFunc(("rc=%Rrc, szDropDir=%s\n", rc, szDropDir));
- if (RT_FAILURE(rc))
- return setError(VBOX_E_IPRT_ERROR,
- tr("Unable to create the temporary drag and drop directory \"%s\" (%Rrc)\n"),
- szDropDir, rc);
-
- pResp->setDropDir(szDropDir);
- }
+ try
+ {
+ mData.mRecvCtx.mIsActive = false;
+ mData.mRecvCtx.mpSource = this;
+ mData.mRecvCtx.mpResp = pResp;
+ mData.mRecvCtx.mFormat = aFormat;
- VBOXHGCMSVCPARM paParms[4];
- int i = 0;
- paParms[i++].setPointer((void*)aFormat.c_str(), (uint32_t)aFormat.length() + 1);
- paParms[i++].setUInt32((uint32_t)aFormat.length() + 1);
- paParms[i++].setUInt32(uAction);
+ RecvDataTask *pTask = new RecvDataTask(this, &mData.mRecvCtx);
+ AssertReturn(pTask->isOk(), pTask->getRC());
- int rc = GuestDnDInst()->hostCall(DragAndDropSvc::HOST_DND_GH_EVT_DROPPED,
- i, paParms);
+ int rc = RTThreadCreate(NULL, GuestDnDSource::i_receiveDataThread,
+ (void *)pTask, 0, RTTHREADTYPE_MAIN_WORKER, 0, "dndSrcRcvData");
if (RT_SUCCESS(rc))
{
- /* Query the progress object to the caller. */
- pResp->queryProgressTo(aProgress.asOutParam());
+ hr = pResp->queryProgressTo(aProgress.asOutParam());
+ ComAssertComRC(hr);
+
+ /* Note: pTask is now owned by the worker thread. */
}
else
- hr = setError(VBOX_E_IPRT_ERROR,
- tr("Error signalling to drop data (%Rrc)\n"), rc);
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Starting thread failed (%Rrc)"), rc);
}
+ catch(std::bad_alloc &)
+ {
+ hr = setError(E_OUTOFMEMORY);
+ }
+
+ /* Note: mDataBase.mfTransferIsPending will be set to false again by i_receiveDataThread. */
LogFlowFunc(("Returning hr=%Rhrc\n", hr));
return hr;
@@ -300,64 +359,786 @@ HRESULT GuestDnDSource::receiveData(std::vector<BYTE> &aData)
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc())) return autoCaller.rc();
+ /* Don't allow receiving the actual data until our transfer
+ * actually is complete. */
+ if (ASMAtomicReadBool(&mDataBase.mfTransferIsPending))
+ return setError(E_INVALIDARG, tr("Current drop operation still in progress"));
+
+ PRECVDATACTX pCtx = &mData.mRecvCtx;
+
+ if (pCtx->mData.vecData.empty())
+ {
+ aData.resize(0);
+ return S_OK;
+ }
+
HRESULT hr = S_OK;
+ size_t cbData;
- GuestDnDResponse *pResp = GuestDnDInst()->response();
- if (pResp)
+ try
{
- size_t cbData = pResp->size();
- if (cbData)
+ bool fHasURIList = DnDMIMENeedsDropDir(pCtx->mFormat.c_str(), pCtx->mFormat.length());
+ if (fHasURIList)
{
- const void *pvData = pResp->data();
- AssertPtr(pvData);
+ Utf8Str strURIs = pCtx->mURI.lstURI.RootToString(RTCString(DnDDirDroppedFilesGetDirAbs(&pCtx->mURI.mDropDir)));
+ cbData = strURIs.length();
- Utf8Str strFormat = pResp->format();
- LogFlowFunc(("strFormat=%s, cbData=%zu, pvData=0x%p\n",
- strFormat.c_str(), cbData, pvData));
+ LogFlowFunc(("Found %zu root URIs (%zu bytes)\n", pCtx->mURI.lstURI.RootCount(), cbData));
- try
+ aData.resize(cbData + 1 /* Include termination */);
+ memcpy(&aData.front(), strURIs.c_str(), cbData);
+ }
+ else
+ {
+ cbData = pCtx->mData.vecData.size();
+
+ /* Copy the data into a safe array of bytes. */
+ aData.resize(cbData);
+ memcpy(&aData.front(), &pCtx->mData.vecData[0], cbData);
+ }
+ }
+ catch (std::bad_alloc &)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+
+ LogFlowFunc(("Returning cbData=%zu, hr=%Rhrc\n", cbData, hr));
+ return hr;
+#endif /* VBOX_WITH_DRAG_AND_DROP */
+}
+
+// implementation of internal methods.
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef VBOX_WITH_DRAG_AND_DROP_GH
+int GuestDnDSource::i_onReceiveData(PRECVDATACTX pCtx, const void *pvData, uint32_t cbData, uint64_t cbTotalSize)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(pvData, VERR_INVALID_POINTER);
+ AssertReturn(cbData, VERR_INVALID_PARAMETER);
+ AssertReturn(cbTotalSize, VERR_INVALID_PARAMETER);
+
+ LogFlowFunc(("cbData=%RU32, cbTotalSize=%RU64\n", cbData, cbTotalSize));
+
+ int rc = VINF_SUCCESS;
+
+ try
+ {
+ if ( cbData > cbTotalSize
+ || cbData > mData.mcbBlockSize)
+ {
+ LogFlowFunc(("Data sizes invalid: cbData=%RU32, cbTotalSize=%RU64\n", cbData, cbTotalSize));
+ rc = VERR_INVALID_PARAMETER;
+ }
+ else if (cbData < pCtx->mData.vecData.size())
+ {
+ AssertMsgFailed(("New size (%RU64) is smaller than current size (%zu)\n", cbTotalSize, pCtx->mData.vecData.size()));
+ rc = VERR_INVALID_PARAMETER;
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ pCtx->mData.vecData.insert(pCtx->mData.vecData.begin(), (BYTE *)pvData, (BYTE *)pvData + cbData);
+
+ LogFlowFunc(("vecDataSize=%zu, cbData=%RU32, cbTotalSize=%RU64\n", pCtx->mData.vecData.size(), cbData, cbTotalSize));
+
+ /* Data transfer complete? */
+ Assert(cbData <= pCtx->mData.vecData.size());
+ if (cbData == pCtx->mData.vecData.size())
{
- if (DnDMIMEHasFileURLs(strFormat.c_str(), strFormat.length()))
+ bool fHasURIList = DnDMIMENeedsDropDir(pCtx->mFormat.c_str(), pCtx->mFormat.length());
+ LogFlowFunc(("fHasURIList=%RTbool, cbTotalSize=%RU32\n", fHasURIList, cbTotalSize));
+ if (fHasURIList)
{
- LogFlowFunc(("strDropDir=%s\n", pResp->dropDir().c_str()));
-
- DnDURIList lstURI;
- int rc2 = lstURI.RootFromURIData(pvData, cbData, 0 /* fFlags */);
- if (RT_SUCCESS(rc2))
+ /* Try parsing the data as URI list. */
+ rc = pCtx->mURI.lstURI.RootFromURIData(&pCtx->mData.vecData[0], pCtx->mData.vecData.size(), 0 /* uFlags */);
+ if (RT_SUCCESS(rc))
{
- Utf8Str strURIs = lstURI.RootToString(pResp->dropDir());
- size_t cbURIs = strURIs.length();
+ pCtx->mData.cbProcessed = 0;
- LogFlowFunc(("Found %zu root URIs (%zu bytes)\n",
- lstURI.RootCount(), cbURIs));
+ /*
+ * Assign new total size which also includes all file data to receive
+ * from the guest.
+ */
+ pCtx->mData.cbToProcess = cbTotalSize;
- aData.resize(cbURIs + 1 /* Include termination */);
- memcpy(&aData.front(), strURIs.c_str(), cbURIs);
+ LogFlowFunc(("URI data => cbToProcess=%RU64\n", pCtx->mData.cbToProcess));
}
- else
- hr = VBOX_E_IPRT_ERROR;
}
- else
+ }
+ }
+ }
+ catch (std::bad_alloc &)
+ {
+ rc = VERR_NO_MEMORY;
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+int GuestDnDSource::i_onReceiveDir(PRECVDATACTX pCtx, const char *pszPath, uint32_t cbPath, uint32_t fMode)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
+ AssertReturn(cbPath, VERR_INVALID_PARAMETER);
+
+ LogFlowFunc(("pszPath=%s, cbPath=%RU32, fMode=0x%x\n", pszPath, cbPath, fMode));
+
+ int rc;
+ char *pszDir = RTPathJoinA(DnDDirDroppedFilesGetDirAbs(&pCtx->mURI.mDropDir), pszPath);
+ if (pszDir)
+ {
+ rc = RTDirCreateFullPath(pszDir, fMode);
+ if (RT_FAILURE(rc))
+ LogRel2(("DnD: Error creating guest directory \"%s\" on the host, rc=%Rrc\n", pszDir, rc));
+
+ RTStrFree(pszDir);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+
+ if (RT_SUCCESS(rc))
+ {
+ if (mDataBase.mProtocolVersion <= 2)
+ {
+ /*
+ * Protocols v1/v2 do *not* send root element names (files/directories)
+ * in URI format. The initial GUEST_DND_GH_SND_DATA message(s) however
+ * did take those element names into account, but *with* URI decoration
+ * when it comes to communicating the total bytes being sent.
+ *
+ * So translate the path into a valid URI path and add the resulting
+ * length (+ "\r\n" and termination) to the total bytes received
+ * to keep the accounting right.
+ */
+ char *pszPathURI = RTUriCreate("file" /* pszScheme */, "/" /* pszAuthority */,
+ pszPath /* pszPath */,
+ NULL /* pszQuery */, NULL /* pszFragment */);
+ if (pszPathURI)
+ {
+ bool fHasPath = RTPathHasPath(pszPath); /* Use original data received. */
+ if (!fHasPath) /* Root path? */
{
- /* Copy the data into a safe array of bytes. */
- aData.resize(cbData);
- memcpy(&aData.front(), pvData, cbData);
+ cbPath = strlen(pszPathURI);
+ cbPath += 3; /* Include "\r" + "\n" + termination -- see above. */
+
+ rc = i_updateProcess(pCtx, cbPath);
}
+
+ LogFlowFunc(("URI pszPathURI=%s, fHasPath=%RTbool, cbPath=%RU32\n", pszPathURI, fHasPath, cbPath));
+ RTStrFree(pszPathURI);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ }
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+int GuestDnDSource::i_onReceiveFileHdr(PRECVDATACTX pCtx, const char *pszPath, uint32_t cbPath,
+ uint64_t cbSize, uint32_t fMode, uint32_t fFlags)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(pszPath, VERR_INVALID_POINTER);
+ AssertReturn(cbPath, VERR_INVALID_PARAMETER);
+ AssertReturn(fMode, VERR_INVALID_PARAMETER);
+ /* fFlags are optional. */
+
+ LogFlowFunc(("pszPath=%s, cbPath=%RU32, cbSize=%RU64, fMode=0x%x, fFlags=0x%x\n", pszPath, cbPath, cbSize, fMode, fFlags));
+
+ int rc = VINF_SUCCESS;
+
+ do
+ {
+ if (!pCtx->mURI.objURI.IsComplete())
+ {
+ LogFlowFunc(("Warning: Object \"%s\" not complete yet\n", pCtx->mURI.objURI.GetDestPath().c_str()));
+ rc = VERR_INVALID_PARAMETER;
+ break;
+ }
+
+ if (pCtx->mURI.objURI.IsOpen()) /* File already opened? */
+ {
+ LogFlowFunc(("Warning: Current opened object is \"%s\"\n", pCtx->mURI.objURI.GetDestPath().c_str()));
+ rc = VERR_WRONG_ORDER;
+ break;
+ }
+
+ char pszPathAbs[RTPATH_MAX];
+ rc = RTPathJoin(pszPathAbs, sizeof(pszPathAbs), DnDDirDroppedFilesGetDirAbs(&pCtx->mURI.mDropDir), pszPath);
+ if (RT_FAILURE(rc))
+ {
+ LogFlowFunc(("Warning: Rebasing current file failed with rc=%Rrc\n", rc));
+ break;
+ }
+
+ rc = DnDPathSanitize(pszPathAbs, sizeof(pszPathAbs));
+ if (RT_FAILURE(rc))
+ {
+ LogFlowFunc(("Warning: Rebasing current file failed with rc=%Rrc\n", rc));
+ break;
+ }
+
+ LogFunc(("Rebased to: %s\n", pszPathAbs));
+
+ /** @todo Add sparse file support based on fFlags? (Use Open(..., fFlags | SPARSE). */
+ rc = pCtx->mURI.objURI.OpenEx(pszPathAbs, DnDURIObject::File, DnDURIObject::Target,
+ RTFILE_O_CREATE_REPLACE | RTFILE_O_WRITE | RTFILE_O_DENY_WRITE,
+ (fMode & RTFS_UNIX_MASK) | RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR);
+ if (RT_SUCCESS(rc))
+ {
+ /* Note: Protocol v1 does not send any file sizes, so always 0. */
+ if (mDataBase.mProtocolVersion >= 2)
+ rc = pCtx->mURI.objURI.SetSize(cbSize);
+
+ /** @todo Unescpae path before printing. */
+ LogRel2(("DnD: Transferring guest file to host: %s (%RU64 bytes, mode 0x%x)\n",
+ pCtx->mURI.objURI.GetDestPath().c_str(), pCtx->mURI.objURI.GetSize(), pCtx->mURI.objURI.GetMode()));
+
+ /** @todo Set progress object title to current file being transferred? */
+
+ if (!cbSize) /* 0-byte file? Close again. */
+ pCtx->mURI.objURI.Close();
+ }
+ else
+ {
+ LogRel2(("DnD: Error opening/creating guest file '%s' on host, rc=%Rrc\n",
+ pCtx->mURI.objURI.GetDestPath().c_str(), rc));
+ break;
+ }
+
+ if (mDataBase.mProtocolVersion <= 2)
+ {
+ /*
+ * Protocols v1/v2 do *not* send root element names (files/directories)
+ * in URI format. The initial GUEST_DND_GH_SND_DATA message(s) however
+ * did take those element names into account, but *with* URI decoration
+ * when it comes to communicating the total bytes being sent.
+ *
+ * So translate the path into a valid URI path and add the resulting
+ * length (+ "\r\n" and termination) to the total bytes received
+ * to keep the accounting right.
+ */
+ char *pszPathURI = RTUriCreate("file" /* pszScheme */, "/" /* pszAuthority */,
+ pszPath /* pszPath */,
+ NULL /* pszQuery */, NULL /* pszFragment */);
+ if (pszPathURI)
+ {
+ bool fHasPath = RTPathHasPath(pszPath); /* Use original data received. */
+ if (!fHasPath) /* Root path? */
+ {
+ cbPath = strlen(pszPathURI);
+ cbPath += 3; /* Include "\r" + "\n" + termination -- see above. */
+
+ rc = i_updateProcess(pCtx, cbPath);
+ }
+
+ LogFlowFunc(("URI pszPathURI=%s, fHasPath=%RTbool, cbPath=%RU32\n", pszPathURI, fHasPath, cbPath));
+ RTStrFree(pszPathURI);
+ }
+ else
+ {
+ rc = VERR_NO_MEMORY;
+ break;
+ }
+ }
+
+ } while (0);
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+int GuestDnDSource::i_onReceiveFileData(PRECVDATACTX pCtx, const void *pvData, uint32_t cbData)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(pvData, VERR_INVALID_POINTER);
+ AssertReturn(cbData, VERR_INVALID_PARAMETER);
+
+ int rc = VINF_SUCCESS;
+
+ do
+ {
+ if (pCtx->mURI.objURI.IsComplete())
+ {
+ LogFlowFunc(("Warning: Object \"%s\" already completed\n", pCtx->mURI.objURI.GetDestPath().c_str()));
+ rc = VERR_WRONG_ORDER;
+ break;
+ }
+
+ if (!pCtx->mURI.objURI.IsOpen()) /* File opened on host? */
+ {
+ LogFlowFunc(("Warning: Object \"%s\" not opened\n", pCtx->mURI.objURI.GetDestPath().c_str()));
+ rc = VERR_WRONG_ORDER;
+ break;
+ }
+
+ uint32_t cbWritten;
+ rc = pCtx->mURI.objURI.Write(pvData, cbData, &cbWritten);
+ if (RT_SUCCESS(rc))
+ {
+ Assert(cbWritten <= cbData);
+ if (cbWritten < cbData)
+ {
+ /** @todo What to do when the host's disk is full? */
+ rc = VERR_DISK_FULL;
}
- catch (std::bad_alloc &)
+
+ if (RT_SUCCESS(rc))
+ rc = i_updateProcess(pCtx, cbWritten);
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ if (pCtx->mURI.objURI.IsComplete())
{
- hr = E_OUTOFMEMORY;
+ /** @todo Sanitize path. */
+ LogRel2(("DnD: File transfer to host complete: %s\n", pCtx->mURI.objURI.GetDestPath().c_str()));
+ rc = VINF_EOF;
+
+ /* Prepare URI object for next use. */
+ pCtx->mURI.objURI.Reset();
}
}
+ else
+ LogRel(("DnD: Error writing guest file to host to \"%s\": %Rrc\n", pCtx->mURI.objURI.GetDestPath().c_str(), rc));
+
+ } while (0);
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
+
+int GuestDnDSource::i_receiveData(PRECVDATACTX pCtx, RTMSINTERVAL msTimeout)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ GuestDnD *pInst = GuestDnDInst();
+ if (!pInst)
+ return VERR_INVALID_POINTER;
+
+ GuestDnDResponse *pResp = pCtx->mpResp;
+ AssertPtr(pCtx->mpResp);
+
+ /* Is this context already in receiving state? */
+ if (ASMAtomicReadBool(&pCtx->mIsActive))
+ return VERR_WRONG_ORDER;
+
+ ASMAtomicWriteBool(&pCtx->mIsActive, true);
- /* Delete the data. */
- pResp->reset();
+ int rc = pCtx->mCallback.Reset();
+ if (RT_FAILURE(rc))
+ return rc;
+
+ /*
+ * Reset any old data.
+ */
+ pCtx->mData.Reset();
+ pCtx->mURI.Reset();
+
+ /* Set the format we are going to retrieve to have it around
+ * when retrieving the data later. */
+ pResp->reset();
+ pResp->setFormat(pCtx->mFormat);
+
+ bool fHasURIList = DnDMIMENeedsDropDir(pCtx->mFormat.c_str(), pCtx->mFormat.length());
+ LogFlowFunc(("strFormat=%s, uAction=0x%x, fHasURIList=%RTbool\n", pCtx->mFormat.c_str(), pCtx->mAction, fHasURIList));
+ if (fHasURIList)
+ {
+ rc = i_receiveURIData(pCtx, msTimeout);
}
else
- hr = VBOX_E_INVALID_OBJECT_STATE;
+ {
+ rc = i_receiveRawData(pCtx, msTimeout);
+ }
- LogFlowFunc(("Returning hr=%Rhrc\n", hr));
- return hr;
-#endif /* VBOX_WITH_DRAG_AND_DROP */
+ ASMAtomicWriteBool(&pCtx->mIsActive, false);
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+/* static */
+DECLCALLBACK(int) GuestDnDSource::i_receiveDataThread(RTTHREAD Thread, void *pvUser)
+{
+ LogFlowFunc(("pvUser=%p\n", pvUser));
+
+ RecvDataTask *pTask = (RecvDataTask *)pvUser;
+ AssertPtrReturn(pTask, VERR_INVALID_POINTER);
+
+ const ComObjPtr<GuestDnDSource> pSource(pTask->getSource());
+ Assert(!pSource.isNull());
+
+ int rc;
+
+ AutoCaller autoCaller(pSource);
+ if (SUCCEEDED(autoCaller.rc()))
+ {
+ rc = pSource->i_receiveData(pTask->getCtx(), RT_INDEFINITE_WAIT /* msTimeout */);
+ }
+ else
+ rc = VERR_COM_INVALID_OBJECT_STATE;
+
+ ASMAtomicWriteBool(&pSource->mDataBase.mfTransferIsPending, false);
+
+ LogFlowFunc(("pSource=%p returning rc=%Rrc\n", (GuestDnDSource *)pSource, rc));
+
+ if (pTask)
+ delete pTask;
+ return rc;
+}
+
+int GuestDnDSource::i_receiveRawData(PRECVDATACTX pCtx, RTMSINTERVAL msTimeout)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ int rc;
+
+ GuestDnDResponse *pResp = pCtx->mpResp;
+ AssertPtr(pCtx->mpResp);
+
+ GuestDnD *pInst = GuestDnDInst();
+ if (!pInst)
+ return VERR_INVALID_POINTER;
+
+#define REGISTER_CALLBACK(x) \
+ rc = pResp->setCallback(x, i_receiveRawDataCallback, pCtx); \
+ if (RT_FAILURE(rc)) \
+ return rc;
+
+#define UNREGISTER_CALLBACK(x) \
+ rc = pCtx->mpResp->setCallback(x, NULL); \
+ AssertRC(rc);
+
+ /*
+ * Register callbacks.
+ */
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_EVT_ERROR);
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_DATA);
+
+ do
+ {
+ /*
+ * Receive the raw data.
+ */
+ GuestDnDMsg Msg;
+ Msg.setType(DragAndDropSvc::HOST_DND_GH_EVT_DROPPED);
+ Msg.setNextPointer((void*)pCtx->mFormat.c_str(), (uint32_t)pCtx->mFormat.length() + 1);
+ Msg.setNextUInt32((uint32_t)pCtx->mFormat.length() + 1);
+ Msg.setNextUInt32(pCtx->mAction);
+
+ /* Make the initial call to the guest by telling that we initiated the "dropped" event on
+ * the host and therefore now waiting for the actual raw data. */
+ rc = pInst->hostCall(Msg.getType(), Msg.getCount(), Msg.getParms());
+ if (RT_SUCCESS(rc))
+ rc = waitForEvent(msTimeout, pCtx->mCallback, pCtx->mpResp);
+
+ } while (0);
+
+ /*
+ * Unregister callbacks.
+ */
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_EVT_ERROR);
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_DATA);
+
+#undef REGISTER_CALLBACK
+#undef UNREGISTER_CALLBACK
+
+ if (rc == VERR_CANCELLED)
+ {
+ int rc2 = sendCancel();
+ AssertRC(rc2);
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+int GuestDnDSource::i_receiveURIData(PRECVDATACTX pCtx, RTMSINTERVAL msTimeout)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ int rc;
+
+ GuestDnDResponse *pResp = pCtx->mpResp;
+ AssertPtr(pCtx->mpResp);
+
+ GuestDnD *pInst = GuestDnDInst();
+ if (!pInst)
+ return VERR_INVALID_POINTER;
+
+#define REGISTER_CALLBACK(x) \
+ rc = pResp->setCallback(x, i_receiveURIDataCallback, pCtx); \
+ if (RT_FAILURE(rc)) \
+ return rc;
+
+#define UNREGISTER_CALLBACK(x) \
+ { \
+ int rc2 = pResp->setCallback(x, NULL); \
+ AssertRC(rc2); \
+ }
+
+ /*
+ * Register callbacks.
+ */
+ /* Guest callbacks. */
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_EVT_ERROR);
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_DATA);
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_DIR);
+ if (mDataBase.mProtocolVersion >= 2)
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_FILE_HDR);
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_FILE_DATA);
+
+ do
+ {
+ rc = DnDDirDroppedFilesCreateAndOpenTemp(&pCtx->mURI.mDropDir);
+ if (RT_FAILURE(rc))
+ break;
+ LogFlowFunc(("rc=%Rrc, strDropDir=%s\n", rc, DnDDirDroppedFilesGetDirAbs(&pCtx->mURI.mDropDir)));
+ if (RT_FAILURE(rc))
+ break;
+
+ /*
+ * Receive the URI list.
+ */
+ GuestDnDMsg Msg;
+ Msg.setType(DragAndDropSvc::HOST_DND_GH_EVT_DROPPED);
+ Msg.setNextPointer((void*)pCtx->mFormat.c_str(), (uint32_t)pCtx->mFormat.length() + 1);
+ Msg.setNextUInt32((uint32_t)pCtx->mFormat.length() + 1);
+ Msg.setNextUInt32(pCtx->mAction);
+
+ /* Make the initial call to the guest by telling that we initiated the "dropped" event on
+ * the host and therefore now waiting for the actual URI data. */
+ rc = pInst->hostCall(Msg.getType(), Msg.getCount(), Msg.getParms());
+ if (RT_SUCCESS(rc))
+ rc = waitForEvent(msTimeout, pCtx->mCallback, pCtx->mpResp);
+
+ } while (0);
+
+ /*
+ * Unregister callbacks.
+ */
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_EVT_ERROR);
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_DATA);
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_DIR);
+ if (mDataBase.mProtocolVersion >= 2)
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_FILE_HDR);
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_SND_FILE_DATA);
+
+#undef REGISTER_CALLBACK
+#undef UNREGISTER_CALLBACK
+
+ int rc2;
+
+ if (rc == VERR_CANCELLED)
+ {
+ rc2 = sendCancel();
+ AssertRC(rc2);
+ }
+
+ if (RT_FAILURE(rc))
+ {
+ rc2 = DnDDirDroppedFilesRollback(&pCtx->mURI.mDropDir); /** @todo Inform user on rollback failure? */
+ LogFlowFunc(("Rolling back ended with rc=%Rrc\n", rc2));
+ }
+
+ rc2 = DnDDirDroppedFilesClose(&pCtx->mURI.mDropDir, RT_FAILURE(rc) ? true : false /* fRemove */);
+ if (RT_SUCCESS(rc))
+ rc = rc2;
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+/* static */
+DECLCALLBACK(int) GuestDnDSource::i_receiveRawDataCallback(uint32_t uMsg, void *pvParms, size_t cbParms, void *pvUser)
+{
+ PRECVDATACTX pCtx = (PRECVDATACTX)pvUser;
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ GuestDnDSource *pThis = pCtx->mpSource;
+ AssertPtrReturn(pThis, VERR_INVALID_POINTER);
+
+ LogFlowFunc(("pThis=%p, uMsg=%RU32\n", pThis, uMsg));
+
+ int rc = VINF_SUCCESS;
+
+ switch (uMsg)
+ {
+#ifdef VBOX_WITH_DRAG_AND_DROP_GH
+ case DragAndDropSvc::GUEST_DND_GH_SND_DATA:
+ {
+ DragAndDropSvc::PVBOXDNDCBSNDDATADATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBSNDDATADATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBSNDDATADATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_SND_DATA == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ rc = pThis->i_onReceiveData(pCtx, pCBData->pvData, pCBData->cbData, pCBData->cbTotalSize);
+ break;
+ }
+ case DragAndDropSvc::GUEST_DND_GH_EVT_ERROR:
+ {
+ DragAndDropSvc::PVBOXDNDCBEVTERRORDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBEVTERRORDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBEVTERRORDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_EVT_ERROR == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ pCtx->mpResp->reset();
+ rc = pCtx->mpResp->setProgress(100, DragAndDropSvc::DND_PROGRESS_ERROR, pCBData->rc);
+ if (RT_SUCCESS(rc))
+ rc = pCBData->rc;
+ break;
+ }
+#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
+ default:
+ rc = VERR_NOT_SUPPORTED;
+ break;
+ }
+
+ if (RT_FAILURE(rc))
+ {
+ int rc2 = pCtx->mCallback.Notify(rc);
+ AssertRC(rc2);
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc; /* Tell the guest. */
+}
+
+/* static */
+DECLCALLBACK(int) GuestDnDSource::i_receiveURIDataCallback(uint32_t uMsg, void *pvParms, size_t cbParms, void *pvUser)
+{
+ PRECVDATACTX pCtx = (PRECVDATACTX)pvUser;
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ GuestDnDSource *pThis = pCtx->mpSource;
+ AssertPtrReturn(pThis, VERR_INVALID_POINTER);
+
+ LogFlowFunc(("pThis=%p, uMsg=%RU32\n", pThis, uMsg));
+
+ int rc = VINF_SUCCESS;
+ bool fNotify = false;
+
+ switch (uMsg)
+ {
+#ifdef VBOX_WITH_DRAG_AND_DROP_GH
+ case DragAndDropSvc::GUEST_DND_GH_SND_DATA:
+ {
+ DragAndDropSvc::PVBOXDNDCBSNDDATADATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBSNDDATADATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBSNDDATADATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_SND_DATA == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ rc = pThis->i_onReceiveData(pCtx, pCBData->pvData, pCBData->cbData, pCBData->cbTotalSize);
+ break;
+ }
+ case DragAndDropSvc::GUEST_DND_GH_SND_DIR:
+ {
+ DragAndDropSvc::PVBOXDNDCBSNDDIRDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBSNDDIRDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBSNDDIRDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_SND_DIR == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ rc = pThis->i_onReceiveDir(pCtx, pCBData->pszPath, pCBData->cbPath, pCBData->fMode);
+ break;
+ }
+ case DragAndDropSvc::GUEST_DND_GH_SND_FILE_HDR:
+ {
+ DragAndDropSvc::PVBOXDNDCBSNDFILEHDRDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBSNDFILEHDRDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBSNDFILEHDRDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_SND_FILE_HDR == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ rc = pThis->i_onReceiveFileHdr(pCtx, pCBData->pszFilePath, pCBData->cbFilePath,
+ pCBData->cbSize, pCBData->fMode, pCBData->fFlags);
+ break;
+ }
+ case DragAndDropSvc::GUEST_DND_GH_SND_FILE_DATA:
+ {
+ DragAndDropSvc::PVBOXDNDCBSNDFILEDATADATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBSNDFILEDATADATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBSNDFILEDATADATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_SND_FILE_DATA == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ if (pThis->mDataBase.mProtocolVersion <= 1)
+ {
+ /**
+ * Notes for protocol v1 (< VBox 5.0):
+ * - Every time this command is being sent it includes the file header,
+ * so just process both calls here.
+ * - There was no information whatsoever about the total file size; the old code only
+ * appended data to the desired file. So just pass 0 as cbSize.
+ */
+ rc = pThis->i_onReceiveFileHdr(pCtx,
+ pCBData->u.v1.pszFilePath, pCBData->u.v1.cbFilePath,
+ 0 /* cbSize */, pCBData->u.v1.fMode, 0 /* fFlags */);
+ if (RT_SUCCESS(rc))
+ rc = pThis->i_onReceiveFileData(pCtx, pCBData->pvData, pCBData->cbData);
+ }
+ else /* Protocol v2 and up. */
+ rc = pThis->i_onReceiveFileData(pCtx, pCBData->pvData, pCBData->cbData);
+ break;
+ }
+ case DragAndDropSvc::GUEST_DND_GH_EVT_ERROR:
+ {
+ DragAndDropSvc::PVBOXDNDCBEVTERRORDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBEVTERRORDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBEVTERRORDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_EVT_ERROR == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ pCtx->mpResp->reset();
+ rc = pCtx->mpResp->setProgress(100, DragAndDropSvc::DND_PROGRESS_ERROR, pCBData->rc);
+ if (RT_SUCCESS(rc))
+ rc = pCBData->rc;
+ break;
+ }
+#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
+ default:
+ rc = VERR_NOT_SUPPORTED;
+ break;
+ }
+
+ if (RT_FAILURE(rc))
+ fNotify = true;
+
+ /* All URI data processed? */
+ if (pCtx->mData.cbProcessed >= pCtx->mData.cbToProcess)
+ {
+ Assert(pCtx->mData.cbProcessed == pCtx->mData.cbToProcess);
+ fNotify = true;
+ }
+
+ LogFlowFunc(("cbProcessed=%RU64, cbToProcess=%RU64, fNotify=%RTbool, rc=%Rrc\n",
+ pCtx->mData.cbProcessed, pCtx->mData.cbToProcess, fNotify, rc));
+
+ if (fNotify)
+ {
+ int rc2 = pCtx->mCallback.Notify(rc);
+ AssertRC(rc2);
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc; /* Tell the guest. */
+}
+
+int GuestDnDSource::i_updateProcess(PRECVDATACTX pCtx, uint32_t cbDataAdd)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ pCtx->mData.cbProcessed += cbDataAdd;
+ Assert(pCtx->mData.cbProcessed <= pCtx->mData.cbToProcess);
+
+ int64_t cbTotal = pCtx->mData.cbToProcess;
+ uint8_t uPercent = pCtx->mData.cbProcessed * 100 / (cbTotal ? cbTotal : 1);
+
+ int rc = pCtx->mpResp->setProgress(uPercent,
+ uPercent >= 100
+ ? DragAndDropSvc::DND_PROGRESS_COMPLETE
+ : DragAndDropSvc::DND_PROGRESS_RUNNING);
+ return rc;
}
diff --git a/src/VBox/Main/src-client/GuestDnDTargetImpl.cpp b/src/VBox/Main/src-client/GuestDnDTargetImpl.cpp
index 7963b6c..4d90cd5 100644
--- a/src/VBox/Main/src-client/GuestDnDTargetImpl.cpp
+++ b/src/VBox/Main/src-client/GuestDnDTargetImpl.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2014 Oracle Corporation
+ * Copyright (C) 2014-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -21,15 +21,24 @@
*******************************************************************************/
#include "GuestImpl.h"
#include "GuestDnDTargetImpl.h"
+#include "ConsoleImpl.h"
#include "Global.h"
#include "AutoCaller.h"
-#include <algorithm> /* For std::find(). */
+#include <algorithm> /* For std::find(). */
+
+#include <iprt/asm.h>
+#include <iprt/file.h>
+#include <iprt/dir.h>
+#include <iprt/path.h>
+#include <iprt/uri.h>
#include <iprt/cpp/utils.h> /* For unconst(). */
#include <VBox/com/array.h>
-#include <VBox/HostServices/DragAndDropSvc.h>
+
+#include <VBox/GuestHost/DragAndDrop.h>
+#include <VBox/HostServices/Service.h>
#ifdef LOG_GROUP
#undef LOG_GROUP
@@ -38,6 +47,59 @@
#include <VBox/log.h>
+/**
+ * Base class for a target task.
+ */
+class GuestDnDTargetTask
+{
+public:
+
+ GuestDnDTargetTask(GuestDnDTarget *pTarget)
+ : mTarget(pTarget),
+ mRC(VINF_SUCCESS) { }
+
+ virtual ~GuestDnDTargetTask(void) { }
+
+ int getRC(void) const { return mRC; }
+ bool isOk(void) const { return RT_SUCCESS(mRC); }
+ const ComObjPtr<GuestDnDTarget> &getTarget(void) const { return mTarget; }
+
+protected:
+
+ const ComObjPtr<GuestDnDTarget> mTarget;
+ int mRC;
+};
+
+/**
+ * Task structure for sending data to a target using
+ * a worker thread.
+ */
+class SendDataTask : public GuestDnDTargetTask
+{
+public:
+
+ SendDataTask(GuestDnDTarget *pTarget, PSENDDATACTX pCtx)
+ : GuestDnDTargetTask(pTarget),
+ mpCtx(pCtx) { }
+
+ virtual ~SendDataTask(void)
+ {
+ if (mpCtx)
+ {
+ delete mpCtx;
+ mpCtx = NULL;
+ }
+ }
+
+
+ PSENDDATACTX getCtx(void) { return mpCtx; }
+
+protected:
+
+ /** Pointer to send data context. */
+ PSENDDATACTX mpCtx;
+};
+
// constructor / destructor
/////////////////////////////////////////////////////////////////////////////
@@ -45,6 +107,12 @@ DEFINE_EMPTY_CTOR_DTOR(GuestDnDTarget)
HRESULT GuestDnDTarget::FinalConstruct(void)
{
+ /* Set the maximum block size our guests can handle to 64K. This always has
+ * been hardcoded until now. */
+ /* Note: Never ever rely on information from the guest; the host dictates what and
+ * how to do something, so try to negogiate a sensible value here later. */
+ mData.mcbBlockSize = _64K; /** @todo Make this configurable. */
+
LogFlowThisFunc(("\n"));
return BaseFinalConstruct();
}
@@ -93,10 +161,9 @@ void GuestDnDTarget::uninit(void)
// implementation of wrapped IDnDBase methods.
/////////////////////////////////////////////////////////////////////////////
-HRESULT GuestDnDTarget::isFormatSupported(const com::Utf8Str &aFormat,
- BOOL *aSupported)
+HRESULT GuestDnDTarget::isFormatSupported(const com::Utf8Str &aFormat, BOOL *aSupported)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
@@ -105,13 +172,13 @@ HRESULT GuestDnDTarget::isFormatSupported(const com::Utf8Str &aFormat,
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- return GuestDnDBase::isFormatSupported(aFormat, aSupported);
+ return GuestDnDBase::i_isFormatSupported(aFormat, aSupported);
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
HRESULT GuestDnDTarget::getFormats(std::vector<com::Utf8Str> &aFormats)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
@@ -120,13 +187,13 @@ HRESULT GuestDnDTarget::getFormats(std::vector<com::Utf8Str> &aFormats)
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- return GuestDnDBase::getFormats(aFormats);
+ return GuestDnDBase::i_getFormats(aFormats);
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
HRESULT GuestDnDTarget::addFormats(const std::vector<com::Utf8Str> &aFormats)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
@@ -135,13 +202,13 @@ HRESULT GuestDnDTarget::addFormats(const std::vector<com::Utf8Str> &aFormats)
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- return GuestDnDBase::addFormats(aFormats);
+ return GuestDnDBase::i_addFormats(aFormats);
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
HRESULT GuestDnDTarget::removeFormats(const std::vector<com::Utf8Str> &aFormats)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
@@ -150,7 +217,22 @@ HRESULT GuestDnDTarget::removeFormats(const std::vector<com::Utf8Str> &aFormats)
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- return GuestDnDBase::removeFormats(aFormats);
+ return GuestDnDBase::i_removeFormats(aFormats);
+#endif /* VBOX_WITH_DRAG_AND_DROP */
+}
+
+HRESULT GuestDnDTarget::getProtocolVersion(ULONG *aProtocolVersion)
+{
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
+ ReturnComNotImplemented();
+#else /* VBOX_WITH_DRAG_AND_DROP */
+
+ AutoCaller autoCaller(this);
+ if (FAILED(autoCaller.rc())) return autoCaller.rc();
+
+ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ return GuestDnDBase::i_getProtocolVersion(aProtocolVersion);
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
@@ -163,7 +245,7 @@ HRESULT GuestDnDTarget::enter(ULONG aScreenId, ULONG aX, ULONG aY,
const std::vector<com::Utf8Str> &aFormats,
DnDAction_T *aResultAction)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
@@ -178,6 +260,9 @@ HRESULT GuestDnDTarget::enter(ULONG aScreenId, ULONG aX, ULONG aY,
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc())) return autoCaller.rc();
+ /* Determine guest DnD protocol to use. */
+ GuestDnDBase::getProtocolVersion(&mDataBase.mProtocolVersion);
+
/* Default action is ignoring. */
DnDAction_T resAction = DnDAction_Ignore;
@@ -202,18 +287,17 @@ HRESULT GuestDnDTarget::enter(ULONG aScreenId, ULONG aX, ULONG aY,
int rc = GuestDnDInst()->adjustScreenCoordinates(aScreenId, &aX, &aY);
if (RT_SUCCESS(rc))
{
- VBOXHGCMSVCPARM paParms[8];
- int i = 0;
- paParms[i++].setUInt32(aScreenId);
- paParms[i++].setUInt32(aX);
- paParms[i++].setUInt32(aY);
- paParms[i++].setUInt32(uDefAction);
- paParms[i++].setUInt32(uAllowedActions);
- paParms[i++].setPointer((void*)strFormats.c_str(), strFormats.length() + 1);
- paParms[i++].setUInt32(strFormats.length() + 1);
-
- rc = GuestDnDInst()->hostCall(DragAndDropSvc::HOST_DND_HG_EVT_ENTER,
- i, paParms);
+ GuestDnDMsg Msg;
+ Msg.setType(DragAndDropSvc::HOST_DND_HG_EVT_ENTER);
+ Msg.setNextUInt32(aScreenId);
+ Msg.setNextUInt32(aX);
+ Msg.setNextUInt32(aY);
+ Msg.setNextUInt32(uDefAction);
+ Msg.setNextUInt32(uAllowedActions);
+ Msg.setNextPointer((void*)strFormats.c_str(), strFormats.length() + 1);
+ Msg.setNextUInt32(strFormats.length() + 1);
+
+ rc = GuestDnDInst()->hostCall(Msg.getType(), Msg.getCount(), Msg.getParms());
if (RT_SUCCESS(rc))
{
GuestDnDResponse *pResp = GuestDnDInst()->response();
@@ -236,7 +320,7 @@ HRESULT GuestDnDTarget::move(ULONG aScreenId, ULONG aX, ULONG aY,
const std::vector<com::Utf8Str> &aFormats,
DnDAction_T *aResultAction)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
@@ -268,18 +352,17 @@ HRESULT GuestDnDTarget::move(ULONG aScreenId, ULONG aX, ULONG aY,
int rc = GuestDnDInst()->adjustScreenCoordinates(aScreenId, &aX, &aY);
if (RT_SUCCESS(rc))
{
- VBOXHGCMSVCPARM paParms[8];
- int i = 0;
- paParms[i++].setUInt32(aScreenId);
- paParms[i++].setUInt32(aX);
- paParms[i++].setUInt32(aY);
- paParms[i++].setUInt32(uDefAction);
- paParms[i++].setUInt32(uAllowedActions);
- paParms[i++].setPointer((void*)strFormats.c_str(), strFormats.length() + 1);
- paParms[i++].setUInt32(strFormats.length() + 1);
-
- rc = GuestDnDInst()->hostCall(DragAndDropSvc::HOST_DND_HG_EVT_MOVE,
- i, paParms);
+ GuestDnDMsg Msg;
+ Msg.setType(DragAndDropSvc::HOST_DND_HG_EVT_MOVE);
+ Msg.setNextUInt32(aScreenId);
+ Msg.setNextUInt32(aX);
+ Msg.setNextUInt32(aY);
+ Msg.setNextUInt32(uDefAction);
+ Msg.setNextUInt32(uAllowedActions);
+ Msg.setNextPointer((void*)strFormats.c_str(), strFormats.length() + 1);
+ Msg.setNextUInt32(strFormats.length() + 1);
+
+ rc = GuestDnDInst()->hostCall(Msg.getType(), Msg.getCount(), Msg.getParms());
if (RT_SUCCESS(rc))
{
GuestDnDResponse *pResp = GuestDnDInst()->response();
@@ -298,7 +381,7 @@ HRESULT GuestDnDTarget::move(ULONG aScreenId, ULONG aX, ULONG aY,
HRESULT GuestDnDTarget::leave(ULONG uScreenId)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
@@ -326,7 +409,7 @@ HRESULT GuestDnDTarget::drop(ULONG aScreenId, ULONG aX, ULONG aY,
const std::vector<com::Utf8Str> &aFormats,
com::Utf8Str &aFormat, DnDAction_T *aResultAction)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
@@ -361,18 +444,17 @@ HRESULT GuestDnDTarget::drop(ULONG aScreenId, ULONG aX, ULONG aY,
int rc = GuestDnDInst()->adjustScreenCoordinates(aScreenId, &aX, &aY);
if (RT_SUCCESS(rc))
{
- VBOXHGCMSVCPARM paParms[8];
- int i = 0;
- paParms[i++].setUInt32(aScreenId);
- paParms[i++].setUInt32(aX);
- paParms[i++].setUInt32(aY);
- paParms[i++].setUInt32(uDefAction);
- paParms[i++].setUInt32(uAllowedActions);
- paParms[i++].setPointer((void*)strFormats.c_str(), strFormats.length() + 1);
- paParms[i++].setUInt32(strFormats.length() + 1);
-
- rc = GuestDnDInst()->hostCall(DragAndDropSvc::HOST_DND_HG_EVT_DROPPED,
- i, paParms);
+ GuestDnDMsg Msg;
+ Msg.setType(DragAndDropSvc::HOST_DND_HG_EVT_DROPPED);
+ Msg.setNextUInt32(aScreenId);
+ Msg.setNextUInt32(aX);
+ Msg.setNextUInt32(aY);
+ Msg.setNextUInt32(uDefAction);
+ Msg.setNextUInt32(uAllowedActions);
+ Msg.setNextPointer((void*)strFormats.c_str(), strFormats.length() + 1);
+ Msg.setNextUInt32(strFormats.length() + 1);
+
+ rc = GuestDnDInst()->hostCall(Msg.getType(), Msg.getCount(), Msg.getParms());
if (RT_SUCCESS(rc))
{
GuestDnDResponse *pResp = GuestDnDInst()->response();
@@ -394,49 +476,722 @@ HRESULT GuestDnDTarget::drop(ULONG aScreenId, ULONG aX, ULONG aY,
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
-HRESULT GuestDnDTarget::sendData(ULONG aScreenId,
- const com::Utf8Str &aFormat,
- const std::vector<BYTE> &aData,
+/* static */
+DECLCALLBACK(int) GuestDnDTarget::i_sendDataThread(RTTHREAD Thread, void *pvUser)
+{
+ LogFlowFunc(("pvUser=%p\n", pvUser));
+
+ SendDataTask *pTask = (SendDataTask *)pvUser;
+ AssertPtrReturn(pTask, VERR_INVALID_POINTER);
+
+ const ComObjPtr<GuestDnDTarget> pTarget(pTask->getTarget());
+ Assert(!pTarget.isNull());
+
+ int rc;
+
+ AutoCaller autoCaller(pTarget);
+ if (SUCCEEDED(autoCaller.rc()))
+ {
+ rc = pTarget->i_sendData(pTask->getCtx(), RT_INDEFINITE_WAIT /* msTimeout */);
+ /* Nothing to do here anymore. */
+ }
+ else
+ rc = VERR_COM_INVALID_OBJECT_STATE;
+
+ ASMAtomicWriteBool(&pTarget->mDataBase.mfTransferIsPending, false);
+
+ LogFlowFunc(("pTarget=%p returning rc=%Rrc\n", (GuestDnDTarget *)pTarget, rc));
+
+ if (pTask)
+ delete pTask;
+ return rc;
+}
+
+/**
+ * Initiates a data transfer from the host to the guest. The source is the host whereas the target is the
+ * guest in this case.
+ *
+ * @return HRESULT
+ * @param aScreenId
+ * @param aFormat
+ * @param aData
+ * @param aProgress
+ */
+HRESULT GuestDnDTarget::sendData(ULONG aScreenId, const com::Utf8Str &aFormat, const std::vector<BYTE> &aData,
ComPtr<IProgress> &aProgress)
{
-#if !defined(VBOX_WITH_DRAG_AND_DROP) || !defined(VBOX_WITH_DRAG_AND_DROP_GH)
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
ReturnComNotImplemented();
#else /* VBOX_WITH_DRAG_AND_DROP */
- /* Input validation */
-
-
AutoCaller autoCaller(this);
if (FAILED(autoCaller.rc())) return autoCaller.rc();
- HRESULT hr = S_OK;
+ /* Input validation. */
+ if (RT_UNLIKELY((aFormat.c_str()) == NULL || *(aFormat.c_str()) == '\0'))
+ return setError(E_INVALIDARG, tr("No data format specified"));
+ if (RT_UNLIKELY(!aData.size()))
+ return setError(E_INVALIDARG, tr("No data to send specified"));
- VBOXHGCMSVCPARM paParms[8];
- int i = 0;
- paParms[i++].setUInt32(aScreenId);
- paParms[i++].setPointer((void *)aFormat.c_str(), (uint32_t)aFormat.length() + 1);
- paParms[i++].setUInt32((uint32_t)aFormat.length() + 1);
- paParms[i++].setPointer((void*)&aData.front(), (uint32_t)aData.size());
- paParms[i++].setUInt32((uint32_t)aData.size());
+ /* Note: At the moment we only support one transfer at a time. */
+ if (ASMAtomicReadBool(&mDataBase.mfTransferIsPending))
+ return setError(E_INVALIDARG, tr("Another send operation already is in progress"));
+ ASMAtomicWriteBool(&mDataBase.mfTransferIsPending, true);
+
+ /* Dito. */
GuestDnDResponse *pResp = GuestDnDInst()->response();
- if (pResp)
+ AssertPtr(pResp);
+
+ HRESULT hr = pResp->resetProgress(m_pGuest);
+ if (FAILED(hr))
+ return hr;
+
+ try
{
- /* Reset any old progress status. */
- pResp->resetProgress(m_pGuest);
+ PSENDDATACTX pSendCtx = new SENDDATACTX;
+ RT_BZERO(pSendCtx, sizeof(SENDDATACTX));
- /* Note: The actual data transfer of files/directoies is performed by the
- * DnD host service. */
- int rc = GuestDnDInst()->hostCall(DragAndDropSvc::HOST_DND_HG_SND_DATA,
- i, paParms);
+ pSendCtx->mpTarget = this;
+ pSendCtx->mpResp = pResp;
+ pSendCtx->mScreenID = aScreenId;
+ pSendCtx->mFormat = aFormat;
+ pSendCtx->mData.vecData = aData;
+
+ SendDataTask *pTask = new SendDataTask(this, pSendCtx);
+ AssertReturn(pTask->isOk(), pTask->getRC());
+
+ int rc = RTThreadCreate(NULL, GuestDnDTarget::i_sendDataThread,
+ (void *)pTask, 0, RTTHREADTYPE_MAIN_WORKER, 0, "dndTgtSndData");
if (RT_SUCCESS(rc))
{
hr = pResp->queryProgressTo(aProgress.asOutParam());
ComAssertComRC(hr);
+
+ /* Note: pTask is now owned by the worker thread. */
}
+ else
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Starting thread failed (%Rrc)"), rc);
+
+ if (RT_FAILURE(rc))
+ delete pSendCtx;
}
+ catch(std::bad_alloc &)
+ {
+ hr = setError(E_OUTOFMEMORY);
+ }
+
+ /* Note: mDataBase.mfTransferIsPending will be set to false again by i_sendDataThread. */
+ LogFlowFunc(("Returning hr=%Rhrc\n", hr));
return hr;
#endif /* VBOX_WITH_DRAG_AND_DROP */
}
+int GuestDnDTarget::i_cancelOperation(void)
+{
+ /** @todo Check for pending cancel requests. */
+
+#if 0 /** @todo Later. */
+ /* Cancel any outstanding waits for guest responses first. */
+ if (pResp)
+ pResp->notifyAboutGuestResponse();
+#endif
+
+ LogFlowFunc(("Cancelling operation, telling guest ...\n"));
+ return GuestDnDInst()->hostCall(DragAndDropSvc::HOST_DND_HG_EVT_CANCEL, 0 /* cParms */, NULL /*paParms*/);
+}
+
+int GuestDnDTarget::i_sendData(PSENDDATACTX pCtx, RTMSINTERVAL msTimeout)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ GuestDnD *pInst = GuestDnDInst();
+ if (!pInst)
+ return VERR_INVALID_POINTER;
+
+ int rc;
+
+ ASMAtomicWriteBool(&pCtx->mIsActive, true);
+
+ /* Clear all remaining outgoing messages. */
+ mDataBase.mListOutgoing.clear();
+
+ const char *pszFormat = pCtx->mFormat.c_str();
+ uint32_t cbFormat = pCtx->mFormat.length() + 1;
+
+ /* Do we need to build up a file tree? */
+ bool fHasURIList = DnDMIMEHasFileURLs(pszFormat, cbFormat);
+ if (fHasURIList)
+ {
+ rc = i_sendURIData(pCtx, msTimeout);
+ }
+ else
+ {
+ rc = i_sendRawData(pCtx, msTimeout);
+ }
+
+ ASMAtomicWriteBool(&pCtx->mIsActive, false);
+
+#undef DATA_IS_VALID_BREAK
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+int GuestDnDTarget::i_sendDirectory(PSENDDATACTX pCtx, GuestDnDMsg *pMsg, DnDURIObject &aDirectory)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ RTCString strPath = aDirectory.GetDestPath();
+ if (strPath.isEmpty())
+ return VERR_INVALID_PARAMETER;
+ if (strPath.length() >= RTPATH_MAX) /* Note: Maximum is RTPATH_MAX on guest side. */
+ return VERR_BUFFER_OVERFLOW;
+
+ LogFlowFunc(("Sending directory \"%s\" using protocol v%RU32 ...\n", strPath.c_str(), mDataBase.mProtocolVersion));
+
+ pMsg->setType(DragAndDropSvc::HOST_DND_HG_SND_DIR);
+ pMsg->setNextString(strPath.c_str()); /* path */
+ pMsg->setNextUInt32((uint32_t)(strPath.length() + 1)); /* path length - note: Maximum is RTPATH_MAX on guest side. */
+ pMsg->setNextUInt32(aDirectory.GetMode()); /* mode */
+
+ return VINF_SUCCESS;
+}
+
+int GuestDnDTarget::i_sendFile(PSENDDATACTX pCtx, GuestDnDMsg *pMsg, DnDURIObject &aFile)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ RTCString strPathSrc = aFile.GetSourcePath();
+ if (strPathSrc.isEmpty())
+ return VERR_INVALID_PARAMETER;
+
+ int rc = VINF_SUCCESS;
+
+ LogFlowFunc(("Sending \"%s\" (%RU32 bytes buffer) using protocol v%RU32 ...\n",
+ strPathSrc.c_str(), mData.mcbBlockSize, mDataBase.mProtocolVersion));
+
+ bool fOpen = aFile.IsOpen();
+ if (!fOpen)
+ {
+ LogFlowFunc(("Opening \"%s\" ...\n", strPathSrc.c_str()));
+ rc = aFile.OpenEx(strPathSrc, DnDURIObject::File, DnDURIObject::Source,
+ RTFILE_O_OPEN | RTFILE_O_READ | RTFILE_O_DENY_WRITE, 0 /* fFlags */);
+ if (RT_FAILURE(rc))
+ LogRel2(("DnD: Error opening host file \"%s\", rc=%Rrc\n", strPathSrc.c_str(), rc));
+ }
+
+ bool fSendFileData = false;
+ if (RT_SUCCESS(rc))
+ {
+ if (mDataBase.mProtocolVersion >= 2)
+ {
+ if (!fOpen)
+ {
+ /*
+ * Since protocol v2 the file header and the actual file contents are
+ * separate messages, so send the file header first.
+ * The just registered callback will be called by the guest afterwards.
+ */
+ pMsg->setType(DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR);
+ pMsg->setNextUInt32(0); /* context ID */
+ rc = pMsg->setNextString(aFile.GetDestPath().c_str()); /* pvName */
+ AssertRC(rc);
+ pMsg->setNextUInt32((uint32_t)(aFile.GetDestPath().length() + 1)); /* cbName */
+ pMsg->setNextUInt32(0); /* uFlags */
+ pMsg->setNextUInt32(aFile.GetMode()); /* fMode */
+ pMsg->setNextUInt64(aFile.GetSize()); /* uSize */
+
+ LogFlowFunc(("Sending file header ...\n"));
+ LogRel2(("DnD: Transferring host file to guest: %s (%RU64 bytes, mode 0x%x)\n",
+ strPathSrc.c_str(), aFile.GetSize(), aFile.GetMode()));
+
+ /** @todo Set progress object title to current file being transferred? */
+ }
+ else
+ {
+ /* File header was sent, so only send the actual file data. */
+ fSendFileData = true;
+ }
+ }
+ else /* Protocol v1. */
+ {
+ /* Always send the file data, every time. */
+ fSendFileData = true;
+ }
+ }
+
+ if ( RT_SUCCESS(rc)
+ && fSendFileData)
+ {
+ rc = i_sendFileData(pCtx, pMsg, aFile);
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+int GuestDnDTarget::i_sendFileData(PSENDDATACTX pCtx, GuestDnDMsg *pMsg, DnDURIObject &aFile)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtrReturn(pMsg, VERR_INVALID_POINTER);
+
+ GuestDnDResponse *pResp = pCtx->mpResp;
+ AssertPtr(pResp);
+
+ /** @todo Don't allow concurrent reads per context! */
+
+ /* Something to transfer? */
+ if ( pCtx->mURI.lstURI.IsEmpty()
+ || !pCtx->mIsActive)
+ {
+ return VERR_WRONG_ORDER;
+ }
+
+ /*
+ * Start sending stuff.
+ */
+
+ /* Set the message type. */
+ pMsg->setType(DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA);
+
+ /* Protocol version 1 sends the file path *every* time with a new file chunk.
+ * In protocol version 2 we only do this once with HOST_DND_HG_SND_FILE_HDR. */
+ if (mDataBase.mProtocolVersion <= 1)
+ {
+ pMsg->setNextString(aFile.GetSourcePath().c_str()); /* pvName */
+ pMsg->setNextUInt32((uint32_t)(aFile.GetSourcePath().length() + 1)); /* cbName */
+ }
+ else
+ {
+ /* Protocol version 2 also sends the context ID. Currently unused. */
+ pMsg->setNextUInt32(0); /* context ID */
+ }
+
+ uint32_t cbRead = 0;
+
+ int rc = aFile.Read(pCtx->mURI.pvScratchBuf, pCtx->mURI.cbScratchBuf, &cbRead);
+ if (RT_SUCCESS(rc))
+ {
+ pCtx->mData.cbProcessed += cbRead;
+
+ if (mDataBase.mProtocolVersion <= 1)
+ {
+ pMsg->setNextPointer(pCtx->mURI.pvScratchBuf, cbRead); /* pvData */
+ pMsg->setNextUInt32(cbRead); /* cbData */
+ pMsg->setNextUInt32(aFile.GetMode()); /* fMode */
+ }
+ else
+ {
+ pMsg->setNextPointer(pCtx->mURI.pvScratchBuf, cbRead); /* pvData */
+ pMsg->setNextUInt32(cbRead); /* cbData */
+ }
+
+ if (aFile.IsComplete()) /* Done reading? */
+ {
+ LogRel2(("DnD: File transfer to guest complete: %s\n", aFile.GetSourcePath().c_str()));
+ LogFlowFunc(("File \"%s\" complete\n", aFile.GetSourcePath().c_str()));
+ rc = VINF_EOF;
+ }
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+/* static */
+DECLCALLBACK(int) GuestDnDTarget::i_sendURIDataCallback(uint32_t uMsg, void *pvParms, size_t cbParms, void *pvUser)
+{
+ PSENDDATACTX pCtx = (PSENDDATACTX)pvUser;
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ GuestDnDTarget *pThis = pCtx->mpTarget;
+ AssertPtrReturn(pThis, VERR_INVALID_POINTER);
+
+ LogFlowFunc(("pThis=%p, uMsg=%RU32\n", pThis, uMsg));
+
+ int rc = VINF_SUCCESS;
+
+ switch (uMsg)
+ {
+ case DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG:
+ {
+ DragAndDropSvc::PVBOXDNDCBHGGETNEXTHOSTMSG pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBHGGETNEXTHOSTMSG>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGGETNEXTHOSTMSG) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_GET_NEXT_HOST_MSG == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ try
+ {
+ GuestDnDMsg *pMsg = new GuestDnDMsg();
+
+ rc = pThis->i_sendURIDataLoop(pCtx, pMsg);
+ if (RT_SUCCESS(rc))
+ {
+ rc = pThis->msgQueueAdd(pMsg);
+ if (RT_SUCCESS(rc)) /* Return message type & required parameter count to the guest. */
+ {
+ LogFlowFunc(("GUEST_DND_GET_NEXT_HOST_MSG -> %RU32 (%RU32 params)\n", pMsg->getType(), pMsg->getCount()));
+ pCBData->uMsg = pMsg->getType();
+ pCBData->cParms = pMsg->getCount();
+ }
+ }
+
+ if (RT_FAILURE(rc))
+ delete pMsg;
+ }
+ catch(std::bad_alloc & /*e*/)
+ {
+ rc = VERR_NO_MEMORY;
+ }
+ break;
+ }
+ case DragAndDropSvc::GUEST_DND_GH_EVT_ERROR:
+ {
+ DragAndDropSvc::PVBOXDNDCBEVTERRORDATA pCBData = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBEVTERRORDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBEVTERRORDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_GH_EVT_ERROR == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ pCtx->mpResp->reset();
+ rc = pCtx->mpResp->setProgress(100, DragAndDropSvc::DND_PROGRESS_ERROR, pCBData->rc);
+ if (RT_SUCCESS(rc))
+ rc = pCBData->rc;
+ break;
+ }
+ case DragAndDropSvc::HOST_DND_HG_SND_DIR:
+ case DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR:
+ case DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA:
+ {
+ DragAndDropSvc::PVBOXDNDCBHGGETNEXTHOSTMSGDATA pCBData
+ = reinterpret_cast<DragAndDropSvc::PVBOXDNDCBHGGETNEXTHOSTMSGDATA>(pvParms);
+ AssertPtr(pCBData);
+ AssertReturn(sizeof(DragAndDropSvc::VBOXDNDCBHGGETNEXTHOSTMSGDATA) == cbParms, VERR_INVALID_PARAMETER);
+ AssertReturn(DragAndDropSvc::CB_MAGIC_DND_HG_GET_NEXT_HOST_MSG_DATA == pCBData->hdr.u32Magic, VERR_INVALID_PARAMETER);
+
+ LogFlowFunc(("pCBData->uMsg=%RU32, paParms=%p, cParms=%RU32\n", pCBData->uMsg, pCBData->paParms, pCBData->cParms));
+
+ GuestDnDMsg *pMsg = pThis->msgQueueGetNext();
+ if (pMsg)
+ {
+ /*
+ * Sanity checks.
+ */
+ if ( pCBData->uMsg != uMsg
+ || pCBData->paParms == NULL
+ || pCBData->cParms != pMsg->getCount())
+ {
+ /* Start over. */
+ pThis->msgQueueClear();
+
+ rc = VERR_INVALID_PARAMETER;
+ }
+
+ if (RT_SUCCESS(rc))
+ {
+ LogFlowFunc(("Returning uMsg=%RU32\n", uMsg));
+ rc = HGCM::Message::copyParms(pMsg->getCount(), pMsg->getParms(), pCBData->paParms);
+ if (RT_SUCCESS(rc))
+ {
+ pCBData->cParms = pMsg->getCount();
+ pThis->msgQueueRemoveNext();
+ }
+ else
+ LogFlowFunc(("Copying parameters failed with rc=%Rrc\n", rc));
+ }
+ }
+ else
+ rc = VERR_NO_DATA;
+
+ LogFlowFunc(("Processing next message ended with rc=%Rrc\n", rc));
+ break;
+ }
+ default:
+ rc = VERR_NOT_SUPPORTED;
+ break;
+ }
+
+ if (RT_FAILURE(rc))
+ {
+ switch (rc)
+ {
+ case VERR_NO_DATA:
+ LogRel2(("DnD: Transfer complete\n"));
+ break;
+
+ case VERR_CANCELLED:
+ LogRel2(("DnD: Transfer canceled\n"));
+ break;
+
+ default:
+ LogRel(("DnD: Error %Rrc occurred, aborting transfer\n", rc));
+ break;
+ }
+
+ /* Unregister this callback. */
+ AssertPtr(pCtx->mpResp);
+ int rc2 = pCtx->mpResp->setCallback(uMsg, NULL /* PFNGUESTDNDCALLBACK */);
+ AssertRC(rc2);
+
+ /* Notify waiters. */
+ rc2 = pCtx->mCallback.Notify(rc);
+ AssertRC(rc2);
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc; /* Tell the guest. */
+}
+
+int GuestDnDTarget::i_sendURIData(PSENDDATACTX pCtx, RTMSINTERVAL msTimeout)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ AssertPtr(pCtx->mpResp);
+
+#define URI_DATA_IS_VALID_BREAK(x) \
+ if (!x) \
+ { \
+ LogFlowFunc(("Invalid URI data value for \"" #x "\"\n")); \
+ rc = VERR_INVALID_PARAMETER; \
+ break; \
+ }
+
+ void *pvBuf = RTMemAlloc(mData.mcbBlockSize);
+ if (!pvBuf)
+ return VERR_NO_MEMORY;
+
+ int rc;
+
+#define REGISTER_CALLBACK(x) \
+ rc = pCtx->mpResp->setCallback(x, i_sendURIDataCallback, pCtx); \
+ if (RT_FAILURE(rc)) \
+ return rc;
+
+#define UNREGISTER_CALLBACK(x) \
+ { \
+ int rc2 = pCtx->mpResp->setCallback(x, NULL); \
+ AssertRC(rc2); \
+ }
+
+ rc = pCtx->mCallback.Reset();
+ if (RT_FAILURE(rc))
+ return rc;
+
+ /*
+ * Register callbacks.
+ */
+ /* Guest callbacks. */
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG);
+ REGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_EVT_ERROR);
+ /* Host callbacks. */
+ REGISTER_CALLBACK(DragAndDropSvc::HOST_DND_HG_SND_DIR);
+ if (mDataBase.mProtocolVersion >= 2)
+ REGISTER_CALLBACK(DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR);
+ REGISTER_CALLBACK(DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA);
+
+ do
+ {
+ /*
+ * Set our scratch buffer.
+ */
+ pCtx->mURI.pvScratchBuf = pvBuf;
+ pCtx->mURI.cbScratchBuf = mData.mcbBlockSize;
+
+ /*
+ * Extract URI list from byte data.
+ */
+ DnDURIList &lstURI = pCtx->mURI.lstURI; /* Use the URI list from the context. */
+
+ const char *pszList = (const char *)&pCtx->mData.vecData.front();
+ URI_DATA_IS_VALID_BREAK(pszList);
+
+ uint32_t cbList = pCtx->mData.vecData.size();
+ URI_DATA_IS_VALID_BREAK(cbList);
+
+ RTCList<RTCString> lstURIOrg = RTCString(pszList, cbList).split("\r\n");
+ URI_DATA_IS_VALID_BREAK(!lstURIOrg.isEmpty());
+
+ rc = lstURI.AppendURIPathsFromList(lstURIOrg, 0 /* fFlags */);
+ if (RT_SUCCESS(rc))
+ LogFlowFunc(("URI root objects: %zu, total bytes (raw data to transfer): %zu\n",
+ lstURI.RootCount(), lstURI.TotalBytes()));
+ else
+ break;
+
+ pCtx->mData.cbProcessed = 0;
+ pCtx->mData.cbToProcess = lstURI.TotalBytes();
+
+ /*
+ * The first message always is the meta info for the data. The meta
+ * info *only* contains the root elements of an URI list.
+ *
+ * After the meta data we generate the messages required to send the data itself.
+ */
+ Assert(!lstURI.IsEmpty());
+ RTCString strData = lstURI.RootToString().c_str();
+ size_t cbData = strData.length() + 1; /* Include terminating zero. */
+
+ GuestDnDMsg MsgSndData;
+ MsgSndData.setType(DragAndDropSvc::HOST_DND_HG_SND_DATA);
+ MsgSndData.setNextUInt32(pCtx->mScreenID);
+ MsgSndData.setNextPointer((void *)pCtx->mFormat.c_str(), (uint32_t)pCtx->mFormat.length() + 1);
+ MsgSndData.setNextUInt32((uint32_t)pCtx->mFormat.length() + 1);
+ MsgSndData.setNextPointer((void*)strData.c_str(), (uint32_t)cbData);
+ MsgSndData.setNextUInt32((uint32_t)cbData);
+
+ rc = GuestDnDInst()->hostCall(MsgSndData.getType(), MsgSndData.getCount(), MsgSndData.getParms());
+ if (RT_SUCCESS(rc))
+ rc = waitForEvent(msTimeout, pCtx->mCallback, pCtx->mpResp);
+
+ } while (0);
+
+ /*
+ * Unregister callbacks.
+ */
+ /* Guest callbacks. */
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GET_NEXT_HOST_MSG);
+ UNREGISTER_CALLBACK(DragAndDropSvc::GUEST_DND_GH_EVT_ERROR);
+ /* Host callbacks. */
+ UNREGISTER_CALLBACK(DragAndDropSvc::HOST_DND_HG_SND_DIR);
+ if (mDataBase.mProtocolVersion >= 2)
+ UNREGISTER_CALLBACK(DragAndDropSvc::HOST_DND_HG_SND_FILE_HDR);
+ UNREGISTER_CALLBACK(DragAndDropSvc::HOST_DND_HG_SND_FILE_DATA);
+
+#undef REGISTER_CALLBACK
+#undef UNREGISTER_CALLBACK
+
+ /*
+ * Now that we've cleaned up tell the guest side to cancel.
+ */
+ if (rc == VERR_CANCELLED)
+ {
+ int rc2 = sendCancel();
+ AssertRC(rc2);
+ }
+
+ /* Destroy temporary scratch buffer. */
+ if (pvBuf)
+ RTMemFree(pvBuf);
+
+#undef URI_DATA_IS_VALID_BREAK
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+int GuestDnDTarget::i_sendURIDataLoop(PSENDDATACTX pCtx, GuestDnDMsg *pMsg)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+
+ DnDURIList &lstURI = pCtx->mURI.lstURI;
+
+ int rc;
+
+ uint64_t cbTotal = pCtx->mData.cbToProcess;
+ uint8_t uPercent = pCtx->mData.cbProcessed * 100 / (cbTotal ? cbTotal : 1);
+
+ LogFlowFunc(("%RU64 / %RU64 -- %RU8%%\n", pCtx->mData.cbProcessed, cbTotal, uPercent));
+
+ bool fComplete = (uPercent >= 100) || lstURI.IsEmpty();
+
+ if (pCtx->mpResp)
+ {
+ int rc2 = pCtx->mpResp->setProgress(uPercent,
+ fComplete
+ ? DragAndDropSvc::DND_PROGRESS_COMPLETE
+ : DragAndDropSvc::DND_PROGRESS_RUNNING);
+ AssertRC(rc2);
+ }
+
+ if (fComplete)
+ {
+ LogFlowFunc(("Last URI item processed, bailing out\n"));
+ return VERR_NO_DATA;
+ }
+
+ Assert(!lstURI.IsEmpty());
+ DnDURIObject &curObj = lstURI.First();
+
+ uint32_t fMode = curObj.GetMode();
+ LogFlowFunc(("Processing srcPath=%s, dstPath=%s, fMode=0x%x, cbSize=%RU32, fIsDir=%RTbool, fIsFile=%RTbool\n",
+ curObj.GetSourcePath().c_str(), curObj.GetDestPath().c_str(),
+ fMode, curObj.GetSize(),
+ RTFS_IS_DIRECTORY(fMode), RTFS_IS_FILE(fMode)));
+
+ if (RTFS_IS_DIRECTORY(fMode))
+ {
+ rc = i_sendDirectory(pCtx, pMsg, curObj);
+ }
+ else if (RTFS_IS_FILE(fMode))
+ {
+ rc = i_sendFile(pCtx, pMsg, curObj);
+ }
+ else
+ {
+ AssertMsgFailed(("fMode=0x%x is not supported for srcPath=%s, dstPath=%s\n",
+ fMode, curObj.GetSourcePath().c_str(), curObj.GetDestPath().c_str()));
+ rc = VERR_NOT_SUPPORTED;
+ }
+
+ bool fRemove = false; /* Remove current entry? */
+ if ( curObj.IsComplete()
+ || RT_FAILURE(rc))
+ {
+ fRemove = true;
+ }
+
+ if (fRemove)
+ {
+ LogFlowFunc(("Removing \"%s\" from list, rc=%Rrc\n", curObj.GetSourcePath().c_str(), rc));
+ lstURI.RemoveFirst();
+ }
+
+ LogFlowFuncLeaveRC(rc);
+ return rc;
+}
+
+int GuestDnDTarget::i_sendRawData(PSENDDATACTX pCtx, RTMSINTERVAL msTimeout)
+{
+ AssertPtrReturn(pCtx, VERR_INVALID_POINTER);
+ NOREF(msTimeout);
+
+ GuestDnD *pInst = GuestDnDInst();
+ AssertPtr(pInst);
+
+ /* At the moment we only allow up to 64K raw data. */
+ size_t cbDataTotal = pCtx->mData.vecData.size();
+ if ( !cbDataTotal
+ || cbDataTotal > _64K)
+ {
+ return VERR_INVALID_PARAMETER;
+ }
+
+ /* Just copy over the raw data. */
+ GuestDnDMsg Msg;
+ Msg.setType(DragAndDropSvc::HOST_DND_HG_SND_DATA);
+ Msg.setNextUInt32(pCtx->mScreenID);
+ Msg.setNextPointer((void *)pCtx->mFormat.c_str(), (uint32_t)pCtx->mFormat.length() + 1);
+ Msg.setNextUInt32((uint32_t)pCtx->mFormat.length() + 1);
+ Msg.setNextPointer((void*)&pCtx->mData.vecData.front(), (uint32_t)cbDataTotal);
+ Msg.setNextUInt32(cbDataTotal);
+
+ LogFlowFunc(("%zu total bytes of raw data to transfer\n", cbDataTotal));
+
+ return pInst->hostCall(Msg.getType(), Msg.getCount(), Msg.getParms());
+}
+
+HRESULT GuestDnDTarget::cancel(BOOL *aVeto)
+{
+#if !defined(VBOX_WITH_DRAG_AND_DROP)
+ ReturnComNotImplemented();
+#else /* VBOX_WITH_DRAG_AND_DROP */
+
+ int rc = i_cancelOperation();
+
+ if (aVeto)
+ *aVeto = FALSE; /** @todo */
+
+ return RT_SUCCESS(rc) ? S_OK : VBOX_E_IPRT_ERROR;
+#endif /* VBOX_WITH_DRAG_AND_DROP */
+}
+
diff --git a/src/VBox/Main/src-client/GuestFileImpl.cpp b/src/VBox/Main/src-client/GuestFileImpl.cpp
index 52881f9..1c1fca0 100644
--- a/src/VBox/Main/src-client/GuestFileImpl.cpp
+++ b/src/VBox/Main/src-client/GuestFileImpl.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2012-2013 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -19,6 +19,9 @@
/*******************************************************************************
* Header Files *
*******************************************************************************/
+#ifndef VBOX_WITH_GUEST_CONTROL
+# error "VBOX_WITH_GUEST_CONTROL must defined in this file"
+#endif
#include "GuestFileImpl.h"
#include "GuestSessionImpl.h"
#include "GuestCtrlImplPrivate.h"
@@ -145,10 +148,6 @@ int GuestFile::init(Console *pConsole, GuestSession *pSession,
AutoInitSpan autoInitSpan(this);
AssertReturn(autoInitSpan.isOk(), VERR_OBJECT_DESTROYED);
-#ifndef VBOX_WITH_GUEST_CONTROL
- autoInitSpan.setSucceeded();
- return VINF_SUCCESS;
-#else
int vrc = bindToSession(pConsole, pSession, uFileID /* Object ID */);
if (RT_SUCCESS(vrc))
{
@@ -215,7 +214,6 @@ int GuestFile::init(Console *pConsole, GuestSession *pSession,
LogFlowFuncLeaveRC(vrc);
return vrc;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
/**
@@ -231,9 +229,7 @@ void GuestFile::uninit(void)
LogFlowThisFuncEnter();
-#ifdef VBOX_WITH_GUEST_CONTROL
baseUninit();
-#endif
LogFlowThisFuncLeave();
}
@@ -242,112 +238,77 @@ void GuestFile::uninit(void)
HRESULT GuestFile::getCreationMode(ULONG *aCreationMode)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
*aCreationMode = mData.mOpenInfo.mCreationMode;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestFile::getDisposition(com::Utf8Str &aDisposition)
+HRESULT GuestFile::getOpenAction(FileOpenAction_T *aOpenAction)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- aDisposition = mData.mOpenInfo.mDisposition;
+ *aOpenAction = mData.mOpenInfo.mOpenAction;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::getEventSource(ComPtr<IEventSource> &aEventSource)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
/* No need to lock - lifetime constant. */
mEventSource.queryInterfaceTo(aEventSource.asOutParam());
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::getFileName(com::Utf8Str &aFileName)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
aFileName = mData.mOpenInfo.mFileName;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::getId(ULONG *aId)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
*aId = mData.mID;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::getInitialSize(LONG64 *aInitialSize)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
*aInitialSize = mData.mInitialSize;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::getOffset(LONG64 *aOffset)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
*aOffset = mData.mOffCurrent;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestFile::getOpenMode(com::Utf8Str &aOpenMode)
+HRESULT GuestFile::getAccessMode(FileAccessMode_T *aAccessMode)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- aOpenMode = mData.mOpenInfo.mOpenMode;
+ *aAccessMode = mData.mOpenInfo.mAccessMode;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::getStatus(FileStatus_T *aStatus)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -355,7 +316,6 @@ HRESULT GuestFile::getStatus(FileStatus_T *aStatus)
*aStatus = mData.mStatus;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
// private methods
@@ -514,16 +474,9 @@ int GuestFile::i_onFileNotify(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXGUESTCTRLHOST
{
pSvcCbData->mpaParms[idx++].getUInt32(&dataCb.u.open.uHandle);
- {
- AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- AssertMsg(mData.mID == VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCbCtx->uContextID),
- ("File ID %RU32 does not match context ID %RU32\n", mData.mID,
- VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCbCtx->uContextID)));
-
- /* Set the initial offset. On the guest the whole opening operation
- * would fail if an initial seek isn't possible. */
- mData.mOffCurrent = mData.mOpenInfo.mInitialOffset;
- }
+ AssertMsg(mData.mID == VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCbCtx->uContextID),
+ ("File ID %RU32 does not match context ID %RU32\n", mData.mID,
+ VBOX_GUESTCTRL_CONTEXTID_GET_OBJECT(pCbCtx->uContextID)));
/* Set the process status. */
int rc2 = i_setFileStatus(FileStatus_Open, guestRc);
@@ -693,9 +646,10 @@ int GuestFile::i_openFile(uint32_t uTimeoutMS, int *pGuestRc)
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- LogFlowThisFunc(("strFile=%s, strOpenMode=%s, strDisposition=%s, uCreationMode=%RU32, uOffset=%RU64\n",
- mData.mOpenInfo.mFileName.c_str(), mData.mOpenInfo.mOpenMode.c_str(),
- mData.mOpenInfo.mDisposition.c_str(), mData.mOpenInfo.mCreationMode, mData.mOpenInfo.mInitialOffset));
+ LogFlowThisFunc(("strFile=%s, enmAccessMode=%d (%s) enmOpenAction=%d (%s) uCreationMode=%RU32, mfOpenEx=%RU32\n",
+ mData.mOpenInfo.mFileName.c_str(), mData.mOpenInfo.mAccessMode, mData.mOpenInfo.mpszAccessMode,
+ mData.mOpenInfo.mOpenAction, mData.mOpenInfo.mpszOpenAction, mData.mOpenInfo.mCreationMode,
+ mData.mOpenInfo.mfOpenEx));
int vrc;
GuestWaitEvent *pEvent = NULL;
@@ -720,14 +674,12 @@ int GuestFile::i_openFile(uint32_t uTimeoutMS, int *pGuestRc)
paParms[i++].setUInt32(pEvent->ContextID());
paParms[i++].setPointer((void*)mData.mOpenInfo.mFileName.c_str(),
(ULONG)mData.mOpenInfo.mFileName.length() + 1);
- paParms[i++].setPointer((void*)mData.mOpenInfo.mOpenMode.c_str(),
- (ULONG)mData.mOpenInfo.mOpenMode.length() + 1);
- paParms[i++].setPointer((void*)mData.mOpenInfo.mDisposition.c_str(),
- (ULONG)mData.mOpenInfo.mDisposition.length() + 1);
- paParms[i++].setPointer((void*)mData.mOpenInfo.mSharingMode.c_str(),
- (ULONG)mData.mOpenInfo.mSharingMode.length() + 1);
+ paParms[i++].setString(mData.mOpenInfo.mpszAccessMode);
+ paParms[i++].setString(mData.mOpenInfo.mpszOpenAction);
+ paParms[i++].setString(""); /** @todo sharing mode. */
paParms[i++].setUInt32(mData.mOpenInfo.mCreationMode);
- paParms[i++].setUInt64(mData.mOpenInfo.mInitialOffset);
+ paParms[i++].setUInt64(0 /* initial offset */);
+ /** @todo Next protocol version: add flags, replace strings, remove initial offset. */
alock.release(); /* Drop write lock before sending. */
@@ -1225,9 +1177,6 @@ int GuestFile::i_writeDataAt(uint64_t uOffset, uint32_t uTimeoutMS,
/////////////////////////////////////////////////////////////////////////////
HRESULT GuestFile::close()
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
/* Close file on guest. */
@@ -1252,23 +1201,20 @@ HRESULT GuestFile::close()
LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::queryInfo(ComPtr<IFsObjInfo> &aObjInfo)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
ReturnComNotImplemented();
-#else
+}
+
+HRESULT GuestFile::querySize(LONG64 *aSize)
+{
ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::read(ULONG aToRead, ULONG aTimeoutMS, std::vector<BYTE> &aData)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
if (aToRead == 0)
return setError(E_INVALIDARG, tr("The size to read is zero"));
@@ -1301,14 +1247,10 @@ HRESULT GuestFile::read(ULONG aToRead, ULONG aTimeoutMS, std::vector<BYTE> &aDat
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::readAt(LONG64 aOffset, ULONG aToRead, ULONG aTimeoutMS, std::vector<BYTE> &aData)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
if (aToRead == 0)
return setError(E_INVALIDARG, tr("The size to read is zero"));
@@ -1340,14 +1282,10 @@ HRESULT GuestFile::readAt(LONG64 aOffset, ULONG aToRead, ULONG aTimeoutMS, std::
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestFile::seek(LONG64 aOffset, FileSeekType_T aWhence)
+HRESULT GuestFile::seek(LONG64 aOffset, FileSeekOrigin_T aWhence, LONG64 *aNewOffset)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
HRESULT hr = S_OK;
@@ -1355,22 +1293,29 @@ HRESULT GuestFile::seek(LONG64 aOffset, FileSeekType_T aWhence)
GUEST_FILE_SEEKTYPE eSeekType;
switch (aWhence)
{
- case FileSeekType_Set:
+ case FileSeekOrigin_Begin:
eSeekType = GUEST_FILE_SEEKTYPE_BEGIN;
break;
- case FileSeekType_Current:
+ case FileSeekOrigin_Current:
eSeekType = GUEST_FILE_SEEKTYPE_CURRENT;
break;
+ case FileSeekOrigin_End:
+ eSeekType = GUEST_FILE_SEEKTYPE_END;
+ break;
+
default:
return setError(E_INVALIDARG, tr("Invalid seek type specified"));
break; /* Never reached. */
}
+ uint64_t uNewOffset;
int vrc = i_seekAt(aOffset, eSeekType,
- 30 * 1000 /* 30s timeout */, NULL /* puOffset */);
- if (RT_FAILURE(vrc))
+ 30 * 1000 /* 30s timeout */, &uNewOffset);
+ if (RT_SUCCESS(vrc))
+ *aNewOffset = RT_MIN(uNewOffset, (uint64_t)INT64_MAX);
+ else
{
switch (vrc)
{
@@ -1384,23 +1329,20 @@ HRESULT GuestFile::seek(LONG64 aOffset, FileSeekType_T aWhence)
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestFile::setACL(const com::Utf8Str &aAcl)
+HRESULT GuestFile::setACL(const com::Utf8Str &aAcl, ULONG aMode)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
ReturnComNotImplemented();
-#else
+}
+
+HRESULT GuestFile::setSize(LONG64 aSize)
+{
ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::write(const std::vector<BYTE> &aData, ULONG aTimeoutMS, ULONG *aWritten)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
HRESULT hr = S_OK;
@@ -1423,15 +1365,11 @@ HRESULT GuestFile::write(const std::vector<BYTE> &aData, ULONG aTimeoutMS, ULONG
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFile::writeAt(LONG64 aOffset, const std::vector<BYTE> &aData, ULONG aTimeoutMS, ULONG *aWritten)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
HRESULT hr = S_OK;
@@ -1454,6 +1392,5 @@ HRESULT GuestFile::writeAt(LONG64 aOffset, const std::vector<BYTE> &aData, ULONG
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
diff --git a/src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp b/src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp
index 66ad751..8112cab 100644
--- a/src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp
+++ b/src/VBox/Main/src-client/GuestFsObjInfoImpl.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2012-2014 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -19,6 +19,9 @@
/*******************************************************************************
* Header Files *
*******************************************************************************/
+#ifndef VBOX_WITH_GUEST_CONTROL
+# error "VBOX_WITH_GUEST_CONTROL must defined in this file"
+#endif
#include "GuestFsObjInfoImpl.h"
#include "GuestCtrlImplPrivate.h"
@@ -62,7 +65,7 @@ int GuestFsObjInfo::init(const GuestFsObjData &objData)
/* Enclose the state transition NotReady->InInit->Ready. */
AutoInitSpan autoInitSpan(this);
- AssertReturn(autoInitSpan.isOk(), E_FAIL);
+ AssertReturn(autoInitSpan.isOk(), E_FAIL); /** @todo r=bird: returning COM or IPRT status codes here?*/
mData = objData;
@@ -91,230 +94,136 @@ void GuestFsObjInfo::uninit(void)
HRESULT GuestFsObjInfo::getAccessTime(LONG64 *aAccessTime)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aAccessTime = mData.mAccessTime;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getAllocatedSize(LONG64 *aAllocatedSize)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aAllocatedSize = mData.mAllocatedSize;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getBirthTime(LONG64 *aBirthTime)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aBirthTime = mData.mBirthTime;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getChangeTime(LONG64 *aChangeTime)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aChangeTime = mData.mChangeTime;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getDeviceNumber(ULONG *aDeviceNumber)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aDeviceNumber = mData.mDeviceNumber;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getFileAttributes(com::Utf8Str &aFileAttributes)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
aFileAttributes = mData.mFileAttrs;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getGenerationId(ULONG *aGenerationId)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aGenerationId = mData.mGenerationID;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getGID(ULONG *aGID)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aGID = mData.mGID;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getGroupName(com::Utf8Str &aGroupName)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
aGroupName = mData.mGroupName;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getHardLinks(ULONG *aHardLinks)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aHardLinks = mData.mNumHardLinks;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getModificationTime(LONG64 *aModificationTime)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aModificationTime = mData.mModificationTime;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getName(com::Utf8Str &aName)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
aName = mData.mName;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getNodeId(LONG64 *aNodeId)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aNodeId = mData.mNodeID;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getNodeIdDevice(ULONG *aNodeIdDevice)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aNodeIdDevice = mData.mNodeIDDevice;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getObjectSize(LONG64 *aObjectSize)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aObjectSize = mData.mObjectSize;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getType(FsObjType_T *aType)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aType = mData.mType;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getUID(ULONG *aUID)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aUID = mData.mUID;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getUserFlags(ULONG *aUserFlags)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
*aUserFlags = mData.mUserFlags;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestFsObjInfo::getUserName(com::Utf8Str &aUserName)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
aUserName = mData.mUserName;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
+
diff --git a/src/VBox/Main/src-client/GuestImpl.cpp b/src/VBox/Main/src-client/GuestImpl.cpp
index d783984..4f26b2a 100644
--- a/src/VBox/Main/src-client/GuestImpl.cpp
+++ b/src/VBox/Main/src-client/GuestImpl.cpp
@@ -16,8 +16,9 @@
*/
#include "GuestImpl.h"
-#include "GuestSessionImpl.h"
-
+#ifdef VBOX_WITH_GUEST_CONTROL
+# include "GuestSessionImpl.h"
+#endif
#include "Global.h"
#include "ConsoleImpl.h"
#include "ProgressImpl.h"
@@ -108,13 +109,9 @@ HRESULT Guest::init(Console *aParent)
&Guest::i_staticUpdateStats, this);
AssertMsgRC(vrc, ("Failed to create guest statistics update timer (%Rrc)\n", vrc));
-#ifdef VBOX_WITH_GUEST_CONTROL
hr = unconst(mEventSource).createObject();
if (SUCCEEDED(hr))
hr = mEventSource->init();
-#else
- hr = S_OK;
-#endif
#ifdef VBOX_WITH_DRAG_AND_DROP
try
@@ -184,9 +181,7 @@ void Guest::uninit()
unconst(mDnDTarget).setNull();
#endif
-#ifdef VBOX_WITH_GUEST_CONTROL
unconst(mEventSource).setNull();
-#endif
unconst(mParent) = NULL;
LogFlowFuncLeave();
@@ -516,9 +511,6 @@ HRESULT Guest::getDnDTarget(ComPtr<IGuestDnDTarget> &aDnDTarget)
HRESULT Guest::getEventSource(ComPtr<IEventSource> &aEventSource)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
/* No need to lock - lifetime constant. */
@@ -526,7 +518,6 @@ HRESULT Guest::getEventSource(ComPtr<IEventSource> &aEventSource)
LogFlowFuncLeaveRC(S_OK);
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT Guest::getFacilities(std::vector<ComPtr<IAdditionsFacility> > &aFacilities)
@@ -543,6 +534,7 @@ HRESULT Guest::getFacilities(std::vector<ComPtr<IAdditionsFacility> > &aFaciliti
HRESULT Guest::getSessions(std::vector<ComPtr<IGuestSession> > &aSessions)
{
+#ifdef VBOX_WITH_GUEST_CONTROL
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
aSessions.resize(mData.mGuestSessions.size());
@@ -551,6 +543,9 @@ HRESULT Guest::getSessions(std::vector<ComPtr<IGuestSession> > &aSessions)
it->second.queryInterfaceTo(aSessions[i].asOutParam());
return S_OK;
+#else
+ ReturnComNotImplemented();
+#endif
}
BOOL Guest::i_isPageFusionEnabled()
@@ -897,6 +892,7 @@ void Guest::i_setAdditionsInfo(com::Utf8Str aInterfaceVersion, VBOXOSTYPE aOsTyp
* mSupportsGraphics here and disabling/enabling it later according to
* its real status when using new(er) Guest Additions.
*/
+ mData.mOSType = aOsType;
mData.mOSTypeId = Global::OSTypeId(aOsType);
}
@@ -995,11 +991,11 @@ void Guest::i_facilityUpdate(VBoxGuestFacilityType a_enmFacility, VBoxGuestFacil
* @param aUser Guest user name.
* @param aDomain Domain of guest user account. Optional.
* @param enmState New state to indicate.
- * @param puDetails Pointer to state details. Optional.
+ * @param pbDetails Pointer to state details. Optional.
* @param cbDetails Size (in bytes) of state details. Pass 0 if not used.
*/
void Guest::i_onUserStateChange(Bstr aUser, Bstr aDomain, VBoxGuestUserState enmState,
- const uint8_t *puDetails, uint32_t cbDetails)
+ const uint8_t *pbDetails, uint32_t cbDetails)
{
LogFlowThisFunc(("\n"));
diff --git a/src/VBox/Main/src-client/GuestProcessImpl.cpp b/src/VBox/Main/src-client/GuestProcessImpl.cpp
index 541b01b..e1b9036 100644
--- a/src/VBox/Main/src-client/GuestProcessImpl.cpp
+++ b/src/VBox/Main/src-client/GuestProcessImpl.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2012-2013 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -27,6 +27,9 @@
/*******************************************************************************
* Header Files *
*******************************************************************************/
+#ifndef VBOX_WITH_GUEST_CONTROL
+# error "VBOX_WITH_GUEST_CONTROL must defined in this file"
+#endif
#include "GuestProcessImpl.h"
#include "GuestSessionImpl.h"
#include "GuestCtrlImplPrivate.h"
@@ -161,11 +164,11 @@ void GuestProcess::FinalRelease(void)
// public initializer/uninitializer for internal purposes only
/////////////////////////////////////////////////////////////////////////////
-int GuestProcess::init(Console *aConsole, GuestSession *aSession,
- ULONG aProcessID, const GuestProcessStartupInfo &aProcInfo)
+int GuestProcess::init(Console *aConsole, GuestSession *aSession, ULONG aProcessID,
+ const GuestProcessStartupInfo &aProcInfo, const GuestEnvironment *pBaseEnv)
{
- LogFlowThisFunc(("aConsole=%p, aSession=%p, aProcessID=%RU32\n",
- aConsole, aSession, aProcessID));
+ LogFlowThisFunc(("aConsole=%p, aSession=%p, aProcessID=%RU32 pBaseEnv=%p\n",
+ aConsole, aSession, aProcessID, pBaseEnv));
AssertPtrReturn(aConsole, VERR_INVALID_POINTER);
AssertPtrReturn(aSession, VERR_INVALID_POINTER);
@@ -174,10 +177,6 @@ int GuestProcess::init(Console *aConsole, GuestSession *aSession,
AutoInitSpan autoInitSpan(this);
AssertReturn(autoInitSpan.isOk(), VERR_OBJECT_DESTROYED);
-#ifndef VBOX_WITH_GUEST_CONTROL
- autoInitSpan.setSucceeded();
- return VINF_SUCCESS;
-#else
HRESULT hr;
int vrc = bindToSession(aConsole, aSession, aProcessID /* Object ID */);
@@ -236,6 +235,9 @@ int GuestProcess::init(Console *aConsole, GuestSession *aSession,
if (RT_SUCCESS(vrc))
{
mData.mProcess = aProcInfo;
+ mData.mpSessionBaseEnv = pBaseEnv;
+ if (pBaseEnv)
+ pBaseEnv->retainConst();
mData.mExitCode = 0;
mData.mPID = 0;
mData.mLastError = VINF_SUCCESS;
@@ -250,7 +252,6 @@ int GuestProcess::init(Console *aConsole, GuestSession *aSession,
autoInitSpan.setFailed();
return vrc;
-#endif
}
/**
@@ -264,9 +265,7 @@ void GuestProcess::uninit(void)
if (autoUninitSpan.uninitDone())
return;
-#ifdef VBOX_WITH_GUEST_CONTROL
- LogFlowThisFunc(("mCmd=%s, PID=%RU32\n",
- mData.mProcess.mCommand.c_str(), mData.mPID));
+ LogFlowThisFunc(("mExe=%s, PID=%RU32\n", mData.mProcess.mExecutable.c_str(), mData.mPID));
/* Terminate process if not already done yet. */
int guestRc = VINF_SUCCESS;
@@ -274,46 +273,63 @@ void GuestProcess::uninit(void)
/* Note: Don't return here yet; first uninit all other stuff in
* case of failure. */
+ if (mData.mpSessionBaseEnv)
+ {
+ mData.mpSessionBaseEnv->releaseConst();
+ mData.mpSessionBaseEnv = NULL;
+ }
+
baseUninit();
LogFlowThisFunc(("Returning rc=%Rrc, guestRc=%Rrc\n",
vrc, guestRc));
-#endif
}
// implementation of public getters/setters for attributes
/////////////////////////////////////////////////////////////////////////////
HRESULT GuestProcess::getArguments(std::vector<com::Utf8Str> &aArguments)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
aArguments = mData.mProcess.mArguments;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::getEnvironment(std::vector<com::Utf8Str> &aEnvironment)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
+#ifndef VBOX_WTIH_GUEST_CONTROL
ReturnComNotImplemented();
#else
- LogFlowThisFuncEnter();
-
- AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- mData.mProcess.mEnvironment.CopyTo(aEnvironment);
- return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
+ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); /* (Paranoia since both environment objects are immutable.) */
+ HRESULT hrc;
+ if (mData.mpSessionBaseEnv)
+ {
+ int vrc;
+ if (mData.mProcess.mEnvironmentChanges.count() == 0)
+ vrc = mData.mpSessionBaseEnv->queryPutEnvArray(&aEnvironment);
+ else
+ {
+ GuestEnvironment TmpEnv;
+ vrc = TmpEnv.copy(*mData.mpSessionBaseEnv);
+ if (RT_SUCCESS(vrc))
+ {
+ vrc = TmpEnv.applyChanges(mData.mProcess.mEnvironmentChanges);
+ if (RT_SUCCESS(rc))
+ vrc = TmpEnv.queryPutEnvArray(&aEnvironment);
+ }
+ }
+ hrc = Global::vboxStatusCodeToCOM(vrc);
+ }
+ else
+ hrc = setError(VBOX_E_NOT_SUPPORTED, tr("The base environment feature is not supported by the guest additions"));
+ LogFlowThisFuncLeave();
+ return hrc;
+#endif
}
HRESULT GuestProcess::getEventSource(ComPtr<IEventSource> &aEventSource)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
// no need to lock - lifetime constant
@@ -321,29 +337,21 @@ HRESULT GuestProcess::getEventSource(ComPtr<IEventSource> &aEventSource)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::getExecutablePath(com::Utf8Str &aExecutablePath)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- aExecutablePath = mData.mProcess.mCommand;
+ aExecutablePath = mData.mProcess.mExecutable;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::getExitCode(LONG *aExitCode)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -351,14 +359,10 @@ HRESULT GuestProcess::getExitCode(LONG *aExitCode)
*aExitCode = mData.mExitCode;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::getName(com::Utf8Str &aName)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -366,14 +370,10 @@ HRESULT GuestProcess::getName(com::Utf8Str &aName)
aName = mData.mProcess.mName;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::getPID(ULONG *aPID)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -381,14 +381,10 @@ HRESULT GuestProcess::getPID(ULONG *aPID)
*aPID = mData.mPID;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::getStatus(ProcessStatus_T *aStatus)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -396,7 +392,6 @@ HRESULT GuestProcess::getStatus(ProcessStatus_T *aStatus)
*aStatus = mData.mStatus;
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
// private methods
@@ -986,8 +981,8 @@ HRESULT GuestProcess::i_setErrorExternal(VirtualBoxBase *pInterface, int guestRc
int GuestProcess::i_startProcess(uint32_t uTimeoutMS, int *pGuestRc)
{
- LogFlowThisFunc(("uTimeoutMS=%RU32, procCmd=%s, procTimeoutMS=%RU32, procFlags=%x, sessionID=%RU32\n",
- uTimeoutMS, mData.mProcess.mCommand.c_str(), mData.mProcess.mTimeoutMS, mData.mProcess.mFlags,
+ LogFlowThisFunc(("uTimeoutMS=%RU32, procExe=%s, procTimeoutMS=%RU32, procFlags=%x, sessionID=%RU32\n",
+ uTimeoutMS, mData.mProcess.mExecutable.c_str(), mData.mProcess.mTimeoutMS, mData.mProcess.mFlags,
mSession->i_getId()));
/* Wait until the caller function (if kicked off by a thread)
@@ -1016,9 +1011,11 @@ int GuestProcess::i_startProcess(uint32_t uTimeoutMS, int *pGuestRc)
GuestSession *pSession = mSession;
AssertPtr(pSession);
+ uint32_t const uProtocol = pSession->i_getProtocolVersion();
const GuestCredentials &sessionCreds = pSession->i_getCredentials();
+
/* Prepare arguments. */
char *pszArgs = NULL;
size_t cArgs = mData.mProcess.mArguments.size();
@@ -1028,27 +1025,22 @@ int GuestProcess::i_startProcess(uint32_t uTimeoutMS, int *pGuestRc)
if ( RT_SUCCESS(vrc)
&& cArgs)
{
- char **papszArgv = (char**)RTMemAlloc((cArgs + 1) * sizeof(char*));
+ char const **papszArgv = (char const **)RTMemAlloc((cArgs + 1) * sizeof(papszArgv[0]));
AssertReturn(papszArgv, VERR_NO_MEMORY);
- for (size_t i = 0; i < cArgs && RT_SUCCESS(vrc); i++)
+ for (size_t i = 0; i < cArgs; i++)
{
- const char *pszCurArg = mData.mProcess.mArguments[i].c_str();
- AssertPtr(pszCurArg);
- vrc = RTStrDupEx(&papszArgv[i], pszCurArg);
+ papszArgv[i] = mData.mProcess.mArguments[i].c_str();
+ AssertPtr(papszArgv[i]);
}
papszArgv[cArgs] = NULL;
- if (RT_SUCCESS(vrc))
- vrc = RTGetOptArgvToString(&pszArgs, papszArgv, RTGETOPTARGV_CNV_QUOTE_MS_CRT);
+ if (uProtocol < UINT32_C(0xdeadbeef) ) /** @todo implement a way of sending argv[0], best idea is a new command. */
+ vrc = RTGetOptArgvToString(&pszArgs, papszArgv + 1, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH);
+ else
+ vrc = RTGetOptArgvToString(&pszArgs, papszArgv, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH);
- if (papszArgv)
- {
- size_t i = 0;
- while (papszArgv[i])
- RTStrFree(papszArgv[i++]);
- RTMemFree(papszArgv);
- }
+ RTMemFree(papszArgv);
}
/* Calculate arguments size (in bytes). */
@@ -1056,36 +1048,34 @@ int GuestProcess::i_startProcess(uint32_t uTimeoutMS, int *pGuestRc)
if (RT_SUCCESS(vrc))
cbArgs = pszArgs ? strlen(pszArgs) + 1 : 0; /* Include terminating zero. */
- /* Prepare environment. */
- void *pvEnv = NULL;
- size_t cbEnv = 0;
+ /* Prepare environment. The guest service dislikes the empty string at the end, so drop it. */
+ size_t cbEnvBlock;
+ char *pszzEnvBlock;
if (RT_SUCCESS(vrc))
- vrc = mData.mProcess.mEnvironment.BuildEnvironmentBlock(&pvEnv, &cbEnv, NULL /* cEnv */);
-
+ vrc = mData.mProcess.mEnvironmentChanges.queryUtf8Block(&pszzEnvBlock, &cbEnvBlock);
if (RT_SUCCESS(vrc))
{
- AssertPtr(mSession);
- uint32_t uProtocol = mSession->i_getProtocolVersion();
+ Assert(cbEnvBlock > 0);
+ cbEnvBlock--;
/* Prepare HGCM call. */
VBOXHGCMSVCPARM paParms[16];
int i = 0;
paParms[i++].setUInt32(pEvent->ContextID());
- paParms[i++].setPointer((void*)mData.mProcess.mCommand.c_str(),
- (ULONG)mData.mProcess.mCommand.length() + 1);
+ paParms[i++].setCppString(mData.mProcess.mExecutable);
paParms[i++].setUInt32(mData.mProcess.mFlags);
paParms[i++].setUInt32((uint32_t)mData.mProcess.mArguments.size());
- paParms[i++].setPointer((void*)pszArgs, (uint32_t)cbArgs);
- paParms[i++].setUInt32((uint32_t)mData.mProcess.mEnvironment.Size());
- paParms[i++].setUInt32((uint32_t)cbEnv);
- paParms[i++].setPointer((void*)pvEnv, (uint32_t)cbEnv);
+ paParms[i++].setPointer(pszArgs, (uint32_t)cbArgs);
+ paParms[i++].setUInt32(mData.mProcess.mEnvironmentChanges.count());
+ paParms[i++].setUInt32((uint32_t)cbEnvBlock);
+ paParms[i++].setPointer(pszzEnvBlock, (uint32_t)cbEnvBlock);
if (uProtocol < 2)
{
/* In protocol v1 (VBox < 4.3) the credentials were part of the execution
* call. In newer protocols these credentials are part of the opened guest
* session, so not needed anymore here. */
- paParms[i++].setPointer((void*)sessionCreds.mUser.c_str(), (ULONG)sessionCreds.mUser.length() + 1);
- paParms[i++].setPointer((void*)sessionCreds.mPassword.c_str(), (ULONG)sessionCreds.mPassword.length() + 1);
+ paParms[i++].setCppString(sessionCreds.mUser);
+ paParms[i++].setCppString(sessionCreds.mPassword);
}
/*
* If the WaitForProcessStartOnly flag is set, we only want to define and wait for a timeout
@@ -1104,7 +1094,7 @@ int GuestProcess::i_startProcess(uint32_t uTimeoutMS, int *pGuestRc)
* so that makes up to 64 CPUs total. This can be more in the future. */
paParms[i++].setUInt32(1);
/* The actual CPU affinity blocks. */
- paParms[i++].setPointer((void*)&mData.mProcess.mAffinity, sizeof(mData.mProcess.mAffinity));
+ paParms[i++].setPointer((void *)&mData.mProcess.mAffinity, sizeof(mData.mProcess.mAffinity));
}
alock.release(); /* Drop the write lock before sending. */
@@ -1115,9 +1105,10 @@ int GuestProcess::i_startProcess(uint32_t uTimeoutMS, int *pGuestRc)
int rc2 = i_setProcessStatus(ProcessStatus_Error, vrc);
AssertRC(rc2);
}
+
+ mData.mProcess.mEnvironmentChanges.freeUtf8Block(pszzEnvBlock);
}
- GuestEnvironment::FreeEnvironmentBlock(pvEnv);
if (pszArgs)
RTStrFree(pszArgs);
@@ -1277,10 +1268,10 @@ ProcessWaitResult_T GuestProcess::i_waitFlagsToResultEx(uint32_t fWaitFlags,
else
{
/*
- * If ProcessCreateFlag_WaitForProcessStartOnly was specified on process creation the
- * caller is not interested in getting further process statuses -- so just don't notify
- * anything here anymore and return.
- */
+ * If ProcessCreateFlag_WaitForProcessStartOnly was specified on process creation the
+ * caller is not interested in getting further process statuses -- so just don't notify
+ * anything here anymore and return.
+ */
if (uProcFlags & ProcessCreateFlag_WaitForProcessStartOnly)
waitResult = ProcessWaitResult_Start;
}
@@ -1314,7 +1305,8 @@ ProcessWaitResult_T GuestProcess::i_waitFlagsToResultEx(uint32_t fWaitFlags,
if (newStatus == ProcessStatus_Started)
{
- /* Filter out waits which are *not* supported using
+ /**
+ * Filter out waits which are *not* supported using
* older guest control Guest Additions.
*
** @todo ProcessWaitForFlag_Std* flags are not implemented yet.
@@ -1731,9 +1723,6 @@ int GuestProcess::i_writeData(uint32_t uHandle, uint32_t uFlags,
HRESULT GuestProcess::read(ULONG aHandle, ULONG aToRead, ULONG aTimeoutMS, std::vector<BYTE> &aData)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (aToRead == 0)
@@ -1763,7 +1752,7 @@ HRESULT GuestProcess::read(ULONG aHandle, ULONG aToRead, ULONG aTimeoutMS, std::
default:
hr = setError(VBOX_E_IPRT_ERROR,
tr("Reading from process \"%s\" (PID %RU32) failed: %Rrc"),
- mData.mProcess.mCommand.c_str(), mData.mPID, vrc);
+ mData.mProcess.mExecutable.c_str(), mData.mPID, vrc);
break;
}
}
@@ -1772,15 +1761,10 @@ HRESULT GuestProcess::read(ULONG aHandle, ULONG aToRead, ULONG aTimeoutMS, std::
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::terminate()
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
HRESULT hr = S_OK;
int guestRc;
@@ -1797,13 +1781,13 @@ HRESULT GuestProcess::terminate()
case VERR_NOT_SUPPORTED:
hr = setError(VBOX_E_IPRT_ERROR,
tr("Terminating process \"%s\" (PID %RU32) not supported by installed Guest Additions"),
- mData.mProcess.mCommand.c_str(), mData.mPID);
+ mData.mProcess.mExecutable.c_str(), mData.mPID);
break;
default:
hr = setError(VBOX_E_IPRT_ERROR,
tr("Terminating process \"%s\" (PID %RU32) failed: %Rrc"),
- mData.mProcess.mCommand.c_str(), mData.mPID, vrc);
+ mData.mProcess.mExecutable.c_str(), mData.mPID, vrc);
break;
}
}
@@ -1817,23 +1801,19 @@ HRESULT GuestProcess::terminate()
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::waitFor(ULONG aWaitFor,
ULONG aTimeoutMS,
ProcessWaitResult_T *aReason)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
/*
* Note: Do not hold any locks here while waiting!
*/
HRESULT hr = S_OK;
- int guestRc; ProcessWaitResult_T waitResult;
+ int guestRc;
+ ProcessWaitResult_T waitResult;
int vrc = i_waitFor(aWaitFor, aTimeoutMS, waitResult, &guestRc);
if (RT_SUCCESS(vrc))
{
@@ -1854,22 +1834,18 @@ HRESULT GuestProcess::waitFor(ULONG aWaitFor,
default:
hr = setError(VBOX_E_IPRT_ERROR,
tr("Waiting for process \"%s\" (PID %RU32) failed: %Rrc"),
- mData.mProcess.mCommand.c_str(), mData.mPID, vrc);
+ mData.mProcess.mExecutable.c_str(), mData.mPID, vrc);
break;
}
}
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::waitForArray(const std::vector<ProcessWaitForFlag_T> &aWaitFor,
ULONG aTimeoutMS, ProcessWaitResult_T *aReason)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
/*
* Note: Do not hold any locks here while waiting!
*/
@@ -1878,15 +1854,11 @@ HRESULT GuestProcess::waitForArray(const std::vector<ProcessWaitForFlag_T> &aWai
fWaitFor |= aWaitFor[i];
return WaitFor(fWaitFor, aTimeoutMS, aReason);
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::write(ULONG aHandle, ULONG aFlags, const std::vector<BYTE> &aData,
ULONG aTimeoutMS, ULONG *aWritten)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
HRESULT hr = S_OK;
@@ -1906,7 +1878,7 @@ HRESULT GuestProcess::write(ULONG aHandle, ULONG aFlags, const std::vector<BYTE>
default:
hr = setError(VBOX_E_IPRT_ERROR,
tr("Writing to process \"%s\" (PID %RU32) failed: %Rrc"),
- mData.mProcess.mCommand.c_str(), mData.mPID, vrc);
+ mData.mProcess.mExecutable.c_str(), mData.mPID, vrc);
break;
}
}
@@ -1917,15 +1889,11 @@ HRESULT GuestProcess::write(ULONG aHandle, ULONG aFlags, const std::vector<BYTE>
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestProcess::writeArray(ULONG aHandle, const std::vector<ProcessInputFlag_T> &aFlags,
const std::vector<BYTE> &aData, ULONG aTimeoutMS, ULONG *aWritten)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
/*
@@ -1936,7 +1904,6 @@ HRESULT GuestProcess::writeArray(ULONG aHandle, const std::vector<ProcessInputFl
fWrite |= aFlags[i];
return write(aHandle, fWrite, aData, aTimeoutMS, aWritten);
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
///////////////////////////////////////////////////////////////////////////////
@@ -1955,8 +1922,8 @@ GuestProcessTool::~GuestProcessTool(void)
int GuestProcessTool::Init(GuestSession *pGuestSession, const GuestProcessStartupInfo &startupInfo,
bool fAsync, int *pGuestRc)
{
- LogFlowThisFunc(("pGuestSession=%p, szCmd=%s, fAsync=%RTbool\n",
- pGuestSession, startupInfo.mCommand.c_str(), fAsync));
+ LogFlowThisFunc(("pGuestSession=%p, exe=%s, fAsync=%RTbool\n",
+ pGuestSession, startupInfo.mExecutable.c_str(), fAsync));
AssertPtrReturn(pGuestSession, VERR_INVALID_POINTER);
@@ -1966,7 +1933,7 @@ int GuestProcessTool::Init(GuestSession *pGuestSession, const GuestProcessStartu
/* Make sure the process is hidden. */
mStartupInfo.mFlags |= ProcessCreateFlag_Hidden;
- int vrc = pSession->i_processCreateExInteral(mStartupInfo, pProcess);
+ int vrc = pSession->i_processCreateExInternal(mStartupInfo, pProcess);
if (RT_SUCCESS(vrc))
vrc = fAsync
? pProcess->i_startProcessAsync()
@@ -2039,6 +2006,14 @@ int GuestProcessTool::i_run( GuestSession *pGuestSession,
pGuestRc);
}
+/**
+ * <Someone write documentation, pretty please!>
+ *
+ * @param pGuestRc Optional. Will be set to VINF_SUCCESS,
+ * VERR_NOT_EQUAL or VERR_INVALID_STATE if the
+ * process completed. Should it fail earlier that,
+ * you're feel free to enlighten the rest of us...
+ */
/* static */
int GuestProcessTool::i_runEx( GuestSession *pGuestSession,
const GuestProcessStartupInfo &startupInfo,
diff --git a/src/VBox/Main/src-client/GuestSessionImpl.cpp b/src/VBox/Main/src-client/GuestSessionImpl.cpp
index d48f2fe..1af0bfb 100644
--- a/src/VBox/Main/src-client/GuestSessionImpl.cpp
+++ b/src/VBox/Main/src-client/GuestSessionImpl.cpp
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2012-2014 Oracle Corporation
+ * Copyright (C) 2012-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -20,6 +20,9 @@
* Header Files *
*******************************************************************************/
#include "GuestImpl.h"
+#ifndef VBOX_WITH_GUEST_CONTROL
+# error "VBOX_WITH_GUEST_CONTROL must defined in this file"
+#endif
#include "GuestSessionImpl.h"
#include "GuestCtrlImplPrivate.h"
#include "VirtualBoxErrorInfoImpl.h"
@@ -176,12 +179,11 @@ int GuestSession::init(Guest *pGuest, const GuestSessionStartupInfo &ssInfo,
AutoInitSpan autoInitSpan(this);
AssertReturn(autoInitSpan.isOk(), VERR_OBJECT_DESTROYED);
-#ifndef VBOX_WITH_GUEST_CONTROL
- autoInitSpan.setSucceeded();
- return VINF_SUCCESS;
-#else
AssertPtrReturn(pGuest, VERR_INVALID_POINTER);
+ /*
+ * Initialize our data members from the input.
+ */
mParent = pGuest;
/* Copy over startup info. */
@@ -197,74 +199,69 @@ int GuestSession::init(Guest *pGuest, const GuestSessionStartupInfo &ssInfo,
mData.mCredentials.mPassword = guestCreds.mPassword;
mData.mCredentials.mDomain = guestCreds.mDomain;
+ /* Initialize the remainder of the data. */
mData.mRC = VINF_SUCCESS;
mData.mStatus = GuestSessionStatus_Undefined;
mData.mNumObjects = 0;
-
- HRESULT hr;
-
- int rc = i_queryInfo();
+ mData.mpBaseEnvironment = NULL;
+ int rc = mData.mEnvironmentChanges.initChangeRecord();
if (RT_SUCCESS(rc))
{
- hr = unconst(mEventSource).createObject();
- if (FAILED(hr))
- rc = VERR_NO_MEMORY;
- else
- {
- hr = mEventSource->init();
- if (FAILED(hr))
- rc = VERR_COM_UNEXPECTED;
- }
+ rc = RTCritSectInit(&mWaitEventCritSect);
+ AssertRC(rc);
}
-
+ if (RT_SUCCESS(rc))
+ rc = i_determineProtocolVersion();
if (RT_SUCCESS(rc))
{
- try
+ /*
+ * <Replace this if you figure out what the code is doing.>
+ */
+ HRESULT hr = unconst(mEventSource).createObject();
+ if (SUCCEEDED(hr))
+ hr = mEventSource->init();
+ if (SUCCEEDED(hr))
{
- GuestSessionListener *pListener = new GuestSessionListener();
- ComObjPtr<GuestSessionListenerImpl> thisListener;
- hr = thisListener.createObject();
- if (SUCCEEDED(hr))
- hr = thisListener->init(pListener, this);
-
- if (SUCCEEDED(hr))
+ try
{
- com::SafeArray <VBoxEventType_T> eventTypes;
- eventTypes.push_back(VBoxEventType_OnGuestSessionStateChanged);
- hr = mEventSource->RegisterListener(thisListener,
- ComSafeArrayAsInParam(eventTypes),
- TRUE /* Active listener */);
+ GuestSessionListener *pListener = new GuestSessionListener();
+ ComObjPtr<GuestSessionListenerImpl> thisListener;
+ hr = thisListener.createObject();
+ if (SUCCEEDED(hr))
+ hr = thisListener->init(pListener, this);
if (SUCCEEDED(hr))
{
- mLocalListener = thisListener;
-
- rc = RTCritSectInit(&mWaitEventCritSect);
- AssertRC(rc);
+ com::SafeArray <VBoxEventType_T> eventTypes;
+ eventTypes.push_back(VBoxEventType_OnGuestSessionStateChanged);
+ hr = mEventSource->RegisterListener(thisListener,
+ ComSafeArrayAsInParam(eventTypes),
+ TRUE /* Active listener */);
+ if (SUCCEEDED(hr))
+ {
+ mLocalListener = thisListener;
+
+ /*
+ * Mark this object as operational and return success.
+ */
+ autoInitSpan.setSucceeded();
+ LogFlowThisFunc(("mName=%s mID=%RU32 mIsInternal=%RTbool rc=VINF_SUCCESS\n",
+ mData.mSession.mName.c_str(), mData.mSession.mID, mData.mSession.mIsInternal));
+ return VINF_SUCCESS;
+ }
}
- else
- rc = VERR_COM_UNEXPECTED;
}
- else
- rc = VERR_COM_UNEXPECTED;
- }
- catch(std::bad_alloc &)
- {
- rc = VERR_NO_MEMORY;
+ catch (std::bad_alloc &)
+ {
+ hr = E_OUTOFMEMORY;
+ }
}
+ rc = Global::vboxStatusCodeFromCOM(hr);
}
- if (RT_SUCCESS(rc))
- {
- /* Confirm a successful initialization when it's the case. */
- autoInitSpan.setSucceeded();
- }
- else
- autoInitSpan.setFailed();
-
- LogFlowThisFunc(("mName=%s, mID=%RU32, mIsInternal=%RTbool, rc=%Rrc\n",
- mData.mSession.mName.c_str(), mData.mSession.mID, mData.mSession.mIsInternal, rc));
+ autoInitSpan.setFailed();
+ LogThisFunc(("Failed! mName=%s mID=%RU32 mIsInternal=%RTbool => rc=%Rrc\n",
+ mData.mSession.mName.c_str(), mData.mSession.mID, mData.mSession.mIsInternal, rc));
return rc;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
/**
@@ -282,7 +279,6 @@ void GuestSession::uninit(void)
int rc = VINF_SUCCESS;
-#ifdef VBOX_WITH_GUEST_CONTROL
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
LogFlowThisFunc(("Closing directories (%zu total)\n",
@@ -321,11 +317,19 @@ void GuestSession::uninit(void)
}
mData.mProcesses.clear();
+ mData.mEnvironmentChanges.reset();
+
+ if (mData.mpBaseEnvironment)
+ {
+ mData.mpBaseEnvironment->releaseConst();
+ mData.mpBaseEnvironment = NULL;
+ }
+
AssertMsg(mData.mNumObjects == 0,
("mNumObjects=%RU32 when it should be 0\n", mData.mNumObjects));
baseUninit();
-#endif /* VBOX_WITH_GUEST_CONTROL */
+
LogFlowFuncLeaveRC(rc);
}
@@ -334,10 +338,6 @@ void GuestSession::uninit(void)
HRESULT GuestSession::getUser(com::Utf8Str &aUser)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -346,14 +346,10 @@ HRESULT GuestSession::getUser(com::Utf8Str &aUser)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::getDomain(com::Utf8Str &aDomain)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -362,14 +358,10 @@ HRESULT GuestSession::getDomain(com::Utf8Str &aDomain)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::getName(com::Utf8Str &aName)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -378,14 +370,10 @@ HRESULT GuestSession::getName(com::Utf8Str &aName)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::getId(ULONG *aId)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -394,14 +382,10 @@ HRESULT GuestSession::getId(ULONG *aId)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::getStatus(GuestSessionStatus_T *aStatus)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -410,14 +394,10 @@ HRESULT GuestSession::getStatus(GuestSessionStatus_T *aStatus)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::getTimeout(ULONG *aTimeout)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -426,14 +406,10 @@ HRESULT GuestSession::getTimeout(ULONG *aTimeout)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::setTimeout(ULONG aTimeout)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -442,14 +418,10 @@ HRESULT GuestSession::setTimeout(ULONG aTimeout)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::getProtocolVersion(ULONG *aProtocolVersion)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -458,57 +430,55 @@ HRESULT GuestSession::getProtocolVersion(ULONG *aProtocolVersion)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::getEnvironment(std::vector<com::Utf8Str> &aEnvironment)
+HRESULT GuestSession::getEnvironmentChanges(std::vector<com::Utf8Str> &aEnvironmentChanges)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
- size_t cEnvVars = mData.mEnvironment.Size();
- aEnvironment.resize(cEnvVars);
-
- LogFlowThisFunc(("[%s]: cEnvVars=%RU32\n",
- mData.mSession.mName.c_str(), cEnvVars));
+ int vrc = mData.mEnvironmentChanges.queryPutEnvArray(&aEnvironmentChanges);
- for (size_t i = 0; i < cEnvVars; i++)
- aEnvironment[i] = mData.mEnvironment.Get(i);
-
- LogFlowThisFuncLeave();
- return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
+ LogFlowFuncLeaveRC(vrc);
+ return Global::vboxStatusCodeToCOM(vrc);
}
-HRESULT GuestSession::setEnvironment(const std::vector<com::Utf8Str> &aEnvironment)
+HRESULT GuestSession::setEnvironmentChanges(const std::vector<com::Utf8Str> &aEnvironmentChanges)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- int rc = VINF_SUCCESS;
- for (size_t i = 0; i < aEnvironment.size() && RT_SUCCESS(rc); ++i)
- if (!aEnvironment[i].isEmpty()) /* Silently skip empty entries. */
- rc = mData.mEnvironment.Set(aEnvironment[i]);
+ mData.mEnvironmentChanges.reset();
+ int vrc = mData.mEnvironmentChanges.applyPutEnvArray(aEnvironmentChanges);
- HRESULT hr = RT_SUCCESS(rc) ? S_OK : VBOX_E_IPRT_ERROR;
- LogFlowFuncLeaveRC(hr);
- return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
+ LogFlowFuncLeaveRC(vrc);
+ return Global::vboxStatusCodeToCOM(vrc);
+}
+
+HRESULT GuestSession::getEnvironmentBase(std::vector<com::Utf8Str> &aEnvironmentBase)
+{
+ LogFlowThisFuncEnter();
+
+ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+ HRESULT hrc;
+ if (mData.mpBaseEnvironment)
+ {
+ int vrc = mData.mpBaseEnvironment->queryPutEnvArray(&aEnvironmentBase);
+ hrc = Global::vboxStatusCodeToCOM(vrc);
+ }
+ else if (mData.mProtocolVersion < 99999)
+ hrc = setError(VBOX_E_NOT_SUPPORTED, tr("The base environment feature is not supported by the guest additions"));
+ else
+ hrc = setError(VBOX_E_INVALID_OBJECT_STATE, tr("The base environment has not yet been reported by the guest"));
+
+ LogFlowFuncLeave();
+ return hrc;
}
HRESULT GuestSession::getProcesses(std::vector<ComPtr<IGuestProcess> > &aProcesses)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -524,14 +494,41 @@ HRESULT GuestSession::getProcesses(std::vector<ComPtr<IGuestProcess> > &aProcess
LogFlowFunc(("mProcesses=%zu\n", aProcesses.size()));
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::getDirectories(std::vector<ComPtr<IGuestDirectory> > &aDirectories)
+HRESULT GuestSession::getPathStyle(PathStyle_T *aPathStyle)
+{
+ VBOXOSTYPE enmOsType = mParent->i_getGuestOSType();
+ if ( enmOsType < VBOXOSTYPE_DOS)
+ {
+ *aPathStyle = PathStyle_Unknown;
+ LogFlowFunc(("returns PathStyle_Unknown\n"));
+ }
+ else if (enmOsType < VBOXOSTYPE_Linux)
+ {
+ *aPathStyle = PathStyle_DOS;
+ LogFlowFunc(("returns PathStyle_DOS\n"));
+ }
+ else
+ {
+ *aPathStyle = PathStyle_UNIX;
+ LogFlowFunc(("returns PathStyle_UNIX\n"));
+ }
+ return S_OK;
+}
+
+HRESULT GuestSession::getCurrentDirectory(com::Utf8Str &aCurrentDirectory)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
ReturnComNotImplemented();
-#else
+}
+
+HRESULT GuestSession::setCurrentDirectory(const com::Utf8Str &aCurrentDirectory)
+{
+ ReturnComNotImplemented();
+}
+
+HRESULT GuestSession::getDirectories(std::vector<ComPtr<IGuestDirectory> > &aDirectories)
+{
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -547,14 +544,10 @@ HRESULT GuestSession::getDirectories(std::vector<ComPtr<IGuestDirectory> > &aDir
LogFlowFunc(("mDirectories=%zu\n", aDirectories.size()));
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::getFiles(std::vector<ComPtr<IGuestFile> > &aFiles)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -567,14 +560,10 @@ HRESULT GuestSession::getFiles(std::vector<ComPtr<IGuestFile> > &aFiles)
LogFlowFunc(("mDirectories=%zu\n", aFiles.size()));
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::getEventSource(ComPtr<IEventSource> &aEventSource)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
// no need to lock - lifetime constant
@@ -582,7 +571,6 @@ HRESULT GuestSession::getEventSource(ComPtr<IEventSource> &aEventSource)
LogFlowThisFuncLeave();
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
// private methods
@@ -660,8 +648,8 @@ int GuestSession::i_directoryCreateInternal(const Utf8Str &strPath, uint32_t uMo
int vrc = VINF_SUCCESS;
GuestProcessStartupInfo procInfo;
- procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_MKDIR);
- procInfo.mFlags = ProcessCreateFlag_Hidden;
+ procInfo.mExecutable = Utf8Str(VBOXSERVICE_TOOL_MKDIR);
+ procInfo.mFlags = ProcessCreateFlag_Hidden;
try
{
@@ -686,6 +674,7 @@ int GuestSession::i_directoryCreateInternal(const Utf8Str &strPath, uint32_t uMo
else
vrc = VERR_BUFFER_OVERFLOW;
}
+ procInfo.mArguments.push_back("--"); /* '--version' is a valid directory name. */
procInfo.mArguments.push_back(strPath); /* The directory we want to create. */
}
catch (std::bad_alloc)
@@ -712,11 +701,12 @@ inline bool GuestSession::i_directoryExists(uint32_t uDirID, ComObjPtr<GuestDire
return false;
}
-int GuestSession::i_directoryQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc)
+int GuestSession::i_directoryQueryInfoInternal(const Utf8Str &strPath, bool fFollowSymlinks,
+ GuestFsObjData &objData, int *pGuestRc)
{
- LogFlowThisFunc(("strPath=%s\n", strPath.c_str()));
+ LogFlowThisFunc(("strPath=%s fFollowSymlinks=%RTbool\n", strPath.c_str(), fFollowSymlinks));
- int vrc = i_fsQueryInfoInternal(strPath, objData, pGuestRc);
+ int vrc = i_fsQueryInfoInternal(strPath, fFollowSymlinks, objData, pGuestRc);
if (RT_SUCCESS(vrc))
{
vrc = objData.mType == FsObjType_Directory
@@ -815,8 +805,8 @@ int GuestSession::i_objectCreateTempInternal(const Utf8Str &strTemplate, const U
int vrc = VINF_SUCCESS;
GuestProcessStartupInfo procInfo;
- procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_MKTEMP);
- procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
+ procInfo.mExecutable = Utf8Str(VBOXSERVICE_TOOL_MKTEMP);
+ procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
try
{
@@ -828,6 +818,7 @@ int GuestSession::i_objectCreateTempInternal(const Utf8Str &strTemplate, const U
procInfo.mArguments.push_back(Utf8Str("-t"));
procInfo.mArguments.push_back(strPath);
}
+ procInfo.mArguments.push_back("--"); /* strTemplate could be '--help'. */
procInfo.mArguments.push_back(strTemplate);
}
catch (std::bad_alloc)
@@ -1216,12 +1207,13 @@ int GuestSession::i_fileRemoveInternal(const Utf8Str &strPath, int *pGuestRc)
GuestProcessStartupInfo procInfo;
GuestProcessStream streamOut;
- procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_RM);
- procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
+ procInfo.mExecutable = Utf8Str(VBOXSERVICE_TOOL_RM);
+ procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
try
{
procInfo.mArguments.push_back(Utf8Str("--machinereadable"));
+ procInfo.mArguments.push_back("--"); /* strPath could be '--help', which is a valid filename. */
procInfo.mArguments.push_back(strPath); /* The file we want to remove. */
}
catch (std::bad_alloc)
@@ -1239,9 +1231,9 @@ int GuestSession::i_fileRemoveInternal(const Utf8Str &strPath, int *pGuestRc)
int GuestSession::i_fileOpenInternal(const GuestFileOpenInfo &openInfo,
ComObjPtr<GuestFile> &pFile, int *pGuestRc)
{
- LogFlowThisFunc(("strPath=%s, strOpenMode=%s, strDisposition=%s, uCreationMode=%x, uOffset=%RU64\n",
- openInfo.mFileName.c_str(), openInfo.mOpenMode.c_str(), openInfo.mDisposition.c_str(),
- openInfo.mCreationMode, openInfo.mInitialOffset));
+ LogFlowThisFunc(("strFile=%s, enmAccessMode=%d (%s) enmOpenAction=%d (%s) uCreationMode=%RU32 mfOpenEx=%RU32\n",
+ openInfo.mFileName.c_str(), openInfo.mAccessMode, openInfo.mpszAccessMode,
+ openInfo.mOpenAction, openInfo.mpszOpenAction, openInfo.mCreationMode, openInfo.mfOpenEx));
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -1338,11 +1330,11 @@ int GuestSession::i_fileOpenInternal(const GuestFileOpenInfo &openInfo,
return rc;
}
-int GuestSession::i_fileQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc)
+int GuestSession::i_fileQueryInfoInternal(const Utf8Str &strPath, bool fFollowSymlinks, GuestFsObjData &objData, int *pGuestRc)
{
- LogFlowThisFunc(("strPath=%s\n", strPath.c_str()));
+ LogFlowThisFunc(("strPath=%s fFollowSymlinks=%RTbool\n", strPath.c_str(), fFollowSymlinks));
- int vrc = i_fsQueryInfoInternal(strPath, objData, pGuestRc);
+ int vrc = i_fsQueryInfoInternal(strPath, fFollowSymlinks, objData, pGuestRc);
if (RT_SUCCESS(vrc))
{
vrc = objData.mType == FsObjType_File
@@ -1353,19 +1345,28 @@ int GuestSession::i_fileQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData
return vrc;
}
-int GuestSession::i_fileQuerySizeInternal(const Utf8Str &strPath, int64_t *pllSize, int *pGuestRc)
+int GuestSession::i_fileQuerySizeInternal(const Utf8Str &strPath, bool fFollowSymlinks, int64_t *pllSize, int *pGuestRc)
{
AssertPtrReturn(pllSize, VERR_INVALID_POINTER);
GuestFsObjData objData;
- int vrc = i_fileQueryInfoInternal(strPath, objData, pGuestRc);
+ int vrc = i_fileQueryInfoInternal(strPath, fFollowSymlinks, objData, pGuestRc);
if (RT_SUCCESS(vrc))
*pllSize = objData.mObjectSize;
return vrc;
}
-int GuestSession::i_fsQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &objData, int *pGuestRc)
+/**
+ * <Someone write documentation, pretty please!>
+ *
+ * @param pGuestRc Optional. Will be set to VINF_SUCCESS,
+ * VERR_NOT_EQUAL or VERR_INVALID_STATE if the
+ * process completed. May probably be set to a lot of
+ * other things. Not sure if these things are related
+ * to the process we ran or what, really. :-(
+ */
+int GuestSession::i_fsQueryInfoInternal(const Utf8Str &strPath, bool fFollowSymlinks, GuestFsObjData &objData, int *pGuestRc)
{
LogFlowThisFunc(("strPath=%s\n", strPath.c_str()));
@@ -1373,13 +1374,16 @@ int GuestSession::i_fsQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &
/** @todo Merge this with IGuestFile::queryInfo(). */
GuestProcessStartupInfo procInfo;
- procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_STAT);
- procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
+ procInfo.mExecutable = Utf8Str(VBOXSERVICE_TOOL_STAT);
+ procInfo.mFlags = ProcessCreateFlag_WaitForStdOut;
try
{
/* Construct arguments. */
procInfo.mArguments.push_back(Utf8Str("--machinereadable"));
+ if (fFollowSymlinks)
+ procInfo.mArguments.push_back(Utf8Str("-L"));
+ procInfo.mArguments.push_back("--"); /* strPath could be '--help', which is a valid filename. */
procInfo.mArguments.push_back(strPath);
}
catch (std::bad_alloc)
@@ -1387,7 +1391,8 @@ int GuestSession::i_fsQueryInfoInternal(const Utf8Str &strPath, GuestFsObjData &
vrc = VERR_NO_MEMORY;
}
- int guestRc; GuestCtrlStreamObjects stdOut;
+ int guestRc;
+ GuestCtrlStreamObjects stdOut;
if (RT_SUCCESS(vrc))
vrc = GuestProcessTool::i_runEx(this, procInfo,
&stdOut, 1 /* cStrmOutObjects */,
@@ -1415,11 +1420,6 @@ const GuestCredentials& GuestSession::i_getCredentials(void)
return mData.mCredentials;
}
-const GuestEnvironment& GuestSession::i_getEnvironment(void)
-{
- return mData.mEnvironment;
-}
-
Utf8Str GuestSession::i_getName(void)
{
return mData.mSession.mName;
@@ -1553,6 +1553,25 @@ int GuestSession::i_onSessionStatusChange(PVBOXGUESTCTRLHOSTCBCTX pCbCtx, PVBOXG
case GUEST_SESSION_NOTIFYTYPE_STARTED:
sessionStatus = GuestSessionStatus_Started;
+#if 0 /** @todo If we get some environment stuff along with this kind notification: */
+ const char *pszzEnvBlock = ...;
+ uint32_t cbEnvBlock = ...;
+ if (!mData.mpBaseEnvironment)
+ {
+ GuestEnvironment *pBaseEnv;
+ try { pBaseEnv = new GuestEnvironment(); } catch (std::bad_alloc &) { pBaseEnv = NULL; }
+ if (pBaseEnv)
+ {
+ int vrc = pBaseEnv->initNormal();
+ if (RT_SUCCESS(vrc))
+ vrc = pBaseEnv->copyUtf8Block(pszzEnvBlock, cbEnvBlock);
+ if (RT_SUCCESS(vrc))
+ mData.mpBaseEnvironment = pBaseEnv;
+ else
+ pBaseEnv->release();
+ }
+ }
+#endif
break;
case GUEST_SESSION_NOTIFYTYPE_TEN:
@@ -1836,17 +1855,19 @@ int GuestSession::i_processRemoveFromList(GuestProcess *pProcess)
}
/**
- * Creates but does *not* start the process yet. See GuestProcess::startProcess() or
- * GuestProcess::startProcessAsync() for that.
+ * Creates but does *not* start the process yet.
+ *
+ * See GuestProcess::startProcess() or GuestProcess::startProcessAsync() for
+ * starting the process.
*
* @return IPRT status code.
* @param procInfo
* @param pProcess
*/
-int GuestSession::i_processCreateExInteral(GuestProcessStartupInfo &procInfo, ComObjPtr<GuestProcess> &pProcess)
+int GuestSession::i_processCreateExInternal(GuestProcessStartupInfo &procInfo, ComObjPtr<GuestProcess> &pProcess)
{
- LogFlowFunc(("mCmd=%s, mFlags=%x, mTimeoutMS=%RU32\n",
- procInfo.mCommand.c_str(), procInfo.mFlags, procInfo.mTimeoutMS));
+ LogFlowFunc(("mExe=%s, mFlags=%x, mTimeoutMS=%RU32\n",
+ procInfo.mExecutable.c_str(), procInfo.mFlags, procInfo.mTimeoutMS));
#ifdef DEBUG
if (procInfo.mArguments.size())
{
@@ -1929,7 +1950,7 @@ int GuestSession::i_processCreateExInteral(GuestProcessStartupInfo &procInfo, Co
return VERR_COM_UNEXPECTED;
rc = pProcess->init(mParent->i_getConsole() /* Console */, this /* Session */,
- uNewProcessID, procInfo);
+ uNewProcessID, procInfo, mData.mpBaseEnvironment);
if (RT_FAILURE(rc))
return rc;
@@ -2115,47 +2136,42 @@ int GuestSession::i_startTaskAsync(const Utf8Str &strTaskDesc,
}
/**
- * Queries/collects information prior to establishing a guest session.
- * This is necessary to know which guest control protocol version to use,
- * among other things (later).
+ * Determines the protocol version (sets mData.mProtocolVersion).
+ *
+ * This is called from the init method prior to to establishing a guest
+ * session.
*
* @return IPRT status code.
*/
-int GuestSession::i_queryInfo(void)
+int GuestSession::i_determineProtocolVersion(void)
{
/*
- * Try querying the guest control protocol version running on the guest.
- * This is done using the Guest Additions version
+ * We currently do this based on the reported guest additions version,
+ * ASSUMING that VBoxService and VBoxDrv are at the same version.
*/
ComObjPtr<Guest> pGuest = mParent;
- Assert(!pGuest.isNull());
+ AssertReturn(!pGuest.isNull(), VERR_NOT_SUPPORTED);
+ uint32_t uGaVersion = pGuest->i_getAdditionsVersion();
- uint32_t uVerAdditions = pGuest->i_getAdditionsVersion();
- uint32_t uVBoxMajor = VBOX_FULL_VERSION_GET_MAJOR(uVerAdditions);
- uint32_t uVBoxMinor = VBOX_FULL_VERSION_GET_MINOR(uVerAdditions);
+ /* Everyone supports version one, if they support anything at all. */
+ mData.mProtocolVersion = 1;
-#ifdef DEBUG_andy
- /* Hardcode the to-used protocol version; nice for testing side effects. */
- mData.mProtocolVersion = 2;
-#else
- mData.mProtocolVersion = (
- /* VBox 5.0 and up. */
- uVBoxMajor >= 5
- /* VBox 4.3 and up. */
- || (uVBoxMajor == 4 && uVBoxMinor >= 3))
- ? 2 /* Guest control 2.0. */
- : 1; /* Legacy guest control (VBox < 4.3). */
- /* Build revision is ignored. */
-#endif
+ /* Guest control 2.0 was introduced with 4.3.0. */
+ if (uGaVersion >= VBOX_FULL_VERSION_MAKE(4,3,0))
+ mData.mProtocolVersion = 2; /* Guest control 2.0. */
- LogFlowThisFunc(("uVerAdditions=%RU32 (%RU32.%RU32), mProtocolVersion=%RU32\n",
- uVerAdditions, uVBoxMajor, uVBoxMinor, mData.mProtocolVersion));
+ LogFlowThisFunc(("uGaVersion=%u.%u.%u => mProtocolVersion=%u\n",
+ VBOX_FULL_VERSION_GET_MAJOR(uGaVersion), VBOX_FULL_VERSION_GET_MINOR(uGaVersion),
+ VBOX_FULL_VERSION_GET_BUILD(uGaVersion), mData.mProtocolVersion));
- /* Tell the user but don't bitch too often. */
- /** @todo Find a bit nicer text. */
+ /*
+ * Inform the user about outdated guest additions (VM release log).
+ */
if (mData.mProtocolVersion < 2)
- LogRelMax(3, (tr("Warning: Guest Additions are older (%ld.%ld) than host capabilities for guest control, please upgrade them. Using protocol version %ld now\n"),
- uVBoxMajor, uVBoxMinor, mData.mProtocolVersion));
+ LogRelMax(3, (tr("Warning: Guest Additions v%u.%u.%u only supports the older guest control protocol version %u.\n"
+ " Please upgrade GAs to the current version to get full guest control capabilities.\n"),
+ VBOX_FULL_VERSION_GET_MAJOR(uGaVersion), VBOX_FULL_VERSION_GET_MINOR(uGaVersion),
+ VBOX_FULL_VERSION_GET_BUILD(uGaVersion), mData.mProtocolVersion));
return VINF_SUCCESS;
}
@@ -2373,9 +2389,6 @@ int GuestSession::i_waitForStatusChange(GuestWaitEvent *pEvent, uint32_t fWaitFl
HRESULT GuestSession::close()
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
AutoCaller autoCaller(this);
@@ -2408,17 +2421,18 @@ HRESULT GuestSession::close()
}
return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::copyFrom(const com::Utf8Str &aSource, const com::Utf8Str &aDest,
- const std::vector<CopyFileFlag_T> &aFlags,
- ComPtr<IProgress> &aProgress)
+HRESULT GuestSession::fileCopy(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+ const std::vector<FileCopyFlag_T> &aFlags, ComPtr<IProgress> &aProgress)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
ReturnComNotImplemented();
-#else
+}
+HRESULT GuestSession::fileCopyFromGuest(const com::Utf8Str &aSource, const com::Utf8Str &aDest,
+ const std::vector<FileCopyFlag_T> &aFlags,
+ ComPtr<IProgress> &aProgress)
+{
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aSource.c_str()) == NULL || *(aSource.c_str()) == '\0'))
@@ -2426,12 +2440,13 @@ HRESULT GuestSession::copyFrom(const com::Utf8Str &aSource, const com::Utf8Str &
if (RT_UNLIKELY((aDest.c_str()) == NULL || *(aDest.c_str()) == '\0'))
return setError(E_INVALIDARG, tr("No destination specified"));
- uint32_t fFlags = CopyFileFlag_None;
+ uint32_t fFlags = FileCopyFlag_None;
if (aFlags.size())
{
for (size_t i = 0; i < aFlags.size(); i++)
fFlags |= aFlags[i];
}
+/** @todo r=bird: fend off flags we don't implement here! */
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -2457,16 +2472,11 @@ HRESULT GuestSession::copyFrom(const com::Utf8Str &aSource, const com::Utf8Str &
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::copyTo(const com::Utf8Str &aSource, const com::Utf8Str &aDest, const std::vector<CopyFileFlag_T> &aFlags,
- ComPtr<IProgress> &aProgress)
+HRESULT GuestSession::fileCopyToGuest(const com::Utf8Str &aSource, const com::Utf8Str &aDest,
+ const std::vector<FileCopyFlag_T> &aFlags, ComPtr<IProgress> &aProgress)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
-
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aSource.c_str()) == NULL || *(aSource.c_str()) == '\0'))
@@ -2474,12 +2484,13 @@ HRESULT GuestSession::copyTo(const com::Utf8Str &aSource, const com::Utf8Str &aD
if (RT_UNLIKELY((aDest.c_str()) == NULL || *(aDest.c_str()) == '\0'))
return setError(E_INVALIDARG, tr("No destination specified"));
- uint32_t fFlags = CopyFileFlag_None;
+ uint32_t fFlags = FileCopyFlag_None;
if (aFlags.size())
{
for (size_t i = 0; i < aFlags.size(); i++)
fFlags |= aFlags[i];
}
+/** @todo r=bird: fend off flags we don't implement here! */
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -2508,15 +2519,29 @@ HRESULT GuestSession::copyTo(const com::Utf8Str &aSource, const com::Utf8Str &aD
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
+}
+
+HRESULT GuestSession::directoryCopy(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+ const std::vector<DirectoryCopyFlags_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+ ReturnComNotImplemented();
+}
+
+HRESULT GuestSession::directoryCopyFromGuest(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+ const std::vector<DirectoryCopyFlags_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+ ReturnComNotImplemented();
+}
+
+HRESULT GuestSession::directoryCopyToGuest(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+ const std::vector<DirectoryCopyFlags_T> &aFlags, ComPtr<IProgress> &aProgress)
+{
+ ReturnComNotImplemented();
}
HRESULT GuestSession::directoryCreate(const com::Utf8Str &aPath, ULONG aMode,
const std::vector<DirectoryCreateFlag_T> &aFlags)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
@@ -2561,15 +2586,11 @@ HRESULT GuestSession::directoryCreate(const com::Utf8Str &aPath, ULONG aMode,
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::directoryCreateTemp(const com::Utf8Str &aTemplateName, ULONG aMode, const com::Utf8Str &aPath,
BOOL aSecure, com::Utf8Str &aDirectory)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aTemplateName.c_str()) == NULL || *(aTemplateName.c_str()) == '\0'))
@@ -2599,14 +2620,10 @@ HRESULT GuestSession::directoryCreateTemp(const com::Utf8Str &aTemplateName, ULO
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::directoryExists(const com::Utf8Str &aPath, BOOL *aExists)
+HRESULT GuestSession::directoryExists(const com::Utf8Str &aPath, BOOL aFollowSymlinks, BOOL *aExists)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
@@ -2615,11 +2632,13 @@ HRESULT GuestSession::directoryExists(const com::Utf8Str &aPath, BOOL *aExists)
HRESULT hr = S_OK;
GuestFsObjData objData; int guestRc;
- int rc = i_directoryQueryInfoInternal(aPath, objData, &guestRc);
+ int rc = i_directoryQueryInfoInternal(aPath, aFollowSymlinks != FALSE, objData, &guestRc);
if (RT_SUCCESS(rc))
*aExists = objData.mType == FsObjType_Directory;
else
{
+ /** @todo r=bird: Looks like this code raises errors if the directory doesn't
+ * exist... That's of course not right. */
switch (rc)
{
case VERR_GSTCTL_GUEST_ERROR:
@@ -2634,15 +2653,11 @@ HRESULT GuestSession::directoryExists(const com::Utf8Str &aPath, BOOL *aExists)
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::directoryOpen(const com::Utf8Str &aPath, const com::Utf8Str &aFilter,
const std::vector<DirectoryOpenFlag_T> &aFlags, ComPtr<IGuestDirectory> &aDirectory)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
@@ -2695,69 +2710,10 @@ HRESULT GuestSession::directoryOpen(const com::Utf8Str &aPath, const com::Utf8St
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::directoryQueryInfo(const com::Utf8Str &aPath, ComPtr<IGuestFsObjInfo> &aInfo)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
- if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No directory to query information for specified"));
-
- HRESULT hr = S_OK;
-
- GuestFsObjData objData; int guestRc;
- int vrc = i_directoryQueryInfoInternal(aPath, objData, &guestRc);
- if (RT_SUCCESS(vrc))
- {
- if (objData.mType == FsObjType_Directory)
- {
- ComObjPtr<GuestFsObjInfo> pFsObjInfo;
- hr = pFsObjInfo.createObject();
- if (FAILED(hr)) return hr;
-
- vrc = pFsObjInfo->init(objData);
- if (RT_SUCCESS(vrc))
- {
- hr = pFsObjInfo.queryInterfaceTo(aInfo.asOutParam());
- if (FAILED(hr)) return hr;
- }
- }
- }
-
- if (RT_FAILURE(vrc))
- {
- switch (vrc)
- {
- case VERR_GSTCTL_GUEST_ERROR:
- hr = GuestProcess::i_setErrorExternal(this, guestRc);
- break;
-
- case VERR_NOT_A_DIRECTORY:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Element \"%s\" exists but is not a directory"),
- aPath.c_str());
- break;
-
- default:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Querying directory information for \"%s\" failed: %Rrc"),
- aPath.c_str(), vrc);
- break;
- }
- }
-
- return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::directoryRemove(const com::Utf8Str &aPath)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
@@ -2793,20 +2749,19 @@ HRESULT GuestSession::directoryRemove(const com::Utf8Str &aPath)
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::directoryRemoveRecursive(const com::Utf8Str &aPath, const std::vector<DirectoryRemoveRecFlag_T> &aFlags,
ComPtr<IProgress> &aProgress)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
return setError(E_INVALIDARG, tr("No directory to remove recursively specified"));
+/** @todo r=bird: Must check that the flags matches the hardcoded behavior
+ * further down!! */
+
HRESULT hr = i_isReadyExternal();
if (FAILED(hr))
return hr;
@@ -2858,165 +2813,137 @@ HRESULT GuestSession::directoryRemoveRecursive(const com::Utf8Str &aPath, const
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::directoryRename(const com::Utf8Str &aSource,
- const com::Utf8Str &aDest,
- const std::vector<PathRenameFlag_T> &aFlags)
+HRESULT GuestSession::environmentScheduleSet(const com::Utf8Str &aName, const com::Utf8Str &aValue)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
- if (RT_UNLIKELY((aSource.c_str()) == NULL || *(aSource.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No source directory to rename specified"));
-
- if (RT_UNLIKELY((aDest.c_str()) == NULL || *(aDest.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No destination directory to rename the source to specified"));
-
- HRESULT hr = i_isReadyExternal();
- if (FAILED(hr))
- return hr;
-
- /* No flags; only remove the directory when empty. */
- uint32_t uFlags = 0;
-
- int guestRc;
- int vrc = i_pathRenameInternal(aSource, aDest, uFlags, &guestRc);
- if (RT_FAILURE(vrc))
+ HRESULT hrc;
+ if (RT_LIKELY(aName.isNotEmpty()))
{
- switch (vrc)
+ if (RT_LIKELY(strchr(aName.c_str(), '=') == NULL))
{
- case VERR_NOT_SUPPORTED:
- hr = setError(VBOX_E_IPRT_ERROR,
- tr("Handling renaming guest directories not supported by installed Guest Additions"));
- break;
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+ int vrc = mData.mEnvironmentChanges.setVariable(aName, aValue);
+ if (RT_SUCCESS(vrc))
+ hrc = S_OK;
+ else
+ hrc = setErrorVrc(vrc);
+ }
+ else
+ hrc = setError(E_INVALIDARG, tr("The equal char is not allowed in environment variable names"));
+ }
+ else
+ hrc = setError(E_INVALIDARG, tr("No variable name specified"));
- case VERR_GSTCTL_GUEST_ERROR:
- hr = setError(VBOX_E_IPRT_ERROR,
- tr("Renaming guest directory failed: %Rrc"), guestRc);
- break;
+ LogFlowThisFuncLeave();
+ return hrc;
+}
- default:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Renaming guest directory \"%s\" failed: %Rrc"),
- aSource.c_str(), vrc);
- break;
- }
- }
-
- return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::directorySetACL(const com::Utf8Str &aPath, const com::Utf8Str &aAcl)
+HRESULT GuestSession::environmentScheduleUnset(const com::Utf8Str &aName)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
- ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::environmentClear()
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
-
- AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
- mData.mEnvironment.Clear();
+ HRESULT hrc;
+ if (RT_LIKELY(aName.isNotEmpty()))
+ {
+ if (RT_LIKELY(strchr(aName.c_str(), '=') == NULL))
+ {
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+ int vrc = mData.mEnvironmentChanges.unsetVariable(aName);
+ if (RT_SUCCESS(vrc))
+ hrc = S_OK;
+ else
+ hrc = setErrorVrc(vrc);
+ }
+ else
+ hrc = setError(E_INVALIDARG, tr("The equal char is not allowed in environment variable names"));
+ }
+ else
+ hrc = setError(E_INVALIDARG, tr("No variable name specified"));
LogFlowThisFuncLeave();
- return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
+ return hrc;
}
-HRESULT GuestSession::environmentGet(const com::Utf8Str &aName, com::Utf8Str &aValue)
+HRESULT GuestSession::environmentGetBaseVariable(const com::Utf8Str &aName, com::Utf8Str &aValue)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
-
- if (RT_UNLIKELY(aName.c_str() == NULL) || *(aName.c_str()) == '\0')
- return setError(E_INVALIDARG, tr("No value name specified"));
-
- AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
-
- aValue = mData.mEnvironment.Get(aName);
+ HRESULT hrc;
+ if (RT_LIKELY(aName.isNotEmpty()))
+ {
+ if (RT_LIKELY(strchr(aName.c_str(), '=') == NULL))
+ {
+ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+ if (mData.mpBaseEnvironment)
+ {
+ int vrc = mData.mpBaseEnvironment->getVariable(aName, &aValue);
+ if (RT_SUCCESS(vrc))
+ hrc = S_OK;
+ else
+ hrc = setErrorVrc(vrc);
+ }
+ else if (mData.mProtocolVersion < 99999)
+ hrc = setError(VBOX_E_NOT_SUPPORTED, tr("The base environment feature is not supported by the guest additions"));
+ else
+ hrc = setError(VBOX_E_INVALID_OBJECT_STATE, tr("The base environment has not yet been reported by the guest"));
+ }
+ else
+ hrc = setError(E_INVALIDARG, tr("The equal char is not allowed in environment variable names"));
+ }
+ else
+ hrc = setError(E_INVALIDARG, tr("No variable name specified"));
LogFlowThisFuncLeave();
- return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::environmentSet(const com::Utf8Str &aName, const com::Utf8Str &aValue)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
- if (RT_UNLIKELY((aName.c_str() == NULL) || *(aName.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No value name specified"));
-
- AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
- int rc = mData.mEnvironment.Set(aName, aValue);
-
- HRESULT hr = RT_SUCCESS(rc) ? S_OK : VBOX_E_IPRT_ERROR;
- LogFlowFuncLeaveRC(hr);
- return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
+ return hrc;
}
-HRESULT GuestSession::environmentUnset(const com::Utf8Str &aName)
+HRESULT GuestSession::environmentDoesBaseVariableExist(const com::Utf8Str &aName, BOOL *aExists)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
-
- AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
-
- mData.mEnvironment.Unset(aName);
+ *aExists = FALSE;
+ HRESULT hrc;
+ if (RT_LIKELY(aName.isNotEmpty()))
+ {
+ if (RT_LIKELY(strchr(aName.c_str(), '=') == NULL))
+ {
+ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+ if (mData.mpBaseEnvironment)
+ {
+ hrc = S_OK;
+ *aExists = mData.mpBaseEnvironment->doesVariableExist(aName);
+ }
+ else if (mData.mProtocolVersion < 99999)
+ hrc = setError(VBOX_E_NOT_SUPPORTED, tr("The base environment feature is not supported by the guest additions"));
+ else
+ hrc = setError(VBOX_E_INVALID_OBJECT_STATE, tr("The base environment has not yet been reported by the guest"));
+ }
+ else
+ hrc = setError(E_INVALIDARG, tr("The equal char is not allowed in environment variable names"));
+ }
+ else
+ hrc = setError(E_INVALIDARG, tr("No variable name specified"));
LogFlowThisFuncLeave();
- return S_OK;
-#endif /* VBOX_WITH_GUEST_CONTROL */
+ return hrc;
}
HRESULT GuestSession::fileCreateTemp(const com::Utf8Str &aTemplateName, ULONG aMode, const com::Utf8Str &aPath, BOOL aSecure,
ComPtr<IGuestFile> &aFile)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
-
ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::fileExists(const com::Utf8Str &aPath, BOOL *aExists)
+HRESULT GuestSession::fileExists(const com::Utf8Str &aPath, BOOL aFollowSymlinks, BOOL *aExists)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
+/** @todo r=bird: Treat empty file with a FALSE return. */
if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
return setError(E_INVALIDARG, tr("No file to check existence for specified"));
GuestFsObjData objData; int guestRc;
- int vrc = i_fileQueryInfoInternal(aPath, objData, &guestRc);
+ int vrc = i_fileQueryInfoInternal(aPath, aFollowSymlinks != FALSE, objData, &guestRc);
if (RT_SUCCESS(vrc))
{
*aExists = TRUE;
@@ -3031,6 +2958,8 @@ HRESULT GuestSession::fileExists(const com::Utf8Str &aPath, BOOL *aExists)
hr = GuestProcess::i_setErrorExternal(this, guestRc);
break;
+/** @todo r=bird: what about VERR_PATH_NOT_FOUND and VERR_FILE_NOT_FOUND?
+ * Where does that get converted to *aExists = FALSE? */
case VERR_NOT_A_FILE:
*aExists = FALSE;
break;
@@ -3042,100 +2971,92 @@ HRESULT GuestSession::fileExists(const com::Utf8Str &aPath, BOOL *aExists)
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::fileRemove(const com::Utf8Str &aPath)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
- if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No file to remove specified"));
-
- HRESULT hr = S_OK;
-
- int guestRc;
- int vrc = i_fileRemoveInternal(aPath, &guestRc);
- if (RT_FAILURE(vrc))
- {
- switch (vrc)
- {
- case VERR_GSTCTL_GUEST_ERROR:
- hr = GuestProcess::i_setErrorExternal(this, guestRc);
- break;
-
- default:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Removing file \"%s\" failed: %Rrc"),
- aPath.c_str(), vrc);
- break;
- }
- }
-
- return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::fileOpen(const com::Utf8Str &aPath, const com::Utf8Str &aOpenMode, const com::Utf8Str &aDisposition,
+HRESULT GuestSession::fileOpen(const com::Utf8Str &aPath, FileAccessMode_T aAccessMode, FileOpenAction_T aOpenAction,
ULONG aCreationMode, ComPtr<IGuestFile> &aFile)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
-
- Utf8Str strSharingMode = ""; /* Sharing mode is ignored. */
-
- return fileOpenEx(aPath, aOpenMode, aDisposition, strSharingMode, aCreationMode,
- 0 /* aOffset */, aFile);
-#endif /* VBOX_WITH_GUEST_CONTROL */
+ const std::vector<FileOpenExFlags_T> EmptyFlags;
+ return fileOpenEx(aPath, aAccessMode, aOpenAction, FileSharingMode_All, aCreationMode, EmptyFlags, aFile);
}
-HRESULT GuestSession::fileOpenEx(const com::Utf8Str &aPath, const com::Utf8Str &aOpenMode, const com::Utf8Str &aDisposition,
- const com::Utf8Str &aSharingMode, ULONG aCreationMode, LONG64 aOffset,
- ComPtr<IGuestFile> &aFile)
-
+HRESULT GuestSession::fileOpenEx(const com::Utf8Str &aPath, FileAccessMode_T aAccessMode, FileOpenAction_T aOpenAction,
+ FileSharingMode_T aSharingMode, ULONG aCreationMode,
+ const std::vector<FileOpenExFlags_T> &aFlags, ComPtr<IGuestFile> &aFile)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
return setError(E_INVALIDARG, tr("No file to open specified"));
- if (RT_UNLIKELY((aOpenMode.c_str()) == NULL || *(aOpenMode.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No open mode specified"));
- if (RT_UNLIKELY((aDisposition.c_str()) == NULL || *(aDisposition.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No disposition mode specified"));
- /* aSharingMode is optional. */
HRESULT hr = i_isReadyExternal();
if (FAILED(hr))
return hr;
- /** @todo Validate creation mode. */
- uint32_t uCreationMode = 0;
-
GuestFileOpenInfo openInfo;
openInfo.mFileName = aPath;
- openInfo.mOpenMode = aOpenMode;
- openInfo.mDisposition = aDisposition;
- openInfo.mSharingMode = aSharingMode;
openInfo.mCreationMode = aCreationMode;
- openInfo.mInitialOffset = aOffset;
- uint64_t uFlagsIgnored;
- int vrc = RTFileModeToFlagsEx(openInfo.mOpenMode.c_str(),
- openInfo.mDisposition.c_str(),
- openInfo.mSharingMode.c_str(),
- &uFlagsIgnored);
- if (RT_FAILURE(vrc))
- return setError(E_INVALIDARG, tr("Invalid open mode / disposition / sharing mode specified"));
+ /* convert + validate aAccessMode to the old format. */
+ openInfo.mAccessMode = aAccessMode;
+ switch (aAccessMode)
+ {
+ case (FileAccessMode_T)FileAccessMode_ReadOnly: openInfo.mpszAccessMode = "r"; break;
+ case (FileAccessMode_T)FileAccessMode_WriteOnly: openInfo.mpszAccessMode = "w"; break;
+ case (FileAccessMode_T)FileAccessMode_ReadWrite: openInfo.mpszAccessMode = "r+"; break;
+ case (FileAccessMode_T)FileAccessMode_AppendOnly:
+ /* fall thru */
+ case (FileAccessMode_T)FileAccessMode_AppendRead:
+ return setError(E_NOTIMPL, tr("Append access modes are not yet implemented"));
+ default:
+ return setError(E_INVALIDARG, tr("Unknown FileAccessMode value %u (%#x)"), aAccessMode, aAccessMode);
+ }
+
+ /* convert + validate aOpenAction to the old format. */
+ openInfo.mOpenAction = aOpenAction;
+ switch (aOpenAction)
+ {
+ case (FileOpenAction_T)FileOpenAction_OpenExisting: openInfo.mpszOpenAction = "oe"; break;
+ case (FileOpenAction_T)FileOpenAction_OpenOrCreate: openInfo.mpszOpenAction = "oc"; break;
+ case (FileOpenAction_T)FileOpenAction_CreateNew: openInfo.mpszOpenAction = "ce"; break;
+ case (FileOpenAction_T)FileOpenAction_CreateOrReplace: openInfo.mpszOpenAction = "ca"; break;
+ case (FileOpenAction_T)FileOpenAction_OpenExistingTruncated: openInfo.mpszOpenAction = "ot"; break;
+ case (FileOpenAction_T)FileOpenAction_AppendOrCreate:
+ openInfo.mpszOpenAction = "oa"; /** @todo get rid of this one and implement AppendOnly/AppendRead. */
+ break;
+ default:
+ return setError(E_INVALIDARG, tr("Unknown FileOpenAction value %u (%#x)"), aAccessMode, aAccessMode);
+ }
+
+ /* validate aSharingMode */
+ openInfo.mSharingMode = aSharingMode;
+ switch (aSharingMode)
+ {
+ case (FileSharingMode_T)FileSharingMode_All: /* OK */ break;
+ case (FileSharingMode_T)FileSharingMode_Read:
+ case (FileSharingMode_T)FileSharingMode_Write:
+ case (FileSharingMode_T)FileSharingMode_ReadWrite:
+ case (FileSharingMode_T)FileSharingMode_Delete:
+ case (FileSharingMode_T)FileSharingMode_ReadDelete:
+ case (FileSharingMode_T)FileSharingMode_WriteDelete:
+ return setError(E_NOTIMPL, tr("Only FileSharingMode_All is currently implemented"));
+
+ default:
+ return setError(E_INVALIDARG, tr("Unknown FileOpenAction value %u (%#x)"), aAccessMode, aAccessMode);
+ }
- ComObjPtr <GuestFile> pFile; int guestRc;
- vrc = i_fileOpenInternal(openInfo, pFile, &guestRc);
+ /* Combine and validate flags. */
+ uint32_t fOpenEx = 0;
+ for (size_t i = 0; i < aFlags.size(); i++)
+ fOpenEx = aFlags[i];
+ if (fOpenEx)
+ return setError(E_INVALIDARG, tr("Unsupported FileOpenExFlags values in aFlags (%#x)"), fOpenEx);
+ openInfo.mfOpenEx = fOpenEx;
+
+ ComObjPtr <GuestFile> pFile;
+ int guestRc;
+ int vrc = i_fileOpenInternal(openInfo, pFile, &guestRc);
if (RT_SUCCESS(vrc))
/* Return directory object to the caller. */
hr = pFile.queryInterfaceTo(aFile.asOutParam());
@@ -3160,39 +3081,22 @@ HRESULT GuestSession::fileOpenEx(const com::Utf8Str &aPath, const com::Utf8Str &
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::fileQueryInfo(const com::Utf8Str &aPath, ComPtr<IGuestFsObjInfo> &aInfo)
-
+HRESULT GuestSession::fileQuerySize(const com::Utf8Str &aPath, BOOL aFollowSymlinks, LONG64 *aSize)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No file to query information for specified"));
+ return setError(E_INVALIDARG, tr("No file to query size for specified"));
HRESULT hr = S_OK;
- GuestFsObjData objData; int guestRc;
- int vrc = i_fileQueryInfoInternal(aPath, objData, &guestRc);
+ int64_t llSize; int guestRc;
+ int vrc = i_fileQuerySizeInternal(aPath, aFollowSymlinks != FALSE, &llSize, &guestRc);
if (RT_SUCCESS(vrc))
- {
- ComObjPtr<GuestFsObjInfo> pFsObjInfo;
- hr = pFsObjInfo.createObject();
- if (FAILED(hr)) return hr;
-
- vrc = pFsObjInfo->init(objData);
- if (RT_SUCCESS(vrc))
- {
- hr = pFsObjInfo.queryInterfaceTo(aInfo.asOutParam());
- if (FAILED(hr)) return hr;
- }
- }
-
- if (RT_FAILURE(vrc))
+ *aSize = llSize;
+ else
{
switch (vrc)
{
@@ -3200,37 +3104,90 @@ HRESULT GuestSession::fileQueryInfo(const com::Utf8Str &aPath, ComPtr<IGuestFsOb
hr = GuestProcess::i_setErrorExternal(this, guestRc);
break;
- case VERR_NOT_A_FILE:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Element exists but is not a file"));
- break;
-
default:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Querying file information failed: %Rrc"), vrc);
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Querying file size failed: %Rrc"), vrc);
break;
}
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::fileQuerySize(const com::Utf8Str &aPath, LONG64 *aSize)
+HRESULT GuestSession::fsObjExists(const com::Utf8Str &aPath, BOOL aFollowSymlinks, BOOL *aExists)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
- if (RT_UNLIKELY((aPath.c_str()) == NULL || *(aPath.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No file to query size for specified"));
+ HRESULT hrc = S_OK;
+ *aExists = false;
+ if (RT_LIKELY(aPath.isNotEmpty()))
+ {
+ GuestFsObjData objData;
+ int rcGuest;
+ int vrc = i_fsQueryInfoInternal(aPath, aFollowSymlinks != FALSE, objData, &rcGuest);
+ if (RT_SUCCESS(vrc))
+ *aExists = TRUE;
+ else if ( vrc == VERR_NOT_A_FILE
+ || vrc == VERR_PATH_NOT_FOUND
+ || vrc == VERR_FILE_NOT_FOUND
+ || vrc == VERR_INVALID_NAME)
+ hrc = S_OK; /* Ignore these vrc values. */
+ else if (vrc == VERR_GSTCTL_GUEST_ERROR) /** @todo What _is_ rcGuest, really? Stuff like VERR_NOT_A_FILE too?? */
+ hrc = GuestProcess::i_setErrorExternal(this, rcGuest);
+ else
+ hrc = setErrorVrc(vrc, tr("Querying file information for \"%s\" failed: %Rrc"), aPath.c_str(), vrc);
+ }
+ /* else: If the file name is empty, there is no way it can exists. So, don't
+ be a tedious and return E_INVALIDARG, simply return FALSE. */
+ LogFlowThisFuncLeave();
+ return hrc;
+}
+
+HRESULT GuestSession::fsObjQueryInfo(const com::Utf8Str &aPath, BOOL aFollowSymlinks, ComPtr<IGuestFsObjInfo> &aInfo)
+{
+ LogFlowThisFuncEnter();
+
+ HRESULT hrc = S_OK;
+ if (RT_LIKELY(aPath.isNotEmpty()))
+ {
+ GuestFsObjData Info;
+ int rcGuest;
+ int vrc = i_fsQueryInfoInternal(aPath, aFollowSymlinks != FALSE, Info, &rcGuest);
+ if (RT_SUCCESS(vrc))
+ {
+ ComObjPtr<GuestFsObjInfo> ptrFsObjInfo;
+ hrc = ptrFsObjInfo.createObject();
+ if (SUCCEEDED(hrc))
+ {
+ vrc = ptrFsObjInfo->init(Info);
+ if (RT_SUCCESS(vrc))
+ hrc = ptrFsObjInfo.queryInterfaceTo(aInfo.asOutParam());
+ else
+ hrc = setErrorVrc(vrc);
+ }
+ }
+ else if (vrc == VERR_GSTCTL_GUEST_ERROR)
+ hrc = GuestProcess::i_setErrorExternal(this, rcGuest);
+ else
+ hrc = setErrorVrc(vrc, tr("Querying file information for \"%s\" failed: %Rrc"), aPath.c_str(), vrc);
+ }
+ /* else: If the file name is empty, there is no way it can exists. So, don't
+ be a tedious and return E_INVALIDARG, simply return FALSE. */
+ LogFlowThisFuncLeave();
+ return hrc;
+}
+
+HRESULT GuestSession::fsObjRemove(const com::Utf8Str &aPath)
+{
+ LogFlowThisFuncEnter();
+
+ if (RT_UNLIKELY(aPath.isEmpty()))
+ return setError(E_INVALIDARG, tr("Empty path specified"));
HRESULT hr = S_OK;
- int64_t llSize; int guestRc;
- int vrc = i_fileQuerySizeInternal(aPath, &llSize, &guestRc);
- if (RT_SUCCESS(vrc))
- *aSize = llSize;
- else
+ int guestRc;
+ int vrc = i_fileRemoveInternal(aPath, &guestRc);
+ if (RT_FAILURE(vrc))
{
switch (vrc)
{
@@ -3239,138 +3196,158 @@ HRESULT GuestSession::fileQuerySize(const com::Utf8Str &aPath, LONG64 *aSize)
break;
default:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Querying file size failed: %Rrc"), vrc);
- break;
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Removing file \"%s\" failed: %Rrc"),
+ aPath.c_str(), vrc);
+ break;
}
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::fileRename(const com::Utf8Str &aSource, const com::Utf8Str &aDest,
- const std::vector<PathRenameFlag_T> &aFlags)
+HRESULT GuestSession::fsObjRename(const com::Utf8Str &aSource,
+ const com::Utf8Str &aDestination,
+ const std::vector<FsObjRenameFlag_T> &aFlags)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
- if (RT_UNLIKELY((aSource.c_str()) == NULL || *(aSource.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No source file to rename specified"));
+ if (RT_UNLIKELY(aSource.isEmpty()))
+ return setError(E_INVALIDARG, tr("No source path specified"));
- if (RT_UNLIKELY((aDest.c_str()) == NULL || *(aDest.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No destination file to rename the source to specified"));
+ if (RT_UNLIKELY(aDestination.isEmpty()))
+ return setError(E_INVALIDARG, tr("No destination path specified"));
HRESULT hr = i_isReadyExternal();
if (FAILED(hr))
return hr;
- /* No flags; only remove the directory when empty. */
- uint32_t uFlags = 0;
+ /* Combine, validate and convert flags. */
+ uint32_t fApiFlags = 0;
+ for (size_t i = 0; i < aFlags.size(); i++)
+ fApiFlags |= aFlags[i];
+ if (fApiFlags & ~((uint32_t)FsObjRenameFlag_NoReplace | (uint32_t)FsObjRenameFlag_Replace))
+ return setError(E_INVALIDARG, tr("Unknown rename flag: %#x"), fApiFlags);
+
+ AssertCompile(FsObjRenameFlag_NoReplace == 0);
+ AssertCompile(FsObjRenameFlag_Replace != 0);
+ uint32_t fBackend;
+ if ((fApiFlags & ((uint32_t)FsObjRenameFlag_NoReplace | (uint32_t)FsObjRenameFlag_Replace)) == FsObjRenameFlag_Replace)
+ fBackend = PATHRENAME_FLAG_REPLACE;
+ else
+ fBackend = PATHRENAME_FLAG_NO_REPLACE;
+ /* Call worker to do the job. */
int guestRc;
- int vrc = i_pathRenameInternal(aSource, aDest, uFlags, &guestRc);
+ int vrc = i_pathRenameInternal(aSource, aDestination, fBackend, &guestRc);
if (RT_FAILURE(vrc))
{
switch (vrc)
{
case VERR_NOT_SUPPORTED:
hr = setError(VBOX_E_IPRT_ERROR,
- tr("Handling renaming guest files not supported by installed Guest Additions"));
+ tr("Handling renaming guest directories not supported by installed Guest Additions"));
break;
case VERR_GSTCTL_GUEST_ERROR:
- /** @todo Proper guestRc to text translation needed. */
hr = setError(VBOX_E_IPRT_ERROR,
- tr("Renaming guest file failed: %Rrc"), guestRc);
+ tr("Renaming guest directory failed: %Rrc"), guestRc);
break;
default:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Renaming guest file \"%s\" failed: %Rrc"),
+ hr = setError(VBOX_E_IPRT_ERROR, tr("Renaming guest directory \"%s\" failed: %Rrc"),
aSource.c_str(), vrc);
break;
}
}
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::fileSetACL(const com::Utf8Str &aFile, const com::Utf8Str &aAcl)
+
+HRESULT GuestSession::fsObjMove(const com::Utf8Str &aSource, const com::Utf8Str &aDestination,
+ const std::vector<FsObjMoveFlags_T> &aFlags, ComPtr<IProgress> &aProgress)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
+}
+HRESULT GuestSession::fsObjSetACL(const com::Utf8Str &aPath, BOOL aFollowSymlinks, const com::Utf8Str &aAcl, ULONG aMode)
+{
ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::processCreate(const com::Utf8Str &aCommand, const std::vector<com::Utf8Str> &aArguments,
+
+HRESULT GuestSession::processCreate(const com::Utf8Str &aExecutable, const std::vector<com::Utf8Str> &aArguments,
const std::vector<com::Utf8Str> &aEnvironment,
const std::vector<ProcessCreateFlag_T> &aFlags,
ULONG aTimeoutMS, ComPtr<IGuestProcess> &aGuestProcess)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
std::vector<LONG> affinityIgnored;
- return processCreateEx(aCommand, aArguments, aEnvironment, aFlags, aTimeoutMS, ProcessPriority_Default,
+ return processCreateEx(aExecutable, aArguments, aEnvironment, aFlags, aTimeoutMS, ProcessPriority_Default,
affinityIgnored, aGuestProcess);
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
-HRESULT GuestSession::processCreateEx(const com::Utf8Str &aCommand, const std::vector<com::Utf8Str> &aArguments,
+HRESULT GuestSession::processCreateEx(const com::Utf8Str &aExecutable, const std::vector<com::Utf8Str> &aArguments,
const std::vector<com::Utf8Str> &aEnvironment,
const std::vector<ProcessCreateFlag_T> &aFlags, ULONG aTimeoutMS,
ProcessPriority_T aPriority, const std::vector<LONG> &aAffinity,
ComPtr<IGuestProcess> &aGuestProcess)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
- if (RT_UNLIKELY((aCommand.c_str()) == NULL || *(aCommand.c_str()) == '\0'))
- return setError(E_INVALIDARG, tr("No command to execute specified"));
+ /** @todo r=bird: Check input better? aPriority is passed on to the guest
+ * without any validation. Flags not existing in this vbox version are
+ * ignored, potentially doing something entirely different than what the
+ * caller had in mind. */
+
+ /*
+ * Must have an executable to execute. If none is given, we try use the
+ * zero'th argument.
+ */
+ const char *pszExecutable = aExecutable.c_str();
+ if (RT_UNLIKELY(pszExecutable == NULL || *pszExecutable == '\0'))
+ {
+ if (aArguments.size() > 0)
+ pszExecutable = aArguments[0].c_str();
+ if (pszExecutable == NULL || *pszExecutable == '\0')
+ return setError(E_INVALIDARG, tr("No command to execute specified"));
+ }
+ /*
+ * Check the session.
+ */
HRESULT hr = i_isReadyExternal();
if (FAILED(hr))
return hr;
+ /*
+ * Build the process startup info.
+ */
GuestProcessStartupInfo procInfo;
- procInfo.mCommand = aCommand;
+ /* Executable and arguments. */
+ procInfo.mExecutable = pszExecutable;
if (aArguments.size())
for (size_t i = 0; i < aArguments.size(); i++)
procInfo.mArguments.push_back(aArguments[i]);
- int rc = VINF_SUCCESS;
-
- /*
- * Create the process environment:
- * - Apply the session environment in a first step, and
- * - Apply environment variables specified by this call to
- * have the chance of overwriting/deleting session entries.
- */
- procInfo.mEnvironment = mData.mEnvironment; /* Apply original session environment. */
-
- if (aEnvironment.size())
- for (size_t i = 0; i < aEnvironment.size() && RT_SUCCESS(rc); i++)
- rc = procInfo.mEnvironment.Set(aEnvironment[i]);
-
- if (RT_SUCCESS(rc))
+ /* Combine the environment changes associated with the ones passed in by
+ the caller, giving priority to the latter. The changes are putenv style
+ and will be applied to the standard environment for the guest user. */
+ int vrc = procInfo.mEnvironmentChanges.copy(mData.mEnvironmentChanges);
+ if (RT_SUCCESS(vrc))
+ vrc = procInfo.mEnvironmentChanges.applyPutEnvArray(aEnvironment);
+ if (RT_SUCCESS(vrc))
{
+ /* Convert the flag array into a mask. */
if (aFlags.size())
for (size_t i = 0; i < aFlags.size(); i++)
procInfo.mFlags |= aFlags[i];
procInfo.mTimeoutMS = aTimeoutMS;
+ /** @todo use RTCPUSET instead of archaic 64-bit variables! */
if (aAffinity.size())
for (size_t i = 0; i < aAffinity.size(); i++)
if (aAffinity[i])
@@ -3378,48 +3355,48 @@ HRESULT GuestSession::processCreateEx(const com::Utf8Str &aCommand, const std::v
procInfo.mPriority = aPriority;
+ /*
+ * Create a guest process object.
+ */
ComObjPtr<GuestProcess> pProcess;
- rc = i_processCreateExInteral(procInfo, pProcess);
- if (RT_SUCCESS(rc))
+ vrc = i_processCreateExInternal(procInfo, pProcess);
+ if (RT_SUCCESS(vrc))
{
/* Return guest session to the caller. */
- HRESULT hr2 = pProcess.queryInterfaceTo(aGuestProcess.asOutParam());
- if (FAILED(hr2))
- rc = VERR_COM_OBJECT_NOT_FOUND;
-
- if (RT_SUCCESS(rc))
- rc = pProcess->i_startProcessAsync();
- }
- }
-
- if (RT_FAILURE(rc))
- {
- switch (rc)
- {
- case VERR_MAX_PROCS_REACHED:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Maximum number of concurrent guest processes per session (%ld) reached"),
- VBOX_GUESTCTRL_MAX_OBJECTS);
- break;
-
- /** @todo Add more errors here. */
+ hr = pProcess.queryInterfaceTo(aGuestProcess.asOutParam());
+ if (SUCCEEDED(hr))
+ {
+ /*
+ * Start the process.
+ */
+ vrc = pProcess->i_startProcessAsync();
+ if (RT_SUCCESS(vrc))
+ {
+ LogFlowFuncLeaveRC(vrc);
+ return S_OK;
+ }
- default:
- hr = setError(VBOX_E_IPRT_ERROR, tr("Could not create guest process, rc=%Rrc"), rc);
- break;
+ hr = setErrorVrc(vrc, tr("Failed to start guest process: %Rrc"), vrc);
+ /** @todo r=bird: What happens to the interface that *aGuestProcess points to
+ * now? Looks like a leak or an undocument hack of sorts... */
+ }
}
+ else if (vrc == VERR_MAX_PROCS_REACHED)
+ hr = setErrorVrc(vrc, tr("Maximum number of concurrent guest processes per session (%u) reached"),
+ VBOX_GUESTCTRL_MAX_OBJECTS);
+ else
+ hr = setErrorVrc(vrc, tr("Failed to create guest process object: %Rrc"), vrc);
}
+ else
+ hr = setErrorVrc(vrc, tr("Failed to set up the environment: %Rrc"), vrc);
- LogFlowFuncLeaveRC(rc);
+ LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::processGet(ULONG aPid, ComPtr<IGuestProcess> &aGuestProcess)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFunc(("PID=%RU32\n", aPid));
if (aPid == 0)
@@ -3441,71 +3418,27 @@ HRESULT GuestSession::processGet(ULONG aPid, ComPtr<IGuestProcess> &aGuestProces
LogFlowThisFunc(("aProcess=%p, hr=%Rhrc\n", (IGuestProcess*)aGuestProcess, hr));
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::symlinkCreate(const com::Utf8Str &aSource, const com::Utf8Str &aTarget, SymlinkType_T aType)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::symlinkExists(const com::Utf8Str &aSymlink, BOOL *aExists)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::symlinkRead(const com::Utf8Str &aSymlink, const std::vector<SymlinkReadFlag_T> &aFlags,
com::Utf8Str &aTarget)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::symlinkRemoveDirectory(const com::Utf8Str &aPath)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
- ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
-}
-
-HRESULT GuestSession::symlinkRemoveFile(const com::Utf8Str &aFile)
-{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
- LogFlowThisFuncEnter();
-
- ReturnComNotImplemented();
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::waitFor(ULONG aWaitFor, ULONG aTimeoutMS, GuestSessionWaitResult_T *aReason)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
/*
@@ -3542,15 +3475,11 @@ HRESULT GuestSession::waitFor(ULONG aWaitFor, ULONG aTimeoutMS, GuestSessionWait
LogFlowFuncLeaveRC(vrc);
return hr;
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
HRESULT GuestSession::waitForArray(const std::vector<GuestSessionWaitForFlag_T> &aWaitFor, ULONG aTimeoutMS,
GuestSessionWaitResult_T *aReason)
{
-#ifndef VBOX_WITH_GUEST_CONTROL
- ReturnComNotImplemented();
-#else
LogFlowThisFuncEnter();
/*
@@ -3561,6 +3490,5 @@ HRESULT GuestSession::waitForArray(const std::vector<GuestSessionWaitForFlag_T>
fWaitFor |= aWaitFor[i];
return WaitFor(fWaitFor, aTimeoutMS, aReason);
-#endif /* VBOX_WITH_GUEST_CONTROL */
}
diff --git a/src/VBox/Main/src-client/GuestSessionImplTasks.cpp b/src/VBox/Main/src-client/GuestSessionImplTasks.cpp
index 22d9c47..66c93a4 100644
--- a/src/VBox/Main/src-client/GuestSessionImplTasks.cpp
+++ b/src/VBox/Main/src-client/GuestSessionImplTasks.cpp
@@ -20,6 +20,9 @@
* Header Files *
*******************************************************************************/
#include "GuestImpl.h"
+#ifndef VBOX_WITH_GUEST_CONTROL
+# error "VBOX_WITH_GUEST_CONTROL must defined in this file"
+#endif
#include "GuestSessionImpl.h"
#include "GuestCtrlImplPrivate.h"
@@ -308,8 +311,8 @@ int SessionTaskCopyTo::Run(void)
}
GuestProcessStartupInfo procInfo;
- procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_CAT);
- procInfo.mFlags = ProcessCreateFlag_Hidden;
+ procInfo.mExecutable = Utf8Str(VBOXSERVICE_TOOL_CAT);
+ procInfo.mFlags = ProcessCreateFlag_Hidden;
/* Set arguments.*/
procInfo.mArguments.push_back(Utf8StrFmt("--output=%s", mDest.c_str())); /** @todo Do we need path conversion? */
@@ -317,7 +320,7 @@ int SessionTaskCopyTo::Run(void)
/* Startup process. */
ComObjPtr<GuestProcess> pProcess; int guestRc;
if (RT_SUCCESS(rc))
- rc = pSession->i_processCreateExInteral(procInfo, pProcess);
+ rc = pSession->i_processCreateExInternal(procInfo, pProcess);
if (RT_SUCCESS(rc))
{
Assert(!pProcess.isNull());
@@ -606,7 +609,7 @@ int SessionTaskCopyFrom::Run(void)
** @todo Use the IGuestFile API for locking down the file on the guest!
*/
GuestFsObjData objData; int guestRc;
- int rc = pSession->i_fileQueryInfoInternal(Utf8Str(mSource), objData, &guestRc);
+ int rc = pSession->i_fileQueryInfoInternal(Utf8Str(mSource), false /*fFollowSymlinks*/, objData, &guestRc);
if (RT_FAILURE(rc))
{
setProgressErrorMsg(VBOX_E_IPRT_ERROR,
@@ -636,15 +639,15 @@ int SessionTaskCopyFrom::Run(void)
GuestProcessStartupInfo procInfo;
procInfo.mName = Utf8StrFmt(GuestSession::tr("Copying file \"%s\" from guest to the host to \"%s\" (%RI64 bytes)"),
mSource.c_str(), mDest.c_str(), objData.mObjectSize);
- procInfo.mCommand = Utf8Str(VBOXSERVICE_TOOL_CAT);
- procInfo.mFlags = ProcessCreateFlag_Hidden | ProcessCreateFlag_WaitForStdOut;
+ procInfo.mExecutable = Utf8Str(VBOXSERVICE_TOOL_CAT);
+ procInfo.mFlags = ProcessCreateFlag_Hidden | ProcessCreateFlag_WaitForStdOut;
/* Set arguments.*/
procInfo.mArguments.push_back(mSource); /* Which file to output? */
/* Startup process. */
ComObjPtr<GuestProcess> pProcess;
- rc = pSession->i_processCreateExInteral(procInfo, pProcess);
+ rc = pSession->i_processCreateExInternal(procInfo, pProcess);
if (RT_SUCCESS(rc))
rc = pProcess->i_startProcess(30 * 1000 /* 30s timeout */,
&guestRc);
@@ -936,7 +939,7 @@ int SessionTaskUpdateAdditions::i_copyFileToGuest(GuestSession *pSession, PRTISO
{
SessionTaskCopyTo *pTask = new SessionTaskCopyTo(pSession /* GuestSession */,
&pISO->file, cbOffset, cbSize,
- strFileDest, CopyFileFlag_None);
+ strFileDest, FileCopyFlag_None);
AssertPtrReturn(pTask, VERR_NO_MEMORY);
ComObjPtr<Progress> pProgressCopyTo;
@@ -972,7 +975,7 @@ int SessionTaskUpdateAdditions::i_copyFileToGuest(GuestSession *pSession, PRTISO
GuestFsObjData objData;
int64_t cbSizeOnGuest; int guestRc;
- rc = pSession->i_fileQuerySizeInternal(strFileDest, &cbSizeOnGuest, &guestRc);
+ rc = pSession->i_fileQuerySizeInternal(strFileDest, false /*fFollowSymlinks*/, &cbSizeOnGuest, &guestRc);
if ( RT_SUCCESS(rc)
&& cbSize == (uint64_t)cbSizeOnGuest)
{
@@ -1039,7 +1042,7 @@ int SessionTaskUpdateAdditions::i_runFileOnGuest(GuestSession *pSession, GuestPr
case VERR_NOT_EQUAL: /** @todo Special guest control rc needed! */
setProgressErrorMsg(VBOX_E_IPRT_ERROR,
Utf8StrFmt(GuestSession::tr("Running update file \"%s\" on guest terminated with exit code %ld"),
- procInfo.mCommand.c_str(), exitCode));
+ procInfo.mExecutable.c_str(), exitCode));
break;
case VERR_GSTCTL_GUEST_ERROR:
@@ -1050,13 +1053,13 @@ int SessionTaskUpdateAdditions::i_runFileOnGuest(GuestSession *pSession, GuestPr
case VERR_INVALID_STATE: /** @todo Special guest control rc needed! */
setProgressErrorMsg(VBOX_E_IPRT_ERROR,
Utf8StrFmt(GuestSession::tr("Update file \"%s\" reported invalid running state"),
- procInfo.mCommand.c_str()));
+ procInfo.mExecutable.c_str()));
break;
default:
setProgressErrorMsg(VBOX_E_IPRT_ERROR,
Utf8StrFmt(GuestSession::tr("Error while running update file \"%s\" on guest: %Rrc"),
- procInfo.mCommand.c_str(), vrc));
+ procInfo.mExecutable.c_str(), vrc));
break;
}
}
@@ -1412,7 +1415,7 @@ int SessionTaskUpdateAdditions::Run(void)
/* We want to spend 40% total for all copying operations. So roughly
* calculate the specific percentage step of each copied file. */
uint8_t uOffset = 20; /* Start at 20%. */
- uint8_t uStep = 40 / mFiles.size();
+ uint8_t uStep = 40 / (uint8_t)mFiles.size(); Assert(mFiles.size() <= 10);
LogRel(("Copying over Guest Additions update files to the guest ...\n"));
@@ -1452,7 +1455,7 @@ int SessionTaskUpdateAdditions::Run(void)
/* We want to spend 35% total for all copying operations. So roughly
* calculate the specific percentage step of each copied file. */
uint8_t uOffset = 60; /* Start at 60%. */
- uint8_t uStep = 35 / mFiles.size();
+ uint8_t uStep = 35 / (uint8_t)mFiles.size(); Assert(mFiles.size() <= 10);
LogRel(("Executing Guest Additions update files ...\n"));
diff --git a/src/VBox/Main/src-client/HGCM.cpp b/src/VBox/Main/src-client/HGCM.cpp
index d7b01fa..4363488 100644
--- a/src/VBox/Main/src-client/HGCM.cpp
+++ b/src/VBox/Main/src-client/HGCM.cpp
@@ -1,3 +1,4 @@
+/* $Id: HGCM.cpp $ */
/** @file
*
* HGCM (Host-Guest Communication Manager)
diff --git a/src/VBox/Main/src-client/MachineDebuggerImpl.cpp b/src/VBox/Main/src-client/MachineDebuggerImpl.cpp
index 0141d6b..ef0946a 100644
--- a/src/VBox/Main/src-client/MachineDebuggerImpl.cpp
+++ b/src/VBox/Main/src-client/MachineDebuggerImpl.cpp
@@ -1194,15 +1194,17 @@ HRESULT MachineDebugger::getRegisters(ULONG aCpuId, std::vector<com::Utf8Str> &a
{
try
{
-
+ aValues.resize(cRegs);
+ aNames.resize(cRegs);
for (uint32_t iReg = 0; iReg < cRegs; iReg++)
{
- Bstr bstrValue;
-
- hrc = formatRegisterValue(&bstrValue, &paRegs[iReg].Val, paRegs[iReg].enmType);
- AssertComRC(hrc);
+ char szHex[160];
+ szHex[159] = szHex[0] = '\0';
+ ssize_t cch = DBGFR3RegFormatValue(szHex, sizeof(szHex), &paRegs[iReg].Val,
+ paRegs[iReg].enmType, true /*fSpecial*/);
+ Assert(cch > 0);
aNames[iReg] = Utf8Str(paRegs[iReg].pszName);
- aValues[iReg] = Utf8Str(bstrValue);
+ aValues[iReg] = Utf8Str(szHex);
}
}
catch (std::bad_alloc)
diff --git a/src/VBox/Main/src-client/RemoteUSBBackend.cpp b/src/VBox/Main/src-client/RemoteUSBBackend.cpp
index 0a36e5d..ff62599 100644
--- a/src/VBox/Main/src-client/RemoteUSBBackend.cpp
+++ b/src/VBox/Main/src-client/RemoteUSBBackend.cpp
@@ -1,3 +1,4 @@
+/* $Id: RemoteUSBBackend.cpp $ */
/** @file
*
* VirtualBox Remote USB backend
diff --git a/src/VBox/Main/src-client/VBoxDriversRegister.cpp b/src/VBox/Main/src-client/VBoxDriversRegister.cpp
index f2a5db9..d321e71 100644
--- a/src/VBox/Main/src-client/VBoxDriversRegister.cpp
+++ b/src/VBox/Main/src-client/VBoxDriversRegister.cpp
@@ -1,3 +1,4 @@
+/* $Id: VBoxDriversRegister.cpp $ */
/** @file
*
* Main driver registration.
diff --git a/src/VBox/Main/src-client/xpcom/module.cpp b/src/VBox/Main/src-client/xpcom/module.cpp
index 9212bb0..5f6ad5c 100644
--- a/src/VBox/Main/src-client/xpcom/module.cpp
+++ b/src/VBox/Main/src-client/xpcom/module.cpp
@@ -1,3 +1,4 @@
+/* $Id: module.cpp $ */
/** @file
*
* XPCOM module implementation functions
diff --git a/src/VBox/Main/src-helper-apps/VBoxExtPackHelperApp.cpp b/src/VBox/Main/src-helper-apps/VBoxExtPackHelperApp.cpp
index 23e3a38..062dcba 100644
--- a/src/VBox/Main/src-helper-apps/VBoxExtPackHelperApp.cpp
+++ b/src/VBox/Main/src-helper-apps/VBoxExtPackHelperApp.cpp
@@ -1937,7 +1937,7 @@ extern "C" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPST
int cArgs;
char **papszArgs;
- rc = RTGetOptArgvFromString(&papszArgs, &cArgs, pszCmdLine, NULL);
+ rc = RTGetOptArgvFromString(&papszArgs, &cArgs, pszCmdLine, RTGETOPTARGV_CNV_QUOTE_MS_CRT, NULL);
if (RT_SUCCESS(rc))
{
diff --git a/src/VBox/Main/src-server/ApplianceImpl.cpp b/src/VBox/Main/src-server/ApplianceImpl.cpp
index 86f1108..93c4463 100644
--- a/src/VBox/Main/src-server/ApplianceImpl.cpp
+++ b/src/VBox/Main/src-server/ApplianceImpl.cpp
@@ -613,6 +613,20 @@ HRESULT Appliance::getPasswordIds(std::vector<com::Utf8Str> &aIdentifiers)
return S_OK;
}
+HRESULT Appliance::getMediumIdsForPasswordId(const com::Utf8Str &aPasswordId, std::vector<com::Guid> &aIdentifiers)
+{
+ HRESULT hrc = S_OK;
+ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ std::map<com::Utf8Str, GUIDVEC>::const_iterator it = m->m_mapPwIdToMediumIds.find(aPasswordId);
+ if (it != m->m_mapPwIdToMediumIds.end())
+ aIdentifiers = it->second;
+ else
+ hrc = setError(E_FAIL, tr("The given password identifier is not associated with any medium"));
+
+ return hrc;
+}
+
HRESULT Appliance::addPasswords(const std::vector<com::Utf8Str> &aIdentifiers,
const std::vector<com::Utf8Str> &aPasswords)
{
diff --git a/src/VBox/Main/src-server/ApplianceImplExport.cpp b/src/VBox/Main/src-server/ApplianceImplExport.cpp
index 789a40c..b91bd85 100644
--- a/src/VBox/Main/src-server/ApplianceImplExport.cpp
+++ b/src/VBox/Main/src-server/ApplianceImplExport.cpp
@@ -358,12 +358,15 @@ HRESULT Machine::exportTo(const ComPtr<IAppliance> &aAppliance, const com::Utf8S
rc = pBaseMedium->COMGETTER(Size)(&llSize);
if (FAILED(rc)) throw rc;
- /* If the medium is encrypted add the key identifier to the */
+ /* If the medium is encrypted add the key identifier to the list. */
IMedium *iBaseMedium = pBaseMedium;
Medium *pBase = static_cast<Medium*>(iBaseMedium);
const com::Utf8Str strKeyId = pBase->i_getKeyId();
if (!strKeyId.isEmpty())
{
+ IMedium *iMedium = pMedium;
+ Medium *pMed = static_cast<Medium*>(iMedium);
+ com::Guid mediumUuid = pMed->i_getId();
bool fKnown = false;
/* Check whether the ID is already in our sequence, add it otherwise. */
@@ -377,7 +380,20 @@ HRESULT Machine::exportTo(const ComPtr<IAppliance> &aAppliance, const com::Utf8S
}
if (!fKnown)
+ {
+ GUIDVEC vecMediumIds;
+
+ vecMediumIds.push_back(mediumUuid);
pAppliance->m->m_vecPasswordIdentifiers.push_back(strKeyId);
+ pAppliance->m->m_mapPwIdToMediumIds.insert(std::pair<com::Utf8Str, GUIDVEC>(strKeyId, vecMediumIds));
+ }
+ else
+ {
+ std::map<com::Utf8Str, GUIDVEC>::iterator it = pAppliance->m->m_mapPwIdToMediumIds.find(strKeyId);
+ if (it == pAppliance->m->m_mapPwIdToMediumIds.end())
+ throw setError(E_FAIL, tr("Internal error adding a medium UUID to the map"));
+ it->second.push_back(mediumUuid);
+ }
}
}
else if ( deviceType == DeviceType_DVD
diff --git a/src/VBox/Main/src-server/AudioAdapterImpl.cpp b/src/VBox/Main/src-server/AudioAdapterImpl.cpp
index 33b38ce..28e9cee 100644
--- a/src/VBox/Main/src-server/AudioAdapterImpl.cpp
+++ b/src/VBox/Main/src-server/AudioAdapterImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: AudioAdapterImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
@@ -233,6 +234,30 @@ HRESULT AudioAdapter::setEnabled(BOOL aEnabled)
return S_OK;
}
+HRESULT AudioAdapter::getEnabledIn(BOOL *aEnabled)
+{
+ NOREF(aEnabled);
+ return E_NOTIMPL;
+}
+
+HRESULT AudioAdapter::setEnabledIn(BOOL aEnabled)
+{
+ NOREF(aEnabled);
+ return E_NOTIMPL;
+}
+
+HRESULT AudioAdapter::getEnabledOut(BOOL *aEnabled)
+{
+ NOREF(aEnabled);
+ return E_NOTIMPL;
+}
+
+HRESULT AudioAdapter::setEnabledOut(BOOL aEnabled)
+{
+ NOREF(aEnabled);
+ return E_NOTIMPL;
+}
+
HRESULT AudioAdapter::getAudioDriver(AudioDriverType_T *aAudioDriver)
{
AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
diff --git a/src/VBox/Main/src-server/BIOSSettingsImpl.cpp b/src/VBox/Main/src-server/BIOSSettingsImpl.cpp
index 35b8ce8..dc3236c 100644
--- a/src/VBox/Main/src-server/BIOSSettingsImpl.cpp
+++ b/src/VBox/Main/src-server/BIOSSettingsImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: BIOSSettingsImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/src-server/BandwidthControlImpl.cpp b/src/VBox/Main/src-server/BandwidthControlImpl.cpp
index 110fcd9..1a6b62d 100644
--- a/src/VBox/Main/src-server/BandwidthControlImpl.cpp
+++ b/src/VBox/Main/src-server/BandwidthControlImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: BandwidthControlImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/src-server/BandwidthGroupImpl.cpp b/src/VBox/Main/src-server/BandwidthGroupImpl.cpp
index 636cbbb..d183b9e 100644
--- a/src/VBox/Main/src-server/BandwidthGroupImpl.cpp
+++ b/src/VBox/Main/src-server/BandwidthGroupImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: BandwidthGroupImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/src-server/ClientToken.cpp b/src/VBox/Main/src-server/ClientToken.cpp
index be0afb8..173d19b 100644
--- a/src/VBox/Main/src-server/ClientToken.cpp
+++ b/src/VBox/Main/src-server/ClientToken.cpp
@@ -1,3 +1,4 @@
+/* $Id: ClientToken.cpp $ */
/** @file
*
* VirtualBox API client session crash token handling
diff --git a/src/VBox/Main/src-server/ClientWatcher.cpp b/src/VBox/Main/src-server/ClientWatcher.cpp
index cadd0fe..7ad7f8d 100644
--- a/src/VBox/Main/src-server/ClientWatcher.cpp
+++ b/src/VBox/Main/src-server/ClientWatcher.cpp
@@ -1,3 +1,4 @@
+/* $Id: ClientWatcher.cpp $ */
/** @file
*
* VirtualBox API client session crash watcher
diff --git a/src/VBox/Main/src-server/GuestOSTypeImpl.cpp b/src/VBox/Main/src-server/GuestOSTypeImpl.cpp
index edf049a..a13bb45 100644
--- a/src/VBox/Main/src-server/GuestOSTypeImpl.cpp
+++ b/src/VBox/Main/src-server/GuestOSTypeImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: GuestOSTypeImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/src-server/HostDnsService.cpp b/src/VBox/Main/src-server/HostDnsService.cpp
index 8fc61cc..b387275 100644
--- a/src/VBox/Main/src-server/HostDnsService.cpp
+++ b/src/VBox/Main/src-server/HostDnsService.cpp
@@ -23,6 +23,7 @@
#include "Logging.h"
#include "VirtualBoxImpl.h"
+#include <iprt/time.h>
#include <iprt/thread.h>
#include <iprt/semaphore.h>
#include <iprt/critsect.h>
@@ -70,16 +71,20 @@ inline static void detachVectorOfString(const std::vector<std::string>& v,
struct HostDnsMonitor::Data
{
Data(bool aThreaded)
- : fDNSOrderIgnore(false),
- fThreaded(aThreaded)
+ : uLastExtraDataPoll(0),
+ fDNSOrderIgnore(false),
+ fThreaded(aThreaded),
+ virtualbox(NULL)
{}
std::vector<PCHostDnsMonitorProxy> proxies;
HostDnsInformation info;
+ uint64_t uLastExtraDataPoll;
bool fDNSOrderIgnore;
const bool fThreaded;
RTTHREAD hMonitoringThread;
RTSEMEVENT hDnsInitEvent;
+ VirtualBox *virtualbox;
};
struct HostDnsMonitorProxy::Data
@@ -185,6 +190,8 @@ void HostDnsMonitor::setInfo(const HostDnsInformation &info)
{
RTCLock grab(m_LockMtx);
+ pollGlobalExtraData();
+
if (info.equals(m->info))
return;
@@ -209,20 +216,9 @@ void HostDnsMonitor::setInfo(const HostDnsInformation &info)
HRESULT HostDnsMonitor::init(VirtualBox *virtualbox)
{
- const com::Bstr bstrHostDNSOrderIgnoreKey("VBoxInternal2/HostDNSOrderIgnore");
- com::Bstr bstrHostDNSOrderIgnore;
- virtualbox->GetExtraData(bstrHostDNSOrderIgnoreKey.raw(),
- bstrHostDNSOrderIgnore.asOutParam());
-
- if (bstrHostDNSOrderIgnore.isNotEmpty())
- {
- LogRel(("HostDnsMonitor: %ls=%ls\n",
- bstrHostDNSOrderIgnoreKey.raw(),
- bstrHostDNSOrderIgnore.raw()));
+ m->virtualbox = virtualbox;
- if (bstrHostDNSOrderIgnore != "0")
- m->fDNSOrderIgnore = true;
- }
+ pollGlobalExtraData();
if (m->fThreaded)
{
@@ -240,6 +236,34 @@ HRESULT HostDnsMonitor::init(VirtualBox *virtualbox)
}
+void HostDnsMonitor::pollGlobalExtraData()
+{
+ uint64_t uNow = RTTimeNanoTS();
+ if (m->virtualbox && (uNow - m->uLastExtraDataPoll >= RT_NS_30SEC || m->uLastExtraDataPoll == 0))
+ {
+ m->uLastExtraDataPoll = uNow;
+
+ const com::Bstr bstrHostDNSOrderIgnoreKey("VBoxInternal2/HostDNSOrderIgnore");
+ com::Bstr bstrHostDNSOrderIgnore;
+ m->virtualbox->GetExtraData(bstrHostDNSOrderIgnoreKey.raw(),
+ bstrHostDNSOrderIgnore.asOutParam());
+ bool fDNSOrderIgnore = false;
+ if (bstrHostDNSOrderIgnore.isNotEmpty())
+ {
+ if (bstrHostDNSOrderIgnore != "0")
+ fDNSOrderIgnore = true;
+ }
+
+ if (fDNSOrderIgnore != m->fDNSOrderIgnore)
+ {
+ m->fDNSOrderIgnore = fDNSOrderIgnore;
+ LogRel(("HostDnsMonitor: %ls=%ls\n",
+ bstrHostDNSOrderIgnoreKey.raw(),
+ bstrHostDNSOrderIgnore.raw()));
+ }
+ }
+}
+
void HostDnsMonitor::monitorThreadInitializationDone()
{
RTSemEventSignal(m->hDnsInitEvent);
diff --git a/src/VBox/Main/src-server/HostDnsService.h b/src/VBox/Main/src-server/HostDnsService.h
index 2861d34..81477f2 100644
--- a/src/VBox/Main/src-server/HostDnsService.h
+++ b/src/VBox/Main/src-server/HostDnsService.h
@@ -73,6 +73,7 @@ class HostDnsMonitor
HostDnsMonitor(const HostDnsMonitor &);
HostDnsMonitor& operator= (const HostDnsMonitor &);
static int threadMonitoringRoutine(RTTHREAD, void *);
+ void pollGlobalExtraData();
protected:
mutable RTCLockMtx m_LockMtx;
@@ -101,7 +102,7 @@ class HostDnsMonitorProxy
private:
void updateInfo();
-
+
private:
mutable RTCLockMtx m_LockMtx;
diff --git a/src/VBox/Main/src-server/HostImpl.cpp b/src/VBox/Main/src-server/HostImpl.cpp
index e35774d..1f9f7bb 100644
--- a/src/VBox/Main/src-server/HostImpl.cpp
+++ b/src/VBox/Main/src-server/HostImpl.cpp
@@ -303,6 +303,8 @@ HRESULT Host::init(VirtualBox *aParent)
#if defined(RT_OS_WINDOWS)
m->pHostPowerService = new HostPowerServiceWin(m->pParent);
+#elif defined(RT_OS_LINUX) && defined(VBOX_WITH_DBUS)
+ m->pHostPowerService = new HostPowerServiceLinux(m->pParent);
#elif defined(RT_OS_DARWIN)
m->pHostPowerService = new HostPowerServiceDarwin(m->pParent);
#else
@@ -475,9 +477,16 @@ void Host::uninit()
/*
* Note that unregisterMetrics() has unregistered all metrics associated
* with Host including network interface ones. We can destroy network
- * interface objects now.
+ * interface objects now. Don't forget the uninit call, otherwise this
+ * causes a race with crashing API clients getting their stale references
+ * cleaned up and VirtualBox shutting down.
*/
- m->llNetIfs.clear();
+ while (!m->llNetIfs.empty())
+ {
+ ComObjPtr<HostNetworkInterface> &pNet = m->llNetIfs.front();
+ pNet->uninit();
+ m->llNetIfs.pop_front();
+ }
#ifdef VBOX_WITH_USB
/* wait for USB proxy service to terminate before we uninit all USB
@@ -492,17 +501,35 @@ void Host::uninit()
#ifdef VBOX_WITH_USB
/* uninit all USB device filters still referenced by clients
- * Note! HostUSBDeviceFilter::uninit() will modify llChildren. */
+ * Note! HostUSBDeviceFilter::uninit() will modify llChildren.
+ * This list should be already empty, but better be safe than sorry. */
while (!m->llChildren.empty())
{
ComObjPtr<HostUSBDeviceFilter> &pChild = m->llChildren.front();
- m->llChildren.pop_front();
pChild->uninit();
+ m->llChildren.pop_front();
}
+ /* No need to uninit these, as either Machine::uninit() or the above loop
+ * already covered them all. Subset of llChildren. */
m->llUSBDeviceFilters.clear();
#endif
+ /* uninit all host DVD medium objects */
+ while (!m->llDVDDrives.empty())
+ {
+ ComObjPtr<Medium> &pMedium = m->llDVDDrives.front();
+ pMedium->uninit();
+ m->llDVDDrives.pop_front();
+ }
+ /* uninit all host floppy medium objects */
+ while (!m->llFloppyDrives.empty())
+ {
+ ComObjPtr<Medium> &pMedium = m->llFloppyDrives.front();
+ pMedium->uninit();
+ m->llFloppyDrives.pop_front();
+ }
+
delete m;
m = NULL;
}
@@ -1845,7 +1872,10 @@ HRESULT Host::i_getDrives(DeviceType_T mediumType,
}
}
if (!fFound)
+ {
+ pCached->uninit();
itCached = pllCached->erase(itCached);
+ }
else
++itCached;
}
@@ -2989,6 +3019,7 @@ HRESULT Host::i_updateNetIfList()
if (nameNew == nameOld)
{
fGone = false;
+ (*itNew)->uninit();
listCopy.erase(itNew);
break;
}
@@ -2997,6 +3028,7 @@ HRESULT Host::i_updateNetIfList()
{
# ifdef VBOX_WITH_RESOURCE_USAGE_API
(*itOld)->i_unregisterMetrics(aCollector, this);
+ (*itOld)->uninit();
# endif
}
}
diff --git a/src/VBox/Main/src-server/HostPower.cpp b/src/VBox/Main/src-server/HostPower.cpp
index d5e573c..4dfae2f 100644
--- a/src/VBox/Main/src-server/HostPower.cpp
+++ b/src/VBox/Main/src-server/HostPower.cpp
@@ -1,3 +1,4 @@
+/* $Id: HostPower.cpp $ */
/** @file
*
* VirtualBox interface to host's power notification service
diff --git a/src/VBox/Main/src-server/HostVideoInputDeviceImpl.cpp b/src/VBox/Main/src-server/HostVideoInputDeviceImpl.cpp
index 8736d79..1d84b3d 100644
--- a/src/VBox/Main/src-server/HostVideoInputDeviceImpl.cpp
+++ b/src/VBox/Main/src-server/HostVideoInputDeviceImpl.cpp
@@ -74,14 +74,14 @@ void HostVideoInputDevice::uninit()
{
LogFlowThisFunc(("\n"));
- m.name.setNull();
- m.path.setNull();
- m.alias.setNull();
-
/* Enclose the state transition Ready->InUninit->NotReady */
AutoUninitSpan autoUninitSpan(this);
if (autoUninitSpan.uninitDone())
return;
+
+ m.name.setNull();
+ m.path.setNull();
+ m.alias.setNull();
}
static HRESULT hostVideoInputDeviceAdd(HostVideoInputDeviceList *pList,
diff --git a/src/VBox/Main/src-server/MachineImpl.cpp b/src/VBox/Main/src-server/MachineImpl.cpp
index d8e5ba6..caa721f 100644
--- a/src/VBox/Main/src-server/MachineImpl.cpp
+++ b/src/VBox/Main/src-server/MachineImpl.cpp
@@ -38,7 +38,6 @@
#include "SharedFolderImpl.h"
#include "GuestOSTypeImpl.h"
#include "VirtualBoxErrorInfoImpl.h"
-#include "GuestImpl.h"
#include "StorageControllerImpl.h"
#include "DisplayImpl.h"
#include "DisplayUtils.h"
@@ -193,9 +192,10 @@ Machine::HWData::HWData()
mPAEEnabled = false;
#endif
mLongMode = HC_ARCH_BITS == 64 ? settings::Hardware::LongMode_Enabled : settings::Hardware::LongMode_Disabled;
- mSyntheticCpu = false;
mTripleFaultReset = false;
mHPETEnabled = false;
+ mCpuExecutionCap = 100; /* Maximum CPU execution cap by default. */
+ mCpuIdPortabilityLevel = 0;
/* default boot order: floppy - DVD - HDD */
mBootOrder[0] = DeviceType_Floppy;
@@ -220,9 +220,6 @@ Machine::HWData::HWData()
mIOCacheEnabled = true;
mIOCacheSize = 5; /* 5MB */
-
- /* Maximum CPU execution cap by default. */
- mCpuExecutionCap = 100;
}
Machine::HWData::~HWData()
@@ -1585,6 +1582,29 @@ HRESULT Machine::setCPUHotPlugEnabled(BOOL aCPUHotPlugEnabled)
return rc;
}
+HRESULT Machine::getCPUIDPortabilityLevel(ULONG *aCPUIDPortabilityLevel)
+{
+ AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ *aCPUIDPortabilityLevel = mHWData->mCpuIdPortabilityLevel;
+
+ return S_OK;
+}
+
+HRESULT Machine::setCPUIDPortabilityLevel(ULONG aCPUIDPortabilityLevel)
+{
+ AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
+
+ HRESULT hrc = i_checkStateDependency(MutableStateDep);
+ if (SUCCEEDED(hrc))
+ {
+ i_setModified(IsModified_MachineData);
+ mHWData.backup();
+ mHWData->mCpuIdPortabilityLevel = aCPUIDPortabilityLevel;
+ }
+ return hrc;
+}
+
HRESULT Machine::getEmulatedUSBCardReaderEnabled(BOOL *aEmulatedUSBCardReaderEnabled)
{
#ifdef VBOX_WITH_USB_CARDREADER
@@ -2141,10 +2161,6 @@ HRESULT Machine::getCPUProperty(CPUPropertyType_T aProperty, BOOL *aValue)
*aValue = mHWData->mPAEEnabled;
break;
- case CPUPropertyType_Synthetic:
- *aValue = mHWData->mSyntheticCpu;
- break;
-
case CPUPropertyType_LongMode:
if (mHWData->mLongMode == settings::Hardware::LongMode_Enabled)
*aValue = TRUE;
@@ -2203,12 +2219,6 @@ HRESULT Machine::setCPUProperty(CPUPropertyType_T aProperty, BOOL aValue)
mHWData->mPAEEnabled = !!aValue;
break;
- case CPUPropertyType_Synthetic:
- i_setModified(IsModified_MachineData);
- mHWData.backup();
- mHWData->mSyntheticCpu = !!aValue;
- break;
-
case CPUPropertyType_LongMode:
i_setModified(IsModified_MachineData);
mHWData.backup();
@@ -3197,7 +3207,6 @@ HRESULT Machine::setIOCacheSize(ULONG aIOCacheSize)
*/
HRESULT Machine::lockMachine(const ComPtr<ISession> &aSession,
LockType_T aLockType)
-
{
/* check the session state */
SessionState_T state;
@@ -3249,7 +3258,6 @@ HRESULT Machine::lockMachine(const ComPtr<ISession> &aSession,
// 3) process W: the process which already holds the write lock on the machine (write-locking session)
// copy pointers to W (the write-locking session) before leaving lock (these must not be NULL)
- ComAssertRet(mData->mSession.mLockType == LockType_Write || mData->mSession.mLockType == LockType_VM, E_FAIL);
ComPtr<IInternalSessionControl> pSessionW = mData->mSession.mDirectControl;
ComAssertRet(!pSessionW.isNull(), E_FAIL);
ComObjPtr<SessionMachine> pSessionMachine = mData->mSession.mMachine;
@@ -4419,7 +4427,7 @@ HRESULT Machine::temporaryEjectDevice(const com::Utf8Str &aName, LONG aControlle
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
- HRESULT rc = i_checkStateDependency(MutableStateDep);
+ HRESULT rc = i_checkStateDependency(MutableOrSavedOrRunningStateDep);
if (FAILED(rc)) return rc;
MediumAttachment *pAttach = i_findAttachment(mMediaData->mAttachments,
@@ -8799,12 +8807,12 @@ HRESULT Machine::i_loadHardware(const settings::Hardware &data, const settings::
mHWData->mHWVirtExUXEnabled = data.fUnrestrictedExecution;
mHWData->mHWVirtExForceEnabled = data.fHardwareVirtForce;
mHWData->mPAEEnabled = data.fPAE;
- mHWData->mSyntheticCpu = data.fSyntheticCpu;
mHWData->mLongMode = data.enmLongMode;
mHWData->mTripleFaultReset = data.fTripleFaultReset;
mHWData->mCPUCount = data.cCPUs;
mHWData->mCPUHotPlugEnabled = data.fCpuHotPlug;
mHWData->mCpuExecutionCap = data.ulCpuExecutionCap;
+ mHWData->mCpuIdPortabilityLevel = data.uCpuIdPortabilityLevel;
// cpu
if (mHWData->mCPUHotPlugEnabled)
@@ -9994,11 +10002,11 @@ void Machine::i_copyMachineDataToSettings(settings::MachineConfigFile &config)
if ( mData->mMachineState == MachineState_Saved
|| mData->mMachineState == MachineState_Restoring
- // when deleting a snapshot we may or may not have a saved state in the current state,
- // so let's not assert here please
- || ( ( mData->mMachineState == MachineState_DeletingSnapshot
- || mData->mMachineState == MachineState_DeletingSnapshotOnline
- || mData->mMachineState == MachineState_DeletingSnapshotPaused)
+ // when doing certain snapshot operations we may or may not have
+ // a saved state in the current state, so keep everything as is
+ || ( ( mData->mMachineState == MachineState_Snapshotting
+ || mData->mMachineState == MachineState_DeletingSnapshot
+ || mData->mMachineState == MachineState_RestoringSnapshot)
&& (!mSSData->strStateFilePath.isEmpty())
)
)
@@ -10126,25 +10134,11 @@ HRESULT Machine::i_saveHardware(settings::Hardware &data, settings::Debugging *p
data.fHardwareVirtForce = !!mHWData->mHWVirtExForceEnabled;
data.fPAE = !!mHWData->mPAEEnabled;
data.enmLongMode = mHWData->mLongMode;
- data.fSyntheticCpu = !!mHWData->mSyntheticCpu;
data.fTripleFaultReset = !!mHWData->mTripleFaultReset;
-
- /* Standard and Extended CPUID leafs. */
- data.llCpuIdLeafs.clear();
- for (unsigned idx = 0; idx < RT_ELEMENTS(mHWData->mCpuIdStdLeafs); ++idx)
- {
- if (mHWData->mCpuIdStdLeafs[idx].ulId != UINT32_MAX)
- data.llCpuIdLeafs.push_back(mHWData->mCpuIdStdLeafs[idx]);
- }
- for (unsigned idx = 0; idx < RT_ELEMENTS(mHWData->mCpuIdExtLeafs); ++idx)
- {
- if (mHWData->mCpuIdExtLeafs[idx].ulId != UINT32_MAX)
- data.llCpuIdLeafs.push_back(mHWData->mCpuIdExtLeafs[idx]);
- }
-
- data.cCPUs = mHWData->mCPUCount;
- data.fCpuHotPlug = !!mHWData->mCPUHotPlugEnabled;
- data.ulCpuExecutionCap = mHWData->mCpuExecutionCap;
+ data.cCPUs = mHWData->mCPUCount;
+ data.fCpuHotPlug = !!mHWData->mCPUHotPlugEnabled;
+ data.ulCpuExecutionCap = mHWData->mCpuExecutionCap;
+ data.uCpuIdPortabilityLevel = mHWData->mCpuIdPortabilityLevel;
data.llCpus.clear();
if (data.fCpuHotPlug)
@@ -10160,6 +10154,15 @@ HRESULT Machine::i_saveHardware(settings::Hardware &data, settings::Debugging *p
}
}
+ /* Standard and Extended CPUID leafs. */
+ data.llCpuIdLeafs.clear();
+ for (unsigned idx = 0; idx < RT_ELEMENTS(mHWData->mCpuIdStdLeafs); ++idx)
+ if (mHWData->mCpuIdStdLeafs[idx].ulId != UINT32_MAX)
+ data.llCpuIdLeafs.push_back(mHWData->mCpuIdStdLeafs[idx]);
+ for (unsigned idx = 0; idx < RT_ELEMENTS(mHWData->mCpuIdExtLeafs); ++idx)
+ if (mHWData->mCpuIdExtLeafs[idx].ulId != UINT32_MAX)
+ data.llCpuIdLeafs.push_back(mHWData->mCpuIdExtLeafs[idx]);
+
// memory
data.ulMemorySizeMB = mHWData->mMemorySize;
data.fPageFusionEnabled = !!mHWData->mPageFusionEnabled;
@@ -13370,16 +13373,19 @@ HRESULT SessionMachine::pullGuestProperties(std::vector<com::Utf8Str> &aNames,
#endif
}
-HRESULT SessionMachine::pushGuestProperty(const com::Utf8Str &aName,
- const com::Utf8Str &aValue,
- LONG64 aTimestamp,
- const com::Utf8Str &aFlags)
+HRESULT SessionMachine::pushGuestProperty(const com::Utf8Str &aName,
+ const com::Utf8Str &aValue,
+ LONG64 aTimestamp,
+ const com::Utf8Str &aFlags,
+ BOOL *aNotify)
{
LogFlowThisFunc(("\n"));
#ifdef VBOX_WITH_GUEST_PROPS
using namespace guestProp;
+ *aNotify = FALSE;
+
try
{
/*
@@ -13462,6 +13468,7 @@ HRESULT SessionMachine::pushGuestProperty(const com::Utf8Str &aName,
Bstr(aName).raw(),
Bstr(aValue).raw(),
Bstr(aFlags).raw());
+ *aNotify = TRUE;
}
}
catch (...)
@@ -14704,12 +14711,14 @@ HRESULT Machine::pullGuestProperties(std::vector<com::Utf8Str> &aNames,
HRESULT Machine::pushGuestProperty(const com::Utf8Str &aName,
const com::Utf8Str &aValue,
LONG64 aTimestamp,
- const com::Utf8Str &aFlags)
+ const com::Utf8Str &aFlags,
+ BOOL *aNotify)
{
NOREF(aName);
NOREF(aValue);
NOREF(aTimestamp);
NOREF(aFlags);
+ NOREF(aNotify);
ReturnComNotImplemented();
}
diff --git a/src/VBox/Main/src-server/Matching.cpp b/src/VBox/Main/src-server/Matching.cpp
index a2e0a4a..7808a21 100644
--- a/src/VBox/Main/src-server/Matching.cpp
+++ b/src/VBox/Main/src-server/Matching.cpp
@@ -1,3 +1,4 @@
+/* $Id: Matching.cpp $ */
/** @file
*
* Definition of template classes that provide simple API to
diff --git a/src/VBox/Main/src-server/MediumAttachmentImpl.cpp b/src/VBox/Main/src-server/MediumAttachmentImpl.cpp
index dcb0a14..4a744ab 100644
--- a/src/VBox/Main/src-server/MediumAttachmentImpl.cpp
+++ b/src/VBox/Main/src-server/MediumAttachmentImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: MediumAttachmentImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/src-server/MediumImpl.cpp b/src/VBox/Main/src-server/MediumImpl.cpp
index acf54a1..2cc7177 100644
--- a/src/VBox/Main/src-server/MediumImpl.cpp
+++ b/src/VBox/Main/src-server/MediumImpl.cpp
@@ -705,6 +705,9 @@ public:
RTMemWipeThoroughly(mstrNewPassword.mutableRaw(), mstrNewPassword.length(), 10 /* cPasses */);
if (mstrCurrentPassword.length())
RTMemWipeThoroughly(mstrCurrentPassword.mutableRaw(), mstrCurrentPassword.length(), 10 /* cPasses */);
+
+ /* Keep any errors which might be set when deleting the lock list. */
+ ErrorInfoKeeper eik;
delete mpMediumLockList;
}
@@ -3176,10 +3179,15 @@ HRESULT Medium::changeEncryption(const com::Utf8Str &aCurrentPassword, const com
throw rc;
}
+ const char *pszAction = "Encrypting";
+ if ( aCurrentPassword.isNotEmpty()
+ && aCipher.isEmpty())
+ pszAction = "Decrypting";
+
pProgress.createObject();
rc = pProgress->init(m->pVirtualBox,
static_cast <IMedium *>(this),
- BstrFmt(tr("Encrypting medium '%s'"), m->strLocationFull.c_str()).raw(),
+ BstrFmt(tr("%s medium '%s'"), pszAction, m->strLocationFull.c_str()).raw(),
TRUE /* aCancelable */);
if (FAILED(rc))
{
@@ -4639,6 +4647,26 @@ HRESULT Medium::i_deleteStorage(ComObjPtr<Progress> *aProgress,
tr("Medium format '%s' does not support storage deletion"),
m->strFormat.c_str());
+ /* Wait for a concurrently running Medium::i_queryInfo to complete. */
+ /** @todo r=klaus would be great if this could be moved to the async
+ * part of the operation as it can take quite a while */
+ if (m->queryInfoRunning)
+ {
+ while (m->queryInfoRunning)
+ {
+ multilock.release();
+ /* Must not hold the media tree lock or the object lock, as
+ * Medium::i_queryInfo needs this lock and thus we would run
+ * into a deadlock here. */
+ Assert(!m->pVirtualBox->i_getMediaTreeLockHandle().isWriteLockOnCurrentThread());
+ Assert(!isWriteLockOnCurrentThread());
+ {
+ AutoReadLock qlock(m->queryInfoSem COMMA_LOCKVAL_SRC_POS);
+ }
+ multilock.acquire();
+ }
+ }
+
/* Note that we are fine with Inaccessible state too: a) for symmetry
* with create calls and b) because it doesn't really harm to try, if
* it is really inaccessible, the delete operation will fail anyway.
diff --git a/src/VBox/Main/src-server/MediumLock.cpp b/src/VBox/Main/src-server/MediumLock.cpp
index c69150e..f9831d4 100644
--- a/src/VBox/Main/src-server/MediumLock.cpp
+++ b/src/VBox/Main/src-server/MediumLock.cpp
@@ -1,3 +1,4 @@
+/* $Id: MediumLock.cpp $ */
/** @file
*
* Medium lock management helper classes
diff --git a/src/VBox/Main/src-server/PerformanceImpl.cpp b/src/VBox/Main/src-server/PerformanceImpl.cpp
index 5257de7..0327517 100644
--- a/src/VBox/Main/src-server/PerformanceImpl.cpp
+++ b/src/VBox/Main/src-server/PerformanceImpl.cpp
@@ -669,7 +669,9 @@ void PerformanceCollector::suspendSampling()
if (!SUCCEEDED(autoCaller.rc())) return;
int rc = RTTimerLRStop(m.sampler);
- AssertRC(rc);
+ if ( RT_FAILURE(rc)
+ && rc != VERR_TIMER_SUSPENDED) /* calling suspendSampling() successively shouldn't assert. See @bugref{3495}. */
+ AssertMsgFailed(("PerformanceCollector::suspendSampling(): RTTimerLRStop returned %Rrc\n", rc));
}
void PerformanceCollector::resumeSampling()
@@ -678,7 +680,9 @@ void PerformanceCollector::resumeSampling()
if (!SUCCEEDED(autoCaller.rc())) return;
int rc = RTTimerLRStart(m.sampler, 0);
- AssertRC(rc);
+ if ( RT_FAILURE(rc)
+ && rc != VERR_TIMER_ACTIVE) /* calling resumeSampling() successively shouldn't assert. See @bugref{3495}. */
+ AssertMsgFailed(("PerformanceCollector::resumeSampling(): RTTimerLRStart returned %Rrc\n", rc));
}
diff --git a/src/VBox/Main/src-server/SerialPortImpl.cpp b/src/VBox/Main/src-server/SerialPortImpl.cpp
index 29d5c4c..7cdfd60 100644
--- a/src/VBox/Main/src-server/SerialPortImpl.cpp
+++ b/src/VBox/Main/src-server/SerialPortImpl.cpp
@@ -1,3 +1,4 @@
+/* $Id: SerialPortImpl.cpp $ */
/** @file
*
* VirtualBox COM class implementation
diff --git a/src/VBox/Main/src-server/SnapshotImpl.cpp b/src/VBox/Main/src-server/SnapshotImpl.cpp
index a52956b..ba57161 100644
--- a/src/VBox/Main/src-server/SnapshotImpl.cpp
+++ b/src/VBox/Main/src-server/SnapshotImpl.cpp
@@ -1343,6 +1343,10 @@ struct SessionMachine::TakeSnapshotTask
{
if (fTakingSnapshotOnline)
m_pDirectControl = m->mData->mSession.mDirectControl;
+ // If the VM is already paused then there's no point trying to pause
+ // again during taking an (always online) snapshot.
+ if (m_machineStateBackup == MachineState_Paused)
+ m_fPause = false;
}
void handler()
@@ -1554,8 +1558,7 @@ void SessionMachine::i_takeSnapshotHandler(TakeSnapshotTask &task)
try
{
// @todo: at this point we have to be in the right state!!!!
- AssertStmt( !Global::IsOnlineOrTransient(mData->mMachineState)
- || mData->mMachineState == MachineState_Snapshotting
+ AssertStmt( mData->mMachineState == MachineState_Snapshotting
|| mData->mMachineState == MachineState_OnlineSnapshotting
|| mData->mMachineState == MachineState_LiveSnapshotting, throw E_FAIL);
AssertStmt(task.m_machineStateBackup != mData->mMachineState, throw E_FAIL);
@@ -1569,17 +1572,13 @@ void SessionMachine::i_takeSnapshotHandler(TakeSnapshotTask &task)
mUserData->s.strName.c_str());
}
- if ( !task.m_fTakingSnapshotOnline
- && mData->mMachineState != MachineState_Saved)
- {
- /* save settings to ensure current changes are committed and
- * hard disks are fixed up */
- rc = i_saveSettings(NULL);
- // no need to check for whether VirtualBox.xml needs changing since
- // we can't have a machine XML rename pending at this point
- if (FAILED(rc))
- throw rc;
- }
+ /* save settings to ensure current changes are committed and
+ * hard disks are fixed up */
+ rc = i_saveSettings(NULL);
+ // no need to check for whether VirtualBox.xml needs changing since
+ // we can't have a machine XML rename pending at this point
+ if (FAILED(rc))
+ throw rc;
/* task.m_strStateFilePath is "" when the machine is offline or saved */
if (task.m_fTakingSnapshotOnline)
@@ -1591,7 +1590,7 @@ void SessionMachine::i_takeSnapshotHandler(TakeSnapshotTask &task)
// creating a new online snapshot: we need a fresh saved state file
i_composeSavedStateFilename(task.m_strStateFilePath);
}
- else if (mData->mMachineState == MachineState_Saved)
+ else if (task.m_machineStateBackup == MachineState_Saved)
// taking an offline snapshot from machine in "saved" state: use existing state file
task.m_strStateFilePath = mSSData->strStateFilePath;
@@ -1652,14 +1651,6 @@ void SessionMachine::i_takeSnapshotHandler(TakeSnapshotTask &task)
fBeganTakingSnapshot = true;
- /* Check sanity: for offline snapshots there must not be a saved state
- * file name. All other combinations are valid (though online snapshots
- * without saved state file seems inconsistent - there are exotic use
- * cases, which need to be explicitly enabled, see the code above. */
- if ( !task.m_fTakingSnapshotOnline
- && !task.m_strStateFilePath.isEmpty())
- throw setError(E_FAIL, "Invalid state of saved state file");
-
// STEP 3: save the VM state (if online)
if (task.m_fTakingSnapshotOnline)
{
@@ -1728,8 +1719,11 @@ void SessionMachine::i_takeSnapshotHandler(TakeSnapshotTask &task)
// have to postpone this to the end as i_finishTakingSnapshot() needs
// it for various cleanup steps
- task.m_pSnapshot->uninit();
- task.m_pSnapshot.setNull();
+ if (task.m_pSnapshot)
+ {
+ task.m_pSnapshot->uninit();
+ task.m_pSnapshot.setNull();
+ }
}
Assert(alock.isWriteLockOnCurrentThread());
@@ -1801,6 +1795,9 @@ void SessionMachine::i_takeSnapshotHandler(TakeSnapshotTask &task)
task.m_pProgress->i_notifyComplete(rc);
+ if (SUCCEEDED(rc))
+ mParent->i_onSnapshotTaken(mData->mUuid,
+ task.m_pSnapshot->i_getId());
LogFlowThisFuncLeave();
}
@@ -1844,8 +1841,6 @@ HRESULT SessionMachine::i_finishTakingSnapshot(TakeSnapshotTask &task, AutoWrite
ComObjPtr<Snapshot> pOldFirstSnap = mData->mFirstSnapshot;
ComObjPtr<Snapshot> pOldCurrentSnap = mData->mCurrentSnapshot;
- bool fOnline = Global::IsOnline(task.m_machineStateBackup);
-
HRESULT rc = S_OK;
if (aSuccess)
@@ -1859,7 +1854,7 @@ HRESULT SessionMachine::i_finishTakingSnapshot(TakeSnapshotTask &task, AutoWrite
int flSaveSettings = SaveS_Force; // do not do a deep compare in machine settings,
// snapshots change, so we know we need to save
- if (!fOnline)
+ if (!task.m_fTakingSnapshotOnline)
/* the machine was powered off or saved when taking a snapshot, so
* reset the mCurrentStateModified flag */
flSaveSettings |= SaveS_ResetCurStateModified;
@@ -1870,11 +1865,7 @@ HRESULT SessionMachine::i_finishTakingSnapshot(TakeSnapshotTask &task, AutoWrite
if (aSuccess && SUCCEEDED(rc))
{
/* associate old hard disks with the snapshot and do locking/unlocking*/
- i_commitMedia(fOnline);
-
- /* inform callbacks */
- mParent->i_onSnapshotTaken(mData->mUuid,
- task.m_pSnapshot->i_getId());
+ i_commitMedia(task.m_fTakingSnapshotOnline);
alock.release();
}
else
@@ -1889,7 +1880,7 @@ HRESULT SessionMachine::i_finishTakingSnapshot(TakeSnapshotTask &task, AutoWrite
mData->mCurrentSnapshot = pOldCurrentSnap; // might have been changed above
// delete the saved state file (it might have been already created)
- if (fOnline)
+ if (task.m_fTakingSnapshotOnline)
// no need to test for whether the saved state file is shared: an online
// snapshot means that a new saved state file was created, which we must
// clean up now
@@ -2047,8 +2038,6 @@ void SessionMachine::i_restoreSnapshotHandler(RestoreSnapshotTask &task)
HRESULT rc = S_OK;
- bool stateRestored = false;
-
try
{
AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
@@ -2168,11 +2157,9 @@ void SessionMachine::i_restoreSnapshotHandler(RestoreSnapshotTask &task)
/* we have already deleted the current state, so set the execution
* state accordingly no matter of the delete snapshot result */
if (mSSData->strStateFilePath.isNotEmpty())
- i_setMachineState(MachineState_Saved);
+ task.modifyBackedUpState(MachineState_Saved);
else
- i_setMachineState(MachineState_PoweredOff);
-
- stateRestored = true;
+ task.modifyBackedUpState(MachineState_PoweredOff);
/* Paranoia: no one must have saved the settings in the mean time. If
* it happens nevertheless we'll close our eyes and continue below. */
@@ -2259,15 +2246,13 @@ void SessionMachine::i_restoreSnapshotHandler(RestoreSnapshotTask &task)
/* undo all changes on failure */
i_rollback(false /* aNotify */);
- if (!stateRestored)
- {
- /* restore the machine state */
- i_setMachineState(task.m_machineStateBackup);
- }
}
mParent->i_saveModifiedRegistries();
+ /* restore the machine state */
+ i_setMachineState(task.m_machineStateBackup);
+
/* set the result (this will try to fetch current error info on failure) */
task.m_pProgress->i_notifyComplete(rc);
diff --git a/src/VBox/Main/src-server/VFSExplorerImpl.cpp b/src/VBox/Main/src-server/VFSExplorerImpl.cpp
index 691c219..83cd1bf 100644
--- a/src/VBox/Main/src-server/VFSExplorerImpl.cpp
+++ b/src/VBox/Main/src-server/VFSExplorerImpl.cpp
@@ -40,14 +40,14 @@ struct VFSExplorer::Data
{
struct DirEntry
{
- DirEntry(Utf8Str strName, VFSFileType_T fileType, uint64_t cbSize, uint32_t fMode)
+ DirEntry(Utf8Str strName, FsObjType_T fileType, uint64_t cbSize, uint32_t fMode)
: name(strName)
, type(fileType)
, size(cbSize)
, mode(fMode) {}
Utf8Str name;
- VFSFileType_T type;
+ FsObjType_T type;
uint64_t size;
uint32_t mode;
};
@@ -257,26 +257,26 @@ int VFSExplorer::TaskVFSExplorer::uploadProgress(unsigned uPercent, void *pvUser
return VINF_SUCCESS;
}
-VFSFileType_T VFSExplorer::i_RTToVFSFileType(int aType) const
+FsObjType_T VFSExplorer::i_iprtToVfsObjType(RTFMODE aType) const
{
int a = aType & RTFS_TYPE_MASK;
- VFSFileType_T t = VFSFileType_Unknown;
+ FsObjType_T t = FsObjType_Unknown;
if ((a & RTFS_TYPE_DIRECTORY) == RTFS_TYPE_DIRECTORY)
- t = VFSFileType_Directory;
+ t = FsObjType_Directory;
else if ((a & RTFS_TYPE_FILE) == RTFS_TYPE_FILE)
- t = VFSFileType_File;
+ t = FsObjType_File;
else if ((a & RTFS_TYPE_SYMLINK) == RTFS_TYPE_SYMLINK)
- t = VFSFileType_SymLink;
+ t = FsObjType_Symlink;
else if ((a & RTFS_TYPE_FIFO) == RTFS_TYPE_FIFO)
- t = VFSFileType_Fifo;
+ t = FsObjType_Fifo;
else if ((a & RTFS_TYPE_DEV_CHAR) == RTFS_TYPE_DEV_CHAR)
- t = VFSFileType_DevChar;
+ t = FsObjType_DevChar;
else if ((a & RTFS_TYPE_DEV_BLOCK) == RTFS_TYPE_DEV_BLOCK)
- t = VFSFileType_DevBlock;
+ t = FsObjType_DevBlock;
else if ((a & RTFS_TYPE_SOCKET) == RTFS_TYPE_SOCKET)
- t = VFSFileType_Socket;
+ t = FsObjType_Socket;
else if ((a & RTFS_TYPE_WHITEOUT) == RTFS_TYPE_WHITEOUT)
- t = VFSFileType_WhiteOut;
+ t = FsObjType_WhiteOut;
return t;
}
@@ -312,7 +312,7 @@ HRESULT VFSExplorer::i_updateFS(TaskVFSExplorer *aTask)
Utf8Str name(entry.szName);
if ( name != "."
&& name != "..")
- fileList.push_back(VFSExplorer::Data::DirEntry(name, i_RTToVFSFileType(entry.Info.Attr.fMode),
+ fileList.push_back(VFSExplorer::Data::DirEntry(name, i_iprtToVfsObjType(entry.Info.Attr.fMode),
entry.Info.cbObject,
entry.Info.Attr.fMode & (RTFS_UNIX_IRWXU | RTFS_UNIX_IRWXG | RTFS_UNIX_IRWXO)));
}
@@ -430,7 +430,7 @@ HRESULT VFSExplorer::i_updateS3(TaskVFSExplorer *aTask)
while (pBuckets)
{
/* Set always read/write permissions of the current logged in user. */
- fileList.push_back(VFSExplorer::Data::DirEntry(pBuckets->pszName, VFSFileType_Directory,
+ fileList.push_back(VFSExplorer::Data::DirEntry(pBuckets->pszName, FsObjType_Directory,
0, RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR));
pBuckets = pBuckets->pNext;
}
@@ -448,7 +448,7 @@ HRESULT VFSExplorer::i_updateS3(TaskVFSExplorer *aTask)
{
Utf8Str name(pKeys->pszName);
/* Set always read/write permissions of the current logged in user. */
- fileList.push_back(VFSExplorer::Data::DirEntry(pKeys->pszName, VFSFileType_File, pKeys->cbFile,
+ fileList.push_back(VFSExplorer::Data::DirEntry(pKeys->pszName, FsObjType_File, pKeys->cbFile,
RTFS_UNIX_IRUSR | RTFS_UNIX_IWUSR));
pKeys = pKeys->pNext;
}
@@ -617,7 +617,7 @@ HRESULT VFSExplorer::entryList(std::vector<com::Utf8Str> &aNames,
const VFSExplorer::Data::DirEntry &entry = (*it);
aNames[i] = entry.name;
aTypes[i] = entry.type;
- aSizes[i] = entry.type;
+ aSizes[i] = entry.size;
aModes[i] = entry.mode;
}
diff --git a/src/VBox/Main/src-server/darwin/HostPowerDarwin.cpp b/src/VBox/Main/src-server/darwin/HostPowerDarwin.cpp
index 5e68d02..c588622 100644
--- a/src/VBox/Main/src-server/darwin/HostPowerDarwin.cpp
+++ b/src/VBox/Main/src-server/darwin/HostPowerDarwin.cpp
@@ -1,3 +1,4 @@
+/* $Id: HostPowerDarwin.cpp $ */
/** @file
*
* VirtualBox interface to host's power notification service
diff --git a/src/VBox/Main/src-server/linux/HostPowerLinux.cpp b/src/VBox/Main/src-server/linux/HostPowerLinux.cpp
new file mode 100644
index 0000000..aa83021
--- /dev/null
+++ b/src/VBox/Main/src-server/linux/HostPowerLinux.cpp
@@ -0,0 +1,144 @@
+/** @file
+ *
+ * VirtualBox interface to host's power notification service
+ */
+
+/*
+ * Copyright (C) 2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#include "HostPower.h"
+#include "Logging.h"
+
+#include <iprt/asm.h>
+#include <iprt/power.h>
+#include <iprt/time.h>
+
+static bool checkDBusError(DBusError *pError, DBusConnection *pConnection)
+{
+ if (dbus_error_is_set(pError))
+ {
+ LogRel(("HostPowerServiceLinux: DBus connection Error (%s)\n", pError->message));
+ dbus_error_free(pError);
+ /* Close the socket or whatever underlying the connection. */
+ dbus_connection_close(pConnection);
+ /* Free in-process resources used for the now-closed connection. */
+ dbus_connection_unref(pConnection);
+ return true;
+ }
+ return false;
+}
+
+HostPowerServiceLinux::HostPowerServiceLinux(VirtualBox *aVirtualBox)
+ : HostPowerService(aVirtualBox)
+ , mThread(NULL)
+ , mpConnection(NULL)
+{
+ DBusError error;
+ int rc;
+
+ rc = RTDBusLoadLib();
+ if (RT_FAILURE(rc))
+ {
+ LogRel(("HostPowerServiceLinux: DBus library not found. Service not available.\n"));
+ return;
+ }
+ dbus_error_init(&error);
+ /* Connect to the DBus. The connection will be not shared with any other
+ * in-process callers of dbus_bus_get(). This is considered wasteful (see
+ * API documentation) but simplifies our code, specifically shutting down.
+ * The session bus allows up to 100000 connections per user as it "is just
+ * running as the user anyway" (see session.conf.in in the DBus sources). */
+ mpConnection = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error);
+ if (checkDBusError(&error, mpConnection))
+ return;
+ /* We do not want to exit(1) if the connection is broken. */
+ dbus_connection_set_exit_on_disconnect(mpConnection, FALSE);
+ /* Tell the bus to wait for the sleep signal(s). */
+ /* The current systemd-logind interface. */
+ dbus_bus_add_match(mpConnection, "type='signal',interface='org.freedesktop.login1.Manager'", &error);
+ /* The previous UPower interfaces (2010 - ca 2013). */
+ dbus_bus_add_match(mpConnection, "type='signal',interface='org.freedesktop.UPower'", &error);
+ dbus_connection_flush(mpConnection);
+ if (checkDBusError(&error, mpConnection))
+ return;
+ /* Create the new worker thread. */
+ rc = RTThreadCreate(&mThread, HostPowerServiceLinux::powerChangeNotificationThread, this, 0 /* cbStack */,
+ RTTHREADTYPE_MSG_PUMP, RTTHREADFLAGS_WAITABLE, "MainPower");
+ if (RT_FAILURE(rc))
+ LogRel(("HostPowerServiceLinux: RTThreadCreate failed with %Rrc\n", rc));
+}
+
+
+HostPowerServiceLinux::~HostPowerServiceLinux()
+{
+ /* Closing the connection should cause the event loop to exit. */
+ LogFunc((": Stopping thread\n"));
+ dbus_connection_close(mpConnection);
+
+ RTThreadWait(mThread, 5000, NULL);
+ mThread = NIL_RTTHREAD;
+}
+
+
+DECLCALLBACK(int) HostPowerServiceLinux::powerChangeNotificationThread(RTTHREAD hThreadSelf, void *pInstance)
+{
+ NOREF(hThreadSelf);
+ HostPowerServiceLinux *pPowerObj = static_cast<HostPowerServiceLinux *>(pInstance);
+
+ Log(("HostPowerServiceLinux: Thread started\n"));
+ while (dbus_connection_read_write(pPowerObj->mpConnection, -1))
+ {
+ DBusMessage *pMessage = NULL;
+
+ for (;;)
+ {
+ DBusMessageIter args;
+ dbus_bool_t fSuspend;
+
+ pMessage = dbus_connection_pop_message(pPowerObj->mpConnection);
+ if (pMessage == NULL)
+ break;
+ /* The systemd-logind interface notification. */
+ if ( dbus_message_is_signal(pMessage, "org.freedesktop.login1.Manager", "PrepareForSleep")
+ && dbus_message_iter_init(pMessage, &args)
+ && dbus_message_iter_get_arg_type(&args) == DBUS_TYPE_BOOLEAN)
+ {
+ dbus_message_iter_get_basic(&args, &fSuspend);
+ /* Trinary operator does not work here as Reason_... is an
+ * anonymous enum. */
+ if (fSuspend)
+ pPowerObj->notify(Reason_HostSuspend);
+ else
+ pPowerObj->notify(Reason_HostResume);
+ }
+ /* The UPowerd interface notifications. Sleeping is the older one,
+ * NotifySleep the newer. This gives us one second grace before the
+ * suspend triggers. */
+ if ( dbus_message_is_signal(pMessage, "org.freedesktop.UPower", "Sleeping")
+ || dbus_message_is_signal(pMessage, "org.freedesktop.UPower", "NotifySleep"))
+ pPowerObj->notify(Reason_HostSuspend);
+ if ( dbus_message_is_signal(pMessage, "org.freedesktop.UPower", "Resuming")
+ || dbus_message_is_signal(pMessage, "org.freedesktop.UPower", "NotifyResume"))
+ pPowerObj->notify(Reason_HostResume);
+ /* Free local resources held for the message. */
+ dbus_message_unref(pMessage);
+ }
+ }
+ /* Close the socket or whatever underlying the connection. */
+ dbus_connection_close(pPowerObj->mpConnection);
+ /* Free in-process resources used for the now-closed connection. */
+ dbus_connection_unref(pPowerObj->mpConnection);
+ pPowerObj->mpConnection = NULL;
+ Log(("HostPowerServiceLinux: Exiting thread\n"));
+ return VINF_SUCCESS;
+}
+
diff --git a/src/VBox/Main/src-server/linux/vbox-libhal.cpp b/src/VBox/Main/src-server/linux/vbox-libhal.cpp
index ade8f07..30da016 100644
--- a/src/VBox/Main/src-server/linux/vbox-libhal.cpp
+++ b/src/VBox/Main/src-server/linux/vbox-libhal.cpp
@@ -1,3 +1,4 @@
+/* $Id: vbox-libhal.cpp $ */
/** @file
*
* Module to dynamically load libhal and libdbus and load all symbols
diff --git a/src/VBox/Main/src-server/win/HostPowerWin.cpp b/src/VBox/Main/src-server/win/HostPowerWin.cpp
index 7f06b07..1e3e40e 100644
--- a/src/VBox/Main/src-server/win/HostPowerWin.cpp
+++ b/src/VBox/Main/src-server/win/HostPowerWin.cpp
@@ -1,3 +1,4 @@
+/* $Id: HostPowerWin.cpp $ */
/** @file
*
* VirtualBox interface to host's power notification service
diff --git a/src/VBox/Main/src-server/win/VBoxComEvents.cpp b/src/VBox/Main/src-server/win/VBoxComEvents.cpp
index cca2f39..67d992b 100644
--- a/src/VBox/Main/src-server/win/VBoxComEvents.cpp
+++ b/src/VBox/Main/src-server/win/VBoxComEvents.cpp
@@ -1,3 +1,4 @@
+/* $Id: VBoxComEvents.cpp $ */
/** @file
*
* COM Events Helper routines.
diff --git a/src/VBox/Main/src-server/win/VBoxComEvents.h b/src/VBox/Main/src-server/win/VBoxComEvents.h
index ec1a1ba..655816a 100644
--- a/src/VBox/Main/src-server/win/VBoxComEvents.h
+++ b/src/VBox/Main/src-server/win/VBoxComEvents.h
@@ -1,3 +1,4 @@
+/* $Id: VBoxComEvents.h $ */
/** @file
*
* Declaration of COM Events Helper routines.
diff --git a/src/VBox/Main/src-server/win/svchlp.cpp b/src/VBox/Main/src-server/win/svchlp.cpp
index a3c07ff..f550717 100644
--- a/src/VBox/Main/src-server/win/svchlp.cpp
+++ b/src/VBox/Main/src-server/win/svchlp.cpp
@@ -1,3 +1,4 @@
+/* $Id: svchlp.cpp $ */
/** @file
* Definition of SVC Helper Process control routines.
*/
diff --git a/src/VBox/Main/src-server/win/svchlp.h b/src/VBox/Main/src-server/win/svchlp.h
index a5df8db..5777bb1 100644
--- a/src/VBox/Main/src-server/win/svchlp.h
+++ b/src/VBox/Main/src-server/win/svchlp.h
@@ -1,3 +1,4 @@
+/* $Id: svchlp.h $ */
/** @file
*
* Declaration of SVC Helper Process control routines.
diff --git a/src/VBox/Main/src-server/win/svcmain.cpp b/src/VBox/Main/src-server/win/svcmain.cpp
index b3687e5..ade917a 100644
--- a/src/VBox/Main/src-server/win/svcmain.cpp
+++ b/src/VBox/Main/src-server/win/svcmain.cpp
@@ -1,3 +1,4 @@
+/* $Id: svcmain.cpp $ */
/** @file
*
* SVCMAIN - COM out-of-proc server main entry
diff --git a/src/VBox/Main/src-server/xpcom/server.cpp b/src/VBox/Main/src-server/xpcom/server.cpp
index cae1f9a..96b4537 100644
--- a/src/VBox/Main/src-server/xpcom/server.cpp
+++ b/src/VBox/Main/src-server/xpcom/server.cpp
@@ -131,7 +131,7 @@ static bool gAutoShutdown = false;
* VirtualBox instance is released, in ms */
static uint32_t gShutdownDelayMs = 5000;
-static nsIEventQueue *gEventQ = nsnull;
+static nsCOMPtr<nsIEventQueue> gEventQ = nsnull;
static PRBool volatile gKeepRunning = PR_TRUE;
static PRBool volatile gAllowSigUsrQuit = PR_TRUE;
@@ -231,8 +231,12 @@ public:
* (see GetInstance()) */
PRBool onMainThread = PR_TRUE;
- if (gEventQ)
- gEventQ->IsOnCurrentThread(&onMainThread);
+ nsCOMPtr<nsIEventQueue> q(gEventQ);
+ if (q)
+ {
+ q->IsOnCurrentThread(&onMainThread);
+ q = nsnull;
+ }
PRBool timerStarted = PR_FALSE;
@@ -288,7 +292,7 @@ public:
* any more. Thus, we assert below.
*/
- Assert(gEventQ == NULL);
+ Assert(!gEventQ);
}
}
}
@@ -355,11 +359,12 @@ public:
* manually ended the server after a destruction has been scheduled
* and this method was so lucky that it got a chance to run before
* the timer was killed. */
- AssertReturnVoid(gEventQ);
+ nsCOMPtr<nsIEventQueue> q(gEventQ);
+ AssertReturnVoid(q);
/* post a quit event to the main queue */
MaybeQuitEvent *ev = new MaybeQuitEvent();
- nsresult rv = ev->postTo(gEventQ);
+ nsresult rv = ev->postTo(q);
NOREF(rv);
/* A failure above means we've been already stopped (for example
@@ -392,8 +397,6 @@ public:
RTTimerLRDestroy(sTimer);
sTimer = NULL;
- RTCritSectDelete(&sLock);
-
if (sInstance != NULL)
{
/* Either posting a destruction event failed for some reason (most
@@ -404,6 +407,10 @@ public:
sInstance->Release();
}
+ /* Destroy lock after releasing the VirtualBox instance, otherwise
+ * there are races with cleanup. */
+ RTCritSectDelete(&sLock);
+
return NS_OK;
}
@@ -593,14 +600,15 @@ class ForceQuitEvent : public MyEvent
static void signal_handler(int sig)
{
- if (gEventQ && gKeepRunning)
+ nsCOMPtr<nsIEventQueue> q(gEventQ);
+ if (q && gKeepRunning)
{
if (sig == SIGUSR1)
{
if (gAllowSigUsrQuit)
{
VirtualBoxClassFactory::MaybeQuitEvent *ev = new VirtualBoxClassFactory::MaybeQuitEvent();
- ev->postTo(gEventQ);
+ ev->postTo(q);
}
/* else do nothing */
}
@@ -608,7 +616,7 @@ static void signal_handler(int sig)
{
/* post a force quit event to the queue */
ForceQuitEvent *ev = new ForceQuitEvent();
- ev->postTo(gEventQ);
+ ev->postTo(q);
}
}
}
@@ -862,7 +870,7 @@ int main(int argc, char **argv)
/* get the main thread's event queue (afaik, the dconnect service always
* gets created upon XPCOM startup, so it will use the main (this)
* thread's event queue to receive IPC events) */
- rc = NS_GetMainEventQ(&gEventQ);
+ rc = NS_GetMainEventQ(getter_AddRefs(gEventQ));
if (NS_FAILED(rc))
{
RTMsgError("Failed to get the main event queue! (rc=%Rhrc)", rc);
@@ -991,7 +999,7 @@ int main(int argc, char **argv)
while (0); // this scopes the nsCOMPtrs
NS_IF_RELEASE(gIpcServ);
- NS_IF_RELEASE(gEventQ);
+ gEventQ = nsnull;
/* no nsCOMPtrs are allowed to be alive when you call com::Shutdown(). */
diff --git a/src/VBox/Main/src-server/xpcom/server.h b/src/VBox/Main/src-server/xpcom/server.h
index 4fbaa23..a6727c7 100644
--- a/src/VBox/Main/src-server/xpcom/server.h
+++ b/src/VBox/Main/src-server/xpcom/server.h
@@ -1,3 +1,4 @@
+/* $Id: server.h $ */
/** @file
*
* Common header for XPCOM server and its module counterpart
diff --git a/src/VBox/Main/src-server/xpcom/server_module.cpp b/src/VBox/Main/src-server/xpcom/server_module.cpp
index 42b9c9a..f332c48 100644
--- a/src/VBox/Main/src-server/xpcom/server_module.cpp
+++ b/src/VBox/Main/src-server/xpcom/server_module.cpp
@@ -1,3 +1,4 @@
+/* $Id: server_module.cpp $ */
/** @file
*
* XPCOM server process helper module implementation functions
diff --git a/src/VBox/Main/testcase/tstAPI.cpp b/src/VBox/Main/testcase/tstAPI.cpp
index a18499e..3e7991a 100644
--- a/src/VBox/Main/testcase/tstAPI.cpp
+++ b/src/VBox/Main/testcase/tstAPI.cpp
@@ -1,3 +1,4 @@
+/* $Id: tstAPI.cpp $ */
/** @file
*
* tstAPI - test program for our COM/XPCOM interface
diff --git a/src/VBox/Main/testcase/tstVBoxAPIXPCOM.cpp b/src/VBox/Main/testcase/tstVBoxAPIXPCOM.cpp
index c3ff148..71caca4 100644
--- a/src/VBox/Main/testcase/tstVBoxAPIXPCOM.cpp
+++ b/src/VBox/Main/testcase/tstVBoxAPIXPCOM.cpp
@@ -1,3 +1,4 @@
+/* $Id: tstVBoxAPIXPCOM.cpp $ */
/** @file
*
* tstVBoxAPIXPCOM - sample program to illustrate the VirtualBox
diff --git a/src/VBox/Main/xml/Settings.cpp b/src/VBox/Main/xml/Settings.cpp
index a603c50..1459200 100644
--- a/src/VBox/Main/xml/Settings.cpp
+++ b/src/VBox/Main/xml/Settings.cpp
@@ -1962,7 +1962,6 @@ Hardware::Hardware()
fVPID(true),
fUnrestrictedExecution(true),
fHardwareVirtForce(false),
- fSyntheticCpu(false),
fTripleFaultReset(false),
fPAE(false),
enmLongMode(HC_ARCH_BITS == 64 ? Hardware::LongMode_Enabled : Hardware::LongMode_Disabled),
@@ -1970,6 +1969,7 @@ Hardware::Hardware()
fCpuHotPlug(false),
fHPETEnabled(false),
ulCpuExecutionCap(100),
+ uCpuIdPortabilityLevel(0),
ulMemorySizeMB((uint32_t)-1),
graphicsControllerType(GraphicsControllerType_VBoxVGA),
ulVRAMSizeMB(8),
@@ -2036,13 +2036,13 @@ bool Hardware::operator==(const Hardware& h) const
&& (fVPID == h.fVPID)
&& (fUnrestrictedExecution == h.fUnrestrictedExecution)
&& (fHardwareVirtForce == h.fHardwareVirtForce)
- && (fSyntheticCpu == h.fSyntheticCpu)
&& (fPAE == h.fPAE)
&& (enmLongMode == h.enmLongMode)
&& (fTripleFaultReset == h.fTripleFaultReset)
&& (cCPUs == h.cCPUs)
&& (fCpuHotPlug == h.fCpuHotPlug)
&& (ulCpuExecutionCap == h.ulCpuExecutionCap)
+ && (uCpuIdPortabilityLevel == h.uCpuIdPortabilityLevel)
&& (fHPETEnabled == h.fHPETEnabled)
&& (llCpus == h.llCpus)
&& (llCpuIdLeafs == h.llCpuIdLeafs)
@@ -2801,7 +2801,12 @@ void MachineConfigFile::readHardware(const xml::ElementNode &elmHardware,
hw.enmLongMode = Hardware::LongMode_Legacy;
if ((pelmCPUChild = pelmHwChild->findChildElement("SyntheticCpu")))
- pelmCPUChild->getAttributeValue("enabled", hw.fSyntheticCpu);
+ {
+ bool fSyntheticCpu = false;
+ pelmCPUChild->getAttributeValue("enabled", fSyntheticCpu);
+ hw.uCpuIdPortabilityLevel = fSyntheticCpu ? 1 : 0;
+ }
+ pelmHwChild->getAttributeValue("CpuIdPortabilityLevel", hw.uCpuIdPortabilityLevel);
if ((pelmCPUChild = pelmHwChild->findChildElement("TripleFaultReset")))
pelmCPUChild->getAttributeValue("enabled", hw.fTripleFaultReset);
@@ -4094,13 +4099,13 @@ void MachineConfigFile::buildHardwareXML(xml::ElementNode &elmParent,
if (m->sv >= SettingsVersion_v1_14 && hw.enmLongMode != Hardware::LongMode_Legacy)
pelmCPU->createChild("LongMode")->setAttribute("enabled", hw.enmLongMode == Hardware::LongMode_Enabled);
- if (hw.fSyntheticCpu)
- pelmCPU->createChild("SyntheticCpu")->setAttribute("enabled", hw.fSyntheticCpu);
if (hw.fTripleFaultReset)
pelmCPU->createChild("TripleFaultReset")->setAttribute("enabled", hw.fTripleFaultReset);
pelmCPU->setAttribute("count", hw.cCPUs);
if (hw.ulCpuExecutionCap != 100)
pelmCPU->setAttribute("executionCap", hw.ulCpuExecutionCap);
+ if (hw.uCpuIdPortabilityLevel != 0)
+ pelmCPU->setAttribute("CpuIdPortabilityLevel", hw.uCpuIdPortabilityLevel);
/* Always save this setting as we have changed the default in 4.0 (on for large memory 64-bit systems). */
pelmCPU->createChild("HardwareVirtExLargePages")->setAttribute("enabled", hw.fLargePages);
@@ -5500,75 +5505,77 @@ void MachineConfigFile::bumpSettingsVersionIfNeeded()
// setting, USB storage controller, xHCI and serial port TCP backend.
/*
- * Check whether a paravirtualization provider other than "Legacy" is used, if so bump the version.
+ * Check simple configuration bits first, loopy stuff afterwards.
*/
- if (hardwareMachine.paravirtProvider != ParavirtProvider_Legacy)
+ if ( hardwareMachine.paravirtProvider != ParavirtProvider_Legacy
+ || hardwareMachine.uCpuIdPortabilityLevel != 0)
+ {
m->sv = SettingsVersion_v1_15;
- else
+ return;
+ }
+
+ /*
+ * Check whether the hotpluggable flag of all storage devices differs
+ * from the default for old settings.
+ * AHCI ports are hotpluggable by default every other device is not.
+ * Also check if there are USB storage controllers.
+ */
+ for (StorageControllersList::const_iterator it = storageMachine.llStorageControllers.begin();
+ it != storageMachine.llStorageControllers.end();
+ ++it)
{
- /*
- * Check whether the hotpluggable flag of all storage devices differs
- * from the default for old settings.
- * AHCI ports are hotpluggable by default every other device is not.
- * Also check if there are USB storage controllers.
- */
- for (StorageControllersList::const_iterator it = storageMachine.llStorageControllers.begin();
- it != storageMachine.llStorageControllers.end();
- ++it)
+ const StorageController &sctl = *it;
+
+ if (sctl.controllerType == StorageControllerType_USB)
{
- const StorageController &sctl = *it;
+ m->sv = SettingsVersion_v1_15;
+ return;
+ }
+
+ for (AttachedDevicesList::const_iterator it2 = sctl.llAttachedDevices.begin();
+ it2 != sctl.llAttachedDevices.end();
+ ++it2)
+ {
+ const AttachedDevice &att = *it2;
- if (sctl.controllerType == StorageControllerType_USB)
+ if ( ( att.fHotPluggable
+ && sctl.controllerType != StorageControllerType_IntelAhci)
+ || ( !att.fHotPluggable
+ && sctl.controllerType == StorageControllerType_IntelAhci))
{
m->sv = SettingsVersion_v1_15;
return;
}
-
- for (AttachedDevicesList::const_iterator it2 = sctl.llAttachedDevices.begin();
- it2 != sctl.llAttachedDevices.end();
- ++it2)
- {
- const AttachedDevice &att = *it2;
-
- if ( ( att.fHotPluggable
- && sctl.controllerType != StorageControllerType_IntelAhci)
- || ( !att.fHotPluggable
- && sctl.controllerType == StorageControllerType_IntelAhci))
- {
- m->sv = SettingsVersion_v1_15;
- return;
- }
- }
}
+ }
- /*
- * Check if there is an xHCI (USB3) USB controller.
- */
- for (USBControllerList::const_iterator it = hardwareMachine.usbSettings.llUSBControllers.begin();
- it != hardwareMachine.usbSettings.llUSBControllers.end();
- ++it)
+ /*
+ * Check if there is an xHCI (USB3) USB controller.
+ */
+ for (USBControllerList::const_iterator it = hardwareMachine.usbSettings.llUSBControllers.begin();
+ it != hardwareMachine.usbSettings.llUSBControllers.end();
+ ++it)
+ {
+ const USBController &ctrl = *it;
+ if (ctrl.enmType == USBControllerType_XHCI)
{
- const USBController &ctrl = *it;
- if (ctrl.enmType == USBControllerType_XHCI)
- {
- m->sv = SettingsVersion_v1_15;
- return;
- }
+ m->sv = SettingsVersion_v1_15;
+ return;
}
+ }
- /*
- * Check if any serial port uses the TCP backend.
- */
- for (SerialPortsList::const_iterator it = hardwareMachine.llSerialPorts.begin();
- it != hardwareMachine.llSerialPorts.end();
- ++it)
+ /*
+ * Check if any serial port uses the TCP backend.
+ */
+ for (SerialPortsList::const_iterator it = hardwareMachine.llSerialPorts.begin();
+ it != hardwareMachine.llSerialPorts.end();
+ ++it)
+ {
+ const SerialPort &port = *it;
+ if (port.portMode == PortMode_TCP)
{
- const SerialPort &port = *it;
- if (port.portMode == PortMode_TCP)
- {
- m->sv = SettingsVersion_v1_15;
- return;
- }
+ m->sv = SettingsVersion_v1_15;
+ return;
}
}
}
diff --git a/src/VBox/NetworkServices/DHCP/NetworkManagerDhcp.cpp b/src/VBox/NetworkServices/DHCP/NetworkManagerDhcp.cpp
index 415e635..e9c1178 100644
--- a/src/VBox/NetworkServices/DHCP/NetworkManagerDhcp.cpp
+++ b/src/VBox/NetworkServices/DHCP/NetworkManagerDhcp.cpp
@@ -54,7 +54,8 @@
bool NetworkManager::handleDhcpReqDiscover(PCRTNETBOOTP pDhcpMsg, size_t cb)
{
RawOption opt;
- memset(&opt, 0, sizeof(RawOption));
+ RT_ZERO(opt);
+
/* 1. Find client */
ConfigurationManager *confManager = ConfigurationManager::getConfigurationManager();
Client client = confManager->getClientByDhcpPacket(pDhcpMsg, cb);
diff --git a/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp b/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp
index 0b05710..820ac26 100644
--- a/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp
+++ b/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp
@@ -220,7 +220,7 @@ VBoxNetDhcp::VBoxNetDhcp()
m_uCurMsgType = UINT8_MAX;
m_cbCurMsg = 0;
m_pCurMsg = NULL;
- memset(&m_CurHdrs, '\0', sizeof(m_CurHdrs));
+ RT_ZERO(m_CurHdrs);
m_fIgnoreCmdLineParameters = true;
@@ -498,7 +498,7 @@ int VBoxNetDhcp::initWithMain()
* and listener for Dhcp configuration events
*/
AssertRCReturn(virtualbox.isNull(), VERR_INTERNAL_ERROR);
- std::string networkName = getNetwork();
+ std::string networkName = getNetworkName();
int rc = findDhcpServer(virtualbox, networkName, m_DhcpServer);
AssertRCReturn(rc, rc);
@@ -615,8 +615,16 @@ HRESULT VBoxNetDhcp::HandleEvent(VBoxEventType_T aEventType, IEvent *pEvent)
case VBoxEventType_OnNATNetworkStartStop:
{
ComPtr <INATNetworkStartStopEvent> pStartStopEvent = pEvent;
+
+ com::Bstr networkName;
+ HRESULT hrc = pStartStopEvent->COMGETTER(NetworkName)(networkName.asOutParam());
+ AssertComRCReturn(hrc, hrc);
+ if (networkName.compare(getNetworkName().c_str()))
+ break; /* change not for our network */
+
BOOL fStart = TRUE;
- HRESULT hrc = pStartStopEvent->COMGETTER(StartEvent)(&fStart);
+ hrc = pStartStopEvent->COMGETTER(StartEvent)(&fStart);
+ AssertComRCReturn(hrc, hrc);
if (!fStart)
shutdown();
break;
diff --git a/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp b/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp
index 93491c6..16d3a2e 100644
--- a/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp
+++ b/src/VBox/NetworkServices/NAT/VBoxNetLwipNAT.cpp
@@ -202,74 +202,81 @@ INTNETSEG VBoxNetLwipNAT::aXmitSeg[64];
/**
* @note: this work on Event thread.
*/
-HRESULT VBoxNetLwipNAT::HandleEvent(VBoxEventType_T aEventType,
- IEvent *pEvent)
+HRESULT VBoxNetLwipNAT::HandleEvent(VBoxEventType_T aEventType, IEvent *pEvent)
{
HRESULT hrc = S_OK;
switch (aEventType)
{
case VBoxEventType_OnNATNetworkSetting:
{
- ComPtr<INATNetworkSettingEvent> evSettings(pEvent);
- // XXX: only handle IPv6 default route for now
+ ComPtr<INATNetworkSettingEvent> pSettingsEvent(pEvent);
+
+ com::Bstr networkName;
+ hrc = pSettingsEvent->COMGETTER(NetworkName)(networkName.asOutParam());
+ AssertComRCReturn(hrc, hrc);
+ if (networkName.compare(getNetworkName().c_str()))
+ break; /* change not for our network */
+ // XXX: only handle IPv6 default route for now
if (!m_ProxyOptions.ipv6_enabled)
- {
break;
- }
BOOL fIPv6DefaultRoute = FALSE;
- hrc = evSettings->COMGETTER(AdvertiseDefaultIPv6RouteEnabled)(&fIPv6DefaultRoute);
- AssertReturn(SUCCEEDED(hrc), hrc);
+ hrc = pSettingsEvent->COMGETTER(AdvertiseDefaultIPv6RouteEnabled)(&fIPv6DefaultRoute);
+ AssertComRCReturn(hrc, hrc);
if (m_ProxyOptions.ipv6_defroute == fIPv6DefaultRoute)
- {
break;
- }
m_ProxyOptions.ipv6_defroute = fIPv6DefaultRoute;
tcpip_callback_with_block(proxy_rtadvd_do_quick, &m_LwipNetIf, 0);
-
break;
}
case VBoxEventType_OnNATNetworkPortForward:
{
- com::Bstr name, strHostAddr, strGuestAddr;
- LONG lHostPort, lGuestPort;
- BOOL fCreateFW, fIPv6FW;
- NATProtocol_T proto = NATProtocol_TCP;
+ ComPtr<INATNetworkPortForwardEvent> pForwardEvent = pEvent;
+ com::Bstr networkName;
+ hrc = pForwardEvent->COMGETTER(NetworkName)(networkName.asOutParam());
+ AssertComRCReturn(hrc, hrc);
+ if (networkName.compare(getNetworkName().c_str()))
+ break; /* change not for our network */
- ComPtr<INATNetworkPortForwardEvent> pfEvt = pEvent;
+ BOOL fCreateFW;
+ hrc = pForwardEvent->COMGETTER(Create)(&fCreateFW);
+ AssertComRCReturn(hrc, hrc);
- hrc = pfEvt->COMGETTER(Create)(&fCreateFW);
- AssertReturn(SUCCEEDED(hrc), hrc);
+ BOOL fIPv6FW;
+ hrc = pForwardEvent->COMGETTER(Ipv6)(&fIPv6FW);
+ AssertComRCReturn(hrc, hrc);
- hrc = pfEvt->COMGETTER(Ipv6)(&fIPv6FW);
- AssertReturn(SUCCEEDED(hrc), hrc);
+ com::Bstr name;
+ hrc = pForwardEvent->COMGETTER(Name)(name.asOutParam());
+ AssertComRCReturn(hrc, hrc);
- hrc = pfEvt->COMGETTER(Name)(name.asOutParam());
- AssertReturn(SUCCEEDED(hrc), hrc);
-
- hrc = pfEvt->COMGETTER(Proto)(&proto);
- AssertReturn(SUCCEEDED(hrc), hrc);
+ NATProtocol_T proto = NATProtocol_TCP;
+ hrc = pForwardEvent->COMGETTER(Proto)(&proto);
+ AssertComRCReturn(hrc, hrc);
- hrc = pfEvt->COMGETTER(HostIp)(strHostAddr.asOutParam());
- AssertReturn(SUCCEEDED(hrc), hrc);
+ com::Bstr strHostAddr;
+ hrc = pForwardEvent->COMGETTER(HostIp)(strHostAddr.asOutParam());
+ AssertComRCReturn(hrc, hrc);
- hrc = pfEvt->COMGETTER(HostPort)(&lHostPort);
- AssertReturn(SUCCEEDED(hrc), hrc);
+ LONG lHostPort;
+ hrc = pForwardEvent->COMGETTER(HostPort)(&lHostPort);
+ AssertComRCReturn(hrc, hrc);
- hrc = pfEvt->COMGETTER(GuestIp)(strGuestAddr.asOutParam());
- AssertReturn(SUCCEEDED(hrc), hrc);
+ com::Bstr strGuestAddr;
+ hrc = pForwardEvent->COMGETTER(GuestIp)(strGuestAddr.asOutParam());
+ AssertComRCReturn(hrc, hrc);
- hrc = pfEvt->COMGETTER(GuestPort)(&lGuestPort);
- AssertReturn(SUCCEEDED(hrc), hrc);
+ LONG lGuestPort;
+ hrc = pForwardEvent->COMGETTER(GuestPort)(&lGuestPort);
+ AssertComRCReturn(hrc, hrc);
- VECNATSERVICEPF& rules = (fIPv6FW ?
- m_vecPortForwardRule6 :
- m_vecPortForwardRule4);
+ VECNATSERVICEPF& rules = fIPv6FW ? m_vecPortForwardRule6
+ : m_vecPortForwardRule4;
NATSEVICEPORTFORWARDRULE r;
RT_ZERO(r);
@@ -319,16 +326,16 @@ HRESULT VBoxNetLwipNAT::HandleEvent(VBoxEventType_T aEventType,
}
RTStrPrintf(r.Pfr.szPfrName, sizeof(r.Pfr.szPfrName),
- "%s", com::Utf8Str(name).c_str());
+ "%s", com::Utf8Str(name).c_str());
RTStrPrintf(r.Pfr.szPfrHostAddr, sizeof(r.Pfr.szPfrHostAddr),
- "%s", com::Utf8Str(strHostAddr).c_str());
+ "%s", com::Utf8Str(strHostAddr).c_str());
/* XXX: limits should be checked */
r.Pfr.u16PfrHostPort = (uint16_t)lHostPort;
RTStrPrintf(r.Pfr.szPfrGuestAddr, sizeof(r.Pfr.szPfrGuestAddr),
- "%s", com::Utf8Str(strGuestAddr).c_str());
+ "%s", com::Utf8Str(strGuestAddr).c_str());
/* XXX: limits should be checked */
r.Pfr.u16PfrGuestPort = (uint16_t)lGuestPort;
@@ -385,17 +392,24 @@ HRESULT VBoxNetLwipNAT::HandleEvent(VBoxEventType_T aEventType,
ppcszNameServers,
/* :block */ 0);
if (error != ERR_OK && ppcszNameServers != NULL)
- {
RTMemFree(ppcszNameServers);
- }
break;
}
case VBoxEventType_OnNATNetworkStartStop:
{
ComPtr <INATNetworkStartStopEvent> pStartStopEvent = pEvent;
+
+ com::Bstr networkName;
+ hrc = pStartStopEvent->COMGETTER(NetworkName)(networkName.asOutParam());
+ AssertComRCReturn(hrc, hrc);
+ if (networkName.compare(getNetworkName().c_str()))
+ break; /* change not for our network */
+
BOOL fStart = TRUE;
hrc = pStartStopEvent->COMGETTER(StartEvent)(&fStart);
+ AssertComRCReturn(hrc, hrc);
+
if (!fStart)
shutdown();
break;
@@ -640,8 +654,8 @@ VBoxNetLwipNAT::VBoxNetLwipNAT(SOCKET icmpsock4, SOCKET icmpsock6) : VBoxNetBase
m_ProxyOptions.tftp_root = NULL;
m_ProxyOptions.src4 = NULL;
m_ProxyOptions.src6 = NULL;
- memset(&m_src4, 0, sizeof(m_src4));
- memset(&m_src6, 0, sizeof(m_src6));
+ RT_ZERO(m_src4);
+ RT_ZERO(m_src6);
m_src4.sin_family = AF_INET;
m_src6.sin6_family = AF_INET6;
#if HAVE_SA_LEN
@@ -773,8 +787,8 @@ int VBoxNetLwipNAT::natServiceProcessRegisteredPf(VECNATSERVICEPF& vecRules)
}
-/** This method executed on main thread, only at the end threr're one threads started explcitly (LWIP and later in ::run()
- * RECV)
+/**
+ * Main thread. Starts also the LWIP thread.
*/
int VBoxNetLwipNAT::init()
{
@@ -784,7 +798,7 @@ int VBoxNetLwipNAT::init()
int rc = ::VBoxNetBaseService::init();
AssertRCReturn(rc, rc);
- std::string networkName = getNetwork();
+ std::string networkName = getNetworkName();
rc = findNatNetwork(virtualbox, networkName, m_net);
AssertRCReturn(rc, rc);
@@ -893,9 +907,7 @@ int VBoxNetLwipNAT::init()
rc = g_pLwipNat->tryGoOnline();
if (RT_FAILURE(rc))
- {
return rc;
- }
/* this starts LWIP thread */
vboxLwipCoreInitialize(VBoxNetLwipNAT::onLwipTcpIpInit, this);
@@ -907,32 +919,22 @@ int VBoxNetLwipNAT::init()
const char **VBoxNetLwipNAT::getHostNameservers()
{
- HRESULT hrc;
-
if (m_host.isNull())
- {
return NULL;
- }
com::SafeArray<BSTR> aNameServers;
- hrc = m_host->COMGETTER(NameServers)(ComSafeArrayAsOutParam(aNameServers));
+ HRESULT hrc = m_host->COMGETTER(NameServers)(ComSafeArrayAsOutParam(aNameServers));
if (FAILED(hrc))
- {
return NULL;
- }
const size_t cNameServers = aNameServers.size();
if (cNameServers == 0)
- {
return NULL;
- }
const char **ppcszNameServers =
(const char **)RTMemAllocZ(sizeof(char *) * (cNameServers + 1));
if (ppcszNameServers == NULL)
- {
return NULL;
- }
size_t idxLast = 0;
for (size_t i = 0; i < cNameServers; ++i)
@@ -940,9 +942,7 @@ const char **VBoxNetLwipNAT::getHostNameservers()
com::Utf8Str strNameServer(aNameServers[i]);
ppcszNameServers[idxLast] = RTStrDup(strNameServer.c_str());
if (ppcszNameServers[idxLast] != NULL)
- {
++idxLast;
- }
}
if (idxLast == 0)
@@ -988,9 +988,7 @@ int VBoxNetLwipNAT::processFrame(void *pvFrame, size_t cbFrame)
struct pbuf *p = pbuf_alloc(PBUF_RAW, cbFrame + ETH_PAD_SIZE, PBUF_POOL);
if (RT_UNLIKELY(p == NULL))
- {
return VERR_NO_MEMORY;
- }
/*
* The code below is inlined version of:
@@ -1199,14 +1197,10 @@ extern "C" DECLEXPORT(int) TrustedMain(int argc, char **argv, char **envp)
rc = (rc == 0) ? VINF_SUCCESS : VERR_GENERAL_FAILURE; /* XXX: FIXME */
if (RT_SUCCESS(rc))
- {
rc = g_pLwipNat->init();
- }
if (RT_SUCCESS(rc))
- {
g_pLwipNat->run();
- }
delete g_pLwipNat;
return 0;
@@ -1248,24 +1242,18 @@ static int vboxNetNATLogInit(int argc, char **argv)
}
if (pcszNetwork == NULL)
- {
return VERR_MISSING;
- }
char szNetwork[RTPATH_MAX];
rc = RTStrCopy(szNetwork, sizeof(szNetwork), pcszNetwork);
if (RT_FAILURE(rc))
- {
return rc;
- }
// sanitize network name to be usable as a path component
for (char *p = szNetwork; *p != '\0'; ++p)
{
if (RTPATH_IS_SEP(*p))
- {
*p = '_';
- }
}
char szLogFile[RTPATH_MAX];
@@ -1292,9 +1280,7 @@ static int vboxNetNATLogInit(int argc, char **argv)
cch = RTStrPrintf(szEnvVarBase, sizeof(szEnvVarBase),
"VBOXNET_%s_RELEASE_LOG", szNetwork);
if (cch >= sizeof(szEnvVarBase))
- {
return VERR_BUFFER_OVERFLOW;
- }
char szError[RTPATH_MAX + 128];
rc = com::VBoxLogRelCreate("NAT Network",
@@ -1320,7 +1306,7 @@ static int fetchNatPortForwardRules(const ComNatPtr& nat, bool fIsIPv6, VECNATSE
hrc = nat->COMGETTER(PortForwardRules6)(ComSafeArrayAsOutParam(rules));
else
hrc = nat->COMGETTER(PortForwardRules4)(ComSafeArrayAsOutParam(rules));
- AssertReturn(SUCCEEDED(hrc), VERR_INTERNAL_ERROR);
+ AssertComRCReturn(hrc, VERR_INTERNAL_ERROR);
NATSEVICEPORTFORWARDRULE Rule;
for (size_t idxRules = 0; idxRules < rules.size(); ++idxRules)
diff --git a/src/VBox/NetworkServices/NetLib/VBoxNetARP.cpp b/src/VBox/NetworkServices/NetLib/VBoxNetARP.cpp
index 9cced5d..9c9d87e 100644
--- a/src/VBox/NetworkServices/NetLib/VBoxNetARP.cpp
+++ b/src/VBox/NetworkServices/NetLib/VBoxNetARP.cpp
@@ -135,7 +135,7 @@ bool VBoxNetArpHandleIt(PSUPDRVSESSION pSession, INTNETIFHANDLE hIf, PINTNETBUF
EthHdr.EtherType = RT_H2N_U16_C(RTNET_ETHERTYPE_ARP);
uint8_t abTrailer[60 - sizeof(Reply) - sizeof(EthHdr)];
- memset(abTrailer, '\0', sizeof(abTrailer));
+ RT_ZERO(abTrailer);
INTNETSEG aSegs[3];
aSegs[0].cb = sizeof(EthHdr);
diff --git a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
index 87a752e..95022b2 100644
--- a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
+++ b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.cpp
@@ -72,9 +72,9 @@
*******************************************************************************/
struct VBoxNetBaseService::Data
{
- Data(const std::string& aName, const std::string& aNetworkName):
- m_Name(aName),
- m_Network(aNetworkName),
+ Data(const std::string& aServiceName, const std::string& aNetworkName):
+ m_ServiceName(aServiceName),
+ m_NetworkName(aNetworkName),
m_enmTrunkType(kIntNetTrunkType_WhateverNone),
m_pSession(NIL_RTR0PTR),
m_cbSendBuf(128 * _1K),
@@ -91,8 +91,8 @@ struct VBoxNetBaseService::Data
AssertRC(rc);
};
- std::string m_Name;
- std::string m_Network;
+ std::string m_ServiceName;
+ std::string m_NetworkName;
std::string m_TrunkName;
INTNETTRUNKTYPE m_enmTrunkType;
@@ -267,11 +267,11 @@ int VBoxNetBaseService::parseArgs(int argc, char **argv)
switch (rc)
{
case 'N': // --name
- m->m_Name = Val.psz;
+ m->m_ServiceName = Val.psz;
break;
case 'n': // --network
- m->m_Network = Val.psz;
+ m->m_NetworkName = Val.psz;
break;
case 't': //--trunk-name
@@ -392,9 +392,9 @@ int VBoxNetBaseService::tryGoOnline(void)
OpenReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC;
OpenReq.Hdr.cbReq = sizeof(OpenReq);
OpenReq.pSession = m->m_pSession;
- strncpy(OpenReq.szNetwork, m->m_Network.c_str(), sizeof(OpenReq.szNetwork));
+ RTStrCopy(OpenReq.szNetwork, sizeof(OpenReq.szNetwork), m->m_NetworkName.c_str());
OpenReq.szNetwork[sizeof(OpenReq.szNetwork) - 1] = '\0';
- strncpy(OpenReq.szTrunk, m->m_TrunkName.c_str(), sizeof(OpenReq.szTrunk));
+ RTStrCopy(OpenReq.szTrunk, sizeof(OpenReq.szTrunk), m->m_TrunkName.c_str());
OpenReq.szTrunk[sizeof(OpenReq.szTrunk) - 1] = '\0';
OpenReq.enmTrunkType = m->m_enmTrunkType;
OpenReq.fFlags = 0; /** @todo check this */
@@ -580,27 +580,27 @@ int VBoxNetBaseService::hlpUDPBroadcast(unsigned uSrcPort, unsigned uDstPort,
}
-const std::string VBoxNetBaseService::getName() const
+const std::string VBoxNetBaseService::getServiceName() const
{
- return m->m_Name;
+ return m->m_ServiceName;
}
-void VBoxNetBaseService::setName(const std::string& aName)
+void VBoxNetBaseService::setServiceName(const std::string& aName)
{
- m->m_Name = aName;
+ m->m_ServiceName = aName;
}
-const std::string VBoxNetBaseService::getNetwork() const
+const std::string VBoxNetBaseService::getNetworkName() const
{
- return m->m_Network;
+ return m->m_NetworkName;
}
-void VBoxNetBaseService::setNetwork(const std::string& aNetwork)
+void VBoxNetBaseService::setNetworkName(const std::string& aName)
{
- m->m_Network = aNetwork;
+ m->m_NetworkName = aName;
}
diff --git a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h
index a55fb74..aaca08d 100644
--- a/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h
+++ b/src/VBox/NetworkServices/NetLib/VBoxNetBaseService.h
@@ -86,11 +86,11 @@ public:
virtual bool isMainNeeded() const;
protected:
- const std::string getName() const;
- void setName(const std::string&);
+ const std::string getServiceName() const;
+ void setServiceName(const std::string&);
- const std::string getNetwork() const;
- void setNetwork(const std::string&);
+ const std::string getNetworkName() const;
+ void setNetworkName(const std::string&);
const RTMAC getMacAddress() const;
void setMacAddress(const RTMAC&);
diff --git a/src/VBox/NetworkServices/NetLib/VBoxNetPortForwardString.cpp b/src/VBox/NetworkServices/NetLib/VBoxNetPortForwardString.cpp
index 4957071..12ff0e4 100644
--- a/src/VBox/NetworkServices/NetLib/VBoxNetPortForwardString.cpp
+++ b/src/VBox/NetworkServices/NetLib/VBoxNetPortForwardString.cpp
@@ -233,7 +233,7 @@ int netPfStrToPf(const char *pcszStrPortForward, int fIPv6, PPORTFORWARDRULE pPf
AssertPtrReturn(pcszStrPortForward, VERR_INVALID_PARAMETER);
AssertPtrReturn(pPfr, VERR_INVALID_PARAMETER);
- memset(pPfr, 0, sizeof(PORTFORWARDRULE));
+ RT_ZERO(*pPfr);
pszHostAddr = &pPfr->szPfrHostAddr[0];
pszGuestAddr = &pPfr->szPfrGuestAddr[0];
@@ -270,15 +270,15 @@ int netPfStrToPf(const char *pcszStrPortForward, int fIPv6, PPORTFORWARDRULE pPf
RT_MIN((size_t)cbToken + 1, PF_NAMELEN),
pszRaw);
pszRaw += cbToken; /* move to separator */
+ cbRaw -= cbToken;
}
AssertReturn(pszRaw[0] == PF_FIELD_SEPARATOR, VERR_INVALID_PARAMETER);
/* protocol */
pszRaw++; /* skip separator */
- idxRaw = 0;
-
cbRaw--;
+ idxRaw = 0;
if ( ( (fTcpProto = (RTStrNICmp(pszRaw, "tcp", 3) == 0))
|| RTStrNICmp(pszRaw, "udp", 3) == 0)
@@ -292,7 +292,6 @@ int netPfStrToPf(const char *pcszStrPortForward, int fIPv6, PPORTFORWARDRULE pPf
pszRaw += idxRaw;
cbRaw -= idxRaw;
- idxRaw = 0;
idxRaw = netPfStrAddressPortPairParse(pszRaw, cbRaw,
pszHostAddr, INET6_ADDRSTRLEN,
@@ -305,13 +304,9 @@ int netPfStrToPf(const char *pcszStrPortForward, int fIPv6, PPORTFORWARDRULE pPf
Assert(pszRaw[0] == PF_FIELD_SEPARATOR);
- idxRaw = 0;
-
idxRaw = netPfStrAddressPortPairParse(pszRaw, cbRaw,
- pszGuestAddr,
- INET6_ADDRSTRLEN,
- false,
- &u16GuestPort);
+ pszGuestAddr, INET6_ADDRSTRLEN,
+ false, &u16GuestPort);
if (idxRaw < 0)
goto invalid_parameter;
@@ -343,6 +338,6 @@ int netPfStrToPf(const char *pcszStrPortForward, int fIPv6, PPORTFORWARDRULE pPf
invalid_parameter:
RTStrFree(pszRawBegin);
if (pPfr)
- memset(pPfr, 0, sizeof(PORTFORWARDRULE));
+ RT_ZERO(*pPfr);
return VERR_INVALID_PARAMETER;
}
diff --git a/src/VBox/RDP/client-1.8.3/vrdp/rdpusb.c b/src/VBox/RDP/client-1.8.3/vrdp/rdpusb.c
index a0886ee..894c8e9 100644
--- a/src/VBox/RDP/client-1.8.3/vrdp/rdpusb.c
+++ b/src/VBox/RDP/client-1.8.3/vrdp/rdpusb.c
@@ -502,6 +502,7 @@ rdpusb_process(STREAM s)
proxy->pvInstanceDataR3 = xmalloc(g_USBProxyDeviceHost.cbBackend);
if (!proxy->pvInstanceDataR3)
{
+ xfree (proxy);
error("RDPUSB: Out of memory allocating proxy backend data\n");
return;
}
diff --git a/src/VBox/Runtime/Makefile.kmk b/src/VBox/Runtime/Makefile.kmk
index 7f50d2b..d063763 100644
--- a/src/VBox/Runtime/Makefile.kmk
+++ b/src/VBox/Runtime/Makefile.kmk
@@ -656,6 +656,8 @@ RuntimeR3_SOURCES.x86 += \
common/asm/ASMWrMsrEx.asm \
common/asm/ASMGetXcr0.asm \
common/asm/ASMSetXcr0.asm \
+ common/asm/ASMXSave.asm \
+ common/asm/ASMXRstor.asm \
common/math/bignum-amd64-x86.asm
RuntimeR3_SOURCES.amd64 += \
common/asm/ASMCpuIdExSlow.asm \
@@ -669,6 +671,8 @@ RuntimeR3_SOURCES.amd64 += \
common/asm/ASMWrMsrEx.asm \
common/asm/ASMGetXcr0.asm \
common/asm/ASMSetXcr0.asm \
+ common/asm/ASMXSave.asm \
+ common/asm/ASMXRstor.asm \
common/math/bignum-amd64-x86.asm \
common/math/RTUInt128MulByU64.asm
@@ -1699,6 +1703,8 @@ RuntimeR0_SOURCES.x86 += \
common/asm/ASMAtomicUoOrU32.asm \
common/asm/ASMGetXcr0.asm \
common/asm/ASMSetXcr0.asm \
+ common/asm/ASMXSave.asm \
+ common/asm/ASMXRstor.asm \
common/asm/ASMRdMsrEx.asm \
common/asm/ASMWrMsrEx.asm
RuntimeR0_SOURCES.amd64 += \
@@ -1711,6 +1717,8 @@ RuntimeR0_SOURCES.amd64 += \
common/asm/ASMAtomicUoOrU32.asm \
common/asm/ASMGetXcr0.asm \
common/asm/ASMSetXcr0.asm \
+ common/asm/ASMXSave.asm \
+ common/asm/ASMXRstor.asm \
common/asm/ASMRdMsrEx.asm \
common/asm/ASMWrMsrEx.asm
@@ -2275,6 +2283,10 @@ ifdef VBOX_WITH_RAW_MODE
RuntimeRC_DEFS = IN_RT_RC RT_WITH_VBOX IN_SUP_RC IN_VMM_RC
RuntimeRC_INCS = include
RuntimeRC_SOURCES := \
+ common/asm/ASMGetXcr0.asm \
+ common/asm/ASMSetXcr0.asm \
+ common/asm/ASMXSave.asm \
+ common/asm/ASMXRstor.asm \
common/checksum/alt-md5.cpp \
common/checksum/crc32.cpp \
common/checksum/crc64.cpp \
diff --git a/src/VBox/Runtime/VBox/dbus.cpp b/src/VBox/Runtime/VBox/dbus.cpp
index 70e6374..c9a6bec 100644
--- a/src/VBox/Runtime/VBox/dbus.cpp
+++ b/src/VBox/Runtime/VBox/dbus.cpp
@@ -1,3 +1,4 @@
+/* $Id: dbus.cpp $ */
/** @file
*
* Module to dynamically load libdbus and load all symbols
diff --git a/src/VBox/Runtime/common/asm/ASMGetXcr0.asm b/src/VBox/Runtime/common/asm/ASMGetXcr0.asm
index 7a7981e..e14e393 100644
--- a/src/VBox/Runtime/common/asm/ASMGetXcr0.asm
+++ b/src/VBox/Runtime/common/asm/ASMGetXcr0.asm
@@ -27,6 +27,7 @@
;*******************************************************************************
;* Header Files *
;*******************************************************************************
+%define RT_ASM_WITH_SEH64
%include "iprt/asmdefs.mac"
BEGINCODE
@@ -36,6 +37,7 @@ BEGINCODE
; @returns XCR0 value in rax (amd64) / edx:eax (x86).
;
BEGINPROC_EXPORTED ASMGetXcr0
+SEH64_END_PROLOGUE
xor ecx, ecx ; XCR0
xgetbv
%ifdef RT_ARCH_AMD64
diff --git a/src/VBox/Runtime/common/asm/ASMSetXcr0.asm b/src/VBox/Runtime/common/asm/ASMSetXcr0.asm
index d7725a8..fcc73c3 100644
--- a/src/VBox/Runtime/common/asm/ASMSetXcr0.asm
+++ b/src/VBox/Runtime/common/asm/ASMSetXcr0.asm
@@ -27,6 +27,7 @@
;*******************************************************************************
;* Header Files *
;*******************************************************************************
+%define RT_ASM_WITH_SEH64
%include "iprt/asmdefs.mac"
BEGINCODE
@@ -37,6 +38,7 @@ BEGINCODE
; msc=rcx, gcc=rdi, x86=[esp+4]
;
BEGINPROC_EXPORTED ASMSetXcr0
+SEH64_END_PROLOGUE
%ifdef ASM_CALL64_MSC
mov rdx, rcx
shr rdx, 32
diff --git a/src/VBox/Runtime/common/asm/ASMSetXcr0.asm b/src/VBox/Runtime/common/asm/ASMXRstor.asm
similarity index 69%
copy from src/VBox/Runtime/common/asm/ASMSetXcr0.asm
copy to src/VBox/Runtime/common/asm/ASMXRstor.asm
index d7725a8..dbb857f 100644
--- a/src/VBox/Runtime/common/asm/ASMSetXcr0.asm
+++ b/src/VBox/Runtime/common/asm/ASMXRstor.asm
@@ -1,6 +1,6 @@
-; $Id: ASMSetXcr0.asm $
+; $Id: ASMXRstor.asm $
;; @file
-; IPRT - ASMSetXcr0().
+; IPRT - ASMXRstor().
;
;
@@ -27,32 +27,37 @@
;*******************************************************************************
;* Header Files *
;*******************************************************************************
+%define RT_ASM_WITH_SEH64
%include "iprt/asmdefs.mac"
BEGINCODE
;;
-; Sets the content of the Xcr0 CPU register.
-; @param uXcr0 The new XCR0 content.
-; msc=rcx, gcc=rdi, x86=[esp+4]
+; Loads extended CPU state.
+; @param pXStateArea Pointer to the XRSTOR state area.
+; msc=rcx, gcc=rdi, x86=[esp+4]
+; @param fMask The 64-bit state component mask.
+; msc=rdx, gcc=rsi, x86=[esp+8]
;
-BEGINPROC_EXPORTED ASMSetXcr0
+BEGINPROC_EXPORTED ASMXRstor
+SEH64_END_PROLOGUE
%ifdef ASM_CALL64_MSC
- mov rdx, rcx
+ mov eax, edx
shr rdx, 32
- mov eax, ecx
+ xrstor [rcx]
%elifdef ASM_CALL64_GCC
- mov rdx, rdi
+ mov rdx, rsi
shr rdx, 32
- mov eax, edi
+ mov eax, esi
+ xrstor [rdi]
%elifdef RT_ARCH_X86
- mov eax, [esp + 4]
- mov edx, [esp + 8]
+ mov ecx, [esp + 4]
+ mov eax, [esp + 8]
+ mov edx, [esp + 12]
+ xrstor [ecx]
%else
%error "Undefined arch?"
%endif
- xor ecx, ecx
- xsetbv
ret
-ENDPROC ASMSetXcr0
+ENDPROC ASMXRstor
diff --git a/src/VBox/Runtime/common/asm/ASMSetXcr0.asm b/src/VBox/Runtime/common/asm/ASMXSave.asm
similarity index 70%
copy from src/VBox/Runtime/common/asm/ASMSetXcr0.asm
copy to src/VBox/Runtime/common/asm/ASMXSave.asm
index d7725a8..f0d8842 100644
--- a/src/VBox/Runtime/common/asm/ASMSetXcr0.asm
+++ b/src/VBox/Runtime/common/asm/ASMXSave.asm
@@ -1,6 +1,6 @@
-; $Id: ASMSetXcr0.asm $
+; $Id: ASMXSave.asm $
;; @file
-; IPRT - ASMSetXcr0().
+; IPRT - ASMXSave().
;
;
@@ -27,32 +27,37 @@
;*******************************************************************************
;* Header Files *
;*******************************************************************************
+%define RT_ASM_WITH_SEH64
%include "iprt/asmdefs.mac"
BEGINCODE
;;
-; Sets the content of the Xcr0 CPU register.
-; @param uXcr0 The new XCR0 content.
-; msc=rcx, gcc=rdi, x86=[esp+4]
+; Saves extended CPU state.
+; @param pXStateArea Pointer to the XSAVE state area.
+; msc=rcx, gcc=rdi, x86=[esp+4]
+; @param fComponents The 64-bit state component mask.
+; msc=rdx, gcc=rsi, x86=[esp+8]
;
-BEGINPROC_EXPORTED ASMSetXcr0
+BEGINPROC_EXPORTED ASMXSave
+SEH64_END_PROLOGUE
%ifdef ASM_CALL64_MSC
- mov rdx, rcx
+ mov eax, edx
shr rdx, 32
- mov eax, ecx
+ xsave [rcx]
%elifdef ASM_CALL64_GCC
- mov rdx, rdi
+ mov rdx, rsi
shr rdx, 32
- mov eax, edi
+ mov eax, esi
+ xsave [rdi]
%elifdef RT_ARCH_X86
- mov eax, [esp + 4]
- mov edx, [esp + 8]
+ mov ecx, [esp + 4]
+ mov eax, [esp + 8]
+ mov edx, [esp + 12]
+ xsave [ecx]
%else
%error "Undefined arch?"
%endif
- xor ecx, ecx
- xsetbv
ret
-ENDPROC ASMSetXcr0
+ENDPROC ASMXSave
diff --git a/src/VBox/Runtime/common/checksum/RTSha256Digest.cpp b/src/VBox/Runtime/common/checksum/RTSha256Digest.cpp
index cfc25a0..a68a5b8 100644
--- a/src/VBox/Runtime/common/checksum/RTSha256Digest.cpp
+++ b/src/VBox/Runtime/common/checksum/RTSha256Digest.cpp
@@ -1,3 +1,4 @@
+/* $Id: RTSha256Digest.cpp $ */
/** @file
* IPRT - SHA256 digest creation
*
diff --git a/src/VBox/Runtime/common/dbg/dbgcfg.cpp b/src/VBox/Runtime/common/dbg/dbgcfg.cpp
index f31452a..1d497c1 100644
--- a/src/VBox/Runtime/common/dbg/dbgcfg.cpp
+++ b/src/VBox/Runtime/common/dbg/dbgcfg.cpp
@@ -658,6 +658,8 @@ static int rtDbgCfgUnpackMsCacheFile(PRTDBGCFGINT pThis, char *pszPath, const ch
* Figuring out the argument list for the platform specific unpack util.
*/
#ifdef RT_OS_WINDOWS
+ RTPathChangeToDosSlashes(pszSrcArchive, false /*fForce*/);
+ RTPathChangeToDosSlashes(pszPath, false /*fForce*/);
const char *papszArgs[] =
{
"expand.exe",
@@ -818,7 +820,7 @@ static int rtDbgCfgTryDownloadAndOpen(PRTDBGCFGINT pThis, const char *pszServer,
if (RT_FAILURE(rc))
{
RTFileDelete(pszPath);
- rtDbgCfgLog1(pThis, "%Rrc on URL '%s'\n", rc, pszPath);
+ rtDbgCfgLog1(pThis, "%Rrc on URL '%s'\n", rc, szUrl);
}
if (rc == VERR_HTTP_NOT_FOUND)
{
diff --git a/src/VBox/Runtime/common/ldr/ldrPE.cpp b/src/VBox/Runtime/common/ldr/ldrPE.cpp
index 5583958..c9f69c0 100644
--- a/src/VBox/Runtime/common/ldr/ldrPE.cpp
+++ b/src/VBox/Runtime/common/ldr/ldrPE.cpp
@@ -3600,11 +3600,10 @@ static int rtldrPEValidateDirectoriesAndRememberStuff(PRTLDRMODPE pModPe, const
} while (off < Dir.Size);
}
RTMemTmpFree(pFirst);
- if (RT_FAILURE(rc))
+ if (RT_FAILURE(rc) && !(fFlags & RTLDR_O_FOR_DEBUG))
return rc;
}
-
return VINF_SUCCESS;
}
diff --git a/src/VBox/Runtime/common/log/tracebuf.cpp b/src/VBox/Runtime/common/log/tracebuf.cpp
index e76e40b..a664e4e 100644
--- a/src/VBox/Runtime/common/log/tracebuf.cpp
+++ b/src/VBox/Runtime/common/log/tracebuf.cpp
@@ -1,3 +1,29 @@
+/* $Id: tracebuf.cpp $ */
+/** @file
+ * IPRT - Tracebuffer common functions.
+ */
+
+/*
+ * Copyright (C) 2011-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
/*******************************************************************************
* Header Files *
diff --git a/src/VBox/Runtime/common/log/tracedefault.cpp b/src/VBox/Runtime/common/log/tracedefault.cpp
index 72acc1c..801137d 100644
--- a/src/VBox/Runtime/common/log/tracedefault.cpp
+++ b/src/VBox/Runtime/common/log/tracedefault.cpp
@@ -1,3 +1,29 @@
+/* $Id: tracedefault.cpp $ */
+/** @file
+ * IPRT - Tracebuffer common functions.
+ */
+
+/*
+ * Copyright (C) 2011-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
/*******************************************************************************
* Header Files *
diff --git a/src/VBox/Runtime/common/misc/getoptargv.cpp b/src/VBox/Runtime/common/misc/getoptargv.cpp
index 8f749e1..b44b16f 100644
--- a/src/VBox/Runtime/common/misc/getoptargv.cpp
+++ b/src/VBox/Runtime/common/misc/getoptargv.cpp
@@ -46,15 +46,19 @@
* We include some extra stuff here that the corresponding shell would normally
* require quoting of.
*/
-static uint8_t const g_abmQuoteChars[RTGETOPTARGV_CNV_QUOTE_MASK + 1][128/8] =
+static uint8_t
+#ifndef IPRT_REGENERATE_QUOTE_CHARS
+const
+#endif
+g_abmQuoteChars[RTGETOPTARGV_CNV_QUOTE_MASK + 1][16] =
{
- { 0xfe, 0xff, 0x0f, 0x00, 0x65, 0x00, 0x00, 0x50 },
- { 0xfe, 0xff, 0x0f, 0x00, 0xd7, 0x07, 0x00, 0xd8 },
+ { 0xfe, 0xff, 0xff, 0xff, 0x65, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 },
+ { 0xfe, 0xff, 0xff, 0xff, 0xd7, 0x07, 0x00, 0xd8, 0x00, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0x50 },
};
-#if 0 /* To re-generate the bitmaps. */
-#include <stdio.h>
+#ifdef IPRT_REGENERATE_QUOTE_CHARS /* To re-generate the bitmaps. */
+# include <stdio.h>
int main()
{
RT_ZERO(g_abmQuoteChars);
@@ -65,7 +69,10 @@ int main()
ASMBitSet(&g_abmQuoteChars[iType], (ch)); \
} while (0)
# define SET(ConstSuffix, ch) \
- ASMBitSet(&g_abmQuoteChars[RTGETOPTARGV_CNV_QUOTE_##ConstSuffix], (ch));
+ do { \
+ ASMBitSet(&g_abmQuoteChars[RTGETOPTARGV_CNV_QUOTE_##ConstSuffix], (ch)); \
+ printf(#ConstSuffix ": %#x %d %c\n", (ch), (ch), (ch)); \
+ } while (0)
/* just flag all the control chars as in need of quoting. */
for (char ch = 1; ch < 0x20; ch++)
@@ -75,12 +82,12 @@ int main()
SET_ALL(' ');
/* MS CRT / CMD.EXE: */
- SET(MS_CRT, '"')
- SET(MS_CRT, '&')
- SET(MS_CRT, '>')
- SET(MS_CRT, '<')
- SET(MS_CRT, '|')
- SET(MS_CRT, '%')
+ SET(MS_CRT, '"');
+ SET(MS_CRT, '&');
+ SET(MS_CRT, '>');
+ SET(MS_CRT, '<');
+ SET(MS_CRT, '|');
+ SET(MS_CRT, '%');
/* Bourne shell: */
SET(BOURNE_SH, '!');
@@ -104,14 +111,14 @@ int main()
for (size_t iType = 0; iType <= RTGETOPTARGV_CNV_QUOTE_MASK; iType++)
{
printf(" {");
- for (size_t iByte = 0; iByte < 8; iByte++)
+ for (size_t iByte = 0; iByte < 16; iByte++)
printf(iByte == 0 ? " 0x%02x" : ", 0x%02x", g_abmQuoteChars[iType][iByte]);
printf(" },\n");
}
return 0;
}
-#endif /* To re-generate the bitmaps. */
+#else /* !IPRT_REGENERATE_QUOTE_CHARS */
/**
* Look for an unicode code point in the separator string.
@@ -213,7 +220,8 @@ static int rtGetOptSkipDelimiters(const char **ppszSrc, const char *pszSeparator
}
-RTDECL(int) RTGetOptArgvFromString(char ***ppapszArgv, int *pcArgs, const char *pszCmdLine, const char *pszSeparators)
+RTDECL(int) RTGetOptArgvFromString(char ***ppapszArgv, int *pcArgs, const char *pszCmdLine,
+ uint32_t fFlags, const char *pszSeparators)
{
/*
* Some input validation.
@@ -221,6 +229,8 @@ RTDECL(int) RTGetOptArgvFromString(char ***ppapszArgv, int *pcArgs, const char *
AssertPtr(pszCmdLine);
AssertPtr(pcArgs);
AssertPtr(ppapszArgv);
+ AssertReturn( fFlags == RTGETOPTARGV_CNV_QUOTE_BOURNE_SH
+ || fFlags == RTGETOPTARGV_CNV_QUOTE_MS_CRT, VERR_INVALID_FLAGS);
if (!pszSeparators)
pszSeparators = " \t\n\r";
else
@@ -261,28 +271,106 @@ RTDECL(int) RTGetOptArgvFromString(char ***ppapszArgv, int *pcArgs, const char *
}
papszArgs[iArg++] = pszDst;
- /* Parse and copy the string over. */
- RTUNICP CpQuote = 0;
+ /*
+ * Parse and copy the string over.
+ */
RTUNICP Cp;
- for (;;)
+ if ((fFlags & RTGETOPTARGV_CNV_QUOTE_MASK) == RTGETOPTARGV_CNV_QUOTE_BOURNE_SH)
{
- rc = RTStrGetCpEx(&pszSrc, &Cp);
- if (RT_FAILURE(rc) || !Cp)
- break;
- if (!CpQuote)
+ /*
+ * Bourne shell style.
+ */
+ RTUNICP CpQuote = 0;
+ for (;;)
{
- if (Cp == '"' || Cp == '\'')
- CpQuote = Cp;
- else if (rtGetOptIsCpInSet(Cp, pszSeparators, cchSeparators))
+ rc = RTStrGetCpEx(&pszSrc, &Cp);
+ if (RT_FAILURE(rc) || !Cp)
break;
+ if (!CpQuote)
+ {
+ if (Cp == '"' || Cp == '\'')
+ CpQuote = Cp;
+ else if (rtGetOptIsCpInSet(Cp, pszSeparators, cchSeparators))
+ break;
+ else if (Cp != '\\')
+ pszDst = RTStrPutCp(pszDst, Cp);
+ else
+ {
+ /* escaped char */
+ rc = RTStrGetCpEx(&pszSrc, &Cp);
+ if (RT_FAILURE(rc) || !Cp)
+ break;
+ pszDst = RTStrPutCp(pszDst, Cp);
+ }
+ }
+ else if (CpQuote != Cp)
+ {
+ if (Cp != '\\' || CpQuote == '\'')
+ pszDst = RTStrPutCp(pszDst, Cp);
+ else
+ {
+ /* escaped char */
+ rc = RTStrGetCpEx(&pszSrc, &Cp);
+ if (RT_FAILURE(rc) || !Cp)
+ break;
+ pszDst = RTStrPutCp(pszDst, Cp);
+ }
+ }
else
+ CpQuote = 0;
+ }
+ }
+ else
+ {
+ /*
+ * Microsoft CRT style.
+ */
+ Assert((fFlags & RTGETOPTARGV_CNV_QUOTE_MASK) == RTGETOPTARGV_CNV_QUOTE_MS_CRT);
+ bool fInQuote = false;
+ for (;;)
+ {
+ rc = RTStrGetCpEx(&pszSrc, &Cp);
+ if (RT_FAILURE(rc) || !Cp)
+ break;
+ if (Cp == '"')
+ fInQuote = !fInQuote;
+ else if (!fInQuote && rtGetOptIsCpInSet(Cp, pszSeparators, cchSeparators))
+ break;
+ else if (Cp != '\\')
pszDst = RTStrPutCp(pszDst, Cp);
+ else
+ {
+ /* A backslash sequence is only relevant if followed by
+ a double quote, then it will work like an escape char. */
+ size_t cQuotes = 1;
+ while (*pszSrc == '\\')
+ {
+ cQuotes++;
+ pszSrc++;
+ }
+ if (*pszSrc != '"')
+ /* Not an escape sequence. */
+ while (cQuotes-- > 0)
+ pszDst = RTStrPutCp(pszDst, '\\');
+ else
+ {
+ /* Escape sequence. Output half of the slashes. If odd
+ number, output the escaped double quote . */
+ while (cQuotes >= 2)
+ {
+ pszDst = RTStrPutCp(pszDst, '\\');
+ cQuotes -= 2;
+ }
+ if (!cQuotes)
+ fInQuote = !fInQuote;
+ else
+ pszDst = RTStrPutCp(pszDst, '"');
+ pszSrc++;
+ }
+ }
}
- else if (CpQuote != Cp)
- pszDst = RTStrPutCp(pszDst, Cp);
- else
- CpQuote = 0;
}
+
*pszDst++ = '\0';
if (RT_FAILURE(rc) || !Cp)
break;
@@ -339,17 +427,22 @@ RTDECL(void) RTGetOptArgvFree(char **papszArgv)
*/
DECLINLINE(bool) rtGetOpArgvRequiresQuoting(const char *pszArg, uint32_t fFlags, size_t *pcch)
{
- char const *psz = pszArg;
- unsigned char ch;
- while ((ch = (unsigned char)*psz))
+ if ((fFlags & RTGETOPTARGV_CNV_QUOTE_MASK) != RTGETOPTARGV_CNV_UNQUOTED)
{
- if ( ch < 128
- && ASMBitTest(&g_abmQuoteChars[fFlags & RTGETOPTARGV_CNV_QUOTE_MASK], ch))
- return true;
- psz++;
- }
+ char const *psz = pszArg;
+ unsigned char ch;
+ while ((ch = (unsigned char)*psz))
+ {
+ if ( ch < 128
+ && ASMBitTest(&g_abmQuoteChars[fFlags & RTGETOPTARGV_CNV_QUOTE_MASK], ch))
+ return true;
+ psz++;
+ }
- *pcch = psz - pszArg;
+ *pcch = psz - pszArg;
+ }
+ else
+ *pcch = strlen(pszArg);
return false;
}
@@ -388,7 +481,7 @@ DECLINLINE(bool) rtGetOptArgvMsCrtIsSlashQuote(const char *psz)
RTDECL(int) RTGetOptArgvToString(char **ppszCmdLine, const char * const *papszArgv, uint32_t fFlags)
{
- AssertReturn(!(fFlags & ~RTGETOPTARGV_CNV_QUOTE_MASK), VERR_INVALID_PARAMETER);
+ AssertReturn(fFlags <= RTGETOPTARGV_CNV_UNQUOTED, VERR_INVALID_PARAMETER);
#define PUT_CH(ch) \
if (RT_UNLIKELY(off + 1 >= cbCmdLineAlloc)) { \
@@ -510,3 +603,5 @@ RTDECL(int) RTGetOptArgvToUtf16String(PRTUTF16 *ppwszCmdLine, const char * const
return rc;
}
+#endif /* !IPRT_REGENERATE_QUOTE_CHARS */
+
diff --git a/src/VBox/Runtime/common/misc/lockvalidator.cpp b/src/VBox/Runtime/common/misc/lockvalidator.cpp
index eac25db..81c8c53 100644
--- a/src/VBox/Runtime/common/misc/lockvalidator.cpp
+++ b/src/VBox/Runtime/common/misc/lockvalidator.cpp
@@ -2999,6 +2999,9 @@ RTDECL(void) RTLockValidatorRecExclDelete(PRTLOCKVALRECEXCL pRec)
rtLockValidatorSerializeDestructEnter();
+ /** @todo Check that it's not on our stack first. Need to make it
+ * configurable whether deleting a owned lock is acceptable? */
+
ASMAtomicWriteU32(&pRec->Core.u32Magic, RTLOCKVALRECEXCL_MAGIC_DEAD);
ASMAtomicWriteHandle(&pRec->hThread, NIL_RTTHREAD);
RTLOCKVALCLASS hClass;
@@ -3467,6 +3470,9 @@ RTDECL(void) RTLockValidatorRecSharedDelete(PRTLOCKVALRECSHRD pRec)
{
Assert(pRec->Core.u32Magic == RTLOCKVALRECSHRD_MAGIC);
+ /** @todo Check that it's not on our stack first. Need to make it
+ * configurable whether deleting a owned lock is acceptable? */
+
/*
* Flip it into table realloc mode and take the destruction lock.
*/
diff --git a/src/VBox/Runtime/common/zip/tarvfs.cpp b/src/VBox/Runtime/common/zip/tarvfs.cpp
index c10e052..72c3d44 100644
--- a/src/VBox/Runtime/common/zip/tarvfs.cpp
+++ b/src/VBox/Runtime/common/zip/tarvfs.cpp
@@ -77,7 +77,8 @@ typedef struct RTZIPTARREADER
uint32_t cZeroHdrs;
/** The state machine state. */
RTZIPTARREADERSTATE enmState;
- /** The type of the previous TAR header. */
+ /** The type of the previous TAR header.
+ * @remarks Same a enmType for the first header in the TAR stream. */
RTZIPTARTYPE enmPrevType;
/** The type of the current TAR header. */
RTZIPTARTYPE enmType;
@@ -458,7 +459,11 @@ static int rtZipTarReaderParseNextHeader(PRTZIPTARREADER pThis, PCRTZIPTARHDR pH
return rc;
}
if (fFirst)
+ {
pThis->enmType = enmType;
+ if (pThis->enmPrevType == RTZIPTARTYPE_INVALID)
+ pThis->enmPrevType = enmType;
+ }
/*
* Handle the header by type.
diff --git a/src/VBox/Runtime/generic/env-generic.cpp b/src/VBox/Runtime/generic/env-generic.cpp
index eed87b8..a96f30e 100644
--- a/src/VBox/Runtime/generic/env-generic.cpp
+++ b/src/VBox/Runtime/generic/env-generic.cpp
@@ -88,6 +88,8 @@ typedef struct RTENVINTERNAL
{
/** Magic value . */
uint32_t u32Magic;
+ /** Set if this is a record of environment changes, putenv style. */
+ bool fPutEnvBlock;
/** Number of variables in the array.
* This does not include the terminating NULL entry. */
size_t cVars;
@@ -95,7 +97,10 @@ typedef struct RTENVINTERNAL
* This includes space for the terminating NULL element (for compatibility
* with the C library), so that c <= cCapacity - 1. */
size_t cAllocated;
- /** Array of environment variables. */
+ /** Array of environment variables.
+ * These are always in "NAME=VALUE" form, where the value can be empty. If
+ * fPutEnvBlock is set though, there will be "NAME" entries too for variables
+ * that need to be removed when merged with another environment block. */
char **papszEnv;
/** Array of environment variables in the process CP.
* This get (re-)constructed when RTEnvGetExecEnvP method is called. */
@@ -131,8 +136,12 @@ static const char * const *rtEnvDefault(void)
* @param cAllocated The initial array size.
* @param fCaseSensitive Whether the environment block is case sensitive or
* not.
+ * @param fPutEnvBlock Indicates whether this is a special environment
+ * block that will be used to record change another
+ * block. We will keep unsets in putenv format, i.e.
+ * just the variable name without any equal sign.
*/
-static int rtEnvCreate(PRTENVINTERNAL *ppIntEnv, size_t cAllocated, bool fCaseSensitive)
+static int rtEnvCreate(PRTENVINTERNAL *ppIntEnv, size_t cAllocated, bool fCaseSensitive, bool fPutEnvBlock)
{
/*
* Allocate environment handle.
@@ -144,6 +153,7 @@ static int rtEnvCreate(PRTENVINTERNAL *ppIntEnv, size_t cAllocated, bool fCaseSe
* Pre-allocate the variable array.
*/
pIntEnv->u32Magic = RTENV_MAGIC;
+ pIntEnv->fPutEnvBlock = fPutEnvBlock;
pIntEnv->pfnCompare = fCaseSensitive ? RTStrNCmp : RTStrNICmp;
pIntEnv->papszEnvOtherCP = NULL;
pIntEnv->cVars = 0;
@@ -165,7 +175,7 @@ static int rtEnvCreate(PRTENVINTERNAL *ppIntEnv, size_t cAllocated, bool fCaseSe
RTDECL(int) RTEnvCreate(PRTENV pEnv)
{
AssertPtrReturn(pEnv, VERR_INVALID_POINTER);
- return rtEnvCreate(pEnv, RTENV_GROW_SIZE, false /*fCaseSensitive*/);
+ return rtEnvCreate(pEnv, RTENV_GROW_SIZE, false /*fCaseSensitive*/, false /*fPutEnvBlock*/);
}
RT_EXPORT_SYMBOL(RTEnvCreate);
@@ -220,6 +230,7 @@ RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone)
* Validate input and figure out how many variable to clone and where to get them.
*/
bool fCaseSensitive = true;
+ bool fPutEnvBlock = false;
size_t cVars;
const char * const *papszEnv;
#ifdef RTENV_HAVE_WENVIRON
@@ -262,6 +273,7 @@ RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone)
AssertReturn(pIntEnvToClone->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
RTENV_LOCK(pIntEnvToClone);
+ fPutEnvBlock = pIntEnvToClone->fPutEnvBlock;
papszEnv = pIntEnvToClone->papszEnv;
cVars = pIntEnvToClone->cVars;
}
@@ -270,7 +282,7 @@ RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone)
* Create the duplicate.
*/
PRTENVINTERNAL pIntEnv;
- int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, fCaseSensitive);
+ int rc = rtEnvCreate(&pIntEnv, cVars + 1 /* NULL */, fCaseSensitive, fPutEnvBlock);
if (RT_SUCCESS(rc))
{
pIntEnv->cVars = cVars;
@@ -287,15 +299,25 @@ RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone)
int rc2 = RTStrCurrentCPToUtf8(&pIntEnv->papszEnv[iDst], papszEnv[iSrc]);
#endif
if (RT_SUCCESS(rc2))
+ {
+ /* Make sure it contains an '='. */
iDst++;
+ if (strchr(pIntEnv->papszEnv[iDst - 1], '='))
+ continue;
+ rc2 = RTStrAAppend(&pIntEnv->papszEnv[iDst - 1], "=");
+ if (RT_SUCCESS(rc2))
+ continue;
+ }
else if (rc2 == VERR_NO_TRANSLATION)
- rc = VWRN_ENV_NOT_FULLY_TRANSLATED;
- else
{
- pIntEnv->cVars = iDst;
- RTEnvDestroy(pIntEnv);
- return rc2;
+ rc = VWRN_ENV_NOT_FULLY_TRANSLATED;
+ continue;
}
+
+ /* failed fatally. */
+ pIntEnv->cVars = iDst;
+ RTEnvDestroy(pIntEnv);
+ return rc2;
}
pIntEnv->cVars = iDst;
}
@@ -327,6 +349,28 @@ RTDECL(int) RTEnvClone(PRTENV pEnv, RTENV EnvToClone)
RT_EXPORT_SYMBOL(RTEnvClone);
+RTDECL(int) RTEnvReset(RTENV hEnv)
+{
+ PRTENVINTERNAL pIntEnv = hEnv;
+ AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE);
+ AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
+
+ RTENV_LOCK(pIntEnv);
+
+ size_t iVar = pIntEnv->cVars;
+ pIntEnv->cVars = 0;
+ while (iVar-- > 0)
+ {
+ RTMemFree(pIntEnv->papszEnv[iVar]);
+ pIntEnv->papszEnv[iVar] = NULL;
+ }
+
+ RTENV_UNLOCK(pIntEnv);
+ return VINF_SUCCESS;
+}
+RT_EXPORT_SYMBOL(RTEnvReset);
+
+
RTDECL(int) RTEnvPutEx(RTENV Env, const char *pszVarEqualValue)
{
int rc;
@@ -355,11 +399,53 @@ RTDECL(int) RTEnvPutEx(RTENV Env, const char *pszVarEqualValue)
RT_EXPORT_SYMBOL(RTEnvPutEx);
+/**
+ * Appends an already allocated string to papszEnv.
+ *
+ * @returns IPRT status code
+ * @param pIntEnv The environment block to append it to.
+ * @param pszEntry The string to add. Already duplicated, caller
+ * does error cleanup.
+ */
+static int rtEnvIntAppend(PRTENVINTERNAL pIntEnv, char *pszEntry)
+{
+ /*
+ * Do we need to resize the array?
+ */
+ int rc = VINF_SUCCESS;
+ size_t iVar = pIntEnv->cVars;
+ if (iVar + 2 > pIntEnv->cAllocated)
+ {
+ void *pvNew = RTMemRealloc(pIntEnv->papszEnv, sizeof(char *) * (pIntEnv->cAllocated + RTENV_GROW_SIZE));
+ if (!pvNew)
+ rc = VERR_NO_MEMORY;
+ else
+ {
+ pIntEnv->papszEnv = (char **)pvNew;
+ pIntEnv->cAllocated += RTENV_GROW_SIZE;
+ for (size_t iNewVar = pIntEnv->cVars; iNewVar < pIntEnv->cAllocated; iNewVar++)
+ pIntEnv->papszEnv[iNewVar] = NULL;
+ }
+ }
+ if (RT_SUCCESS(rc))
+ {
+ /*
+ * Append it.
+ */
+ pIntEnv->papszEnv[iVar] = pszEntry;
+ pIntEnv->papszEnv[iVar + 1] = NULL; /* this isn't really necessary, but doesn't hurt. */
+ pIntEnv->cVars = iVar + 1;
+ }
+ return rc;
+}
+
+
RTDECL(int) RTEnvSetEx(RTENV Env, const char *pszVar, const char *pszValue)
{
AssertPtrReturn(pszVar, VERR_INVALID_POINTER);
AssertReturn(*pszVar, VERR_INVALID_PARAMETER);
AssertPtrReturn(pszValue, VERR_INVALID_POINTER);
+ AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);
int rc;
if (Env == RTENV_DEFAULT)
@@ -414,7 +500,8 @@ RTDECL(int) RTEnvSetEx(RTENV Env, const char *pszVar, const char *pszValue)
size_t iVar;
for (iVar = 0; iVar < pIntEnv->cVars; iVar++)
if ( !pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)
- && pIntEnv->papszEnv[iVar][cchVar] == '=')
+ && ( pIntEnv->papszEnv[iVar][cchVar] == '='
+ || pIntEnv->papszEnv[iVar][cchVar] == '\0') )
break;
if (iVar < pIntEnv->cVars)
{
@@ -427,29 +514,10 @@ RTDECL(int) RTEnvSetEx(RTENV Env, const char *pszVar, const char *pszValue)
else
{
/*
- * Adding a new variable. Resize the array if required
- * and then insert the new value at the end.
+ * New variable, append it.
*/
- if (pIntEnv->cVars + 2 > pIntEnv->cAllocated)
- {
- void *pvNew = RTMemRealloc(pIntEnv->papszEnv, sizeof(char *) * (pIntEnv->cAllocated + RTENV_GROW_SIZE));
- if (!pvNew)
- rc = VERR_NO_MEMORY;
- else
- {
- pIntEnv->papszEnv = (char **)pvNew;
- pIntEnv->cAllocated += RTENV_GROW_SIZE;
- for (size_t iNewVar = pIntEnv->cVars; iNewVar < pIntEnv->cAllocated; iNewVar++)
- pIntEnv->papszEnv[iNewVar] = NULL;
- }
- }
- if (RT_SUCCESS(rc))
- {
- pIntEnv->papszEnv[iVar] = pszEntry;
- pIntEnv->papszEnv[iVar + 1] = NULL; /* this isn't really necessary, but doesn't hurt. */
- pIntEnv->cVars++;
- Assert(pIntEnv->cVars == iVar + 1);
- }
+ Assert(pIntEnv->cVars == iVar);
+ rc = rtEnvIntAppend(pIntEnv, pszEntry);
}
RTENV_UNLOCK(pIntEnv);
@@ -469,6 +537,7 @@ RTDECL(int) RTEnvUnsetEx(RTENV Env, const char *pszVar)
{
AssertPtrReturn(pszVar, VERR_INVALID_POINTER);
AssertReturn(*pszVar, VERR_INVALID_PARAMETER);
+ AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);
int rc;
if (Env == RTENV_DEFAULT)
@@ -506,17 +575,44 @@ RTDECL(int) RTEnvUnsetEx(RTENV Env, const char *pszVar)
size_t iVar;
for (iVar = 0; iVar < pIntEnv->cVars; iVar++)
if ( !pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)
- && pIntEnv->papszEnv[iVar][cchVar] == '=')
+ && ( pIntEnv->papszEnv[iVar][cchVar] == '='
+ || pIntEnv->papszEnv[iVar][cchVar] == '\0') )
{
- RTMemFree(pIntEnv->papszEnv[iVar]);
- pIntEnv->cVars--;
- if (pIntEnv->cVars > 0)
- pIntEnv->papszEnv[iVar] = pIntEnv->papszEnv[pIntEnv->cVars];
- pIntEnv->papszEnv[pIntEnv->cVars] = NULL;
+ if (!pIntEnv->fPutEnvBlock)
+ {
+ RTMemFree(pIntEnv->papszEnv[iVar]);
+ pIntEnv->cVars--;
+ if (pIntEnv->cVars > 0)
+ pIntEnv->papszEnv[iVar] = pIntEnv->papszEnv[pIntEnv->cVars];
+ pIntEnv->papszEnv[pIntEnv->cVars] = NULL;
+ }
+ else
+ {
+ /* Record this unset by keeping the variable without any equal sign. */
+ pIntEnv->papszEnv[iVar][cchVar] = '\0';
+ }
rc = VINF_SUCCESS;
/* no break, there could be more. */
}
+ /*
+ * If this is a change record, we may need to add it.
+ */
+ if (rc == VINF_ENV_VAR_NOT_FOUND && pIntEnv->fPutEnvBlock)
+ {
+ char *pszEntry = (char *)RTMemDup(pszVar, cchVar + 1);
+ if (pszEntry)
+ {
+ rc = rtEnvIntAppend(pIntEnv, pszEntry);
+ if (RT_SUCCESS(rc))
+ rc = VINF_ENV_VAR_NOT_FOUND;
+ else
+ RTMemFree(pszEntry);
+ }
+ else
+ rc = VERR_NO_MEMORY;
+ }
+
RTENV_UNLOCK(pIntEnv);
}
return rc;
@@ -531,6 +627,7 @@ RTDECL(int) RTEnvGetEx(RTENV Env, const char *pszVar, char *pszValue, size_t cbV
AssertPtrNullReturn(pszValue, VERR_INVALID_POINTER);
AssertPtrNullReturn(pcchActual, VERR_INVALID_POINTER);
AssertReturn(pcchActual || (pszValue && cbValue), VERR_INVALID_PARAMETER);
+ AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);
if (pcchActual)
*pcchActual = 0;
@@ -591,22 +688,30 @@ RTDECL(int) RTEnvGetEx(RTENV Env, const char *pszVar, char *pszValue, size_t cbV
const size_t cchVar = strlen(pszVar);
size_t iVar;
for (iVar = 0; iVar < pIntEnv->cVars; iVar++)
- if ( !pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)
- && pIntEnv->papszEnv[iVar][cchVar] == '=')
+ if (!pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar))
{
- rc = VINF_SUCCESS;
- const char *pszValueOrg = pIntEnv->papszEnv[iVar] + cchVar + 1;
- size_t cch = strlen(pszValueOrg);
- if (pcchActual)
- *pcchActual = cch;
- if (pszValue && cbValue)
+ if (pIntEnv->papszEnv[iVar][cchVar] == '=')
+ {
+ rc = VINF_SUCCESS;
+ const char *pszValueOrg = pIntEnv->papszEnv[iVar] + cchVar + 1;
+ size_t cch = strlen(pszValueOrg);
+ if (pcchActual)
+ *pcchActual = cch;
+ if (pszValue && cbValue)
+ {
+ if (cch < cbValue)
+ memcpy(pszValue, pszValueOrg, cch + 1);
+ else
+ rc = VERR_BUFFER_OVERFLOW;
+ }
+ break;
+ }
+ if (pIntEnv->papszEnv[iVar][cchVar] == '\0')
{
- if (cch < cbValue)
- memcpy(pszValue, pszValueOrg, cch + 1);
- else
- rc = VERR_BUFFER_OVERFLOW;
+ Assert(pIntEnv->fPutEnvBlock);
+ rc = VERR_ENV_VAR_UNSET;
+ break;
}
- break;
}
RTENV_UNLOCK(pIntEnv);
@@ -653,11 +758,15 @@ RTDECL(bool) RTEnvExistEx(RTENV Env, const char *pszVar)
*/
const size_t cchVar = strlen(pszVar);
for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++)
- if ( !pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar)
- && pIntEnv->papszEnv[iVar][cchVar] == '=')
+ if (!pIntEnv->pfnCompare(pIntEnv->papszEnv[iVar], pszVar, cchVar))
{
- fExists = true;
- break;
+ if (pIntEnv->papszEnv[iVar][cchVar] == '=')
+ {
+ fExists = true;
+ break;
+ }
+ if (pIntEnv->papszEnv[iVar][cchVar] == '\0')
+ break;
}
RTENV_UNLOCK(pIntEnv);
@@ -739,7 +848,7 @@ RT_EXPORT_SYMBOL(RTEnvGetExecEnvP);
* @param pvElement2 Variable 2.
* @param pvUser Ignored.
*/
-DECLCALLBACK(int) rtEnvSortCompare(const void *pvElement1, const void *pvElement2, void *pvUser)
+static DECLCALLBACK(int) rtEnvSortCompare(const void *pvElement1, const void *pvElement2, void *pvUser)
{
NOREF(pvUser);
int iDiff = strcmp((const char *)pvElement1, (const char *)pvElement2);
@@ -837,7 +946,7 @@ RTDECL(int) RTEnvQueryUtf16Block(RTENV hEnv, PRTUTF16 *ppwszzBlock)
*ppwszzBlock = pwszzBlock;
return rc;
}
-RT_EXPORT_SYMBOL(RTEnvGetExecEnvP);
+RT_EXPORT_SYMBOL(RTEnvQueryUtf16Block);
RTDECL(void) RTEnvFreeUtf16Block(PRTUTF16 pwszzBlock)
@@ -847,6 +956,96 @@ RTDECL(void) RTEnvFreeUtf16Block(PRTUTF16 pwszzBlock)
RT_EXPORT_SYMBOL(RTEnvFreeUtf16Block);
+RTDECL(int) RTEnvQueryUtf8Block(RTENV hEnv, bool fSorted, char **ppszzBlock, size_t *pcbBlock)
+{
+ RTENV hClone = NIL_RTENV;
+ PRTENVINTERNAL pIntEnv;
+ int rc;
+
+ /*
+ * Validate / simplify input.
+ */
+ if (hEnv == RTENV_DEFAULT)
+ {
+ rc = RTEnvClone(&hClone, RTENV_DEFAULT);
+ if (RT_FAILURE(rc))
+ return rc;
+ pIntEnv = hClone;
+ }
+ else
+ {
+ pIntEnv = hEnv;
+ AssertPtrReturn(pIntEnv, VERR_INVALID_HANDLE);
+ AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
+ rc = VINF_SUCCESS;
+ }
+
+ RTENV_LOCK(pIntEnv);
+
+ /*
+ * Sort it, if requested.
+ */
+ if (fSorted)
+ RTSortApvShell((void **)pIntEnv->papszEnv, pIntEnv->cVars, rtEnvSortCompare, pIntEnv);
+
+ /*
+ * Calculate the size. We add one extra terminator just to be on the safe side.
+ */
+ size_t cbBlock = 2;
+ for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++)
+ cbBlock += strlen(pIntEnv->papszEnv[iVar]) + 1;
+
+ if (pcbBlock)
+ *pcbBlock = cbBlock - 1;
+
+ /*
+ * Allocate memory and copy out the variables.
+ */
+ char *pszzBlock;
+ char *pszz = pszzBlock = (char *)RTMemAlloc(cbBlock);
+ if (pszz)
+ {
+ size_t cbLeft = cbBlock;
+ for (size_t iVar = 0; iVar < pIntEnv->cVars; iVar++)
+ {
+ size_t cb = strlen(pIntEnv->papszEnv[iVar]) + 1;
+ AssertBreakStmt(cb + 2 <= cbLeft, rc = VERR_INTERNAL_ERROR_3);
+ memcpy(pszz, pIntEnv->papszEnv[iVar], cb);
+ pszz += cb;
+ cbLeft -= cb;
+ }
+ if (RT_SUCCESS(rc))
+ {
+ pszz[0] = '\0';
+ pszz[1] = '\0'; /* The extra one. */
+ }
+ else
+ {
+ RTMemFree(pszzBlock);
+ pszzBlock = NULL;
+ }
+ }
+ else
+ rc = VERR_NO_MEMORY;
+
+ RTENV_UNLOCK(pIntEnv);
+
+ if (hClone != NIL_RTENV)
+ RTEnvDestroy(hClone);
+ if (RT_SUCCESS(rc))
+ *ppszzBlock = pszzBlock;
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTEnvQueryUtf8Block);
+
+
+RTDECL(void) RTEnvFreeUtf8Block(char *pszzBlock)
+{
+ RTMemFree(pszzBlock);
+}
+RT_EXPORT_SYMBOL(RTEnvFreeUtf8Block);
+
+
RTDECL(uint32_t) RTEnvCountEx(RTENV hEnv)
{
PRTENVINTERNAL pIntEnv = hEnv;
@@ -862,7 +1061,7 @@ RTDECL(uint32_t) RTEnvCountEx(RTENV hEnv)
RT_EXPORT_SYMBOL(RTEnvCountEx);
-RTDECL(uint32_t) RTEnvGetByIndexEx(RTENV hEnv, uint32_t iVar, char *pszVar, size_t cbVar, char *pszValue, size_t cbValue)
+RTDECL(int) RTEnvGetByIndexEx(RTENV hEnv, uint32_t iVar, char *pszVar, size_t cbVar, char *pszValue, size_t cbValue)
{
PRTENVINTERNAL pIntEnv = hEnv;
AssertPtrReturn(pIntEnv, UINT32_MAX);
@@ -881,12 +1080,21 @@ RTDECL(uint32_t) RTEnvGetByIndexEx(RTENV hEnv, uint32_t iVar, char *pszVar, size
const char *pszSrcValue = strchr(pszSrcVar, '=');
bool fHasEqual = pszSrcValue != NULL;
if (pszSrcValue)
+ {
pszSrcValue++;
+ rc = VINF_SUCCESS;
+ }
else
+ {
pszSrcValue = strchr(pszSrcVar, '\0');
- rc = VINF_SUCCESS;
+ rc = VINF_ENV_VAR_UNSET;
+ }
if (cbVar)
- rc = RTStrCopyEx(pszVar, cbVar, pszSrcVar, pszSrcValue - pszSrcVar - fHasEqual);
+ {
+ int rc2 = RTStrCopyEx(pszVar, cbVar, pszSrcVar, pszSrcValue - pszSrcVar - fHasEqual);
+ if (RT_FAILURE(rc2))
+ rc = rc2;
+ }
if (cbValue)
{
int rc2 = RTStrCopy(pszValue, cbValue, pszSrcValue);
@@ -903,3 +1111,65 @@ RTDECL(uint32_t) RTEnvGetByIndexEx(RTENV hEnv, uint32_t iVar, char *pszVar, size
}
RT_EXPORT_SYMBOL(RTEnvGetByIndexEx);
+
+RTDECL(const char *) RTEnvGetByIndexRawEx(RTENV hEnv, uint32_t iVar)
+{
+ PRTENVINTERNAL pIntEnv = hEnv;
+ AssertPtrReturn(pIntEnv, NULL);
+ AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, NULL);
+
+ RTENV_LOCK(pIntEnv);
+
+ const char *pszRet;
+ if (iVar < pIntEnv->cVars)
+ pszRet = pIntEnv->papszEnv[iVar];
+ else
+ pszRet = NULL;
+
+ RTENV_UNLOCK(pIntEnv);
+
+ return pszRet;
+}
+RT_EXPORT_SYMBOL(RTEnvGetByIndexRawEx);
+
+
+RTDECL(int) RTEnvCreateChangeRecord(PRTENV phEnv)
+{
+ AssertPtrReturn(phEnv, VERR_INVALID_POINTER);
+ return rtEnvCreate(phEnv, RTENV_GROW_SIZE, false /*fCaseSensitive*/, true /*fPutEnvBlock*/);
+}
+RT_EXPORT_SYMBOL(RTEnvCreateChangeRecord);
+
+
+RTDECL(bool) RTEnvIsChangeRecord(RTENV hEnv)
+{
+ if (hEnv == RTENV_DEFAULT)
+ return false;
+
+ PRTENVINTERNAL pIntEnv = hEnv;
+ AssertPtrReturn(pIntEnv, false);
+ AssertReturn(pIntEnv->u32Magic == RTENV_MAGIC, false);
+ return pIntEnv->fPutEnvBlock;
+}
+RT_EXPORT_SYMBOL(RTEnvIsChangeRecord);
+
+
+RTDECL(int) RTEnvApplyChanges(RTENV hEnvDst, RTENV hEnvChanges)
+{
+ PRTENVINTERNAL pIntEnvChanges = hEnvChanges;
+ AssertPtrReturn(pIntEnvChanges, VERR_INVALID_HANDLE);
+ AssertReturn(pIntEnvChanges->u32Magic == RTENV_MAGIC, VERR_INVALID_HANDLE);
+
+ /** @todo lock validator trouble ahead here! */
+ RTENV_LOCK(pIntEnvChanges);
+
+ int rc = VINF_SUCCESS;
+ for (uint32_t iChange = 0; iChange < pIntEnvChanges->cVars && RT_SUCCESS(rc); iChange++)
+ rc = RTEnvPutEx(hEnvDst, pIntEnvChanges->papszEnv[iChange]);
+
+ RTENV_UNLOCK(pIntEnvChanges);
+
+ return rc;
+}
+RT_EXPORT_SYMBOL(RTEnvApplyChanges);
+
diff --git a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
index 9210f90..62b38b1 100644
--- a/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
+++ b/src/VBox/Runtime/r0drv/linux/memobj-r0drv-linux.c
@@ -1,4 +1,4 @@
-/* $Revision: 94830 $ */
+/* $Id: memobj-r0drv-linux.c $ */
/** @file
* IPRT - Ring-0 Memory Objects, Linux.
*/
diff --git a/src/VBox/Runtime/r0drv/memobj-r0drv.cpp b/src/VBox/Runtime/r0drv/memobj-r0drv.cpp
index 2d5c85c..d8982ff 100644
--- a/src/VBox/Runtime/r0drv/memobj-r0drv.cpp
+++ b/src/VBox/Runtime/r0drv/memobj-r0drv.cpp
@@ -1,4 +1,4 @@
-/* $Revision: 89632 $ */
+/* $Id: memobj-r0drv.cpp $ */
/** @file
* IPRT - Ring-0 Memory Objects, Common Code.
*/
diff --git a/src/VBox/Runtime/r0drv/solaris/modulestub-r0drv-solaris.c b/src/VBox/Runtime/r0drv/solaris/modulestub-r0drv-solaris.c
index b3a171a..1625bee 100644
--- a/src/VBox/Runtime/r0drv/solaris/modulestub-r0drv-solaris.c
+++ b/src/VBox/Runtime/r0drv/solaris/modulestub-r0drv-solaris.c
@@ -1,4 +1,28 @@
-
+/* $Id: modulestub-r0drv-solaris.c $ */
+/** @file
+ * IPRT - Ring-0 Solaris stubs
+ */
+
+/*
+ * Copyright (C) 2011-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
/*******************************************************************************
diff --git a/src/VBox/Runtime/r3/posix/env-posix.cpp b/src/VBox/Runtime/r3/posix/env-posix.cpp
index cd4fdb1..677b391 100644
--- a/src/VBox/Runtime/r3/posix/env-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/env-posix.cpp
@@ -48,6 +48,7 @@
RTDECL(bool) RTEnvExistsBad(const char *pszVar)
{
+ AssertReturn(strchr(pszVar, '=') == NULL, false);
return RTEnvGetBad(pszVar) != NULL;
}
@@ -60,6 +61,8 @@ RTDECL(bool) RTEnvExist(const char *pszVar)
RTDECL(const char *) RTEnvGetBad(const char *pszVar)
{
+ AssertReturn(strchr(pszVar, '=') == NULL, NULL);
+
IPRT_ALIGNMENT_CHECKS_DISABLE(); /* glibc causes trouble */
const char *pszValue = getenv(pszVar);
IPRT_ALIGNMENT_CHECKS_ENABLE();
@@ -90,6 +93,8 @@ RTDECL(int) RTEnvPut(const char *pszVarEqualValue)
RTDECL(int) RTEnvSetBad(const char *pszVar, const char *pszValue)
{
+ AssertMsgReturn(strchr(pszVar, '=') == NULL, ("'%s'\n", pszVar), VERR_ENV_INVALID_VAR_NAME);
+
#if defined(_MSC_VER)
/* make a local copy and feed it to putenv. */
const size_t cchVar = strlen(pszVar);
@@ -124,7 +129,7 @@ RTDECL(int) RTEnvSet(const char *pszVar, const char *pszValue)
RTDECL(int) RTEnvUnsetBad(const char *pszVar)
{
- AssertReturn(!strchr(pszVar, '='), VERR_INVALID_PARAMETER);
+ AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);
/*
* Check that it exists first.
diff --git a/src/VBox/Runtime/r3/posix/process-creation-posix.cpp b/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
index 1ae6d4b..7d701ef 100644
--- a/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/process-creation-posix.cpp
@@ -303,7 +303,7 @@ RTR3DECL(int) RTProcCreateEx(const char *pszExec, const char * const *papszArg
*/
AssertPtrReturn(pszExec, VERR_INVALID_POINTER);
AssertReturn(*pszExec, VERR_INVALID_PARAMETER);
- AssertReturn(!(fFlags & ~(RTPROC_FLAGS_DETACHED | RTPROC_FLAGS_HIDDEN | RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_SAME_CONTRACT | RTPROC_FLAGS_NO_PROFILE | RTPROC_FLAGS_SEARCH_PATH)), VERR_INVALID_PARAMETER);
+ AssertReturn(!(fFlags & ~RTPROC_FLAGS_VALID_MASK), VERR_INVALID_PARAMETER);
AssertReturn(!(fFlags & RTPROC_FLAGS_DETACHED) || !phProcess, VERR_INVALID_PARAMETER);
AssertReturn(hEnv != NIL_RTENV, VERR_INVALID_PARAMETER);
const char * const *papszEnv = RTEnvGetExecEnvP(hEnv);
diff --git a/src/VBox/Runtime/r3/posix/process-posix.cpp b/src/VBox/Runtime/r3/posix/process-posix.cpp
index 553808f..4c2b51e 100644
--- a/src/VBox/Runtime/r3/posix/process-posix.cpp
+++ b/src/VBox/Runtime/r3/posix/process-posix.cpp
@@ -188,6 +188,7 @@ RTR3DECL(int) RTProcQueryUsername(RTPROCESS hProcess, char *pszUser, size_t cbUs
rc = VERR_BUFFER_OVERFLOW;
else
{
+/** @todo this needs to be UTF-8 checked or converted... */
memcpy(pszUser, pPwd->pw_name, cbPwdUser);
rc = VINF_SUCCESS;
}
diff --git a/src/VBox/Runtime/r3/win/env-win.cpp b/src/VBox/Runtime/r3/win/env-win.cpp
index 030c6cd..d9f1198 100644
--- a/src/VBox/Runtime/r3/win/env-win.cpp
+++ b/src/VBox/Runtime/r3/win/env-win.cpp
@@ -53,6 +53,8 @@ RTDECL(bool) RTEnvExist(const char *pszVar)
RTDECL(bool) RTEnvExistsUtf8(const char *pszVar)
{
+ AssertReturn(strchr(pszVar, '=') == NULL, false);
+
PRTUTF16 pwszVar;
int rc = RTStrToUtf16(pszVar, &pwszVar);
AssertRCReturn(rc, false);
@@ -64,6 +66,7 @@ RTDECL(bool) RTEnvExistsUtf8(const char *pszVar)
RTDECL(const char *) RTEnvGetBad(const char *pszVar)
{
+ AssertReturn(strchr(pszVar, '=') == NULL, NULL);
return getenv(pszVar);
}
@@ -80,13 +83,14 @@ RTDECL(int) RTEnvGetUtf8(const char *pszVar, char *pszValue, size_t cbValue, siz
AssertReturn(pszValue || !cbValue, VERR_INVALID_PARAMETER);
AssertPtrNullReturn(pcchActual, VERR_INVALID_POINTER);
AssertReturn(pcchActual || (pszValue && cbValue), VERR_INVALID_PARAMETER);
+ AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);
if (pcchActual)
*pcchActual = 0;
PRTUTF16 pwszVar;
int rc = RTStrToUtf16(pszVar, &pwszVar);
- AssertRCReturn(rc, false);
+ AssertRCReturn(rc, rc);
/** @todo Consider _wgetenv_s or GetEnvironmentVariableW here to avoid the
* potential race with a concurrent _wputenv/_putenv. */
@@ -139,6 +143,8 @@ RTDECL(int) RTEnvPutUtf8(const char *pszVarEqualValue)
RTDECL(int) RTEnvSetBad(const char *pszVar, const char *pszValue)
{
+ AssertMsgReturn(strchr(pszVar, '=') == NULL, ("'%s'\n", pszVar), VERR_ENV_INVALID_VAR_NAME);
+
/* make a local copy and feed it to putenv. */
const size_t cchVar = strlen(pszVar);
const size_t cchValue = strlen(pszValue);
@@ -166,6 +172,8 @@ RTDECL(int) RTEnvSet(const char *pszVar, const char *pszValue)
RTDECL(int) RTEnvSetUtf8(const char *pszVar, const char *pszValue)
{
+ AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);
+
size_t cwcVar;
int rc = RTStrCalcUtf16LenEx(pszVar, RTSTR_MAX, &cwcVar);
if (RT_SUCCESS(rc))
@@ -203,7 +211,7 @@ RTDECL(int) RTEnvSetUtf8(const char *pszVar, const char *pszValue)
RTDECL(int) RTEnvUnsetBad(const char *pszVar)
{
- AssertReturn(!strchr(pszVar, '='), VERR_INVALID_PARAMETER);
+ AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);
/*
* Check that it exists first.
@@ -243,6 +251,8 @@ RTDECL(int) RTEnvUnset(const char *pszVar)
RTDECL(int) RTEnvUnsetUtf8(const char *pszVar)
{
+ AssertReturn(strchr(pszVar, '=') == NULL, VERR_ENV_INVALID_VAR_NAME);
+
size_t cwcVar;
int rc = RTStrCalcUtf16LenEx(pszVar, RTSTR_MAX, &cwcVar);
if (RT_SUCCESS(rc))
diff --git a/src/VBox/Runtime/r3/win/fileio-win.cpp b/src/VBox/Runtime/r3/win/fileio-win.cpp
index f335cd8..397d26a 100644
--- a/src/VBox/Runtime/r3/win/fileio-win.cpp
+++ b/src/VBox/Runtime/r3/win/fileio-win.cpp
@@ -709,6 +709,9 @@ RTR3DECL(bool) RTFileIsValid(RTFILE hFile)
if (GetLastError() == NO_ERROR)
return true;
break;
+
+ default:
+ break;
}
}
return false;
@@ -826,8 +829,10 @@ RTR3DECL(int) RTFileQueryInfo(RTFILE hFile, PRTFSOBJINFO pObjInfo, RTFSOBJATTRAD
DWORD dwErr = GetLastError();
/* Only return if we *really* don't have a valid handle value,
* everything else is fine here ... */
- if (dwErr != ERROR_INVALID_HANDLE)
+ if (dwErr == ERROR_INVALID_HANDLE)
return RTErrConvertFromWin32(dwErr);
+ RT_ZERO(Data);
+ Data.dwFileAttributes = RTFS_DOS_NT_DEVICE;
}
/*
diff --git a/src/VBox/Runtime/r3/win/internal-r3-win.h b/src/VBox/Runtime/r3/win/internal-r3-win.h
index cc73b58..cefaf3a 100644
--- a/src/VBox/Runtime/r3/win/internal-r3-win.h
+++ b/src/VBox/Runtime/r3/win/internal-r3-win.h
@@ -1,3 +1,29 @@
+/* $Id: internal-r3-win.h $ */
+/** @file
+ * IPRT - some Windows OS type constants.
+ */
+
+/*
+ * Copyright (C) 2013-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
#ifndef ___internal_r3_win_h
#define ___internal_r3_win_h
diff --git a/src/VBox/Runtime/r3/win/localipc-win.cpp b/src/VBox/Runtime/r3/win/localipc-win.cpp
index a25b9ca..0a12dbb 100644
--- a/src/VBox/Runtime/r3/win/localipc-win.cpp
+++ b/src/VBox/Runtime/r3/win/localipc-win.cpp
@@ -346,10 +346,13 @@ RTDECL(int) RTLocalIpcServerCreate(PRTLOCALIPCSERVER phServer, const char *pszNa
/*
* Allocate and initialize the instance data.
+ *
+ * We align the size on pointer size here to make sure we get naturally
+ * aligned members in the critsect when the electric fence heap is active.
*/
size_t cchName = strlen(pszName);
- size_t cch = RT_OFFSETOF(RTLOCALIPCSERVERINT, szName[cchName + sizeof(RTLOCALIPC_WIN_PREFIX)]);
- PRTLOCALIPCSERVERINT pThis = (PRTLOCALIPCSERVERINT)RTMemAlloc(cch);
+ size_t cbThis = RT_OFFSETOF(RTLOCALIPCSERVERINT, szName[cchName + sizeof(RTLOCALIPC_WIN_PREFIX)]);
+ PRTLOCALIPCSERVERINT pThis = (PRTLOCALIPCSERVERINT)RTMemAllocVar(cbThis);
if (!pThis)
return VERR_NO_MEMORY;
pThis->u32Magic = RTLOCALIPCSERVER_MAGIC;
diff --git a/src/VBox/Runtime/r3/win/process-win.cpp b/src/VBox/Runtime/r3/win/process-win.cpp
index f4c14ee..ff31df8 100644
--- a/src/VBox/Runtime/r3/win/process-win.cpp
+++ b/src/VBox/Runtime/r3/win/process-win.cpp
@@ -1083,9 +1083,7 @@ RTR3DECL(int) RTProcCreateEx(const char *pszExec, const char * const *papszArg
*/
AssertPtrReturn(pszExec, VERR_INVALID_POINTER);
AssertReturn(*pszExec, VERR_INVALID_PARAMETER);
- AssertReturn(!(fFlags & ~(RTPROC_FLAGS_DETACHED | RTPROC_FLAGS_HIDDEN | RTPROC_FLAGS_SERVICE | RTPROC_FLAGS_SAME_CONTRACT
- | RTPROC_FLAGS_NO_PROFILE | RTPROC_FLAGS_NO_WINDOW | RTPROC_FLAGS_SEARCH_PATH)),
- VERR_INVALID_PARAMETER);
+ AssertReturn(!(fFlags & ~RTPROC_FLAGS_VALID_MASK), VERR_INVALID_PARAMETER);
AssertReturn(!(fFlags & RTPROC_FLAGS_DETACHED) || !phProcess, VERR_INVALID_PARAMETER);
AssertReturn(hEnv != NIL_RTENV, VERR_INVALID_PARAMETER);
AssertPtrReturn(papszArgs, VERR_INVALID_PARAMETER);
@@ -1217,7 +1215,9 @@ RTR3DECL(int) RTProcCreateEx(const char *pszExec, const char * const *papszArg
if (RT_SUCCESS(rc))
{
PRTUTF16 pwszCmdLine;
- rc = RTGetOptArgvToUtf16String(&pwszCmdLine, papszArgs, RTGETOPTARGV_CNV_QUOTE_MS_CRT);
+ rc = RTGetOptArgvToUtf16String(&pwszCmdLine, papszArgs,
+ !(fFlags & RTPROC_FLAGS_UNQUOTED_ARGS)
+ ? RTGETOPTARGV_CNV_QUOTE_MS_CRT : RTGETOPTARGV_CNV_UNQUOTED);
if (RT_SUCCESS(rc))
{
PRTUTF16 pwszExec;
diff --git a/src/VBox/Runtime/testcase/tstDarwinSched.cpp b/src/VBox/Runtime/testcase/tstDarwinSched.cpp
index e6accf6..523a6f6 100644
--- a/src/VBox/Runtime/testcase/tstDarwinSched.cpp
+++ b/src/VBox/Runtime/testcase/tstDarwinSched.cpp
@@ -1,3 +1,29 @@
+/* $Id: tstDarwinSched.cpp $ */
+/** @file
+ * IPRT testcase - darwin scheduling.
+ */
+
+/*
+ * Copyright (C) 2009-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
/*******************************************************************************
* Header Files *
diff --git a/src/VBox/Runtime/testcase/tstLdr-3.cpp b/src/VBox/Runtime/testcase/tstLdr-3.cpp
index 90856bf..02a9c84 100644
--- a/src/VBox/Runtime/testcase/tstLdr-3.cpp
+++ b/src/VBox/Runtime/testcase/tstLdr-3.cpp
@@ -174,6 +174,11 @@ static bool MyDisBlock(DISCPUMODE enmCpuMode, RTHCUINTPTR pvCodeBlock, int32_t c
if (RT_FAILURE(rc))
return false;
+ TESTNEARSYM NearSym;
+ rc = FindNearSymbol(uNearAddr + i, &NearSym);
+ if (RT_SUCCESS(rc) && NearSym.aSyms[0].Value == NearSym.Addr)
+ RTPrintf("%s:\n", NearSym.aSyms[0].szName);
+
DISFormatYasmEx(&Cpu, szOutput, sizeof(szOutput),
DIS_FMT_FLAGS_RELATIVE_BRANCH | DIS_FMT_FLAGS_BYTES_RIGHT | DIS_FMT_FLAGS_ADDR_LEFT | DIS_FMT_FLAGS_BYTES_SPACED,
MyGetSymbol, NULL);
diff --git a/src/VBox/Runtime/testcase/tstRTGetOptArgv.cpp b/src/VBox/Runtime/testcase/tstRTGetOptArgv.cpp
index 27c0676..687e05a 100644
--- a/src/VBox/Runtime/testcase/tstRTGetOptArgv.cpp
+++ b/src/VBox/Runtime/testcase/tstRTGetOptArgv.cpp
@@ -32,10 +32,396 @@
#include <iprt/err.h>
#include <iprt/param.h>
#include <iprt/getopt.h>
+#include <iprt/ldr.h>
#include <iprt/string.h>
#include <iprt/test.h>
+/*******************************************************************************
+* Global Variables *
+*******************************************************************************/
+static const struct
+{
+ /** The input string, bourne shell. */
+ const char *pszInBourne;
+ /** The input string, MS CRT. */
+ const char *pszInMsCrt;
+ /** Separators, NULL if default. */
+ const char *pszSeparators;
+ /** The number of arguments. */
+ int cArgs;
+ /** Expected argument vector. */
+ const char *apszArgs[16];
+ /** Expected quoted string, bourne shell. */
+ const char *pszOutBourneSh;
+ /** Expected quoted string, MS CRT. */
+ const char *pszOutMsCrt;
+} g_aTests[] =
+{
+ {
+ "0 1 \"\"2'' '3' 4 5 '''''6' 7 8 9 10 11",
+ "0 1 \"\"2 3 4 5 \"6\" 7 8 \"\"\"\"\"\"9\"\"\"\" 10 11",
+ NULL,
+ 12,
+ {
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ "6",
+ "7",
+ "8",
+ "9",
+ "10",
+ "11",
+ NULL, NULL, NULL, NULL,
+ },
+ "0 1 2 3 4 5 6 7 8 9 10 11",
+ "0 1 2 3 4 5 6 7 8 9 10 11"
+ },
+ {
+ "\t\" asdf \" '\"'xyz \"\t\" '\n' '\"' \"'\"\n\r ",
+ "\t\" asdf \" \\\"xyz \"\t\" \"\n\" \"\\\"\" '\n\r ",
+ NULL,
+ 6,
+ {
+ " asdf ",
+ "\"xyz",
+ "\t",
+ "\n",
+ "\"",
+ "\'",
+ NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ },
+ "' asdf ' '\"xyz' '\t' '\n' '\"' ''\"'\"''",
+ "\" asdf \" \"\\\"xyz\" \"\t\" \"\n\" \"\\\"\" '"
+ },
+ {
+ ":0::1::::2:3:4:5:",
+ ":0::1::::2:3:4:5:",
+ ":",
+ 6,
+ {
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ },
+ "0 1 2 3 4 5",
+ "0 1 2 3 4 5"
+ },
+ {
+ "0:1;2:3;4:5",
+ "0:1;2:3;4:5",
+ ";;;;;;;;;;;;;;;;;;;;;;:",
+ 6,
+ {
+ "0",
+ "1",
+ "2",
+ "3",
+ "4",
+ "5",
+ NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ },
+ "0 1 2 3 4 5",
+ "0 1 2 3 4 5"
+ },
+ {
+ "abcd 'a ' ' b' ' c '",
+ "abcd \"a \" \" b\" \" c \"",
+ NULL,
+ 4,
+ {
+ "abcd",
+ "a ",
+ " b",
+ " c ",
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ },
+ "abcd 'a ' ' b' ' c '",
+ "abcd \"a \" \" b\" \" c \""
+ },
+ {
+ "'a\n\\b' 'de'\"'\"'fg' h ''\"'\"''",
+ "\"a\n\\b\" de'fg h \"'\" ",
+ NULL,
+ 4,
+ {
+ "a\n\\b",
+ "de'fg",
+ "h",
+ "'",
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ },
+ "'a\n\\b' 'de'\"'\"'fg' h ''\"'\"''",
+ "\"a\n\\b\" de'fg h '"
+ },
+ {
+ "arg1 \"arg2=\\\"zyx\\\"\" 'arg3=\\\\\\'",
+ "arg1 arg2=\\\"zyx\\\" arg3=\\\\\\",
+ NULL,
+ 3,
+ {
+ "arg1",
+ "arg2=\"zyx\"",
+ "arg3=\\\\\\",
+ NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ },
+ "arg1 'arg2=\"zyx\"' 'arg3=\\\\\\'",
+ "arg1 \"arg2=\\\"zyx\\\"\" arg3=\\\\\\"
+ },
+ {
+ " a\\\\\\\\b d\"e f\"g h ij\t",
+ " a\\\\b d\"e f\"g h ij\t",
+ NULL,
+ 4,
+ {
+ "a\\\\b",
+ "de fg",
+ "h",
+ "ij",
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ },
+ "'a\\\\b' 'de fg' h ij",
+ "a\\\\b \"de fg\" h ij",
+ }
+};
+
+
+
+static void tstCheckNativeMsCrtToArgv(const char *pszCmdLine, int cExpectedArgs, const char * const *papszExpectedArgs)
+{
+#ifdef RT_OS_WINDOWS
+ /*
+ * Resolve APIs.
+ */
+ static void *(__stdcall * s_pfnLocalFree)(void *pvFree);
+ static PRTUTF16 *(__stdcall * s_pfnCommandLineToArgvW)(PCRTUTF16 pwszCmdLine, int *pcArgs);
+ if (!s_pfnCommandLineToArgvW)
+ {
+ *(void **)&s_pfnLocalFree = RTLdrGetSystemSymbol("kernel32.dll", "LocalFree");
+ RTTESTI_CHECK_RETV(s_pfnLocalFree != NULL);
+ *(void **)&s_pfnCommandLineToArgvW = RTLdrGetSystemSymbol("shell32.dll", "CommandLineToArgvW");
+ RTTESTI_CHECK_RETV(s_pfnCommandLineToArgvW != NULL);
+ }
+
+ /*
+ * Calc expected arguments if needed.
+ */
+ if (cExpectedArgs == -1)
+ for (cExpectedArgs = 0; papszExpectedArgs[cExpectedArgs]; cExpectedArgs++)
+ { /* nothing */ }
+
+ /*
+ * Convert input command line to UTF-16 and call native API.
+ */
+ RTUTF16 wszCmdLine[1024];
+ PRTUTF16 pwszCmdLine = &wszCmdLine[1];
+ RTTESTI_CHECK_RC_RETV(RTStrToUtf16Ex(pszCmdLine, RTSTR_MAX, &pwszCmdLine, 1023, NULL), VINF_SUCCESS);
+ wszCmdLine[0] = ' ';
+
+ int cArgs = -2;
+ PRTUTF16 *papwszArgs = s_pfnCommandLineToArgvW(wszCmdLine, &cArgs);
+
+ /*
+ * Check the result.
+ */
+ if (cArgs - 1 != cExpectedArgs)
+ RTTestIFailed("Native returns cArgs=%d, expected %d (cmdline=|%s|)", cArgs - 1, cExpectedArgs, pszCmdLine);
+ int cArgsCheck = RT_MIN(cArgs - 1, cExpectedArgs);
+ for (int i = 0; i < cArgsCheck; i++)
+ {
+ char *pszArg = NULL;
+ RTTESTI_CHECK_RC_RETV(RTUtf16ToUtf8(papwszArgs[i + 1], &pszArg), VINF_SUCCESS);
+ if (strcmp(pszArg, papszExpectedArgs[i]))
+ RTTestIFailed("Native returns argv[%i]='%s', expected '%s' (cmdline=|%s|)",
+ i, pszArg, papszExpectedArgs[i], pszCmdLine);
+ RTStrFree(pszArg);
+ }
+
+ if (papwszArgs)
+ s_pfnLocalFree(papwszArgs);
+#else
+ NOREF(pszCmdLine);
+ NOREF(cExpectedArgs);
+ NOREF(papszExpectedArgs);
+#endif
+}
+
+
+static void tst4(void)
+{
+ /*
+ * Microsoft CRT round-tripping.
+ */
+ RTTestISub("Round-trips / MS_CRT");
+ for (unsigned i = 0; i < RT_ELEMENTS(g_aTests); i++)
+ {
+ /* First */
+ char **papszArgs1 = NULL;
+ int cArgs1 = -1;
+ int rc = RTGetOptArgvFromString(&papszArgs1, &cArgs1, g_aTests[i].pszInMsCrt,
+ RTGETOPTARGV_CNV_QUOTE_MS_CRT, g_aTests[i].pszSeparators);
+ if (rc == VINF_SUCCESS)
+ {
+ if (cArgs1 != g_aTests[i].cArgs)
+ RTTestIFailed("g_aTests[%i]: #1=%d, expected %d", i, cArgs1, g_aTests[i].cArgs);
+ for (int iArg = 0; iArg < cArgs1; iArg++)
+ if (strcmp(papszArgs1[iArg], g_aTests[i].apszArgs[iArg]) != 0)
+ RTTestIFailed("g_aTests[%i]/1: argv[%i] differs: got '%s', expected '%s' (RTGetOptArgvFromString(,,'%s', '%s'))",
+ i, iArg, papszArgs1[iArg], g_aTests[i].apszArgs[iArg],
+ g_aTests[i].pszInMsCrt, g_aTests[i].pszSeparators);
+ RTTESTI_CHECK_RETV(papszArgs1[cArgs1] == NULL);
+ tstCheckNativeMsCrtToArgv(g_aTests[i].pszInMsCrt, g_aTests[i].cArgs, g_aTests[i].apszArgs);
+
+ /* Second */
+ char *pszArgs2 = NULL;
+ rc = RTGetOptArgvToString(&pszArgs2, papszArgs1, RTGETOPTARGV_CNV_QUOTE_MS_CRT);
+ if (rc == VINF_SUCCESS)
+ {
+ if (strcmp(pszArgs2, g_aTests[i].pszOutMsCrt))
+ RTTestIFailed("g_aTests[%i]/2: '%s', expected '%s'", i, pszArgs2, g_aTests[i].pszOutMsCrt);
+
+ /*
+ * Third
+ */
+ char **papszArgs3 = NULL;
+ int cArgs3 = -1;
+ rc = RTGetOptArgvFromString(&papszArgs3, &cArgs3, pszArgs2, RTGETOPTARGV_CNV_QUOTE_MS_CRT, NULL);
+ if (rc == VINF_SUCCESS)
+ {
+ if (cArgs3 != g_aTests[i].cArgs)
+ RTTestIFailed("g_aTests[%i]/3: %d, expected %d", i, cArgs3, g_aTests[i].cArgs);
+ for (int iArg = 0; iArg < cArgs3; iArg++)
+ if (strcmp(papszArgs3[iArg], g_aTests[i].apszArgs[iArg]) != 0)
+ RTTestIFailed("g_aTests[%i]/3: argv[%i] differs: got '%s', expected '%s' (RTGetOptArgvFromString(,,'%s',))",
+ i, iArg, papszArgs3[iArg], g_aTests[i].apszArgs[iArg], pszArgs2);
+ RTTESTI_CHECK_RETV(papszArgs3[cArgs3] == NULL);
+ tstCheckNativeMsCrtToArgv(pszArgs2, g_aTests[i].cArgs, g_aTests[i].apszArgs);
+
+ /*
+ * Fourth
+ */
+ char *pszArgs4 = NULL;
+ rc = RTGetOptArgvToString(&pszArgs4, papszArgs3, RTGETOPTARGV_CNV_QUOTE_MS_CRT);
+ if (rc == VINF_SUCCESS)
+ {
+ if (strcmp(pszArgs4, pszArgs2))
+ RTTestIFailed("g_aTests[%i]/4: '%s' does not match #4='%s'", i, pszArgs2, pszArgs4);
+ RTStrFree(pszArgs4);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]/4: RTGetOptArgvToString() -> %Rrc", i, rc);
+ RTGetOptArgvFree(papszArgs3);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]/3: RTGetOptArgvFromString() -> %Rrc", i, rc);
+ RTStrFree(pszArgs2);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]/2: RTGetOptArgvToString() -> %Rrc", i, rc);
+ RTGetOptArgvFree(papszArgs1);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]/1: RTGetOptArgvFromString(,,'%s', '%s') -> %Rrc",
+ i, g_aTests[i].pszInMsCrt, g_aTests[i].pszSeparators, rc);
+ }
+
+}
+
+
+
+static void tst3(void)
+{
+ /*
+ * Bourne shell round-tripping.
+ */
+ RTTestISub("Round-trips / BOURNE_SH");
+ for (unsigned i = 0; i < RT_ELEMENTS(g_aTests); i++)
+ {
+ /* First */
+ char **papszArgs1 = NULL;
+ int cArgs1 = -1;
+ int rc = RTGetOptArgvFromString(&papszArgs1, &cArgs1, g_aTests[i].pszInBourne,
+ RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, g_aTests[i].pszSeparators);
+ if (rc == VINF_SUCCESS)
+ {
+ if (cArgs1 != g_aTests[i].cArgs)
+ RTTestIFailed("g_aTests[%i]: #1=%d, expected %d", i, cArgs1, g_aTests[i].cArgs);
+ for (int iArg = 0; iArg < cArgs1; iArg++)
+ if (strcmp(papszArgs1[iArg], g_aTests[i].apszArgs[iArg]) != 0)
+ RTTestIFailed("g_aTests[%i]/1: argv[%i] differs: got '%s', expected '%s' (RTGetOptArgvFromString(,,'%s', '%s'))",
+ i, iArg, papszArgs1[iArg], g_aTests[i].apszArgs[iArg],
+ g_aTests[i].pszInBourne, g_aTests[i].pszSeparators);
+ RTTESTI_CHECK_RETV(papszArgs1[cArgs1] == NULL);
+
+ /* Second */
+ char *pszArgs2 = NULL;
+ rc = RTGetOptArgvToString(&pszArgs2, papszArgs1, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH);
+ if (rc == VINF_SUCCESS)
+ {
+ if (strcmp(pszArgs2, g_aTests[i].pszOutBourneSh))
+ RTTestIFailed("g_aTests[%i]/2: '%s', expected '%s'", i, pszArgs2, g_aTests[i].pszOutBourneSh);
+
+ /*
+ * Third
+ */
+ char **papszArgs3 = NULL;
+ int cArgs3 = -1;
+ rc = RTGetOptArgvFromString(&papszArgs3, &cArgs3, pszArgs2, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, NULL);
+ if (rc == VINF_SUCCESS)
+ {
+ if (cArgs3 != g_aTests[i].cArgs)
+ RTTestIFailed("g_aTests[%i]/3: %d, expected %d", i, cArgs3, g_aTests[i].cArgs);
+ for (int iArg = 0; iArg < cArgs3; iArg++)
+ if (strcmp(papszArgs3[iArg], g_aTests[i].apszArgs[iArg]) != 0)
+ RTTestIFailed("g_aTests[%i]/3: argv[%i] differs: got '%s', expected '%s' (RTGetOptArgvFromString(,,'%s',))",
+ i, iArg, papszArgs3[iArg], g_aTests[i].apszArgs[iArg], pszArgs2);
+ RTTESTI_CHECK_RETV(papszArgs3[cArgs3] == NULL);
+
+ /*
+ * Fourth
+ */
+ char *pszArgs4 = NULL;
+ rc = RTGetOptArgvToString(&pszArgs4, papszArgs3, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH);
+ if (rc == VINF_SUCCESS)
+ {
+ if (strcmp(pszArgs4, pszArgs2))
+ RTTestIFailed("g_aTests[%i]/4: '%s' does not match #4='%s'", i, pszArgs2, pszArgs4);
+ RTStrFree(pszArgs4);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]/4: RTGetOptArgvToString() -> %Rrc", i, rc);
+ RTGetOptArgvFree(papszArgs3);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]/3: RTGetOptArgvFromString() -> %Rrc", i, rc);
+ RTStrFree(pszArgs2);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]/2: RTGetOptArgvToString() -> %Rrc", i, rc);
+ RTGetOptArgvFree(papszArgs1);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]/1: RTGetOptArgvFromString(,,'%s', '%s') -> %Rrc",
+ i, g_aTests[i].pszInBourne, g_aTests[i].pszSeparators, rc);
+ }
+}
+
+
static void tst2(void)
{
RTTestISub("RTGetOptArgvToString / MS_CRT");
@@ -69,7 +455,9 @@ static void tst2(void)
char *pszCmdLine = NULL;
int rc = RTGetOptArgvToString(&pszCmdLine, s_aMscCrtTests[i].apszArgs, RTGETOPTARGV_CNV_QUOTE_MS_CRT);
RTTESTI_CHECK_RC_RETV(rc, VINF_SUCCESS);
- if (strcmp(s_aMscCrtTests[i].pszCmdLine, pszCmdLine))
+ if (!strcmp(s_aMscCrtTests[i].pszCmdLine, pszCmdLine))
+ tstCheckNativeMsCrtToArgv(pszCmdLine, -1, s_aMscCrtTests[i].apszArgs);
+ else
RTTestIFailed("g_aTest[%i] failed:\n"
" got '%s'\n"
" expected '%s'\n",
@@ -77,68 +465,35 @@ static void tst2(void)
RTStrFree(pszCmdLine);
}
-
- RTTestISub("RTGetOptArgvToString / BOURNE_SH");
-
- static const struct
- {
- const char * const apszArgs[5];
- const char *pszCmdLine;
- } s_aBournShTests[] =
- {
- {
- { "abcd", "a ", " b", " c ", NULL },
- "abcd 'a ' ' b' ' c '"
- },
- {
- { "a\n\\b", "de'fg", "h", "'", NULL },
- "'a\n\\b' 'de'\"'\"'fg' h ''\"'\"''"
- }
- };
-
- for (size_t i = 0; i < RT_ELEMENTS(s_aBournShTests); i++)
+ for (size_t i = 0; i < RT_ELEMENTS(g_aTests); i++)
{
char *pszCmdLine = NULL;
- int rc = RTGetOptArgvToString(&pszCmdLine, s_aBournShTests[i].apszArgs, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH);
+ int rc = RTGetOptArgvToString(&pszCmdLine, g_aTests[i].apszArgs, RTGETOPTARGV_CNV_QUOTE_MS_CRT);
RTTESTI_CHECK_RC_RETV(rc, VINF_SUCCESS);
- if (strcmp(s_aBournShTests[i].pszCmdLine, pszCmdLine))
- RTTestIFailed("g_aTest[%i] failed:\n"
+ if (!strcmp(g_aTests[i].pszOutMsCrt, pszCmdLine))
+ tstCheckNativeMsCrtToArgv(pszCmdLine, g_aTests[i].cArgs, g_aTests[i].apszArgs);
+ else
+ RTTestIFailed("g_aTests[%i] failed:\n"
" got |%s|\n"
" expected |%s|\n",
- i, pszCmdLine, s_aBournShTests[i].pszCmdLine);
+ i, pszCmdLine, g_aTests[i].pszOutMsCrt);
RTStrFree(pszCmdLine);
}
- RTTestISub("RTGetOptArgvToString <-> RTGetOptArgvFromString");
- for (size_t i = 0; i < RT_ELEMENTS(s_aBournShTests); i++)
+ RTTestISub("RTGetOptArgvToString / BOURNE_SH");
+
+ for (size_t i = 0; i < RT_ELEMENTS(g_aTests); i++)
{
char *pszCmdLine = NULL;
- int rc = RTGetOptArgvToString(&pszCmdLine, s_aBournShTests[i].apszArgs, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH);
- RTTESTI_CHECK_RC_RETV(rc, VINF_SUCCESS);
-
- char **papszArgs;
- int cArgs;
- rc = RTGetOptArgvFromString(&papszArgs, &cArgs, pszCmdLine, NULL);
+ int rc = RTGetOptArgvToString(&pszCmdLine, g_aTests[i].apszArgs, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH);
RTTESTI_CHECK_RC_RETV(rc, VINF_SUCCESS);
-
- size_t j = 0;
- while (papszArgs[j] && s_aBournShTests[i].apszArgs[j])
- {
- if (strcmp(papszArgs[j], s_aBournShTests[i].apszArgs[j]))
- RTTestIFailed("Test #%u, argument #%u mismatch:\n"
- " FromString: |%s| (got)\n"
- " ToString: |%s| (expected)\n",
- i, j, papszArgs[j], s_aBournShTests[i].apszArgs[j]);
-
- /* next */
- j++;
- }
- RTTESTI_CHECK(papszArgs[j] == NULL);
- RTTESTI_CHECK(s_aBournShTests[i].apszArgs[j] == NULL);
-
- RTGetOptArgvFree(papszArgs);
+ if (strcmp(g_aTests[i].pszOutBourneSh, pszCmdLine))
+ RTTestIFailed("g_aTests[%i] failed:\n"
+ " got |%s|\n"
+ " expected |%s|\n",
+ i, pszCmdLine, g_aTests[i].pszOutBourneSh);
RTStrFree(pszCmdLine);
}
}
@@ -148,13 +503,14 @@ static void tst1(void)
RTTestISub("RTGetOptArgvFromString");
char **papszArgs = NULL;
int cArgs = -1;
- RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, "", NULL), VINF_SUCCESS);
+ RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, "", RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, NULL), VINF_SUCCESS);
RTTESTI_CHECK_RETV(cArgs == 0);
RTTESTI_CHECK_RETV(papszArgs);
RTTESTI_CHECK_RETV(!papszArgs[0]);
RTGetOptArgvFree(papszArgs);
- RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, "0 1 \"\"2'' '3' 4 5 '''''6' 7 8 9 10 11", NULL), VINF_SUCCESS);
+ RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, "0 1 \"\"2'' '3' 4 5 '''''6' 7 8 9 10 11",
+ RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, NULL), VINF_SUCCESS);
RTTESTI_CHECK_RETV(cArgs == 12);
RTTESTI_CHECK_RETV(!strcmp(papszArgs[0], "0"));
RTTESTI_CHECK_RETV(!strcmp(papszArgs[1], "1"));
@@ -171,7 +527,8 @@ static void tst1(void)
RTTESTI_CHECK_RETV(!papszArgs[12]);
RTGetOptArgvFree(papszArgs);
- RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, "\t\" asdf \" '\"'xyz \"\t\" '\n' '\"' \"'\"\n\r ", NULL), VINF_SUCCESS);
+ RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, "\t\" asdf \" '\"'xyz \"\t\" '\n' '\"' \"'\"\n\r ",
+ RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, NULL), VINF_SUCCESS);
RTTESTI_CHECK_RETV(cArgs == 6);
RTTESTI_CHECK_RETV(!strcmp(papszArgs[0], " asdf "));
RTTESTI_CHECK_RETV(!strcmp(papszArgs[1], "\"xyz"));
@@ -182,7 +539,8 @@ static void tst1(void)
RTTESTI_CHECK_RETV(!papszArgs[6]);
RTGetOptArgvFree(papszArgs);
- RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, ":0::1::::2:3:4:5:", ":"), VINF_SUCCESS);
+ RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, ":0::1::::2:3:4:5:",
+ RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, ":"), VINF_SUCCESS);
RTTESTI_CHECK_RETV(cArgs == 6);
RTTESTI_CHECK_RETV(!strcmp(papszArgs[0], "0"));
RTTESTI_CHECK_RETV(!strcmp(papszArgs[1], "1"));
@@ -193,7 +551,8 @@ static void tst1(void)
RTTESTI_CHECK_RETV(!papszArgs[6]);
RTGetOptArgvFree(papszArgs);
- RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, "0:1;2:3;4:5", ";;;;;;;;;;;;;;;;;;;;;;:"), VINF_SUCCESS);
+ RTTESTI_CHECK_RC_RETV(RTGetOptArgvFromString(&papszArgs, &cArgs, "0:1;2:3;4:5", RTGETOPTARGV_CNV_QUOTE_BOURNE_SH,
+ ";;;;;;;;;;;;;;;;;;;;;;:"), VINF_SUCCESS);
RTTESTI_CHECK_RETV(cArgs == 6);
RTTESTI_CHECK_RETV(!strcmp(papszArgs[0], "0"));
RTTESTI_CHECK_RETV(!strcmp(papszArgs[1], "1"));
@@ -203,8 +562,39 @@ static void tst1(void)
RTTESTI_CHECK_RETV(!strcmp(papszArgs[5], "5"));
RTTESTI_CHECK_RETV(!papszArgs[6]);
RTGetOptArgvFree(papszArgs);
+
+ /*
+ * Tests from the list.
+ */
+ for (unsigned i = 0; i < RT_ELEMENTS(g_aTests); i++)
+ {
+ papszArgs = NULL;
+ cArgs = -1;
+ int rc = RTGetOptArgvFromString(&papszArgs, &cArgs, g_aTests[i].pszInBourne, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH,
+ g_aTests[i].pszSeparators);
+ if (rc == VINF_SUCCESS)
+ {
+ if (cArgs == g_aTests[i].cArgs)
+ {
+ for (int iArg = 0; iArg < cArgs; iArg++)
+ if (strcmp(papszArgs[iArg], g_aTests[i].apszArgs[iArg]) != 0)
+ RTTestIFailed("g_aTests[%i]: argv[%i] differs: got '%s', expected '%s' (RTGetOptArgvFromString(,,'%s', '%s'))",
+ i, iArg, papszArgs[iArg], g_aTests[i].apszArgs[iArg],
+ g_aTests[i].pszInBourne, g_aTests[i].pszSeparators);
+ RTTESTI_CHECK_RETV(papszArgs[cArgs] == NULL);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]: cArgs=%u, expected %u for RTGetOptArgvFromString(,,'%s', '%s')",
+ i, cArgs, g_aTests[i].cArgs, g_aTests[i].pszInBourne, g_aTests[i].pszSeparators);
+ RTGetOptArgvFree(papszArgs);
+ }
+ else
+ RTTestIFailed("g_aTests[%i]: RTGetOptArgvFromString(,,'%s', '%s') -> %Rrc",
+ i, g_aTests[i].pszInBourne, g_aTests[i].pszSeparators, rc);
+ }
}
+
int main()
{
/*
@@ -221,6 +611,8 @@ int main()
*/
tst1();
tst2();
+ tst4();
+ tst3();
/*
* Summary.
diff --git a/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.S b/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.S
new file mode 100644
index 0000000..348cd5e
--- /dev/null
+++ b/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.S
@@ -0,0 +1,126 @@
+/*
+ * as -o tstRTLdrMachORelocs-1-as.o tstRTLdrMachORelocs-1.S
+ * ld -r -o tstRTLdrMachORelocs-1.o tstRTLdrMachORelocs-1-as.o
+ * tstLdr-3 0x2000 tstRTLdrMachORelocs-1.o 0x2000 > tmp.disas
+ * diff tmp.disas tstRTLdrMachORelocs-1.disas
+ */
+ .section __TEXT,__text,regular,pure_instructions
+ .globl _myfunc6
+ .align 4, 0x90
+_myfunc6:
+Leh_func_begin6:
+ .byte 0x90
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad Lg_LocalData
+ movb Lg_LocalData(%rip), %al
+ cmpb $0x7f, Lg_LocalData(%rip)
+ cmpw $0x117f, Lg_LocalData(%rip)
+ cmpl $0x9988117f, Lg_LocalData(%rip)
+ jmp Lg_LocalData
+
+ .byte 0x90
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad Leh_func_end6
+ movb Leh_func_end6(%rip), %al
+ cmpb $0x7e, Leh_func_end6(%rip)
+ cmpw $0x117e, Leh_func_end6(%rip)
+ cmpl $0x9988117e, Leh_func_end6(%rip)
+ jmp Leh_func_end6
+
+ .byte 0x90
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad _g_Data.3-3
+ movb _g_Data.3-3(%rip), %al
+ cmpb $4, _g_Data.3-3(%rip)
+ jmp _g_Data.3-3
+
+ .byte 0x90
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad _g_Data.3
+ movb _g_Data.3(%rip), %al
+ cmpb $5, _g_Data.3(%rip)
+ cmpw $1105, _g_Data.3(%rip)
+ cmpl $99881105, _g_Data.3(%rip)
+ jmp _g_Data.3
+
+ .byte 0x90
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad abssym
+ movb abssym(%rip), %al
+ cmpb $6, abssym(%rip)
+ cmpw $1106, abssym(%rip)
+ cmpl $99881106, abssym(%rip)
+ jmp abssym
+1193046 = 0x123456 (1193046)+00000000000000dd
+
+ .byte 0x90
+ cmpb $1, _g_Data.4.1(%rip)
+ cmpb $2, _g_Data.4.2(%rip)
+ cmpb $3, _g_Data.4.3(%rip)
+
+ /* X86_64_RELOC_SUBTRACTOR */
+ .byte 0x90
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad Leh_func_end6 - _g_Data.0
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad Leh_func_end6 - _g_Data.0 + 0x80
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad _myfunc6_end - _g_Data.0
+ .byte 0x48, 0xb8 /* movabsq */
+ .quad _myfunc6_end - _g_Data.0 + 0x80
+ .align 4, 0xcc
+_myfunc6_end:
+
+ .section __TEXT,__othertext,regular,pure_instructions
+ .align 3, 0xcc
+Leh_func_end6:
+ .byte 0x90
+ .byte 0x90
+ .byte 0xcc
+ .byte 0xcc
+ .byte 0x90
+ .byte 0x90
+ .byte 0xcc
+ .byte 0xcc
+
+ .section __DATA,__data,regular,pure_instructions
+ .align 3, 0xcc
+_g_Data.0:
+ .byte 0x90
+_g_Data.1:
+ .byte 0xcc
+_g_Data.2:
+ .byte 0x90
+_g_Data.3:
+ .byte 0xcc
+_g_Data.4.0:
+ .byte 0x90
+_g_Data.4.1:
+ .byte 0xcc
+_g_Data.4.2:
+ .byte 0x90
+_g_Data.4.3:
+ .byte 0xcc
+_g_EndOfData:
+
+ .section __GROG,__foobar,regular,pure_instructions
+ .align 3, 0xcc
+ .byte 0x90
+Lg_LocalDataMinus3:
+ .byte 0x90
+Lg_LocalDataMinus2:
+ .byte 0x90
+Lg_LocalDataMinus1:
+ .byte 0x90
+Lg_LocalData:
+ .byte 0xcc
+ .byte 0xcc
+ .byte 0xcc
+ .byte 0xcc
+ .byte 0xcc
+ .byte 0xcc
+
+.set abssym, 0x123456
+.globl abssym
+
+.subsections_via_symbols
diff --git a/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.disas b/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.disas
new file mode 100644
index 0000000..452c4bf
--- /dev/null
+++ b/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.disas
@@ -0,0 +1,206 @@
+tstLdr-3: Addr=0000000000002000
+0000000000002000 myfunc6 (10) - 0000000000002120 myfunc6_end (0)
+myfunc6:
+00002000 nop ; 90
+^^^^^^^^
+00002001 mov rax, 00000000000002134h ; 48 b8 34 21 00 00 00 00 00 00
+0000200b mov al, byte [+000000123h wrt rip (00000000000002134h = g_EndOfData+004h)] ; 8a 05 23 01 00 00
+00002011 cmp byte [+00000011ch wrt rip (00000000000002134h = g_EndOfData+004h)], 07fh ; 80 3d 1c 01 00 00 7f
+00002018 cmp word [+000000113h wrt rip (00000000000002134h = g_EndOfData+004h)], word 0117fh ; 66 81 3d 13 01 00 00 7f 11
+00002021 cmp dword [+000000109h wrt rip (00000000000002134h = g_EndOfData+004h)], 09988117fh ; 81 3d 09 01 00 00 7f 11 88 99
+0000202b jmp +000000104h (00000000000002134h = g_EndOfData+004h ) ; e9 04 01 00 00
+00002030 nop ; 90
+00002031 mov rax, 00000000000002120h ; 48 b8 20 21 00 00 00 00 00 00
+0000203b mov al, byte [+0000000dfh wrt rip (00000000000002120h = myfunc6_end)] ; 8a 05 df 00 00 00
+00002041 cmp byte [+0000000d8h wrt rip (00000000000002120h = myfunc6_end)], 07eh ; 80 3d d8 00 00 00 7e
+00002048 cmp word [+0000000cfh wrt rip (00000000000002120h = myfunc6_end)], word 0117eh ; 66 81 3d cf 00 00 00 7e 11
+00002051 cmp dword [+0000000c5h wrt rip (00000000000002120h = myfunc6_end)], 09988117eh ; 81 3d c5 00 00 00 7e 11 88 99
+0000205b jmp +0000000c0h (00000000000002120h = myfunc6_end ) ; e9 c0 00 00 00
+00002060 nop ; 90
+00002061 mov rax, 00000000000002128h ; 48 b8 28 21 00 00 00 00 00 00
+0000206b mov al, byte [+0000000b7h wrt rip (00000000000002128h = g_Data.0)] ; 8a 05 b7 00 00 00
+00002071 cmp byte [+0000000b0h wrt rip (00000000000002128h = g_Data.0)], 004h ; 80 3d b0 00 00 00 04
+00002078 jmp +0000000abh (00000000000002128h = g_Data.0 ) ; e9 ab 00 00 00
+0000207d nop ; 90
+0000207e mov rax, 0000000000000212bh ; 48 b8 2b 21 00 00 00 00 00 00
+00002088 mov al, byte [+00000009dh wrt rip (0000000000000212bh = g_Data.3)] ; 8a 05 9d 00 00 00
+0000208e cmp byte [+000000096h wrt rip (0000000000000212bh = g_Data.3)], 005h ; 80 3d 96 00 00 00 05
+00002095 cmp word [+00000008dh wrt rip (0000000000000212bh = g_Data.3)], word 00451h ; 66 81 3d 8d 00 00 00 51 04
+0000209e cmp dword [+000000083h wrt rip (0000000000000212bh = g_Data.3)], 005f41091h ; 81 3d 83 00 00 00 91 10 f4 05
+000020a8 jmp +00000007eh (0000000000000212bh = g_Data.3 ) ; e9 7e 00 00 00
+000020ad nop ; 90
+000020ae mov rax, 00000000000123456h ; 48 b8 56 34 12 00 00 00 00 00
+000020b8 mov al, byte [+0001234c3h wrt rip (00000000000125581h] ; 8a 05 c3 34 12 00
+000020be cmp byte [+0001234bch wrt rip (00000000000125581h], 005h ; 80 3d bc 34 12 00 05
+000020c5 cmp word [+0001234b3h wrt rip (00000000000125581h], word 00451h ; 66 81 3d b3 34 12 00 51 04
+000020ce cmp dword [+0001234a9h wrt rip (00000000000125581h], 005f41091h ; 81 3d a9 34 12 00 91 10 f4 05
+000020d8 jmp +0001234a4h (00000000000125581h) ; e9 a4 34 12 00
+000020dd nop ; 90
+000020de cmp byte [+000000048h wrt rip (0000000000000212dh = g_Data.4.1)], 001h ; 80 3d 48 00 00 00 01
+000020e5 cmp byte [+000000042h wrt rip (0000000000000212eh = g_Data.4.2)], 002h ; 80 3d 42 00 00 00 02
+000020ec cmp byte [+00000003ch wrt rip (0000000000000212fh = g_Data.4.3)], 003h ; 80 3d 3c 00 00 00 03
+000020f3 nop ; 90
+000020f4 mov rax, 0fffffffffffffff8h ; 48 b8 f8 ff ff ff ff ff ff ff
+000020fe mov rax, 00000000000000078h ; 48 b8 78 00 00 00 00 00 00 00
+00002108 mov rax, 0fffffffffffffff8h ; 48 b8 f8 ff ff ff ff ff ff ff
+00002112 mov rax, 00000000000000078h ; 48 b8 78 00 00 00 00 00 00 00
+0000211c int3 ; cc
+0000211d int3 ; cc
+0000211e int3 ; cc
+0000211f int3 ; cc
+myfunc6_end:
+00002120 nop ; 90
+00002121 nop ; 90
+00002122 int3 ; cc
+00002123 int3 ; cc
+00002124 nop ; 90
+00002125 nop ; 90
+00002126 int3 ; cc
+00002127 int3 ; cc
+g_Data.0:
+00002128 nop ; 90
+g_Data.1:
+00002129 int3 ; cc
+g_Data.2:
+0000212a nop ; 90
+g_Data.3:
+0000212b int3 ; cc
+g_Data.4.0:
+0000212c nop ; 90
+g_Data.4.1:
+0000212d int3 ; cc
+g_Data.4.2:
+0000212e nop ; 90
+g_Data.4.3:
+0000212f int3 ; cc
+g_EndOfData:
+00002130 nop ; 90
+00002131 nop ; 90
+00002132 nop ; 90
+00002133 nop ; 90
+00002134 int3 ; cc
+00002135 int3 ; cc
+00002136 int3 ; cc
+00002137 int3 ; cc
+00002138 int3 ; cc
+00002139 int3 ; cc
+0000213a add byte [rax], al ; 00 00
+0000213c add byte [rax], al ; 00 00
+0000213e add byte [rax], al ; 00 00
+00002140 and byte [rcx], ah ; 20 21
+00002142 add byte [rax], al ; 00 00
+00002144 add byte [rax], al ; 00 00
+00002146 add byte [rax], al ; 00 00
+00002148 sub byte [rcx], ah ; 28 21
+0000214a add byte [rax], al ; 00 00
+0000214c add byte [rax], al ; 00 00
+0000214e add byte [rax], al ; 00 00
+00002150 sub dword [rcx], esp ; 29 21
+00002152 add byte [rax], al ; 00 00
+00002154 add byte [rax], al ; 00 00
+00002156 add byte [rax], al ; 00 00
+00002158 sub ah, byte [rcx] ; 2a 21
+0000215a add byte [rax], al ; 00 00
+0000215c add byte [rax], al ; 00 00
+0000215e add byte [rax], al ; 00 00
+00002160 sub esp, dword [rcx] ; 2b 21
+00002162 add byte [rax], al ; 00 00
+00002164 add byte [rax], al ; 00 00
+00002166 add byte [rax], al ; 00 00
+00002168 sub AL, 021h ; 2c 21
+0000216a add byte [rax], al ; 00 00
+0000216c add byte [rax], al ; 00 00
+0000216e add byte [rax], al ; 00 00
+00002170 sub eax, 000000021h ; 2d 21 00 00 00
+00002175 add byte [rax], al ; 00 00
+00002177 add byte [rsi], ch ; 00 2e
+00002179 and dword [rax], eax ; 21 00
+0000217b add byte [rax], al ; 00 00
+0000217d add byte [rax], al ; 00 00
+0000217f add byte [rdi], ch ; 00 2f
+00002181 and dword [rax], eax ; 21 00
+00002183 add byte [rax], al ; 00 00
+00002185 add byte [rax], al ; 00 00
+00002187 add byte [rax], dh ; 00 30
+00002189 and dword [rax], eax ; 21 00
+0000218b add byte [rax], al ; 00 00
+0000218d add byte [rax], al ; 00 00
+0000218f add byte [rax], al ; 00 00
+00002191 and byte [rax], al ; 20 00
+00002193 add byte [rax], al ; 00 00
+00002195 add byte [rax], al ; 00 00
+00002197 add byte [rsi+034h], dl ; 00 56 34
+0000219a adc al, byte [rax] ; 12 00
+0000219c add byte [rax], al ; 00 00
+0000219e add byte [rax], al ; 00 00
+000021a0 add byte [rax], al ; 00 00
+000021a2 add byte [rax], al ; 00 00
+000021a4 add byte [rax], al ; 00 00
+000021a6 add byte [rax], al ; 00 00
+000021a8 add byte [rax], al ; 00 00
+000021aa add byte [rax], al ; 00 00
+000021ac add byte [rax], al ; 00 00
+000021ae add byte [rax], al ; 00 00
+000021b0 add byte [rax], al ; 00 00
+000021b2 add byte [rax], al ; 00 00
+000021b4 add byte [rax], al ; 00 00
+000021b6 add byte [rax], al ; 00 00
+000021b8 add byte [rax], al ; 00 00
+000021ba add byte [rax], al ; 00 00
+000021bc add byte [rax], al ; 00 00
+000021be add byte [rax], al ; 00 00
+000021c0 jmp qword [-000000086h wrt rip (00000000000002140h = g_EndOfData+010h)] ; ff 25 7a ff ff ff
+000021c6 int3 ; cc
+000021c7 int3 ; cc
+000021c8 jmp qword [-000000086h wrt rip (00000000000002148h = g_EndOfData+018h)] ; ff 25 7a ff ff ff
+000021ce int3 ; cc
+000021cf int3 ; cc
+000021d0 jmp qword [-000000086h wrt rip (00000000000002150h = g_EndOfData+020h)] ; ff 25 7a ff ff ff
+000021d6 int3 ; cc
+000021d7 int3 ; cc
+000021d8 jmp qword [-000000086h wrt rip (00000000000002158h = g_EndOfData+028h)] ; ff 25 7a ff ff ff
+000021de int3 ; cc
+000021df int3 ; cc
+000021e0 jmp qword [-000000086h wrt rip (00000000000002160h = g_EndOfData+030h)] ; ff 25 7a ff ff ff
+000021e6 int3 ; cc
+000021e7 int3 ; cc
+000021e8 jmp qword [-000000086h wrt rip (00000000000002168h = g_EndOfData+038h)] ; ff 25 7a ff ff ff
+000021ee int3 ; cc
+000021ef int3 ; cc
+000021f0 jmp qword [-000000086h wrt rip (00000000000002170h = g_EndOfData+040h)] ; ff 25 7a ff ff ff
+000021f6 int3 ; cc
+000021f7 int3 ; cc
+000021f8 jmp qword [-000000086h wrt rip (00000000000002178h = g_EndOfData+048h)] ; ff 25 7a ff ff ff
+000021fe int3 ; cc
+000021ff int3 ; cc
+00002200 jmp qword [-000000086h wrt rip (00000000000002180h = g_EndOfData+050h)] ; ff 25 7a ff ff ff
+00002206 int3 ; cc
+00002207 int3 ; cc
+00002208 jmp qword [-000000086h wrt rip (00000000000002188h = g_EndOfData+058h)] ; ff 25 7a ff ff ff
+0000220e int3 ; cc
+0000220f int3 ; cc
+00002210 jmp qword [-000000086h wrt rip (00000000000002190h = g_EndOfData+060h)] ; ff 25 7a ff ff ff
+00002216 int3 ; cc
+00002217 int3 ; cc
+00002218 jmp qword [-000000086h wrt rip (00000000000002198h = g_EndOfData+068h)] ; ff 25 7a ff ff ff
+0000221e int3 ; cc
+0000221f int3 ; cc
+00002220 add byte [rax], al ; 00 00
+00002222 add byte [rax], al ; 00 00
+00002224 add byte [rax], al ; 00 00
+00002226 add byte [rax], al ; 00 00
+00002228 add byte [rax], al ; 00 00
+0000222a add byte [rax], al ; 00 00
+0000222c add byte [rax], al ; 00 00
+0000222e add byte [rax], al ; 00 00
+00002230 add byte [rax], al ; 00 00
+00002232 add byte [rax], al ; 00 00
+00002234 add byte [rax], al ; 00 00
+00002236 add byte [rax], al ; 00 00
+00002238 add byte [rax], al ; 00 00
+0000223a add byte [rax], al ; 00 00
+0000223c add byte [rax], al ; 00 00
+0000223e add byte [rax], al ; 00 00
+00002240 add al, byte [rax] ; 02 00
+00002242 add byte [rax], al ; 00 00
+tstLdr-3: SUCCESS
diff --git a/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.o b/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.o
new file mode 100644
index 0000000..f0685b2
Binary files /dev/null and b/src/VBox/Runtime/testcase/tstRTLdrMachORelocs-1.o differ
diff --git a/src/VBox/Runtime/testcase/tstRTTcp-1.cpp b/src/VBox/Runtime/testcase/tstRTTcp-1.cpp
index 1ee7c15..fba5a89 100644
--- a/src/VBox/Runtime/testcase/tstRTTcp-1.cpp
+++ b/src/VBox/Runtime/testcase/tstRTTcp-1.cpp
@@ -1,3 +1,30 @@
+/* $Id: tstRTTcp-1.cpp $ */
+/** @file
+ * IPRT testcase - TCP.
+ */
+
+/*
+ * Copyright (C) 2010-2015 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ *
+ * The contents of this file may alternatively be used under the terms
+ * of the Common Development and Distribution License Version 1.0
+ * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
+ * VirtualBox OSE distribution, in which case the provisions of the
+ * CDDL are applicable instead of those of the GPL.
+ *
+ * You may elect to license modified versions of this file under the
+ * terms and conditions of either the GPL or the CDDL or both.
+ */
+
+
#include <iprt/tcp.h>
#include <iprt/string.h>
diff --git a/src/VBox/Storage/VD.cpp b/src/VBox/Storage/VD.cpp
index 12bd028..8b4d69f 100644
--- a/src/VBox/Storage/VD.cpp
+++ b/src/VBox/Storage/VD.cpp
@@ -8727,6 +8727,8 @@ VBOXDDU_DECL(int) VDPrepareWithFilters(PVBOXHDD pDisk, PVDINTERFACE pVDIfsOperat
{
/* Get size of image. */
uint64_t cbSize = pImage->Backend->pfnGetSize(pImage->pBackendData);
+ uint64_t cbSizeFile = pImage->Backend->pfnGetFileSize(pImage->pBackendData);
+ uint64_t cbFileWritten = 0;
uint64_t uOffset = 0;
uint64_t cbRemaining = cbSize;
@@ -8769,6 +8771,7 @@ VBOXDDU_DECL(int) VDPrepareWithFilters(PVBOXHDD pDisk, PVDINTERFACE pVDIfsOperat
if (RT_FAILURE(rc))
break;
Assert(cbThisWrite == cbThisRead);
+ cbFileWritten += cbThisWrite;
}
else
rc = VINF_SUCCESS;
@@ -8779,7 +8782,7 @@ VBOXDDU_DECL(int) VDPrepareWithFilters(PVBOXHDD pDisk, PVDINTERFACE pVDIfsOperat
if (pIfProgress && pIfProgress->pfnProgress)
{
rc2 = pIfProgress->pfnProgress(pIfProgress->Core.pvUser,
- uPercentStart + uOffset * uPercentSpan / cbSize);
+ uPercentStart + cbFileWritten * uPercentSpan / cbSizeFile);
AssertRC(rc2); /* Cancelling this operation without leaving an inconsistent state is not possible. */
}
} while (uOffset < cbSize);
diff --git a/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp b/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
index 8a9c219..eb27500 100644
--- a/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
+++ b/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
@@ -2140,6 +2140,63 @@ VMMDECL(int) CPUMRecalcHyperDRx(PVMCPU pVCpu, uint8_t iGstReg, bool fForceHyper)
/**
+ * Set the guest XCR0 register.
+ *
+ * Will load additional state if the FPU state is already loaded (in ring-0 &
+ * raw-mode context).
+ *
+ * @returns VINF_SUCCESS on success, VERR_CPUM_RAISE_GP_0 on invalid input
+ * value.
+ * @param pVCpu Pointer to the cross context VMCPU structure for the
+ * calling EMT.
+ * @param uNewValue The new value.
+ * @thread EMT(pVCpu)
+ */
+VMM_INT_DECL(int) CPUMSetGuestXcr0(PVMCPU pVCpu, uint64_t uNewValue)
+{
+ if ( (uNewValue & ~pVCpu->CTX_SUFF(pVM)->cpum.s.fXStateGuestMask) == 0
+ /* The X87 bit cannot be cleared. */
+ && (uNewValue & XSAVE_C_X87)
+ /* AVX requires SSE. */
+ && (uNewValue & (XSAVE_C_SSE | XSAVE_C_YMM)) != XSAVE_C_YMM
+ /* AVX-512 requires YMM, SSE and all of its three components to be enabled. */
+ && ( (uNewValue & (XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI)) == 0
+ || (uNewValue & (XSAVE_C_SSE | XSAVE_C_YMM | XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI))
+ == (XSAVE_C_SSE | XSAVE_C_YMM | XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI) )
+ )
+ {
+ pVCpu->cpum.s.Guest.aXcr[0] = uNewValue;
+
+ /* If more state components are enabled, we need to take care to load
+ them if the FPU/SSE state is already loaded. May otherwise leak
+ host state to the guest. */
+ uint64_t fNewComponents = ~pVCpu->cpum.s.Guest.fXStateMask & uNewValue;
+ if (fNewComponents)
+ {
+#if defined(IN_RING0) || defined(IN_RC)
+ if (pVCpu->cpum.s.fUseFlags & CPUM_USED_FPU)
+ {
+ if (pVCpu->cpum.s.Guest.fXStateMask != 0)
+ /* Adding more components. */
+ ASMXRstor(pVCpu->cpum.s.Guest.CTX_SUFF(pXState), fNewComponents);
+ else
+ {
+ /* We're switching from FXSAVE/FXRSTOR to XSAVE/XRSTOR. */
+ pVCpu->cpum.s.Guest.fXStateMask |= XSAVE_C_X87 | XSAVE_C_SSE;
+ if (uNewValue & ~(XSAVE_C_X87 | XSAVE_C_SSE))
+ ASMXRstor(pVCpu->cpum.s.Guest.CTX_SUFF(pXState), uNewValue & ~(XSAVE_C_X87 | XSAVE_C_SSE));
+ }
+ }
+#endif
+ pVCpu->cpum.s.Guest.fXStateMask |= uNewValue;
+ }
+ return VINF_SUCCESS;
+ }
+ return VERR_CPUM_RAISE_GP_0;
+}
+
+
+/**
* Tests if the guest has No-Execute Page Protection Enabled (NXE).
*
* @returns true if in real mode, otherwise false.
@@ -2595,20 +2652,6 @@ VMMDECL(bool) CPUMIsGuestFPUStateActive(PVMCPU pVCpu)
/**
- * Deactivate the FPU/XMM state of the guest OS.
- * @param pVCpu Pointer to the VMCPU.
- *
- * @todo r=bird: Why is this needed? Looks like a workaround for mishandled
- * FPU state management.
- */
-VMMDECL(void) CPUMDeactivateGuestFPUState(PVMCPU pVCpu)
-{
- Assert(!(pVCpu->cpum.s.fUseFlags & CPUM_USED_FPU));
- pVCpu->cpum.s.fUseFlags &= ~CPUM_USED_FPU;
-}
-
-
-/**
* Checks if the guest debug state is active.
*
* @returns boolean
diff --git a/src/VBox/VMM/VMMAll/GIMAllKvm.cpp b/src/VBox/VMM/VMMAll/GIMAllKvm.cpp
index 18c1e47..105894d 100644
--- a/src/VBox/VMM/VMMAll/GIMAllKvm.cpp
+++ b/src/VBox/VMM/VMMAll/GIMAllKvm.cpp
@@ -254,9 +254,9 @@ VMM_INT_DECL(VBOXSTRICTRC) gimKvmWriteMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMS
}
/* Enable and populate the system-time struct. */
- pKvmCpu->u64SystemTimeMsr = uRawValue;
- pKvmCpu->GCPhysSystemTime = MSR_GIM_KVM_SYSTEM_TIME_GUEST_GPA(uRawValue);
- pKvmCpu->u32SystemTimeVersion = pKvmCpu->u32SystemTimeVersion + 2;
+ pKvmCpu->u64SystemTimeMsr = uRawValue;
+ pKvmCpu->GCPhysSystemTime = MSR_GIM_KVM_SYSTEM_TIME_GUEST_GPA(uRawValue);
+ pKvmCpu->u32SystemTimeVersion += 2;
int rc = gimR3KvmEnableSystemTime(pVM, pVCpu, pKvmCpu, fFlags);
if (RT_FAILURE(rc))
{
@@ -278,8 +278,7 @@ VMM_INT_DECL(VBOXSTRICTRC) gimKvmWriteMsr(PVMCPU pVCpu, uint32_t idMsr, PCCPUMMS
RTGCPHYS GCPhysWallClock = MSR_GIM_KVM_WALL_CLOCK_GUEST_GPA(uRawValue);
if (RT_LIKELY(RT_ALIGN_64(GCPhysWallClock, 4) == GCPhysWallClock))
{
- uint32_t uVersion = 2;
- int rc = gimR3KvmEnableWallClock(pVM, GCPhysWallClock, uVersion);
+ int rc = gimR3KvmEnableWallClock(pVM, GCPhysWallClock);
if (RT_SUCCESS(rc))
{
pKvm->u64WallClockMsr = uRawValue;
@@ -377,10 +376,10 @@ VMM_INT_DECL(int) gimKvmXcptUD(PVMCPU pVCpu, PCPUMCTX pCtx, PDISCPUSTATE pDis)
if ( pDis->pCurInstr->uOpcode == OP_VMCALL
|| pDis->pCurInstr->uOpcode == OP_VMMCALL)
{
- uint8_t abHypercall[3];
if ( pDis->pCurInstr->uOpcode != pKvm->uOpCodeNative
&& HMIsEnabled(pVM))
{
+ uint8_t abHypercall[3];
size_t cbWritten = 0;
rc = VMMPatchHypercall(pVM, &abHypercall, sizeof(abHypercall), &cbWritten);
AssertRC(rc);
diff --git a/src/VBox/VMM/VMMAll/IEMAll.cpp b/src/VBox/VMM/VMMAll/IEMAll.cpp
index fa282bc..fca40fd 100644
--- a/src/VBox/VMM/VMMAll/IEMAll.cpp
+++ b/src/VBox/VMM/VMMAll/IEMAll.cpp
@@ -9187,13 +9187,17 @@ static VBOXSTRICTRC iemMemMarkSelDescAccessed(PIEMCPU pIemCpu, uint16_t uSel)
#define IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX() \
do \
{ \
- if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK) \
+ if (RT_LIKELY(!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))) \
+ { /* likely */ } \
+ else \
return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
} while (0)
#define IEMOP_HLP_DECODED_NL_1(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_fDisOpType) \
do \
{ \
- if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK) \
+ if (RT_LIKELY(!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))) \
+ { /* likely */ } \
+ else \
{ \
NOREF(a_uDisOpNo); NOREF(a_fIemOpFlags); NOREF(a_uDisParam0); NOREF(a_fDisOpType); \
return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
@@ -9202,12 +9206,26 @@ static VBOXSTRICTRC iemMemMarkSelDescAccessed(PIEMCPU pIemCpu, uint16_t uSel)
#define IEMOP_HLP_DECODED_NL_2(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_uDisParam1, a_fDisOpType) \
do \
{ \
- if (pIemCpu->fPrefixes & IEM_OP_PRF_LOCK) \
+ if (RT_LIKELY(!(pIemCpu->fPrefixes & IEM_OP_PRF_LOCK))) \
+ { /* likely */ } \
+ else \
{ \
NOREF(a_uDisOpNo); NOREF(a_fIemOpFlags); NOREF(a_uDisParam0); NOREF(a_uDisParam1); NOREF(a_fDisOpType); \
return IEMOP_RAISE_INVALID_LOCK_PREFIX(); \
} \
} while (0)
+/**
+ * Done decoding, raise \#UD exception if any lock, repz or repnz prefixes
+ * are present.
+ */
+#define IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES() \
+ do \
+ { \
+ if (RT_LIKELY(!(pIemCpu->fPrefixes & (IEM_OP_PRF_LOCK | IEM_OP_PRF_REPNZ | IEM_OP_PRF_REPZ)))) \
+ { /* likely */ } \
+ else \
+ return IEMOP_RAISE_INVALID_OPCODE(); \
+ } while (0)
/**
@@ -10997,6 +11015,18 @@ VMM_INT_DECL(int) IEMExecInstr_iret(PVMCPU pVCpu, PCPUMCTXCORE pCtxCore)
#endif
+/**
+ * Macro used by the IEMExec* method to check the given instruction length.
+ *
+ * Will return on failure!
+ *
+ * @param a_cbInstr The given instruction length.
+ * @param a_cbMin The minimum length.
+ */
+#define IEMEXEC_ASSERT_INSTR_LEN_RETURN(a_cbInstr, a_cbMin) \
+ AssertMsgReturn((unsigned)(a_cbInstr) - (unsigned)(a_cbMin) <= (unsigned)15 - (unsigned)(a_cbMin), \
+ ("cbInstr=%u cbMin=%u\n", (a_cbInstr), (a_cbMin)), VERR_IEM_INVALID_INSTR_LENGTH)
+
/**
* Interface for HM and EM for executing string I/O OUT (write) instructions.
@@ -11018,7 +11048,7 @@ VMM_INT_DECL(VBOXSTRICTRC) IEMExecStringIoWrite(PVMCPU pVCpu, uint8_t cbValue, I
bool fRepPrefix, uint8_t cbInstr, uint8_t iEffSeg)
{
AssertMsgReturn(iEffSeg < X86_SREG_COUNT, ("%#x\n", iEffSeg), VERR_IEM_INVALID_EFF_SEG);
- AssertReturn(cbInstr - 1U <= 14U, VERR_IEM_INVALID_INSTR_LENGTH);
+ IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 1);
/*
* State init.
@@ -11135,7 +11165,7 @@ VMM_INT_DECL(VBOXSTRICTRC) IEMExecStringIoWrite(PVMCPU pVCpu, uint8_t cbValue, I
VMM_INT_DECL(VBOXSTRICTRC) IEMExecStringIoRead(PVMCPU pVCpu, uint8_t cbValue, IEMMODE enmAddrMode,
bool fRepPrefix, uint8_t cbInstr)
{
- AssertReturn(cbInstr - 1U <= 14U, VERR_IEM_INVALID_INSTR_LENGTH);
+ IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 1);
/*
* State init.
@@ -11248,7 +11278,7 @@ VMM_INT_DECL(VBOXSTRICTRC) IEMExecStringIoRead(PVMCPU pVCpu, uint8_t cbValue, IE
*/
VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxWrite(PVMCPU pVCpu, uint8_t cbInstr, uint8_t iCrReg, uint8_t iGReg)
{
- AssertReturn(cbInstr - 2U <= 15U - 2U, VERR_IEM_INVALID_INSTR_LENGTH);
+ IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 2);
Assert(iCrReg < 16);
Assert(iGReg < 16);
@@ -11272,7 +11302,7 @@ VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxWrite(PVMCPU pVCpu, uint8_t cbIns
*/
VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxRead(PVMCPU pVCpu, uint8_t cbInstr, uint8_t iGReg, uint8_t iCrReg)
{
- AssertReturn(cbInstr - 2U <= 15U - 2U, VERR_IEM_INVALID_INSTR_LENGTH);
+ IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 2);
Assert(iCrReg < 16);
Assert(iGReg < 16);
@@ -11294,7 +11324,7 @@ VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedMovCRxRead(PVMCPU pVCpu, uint8_t cbInst
*/
VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedClts(PVMCPU pVCpu, uint8_t cbInstr)
{
- AssertReturn(cbInstr - 2U <= 15U - 2U, VERR_IEM_INVALID_INSTR_LENGTH);
+ IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 2);
PIEMCPU pIemCpu = &pVCpu->iem.s;
iemInitExec(pIemCpu, false /*fBypassHandlers*/);
@@ -11315,7 +11345,7 @@ VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedClts(PVMCPU pVCpu, uint8_t cbInstr)
*/
VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedLmsw(PVMCPU pVCpu, uint8_t cbInstr, uint16_t uValue)
{
- AssertReturn(cbInstr - 3U <= 15U - 3U, VERR_IEM_INVALID_INSTR_LENGTH);
+ IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 3);
PIEMCPU pIemCpu = &pVCpu->iem.s;
iemInitExec(pIemCpu, false /*fBypassHandlers*/);
@@ -11323,3 +11353,26 @@ VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedLmsw(PVMCPU pVCpu, uint8_t cbInstr, uin
return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
}
+
+/**
+ * Interface for HM and EM to emulate the XSETBV instruction (loads XCRx).
+ *
+ * Takes input values in ecx and edx:eax of the CPU context of the calling EMT.
+ *
+ * @returns Strict VBox status code.
+ * @param pVCpu The cross context per virtual CPU structure of the
+ * calling EMT.
+ * @param cbInstr The instruction length in bytes.
+ * @remarks In ring-0 not all of the state needs to be synced in.
+ * @threads EMT(pVCpu)
+ */
+VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedXsetbv(PVMCPU pVCpu, uint8_t cbInstr)
+{
+ IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 3);
+
+ PIEMCPU pIemCpu = &pVCpu->iem.s;
+ iemInitExec(pIemCpu, false /*fBypassHandlers*/);
+ VBOXSTRICTRC rcStrict = IEM_CIMPL_CALL_0(iemCImpl_xsetbv);
+ return iemExecStatusCodeFiddling(pIemCpu, rcStrict);
+}
+
diff --git a/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h b/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
index db47eb1..c22ee08 100644
--- a/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
+++ b/src/VBox/VMM/VMMAll/IEMAllCImpl.cpp.h
@@ -6025,6 +6025,81 @@ IEM_CIMPL_DEF_0(iemCImpl_das)
/**
+ * Implements 'XGETBV'.
+ */
+IEM_CIMPL_DEF_0(iemCImpl_xgetbv)
+{
+ PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
+ if (pCtx->cr4 & X86_CR4_OSXSAVE)
+ {
+ uint32_t uEcx = pCtx->ecx;
+ switch (uEcx)
+ {
+ case 0:
+ break;
+
+ case 1: /** @todo Implement XCR1 support. */
+ default:
+ Log(("xgetbv ecx=%RX32 -> #GP(0)\n", uEcx));
+ return iemRaiseGeneralProtectionFault0(pIemCpu);
+
+ }
+ pCtx->rax = RT_LO_U32(pCtx->aXcr[uEcx]);
+ pCtx->rdx = RT_HI_U32(pCtx->aXcr[uEcx]);
+
+ iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
+ return VINF_SUCCESS;
+ }
+ Log(("xgetbv CR4.OSXSAVE=0 -> UD\n"));
+ return iemRaiseUndefinedOpcode(pIemCpu);
+}
+
+
+/**
+ * Implements 'XSETBV'.
+ */
+IEM_CIMPL_DEF_0(iemCImpl_xsetbv)
+{
+ PCPUMCTX pCtx = pIemCpu->CTX_SUFF(pCtx);
+ if (pCtx->cr4 & X86_CR4_OSXSAVE)
+ {
+ if (pIemCpu->uCpl == 0)
+ {
+ uint32_t uEcx = pCtx->ecx;
+ uint64_t uNewValue = RT_MAKE_U64(pCtx->eax, pCtx->edx);
+ switch (uEcx)
+ {
+ case 0:
+ {
+ int rc = CPUMSetGuestXcr0(IEMCPU_TO_VMCPU(pIemCpu), uNewValue);
+ if (rc == VINF_SUCCESS)
+ break;
+ Assert(rc == VERR_CPUM_RAISE_GP_0);
+ Log(("xsetbv ecx=%RX32 (newvalue=%RX64) -> #GP(0)\n", uEcx, uNewValue));
+ return iemRaiseGeneralProtectionFault0(pIemCpu);
+ }
+
+ case 1: /** @todo Implement XCR1 support. */
+ default:
+ Log(("xsetbv ecx=%RX32 (newvalue=%RX64) -> #GP(0)\n", uEcx, uNewValue));
+ return iemRaiseGeneralProtectionFault0(pIemCpu);
+
+ }
+
+ iemRegAddToRipAndClearRF(pIemCpu, cbInstr);
+ return VINF_SUCCESS;
+ }
+
+ Log(("xsetbv cpl=%u -> GP(0)\n", pIemCpu->uCpl));
+ return iemRaiseGeneralProtectionFault0(pIemCpu);
+ }
+ Log(("xsetbv CR4.OSXSAVE=0 -> UD\n"));
+ return iemRaiseUndefinedOpcode(pIemCpu);
+}
+
+
+
+/**
* Implements 'FINIT' and 'FNINIT'.
*
* @param fCheckXcpts Whether to check for umasked pending exceptions or
diff --git a/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h b/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
index 3dffd69..cfbfce4 100644
--- a/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
+++ b/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
@@ -883,18 +883,28 @@ FNIEMOP_DEF_1(iemOp_Grp7_lgdt, uint8_t, bRm)
}
-/** Opcode 0x0f 0x01 /2. */
+/** Opcode 0x0f 0x01 0xd0. */
FNIEMOP_DEF(iemOp_Grp7_xgetbv)
{
- AssertFailed();
+ IEMOP_MNEMONIC("xgetbv");
+ if (IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fXSaveRstor)
+ {
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
+ return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_xgetbv);
+ }
return IEMOP_RAISE_INVALID_OPCODE();
}
-/** Opcode 0x0f 0x01 /2. */
+/** Opcode 0x0f 0x01 0xd1. */
FNIEMOP_DEF(iemOp_Grp7_xsetbv)
{
- AssertFailed();
+ IEMOP_MNEMONIC("xsetbv");
+ if (IEM_GET_GUEST_CPU_FEATURES(pIemCpu)->fXSaveRstor)
+ {
+ IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES();
+ return IEM_MC_DEFER_TO_CIMPL_0(iemCImpl_xsetbv);
+ }
return IEMOP_RAISE_INVALID_OPCODE();
}
diff --git a/src/VBox/VMM/VMMAll/MMAll.cpp b/src/VBox/VMM/VMMAll/MMAll.cpp
index 88b9c4a..5d5944c 100644
--- a/src/VBox/VMM/VMMAll/MMAll.cpp
+++ b/src/VBox/VMM/VMMAll/MMAll.cpp
@@ -623,6 +623,7 @@ const char *mmGetTagName(MMTAG enmTag)
TAG2STR(PGM);
TAG2STR(PGM_CHUNK_MAPPING);
TAG2STR(PGM_HANDLERS);
+ TAG2STR(PGM_HANDLER_TYPES);
TAG2STR(PGM_MAPPINGS);
TAG2STR(PGM_PHYS);
TAG2STR(PGM_POOL);
diff --git a/src/VBox/VMM/VMMAll/MMAllHyper.cpp b/src/VBox/VMM/VMMAll/MMAllHyper.cpp
index 97a6544..084875b 100644
--- a/src/VBox/VMM/VMMAll/MMAllHyper.cpp
+++ b/src/VBox/VMM/VMMAll/MMAllHyper.cpp
@@ -1258,6 +1258,7 @@ VMMDECL(size_t) MMHyperHeapGetFreeSize(PVM pVM)
return pVM->mm.s.CTX_SUFF(pHyperHeap)->cbFree;
}
+
/**
* Query the size the hypervisor heap.
*
@@ -1270,6 +1271,35 @@ VMMDECL(size_t) MMHyperHeapGetSize(PVM pVM)
/**
+ * Converts a context neutral heap offset into a pointer.
+ *
+ * @returns Pointer to hyper heap data.
+ * @param pVM Pointer to the cross context VM structure.
+ * @param offHeap The hyper heap offset.
+ */
+VMMDECL(void *) MMHyperHeapOffsetToPtr(PVM pVM, uint32_t offHeap)
+{
+ Assert(offHeap - MMYPERHEAP_HDR_SIZE <= pVM->mm.s.CTX_SUFF(pHyperHeap)->cbHeap);
+ return (uint8_t *)pVM->mm.s.CTX_SUFF(pHyperHeap) + offHeap;
+}
+
+
+/**
+ * Converts a context specific heap pointer into a neutral heap offset.
+ *
+ * @returns Heap offset.
+ * @param pVM Pointer to the cross context VM structure.
+ * @param pv Pointer to the heap data.
+ */
+VMMDECL(uint32_t) MMHyperHeapPtrToOffset(PVM pVM, void *pv)
+{
+ size_t offHeap = (uint8_t *)pv - (uint8_t *)pVM->mm.s.CTX_SUFF(pHyperHeap);
+ Assert(offHeap - MMYPERHEAP_HDR_SIZE <= pVM->mm.s.CTX_SUFF(pHyperHeap)->cbHeap);
+ return (uint32_t)offHeap;
+}
+
+
+/**
* Query the address and size the hypervisor memory area.
*
* @returns Base address of the hypervisor area.
diff --git a/src/VBox/VMM/VMMAll/PGMAllBth.h b/src/VBox/VMM/VMMAll/PGMAllBth.h
index dfe3e24..f492e01 100644
--- a/src/VBox/VMM/VMMAll/PGMAllBth.h
+++ b/src/VBox/VMM/VMMAll/PGMAllBth.h
@@ -178,6 +178,8 @@ static VBOXSTRICTRC PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(PVMCPU pVCpu, RT
PPGMPHYSHANDLER pCur = pgmHandlerPhysicalLookup(pVM, GCPhysFault);
if (pCur)
{
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+
# ifdef PGM_SYNC_N_PAGES
/*
* If the region is write protected and we got a page not present fault, then sync
@@ -187,7 +189,7 @@ static VBOXSTRICTRC PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(PVMCPU pVCpu, RT
* ASSUMES that there is only one handler per page or that they have similar write properties.
*/
if ( !(uErr & X86_TRAP_PF_P)
- && pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE)
+ && pCurType->enmKind == PGMPHYSHANDLERKIND_WRITE)
{
# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
rc = PGM_BTH_NAME(SyncPage)(pVCpu, pGstWalk->Pde, pvFault, PGM_SYNC_NR_PAGES, uErr);
@@ -210,7 +212,7 @@ static VBOXSTRICTRC PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(PVMCPU pVCpu, RT
* If the access was not thru a #PF(RSVD|...) resync the page.
*/
if ( !(uErr & X86_TRAP_PF_RSVD)
- && pCur->enmType != PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
+ && pCurType->enmKind != PGMPHYSHANDLERKIND_WRITE
# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
&& pGstWalk->Core.fEffectiveRW
&& !pGstWalk->Core.fEffectiveUS /** @todo Remove pGstWalk->Core.fEffectiveUS and X86_PTE_US further down in the sync code. */
@@ -233,11 +235,11 @@ static VBOXSTRICTRC PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(PVMCPU pVCpu, RT
}
# endif
- AssertMsg( pCur->enmType != PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
- || (pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE && (uErr & X86_TRAP_PF_RW)),
- ("Unexpected trap for physical handler: %08X (phys=%08x) pPage=%R[pgmpage] uErr=%X, enum=%d\n",
- pvFault, GCPhysFault, pPage, uErr, pCur->enmType));
- if (pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE)
+ AssertMsg( pCurType->enmKind != PGMPHYSHANDLERKIND_WRITE
+ || (pCurType->enmKind == PGMPHYSHANDLERKIND_WRITE && (uErr & X86_TRAP_PF_RW)),
+ ("Unexpected trap for physical handler: %08X (phys=%08x) pPage=%R[pgmpage] uErr=%X, enmKind=%d\n",
+ pvFault, GCPhysFault, pPage, uErr, pCurType->enmKind));
+ if (pCurType->enmKind == PGMPHYSHANDLERKIND_WRITE)
STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eHandlersPhysWrite);
else
{
@@ -245,18 +247,18 @@ static VBOXSTRICTRC PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(PVMCPU pVCpu, RT
if (uErr & X86_TRAP_PF_RSVD) STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->StatRZTrap0eHandlersPhysAllOpt);
}
- if (pCur->CTX_SUFF(pfnHandler))
+ if (pCurType->CTX_SUFF(pfnHandler))
{
PPGMPOOL pPool = pVM->pgm.s.CTX_SUFF(pPool);
void *pvUser = pCur->CTX_SUFF(pvUser);
# ifdef IN_RING0
- PFNPGMR0PHYSHANDLER pfnHandler = pCur->CTX_SUFF(pfnHandler);
+ PFNPGMR0PHYSHANDLER pfnHandler = pCurType->CTX_SUFF(pfnHandler);
# else
- PFNPGMRCPHYSHANDLER pfnHandler = pCur->CTX_SUFF(pfnHandler);
+ PFNPGMRCPHYSHANDLER pfnHandler = pCurType->CTX_SUFF(pfnHandler);
# endif
STAM_PROFILE_START(&pCur->Stat, h);
- if (pfnHandler != pPool->CTX_SUFF(pfnAccessHandler))
+ if (pCur->hType != pPool->hAccessHandlerType)
{
pgmUnlock(pVM);
*pfLockTaken = false;
diff --git a/src/VBox/VMM/VMMAll/PGMAllHandler.cpp b/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
index 688a594..280fe08 100644
--- a/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
+++ b/src/VBox/VMM/VMMAll/PGMAllHandler.cpp
@@ -54,6 +54,73 @@ static void pgmHandlerPhysicalDeregisterNotifyREM(PVM pVM, PPGMPHYSHANDLER pCur)
static void pgmHandlerPhysicalResetRamFlags(PVM pVM, PPGMPHYSHANDLER pCur);
+/**
+ * Internal worker for releasing a physical handler type registration reference.
+ *
+ * @returns New reference count. UINT32_MAX if invalid input (asserted).
+ * @param pVM Pointer to the cross context VM structure.
+ * @param pType Pointer to the type registration.
+ */
+DECLINLINE(uint32_t) pgmHandlerPhysicalTypeRelease(PVM pVM, PPGMPHYSHANDLERTYPEINT pType)
+{
+ AssertMsgReturn(pType->u32Magic == PGMPHYSHANDLERTYPEINT_MAGIC, ("%#x\n", pType->u32Magic), UINT32_MAX);
+ uint32_t cRefs = ASMAtomicDecU32(&pType->cRefs);
+ if (cRefs == 0)
+ {
+ pgmLock(pVM);
+ pType->u32Magic = PGMPHYSHANDLERTYPEINT_MAGIC_DEAD;
+ RTListOff32NodeRemove(&pType->ListNode);
+ pgmUnlock(pVM);
+ MMHyperFree(pVM, pType);
+ }
+ return cRefs;
+}
+
+
+/**
+ * Internal worker for retaining a physical handler type registration reference.
+ *
+ * @returns New reference count. UINT32_MAX if invalid input (asserted).
+ * @param pVM Pointer to the cross context VM structure.
+ * @param pType Pointer to the type registration.
+ */
+DECLINLINE(uint32_t) pgmHandlerPhysicalTypeRetain(PVM pVM, PPGMPHYSHANDLERTYPEINT pType)
+{
+ AssertMsgReturn(pType->u32Magic == PGMPHYSHANDLERTYPEINT_MAGIC, ("%#x\n", pType->u32Magic), UINT32_MAX);
+ uint32_t cRefs = ASMAtomicIncU32(&pType->cRefs);
+ Assert(cRefs < _1M && cRefs > 0);
+ return cRefs;
+}
+
+
+/**
+ * Releases a reference to a physical handler type registration.
+ *
+ * @returns New reference count. UINT32_MAX if invalid input (asserted).
+ * @param pVM Pointer to the cross context VM structure.
+ * @param hType The type regiration handle.
+ */
+VMMDECL(uint32_t) PGMHandlerPhysicalTypeRelease(PVM pVM, PGMPHYSHANDLERTYPE hType)
+{
+ if (hType != NIL_PGMPHYSHANDLERTYPE)
+ return pgmHandlerPhysicalTypeRelease(pVM, PGMPHYSHANDLERTYPEINT_FROM_HANDLE(pVM, hType));
+ return 0;
+}
+
+
+/**
+ * Retains a reference to a physical handler type registration.
+ *
+ * @returns New reference count. UINT32_MAX if invalid input (asserted).
+ * @param pVM Pointer to the cross context VM structure.
+ * @param hType The type regiration handle.
+ */
+VMMDECL(uint32_t) PGMHandlerPhysicalTypeRetain(PVM pVM, PGMPHYSHANDLERTYPE hType)
+{
+ return pgmHandlerPhysicalTypeRetain(pVM, PGMPHYSHANDLERTYPEINT_FROM_HANDLE(pVM, hType));
+}
+
+
/**
* Register a access handler for a physical range.
@@ -67,44 +134,41 @@ static void pgmHandlerPhysicalResetRamFlags(PVM pVM, PPGMPHYSHANDLER pCur);
* one. A debug assertion is raised.
*
* @param pVM Pointer to the VM.
- * @param enmType Handler type. Any of the PGMPHYSHANDLERTYPE_PHYSICAL* enums.
* @param GCPhys Start physical address.
* @param GCPhysLast Last physical address. (inclusive)
- * @param pfnHandlerR3 The R3 handler.
+ * @param hType The handler type registration handle.
* @param pvUserR3 User argument to the R3 handler.
- * @param pfnHandlerR0 The R0 handler.
* @param pvUserR0 User argument to the R0 handler.
- * @param pfnHandlerRC The RC handler.
* @param pvUserRC User argument to the RC handler. This can be a value
* less that 0x10000 or a (non-null) pointer that is
* automatically relocated.
- * @param pszDesc Pointer to description string. This must not be freed.
+ * @param pszDesc Description of this handler. If NULL, the type
+ * description will be used instead.
*/
-VMMDECL(int) PGMHandlerPhysicalRegisterEx(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast,
- R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
- R3PTRTYPE(const char *) pszDesc)
+VMMDECL(int) PGMHandlerPhysicalRegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast, PGMPHYSHANDLERTYPE hType,
+ RTR3PTR pvUserR3, RTR0PTR pvUserR0, RTRCPTR pvUserRC, R3PTRTYPE(const char *) pszDesc)
{
- Log(("PGMHandlerPhysicalRegisterEx: enmType=%d GCPhys=%RGp GCPhysLast=%RGp pfnHandlerR3=%RHv pvUserR3=%RHv pfnHandlerR0=%RHv pvUserR0=%RHv pfnHandlerGC=%RRv pvUserGC=%RRv pszDesc=%s\n",
- enmType, GCPhys, GCPhysLast, pfnHandlerR3, pvUserR3, pfnHandlerR0, pvUserR0, pfnHandlerRC, pvUserRC, R3STRING(pszDesc)));
+ PPGMPHYSHANDLERTYPEINT pType = PGMPHYSHANDLERTYPEINT_FROM_HANDLE(pVM, hType);
+ Log(("PGMHandlerPhysicalRegister: GCPhys=%RGp GCPhysLast=%RGp pvUserR3=%RHv pvUserR0=%RHv pvUserGC=%RRv hType=%#x (%d, %s) pszDesc=%RHv:%s\n",
+ GCPhys, GCPhysLast, pvUserR3, pvUserR0, pvUserRC, hType, pType->enmKind, R3STRING(pType->pszDesc), pszDesc, R3STRING(pszDesc)));
/*
* Validate input.
*/
+ AssertReturn(pType->u32Magic == PGMPHYSHANDLERTYPEINT_MAGIC, VERR_INVALID_HANDLE);
AssertMsgReturn(GCPhys < GCPhysLast, ("GCPhys >= GCPhysLast (%#x >= %#x)\n", GCPhys, GCPhysLast), VERR_INVALID_PARAMETER);
- switch (enmType)
+ switch (pType->enmKind)
{
- case PGMPHYSHANDLERTYPE_PHYSICAL_WRITE:
+ case PGMPHYSHANDLERKIND_WRITE:
break;
- case PGMPHYSHANDLERTYPE_MMIO:
- case PGMPHYSHANDLERTYPE_PHYSICAL_ALL:
+ case PGMPHYSHANDLERKIND_MMIO:
+ case PGMPHYSHANDLERKIND_ALL:
/* Simplification for PGMPhysRead, PGMR0Trap0eHandlerNPMisconfig and others. */
AssertMsgReturn(!(GCPhys & PAGE_OFFSET_MASK), ("%RGp\n", GCPhys), VERR_INVALID_PARAMETER);
AssertMsgReturn((GCPhysLast & PAGE_OFFSET_MASK) == PAGE_OFFSET_MASK, ("%RGp\n", GCPhysLast), VERR_INVALID_PARAMETER);
break;
default:
- AssertMsgFailed(("Invalid input enmType=%d!\n", enmType));
+ AssertMsgFailed(("Invalid input enmKind=%d!\n", pType->enmKind));
return VERR_INVALID_PARAMETER;
}
AssertMsgReturn( (RTRCUINTPTR)pvUserRC < 0x10000
@@ -115,9 +179,6 @@ VMMDECL(int) PGMHandlerPhysicalRegisterEx(PVM pVM, PGMPHYSHANDLERTYPE enmType, R
|| MMHyperR3ToR0(pVM, MMHyperR0ToR3(pVM, pvUserR0)) == pvUserR0,
("Not R0 pointer! pvUserR0=%RHv\n", pvUserR0),
VERR_INVALID_PARAMETER);
- AssertPtrReturn(pfnHandlerR3, VERR_INVALID_POINTER);
- AssertReturn(pfnHandlerR0, VERR_INVALID_PARAMETER);
- AssertReturn(pfnHandlerRC || HMIsEnabled(pVM), VERR_INVALID_PARAMETER);
/*
* We require the range to be within registered ram.
@@ -145,17 +206,15 @@ VMMDECL(int) PGMHandlerPhysicalRegisterEx(PVM pVM, PGMPHYSHANDLERTYPE enmType, R
pNew->Core.Key = GCPhys;
pNew->Core.KeyLast = GCPhysLast;
- pNew->enmType = enmType;
pNew->cPages = (GCPhysLast - (GCPhys & X86_PTE_PAE_PG_MASK) + PAGE_SIZE) >> PAGE_SHIFT;
pNew->cAliasedPages = 0;
pNew->cTmpOffPages = 0;
- pNew->pfnHandlerR3 = pfnHandlerR3;
pNew->pvUserR3 = pvUserR3;
- pNew->pfnHandlerR0 = pfnHandlerR0;
pNew->pvUserR0 = pvUserR0;
- pNew->pfnHandlerRC = pfnHandlerRC;
pNew->pvUserRC = pvUserRC;
- pNew->pszDesc = pszDesc;
+ pNew->hType = hType;
+ pNew->pszDesc = pszDesc != NIL_RTR3PTR ? pszDesc : pType->pszDesc;
+ pgmHandlerPhysicalTypeRetain(pVM, pType);
pgmLock(pVM);
@@ -170,9 +229,9 @@ VMMDECL(int) PGMHandlerPhysicalRegisterEx(PVM pVM, PGMPHYSHANDLERTYPE enmType, R
pgmUnlock(pVM);
#ifdef VBOX_WITH_REM
# ifndef IN_RING3
- REMNotifyHandlerPhysicalRegister(pVM, enmType, GCPhys, GCPhysLast - GCPhys + 1, !!pfnHandlerR3);
+ REMNotifyHandlerPhysicalRegister(pVM, pType->enmKind, GCPhys, GCPhysLast - GCPhys + 1, !!pType->pfnHandlerR3);
# else
- REMR3NotifyHandlerPhysicalRegister(pVM, enmType, GCPhys, GCPhysLast - GCPhys + 1, !!pfnHandlerR3);
+ REMR3NotifyHandlerPhysicalRegister(pVM, pType->enmKind, GCPhys, GCPhysLast - GCPhys + 1, !!pType->pfnHandlerR3);
# endif
#endif
if (rc != VINF_SUCCESS)
@@ -185,7 +244,9 @@ VMMDECL(int) PGMHandlerPhysicalRegisterEx(PVM pVM, PGMPHYSHANDLERTYPE enmType, R
#if defined(IN_RING3) && defined(VBOX_STRICT)
DBGFR3Info(pVM->pUVM, "handlers", "phys nostats", NULL);
#endif
- AssertMsgFailed(("Conflict! GCPhys=%RGp GCPhysLast=%RGp pszDesc=%s\n", GCPhys, GCPhysLast, pszDesc));
+ AssertMsgFailed(("Conflict! GCPhys=%RGp GCPhysLast=%RGp pszDesc=%s/%s\n",
+ GCPhys, GCPhysLast, R3STRING(pszDesc), R3STRING(pType->pszDesc)));
+ pgmHandlerPhysicalTypeRelease(pVM, pType);
MMHyperFree(pVM, pNew);
return VERR_PGM_HANDLER_PHYSICAL_CONFLICT;
}
@@ -208,15 +269,16 @@ static int pgmHandlerPhysicalSetRamFlagsAndFlushShadowPTs(PVM pVM, PPGMPHYSHANDL
* Iterate the guest ram pages updating the flags and flushing PT entries
* mapping the page.
*/
- bool fFlushTLBs = false;
- int rc = VINF_SUCCESS;
- const unsigned uState = pgmHandlerPhysicalCalcState(pCur);
- uint32_t cPages = pCur->cPages;
- uint32_t i = (pCur->Core.Key - pRam->GCPhys) >> PAGE_SHIFT;
+ bool fFlushTLBs = false;
+ int rc = VINF_SUCCESS;
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ const unsigned uState = pCurType->uState;
+ uint32_t cPages = pCur->cPages;
+ uint32_t i = (pCur->Core.Key - pRam->GCPhys) >> PAGE_SHIFT;
for (;;)
{
PPGMPAGE pPage = &pRam->aPages[i];
- AssertMsg(pCur->enmType != PGMPHYSHANDLERTYPE_MMIO || PGM_PAGE_IS_MMIO(pPage),
+ AssertMsg(pCurType->enmKind != PGMPHYSHANDLERKIND_MMIO || PGM_PAGE_IS_MMIO(pPage),
("%RGp %R[pgmpage]\n", pRam->GCPhys + (i << PAGE_SHIFT), pPage));
/* Only do upgrades. */
@@ -264,8 +326,7 @@ VMMDECL(int) PGMHandlerPhysicalDeregister(PVM pVM, RTGCPHYS GCPhys)
PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)RTAvlroGCPhysRemove(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysHandlers, GCPhys);
if (pCur)
{
- LogFlow(("PGMHandlerPhysicalDeregister: Removing Range %RGp-%RGp %s\n",
- pCur->Core.Key, pCur->Core.KeyLast, R3STRING(pCur->pszDesc)));
+ LogFlow(("PGMHandlerPhysicalDeregister: Removing Range %RGp-%RGp %s\n", pCur->Core.Key, pCur->Core.KeyLast, R3STRING(pCur->pszDesc)));
/*
* Clear the page bits, notify the REM about this change and clear
@@ -276,6 +337,7 @@ VMMDECL(int) PGMHandlerPhysicalDeregister(PVM pVM, RTGCPHYS GCPhys)
pVM->pgm.s.pLastPhysHandlerR0 = 0;
pVM->pgm.s.pLastPhysHandlerR3 = 0;
pVM->pgm.s.pLastPhysHandlerRC = 0;
+ PGMHandlerPhysicalTypeRelease(pVM, pCur->hType);
MMHyperFree(pVM, pCur);
pgmUnlock(pVM);
return VINF_SUCCESS;
@@ -292,8 +354,9 @@ VMMDECL(int) PGMHandlerPhysicalDeregister(PVM pVM, RTGCPHYS GCPhys)
*/
static void pgmHandlerPhysicalDeregisterNotifyREM(PVM pVM, PPGMPHYSHANDLER pCur)
{
- RTGCPHYS GCPhysStart = pCur->Core.Key;
- RTGCPHYS GCPhysLast = pCur->Core.KeyLast;
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ RTGCPHYS GCPhysStart = pCur->Core.Key;
+ RTGCPHYS GCPhysLast = pCur->Core.KeyLast;
/*
* Page align the range.
@@ -305,7 +368,7 @@ static void pgmHandlerPhysicalDeregisterNotifyREM(PVM pVM, PPGMPHYSHANDLER pCur)
if ( (pCur->Core.Key & PAGE_OFFSET_MASK)
|| ((pCur->Core.KeyLast + 1) & PAGE_OFFSET_MASK))
{
- Assert(pCur->enmType != PGMPHYSHANDLERTYPE_MMIO);
+ Assert(pCurType->enmKind != PGMPHYSHANDLERKIND_MMIO);
if (GCPhysStart & PAGE_OFFSET_MASK)
{
@@ -345,13 +408,15 @@ static void pgmHandlerPhysicalDeregisterNotifyREM(PVM pVM, PPGMPHYSHANDLER pCur)
/*
* Tell REM.
*/
- const bool fRestoreAsRAM = pCur->pfnHandlerR3
- && pCur->enmType != PGMPHYSHANDLERTYPE_MMIO; /** @todo this isn't entirely correct. */
+ const bool fRestoreAsRAM = pCurType->pfnHandlerR3
+ && pCurType->enmKind != PGMPHYSHANDLERKIND_MMIO; /** @todo this isn't entirely correct. */
#ifdef VBOX_WITH_REM
# ifndef IN_RING3
- REMNotifyHandlerPhysicalDeregister(pVM, pCur->enmType, GCPhysStart, GCPhysLast - GCPhysStart + 1, !!pCur->pfnHandlerR3, fRestoreAsRAM);
+ REMNotifyHandlerPhysicalDeregister(pVM, pCurType->enmKind, GCPhysStart, GCPhysLast - GCPhysStart + 1,
+ !!pCurType->pfnHandlerR3, fRestoreAsRAM);
# else
- REMR3NotifyHandlerPhysicalDeregister(pVM, pCur->enmType, GCPhysStart, GCPhysLast - GCPhysStart + 1, !!pCur->pfnHandlerR3, fRestoreAsRAM);
+ REMR3NotifyHandlerPhysicalDeregister(pVM, pCurType->enmKind, GCPhysStart, GCPhysLast - GCPhysStart + 1,
+ !!pCurType->pfnHandlerR3, fRestoreAsRAM);
# endif
#endif
}
@@ -370,11 +435,11 @@ DECLINLINE(void) pgmHandlerPhysicalRecalcPageState(PVM pVM, RTGCPHYS GCPhys, boo
for (;;)
{
PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)RTAvlroGCPhysGetBestFit(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysHandlers, GCPhys, fAbove);
- if ( !pCur
- || ((fAbove ? pCur->Core.Key : pCur->Core.KeyLast) >> PAGE_SHIFT) != (GCPhys >> PAGE_SHIFT))
+ if ( !pCur
+ || ((fAbove ? pCur->Core.Key : pCur->Core.KeyLast) >> PAGE_SHIFT) != (GCPhys >> PAGE_SHIFT))
break;
- unsigned uThisState = pgmHandlerPhysicalCalcState(pCur);
- uState = RT_MAX(uState, uThisState);
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ uState = RT_MAX(uState, pCurType->uState);
/* next? */
RTGCPHYS GCPhysNext = fAbove
@@ -504,7 +569,10 @@ static void pgmHandlerPhysicalResetRamFlags(PVM pVM, PPGMPHYSHANDLER pCur)
pgmHandlerPhysicalResetAliasedPage(pVM, pPage, GCPhys, false /*fDoAccounting*/);
pCur->cAliasedPages--;
}
- AssertMsg(pCur->enmType != PGMPHYSHANDLERTYPE_MMIO || PGM_PAGE_IS_MMIO(pPage), ("%RGp %R[pgmpage]\n", GCPhys, pPage));
+#ifdef VBOX_STRICT
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ AssertMsg(pCurType->enmKind != PGMPHYSHANDLERKIND_MMIO || PGM_PAGE_IS_MMIO(pPage), ("%RGp %R[pgmpage]\n", GCPhys, pPage));
+#endif
PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE);
}
else
@@ -556,8 +624,9 @@ VMMDECL(int) PGMHandlerPhysicalModify(PVM pVM, RTGCPHYS GCPhysCurrent, RTGCPHYS
* Clear the ram flags. (We're gonna move or free it!)
*/
pgmHandlerPhysicalResetRamFlags(pVM, pCur);
- const bool fRestoreAsRAM = pCur->pfnHandlerR3
- && pCur->enmType != PGMPHYSHANDLERTYPE_MMIO; /** @todo this isn't entirely correct. */
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ const bool fRestoreAsRAM = pCurType->pfnHandlerR3
+ && pCurType->enmKind != PGMPHYSHANDLERKIND_MMIO; /** @todo this isn't entirely correct. */
/*
* Validate the new range, modify and reinsert.
@@ -579,9 +648,9 @@ VMMDECL(int) PGMHandlerPhysicalModify(PVM pVM, RTGCPHYS GCPhysCurrent, RTGCPHYS
if (RTAvlroGCPhysInsert(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysHandlers, &pCur->Core))
{
- PGMPHYSHANDLERTYPE enmType = pCur->enmType;
RTGCPHYS cb = GCPhysLast - GCPhys + 1;
- bool fHasHCHandler = !!pCur->pfnHandlerR3;
+ PGMPHYSHANDLERKIND enmKind = pCurType->enmKind;
+ bool fHasHCHandler = !!pCurType->pfnHandlerR3;
/*
* Set ram flags, flush shadow PT entries and finally tell REM about this.
@@ -591,10 +660,10 @@ VMMDECL(int) PGMHandlerPhysicalModify(PVM pVM, RTGCPHYS GCPhysCurrent, RTGCPHYS
#ifdef VBOX_WITH_REM
# ifndef IN_RING3
- REMNotifyHandlerPhysicalModify(pVM, enmType, GCPhysCurrent, GCPhys, cb,
+ REMNotifyHandlerPhysicalModify(pVM, enmKind, GCPhysCurrent, GCPhys, cb,
fHasHCHandler, fRestoreAsRAM);
# else
- REMR3NotifyHandlerPhysicalModify(pVM, enmType, GCPhysCurrent, GCPhys, cb,
+ REMR3NotifyHandlerPhysicalModify(pVM, enmKind, GCPhysCurrent, GCPhys, cb,
fHasHCHandler, fRestoreAsRAM);
# endif
#endif
@@ -627,6 +696,7 @@ VMMDECL(int) PGMHandlerPhysicalModify(PVM pVM, RTGCPHYS GCPhysCurrent, RTGCPHYS
pVM->pgm.s.pLastPhysHandlerR0 = 0;
pVM->pgm.s.pLastPhysHandlerR3 = 0;
pVM->pgm.s.pLastPhysHandlerRC = 0;
+ PGMHandlerPhysicalTypeRelease(pVM, pCur->hType);
MMHyperFree(pVM, pCur);
}
else
@@ -641,28 +711,21 @@ VMMDECL(int) PGMHandlerPhysicalModify(PVM pVM, RTGCPHYS GCPhysCurrent, RTGCPHYS
/**
- * Changes the callbacks associated with a physical access handler.
+ * Changes the user callback arguments associated with a physical access
+ * handler.
*
* @returns VBox status code.
* @param pVM Pointer to the VM.
- * @param GCPhys Start physical address.
- * @param pfnHandlerR3 The R3 handler.
+ * @param GCPhys Start physical address of the handler.
* @param pvUserR3 User argument to the R3 handler.
- * @param pfnHandlerR0 The R0 handler.
* @param pvUserR0 User argument to the R0 handler.
- * @param pfnHandlerRC The RC handler.
* @param pvUserRC User argument to the RC handler. Values larger or
* equal to 0x10000 will be relocated automatically.
- * @param pszDesc Pointer to description string. This must not be freed.
*/
-VMMDECL(int) PGMHandlerPhysicalChangeCallbacks(PVM pVM, RTGCPHYS GCPhys,
- R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
- R3PTRTYPE(const char *) pszDesc)
+VMMDECL(int) PGMHandlerPhysicalChangeUserArgs(PVM pVM, RTGCPHYS GCPhys, RTR3PTR pvUserR3, RTR0PTR pvUserR0, RTRCPTR pvUserRC)
{
/*
- * Get the handler.
+ * Find the handler.
*/
int rc = VINF_SUCCESS;
pgmLock(pVM);
@@ -670,15 +733,11 @@ VMMDECL(int) PGMHandlerPhysicalChangeCallbacks(PVM pVM, RTGCPHYS GCPhys,
if (pCur)
{
/*
- * Change callbacks.
+ * Change arguments.
*/
- pCur->pfnHandlerR3 = pfnHandlerR3;
- pCur->pvUserR3 = pvUserR3;
- pCur->pfnHandlerR0 = pfnHandlerR0;
- pCur->pvUserR0 = pvUserR0;
- pCur->pfnHandlerRC = pfnHandlerRC;
- pCur->pvUserRC = pvUserRC;
- pCur->pszDesc = pszDesc;
+ pCur->pvUserR3 = pvUserR3;
+ pCur->pvUserR0 = pvUserR0;
+ pCur->pvUserRC = pvUserRC;
}
else
{
@@ -783,9 +842,7 @@ VMMDECL(int) PGMHandlerPhysicalJoin(PVM pVM, RTGCPHYS GCPhys1, RTGCPHYS GCPhys2)
*/
if (RT_LIKELY(pCur1->Core.KeyLast + 1 == pCur2->Core.Key))
{
- if (RT_LIKELY( pCur1->pfnHandlerRC == pCur2->pfnHandlerRC
- && pCur1->pfnHandlerR0 == pCur2->pfnHandlerR0
- && pCur1->pfnHandlerR3 == pCur2->pfnHandlerR3))
+ if (RT_LIKELY(pCur1->hType == pCur2->hType))
{
PPGMPHYSHANDLER pCur3 = (PPGMPHYSHANDLER)RTAvlroGCPhysRemove(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysHandlers, GCPhys2);
if (RT_LIKELY(pCur3 == pCur2))
@@ -797,6 +854,7 @@ VMMDECL(int) PGMHandlerPhysicalJoin(PVM pVM, RTGCPHYS GCPhys1, RTGCPHYS GCPhys2)
pVM->pgm.s.pLastPhysHandlerR0 = 0;
pVM->pgm.s.pLastPhysHandlerR3 = 0;
pVM->pgm.s.pLastPhysHandlerRC = 0;
+ PGMHandlerPhysicalTypeRelease(pVM, pCur2->hType);
MMHyperFree(pVM, pCur2);
pgmUnlock(pVM);
return VINF_SUCCESS;
@@ -862,13 +920,14 @@ VMMDECL(int) PGMHandlerPhysicalReset(PVM pVM, RTGCPHYS GCPhys)
if (RT_LIKELY(pCur))
{
/*
- * Validate type.
+ * Validate kind.
*/
- switch (pCur->enmType)
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ switch (pCurType->enmKind)
{
- case PGMPHYSHANDLERTYPE_PHYSICAL_WRITE:
- case PGMPHYSHANDLERTYPE_PHYSICAL_ALL:
- case PGMPHYSHANDLERTYPE_MMIO: /* NOTE: Only use when clearing MMIO ranges with aliased MMIO2 pages! */
+ case PGMPHYSHANDLERKIND_WRITE:
+ case PGMPHYSHANDLERKIND_ALL:
+ case PGMPHYSHANDLERKIND_MMIO: /* NOTE: Only use when clearing MMIO ranges with aliased MMIO2 pages! */
{
STAM_COUNTER_INC(&pVM->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,PhysHandlerReset)); /**@Todo move out of switch */
PPGMRAMRANGE pRam = pgmPhysGetRange(pVM, GCPhys);
@@ -876,7 +935,7 @@ VMMDECL(int) PGMHandlerPhysicalReset(PVM pVM, RTGCPHYS GCPhys)
Assert(pRam->GCPhys <= pCur->Core.Key);
Assert(pRam->GCPhysLast >= pCur->Core.KeyLast);
- if (pCur->enmType == PGMPHYSHANDLERTYPE_MMIO)
+ if (pCurType->enmKind == PGMPHYSHANDLERKIND_MMIO)
{
/*
* Reset all the PGMPAGETYPE_MMIO2_ALIAS_MMIO pages first and that's it.
@@ -926,7 +985,7 @@ VMMDECL(int) PGMHandlerPhysicalReset(PVM pVM, RTGCPHYS GCPhys)
* Invalid.
*/
default:
- AssertMsgFailed(("Invalid type %d! Corruption!\n", pCur->enmType));
+ AssertMsgFailed(("Invalid type %d! Corruption!\n", pCurType->enmKind));
rc = VERR_PGM_PHYS_HANDLER_IPE;
break;
}
@@ -978,8 +1037,9 @@ VMMDECL(int) PGMHandlerPhysicalPageTempOff(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS G
Assert(!(pCur->Core.Key & PAGE_OFFSET_MASK));
Assert((pCur->Core.KeyLast & PAGE_OFFSET_MASK) == PAGE_OFFSET_MASK);
- AssertReturnStmt( pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
- || pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_ALL,
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ AssertReturnStmt( pCurType->enmKind == PGMPHYSHANDLERKIND_WRITE
+ || pCurType->enmKind == PGMPHYSHANDLERKIND_ALL,
pgmUnlock(pVM), VERR_ACCESS_DENIED);
/*
@@ -1051,8 +1111,8 @@ VMMDECL(int) PGMHandlerPhysicalPageTempOff(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS G
VMMDECL(int) PGMHandlerPhysicalPageAlias(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage, RTGCPHYS GCPhysPageRemap)
{
/// Assert(!IOMIsLockOwner(pVM)); /* We mustn't own any other locks when calling this */
-
pgmLock(pVM);
+
/*
* Lookup and validate the range.
*/
@@ -1062,7 +1122,8 @@ VMMDECL(int) PGMHandlerPhysicalPageAlias(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCP
if (RT_LIKELY( GCPhysPage >= pCur->Core.Key
&& GCPhysPage <= pCur->Core.KeyLast))
{
- AssertReturnStmt(pCur->enmType == PGMPHYSHANDLERTYPE_MMIO, pgmUnlock(pVM), VERR_ACCESS_DENIED);
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ AssertReturnStmt(pCurType->enmKind == PGMPHYSHANDLERKIND_MMIO, pgmUnlock(pVM), VERR_ACCESS_DENIED);
AssertReturnStmt(!(pCur->Core.Key & PAGE_OFFSET_MASK), pgmUnlock(pVM), VERR_INVALID_PARAMETER);
AssertReturnStmt((pCur->Core.KeyLast & PAGE_OFFSET_MASK) == PAGE_OFFSET_MASK, pgmUnlock(pVM), VERR_INVALID_PARAMETER);
@@ -1169,18 +1230,19 @@ VMMDECL(int) PGMHandlerPhysicalPageAlias(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCP
VMMDECL(int) PGMHandlerPhysicalPageAliasHC(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS GCPhysPage, RTHCPHYS HCPhysPageRemap)
{
/// Assert(!IOMIsLockOwner(pVM)); /* We mustn't own any other locks when calling this */
+ pgmLock(pVM);
/*
* Lookup and validate the range.
*/
- pgmLock(pVM);
PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)RTAvlroGCPhysGet(&pVM->pgm.s.CTX_SUFF(pTrees)->PhysHandlers, GCPhys);
if (RT_LIKELY(pCur))
{
if (RT_LIKELY( GCPhysPage >= pCur->Core.Key
&& GCPhysPage <= pCur->Core.KeyLast))
{
- AssertReturnStmt(pCur->enmType == PGMPHYSHANDLERTYPE_MMIO, pgmUnlock(pVM), VERR_ACCESS_DENIED);
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ AssertReturnStmt(pCurType->enmKind == PGMPHYSHANDLERKIND_MMIO, pgmUnlock(pVM), VERR_ACCESS_DENIED);
AssertReturnStmt(!(pCur->Core.Key & PAGE_OFFSET_MASK), pgmUnlock(pVM), VERR_INVALID_PARAMETER);
AssertReturnStmt((pCur->Core.KeyLast & PAGE_OFFSET_MASK) == PAGE_OFFSET_MASK, pgmUnlock(pVM), VERR_INVALID_PARAMETER);
@@ -1253,10 +1315,13 @@ VMMDECL(bool) PGMHandlerPhysicalIsRegistered(PVM pVM, RTGCPHYS GCPhys)
PPGMPHYSHANDLER pCur = pgmHandlerPhysicalLookup(pVM, GCPhys);
if (pCur)
{
+#ifdef VBOX_STRICT
Assert(GCPhys >= pCur->Core.Key && GCPhys <= pCur->Core.KeyLast);
- Assert( pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
- || pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_ALL
- || pCur->enmType == PGMPHYSHANDLERTYPE_MMIO);
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ Assert( pCurType->enmKind == PGMPHYSHANDLERKIND_WRITE
+ || pCurType->enmKind == PGMPHYSHANDLERKIND_ALL
+ || pCurType->enmKind == PGMPHYSHANDLERKIND_MMIO);
+#endif
pgmUnlock(pVM);
return true;
}
@@ -1286,14 +1351,15 @@ bool pgmHandlerPhysicalIsAll(PVM pVM, RTGCPHYS GCPhys)
AssertFailed();
return true;
}
- Assert( pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_WRITE
- || pCur->enmType == PGMPHYSHANDLERTYPE_PHYSICAL_ALL
- || pCur->enmType == PGMPHYSHANDLERTYPE_MMIO); /* sanity */
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ Assert( pCurType->enmKind == PGMPHYSHANDLERKIND_WRITE
+ || pCurType->enmKind == PGMPHYSHANDLERKIND_ALL
+ || pCurType->enmKind == PGMPHYSHANDLERKIND_MMIO); /* sanity */
/* Only whole pages can be disabled. */
Assert( pCur->Core.Key <= (GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK)
&& pCur->Core.KeyLast >= (GCPhys | PAGE_OFFSET_MASK));
- bool bRet = pCur->enmType != PGMPHYSHANDLERTYPE_PHYSICAL_WRITE;
+ bool bRet = pCurType->enmKind != PGMPHYSHANDLERKIND_WRITE;
pgmUnlock(pVM);
return bRet;
}
@@ -1723,7 +1789,8 @@ VMMDECL(unsigned) PGMAssertHandlerAndFlagsInSync(PVM pVM)
}
if (pPhys)
{
- unsigned uState = pgmHandlerPhysicalCalcState(pPhys);
+ PPGMPHYSHANDLERTYPEINT pPhysType = (PPGMPHYSHANDLERTYPEINT)MMHyperHeapOffsetToPtr(pVM, pPhys->hType);
+ unsigned uState = pPhysType->uState;
/* more? */
while (pPhys->Core.KeyLast < (State.GCPhys | PAGE_OFFSET_MASK))
@@ -1733,8 +1800,8 @@ VMMDECL(unsigned) PGMAssertHandlerAndFlagsInSync(PVM pVM)
if ( !pPhys2
|| pPhys2->Core.Key > (State.GCPhys | PAGE_OFFSET_MASK))
break;
- unsigned uState2 = pgmHandlerPhysicalCalcState(pPhys2);
- uState = RT_MAX(uState, uState2);
+ PPGMPHYSHANDLERTYPEINT pPhysType2 = (PPGMPHYSHANDLERTYPEINT)MMHyperHeapOffsetToPtr(pVM, pPhys2->hType);
+ uState = RT_MAX(uState, pPhysType2->uState);
pPhys = pPhys2;
}
@@ -1743,7 +1810,7 @@ VMMDECL(unsigned) PGMAssertHandlerAndFlagsInSync(PVM pVM)
&& PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_DISABLED)
{
AssertMsgFailed(("ram range vs phys handler flags mismatch. GCPhys=%RGp state=%d expected=%d %s\n",
- State.GCPhys, PGM_PAGE_GET_HNDL_PHYS_STATE(pPage), uState, pPhys->pszDesc));
+ State.GCPhys, PGM_PAGE_GET_HNDL_PHYS_STATE(pPage), uState, pPhysType->pszDesc));
State.cErrors++;
}
@@ -1755,7 +1822,7 @@ VMMDECL(unsigned) PGMAssertHandlerAndFlagsInSync(PVM pVM)
&& PGM_PAGE_GET_TYPE(pPage) != PGMPAGETYPE_ROM_SHADOW)
{
AssertMsgFailed(("ram range vs phys handler REM mismatch. GCPhys=%RGp state=%d %s\n",
- State.GCPhys, PGM_PAGE_GET_HNDL_PHYS_STATE(pPage), pPhys->pszDesc));
+ State.GCPhys, PGM_PAGE_GET_HNDL_PHYS_STATE(pPage), pPhysType->pszDesc));
State.cErrors++;
}
# endif
diff --git a/src/VBox/VMM/VMMAll/PGMAllPhys.cpp b/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
index c0f65bc..81e8156 100644
--- a/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
+++ b/src/VBox/VMM/VMMAll/PGMAllPhys.cpp
@@ -2117,9 +2117,8 @@ static int pgmPhysReadHandler(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, void *pv
Assert(GCPhys >= pPhys->Core.Key && GCPhys <= pPhys->Core.KeyLast);
Assert((pPhys->Core.Key & PAGE_OFFSET_MASK) == 0);
Assert((pPhys->Core.KeyLast & PAGE_OFFSET_MASK) == PAGE_OFFSET_MASK);
- Assert(pPhys->CTX_SUFF(pfnHandler));
- PFNPGMR3PHYSHANDLER pfnHandler = pPhys->CTX_SUFF(pfnHandler);
+ PFNPGMR3PHYSHANDLER pfnHandler = PGMPHYSHANDLER_GET_TYPE(pVM, pPhys)->CTX_SUFF(pfnHandler); Assert(pfnHandler);
void *pvUser = pPhys->CTX_SUFF(pvUser);
Log5(("pgmPhysReadHandler: GCPhys=%RGp cb=%#x pPage=%R[pgmpage] phys %s\n", GCPhys, cb, pPage, R3STRING(pPhys->pszDesc) ));
@@ -2353,7 +2352,7 @@ static int pgmPhysWriteHandler(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, void co
if (pCur)
{
Assert(GCPhys >= pCur->Core.Key && GCPhys <= pCur->Core.KeyLast);
- Assert(pCur->CTX_SUFF(pfnHandler));
+ Assert(PGMPHYSHANDLER_GET_TYPE(pVM, pCur)->CTX_SUFF(pfnHandler));
size_t cbRange = pCur->Core.KeyLast - GCPhys + 1;
if (cbRange > cbWrite)
@@ -2366,14 +2365,15 @@ static int pgmPhysWriteHandler(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, void co
return VERR_PGM_PHYS_WR_HIT_HANDLER;
#else /* IN_RING3 */
- Log5(("pgmPhysWriteHandler: GCPhys=%RGp cbRange=%#x pPage=%R[pgmpage] phys %s\n", GCPhys, cbRange, pPage, R3STRING(pCur->pszDesc) ));
+ Log5(("pgmPhysWriteHandler: GCPhys=%RGp cbRange=%#x pPage=%R[pgmpage] phys %s\n",
+ GCPhys, cbRange, pPage, R3STRING(pCur->pszDesc) ));
if (!PGM_PAGE_IS_MMIO_OR_SPECIAL_ALIAS(pPage))
rc = pgmPhysGCPhys2CCPtrInternal(pVM, pPage, GCPhys, &pvDst, &PgMpLck);
else
rc = VINF_SUCCESS;
if (RT_SUCCESS(rc))
{
- PFNPGMR3PHYSHANDLER pfnHandler = pCur->CTX_SUFF(pfnHandler);
+ PFNPGMR3PHYSHANDLER pfnHandler = PGMPHYSHANDLER_GET_TYPE(pVM, pCur)->CTX_SUFF(pfnHandler);
void *pvUser = pCur->CTX_SUFF(pvUser);
STAM_PROFILE_START(&pCur->Stat, h);
@@ -2395,7 +2395,8 @@ static int pgmPhysWriteHandler(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, void co
memcpy(pvDst, pvBuf, cbRange);
}
else
- AssertLogRelMsg(rc == VINF_SUCCESS || rc == VINF_PGM_HANDLER_DO_DEFAULT, ("rc=%Rrc GCPhys=%RGp pPage=%R[pgmpage] %s\n", rc, GCPhys, pPage, (pCur) ? pCur->pszDesc : ""));
+ AssertLogRelMsg(rc == VINF_SUCCESS || rc == VINF_PGM_HANDLER_DO_DEFAULT,
+ ("rc=%Rrc GCPhys=%RGp pPage=%R[pgmpage] %s\n", rc, GCPhys, pPage, pCur ? pCur->pszDesc : ""));
}
else
AssertLogRelMsgFailedReturn(("pgmPhysGCPhys2CCPtrInternal failed on %RGp / %R[pgmpage] -> %Rrc\n",
@@ -2594,7 +2595,7 @@ static int pgmPhysWriteHandler(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, void co
if (cbRange > offVirt)
cbRange = offVirt;
#ifdef IN_RING3
- PFNPGMR3PHYSHANDLER pfnHandler = pPhys->CTX_SUFF(pfnHandler);
+ PFNPGMR3PHYSHANDLER pfnHandler = PGMPHYSHANDLER_GET_TYPE(pVM, pPhys)->CTX_SUFF(pfnHandler);
void *pvUser = pPhys->CTX_SUFF(pvUser);
Log5(("pgmPhysWriteHandler: GCPhys=%RGp cbRange=%#x pPage=%R[pgmpage] phys %s\n", GCPhys, cbRange, pPage, R3STRING(pPhys->pszDesc) ));
@@ -2666,7 +2667,7 @@ static int pgmPhysWriteHandler(PVM pVM, PPGMPAGE pPage, RTGCPHYS GCPhys, void co
Log(("pgmPhysWriteHandler: overlapping phys and virt handlers at %RGp %R[pgmpage]; cbRange=%#x\n", GCPhys, pPage, cbRange));
Log5(("pgmPhysWriteHandler: GCPhys=%RGp cbRange=%#x pPage=%R[pgmpage] phys/virt %s/%s\n", GCPhys, cbRange, pPage, R3STRING(pPhys->pszDesc), R3STRING(pVirt->pszDesc) ));
- PFNPGMR3PHYSHANDLER pfnHandler = pPhys->CTX_SUFF(pfnHandler);
+ PFNPGMR3PHYSHANDLER pfnHandler = PGMPHYSHANDLER_GET_TYPE(pVM, pPhys)->CTX_SUFF(pfnHandler);
void *pvUser = pPhys->CTX_SUFF(pvUser);
STAM_PROFILE_START(&pPhys->Stat, h);
diff --git a/src/VBox/VMM/VMMAll/PGMAllPool.cpp b/src/VBox/VMM/VMMAll/PGMAllPool.cpp
index ba2e28b..12e9e39 100644
--- a/src/VBox/VMM/VMMAll/PGMAllPool.cpp
+++ b/src/VBox/VMM/VMMAll/PGMAllPool.cpp
@@ -2500,12 +2500,9 @@ static int pgmPoolMonitorInsert(PPGMPOOL pPool, PPGMPOOLPAGE pPage)
Assert(pPage->iMonitoredNext == NIL_PGMPOOL_IDX); Assert(pPage->iMonitoredPrev == NIL_PGMPOOL_IDX);
PVM pVM = pPool->CTX_SUFF(pVM);
const RTGCPHYS GCPhysPage = pPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK;
- rc = PGMHandlerPhysicalRegisterEx(pVM, PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
- GCPhysPage, GCPhysPage + PAGE_OFFSET_MASK,
- pPool->pfnAccessHandlerR3, MMHyperCCToR3(pVM, pPage),
- pPool->pfnAccessHandlerR0, MMHyperCCToR0(pVM, pPage),
- pPool->pfnAccessHandlerRC, MMHyperCCToRC(pVM, pPage),
- pPool->pszAccessHandler);
+ rc = PGMHandlerPhysicalRegister(pVM, GCPhysPage, GCPhysPage + PAGE_OFFSET_MASK, pPool->hAccessHandlerType,
+ MMHyperCCToR3(pVM, pPage), MMHyperCCToR0(pVM, pPage), MMHyperCCToRC(pVM, pPage),
+ NIL_RTR3PTR /*pszDesc*/);
/** @todo we should probably deal with out-of-memory conditions here, but for now increasing
* the heap size should suffice. */
AssertFatalMsgRC(rc, ("PGMHandlerPhysicalRegisterEx %RGp failed with %Rrc\n", GCPhysPage, rc));
@@ -2582,11 +2579,9 @@ static int pgmPoolMonitorFlush(PPGMPOOL pPool, PPGMPOOLPAGE pPage)
{
PPGMPOOLPAGE pNewHead = &pPool->aPages[pPage->iMonitoredNext];
pNewHead->iMonitoredPrev = NIL_PGMPOOL_IDX;
- rc = PGMHandlerPhysicalChangeCallbacks(pVM, pPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK,
- pPool->pfnAccessHandlerR3, MMHyperCCToR3(pVM, pNewHead),
- pPool->pfnAccessHandlerR0, MMHyperCCToR0(pVM, pNewHead),
- pPool->pfnAccessHandlerRC, MMHyperCCToRC(pVM, pNewHead),
- pPool->pszAccessHandler);
+ rc = PGMHandlerPhysicalChangeUserArgs(pVM, pPage->GCPhys & ~(RTGCPHYS)PAGE_OFFSET_MASK, MMHyperCCToR3(pVM, pNewHead),
+ MMHyperCCToR0(pVM, pNewHead), MMHyperCCToRC(pVM, pNewHead));
+
AssertFatalRCSuccess(rc);
pPage->iMonitoredNext = NIL_PGMPOOL_IDX;
}
diff --git a/src/VBox/VMM/VMMAll/REMAll.cpp b/src/VBox/VMM/VMMAll/REMAll.cpp
index 97498b4..2117464 100644
--- a/src/VBox/VMM/VMMAll/REMAll.cpp
+++ b/src/VBox/VMM/VMMAll/REMAll.cpp
@@ -132,16 +132,16 @@ static void remNotifyHandlerInsert(PVM pVM, PREMHANDLERNOTIFICATION pRec)
* Notification about a successful PGMR3HandlerPhysicalRegister() call.
*
* @param pVM Pointer to the VM.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhys Handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler have a HC callback function.
*/
-VMMDECL(void) REMNotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler)
+VMMDECL(void) REMNotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler)
{
REMHANDLERNOTIFICATION Rec;
Rec.enmKind = REMHANDLERNOTIFICATIONKIND_PHYSICAL_REGISTER;
- Rec.u.PhysicalRegister.enmType = enmType;
+ Rec.u.PhysicalRegister.enmKind = enmKind;
Rec.u.PhysicalRegister.GCPhys = GCPhys;
Rec.u.PhysicalRegister.cb = cb;
Rec.u.PhysicalRegister.fHasHCHandler = fHasHCHandler;
@@ -153,17 +153,17 @@ VMMDECL(void) REMNotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmTy
* Notification about a successful PGMR3HandlerPhysicalDeregister() operation.
*
* @param pVM Pointer to the VM.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhys Handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler have a HC callback function.
* @param fRestoreAsRAM Whether the to restore it as normal RAM or as unassigned memory.
*/
-VMMDECL(void) REMNotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
+VMMDECL(void) REMNotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
{
REMHANDLERNOTIFICATION Rec;
Rec.enmKind = REMHANDLERNOTIFICATIONKIND_PHYSICAL_DEREGISTER;
- Rec.u.PhysicalDeregister.enmType = enmType;
+ Rec.u.PhysicalDeregister.enmKind = enmKind;
Rec.u.PhysicalDeregister.GCPhys = GCPhys;
Rec.u.PhysicalDeregister.cb = cb;
Rec.u.PhysicalDeregister.fHasHCHandler = fHasHCHandler;
@@ -176,18 +176,18 @@ VMMDECL(void) REMNotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enm
* Notification about a successful PGMR3HandlerPhysicalModify() call.
*
* @param pVM Pointer to the VM.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhysOld Old handler range address.
* @param GCPhysNew New handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler have a HC callback function.
* @param fRestoreAsRAM Whether the to restore it as normal RAM or as unassigned memory.
*/
-VMMDECL(void) REMNotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
+VMMDECL(void) REMNotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
{
REMHANDLERNOTIFICATION Rec;
Rec.enmKind = REMHANDLERNOTIFICATIONKIND_PHYSICAL_MODIFY;
- Rec.u.PhysicalModify.enmType = enmType;
+ Rec.u.PhysicalModify.enmKind = enmKind;
Rec.u.PhysicalModify.GCPhysOld = GCPhysOld;
Rec.u.PhysicalModify.GCPhysNew = GCPhysNew;
Rec.u.PhysicalModify.cb = cb;
diff --git a/src/VBox/VMM/VMMR0/HMR0A.asm b/src/VBox/VMM/VMMR0/HMR0A.asm
index 1474a7a..9d92569 100644
--- a/src/VBox/VMM/VMMR0/HMR0A.asm
+++ b/src/VBox/VMM/VMMR0/HMR0A.asm
@@ -4,7 +4,7 @@
;
;
-; Copyright (C) 2006-2013 Oracle Corporation
+; Copyright (C) 2006-2015 Oracle Corporation
;
; This file is part of VirtualBox Open Source Edition (OSE), as
; available from http://www.virtualbox.org. This file is free software;
@@ -22,6 +22,7 @@
%include "VBox/err.mac"
%include "VBox/vmm/hm_vmx.mac"
%include "VBox/vmm/cpum.mac"
+%include "VBox/vmm/vm.mac"
%include "iprt/x86.mac"
%include "HMInternal.mac"
@@ -1409,7 +1410,7 @@ ENDPROC HMR0SVMRunWrapXMM
; restoring, but better safe than sorry...
;
-; DECLASM(int) VMXR0StartVM32(RTHCUINT fResume, PCPUMCTX pCtx, PVMCSCACHE pCache /*, PVM pVM, PVMCPU pVCpu*/);
+; DECLASM(int) VMXR0StartVM32(RTHCUINT fResume, PCPUMCTX pCtx, PVMCSCACHE pCache, PVM pVM, PVMCPU pVCpu);
ALIGNCODE(16)
BEGINPROC VMXR0StartVM32
cmp byte [NAME(g_fVMXIs64bitHost)], 0
@@ -1432,6 +1433,8 @@ BITS 64
mov edi, [rsp + 20h + 14h] ; fResume
mov esi, [rsp + 20h + 18h] ; pCtx
mov edx, [rsp + 20h + 1Ch] ; pCache
+ mov ecx, [rsp + 20h + 20h] ; pVM
+ mov r8, [rsp + 20h + 24h] ; pVCpu
call NAME(VMXR0StartVM32_64)
add esp, 20h
jmp far [.fpthunk32 wrt rip]
@@ -1449,7 +1452,7 @@ ALIGNCODE(16)
ENDPROC VMXR0StartVM32
-; DECLASM(int) VMXR0StartVM64(RTHCUINT fResume, PCPUMCTX pCtx, PVMCSCACHE pCache /*, PVM pVM, PVMCPU pVCpu*/);
+; DECLASM(int) VMXR0StartVM64(RTHCUINT fResume, PCPUMCTX pCtx, PVMCSCACHE pCache, PVM pVM, PVMCPU pVCpu);
ALIGNCODE(16)
BEGINPROC VMXR0StartVM64
cmp byte [NAME(g_fVMXIs64bitHost)], 0
@@ -1472,6 +1475,8 @@ BITS 64
mov edi, [rsp + 20h + 14h] ; fResume
mov esi, [rsp + 20h + 18h] ; pCtx
mov edx, [rsp + 20h + 1Ch] ; pCache
+ mov ecx, [rsp + 20h + 20h] ; pVM
+ mov r8, [rsp + 20h + 24h] ; pVCpu
call NAME(VMXR0StartVM64_64)
add esp, 20h
jmp far [.fpthunk32 wrt rip]
@@ -1492,7 +1497,7 @@ ALIGNCODE(16)
ret
ENDPROC VMXR0StartVM64
-;DECLASM(int) SVMR0VMRun(RTHCPHYS pVMCBHostPhys, RTHCPHYS pVMCBPhys, PCPUMCTX pCtx /*, PVM pVM, PVMCPU pVCpu*/);
+;DECLASM(int) SVMR0VMRun(RTHCPHYS pVMCBHostPhys, RTHCPHYS pVMCBPhys, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu);
ALIGNCODE(16)
BEGINPROC SVMR0VMRun
cmp byte [NAME(g_fVMXIs64bitHost)], 0
@@ -1515,6 +1520,8 @@ BITS 64
mov rdi, [rsp + 20h + 14h] ; pVMCBHostPhys
mov rsi, [rsp + 20h + 1Ch] ; pVMCBPhys
mov edx, [rsp + 20h + 24h] ; pCtx
+ mov ecx, [rsp + 20h + 28h] ; pVM
+ mov r8d, [rsp + 20h + 2Ch] ; pVCpu
call NAME(SVMR0VMRun_64)
add esp, 20h
jmp far [.fpthunk32 wrt rip]
@@ -1532,7 +1539,7 @@ ALIGNCODE(16)
ENDPROC SVMR0VMRun
-; DECLASM(int) SVMR0VMRun64(RTHCPHYS pVMCBHostPhys, RTHCPHYS pVMCBPhys, PCPUMCTX pCtx /*, PVM pVM, PVMCPU pVCpu*/);
+; DECLASM(int) SVMR0VMRun64(RTHCPHYS pVMCBHostPhys, RTHCPHYS pVMCBPhys, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu);
ALIGNCODE(16)
BEGINPROC SVMR0VMRun64
cmp byte [NAME(g_fVMXIs64bitHost)], 0
@@ -1552,9 +1559,11 @@ ALIGNCODE(16)
BITS 64
.thunk64:
sub esp, 20h
- mov rdi, [rbp + 20h + 14h] ; pVMCBHostPhys
- mov rsi, [rbp + 20h + 1Ch] ; pVMCBPhys
- mov edx, [rbp + 20h + 24h] ; pCtx
+ mov rdi, [rsp + 20h + 14h] ; pVMCBHostPhys
+ mov rsi, [rsp + 20h + 1Ch] ; pVMCBPhys
+ mov edx, [rsp + 20h + 24h] ; pCtx
+ mov ecx, [rsp + 20h + 28h] ; pVM
+ mov r8d, [rsp + 20h + 2Ch] ; pVCpu
call NAME(SVMR0VMRun64_64)
add esp, 20h
jmp far [.fpthunk32 wrt rip]
diff --git a/src/VBox/VMM/VMMR0/HMR0Mixed.mac b/src/VBox/VMM/VMMR0/HMR0Mixed.mac
index fb1cece..fe79bb8 100644
--- a/src/VBox/VMM/VMMR0/HMR0Mixed.mac
+++ b/src/VBox/VMM/VMMR0/HMR0Mixed.mac
@@ -123,19 +123,30 @@ ALIGN(16)
; Restore segment registers.
MYPOPSEGS xAX, ax
+ ; Restore the host XCR0 if necessary.
+ pop xCX
+ test ecx, ecx
+ jnz %%xcr0_after_skip
+ pop xAX
+ pop xDX
+ xsetbv ; ecx is already zero.
+%%xcr0_after_skip:
+
; Restore general purpose registers.
MYPOPAD
%endmacro
-;/**
-; * Prepares for and executes VMLAUNCH/VMRESUME (32 bits guest mode)
-; *
-; * @returns VBox status code
-; * @param fResume x86:[ebp+8], msc:rcx,gcc:rdi Whether to use vmlauch/vmresume.
-; * @param pCtx x86:[ebp+c], msc:rdx,gcc:rsi Pointer to the guest-CPU context.
-; * @param pCache x86:[esp+10],msc:r8, gcc:rdx Pointer to the VMCS cache.
-; */
+;;
+; Prepares for and executes VMLAUNCH/VMRESUME (32 bits guest mode)
+;
+; @returns VBox status code
+; @param fResume x86:[ebp+8], msc:rcx,gcc:rdi Whether to use vmlauch/vmresume.
+; @param pCtx x86:[ebp+c], msc:rdx,gcc:rsi Pointer to the guest-CPU context.
+; @param pCache x86:[ebp+10],msc:r8, gcc:rdx Pointer to the VMCS cache.
+; @param pVM x86:[ebp+14],msc:r9, gcc:rcx Pointer to the cross context VM structure.
+; @param pVCpu x86:[ebp+18],msc:[ebp+30],gcc:r8 Pointer to the cross context VMCPU structure.
+;
ALIGNCODE(16)
BEGINPROC MY_NAME(VMXR0StartVM32)
push xBP
@@ -144,10 +155,14 @@ BEGINPROC MY_NAME(VMXR0StartVM32)
pushf
cli
+ ;
; Save all general purpose host registers.
+ ;
MYPUSHAD
- ; First we have to save some final CPU context registers.
+ ;
+ ; First we have to write some final guest CPU context registers.
+ ;
mov eax, VMX_VMCS_HOST_RIP
%ifdef RT_ARCH_AMD64
lea r10, [.vmlaunch_done wrt rip]
@@ -158,7 +173,9 @@ BEGINPROC MY_NAME(VMXR0StartVM32)
%endif
; Note: assumes success!
- ; Save guest-CPU context pointer.
+ ;
+ ; Unify input parameter registers.
+ ;
%ifdef RT_ARCH_AMD64
%ifdef ASM_CALL64_GCC
; fResume already in rdi
@@ -175,8 +192,41 @@ BEGINPROC MY_NAME(VMXR0StartVM32)
mov ebx, [ebp + 16] ; pCache
%endif
+ ;
+ ; Save the host XCR0 and load the guest one if necessary.
+ ; Note! Trashes rdx and rcx.
+ ;
+%ifdef ASM_CALL64_MSC
+ mov rax, [xBP + 30h] ; pVCpu
+%elifdef ASM_CALL64_GCC
+ mov rax, r8 ; pVCpu
+%else
+ mov eax, [xBP + 18h] ; pVCpu
+%endif
+ test byte [xAX + VMCPU.hm + HMCPU.fLoadSaveGuestXcr0], 1
+ jz .xcr0_before_skip
+
+ xor ecx, ecx
+ xgetbv ; Save the host one on the stack.
+ push xDX
+ push xAX
+
+ mov eax, [xSI + CPUMCTX.aXcr] ; Load the guest one.
+ mov edx, [xSI + CPUMCTX.aXcr + 4]
+ xor ecx, ecx ; paranoia
+ xsetbv
+
+ push 0 ; Indicate that we must restore XCR0 (popped into ecx, thus 0).
+ jmp .xcr0_before_done
+
+.xcr0_before_skip:
+ push 3fh ; indicate that we need not.
+.xcr0_before_done:
+
+ ;
; Save segment registers.
- ; Note: MYPUSHSEGS trashes rdx & rcx, so we moved it here (msvc amd64 case).
+ ; Note! Trashes rdx & rcx, so we moved it here (amd64 case).
+ ;
MYPUSHSEGS xAX, ax
%ifdef VMX_USE_CACHED_VMCS_ACCESSES
@@ -381,19 +431,30 @@ ALIGN(16)
; Restore segment registers.
MYPOPSEGS xAX, ax
+ ; Restore the host XCR0 if necessary.
+ pop xCX
+ test ecx, ecx
+ jnz %%xcr0_after_skip
+ pop xAX
+ pop xDX
+ xsetbv ; ecx is already zero.
+%%xcr0_after_skip:
+
; Restore general purpose registers.
MYPOPAD
%endmacro
-;/**
-; * Prepares for and executes VMLAUNCH/VMRESUME (64 bits guest mode)
-; *
-; * @returns VBox status code
-; * @param fResume msc:rcx, gcc:rdi Whether to use vmlauch/vmresume.
-; * @param pCtx msc:rdx, gcc:rsi Pointer to the guest-CPU context.
-; * @param pCache msc:r8, gcc:rdx Pointer to the VMCS cache.
-; */
+;;
+; Prepares for and executes VMLAUNCH/VMRESUME (64 bits guest mode)
+;
+; @returns VBox status code
+; @param fResume msc:rcx, gcc:rdi Whether to use vmlauch/vmresume.
+; @param pCtx msc:rdx, gcc:rsi Pointer to the guest-CPU context.
+; @param pCache msc:r8, gcc:rdx Pointer to the VMCS cache.
+; @param pVM msc:r9, gcc:rcx Pointer to the cross context VM structure.
+; @param pVCpu msc:[ebp+30], gcc:r8 Pointer to the cross context VMCPU structure.
+;
ALIGNCODE(16)
BEGINPROC MY_NAME(VMXR0StartVM64)
push xBP
@@ -411,7 +472,9 @@ BEGINPROC MY_NAME(VMXR0StartVM64)
vmwrite rax, r10
; Note: assumes success!
- ; Save guest-CPU context pointer.
+ ;
+ ; Unify the input parameter registers.
+ ;
%ifdef ASM_CALL64_GCC
; fResume already in rdi
; pCtx already in rsi
@@ -422,8 +485,39 @@ BEGINPROC MY_NAME(VMXR0StartVM64)
mov rbx, r8 ; pCache
%endif
+ ;
+ ; Save the host XCR0 and load the guest one if necessary.
+ ; Note! Trashes rdx and rcx.
+ ;
+%ifdef ASM_CALL64_MSC
+ mov rax, [xBP + 30h] ; pVCpu
+%else
+ mov rax, r8 ; pVCpu
+%endif
+ test byte [xAX + VMCPU.hm + HMCPU.fLoadSaveGuestXcr0], 1
+ jz .xcr0_before_skip
+
+ xor ecx, ecx
+ xgetbv ; Save the host one on the stack.
+ push xDX
+ push xAX
+
+ mov eax, [xSI + CPUMCTX.aXcr] ; Load the guest one.
+ mov edx, [xSI + CPUMCTX.aXcr + 4]
+ xor ecx, ecx ; paranoia
+ xsetbv
+
+ push 0 ; Indicate that we must restore XCR0 (popped into ecx, thus 0).
+ jmp .xcr0_before_done
+
+.xcr0_before_skip:
+ push 3fh ; indicate that we need not.
+.xcr0_before_done:
+
+ ;
; Save segment registers.
- ; Note: MYPUSHSEGS trashes rdx & rcx, so we moved it here (msvc amd64 case).
+ ; Note! Trashes rdx & rcx, so we moved it here (amd64 case).
+ ;
MYPUSHSEGS xAX, ax
%ifdef VMX_USE_CACHED_VMCS_ACCESSES
@@ -546,25 +640,32 @@ ENDPROC MY_NAME(VMXR0StartVM64)
%endif ; RT_ARCH_AMD64
-;/**
-; * Prepares for and executes VMRUN (32 bits guests)
-; *
-; * @returns VBox status code
-; * @param HCPhysVMCB Physical address of host VMCB.
-; * @param HCPhysVMCB Physical address of guest VMCB.
-; * @param pCtx Pointer to the guest CPU-context.
-; */
+;;
+; Prepares for and executes VMRUN (32 bits guests)
+;
+; @returns VBox status code
+; @param HCPhysVMCB Physical address of host VMCB.
+; @param HCPhysVMCB Physical address of guest VMCB.
+; @param pCtx Pointer to the guest CPU-context.
+; @param pVM msc:r9, gcc:rcx Pointer to the cross context VM structure.
+; @param pVCpu msc:[rsp+28],gcc:r8 Pointer to the cross context VMCPU structure.
+;
ALIGNCODE(16)
BEGINPROC MY_NAME(SVMR0VMRun)
%ifdef RT_ARCH_AMD64 ; fake a cdecl stack frame
%ifdef ASM_CALL64_GCC
+ push r8
+ push rcx
push rdx
push rsi
push rdi
%else
- push r8
- push rdx
- push rcx
+ mov rax, [rsp + 28h]
+ push rax ; pVCpu
+ push r9 ; pVM
+ push r8 ; pCtx
+ push rdx ; HCPHYSGuestVMCB
+ push rcx ; HCPhysHostVMCB
%endif
push 0
%endif
@@ -572,12 +673,45 @@ BEGINPROC MY_NAME(SVMR0VMRun)
mov xBP, xSP
pushf
+ ;
; Save all general purpose host registers.
+ ;
MYPUSHAD
- ; Save guest CPU-context pointer.
+ ;
+ ; Load pCtx into xSI.
+ ;
+ mov xSI, [xBP + xCB * 2 + RTHCPHYS_CB * 2] ; pCtx
+
+ ;
+ ; Save the host XCR0 and load the guest one if necessary.
+ ;
+ mov xAX, [xBP + xCB * 2 + RTHCPHYS_CB * 2 + xCB * 2] ; pVCpu
+ test byte [xAX + VMCPU.hm + HMCPU.fLoadSaveGuestXcr0], 1
+ jz .xcr0_before_skip
+
+ xor ecx, ecx
+ xgetbv ; Save the host one on the stack.
+ push xDX
+ push xAX
+
mov xSI, [xBP + xCB * 2 + RTHCPHYS_CB * 2] ; pCtx
- push xSI ; push for saving the state at the end
+ mov eax, [xSI + CPUMCTX.aXcr] ; Load the guest one.
+ mov edx, [xSI + CPUMCTX.aXcr + 4]
+ xor ecx, ecx ; paranoia
+ xsetbv
+
+ push 0 ; Indicate that we must restore XCR0 (popped into ecx, thus 0).
+ jmp .xcr0_before_done
+
+.xcr0_before_skip:
+ push 3fh ; indicate that we need not.
+.xcr0_before_done:
+
+ ;
+ ; Save guest CPU-context pointer for simplifying saving of the GPRs afterwards.
+ ;
+ push xSI
; Save host fs, gs, sysenter msr etc.
mov xAX, [xBP + xCB * 2] ; pVMCBHostPhys (64 bits physical address; x86: take low dword only)
@@ -618,7 +752,10 @@ BEGINPROC MY_NAME(SVMR0VMRun)
cli
stgi
- pop xAX ; pCtx
+ ;
+ ; Pop the context pointer (pushed above) and save the guest GPRs (sans RSP and RAX).
+ ;
+ pop xAX
mov [ss:xAX + CPUMCTX.ebx], ebx
mov [ss:xAX + CPUMCTX.ecx], ecx
@@ -627,7 +764,20 @@ BEGINPROC MY_NAME(SVMR0VMRun)
mov [ss:xAX + CPUMCTX.edi], edi
mov [ss:xAX + CPUMCTX.ebp], ebp
+ ;
+ ; Restore the host xcr0 if necessary.
+ ;
+ pop xCX
+ test ecx, ecx
+ jnz .xcr0_after_skip
+ pop xAX
+ pop xDX
+ xsetbv ; ecx is already zero.
+.xcr0_after_skip:
+
+ ;
; Restore host general purpose registers.
+ ;
MYPOPAD
mov eax, VINF_SUCCESS
@@ -635,34 +785,41 @@ BEGINPROC MY_NAME(SVMR0VMRun)
popf
pop xBP
%ifdef RT_ARCH_AMD64
- add xSP, 4*xCB
+ add xSP, 6*xCB
%endif
ret
ENDPROC MY_NAME(SVMR0VMRun)
%ifdef RT_ARCH_AMD64
-;/**
-; * Prepares for and executes VMRUN (64 bits guests)
-; *
-; * @returns VBox status code
-; * @param HCPhysVMCB Physical address of host VMCB.
-; * @param HCPhysVMCB Physical address of guest VMCB.
-; * @param pCtx Pointer to the guest-CPU context.
-; */
+;;
+; Prepares for and executes VMRUN (64 bits guests)
+;
+; @returns VBox status code
+; @param HCPhysVMCB Physical address of host VMCB.
+; @param HCPhysVMCB Physical address of guest VMCB.
+; @param pCtx Pointer to the guest-CPU context.
+; @param pVM msc:r9, gcc:rcx Pointer to the cross context VM structure.
+; @param pVCpu msc:[rsp+28],gcc:r8 Pointer to the cross context VMCPU structure.
+;
ALIGNCODE(16)
BEGINPROC MY_NAME(SVMR0VMRun64)
; Fake a cdecl stack frame
%ifdef ASM_CALL64_GCC
+ push r8
+ push rcx
push rdx
push rsi
push rdi
%else
- push r8
- push rdx
- push rcx
+ mov rax, [rsp + 28h]
+ push rax ; rbp + 30h pVCpu
+ push r9 ; rbp + 28h pVM
+ push r8 ; rbp + 20h pCtx
+ push rdx ; rbp + 18h HCPHYSGuestVMCB
+ push rcx ; rbp + 10h HCPhysHostVMCB
%endif
- push 0
- push rbp
+ push 0 ; rbp + 08h "fake ret addr"
+ push rbp ; rbp + 00h
mov rbp, rsp
pushf
@@ -676,14 +833,49 @@ BEGINPROC MY_NAME(SVMR0VMRun64)
; - DR7 (reset to 0x400)
;
+ ;
; Save all general purpose host registers.
+ ;
MYPUSHAD
- ; Save guest CPU-context pointer.
- mov rsi, [rbp + xCB * 2 + RTHCPHYS_CB * 2] ; pCtx
- push rsi ; push for saving the state at the end
+ ;
+ ; Load pCtx into xSI.
+ ;
+ mov xSI, [rbp + xCB * 2 + RTHCPHYS_CB * 2]
+
+ ;
+ ; Save the host XCR0 and load the guest one if necessary.
+ ;
+ mov rax, [xBP + 30h] ; pVCpu
+ test byte [xAX + VMCPU.hm + HMCPU.fLoadSaveGuestXcr0], 1
+ jz .xcr0_before_skip
+
+ xor ecx, ecx
+ xgetbv ; Save the host one on the stack.
+ push xDX
+ push xAX
+
+ mov xSI, [xBP + xCB * 2 + RTHCPHYS_CB * 2] ; pCtx
+ mov eax, [xSI + CPUMCTX.aXcr] ; Load the guest one.
+ mov edx, [xSI + CPUMCTX.aXcr + 4]
+ xor ecx, ecx ; paranoia
+ xsetbv
+
+ push 0 ; Indicate that we must restore XCR0 (popped into ecx, thus 0).
+ jmp .xcr0_before_done
+
+.xcr0_before_skip:
+ push 3fh ; indicate that we need not.
+.xcr0_before_done:
+
+ ;
+ ; Save guest CPU-context pointer for simplifying saving of the GPRs afterwards.
+ ;
+ push rsi
+ ;
; Save host fs, gs, sysenter msr etc.
+ ;
mov rax, [rbp + xCB * 2] ; pVMCBHostPhys (64 bits physical address; x86: take low dword only)
push rax ; Save for the vmload after vmrun
vmsave
@@ -722,15 +914,22 @@ BEGINPROC MY_NAME(SVMR0VMRun64)
; Save guest fs, gs, sysenter msr etc.
vmsave
+ ;
; Load host fs, gs, sysenter msr etc.
+ ;
pop rax ; pushed above
vmload
+ ;
; Set the global interrupt flag again, but execute cli to make sure IF=0.
+ ;
cli
stgi
- pop rax ; pCtx
+ ;
+ ; Pop the context pointer (pushed above) and save the guest GPRs (sans RSP and RAX).
+ ;
+ pop rax
mov qword [rax + CPUMCTX.ebx], rbx
mov qword [rax + CPUMCTX.ecx], rcx
@@ -747,14 +946,27 @@ BEGINPROC MY_NAME(SVMR0VMRun64)
mov qword [rax + CPUMCTX.r14], r14
mov qword [rax + CPUMCTX.r15], r15
+ ;
+ ; Restore the host xcr0 if necessary.
+ ;
+ pop xCX
+ test ecx, ecx
+ jnz .xcr0_after_skip
+ pop xAX
+ pop xDX
+ xsetbv ; ecx is already zero.
+.xcr0_after_skip:
+
+ ;
; Restore host general purpose registers.
+ ;
MYPOPAD
mov eax, VINF_SUCCESS
popf
pop rbp
- add rsp, 4 * xCB
+ add rsp, 6 * xCB
ret
ENDPROC MY_NAME(SVMR0VMRun64)
%endif ; RT_ARCH_AMD64
diff --git a/src/VBox/VMM/VMMR0/HMSVMR0.cpp b/src/VBox/VMM/VMMR0/HMSVMR0.cpp
index dfd1a7e..38c188b 100644
--- a/src/VBox/VMM/VMMR0/HMSVMR0.cpp
+++ b/src/VBox/VMM/VMMR0/HMSVMR0.cpp
@@ -22,14 +22,15 @@
#include <iprt/asm-amd64-x86.h>
#include <iprt/thread.h>
-#include "HMInternal.h"
-#include <VBox/vmm/vm.h>
-#include "HMSVMR0.h"
#include <VBox/vmm/pdmapi.h>
#include <VBox/vmm/dbgf.h>
+#include <VBox/vmm/iem.h>
#include <VBox/vmm/iom.h>
#include <VBox/vmm/tm.h>
#include <VBox/vmm/gim.h>
+#include "HMInternal.h"
+#include <VBox/vmm/vm.h>
+#include "HMSVMR0.h"
#include "dtrace/VBoxVMM.h"
#ifdef DEBUG_ramshankar
@@ -287,6 +288,7 @@ static FNSVMEXITHANDLER hmR0SvmExitSetPendingXcptUD;
static FNSVMEXITHANDLER hmR0SvmExitMsr;
static FNSVMEXITHANDLER hmR0SvmExitReadDRx;
static FNSVMEXITHANDLER hmR0SvmExitWriteDRx;
+static FNSVMEXITHANDLER hmR0SvmExitXsetbv;
static FNSVMEXITHANDLER hmR0SvmExitIOInstr;
static FNSVMEXITHANDLER hmR0SvmExitNestedPF;
static FNSVMEXITHANDLER hmR0SvmExitVIntr;
@@ -723,7 +725,8 @@ VMMR0DECL(int) SVMR0SetupVM(PVM pVM)
| SVM_CTRL2_INTERCEPT_SKINIT /* SKINIT causes a #VMEXIT. */
| SVM_CTRL2_INTERCEPT_WBINVD /* WBINVD causes a #VMEXIT. */
| SVM_CTRL2_INTERCEPT_MONITOR /* MONITOR causes a #VMEXIT. */
- | SVM_CTRL2_INTERCEPT_MWAIT; /* MWAIT causes a #VMEXIT. */
+ | SVM_CTRL2_INTERCEPT_MWAIT /* MWAIT causes a #VMEXIT. */
+ | SVM_CTRL2_INTERCEPT_XSETBV; /* XSETBV causes a #VMEXIT. */
/* CR0, CR4 reads must be intercepted, our shadow values are not necessarily the same as the guest's. */
pVmcb->ctrl.u16InterceptRdCRx = RT_BIT(0) | RT_BIT(4);
@@ -1025,13 +1028,17 @@ static void hmR0SvmFlushTaggedTlb(PVMCPU pVCpu)
*/
DECLASM(int) SVMR0VMSwitcherRun64(RTHCPHYS HCPhysVmcbHost, RTHCPHYS HCPhysVmcb, PCPUMCTX pCtx, PVM pVM, PVMCPU pVCpu)
{
- uint32_t aParam[4];
+ uint32_t aParam[8];
aParam[0] = (uint32_t)(HCPhysVmcbHost); /* Param 1: HCPhysVmcbHost - Lo. */
aParam[1] = (uint32_t)(HCPhysVmcbHost >> 32); /* Param 1: HCPhysVmcbHost - Hi. */
aParam[2] = (uint32_t)(HCPhysVmcb); /* Param 2: HCPhysVmcb - Lo. */
aParam[3] = (uint32_t)(HCPhysVmcb >> 32); /* Param 2: HCPhysVmcb - Hi. */
+ aParam[4] = VM_RC_ADDR(pVM, pVM);
+ aParam[5] = 0;
+ aParam[6] = VM_RC_ADDR(pVM, pVCpu);
+ aParam[7] = 0;
- return SVMR0Execute64BitsHandler(pVM, pVCpu, pCtx, HM64ON32OP_SVMRCVMRun64, 4, &aParam[0]);
+ return SVMR0Execute64BitsHandler(pVM, pVCpu, pCtx, HM64ON32OP_SVMRCVMRun64, RT_ELEMENTS(aParam), &aParam[0]);
}
@@ -1043,11 +1050,11 @@ DECLASM(int) SVMR0VMSwitcherRun64(RTHCPHYS HCPhysVmcbHost, RTHCPHYS HCPhysVmcb,
* @param pVCpu Pointer to the VMCPU.
* @param pCtx Pointer to the guest-CPU context.
* @param enmOp The operation to perform.
- * @param cbParam Number of parameters.
+ * @param cParams Number of parameters.
* @param paParam Array of 32-bit parameters.
*/
-VMMR0DECL(int) SVMR0Execute64BitsHandler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, HM64ON32OP enmOp, uint32_t cbParam,
- uint32_t *paParam)
+VMMR0DECL(int) SVMR0Execute64BitsHandler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, HM64ON32OP enmOp,
+ uint32_t cParams, uint32_t *paParam)
{
AssertReturn(pVM->hm.s.pfnHost32ToGuest64R0, VERR_HM_NO_32_TO_64_SWITCHER);
Assert(enmOp > HM64ON32OP_INVALID && enmOp < HM64ON32OP_END);
@@ -1062,7 +1069,7 @@ VMMR0DECL(int) SVMR0Execute64BitsHandler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, H
CPUMSetHyperESP(pVCpu, VMMGetStackRC(pVCpu));
CPUMSetHyperEIP(pVCpu, enmOp);
- for (int i = (int)cbParam - 1; i >= 0; i--)
+ for (int i = (int)cParams - 1; i >= 0; i--)
CPUMPushHyper(pVCpu, paParam[i]);
STAM_PROFILE_ADV_START(&pVCpu->hm.s.StatWorldSwitch3264, z);
@@ -1244,6 +1251,7 @@ static int hmR0SvmLoadGuestControlRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pC
/*
* Guest CR4.
+ * ASSUMES this is done everytime we get in from ring-3! (XCR0)
*/
if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR4))
{
@@ -1284,6 +1292,10 @@ static int hmR0SvmLoadGuestControlRegs(PVMCPU pVCpu, PSVMVMCB pVmcb, PCPUMCTX pC
pVmcb->guest.u64CR4 = u64GuestCR4;
pVmcb->ctrl.u64VmcbCleanBits &= ~HMSVM_VMCB_CLEAN_CRX_EFER;
+
+ /* Whether to save/load/restore XCR0 during world switch depends on CR4.OSXSAVE and host+guest XCR0. */
+ pVCpu->hm.s.fLoadSaveGuestXcr0 = (u64GuestCR4 & X86_CR4_OSXSAVE) && pCtx->aXcr[0] != ASMGetXcr0();
+
HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR4);
}
@@ -2110,7 +2122,7 @@ static void hmR0SvmLeave(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
*/
static int hmR0SvmLeaveSession(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
{
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
Assert(!VMMRZCallRing3IsEnabled(pVCpu));
Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
@@ -2133,7 +2145,7 @@ static int hmR0SvmLeaveSession(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
/* Leave HM context. This takes care of local init (term). */
int rc = HMR0LeaveCpu(pVCpu);
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
return rc;
}
@@ -2175,7 +2187,7 @@ DECLCALLBACK(int) hmR0SvmCallRing3Callback(PVMCPU pVCpu, VMMCALLRING3 enmOperati
*/
VMMRZCallRing3RemoveNotification(pVCpu);
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
/* Restore host FPU state if necessary and resync on next R0 reentry .*/
if (CPUMIsGuestFPUStateActive(pVCpu))
@@ -2190,7 +2202,7 @@ DECLCALLBACK(int) hmR0SvmCallRing3Callback(PVMCPU pVCpu, VMMCALLRING3 enmOperati
/* Leave HM context. This takes care of local init (term). */
HMR0LeaveCpu(pVCpu);
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
return VINF_SUCCESS;
}
@@ -3578,6 +3590,9 @@ DECLINLINE(int) hmR0SvmHandleExit(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSv
case SVM_EXIT_WRITE_DR14: case SVM_EXIT_WRITE_DR15:
return hmR0SvmExitWriteDRx(pVCpu, pCtx, pSvmTransient);
+ case SVM_EXIT_XSETBV:
+ return hmR0SvmExitXsetbv(pVCpu, pCtx, pSvmTransient);
+
case SVM_EXIT_TASK_SWITCH:
return hmR0SvmExitTaskSwitch(pVCpu, pCtx, pSvmTransient);
@@ -4659,13 +4674,13 @@ HMSVM_EXIT_DECL hmR0SvmExitReadDRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pS
/* We're playing with the host CPU state here, make sure we don't preempt or longjmp. */
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
/* Save the host & load the guest debug state, restart execution of the MOV DRx instruction. */
CPUMR0LoadGuestDebugState(pVCpu, false /* include DR6 */);
Assert(CPUMIsGuestDebugStateActive(pVCpu) || HC_ARCH_BITS == 32);
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
STAM_COUNTER_INC(&pVCpu->hm.s.StatDRxContextSwitch);
@@ -4706,6 +4721,25 @@ HMSVM_EXIT_DECL hmR0SvmExitWriteDRx(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT p
/**
+ * #VMEXIT handler for XCRx write (SVM_EXIT_XSETBV). Conditional #VMEXIT.
+ */
+HMSVM_EXIT_DECL hmR0SvmExitXsetbv(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient)
+{
+ HMSVM_VALIDATE_EXIT_HANDLER_PARAMS();
+
+ /** @todo decode assists... */
+ VBOXSTRICTRC rcStrict = IEMExecOne(pVCpu);
+ if (rcStrict == VINF_IEM_RAISED_XCPT)
+ HMCPU_CF_SET(pVCpu, HM_CHANGED_ALL_GUEST);
+
+ pVCpu->hm.s.fLoadSaveGuestXcr0 = (pCtx->cr4 & X86_CR4_OSXSAVE) && pCtx->aXcr[0] != ASMGetXcr0();
+
+ HMSVM_CHECK_SINGLE_STEP(pVCpu, rcStrict);
+ return VBOXSTRICTRC_TODO(rcStrict);
+}
+
+
+/**
* #VMEXIT handler for I/O instructions (SVM_EXIT_IOIO). Conditional #VMEXIT.
*/
HMSVM_EXIT_DECL hmR0SvmExitIOInstr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSvmTransient)
@@ -4812,7 +4846,7 @@ HMSVM_EXIT_DECL hmR0SvmExitIOInstr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pS
{
/* We're playing with the host CPU state here, make sure we don't preempt or longjmp. */
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
STAM_COUNTER_INC(&pVCpu->hm.s.StatDRxIoCheck);
CPUMR0DebugStateMaybeSaveGuest(pVCpu, false /*fDr6*/);
@@ -4831,7 +4865,7 @@ HMSVM_EXIT_DECL hmR0SvmExitIOInstr(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pS
&& (rcStrict == VINF_SUCCESS || rcStrict2 < rcStrict))
rcStrict = rcStrict2;
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
}
@@ -5203,7 +5237,7 @@ HMSVM_EXIT_DECL hmR0SvmExitXcptNM(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSv
/* We're playing with the host CPU state here, make sure we don't preempt or longjmp. */
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
int rc;
/* If the guest FPU was active at the time of the #NM exit, then it's a guest fault. */
@@ -5221,7 +5255,7 @@ HMSVM_EXIT_DECL hmR0SvmExitXcptNM(PVMCPU pVCpu, PCPUMCTX pCtx, PSVMTRANSIENT pSv
Assert(rc == VINF_EM_RAW_GUEST_TRAP || (rc == VINF_SUCCESS && CPUMIsGuestFPUStateActive(pVCpu)));
}
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
if (rc == VINF_SUCCESS)
diff --git a/src/VBox/VMM/VMMR0/HMVMXR0.cpp b/src/VBox/VMM/VMMR0/HMVMXR0.cpp
index 1cc5a96..b66f341 100644
--- a/src/VBox/VMM/VMMR0/HMVMXR0.cpp
+++ b/src/VBox/VMM/VMMR0/HMVMXR0.cpp
@@ -23,9 +23,6 @@
#include <iprt/asm-amd64-x86.h>
#include <iprt/thread.h>
-#include "HMInternal.h"
-#include <VBox/vmm/vm.h>
-#include "HMVMXR0.h"
#include <VBox/vmm/pdmapi.h>
#include <VBox/vmm/dbgf.h>
#include <VBox/vmm/iem.h>
@@ -36,7 +33,10 @@
#ifdef VBOX_WITH_REM
# include <VBox/vmm/rem.h>
#endif
-# include "dtrace/VBoxVMM.h"
+#include "HMInternal.h"
+#include <VBox/vmm/vm.h>
+#include "HMVMXR0.h"
+#include "dtrace/VBoxVMM.h"
#ifdef DEBUG_ramshankar
# define HMVMX_ALWAYS_SAVE_GUEST_RFLAGS
@@ -4017,6 +4017,7 @@ static int hmR0VmxLoadGuestCR3AndCR4(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/*
* Guest CR4.
+ * ASSUMES this is done everytime we get in from ring-3! (XCR0)
*/
if (HMCPU_CF_IS_PENDING(pVCpu, HM_CHANGED_GUEST_CR4))
{
@@ -4099,16 +4100,20 @@ static int hmR0VmxLoadGuestCR3AndCR4(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
AssertRCReturn(rc, rc);
/* Setup CR4 mask. CR4 flags owned by the host, if the guest attempts to change them, that would cause a VM-exit. */
- uint32_t u32CR4Mask = 0;
- u32CR4Mask = X86_CR4_VME
- | X86_CR4_PAE
- | X86_CR4_PGE
- | X86_CR4_PSE
- | X86_CR4_VMXE;
+ uint32_t u32CR4Mask = X86_CR4_VME
+ | X86_CR4_PAE
+ | X86_CR4_PGE
+ | X86_CR4_PSE
+ | X86_CR4_VMXE;
+ if (pVM->cpum.ro.HostFeatures.fXSaveRstor)
+ u32CR4Mask |= X86_CR4_OSXSAVE;
pVCpu->hm.s.vmx.u32CR4Mask = u32CR4Mask;
rc = VMXWriteVmcs32(VMX_VMCS_CTRL_CR4_MASK, u32CR4Mask);
AssertRCReturn(rc, rc);
+ /* Whether to save/load/restore XCR0 during world switch depends on CR4.OSXSAVE and host+guest XCR0. */
+ pVCpu->hm.s.fLoadSaveGuestXcr0 = (pMixedCtx->cr4 & X86_CR4_OSXSAVE) && pMixedCtx->aXcr[0] != ASMGetXcr0();
+
HMCPU_CF_CLEAR(pVCpu, HM_CHANGED_GUEST_CR4);
}
return rc;
@@ -5215,11 +5220,11 @@ static bool hmR0VmxIsValidReadField(uint32_t idxField)
* @param pVCpu Pointer to the VMCPU.
* @param pCtx Pointer to the guest CPU context.
* @param enmOp The operation to perform.
- * @param cbParam Number of parameters.
+ * @param cParams Number of parameters.
* @param paParam Array of 32-bit parameters.
*/
-VMMR0DECL(int) VMXR0Execute64BitsHandler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, HM64ON32OP enmOp, uint32_t cbParam,
- uint32_t *paParam)
+VMMR0DECL(int) VMXR0Execute64BitsHandler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, HM64ON32OP enmOp,
+ uint32_t cParams, uint32_t *paParam)
{
int rc, rc2;
PHMGLOBALCPUINFO pCpu;
@@ -5260,7 +5265,7 @@ VMMR0DECL(int) VMXR0Execute64BitsHandler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, H
CPUMSetHyperESP(pVCpu, VMMGetStackRC(pVCpu));
CPUMSetHyperEIP(pVCpu, enmOp);
- for (int i = (int)cbParam - 1; i >= 0; i--)
+ for (int i = (int)cParams - 1; i >= 0; i--)
CPUMPushHyper(pVCpu, paParam[i]);
STAM_PROFILE_ADV_START(&pVCpu->hm.s.StatWorldSwitch3264, z);
@@ -5303,7 +5308,6 @@ VMMR0DECL(int) VMXR0Execute64BitsHandler(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, H
*/
DECLASM(int) VMXR0SwitcherStartVM64(RTHCUINT fResume, PCPUMCTX pCtx, PVMCSCACHE pCache, PVM pVM, PVMCPU pVCpu)
{
- uint32_t aParam[6];
PHMGLOBALCPUINFO pCpu = NULL;
RTHCPHYS HCPhysCpuPage = 0;
int rc = VERR_INTERNAL_ERROR_5;
@@ -5327,18 +5331,23 @@ DECLASM(int) VMXR0SwitcherStartVM64(RTHCUINT fResume, PCPUMCTX pCtx, PVMCSCACHE
pCache->TestOut.eflags = 0;
#endif
+ uint32_t aParam[10];
aParam[0] = (uint32_t)(HCPhysCpuPage); /* Param 1: VMXON physical address - Lo. */
aParam[1] = (uint32_t)(HCPhysCpuPage >> 32); /* Param 1: VMXON physical address - Hi. */
aParam[2] = (uint32_t)(pVCpu->hm.s.vmx.HCPhysVmcs); /* Param 2: VMCS physical address - Lo. */
aParam[3] = (uint32_t)(pVCpu->hm.s.vmx.HCPhysVmcs >> 32); /* Param 2: VMCS physical address - Hi. */
aParam[4] = VM_RC_ADDR(pVM, &pVM->aCpus[pVCpu->idCpu].hm.s.vmx.VMCSCache);
aParam[5] = 0;
+ aParam[6] = VM_RC_ADDR(pVM, pVM);
+ aParam[7] = 0;
+ aParam[8] = VM_RC_ADDR(pVM, pVCpu);
+ aParam[9] = 0;
#ifdef VBOX_WITH_CRASHDUMP_MAGIC
pCtx->dr[4] = pVM->hm.s.vmx.pScratchPhys + 16 + 8;
*(uint32_t *)(pVM->hm.s.vmx.pScratch + 16 + 8) = 1;
#endif
- rc = VMXR0Execute64BitsHandler(pVM, pVCpu, pCtx, HM64ON32OP_VMXRCStartVM64, 6, &aParam[0]);
+ rc = VMXR0Execute64BitsHandler(pVM, pVCpu, pCtx, HM64ON32OP_VMXRCStartVM64, RT_ELEMENTS(aParam), &aParam[0]);
#ifdef VBOX_WITH_CRASHDUMP_MAGIC
Assert(*(uint32_t *)(pVM->hm.s.vmx.pScratch + 16 + 8) == 5);
@@ -5976,7 +5985,7 @@ static int hmR0VmxSaveGuestCR0(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
* see hmR0VmxLeave(). Safer to just make this code non-preemptible.
*/
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
if (!HMVMXCPU_GST_IS_UPDATED(pVCpu, HMVMX_UPDATED_GUEST_CR0))
{
@@ -5993,7 +6002,7 @@ static int hmR0VmxSaveGuestCR0(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
HMVMXCPU_GST_SET_UPDATED(pVCpu, HMVMX_UPDATED_GUEST_CR0);
}
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
return VINF_SUCCESS;
}
@@ -6270,7 +6279,7 @@ static int hmR0VmxSaveGuestLazyMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
/* Since this can be called from our preemption hook it's safer to make the guest-MSRs update non-preemptible. */
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
/* Doing the check here ensures we don't overwrite already-saved guest MSRs from a preemption hook. */
if (!HMVMXCPU_GST_IS_UPDATED(pVCpu, HMVMX_UPDATED_GUEST_LAZY_MSRS))
@@ -6279,7 +6288,7 @@ static int hmR0VmxSaveGuestLazyMsrs(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
HMVMXCPU_GST_SET_UPDATED(pVCpu, HMVMX_UPDATED_GUEST_LAZY_MSRS);
}
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
}
else
@@ -6693,7 +6702,9 @@ static int hmR0VmxSaveGuestApicState(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/**
* Saves the entire guest state from the currently active VMCS into the
- * guest-CPU context. This essentially VMREADs all guest-data.
+ * guest-CPU context.
+ *
+ * This essentially VMREADs all guest-data.
*
* @returns VBox status code.
* @param pVCpu Pointer to the VMCPU.
@@ -6753,6 +6764,49 @@ static int hmR0VmxSaveGuestState(PVMCPU pVCpu, PCPUMCTX pMixedCtx)
if (VMMRZCallRing3IsEnabled(pVCpu))
VMMR0LogFlushEnable(pVCpu);
+ return VINF_SUCCESS;
+}
+
+
+/**
+ * Saves basic guest registers needed for IEM instruction execution.
+ *
+ * @returns VBox status code (OR-able).
+ * @param pVCpu Pointer to the cross context CPU data for the calling
+ * EMT.
+ * @param pMixedCtx Pointer to the CPU context of the guest.
+ * @param fMemory Whether the instruction being executed operates on
+ * memory or not. Only CR0 is synced up if clear.
+ * @param fNeedRsp Need RSP (any instruction working on GPRs or stack).
+ */
+static int hmR0VmxSaveGuestRegsForIemExec(PVMCPU pVCpu, PCPUMCTX pMixedCtx, bool fMemory, bool fNeedRsp)
+{
+ /*
+ * We assume all general purpose registers other than RSP are available.
+ *
+ * RIP is a must as it will be incremented or otherwise changed.
+ *
+ * RFLAGS are always required to figure the CPL.
+ *
+ * RSP isn't always required, however it's a GPR so frequently required.
+ *
+ * SS and CS are the only segment register needed if IEM doesn't do memory
+ * access (CPL + 16/32/64-bit mode), but we can only get all segment registers.
+ *
+ * CR0 is always required by IEM for the CPL, while CR3 and CR4 will only
+ * be required for memory accesses.
+ *
+ * Note! Before IEM dispatches an exception, it will call us to sync in everything.
+ */
+ int rc = hmR0VmxSaveGuestRip(pVCpu, pMixedCtx);
+ rc |= hmR0VmxSaveGuestRflags(pVCpu, pMixedCtx);
+ if (fNeedRsp)
+ rc |= hmR0VmxSaveGuestRsp(pVCpu, pMixedCtx);
+ rc |= hmR0VmxSaveGuestSegmentRegs(pVCpu, pMixedCtx);
+ if (!fMemory)
+ rc |= hmR0VmxSaveGuestCR0(pVCpu, pMixedCtx);
+ else
+ rc |= hmR0VmxSaveGuestControlRegs(pVCpu, pMixedCtx);
return rc;
}
@@ -7150,7 +7204,7 @@ static int hmR0VmxLeave(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx, bool fSaveGue
*/
DECLINLINE(int) hmR0VmxLeaveSession(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx)
{
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
HMVMX_ASSERT_CPU_SAFE();
Assert(!VMMRZCallRing3IsEnabled(pVCpu));
Assert(!RTThreadPreemptIsEnabled(NIL_RTTHREAD));
@@ -7160,7 +7214,7 @@ DECLINLINE(int) hmR0VmxLeaveSession(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx)
if (!pVCpu->hm.s.fLeaveDone)
{
int rc2 = hmR0VmxLeave(pVM, pVCpu, pMixedCtx, true /* fSaveGuestState */);
- AssertRCReturnStmt(rc2, HM_RESTORE_PREEMPT_IF_NEEDED(), rc2);
+ AssertRCReturnStmt(rc2, HM_RESTORE_PREEMPT(), rc2);
pVCpu->hm.s.fLeaveDone = true;
}
Assert(HMVMXCPU_GST_VALUE(pVCpu) == HMVMX_UPDATED_GUEST_ALL);
@@ -7178,8 +7232,7 @@ DECLINLINE(int) hmR0VmxLeaveSession(PVM pVM, PVMCPU pVCpu, PCPUMCTX pMixedCtx)
/* Leave HM context. This takes care of local init (term). */
int rc = HMR0LeaveCpu(pVCpu);
- HM_RESTORE_PREEMPT_IF_NEEDED();
-
+ HM_RESTORE_PREEMPT();
return rc;
}
@@ -7307,9 +7360,10 @@ DECLCALLBACK(int) hmR0VmxCallRing3Callback(PVMCPU pVCpu, VMMCALLRING3 enmOperati
* If you modify code here, make sure to check whether hmR0VmxLeave() and hmR0VmxLeaveSession() needs
* to be updated too. This is a stripped down version which gets out ASAP trying to not trigger any assertion.
*/
+ RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER; \
VMMRZCallRing3RemoveNotification(pVCpu);
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ RTThreadPreemptDisable(&PreemptState);
PVM pVM = pVCpu->CTX_SUFF(pVM);
if (CPUMIsGuestFPUStateActive(pVCpu))
@@ -7327,9 +7381,7 @@ DECLCALLBACK(int) hmR0VmxCallRing3Callback(PVMCPU pVCpu, VMMCALLRING3 enmOperati
/* Restore the lazy host MSRs as we're leaving VT-x context. */
if ( pVM->hm.s.fAllow64BitGuests
&& pVCpu->hm.s.vmx.fLazyMsrs)
- {
hmR0VmxLazyRestoreHostMsrs(pVCpu);
- }
#endif
/* Update auto-load/store host MSRs values when we re-enter VT-x (as we could be on a different CPU). */
pVCpu->hm.s.vmx.fUpdatedHostMsrs = false;
@@ -7341,9 +7393,8 @@ DECLCALLBACK(int) hmR0VmxCallRing3Callback(PVMCPU pVCpu, VMMCALLRING3 enmOperati
}
VMMR0ThreadCtxHooksDeregister(pVCpu);
-
HMR0LeaveCpu(pVCpu);
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ RTThreadPreemptRestore(&PreemptState);
return VINF_SUCCESS;
}
@@ -9494,8 +9545,7 @@ static uint32_t hmR0VmxCheckGuestState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
#if HC_ARCH_BITS == 64 || defined(VBOX_WITH_HYBRID_32BIT_KERNEL)
if (HMVMX_IS_64BIT_HOST_MODE())
{
- if ( fLongModeGuest
- && !fUnrestrictedGuest)
+ if (fLongModeGuest)
{
HMVMX_CHECK_BREAK(u32GuestCR0 & X86_CR0_PG, VMX_IGS_CR0_PG_LONGMODE);
HMVMX_CHECK_BREAK(u32GuestCR4 & X86_CR4_PAE, VMX_IGS_CR4_PAE_LONGMODE);
@@ -10592,9 +10642,17 @@ HMVMX_EXIT_DECL hmR0VmxExitXsetbv(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
{
HMVMX_VALIDATE_EXIT_HANDLER_PARAMS();
- /* We expose XSETBV to the guest, fallback to the interpreter for emulation. */
- /** @todo check if XSETBV is supported by the recompiler. */
- return VERR_EM_INTERPRETER;
+ int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
+ rc |= hmR0VmxSaveGuestRegsForIemExec(pVCpu, pMixedCtx, false /*fMemory*/, false /*fNeedRsp*/);
+ rc |= hmR0VmxSaveGuestCR4(pVCpu, pMixedCtx);
+ AssertRCReturn(rc, rc);
+
+ VBOXSTRICTRC rcStrict = IEMExecDecodedXsetbv(pVCpu, pVmxTransient->cbInstr);
+ HMCPU_CF_SET(pVCpu, rcStrict != VINF_IEM_RAISED_XCPT ? HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS : HM_CHANGED_ALL_GUEST);
+
+ pVCpu->hm.s.fLoadSaveGuestXcr0 = (pMixedCtx->cr4 & X86_CR4_OSXSAVE) && pMixedCtx->aXcr[0] != ASMGetXcr0();
+
+ return VBOXSTRICTRC_TODO(rcStrict);
}
@@ -10966,8 +11024,7 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
uint32_t const uAccessType = VMX_EXIT_QUALIFICATION_CRX_ACCESS(uExitQualification);
PVM pVM = pVCpu->CTX_SUFF(pVM);
VBOXSTRICTRC rcStrict;
- rc = hmR0VmxSaveGuestRipRspRflags(pVCpu, pMixedCtx);
- rc |= hmR0VmxSaveGuestSegmentRegs(pVCpu, pMixedCtx); /* Only really need CS+SS. */
+ rc = hmR0VmxSaveGuestRegsForIemExec(pVCpu, pMixedCtx, false /*fMemory*/, true /*fNeedRsp*/);
switch (uAccessType)
{
case VMX_EXIT_QUALIFICATION_CRX_ACCESS_WRITE: /* MOV to CRx */
@@ -10996,7 +11053,8 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
break;
case 4: /* CR4 */
HMCPU_CF_SET(pVCpu, HM_CHANGED_GUEST_CR4);
- Log4(("CRX CR4 write rc=%Rrc CR4=%#RX64\n", VBOXSTRICTRC_VAL(rcStrict), pMixedCtx->cr4));
+ Log4(("CRX CR4 write rc=%Rrc CR4=%#RX64 fLoadSaveGuestXcr0=%u\n",
+ VBOXSTRICTRC_VAL(rcStrict), pMixedCtx->cr4, pVCpu->hm.s.fLoadSaveGuestXcr0));
break;
case 8: /* CR8 */
Assert(!(pVCpu->hm.s.vmx.u32ProcCtls & VMX_VMCS_CTRL_PROC_EXEC_USE_TPR_SHADOW));
@@ -11037,7 +11095,6 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
case VMX_EXIT_QUALIFICATION_CRX_ACCESS_CLTS: /* CLTS (Clear Task-Switch Flag in CR0) */
{
- rc |= hmR0VmxSaveGuestCR0(pVCpu, pMixedCtx);
AssertRCReturn(rc, rc);
rcStrict = IEMExecDecodedClts(pVCpu, pVmxTransient->cbInstr);
AssertMsg(rcStrict == VINF_SUCCESS || rcStrict == VINF_IEM_RAISED_XCPT, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
@@ -11049,7 +11106,6 @@ HMVMX_EXIT_DECL hmR0VmxExitMovCRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
case VMX_EXIT_QUALIFICATION_CRX_ACCESS_LMSW: /* LMSW (Load Machine-Status Word into CR0) */
{
- rc |= hmR0VmxSaveGuestCR0(pVCpu, pMixedCtx);
AssertRCReturn(rc, rc);
rcStrict = IEMExecDecodedLmsw(pVCpu, pVmxTransient->cbInstr,
VMX_EXIT_QUALIFICATION_CRX_LMSW_DATA(uExitQualification));
@@ -11248,7 +11304,7 @@ HMVMX_EXIT_DECL hmR0VmxExitIoInstr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIE
/* We're playing with the host CPU state here, make sure we don't preempt or longjmp. */
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
bool fIsGuestDbgActive = CPUMR0DebugStateMaybeSaveGuest(pVCpu, true /* fDr6 */);
@@ -11268,7 +11324,7 @@ HMVMX_EXIT_DECL hmR0VmxExitIoInstr(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIE
&& (rcStrict == VINF_SUCCESS || rcStrict2 < rcStrict))
rcStrict = rcStrict2;
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
}
}
@@ -11476,13 +11532,13 @@ HMVMX_EXIT_DECL hmR0VmxExitMovDRx(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIEN
/* We're playing with the host CPU state here, make sure we can't preempt or longjmp. */
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
/* Save the host & load the guest debug state, restart execution of the MOV DRx instruction. */
CPUMR0LoadGuestDebugState(pVCpu, true /* include DR6 */);
Assert(CPUMIsGuestDebugStateActive(pVCpu) || HC_ARCH_BITS == 32);
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
#ifdef VBOX_WITH_STATISTICS
@@ -11762,14 +11818,14 @@ static int hmR0VmxExitXcptDB(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
* (See Intel spec. 27.1 "Architectural State before a VM-Exit".)
*/
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
pMixedCtx->dr[6] &= ~X86_DR6_B_MASK;
pMixedCtx->dr[6] |= uDR6;
if (CPUMIsGuestDebugStateActive(pVCpu))
ASMSetDR6(pMixedCtx->dr[6]);
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
rc = hmR0VmxSaveGuestDR7(pVCpu, pMixedCtx);
@@ -11829,7 +11885,7 @@ static int hmR0VmxExitXcptNM(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
/* We're playing with the host CPU state here, have to disable preemption or longjmp. */
VMMRZCallRing3Disable(pVCpu);
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
/* If the guest FPU was active at the time of the #NM exit, then it's a guest fault. */
if (pVmxTransient->fWasGuestFPUStateActive)
@@ -11846,7 +11902,7 @@ static int hmR0VmxExitXcptNM(PVMCPU pVCpu, PCPUMCTX pMixedCtx, PVMXTRANSIENT pVm
Assert(rc == VINF_EM_RAW_GUEST_TRAP || (rc == VINF_SUCCESS && CPUMIsGuestFPUStateActive(pVCpu)));
}
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
VMMRZCallRing3Enable(pVCpu);
if (rc == VINF_SUCCESS)
diff --git a/src/VBox/VMM/VMMR0/PGMR0.cpp b/src/VBox/VMM/VMMR0/PGMR0.cpp
index 69ef6c7..7284364 100644
--- a/src/VBox/VMM/VMMR0/PGMR0.cpp
+++ b/src/VBox/VMM/VMMR0/PGMR0.cpp
@@ -556,8 +556,9 @@ VMMR0DECL(VBOXSTRICTRC) PGMR0Trap0eHandlerNPMisconfig(PVM pVM, PVMCPU pVCpu, PGM
* Try lookup the all access physical handler for the address.
*/
pgmLock(pVM);
- PPGMPHYSHANDLER pHandler = pgmHandlerPhysicalLookup(pVM, GCPhysFault);
- if (RT_LIKELY(pHandler && pHandler->enmType != PGMPHYSHANDLERTYPE_PHYSICAL_WRITE))
+ PPGMPHYSHANDLER pHandler = pgmHandlerPhysicalLookup(pVM, GCPhysFault);
+ PPGMPHYSHANDLERTYPEINT pHandlerType = RT_LIKELY(pHandler) ? PGMPHYSHANDLER_GET_TYPE(pVM, pHandler) : NULL;
+ if (RT_LIKELY(pHandler && pHandlerType->enmKind != PGMPHYSHANDLERKIND_WRITE))
{
/*
* If the handle has aliases page or pages that have been temporarily
@@ -578,9 +579,9 @@ VMMR0DECL(VBOXSTRICTRC) PGMR0Trap0eHandlerNPMisconfig(PVM pVM, PVMCPU pVCpu, PGM
}
else
{
- if (pHandler->CTX_SUFF(pfnHandler))
+ if (pHandlerType->CTX_SUFF(pfnHandler))
{
- CTX_MID(PFNPGM,PHYSHANDLER) pfnHandler = pHandler->CTX_SUFF(pfnHandler);
+ CTX_MID(PFNPGM,PHYSHANDLER) pfnHandler = pHandlerType->CTX_SUFF(pfnHandler);
void *pvUser = pHandler->CTX_SUFF(pvUser);
STAM_PROFILE_START(&pHandler->Stat, h);
pgmUnlock(pVM);
diff --git a/src/VBox/VMM/VMMR0/VMMR0.cpp b/src/VBox/VMM/VMMR0/VMMR0.cpp
index 6e982e0..77f0009 100644
--- a/src/VBox/VMM/VMMR0/VMMR0.cpp
+++ b/src/VBox/VMM/VMMR0/VMMR0.cpp
@@ -564,12 +564,13 @@ static DECLCALLBACK(void) vmmR0ThreadCtxCallback(RTTHREADCTXEVENT enmEvent, void
{
case RTTHREADCTXEVENT_RESUMED:
{
- /** @todo Linux may call us with preemption enabled (really!) but technically we
+ /*
+ * Linux may call us with preemption enabled (really!) but technically we
* cannot get preempted here, otherwise we end up in an infinite recursion
- * scenario (i.e. preempted in resume hook -> preempt hook -> resume hook... ad
- * infinitum). Let's just disable preemption for now...
+ * scenario (i.e. preempted in resume hook -> preempt hook -> resume hook...
+ * ad infinitum). Let's just disable preemption for now...
*/
- HM_DISABLE_PREEMPT_IF_NEEDED();
+ HM_DISABLE_PREEMPT();
/* We need to update the VCPU <-> host CPU mapping. */
RTCPUID idHostCpu;
@@ -587,7 +588,7 @@ static DECLCALLBACK(void) vmmR0ThreadCtxCallback(RTTHREADCTXEVENT enmEvent, void
HMR0ThreadCtxCallback(enmEvent, pvUser);
/* Restore preemption. */
- HM_RESTORE_PREEMPT_IF_NEEDED();
+ HM_RESTORE_PREEMPT();
break;
}
@@ -1008,7 +1009,7 @@ VMMR0DECL(void) VMMR0EntryFast(PVM pVM, VMCPUID idCpu, VMMR0OPERATION enmOperati
ASMAtomicWriteU32(&pVCpu->idHostCpu, idHostCpu);
/*
- * Update the periodict preemption timer if it's active.
+ * Update the periodic preemption timer if it's active.
*/
if (pVM->vmm.s.fUsePeriodicPreemptionTimers)
GVMMR0SchedUpdatePeriodicPreemptionTimer(pVM, pVCpu->idHostCpu, TMCalcHostTimerFrequency(pVM, pVCpu));
@@ -1020,7 +1021,7 @@ VMMR0DECL(void) VMMR0EntryFast(PVM pVM, VMCPUID idCpu, VMMR0OPERATION enmOperati
if (pVCpu->idCpu > 0)
{
PVMMR0LOGGER pR0Logger = pVCpu->vmm.s.pR0LoggerR0;
- if ( pR0Logger
+ if ( pR0Logger
&& RT_UNLIKELY(!pR0Logger->fRegistered))
{
RTLogSetDefaultInstanceThread(&pR0Logger->Logger, (uintptr_t)pVM->pSession);
diff --git a/src/VBox/VMM/VMMR3/CPUM.cpp b/src/VBox/VMM/VMMR3/CPUM.cpp
index 52fedf7..2ebff4e 100644
--- a/src/VBox/VMM/VMMR3/CPUM.cpp
+++ b/src/VBox/VMM/VMMR3/CPUM.cpp
@@ -111,48 +111,6 @@ static DECLCALLBACK(void) cpumR3InfoHost(PVM pVM, PCDBGFINFOHLP pHlp, const char
* Global Variables *
*******************************************************************************/
/** Saved state field descriptors for CPUMCTX. */
-static const SSMFIELD g_aCpumX87Fields[] =
-{
- SSMFIELD_ENTRY( X86FXSTATE, FCW),
- SSMFIELD_ENTRY( X86FXSTATE, FSW),
- SSMFIELD_ENTRY( X86FXSTATE, FTW),
- SSMFIELD_ENTRY( X86FXSTATE, FOP),
- SSMFIELD_ENTRY( X86FXSTATE, FPUIP),
- SSMFIELD_ENTRY( X86FXSTATE, CS),
- SSMFIELD_ENTRY( X86FXSTATE, Rsrvd1),
- SSMFIELD_ENTRY( X86FXSTATE, FPUDP),
- SSMFIELD_ENTRY( X86FXSTATE, DS),
- SSMFIELD_ENTRY( X86FXSTATE, Rsrvd2),
- SSMFIELD_ENTRY( X86FXSTATE, MXCSR),
- SSMFIELD_ENTRY( X86FXSTATE, MXCSR_MASK),
- SSMFIELD_ENTRY( X86FXSTATE, aRegs[0]),
- SSMFIELD_ENTRY( X86FXSTATE, aRegs[1]),
- SSMFIELD_ENTRY( X86FXSTATE, aRegs[2]),
- SSMFIELD_ENTRY( X86FXSTATE, aRegs[3]),
- SSMFIELD_ENTRY( X86FXSTATE, aRegs[4]),
- SSMFIELD_ENTRY( X86FXSTATE, aRegs[5]),
- SSMFIELD_ENTRY( X86FXSTATE, aRegs[6]),
- SSMFIELD_ENTRY( X86FXSTATE, aRegs[7]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[0]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[1]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[2]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[3]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[4]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[5]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[6]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[7]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[8]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[9]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[10]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[11]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[12]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[13]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[14]),
- SSMFIELD_ENTRY( X86FXSTATE, aXMM[15]),
- SSMFIELD_ENTRY_TERM()
-};
-
-/** Saved state field descriptors for CPUMCTX. */
static const SSMFIELD g_aCpumCtxFields[] =
{
SSMFIELD_ENTRY( CPUMCTX, rdi),
@@ -246,9 +204,162 @@ static const SSMFIELD g_aCpumCtxFields[] =
SSMFIELD_ENTRY( CPUMCTX, tr.u64Base),
SSMFIELD_ENTRY( CPUMCTX, tr.u32Limit),
SSMFIELD_ENTRY( CPUMCTX, tr.Attr),
+ SSMFIELD_ENTRY_VER( CPUMCTX, aXcr[0], CPUM_SAVED_STATE_VERSION_XSAVE),
+ SSMFIELD_ENTRY_VER( CPUMCTX, aXcr[1], CPUM_SAVED_STATE_VERSION_XSAVE),
+ SSMFIELD_ENTRY_VER( CPUMCTX, fXStateMask, CPUM_SAVED_STATE_VERSION_XSAVE),
+ SSMFIELD_ENTRY_TERM()
+};
+
+/** Saved state field descriptors for CPUMCTX. */
+static const SSMFIELD g_aCpumX87Fields[] =
+{
+ SSMFIELD_ENTRY( X86FXSTATE, FCW),
+ SSMFIELD_ENTRY( X86FXSTATE, FSW),
+ SSMFIELD_ENTRY( X86FXSTATE, FTW),
+ SSMFIELD_ENTRY( X86FXSTATE, FOP),
+ SSMFIELD_ENTRY( X86FXSTATE, FPUIP),
+ SSMFIELD_ENTRY( X86FXSTATE, CS),
+ SSMFIELD_ENTRY( X86FXSTATE, Rsrvd1),
+ SSMFIELD_ENTRY( X86FXSTATE, FPUDP),
+ SSMFIELD_ENTRY( X86FXSTATE, DS),
+ SSMFIELD_ENTRY( X86FXSTATE, Rsrvd2),
+ SSMFIELD_ENTRY( X86FXSTATE, MXCSR),
+ SSMFIELD_ENTRY( X86FXSTATE, MXCSR_MASK),
+ SSMFIELD_ENTRY( X86FXSTATE, aRegs[0]),
+ SSMFIELD_ENTRY( X86FXSTATE, aRegs[1]),
+ SSMFIELD_ENTRY( X86FXSTATE, aRegs[2]),
+ SSMFIELD_ENTRY( X86FXSTATE, aRegs[3]),
+ SSMFIELD_ENTRY( X86FXSTATE, aRegs[4]),
+ SSMFIELD_ENTRY( X86FXSTATE, aRegs[5]),
+ SSMFIELD_ENTRY( X86FXSTATE, aRegs[6]),
+ SSMFIELD_ENTRY( X86FXSTATE, aRegs[7]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[0]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[1]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[2]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[3]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[4]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[5]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[6]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[7]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[8]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[9]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[10]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[11]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[12]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[13]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[14]),
+ SSMFIELD_ENTRY( X86FXSTATE, aXMM[15]),
+ SSMFIELD_ENTRY_VER( X86FXSTATE, au32RsrvdForSoftware[0], CPUM_SAVED_STATE_VERSION_XSAVE), /* 32-bit/64-bit hack */
+ SSMFIELD_ENTRY_TERM()
+};
+
+/** Saved state field descriptors for X86XSAVEHDR. */
+static const SSMFIELD g_aCpumXSaveHdrFields[] =
+{
+ SSMFIELD_ENTRY( X86XSAVEHDR, bmXState),
+ SSMFIELD_ENTRY_TERM()
+};
+
+/** Saved state field descriptors for X86XSAVEYMMHI. */
+static const SSMFIELD g_aCpumYmmHiFields[] =
+{
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[0]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[1]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[2]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[3]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[4]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[5]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[6]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[7]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[8]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[9]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[10]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[11]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[12]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[13]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[14]),
+ SSMFIELD_ENTRY( X86XSAVEYMMHI, aYmmHi[15]),
+ SSMFIELD_ENTRY_TERM()
+};
+
+/** Saved state field descriptors for X86XSAVEBNDREGS. */
+static const SSMFIELD g_aCpumBndRegsFields[] =
+{
+ SSMFIELD_ENTRY( X86XSAVEBNDREGS, aRegs[0]),
+ SSMFIELD_ENTRY( X86XSAVEBNDREGS, aRegs[1]),
+ SSMFIELD_ENTRY( X86XSAVEBNDREGS, aRegs[2]),
+ SSMFIELD_ENTRY( X86XSAVEBNDREGS, aRegs[3]),
+ SSMFIELD_ENTRY_TERM()
+};
+
+/** Saved state field descriptors for X86XSAVEBNDCFG. */
+static const SSMFIELD g_aCpumBndCfgFields[] =
+{
+ SSMFIELD_ENTRY( X86XSAVEBNDCFG, fConfig),
+ SSMFIELD_ENTRY( X86XSAVEBNDCFG, fStatus),
SSMFIELD_ENTRY_TERM()
};
+/** Saved state field descriptors for X86XSAVEOPMASK. */
+static const SSMFIELD g_aCpumOpmaskFields[] =
+{
+ SSMFIELD_ENTRY( X86XSAVEOPMASK, aKRegs[0]),
+ SSMFIELD_ENTRY( X86XSAVEOPMASK, aKRegs[1]),
+ SSMFIELD_ENTRY( X86XSAVEOPMASK, aKRegs[2]),
+ SSMFIELD_ENTRY( X86XSAVEOPMASK, aKRegs[3]),
+ SSMFIELD_ENTRY( X86XSAVEOPMASK, aKRegs[4]),
+ SSMFIELD_ENTRY( X86XSAVEOPMASK, aKRegs[5]),
+ SSMFIELD_ENTRY( X86XSAVEOPMASK, aKRegs[6]),
+ SSMFIELD_ENTRY( X86XSAVEOPMASK, aKRegs[7]),
+ SSMFIELD_ENTRY_TERM()
+};
+
+/** Saved state field descriptors for X86XSAVEZMMHI256. */
+static const SSMFIELD g_aCpumZmmHi256Fields[] =
+{
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[0]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[1]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[2]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[3]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[4]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[5]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[6]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[7]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[8]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[9]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[10]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[11]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[12]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[13]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[14]),
+ SSMFIELD_ENTRY( X86XSAVEZMMHI256, aHi256Regs[15]),
+ SSMFIELD_ENTRY_TERM()
+};
+
+/** Saved state field descriptors for X86XSAVEZMM16HI. */
+static const SSMFIELD g_aCpumZmm16HiFields[] =
+{
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[0]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[1]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[2]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[3]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[4]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[5]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[6]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[7]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[8]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[9]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[10]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[11]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[12]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[13]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[14]),
+ SSMFIELD_ENTRY( X86XSAVEZMM16HI, aRegs[15]),
+ SSMFIELD_ENTRY_TERM()
+};
+
+
+
/** Saved state field descriptors for CPUMCTX in V4.1 before the hidden selector
* registeres changed. */
static const SSMFIELD g_aCpumX87FieldsMem[] =
@@ -427,6 +538,7 @@ static const SSMFIELD g_aCpumX87FieldsV16[] =
SSMFIELD_ENTRY( X86FXSTATE, aXMM[14]),
SSMFIELD_ENTRY( X86FXSTATE, aXMM[15]),
SSMFIELD_ENTRY_IGNORE( X86FXSTATE, au32RsrvdRest),
+ SSMFIELD_ENTRY_IGNORE( X86FXSTATE, au32RsrvdForSoftware),
SSMFIELD_ENTRY_TERM()
};
@@ -1025,25 +1137,45 @@ static DECLCALLBACK(int) cpumR3SaveExec(PVM pVM, PSSMHANDLE pSSM)
/*
* Save.
*/
- for (VMCPUID i = 0; i < pVM->cCpus; i++)
- {
- PVMCPU pVCpu = &pVM->aCpus[i];
- SSMR3PutStructEx(pSSM, &pVCpu->cpum.s.Hyper.pXStateR3->x87, sizeof(*pVCpu->cpum.s.Hyper.pXStateR3),
- SSMSTRUCT_FLAGS_NO_TAIL_MARKER, g_aCpumX87Fields, NULL);
- SSMR3PutStructEx(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper),
- SSMSTRUCT_FLAGS_NO_LEAD_MARKER, g_aCpumCtxFields, NULL);
- }
-
SSMR3PutU32(pSSM, pVM->cCpus);
SSMR3PutU32(pSSM, sizeof(pVM->aCpus[0].cpum.s.GuestMsrs.msr));
for (VMCPUID iCpu = 0; iCpu < pVM->cCpus; iCpu++)
{
PVMCPU pVCpu = &pVM->aCpus[iCpu];
- SSMR3PutStructEx(pSSM, &pVCpu->cpum.s.Guest.pXStateR3->x87, sizeof(*pVCpu->cpum.s.Guest.pXStateR3),
- SSMSTRUCT_FLAGS_NO_TAIL_MARKER, g_aCpumX87Fields, NULL);
- SSMR3PutStructEx(pSSM, &pVCpu->cpum.s.Guest, sizeof(pVCpu->cpum.s.Guest),
- SSMSTRUCT_FLAGS_NO_LEAD_MARKER, g_aCpumCtxFields, NULL);
+ SSMR3PutStructEx(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper), 0, g_aCpumCtxFields, NULL);
+
+ PCPUMCTX pGstCtx = &pVCpu->cpum.s.Guest;
+ SSMR3PutStructEx(pSSM, pGstCtx, sizeof(*pGstCtx), 0, g_aCpumCtxFields, NULL);
+ SSMR3PutStructEx(pSSM, &pGstCtx->pXStateR3->x87, sizeof(pGstCtx->pXStateR3->x87), 0, g_aCpumX87Fields, NULL);
+ if (pGstCtx->fXStateMask != 0)
+ SSMR3PutStructEx(pSSM, &pGstCtx->pXStateR3->Hdr, sizeof(pGstCtx->pXStateR3->Hdr), 0, g_aCpumXSaveHdrFields, NULL);
+ if (pGstCtx->fXStateMask & XSAVE_C_YMM)
+ {
+ PCX86XSAVEYMMHI pYmmHiCtx = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_YMM_BIT, PCX86XSAVEYMMHI);
+ SSMR3PutStructEx(pSSM, pYmmHiCtx, sizeof(*pYmmHiCtx), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumYmmHiFields, NULL);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_BNDREGS)
+ {
+ PCX86XSAVEBNDREGS pBndRegs = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_BNDREGS_BIT, PCX86XSAVEBNDREGS);
+ SSMR3PutStructEx(pSSM, pBndRegs, sizeof(*pBndRegs), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumBndRegsFields, NULL);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_BNDCSR)
+ {
+ PCX86XSAVEBNDCFG pBndCfg = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_BNDCSR_BIT, PCX86XSAVEBNDCFG);
+ SSMR3PutStructEx(pSSM, pBndCfg, sizeof(*pBndCfg), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumBndCfgFields, NULL);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_ZMM_HI256)
+ {
+ PCX86XSAVEZMMHI256 pZmmHi256 = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_ZMM_HI256_BIT, PCX86XSAVEZMMHI256);
+ SSMR3PutStructEx(pSSM, pZmmHi256, sizeof(*pZmmHi256), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumZmmHi256Fields, NULL);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_ZMM_16HI)
+ {
+ PCX86XSAVEZMM16HI pZmm16Hi = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_ZMM_16HI_BIT, PCX86XSAVEZMM16HI);
+ SSMR3PutStructEx(pSSM, pZmm16Hi, sizeof(*pZmm16Hi), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumZmm16HiFields, NULL);
+ }
+
SSMR3PutU32(pSSM, pVCpu->cpum.s.fUseFlags);
SSMR3PutU32(pSSM, pVCpu->cpum.s.fChanged);
AssertCompileSizeAlignment(pVCpu->cpum.s.GuestMsrs.msr, sizeof(uint64_t));
@@ -1071,10 +1203,13 @@ static DECLCALLBACK(int) cpumR3LoadPrep(PVM pVM, PSSMHANDLE pSSM)
*/
static DECLCALLBACK(int) cpumR3LoadExec(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
{
+ int rc; /* Only for AssertRCReturn use. */
+
/*
* Validate version.
*/
- if ( uVersion != CPUM_SAVED_STATE_VERSION
+ if ( uVersion != CPUM_SAVED_STATE_VERSION_XSAVE
+ && uVersion != CPUM_SAVED_STATE_VERSION_GOOD_CPUID_COUNT
&& uVersion != CPUM_SAVED_STATE_VERSION_BAD_CPUID_COUNT
&& uVersion != CPUM_SAVED_STATE_VERSION_PUT_STRUCT
&& uVersion != CPUM_SAVED_STATE_VERSION_MEM
@@ -1100,6 +1235,9 @@ static DECLCALLBACK(int) cpumR3LoadExec(PVM pVM, PSSMHANDLE pSSM, uint32_t uVers
else if (uVersion <= CPUM_SAVED_STATE_VERSION_VER3_0)
SSMR3HandleSetGCPtrSize(pSSM, HC_ARCH_BITS == 32 ? sizeof(RTGCPTR32) : sizeof(RTGCPTR));
+ /*
+ * Figure x86 and ctx field definitions to use for older states.
+ */
uint32_t const fLoad = uVersion > CPUM_SAVED_STATE_VERSION_MEM ? 0 : SSMSTRUCT_FLAGS_MEM_BAND_AID_RELAXED;
PCSSMFIELD paCpumCtx1Fields = g_aCpumX87Fields;
PCSSMFIELD paCpumCtx2Fields = g_aCpumCtxFields;
@@ -1115,26 +1253,29 @@ static DECLCALLBACK(int) cpumR3LoadExec(PVM pVM, PSSMHANDLE pSSM, uint32_t uVers
}
/*
- * Restore.
+ * The hyper state used to preceed the CPU count. Starting with
+ * XSAVE it was moved down till after we've got the count.
*/
- for (VMCPUID iCpu = 0; iCpu < pVM->cCpus; iCpu++)
+ if (uVersion < CPUM_SAVED_STATE_VERSION_XSAVE)
{
- PVMCPU pVCpu = &pVM->aCpus[iCpu];
- uint64_t uCR3 = pVCpu->cpum.s.Hyper.cr3;
- uint64_t uRSP = pVCpu->cpum.s.Hyper.rsp; /* see VMMR3Relocate(). */
- /** @todo drop the FPU bits here! */
- SSMR3GetStructEx(pSSM, &pVCpu->cpum.s.Hyper.pXStateR3->x87, sizeof(pVCpu->cpum.s.Hyper.pXStateR3->x87),
- fLoad | SSMSTRUCT_FLAGS_NO_TAIL_MARKER, paCpumCtx1Fields, NULL);
- SSMR3GetStructEx(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper),
- fLoad | SSMSTRUCT_FLAGS_NO_LEAD_MARKER, paCpumCtx2Fields, NULL);
- pVCpu->cpum.s.Hyper.cr3 = uCR3;
- pVCpu->cpum.s.Hyper.rsp = uRSP;
+ for (VMCPUID iCpu = 0; iCpu < pVM->cCpus; iCpu++)
+ {
+ PVMCPU pVCpu = &pVM->aCpus[iCpu];
+ X86FXSTATE Ign;
+ SSMR3GetStructEx(pSSM, &Ign, sizeof(Ign), fLoad | SSMSTRUCT_FLAGS_NO_TAIL_MARKER, paCpumCtx1Fields, NULL);
+ uint64_t uCR3 = pVCpu->cpum.s.Hyper.cr3;
+ uint64_t uRSP = pVCpu->cpum.s.Hyper.rsp; /* see VMMR3Relocate(). */
+ SSMR3GetStructEx(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper),
+ fLoad | SSMSTRUCT_FLAGS_NO_LEAD_MARKER, paCpumCtx2Fields, NULL);
+ pVCpu->cpum.s.Hyper.cr3 = uCR3;
+ pVCpu->cpum.s.Hyper.rsp = uRSP;
+ }
}
if (uVersion >= CPUM_SAVED_STATE_VERSION_VER2_1_NOMSR)
{
uint32_t cCpus;
- int rc = SSMR3GetU32(pSSM, &cCpus); AssertRCReturn(rc, rc);
+ rc = SSMR3GetU32(pSSM, &cCpus); AssertRCReturn(rc, rc);
AssertLogRelMsgReturn(cCpus == pVM->cCpus, ("Mismatching CPU counts: saved: %u; configured: %u \n", cCpus, pVM->cCpus),
VERR_SSM_UNEXPECTED_DATA);
}
@@ -1146,36 +1287,148 @@ static DECLCALLBACK(int) cpumR3LoadExec(PVM pVM, PSSMHANDLE pSSM, uint32_t uVers
uint32_t cbMsrs = 0;
if (uVersion > CPUM_SAVED_STATE_VERSION_NO_MSR_SIZE)
{
- int rc = SSMR3GetU32(pSSM, &cbMsrs); AssertRCReturn(rc, rc);
+ rc = SSMR3GetU32(pSSM, &cbMsrs); AssertRCReturn(rc, rc);
AssertLogRelMsgReturn(RT_ALIGN(cbMsrs, sizeof(uint64_t)) == cbMsrs, ("Size of MSRs is misaligned: %#x\n", cbMsrs),
VERR_SSM_UNEXPECTED_DATA);
AssertLogRelMsgReturn(cbMsrs <= sizeof(CPUMCTXMSRS) && cbMsrs > 0, ("Size of MSRs is out of range: %#x\n", cbMsrs),
VERR_SSM_UNEXPECTED_DATA);
}
+ /*
+ * Do the per-CPU restoring.
+ */
for (VMCPUID iCpu = 0; iCpu < pVM->cCpus; iCpu++)
{
- PVMCPU pVCpu = &pVM->aCpus[iCpu];
- SSMR3GetStructEx(pSSM, &pVCpu->cpum.s.Guest.pXStateR3->x87, sizeof(pVCpu->cpum.s.Guest.pXStateR3->x87),
- fLoad | SSMSTRUCT_FLAGS_NO_TAIL_MARKER, paCpumCtx1Fields, NULL);
- SSMR3GetStructEx(pSSM, &pVCpu->cpum.s.Guest, sizeof(pVCpu->cpum.s.Guest),
- fLoad | SSMSTRUCT_FLAGS_NO_LEAD_MARKER, paCpumCtx2Fields, NULL);
+ PVMCPU pVCpu = &pVM->aCpus[iCpu];
+ PCPUMCTX pGstCtx = &pVCpu->cpum.s.Guest;
+
+ if (uVersion >= CPUM_SAVED_STATE_VERSION_XSAVE)
+ {
+ /*
+ * The XSAVE saved state layout moved the hyper state down here.
+ */
+ uint64_t uCR3 = pVCpu->cpum.s.Hyper.cr3;
+ uint64_t uRSP = pVCpu->cpum.s.Hyper.rsp; /* see VMMR3Relocate(). */
+ rc = SSMR3GetStructEx(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper), 0, g_aCpumCtxFields, NULL);
+ pVCpu->cpum.s.Hyper.cr3 = uCR3;
+ pVCpu->cpum.s.Hyper.rsp = uRSP;
+ AssertRCReturn(rc, rc);
+
+ /*
+ * Start by restoring the CPUMCTX structure and the X86FXSAVE bits of the extended state.
+ */
+ rc = SSMR3GetStructEx(pSSM, pGstCtx, sizeof(*pGstCtx), 0, g_aCpumCtxFields, NULL);
+ rc = SSMR3GetStructEx(pSSM, &pGstCtx->pXStateR3->x87, sizeof(pGstCtx->pXStateR3->x87), 0, g_aCpumX87Fields, NULL);
+ AssertRCReturn(rc, rc);
+
+ /* Check that the xsave/xrstor mask is valid (invalid results in #GP). */
+ if (pGstCtx->fXStateMask != 0)
+ {
+ AssertLogRelMsgReturn(!(pGstCtx->fXStateMask & ~pVM->cpum.s.fXStateGuestMask),
+ ("fXStateMask=%#RX64 fXStateGuestMask=%#RX64\n",
+ pGstCtx->fXStateMask, pVM->cpum.s.fXStateGuestMask),
+ VERR_CPUM_INCOMPATIBLE_XSAVE_COMP_MASK);
+ AssertLogRelMsgReturn(pGstCtx->fXStateMask & XSAVE_C_X87,
+ ("fXStateMask=%#RX64\n", pGstCtx->fXStateMask), VERR_CPUM_INVALID_XSAVE_COMP_MASK);
+ AssertLogRelMsgReturn((pGstCtx->fXStateMask & (XSAVE_C_SSE | XSAVE_C_YMM)) != XSAVE_C_YMM,
+ ("fXStateMask=%#RX64\n", pGstCtx->fXStateMask), VERR_CPUM_INVALID_XSAVE_COMP_MASK);
+ AssertLogRelMsgReturn( (pGstCtx->fXStateMask & (XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI)) == 0
+ || (pGstCtx->fXStateMask & (XSAVE_C_SSE | XSAVE_C_YMM | XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI))
+ == (XSAVE_C_SSE | XSAVE_C_YMM | XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI),
+ ("fXStateMask=%#RX64\n", pGstCtx->fXStateMask), VERR_CPUM_INVALID_XSAVE_COMP_MASK);
+ }
+
+ /* Check that the XCR0 mask is valid (invalid results in #GP). */
+ AssertLogRelMsgReturn(pGstCtx->aXcr[0] & XSAVE_C_X87, ("xcr0=%#RX64\n", pGstCtx->aXcr[0]), VERR_CPUM_INVALID_XCR0);
+ if (pGstCtx->aXcr[0] != XSAVE_C_X87)
+ {
+ AssertLogRelMsgReturn(!(pGstCtx->aXcr[0] & ~(pGstCtx->fXStateMask | XSAVE_C_X87)),
+ ("xcr0=%#RX64 fXStateMask=%#RX64\n", pGstCtx->aXcr[0], pGstCtx->fXStateMask),
+ VERR_CPUM_INVALID_XCR0);
+ AssertLogRelMsgReturn(pGstCtx->aXcr[0] & XSAVE_C_X87,
+ ("xcr0=%#RX64\n", pGstCtx->aXcr[0]), VERR_CPUM_INVALID_XSAVE_COMP_MASK);
+ AssertLogRelMsgReturn((pGstCtx->aXcr[0] & (XSAVE_C_SSE | XSAVE_C_YMM)) != XSAVE_C_YMM,
+ ("xcr0=%#RX64\n", pGstCtx->aXcr[0]), VERR_CPUM_INVALID_XSAVE_COMP_MASK);
+ AssertLogRelMsgReturn( (pGstCtx->aXcr[0] & (XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI)) == 0
+ || (pGstCtx->aXcr[0] & (XSAVE_C_SSE | XSAVE_C_YMM | XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI))
+ == (XSAVE_C_SSE | XSAVE_C_YMM | XSAVE_C_OPMASK | XSAVE_C_ZMM_HI256 | XSAVE_C_ZMM_16HI),
+ ("xcr0=%#RX64\n", pGstCtx->aXcr[0]), VERR_CPUM_INVALID_XSAVE_COMP_MASK);
+ }
+
+ /* Check that the XCR1 is zero, as we don't implement it yet. */
+ AssertLogRelMsgReturn(!pGstCtx->aXcr[1], ("xcr1=%#RX64\n", pGstCtx->aXcr[1]), VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
+
+ /*
+ * Restore the individual extended state components we support.
+ */
+ if (pGstCtx->fXStateMask != 0)
+ {
+ rc = SSMR3GetStructEx(pSSM, &pGstCtx->pXStateR3->Hdr, sizeof(pGstCtx->pXStateR3->Hdr),
+ 0, g_aCpumXSaveHdrFields, NULL);
+ AssertRCReturn(rc, rc);
+ AssertLogRelMsgReturn(!(pGstCtx->pXStateR3->Hdr.bmXState & ~pGstCtx->fXStateMask),
+ ("bmXState=%#RX64 fXStateMask=%#RX64\n",
+ pGstCtx->pXStateR3->Hdr.bmXState, pGstCtx->fXStateMask),
+ VERR_CPUM_INVALID_XSAVE_HDR);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_YMM)
+ {
+ PX86XSAVEYMMHI pYmmHiCtx = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_YMM_BIT, PX86XSAVEYMMHI);
+ SSMR3GetStructEx(pSSM, pYmmHiCtx, sizeof(*pYmmHiCtx), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumYmmHiFields, NULL);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_BNDREGS)
+ {
+ PX86XSAVEBNDREGS pBndRegs = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_BNDREGS_BIT, PX86XSAVEBNDREGS);
+ SSMR3GetStructEx(pSSM, pBndRegs, sizeof(*pBndRegs), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumBndRegsFields, NULL);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_BNDCSR)
+ {
+ PX86XSAVEBNDCFG pBndCfg = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_BNDCSR_BIT, PX86XSAVEBNDCFG);
+ SSMR3GetStructEx(pSSM, pBndCfg, sizeof(*pBndCfg), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumBndCfgFields, NULL);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_ZMM_HI256)
+ {
+ PX86XSAVEZMMHI256 pZmmHi256 = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_ZMM_HI256_BIT, PX86XSAVEZMMHI256);
+ SSMR3GetStructEx(pSSM, pZmmHi256, sizeof(*pZmmHi256), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumZmmHi256Fields, NULL);
+ }
+ if (pGstCtx->fXStateMask & XSAVE_C_ZMM_16HI)
+ {
+ PX86XSAVEZMM16HI pZmm16Hi = CPUMCTX_XSAVE_C_PTR(pGstCtx, XSAVE_C_ZMM_16HI_BIT, PX86XSAVEZMM16HI);
+ SSMR3GetStructEx(pSSM, pZmm16Hi, sizeof(*pZmm16Hi), SSMSTRUCT_FLAGS_FULL_STRUCT, g_aCpumZmm16HiFields, NULL);
+ }
+ }
+ else
+ {
+ /*
+ * Pre XSAVE saved state.
+ */
+ SSMR3GetStructEx(pSSM, &pGstCtx->pXStateR3->x87, sizeof(pGstCtx->pXStateR3->x87),
+ fLoad | SSMSTRUCT_FLAGS_NO_TAIL_MARKER, paCpumCtx1Fields, NULL);
+ SSMR3GetStructEx(pSSM, pGstCtx, sizeof(*pGstCtx), fLoad | SSMSTRUCT_FLAGS_NO_LEAD_MARKER, paCpumCtx2Fields, NULL);
+ }
+
+ /*
+ * Restore a couple of flags and the MSRs.
+ */
SSMR3GetU32(pSSM, &pVCpu->cpum.s.fUseFlags);
SSMR3GetU32(pSSM, &pVCpu->cpum.s.fChanged);
+
+ rc = VINF_SUCCESS;
if (uVersion > CPUM_SAVED_STATE_VERSION_NO_MSR_SIZE)
- SSMR3GetMem(pSSM, &pVCpu->cpum.s.GuestMsrs.au64[0], cbMsrs);
+ rc = SSMR3GetMem(pSSM, &pVCpu->cpum.s.GuestMsrs.au64[0], cbMsrs);
else if (uVersion >= CPUM_SAVED_STATE_VERSION_VER3_0)
{
SSMR3GetMem(pSSM, &pVCpu->cpum.s.GuestMsrs.au64[0], 2 * sizeof(uint64_t)); /* Restore two MSRs. */
- SSMR3Skip(pSSM, 62 * sizeof(uint64_t));
+ rc = SSMR3Skip(pSSM, 62 * sizeof(uint64_t));
}
+ AssertRCReturn(rc, rc);
/* REM and other may have cleared must-be-one fields in DR6 and
DR7, fix these. */
- pVCpu->cpum.s.Guest.dr[6] &= ~(X86_DR6_RAZ_MASK | X86_DR6_MBZ_MASK);
- pVCpu->cpum.s.Guest.dr[6] |= X86_DR6_RA1_MASK;
- pVCpu->cpum.s.Guest.dr[7] &= ~(X86_DR7_RAZ_MASK | X86_DR7_MBZ_MASK);
- pVCpu->cpum.s.Guest.dr[7] |= X86_DR7_RA1_MASK;
+ pGstCtx->dr[6] &= ~(X86_DR6_RAZ_MASK | X86_DR6_MBZ_MASK);
+ pGstCtx->dr[6] |= X86_DR6_RA1_MASK;
+ pGstCtx->dr[7] &= ~(X86_DR7_RAZ_MASK | X86_DR7_MBZ_MASK);
+ pGstCtx->dr[7] |= X86_DR7_RA1_MASK;
}
/* Older states does not have the internal selector register flags
@@ -1245,120 +1498,9 @@ static DECLCALLBACK(int) cpumR3LoadExec(PVM pVM, PSSMHANDLE pSSM, uint32_t uVers
/*
* Guest CPUIDs.
*/
- if (uVersion > CPUM_SAVED_STATE_VERSION_VER3_0)
+ if (uVersion >= CPUM_SAVED_STATE_VERSION_VER3_2)
return cpumR3LoadCpuId(pVM, pSSM, uVersion);
-
- /** @todo Merge the code below into cpumR3LoadCpuId when we've found out what is
- * actually required. */
-
- /*
- * Restore the CPUID leaves.
- *
- * Note that we support restoring less than the current amount of standard
- * leaves because we've been allowed more is newer version of VBox.
- */
- uint32_t cElements;
- int rc = SSMR3GetU32(pSSM, &cElements); AssertRCReturn(rc, rc);
- if (cElements > RT_ELEMENTS(pVM->cpum.s.aGuestCpuIdPatmStd))
- return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
- SSMR3GetMem(pSSM, &pVM->cpum.s.aGuestCpuIdPatmStd[0], cElements*sizeof(pVM->cpum.s.aGuestCpuIdPatmStd[0]));
-
- rc = SSMR3GetU32(pSSM, &cElements); AssertRCReturn(rc, rc);
- if (cElements != RT_ELEMENTS(pVM->cpum.s.aGuestCpuIdPatmExt))
- return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
- SSMR3GetMem(pSSM, &pVM->cpum.s.aGuestCpuIdPatmExt[0], sizeof(pVM->cpum.s.aGuestCpuIdPatmExt));
-
- rc = SSMR3GetU32(pSSM, &cElements); AssertRCReturn(rc, rc);
- if (cElements != RT_ELEMENTS(pVM->cpum.s.aGuestCpuIdPatmCentaur))
- return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
- SSMR3GetMem(pSSM, &pVM->cpum.s.aGuestCpuIdPatmCentaur[0], sizeof(pVM->cpum.s.aGuestCpuIdPatmCentaur));
-
- SSMR3GetMem(pSSM, &pVM->cpum.s.GuestInfo.DefCpuId, sizeof(pVM->cpum.s.GuestInfo.DefCpuId));
-
- /*
- * Check that the basic cpuid id information is unchanged.
- */
- /** @todo we should check the 64 bits capabilities too! */
- uint32_t au32CpuId[8] = {0,0,0,0, 0,0,0,0};
- ASMCpuIdExSlow(0, 0, 0, 0, &au32CpuId[0], &au32CpuId[1], &au32CpuId[2], &au32CpuId[3]);
- ASMCpuIdExSlow(1, 0, 0, 0, &au32CpuId[4], &au32CpuId[5], &au32CpuId[6], &au32CpuId[7]);
- uint32_t au32CpuIdSaved[8];
- rc = SSMR3GetMem(pSSM, &au32CpuIdSaved[0], sizeof(au32CpuIdSaved));
- if (RT_SUCCESS(rc))
- {
- /* Ignore CPU stepping. */
- au32CpuId[4] &= 0xfffffff0;
- au32CpuIdSaved[4] &= 0xfffffff0;
-
- /* Ignore APIC ID (AMD specs). */
- au32CpuId[5] &= ~0xff000000;
- au32CpuIdSaved[5] &= ~0xff000000;
-
- /* Ignore the number of Logical CPUs (AMD specs). */
- au32CpuId[5] &= ~0x00ff0000;
- au32CpuIdSaved[5] &= ~0x00ff0000;
-
- /* Ignore some advanced capability bits, that we don't expose to the guest. */
- au32CpuId[6] &= ~( X86_CPUID_FEATURE_ECX_DTES64
- | X86_CPUID_FEATURE_ECX_VMX
- | X86_CPUID_FEATURE_ECX_SMX
- | X86_CPUID_FEATURE_ECX_EST
- | X86_CPUID_FEATURE_ECX_TM2
- | X86_CPUID_FEATURE_ECX_CNTXID
- | X86_CPUID_FEATURE_ECX_TPRUPDATE
- | X86_CPUID_FEATURE_ECX_PDCM
- | X86_CPUID_FEATURE_ECX_DCA
- | X86_CPUID_FEATURE_ECX_X2APIC
- );
- au32CpuIdSaved[6] &= ~( X86_CPUID_FEATURE_ECX_DTES64
- | X86_CPUID_FEATURE_ECX_VMX
- | X86_CPUID_FEATURE_ECX_SMX
- | X86_CPUID_FEATURE_ECX_EST
- | X86_CPUID_FEATURE_ECX_TM2
- | X86_CPUID_FEATURE_ECX_CNTXID
- | X86_CPUID_FEATURE_ECX_TPRUPDATE
- | X86_CPUID_FEATURE_ECX_PDCM
- | X86_CPUID_FEATURE_ECX_DCA
- | X86_CPUID_FEATURE_ECX_X2APIC
- );
-
- /* Make sure we don't forget to update the masks when enabling
- * features in the future.
- */
- AssertRelease(!(pVM->cpum.s.aGuestCpuIdPatmStd[1].uEcx &
- ( X86_CPUID_FEATURE_ECX_DTES64
- | X86_CPUID_FEATURE_ECX_VMX
- | X86_CPUID_FEATURE_ECX_SMX
- | X86_CPUID_FEATURE_ECX_EST
- | X86_CPUID_FEATURE_ECX_TM2
- | X86_CPUID_FEATURE_ECX_CNTXID
- | X86_CPUID_FEATURE_ECX_TPRUPDATE
- | X86_CPUID_FEATURE_ECX_PDCM
- | X86_CPUID_FEATURE_ECX_DCA
- | X86_CPUID_FEATURE_ECX_X2APIC
- )));
- /* do the compare */
- if (memcmp(au32CpuIdSaved, au32CpuId, sizeof(au32CpuIdSaved)))
- {
- if (SSMR3HandleGetAfter(pSSM) == SSMAFTER_DEBUG_IT)
- LogRel(("cpumR3LoadExec: CpuId mismatch! (ignored due to SSMAFTER_DEBUG_IT)\n"
- "Saved=%.*Rhxs\n"
- "Real =%.*Rhxs\n",
- sizeof(au32CpuIdSaved), au32CpuIdSaved,
- sizeof(au32CpuId), au32CpuId));
- else
- {
- LogRel(("cpumR3LoadExec: CpuId mismatch!\n"
- "Saved=%.*Rhxs\n"
- "Real =%.*Rhxs\n",
- sizeof(au32CpuIdSaved), au32CpuIdSaved,
- sizeof(au32CpuId), au32CpuId));
- rc = VERR_SSM_LOAD_CPUID_MISMATCH;
- }
- }
- }
-
- return rc;
+ return cpumR3LoadCpuIdPre32(pVM, pSSM, uVersion);
}
@@ -1609,51 +1751,151 @@ static void cpumR3InfoOne(PVM pVM, PCPUMCTX pCtx, PCCPUMCTXCORE pCtxCore, PCDBGF
pszPrefix, pCtx->tr.Sel, pCtx->tr.u64Base, pCtx->tr.u32Limit, pCtx->tr.Attr.u,
pszPrefix, pCtx->SysEnter.cs, pCtx->SysEnter.eip, pCtx->SysEnter.esp);
- PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
- pHlp->pfnPrintf(pHlp,
- "%sFCW=%04x %sFSW=%04x %sFTW=%04x %sFOP=%04x %sMXCSR=%08x %sMXCSR_MASK=%08x\n"
- "%sFPUIP=%08x %sCS=%04x %sRsrvd1=%04x %sFPUDP=%08x %sDS=%04x %sRsvrd2=%04x\n"
- ,
- pszPrefix, pFpuCtx->FCW, pszPrefix, pFpuCtx->FSW, pszPrefix, pFpuCtx->FTW, pszPrefix, pFpuCtx->FOP,
- pszPrefix, pFpuCtx->MXCSR, pszPrefix, pFpuCtx->MXCSR_MASK,
- pszPrefix, pFpuCtx->FPUIP, pszPrefix, pFpuCtx->CS, pszPrefix, pFpuCtx->Rsrvd1,
- pszPrefix, pFpuCtx->FPUDP, pszPrefix, pFpuCtx->DS, pszPrefix, pFpuCtx->Rsrvd2
- );
- unsigned iShift = (pFpuCtx->FSW >> 11) & 7;
- for (unsigned iST = 0; iST < RT_ELEMENTS(pFpuCtx->aRegs); iST++)
+ pHlp->pfnPrintf(pHlp, "%sxcr=%016RX64 %sxcr1=%016RX64 %sxss=%016RX64 (fXStateMask=%016RX64)\n",
+ pszPrefix, pCtx->aXcr[0], pszPrefix, pCtx->aXcr[1],
+ pszPrefix, UINT64_C(0) /** @todo XSS */, pCtx->fXStateMask);
+ if (pCtx->CTX_SUFF(pXState))
{
- unsigned iFPR = (iST + iShift) % RT_ELEMENTS(pFpuCtx->aRegs);
- unsigned uTag = pFpuCtx->FTW & (1 << iFPR) ? 1 : 0;
- char chSign = pFpuCtx->aRegs[0].au16[4] & 0x8000 ? '-' : '+';
- unsigned iInteger = (unsigned)(pFpuCtx->aRegs[0].au64[0] >> 63);
- uint64_t u64Fraction = pFpuCtx->aRegs[0].au64[0] & UINT64_C(0x7fffffffffffffff);
- unsigned uExponent = pFpuCtx->aRegs[0].au16[4] & 0x7fff;
- /** @todo This isn't entirenly correct and needs more work! */
+ PX86FXSTATE pFpuCtx = &pCtx->CTX_SUFF(pXState)->x87;
pHlp->pfnPrintf(pHlp,
- "%sST(%u)=%sFPR%u={%04RX16'%08RX32'%08RX32} t%d %c%u.%022llu ^ %u",
- pszPrefix, iST, pszPrefix, iFPR,
- pFpuCtx->aRegs[0].au16[4], pFpuCtx->aRegs[0].au32[1], pFpuCtx->aRegs[0].au32[0],
- uTag, chSign, iInteger, u64Fraction, uExponent);
- if (pFpuCtx->aRegs[0].au16[5] || pFpuCtx->aRegs[0].au16[6] || pFpuCtx->aRegs[0].au16[7])
- pHlp->pfnPrintf(pHlp, " res={%04RX16,%04RX16,%04RX16}\n",
- pFpuCtx->aRegs[0].au16[5], pFpuCtx->aRegs[0].au16[6], pFpuCtx->aRegs[0].au16[7]);
+ "%sFCW=%04x %sFSW=%04x %sFTW=%04x %sFOP=%04x %sMXCSR=%08x %sMXCSR_MASK=%08x\n"
+ "%sFPUIP=%08x %sCS=%04x %sRsrvd1=%04x %sFPUDP=%08x %sDS=%04x %sRsvrd2=%04x\n"
+ ,
+ pszPrefix, pFpuCtx->FCW, pszPrefix, pFpuCtx->FSW, pszPrefix, pFpuCtx->FTW, pszPrefix, pFpuCtx->FOP,
+ pszPrefix, pFpuCtx->MXCSR, pszPrefix, pFpuCtx->MXCSR_MASK,
+ pszPrefix, pFpuCtx->FPUIP, pszPrefix, pFpuCtx->CS, pszPrefix, pFpuCtx->Rsrvd1,
+ pszPrefix, pFpuCtx->FPUDP, pszPrefix, pFpuCtx->DS, pszPrefix, pFpuCtx->Rsrvd2
+ );
+ unsigned iShift = (pFpuCtx->FSW >> 11) & 7;
+ for (unsigned iST = 0; iST < RT_ELEMENTS(pFpuCtx->aRegs); iST++)
+ {
+ unsigned iFPR = (iST + iShift) % RT_ELEMENTS(pFpuCtx->aRegs);
+ unsigned uTag = pFpuCtx->FTW & (1 << iFPR) ? 1 : 0;
+ char chSign = pFpuCtx->aRegs[0].au16[4] & 0x8000 ? '-' : '+';
+ unsigned iInteger = (unsigned)(pFpuCtx->aRegs[0].au64[0] >> 63);
+ uint64_t u64Fraction = pFpuCtx->aRegs[0].au64[0] & UINT64_C(0x7fffffffffffffff);
+ unsigned uExponent = pFpuCtx->aRegs[0].au16[4] & 0x7fff;
+ /** @todo This isn't entirenly correct and needs more work! */
+ pHlp->pfnPrintf(pHlp,
+ "%sST(%u)=%sFPR%u={%04RX16'%08RX32'%08RX32} t%d %c%u.%022llu ^ %u (*)",
+ pszPrefix, iST, pszPrefix, iFPR,
+ pFpuCtx->aRegs[0].au16[4], pFpuCtx->aRegs[0].au32[1], pFpuCtx->aRegs[0].au32[0],
+ uTag, chSign, iInteger, u64Fraction, uExponent);
+ if (pFpuCtx->aRegs[0].au16[5] || pFpuCtx->aRegs[0].au16[6] || pFpuCtx->aRegs[0].au16[7])
+ pHlp->pfnPrintf(pHlp, " res={%04RX16,%04RX16,%04RX16}\n",
+ pFpuCtx->aRegs[0].au16[5], pFpuCtx->aRegs[0].au16[6], pFpuCtx->aRegs[0].au16[7]);
+ else
+ pHlp->pfnPrintf(pHlp, "\n");
+ }
+
+ /* XMM/YMM/ZMM registers. */
+ if (pCtx->fXStateMask & XSAVE_C_YMM)
+ {
+ PCX86XSAVEYMMHI pYmmHiCtx = CPUMCTX_XSAVE_C_PTR(pCtx, XSAVE_C_YMM_BIT, PCX86XSAVEYMMHI);
+ if (!(pCtx->fXStateMask & XSAVE_C_ZMM_HI256))
+ for (unsigned i = 0; i < RT_ELEMENTS(pFpuCtx->aXMM); i++)
+ pHlp->pfnPrintf(pHlp, "%sYMM%u%s=%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32\n",
+ pszPrefix, i, i < 10 ? " " : "",
+ pYmmHiCtx->aYmmHi[i].au32[3],
+ pYmmHiCtx->aYmmHi[i].au32[2],
+ pYmmHiCtx->aYmmHi[i].au32[1],
+ pYmmHiCtx->aYmmHi[i].au32[0],
+ pFpuCtx->aXMM[i].au32[3],
+ pFpuCtx->aXMM[i].au32[2],
+ pFpuCtx->aXMM[i].au32[1],
+ pFpuCtx->aXMM[i].au32[0]);
+ else
+ {
+ PCX86XSAVEZMMHI256 pZmmHi256 = CPUMCTX_XSAVE_C_PTR(pCtx, XSAVE_C_ZMM_HI256_BIT, PCX86XSAVEZMMHI256);
+ for (unsigned i = 0; i < RT_ELEMENTS(pFpuCtx->aXMM); i++)
+ pHlp->pfnPrintf(pHlp,
+ "%sZMM%u%s=%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32''%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32\n",
+ pszPrefix, i, i < 10 ? " " : "",
+ pZmmHi256->aHi256Regs[i].au32[7],
+ pZmmHi256->aHi256Regs[i].au32[6],
+ pZmmHi256->aHi256Regs[i].au32[5],
+ pZmmHi256->aHi256Regs[i].au32[4],
+ pZmmHi256->aHi256Regs[i].au32[3],
+ pZmmHi256->aHi256Regs[i].au32[2],
+ pZmmHi256->aHi256Regs[i].au32[1],
+ pZmmHi256->aHi256Regs[i].au32[0],
+ pYmmHiCtx->aYmmHi[i].au32[3],
+ pYmmHiCtx->aYmmHi[i].au32[2],
+ pYmmHiCtx->aYmmHi[i].au32[1],
+ pYmmHiCtx->aYmmHi[i].au32[0],
+ pFpuCtx->aXMM[i].au32[3],
+ pFpuCtx->aXMM[i].au32[2],
+ pFpuCtx->aXMM[i].au32[1],
+ pFpuCtx->aXMM[i].au32[0]);
+
+ PCX86XSAVEZMM16HI pZmm16Hi = CPUMCTX_XSAVE_C_PTR(pCtx, XSAVE_C_ZMM_16HI_BIT, PCX86XSAVEZMM16HI);
+ for (unsigned i = 0; i < RT_ELEMENTS(pZmm16Hi->aRegs); i++)
+ pHlp->pfnPrintf(pHlp,
+ "%sZMM%u=%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32''%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32'%08RX32\n",
+ pszPrefix, i + 16,
+ pZmm16Hi->aRegs[i].au32[15],
+ pZmm16Hi->aRegs[i].au32[14],
+ pZmm16Hi->aRegs[i].au32[13],
+ pZmm16Hi->aRegs[i].au32[12],
+ pZmm16Hi->aRegs[i].au32[11],
+ pZmm16Hi->aRegs[i].au32[10],
+ pZmm16Hi->aRegs[i].au32[9],
+ pZmm16Hi->aRegs[i].au32[8],
+ pZmm16Hi->aRegs[i].au32[7],
+ pZmm16Hi->aRegs[i].au32[6],
+ pZmm16Hi->aRegs[i].au32[5],
+ pZmm16Hi->aRegs[i].au32[4],
+ pZmm16Hi->aRegs[i].au32[3],
+ pZmm16Hi->aRegs[i].au32[2],
+ pZmm16Hi->aRegs[i].au32[1],
+ pZmm16Hi->aRegs[i].au32[0]);
+ }
+ }
else
- pHlp->pfnPrintf(pHlp, "\n");
+ for (unsigned i = 0; i < RT_ELEMENTS(pFpuCtx->aXMM); i++)
+ pHlp->pfnPrintf(pHlp,
+ i & 1
+ ? "%sXMM%u%s=%08RX32'%08RX32'%08RX32'%08RX32\n"
+ : "%sXMM%u%s=%08RX32'%08RX32'%08RX32'%08RX32 ",
+ pszPrefix, i, i < 10 ? " " : "",
+ pFpuCtx->aXMM[i].au32[3],
+ pFpuCtx->aXMM[i].au32[2],
+ pFpuCtx->aXMM[i].au32[1],
+ pFpuCtx->aXMM[i].au32[0]);
+
+ if (pCtx->fXStateMask & XSAVE_C_OPMASK)
+ {
+ PCX86XSAVEOPMASK pOpMask;
+ pOpMask = (PCX86XSAVEOPMASK)((uint8_t *)pCtx->CTX_SUFF(pXState) + pCtx->aoffXState[XSAVE_C_OPMASK_BIT]);
+ for (unsigned i = 0; i < RT_ELEMENTS(pOpMask->aKRegs); i += 4)
+ pHlp->pfnPrintf(pHlp, "%sK%u=%016RX64 %sK%u=%016RX64 %sK%u=%016RX64 %sK%u=%016RX64\n",
+ pszPrefix, i + 0, pOpMask->aKRegs[i + 0],
+ pszPrefix, i + 1, pOpMask->aKRegs[i + 1],
+ pszPrefix, i + 2, pOpMask->aKRegs[i + 2],
+ pszPrefix, i + 3, pOpMask->aKRegs[i + 3]);
+ }
+
+ if (pCtx->fXStateMask & XSAVE_C_BNDREGS)
+ {
+ PCX86XSAVEBNDREGS pBndRegs = CPUMCTX_XSAVE_C_PTR(pCtx, XSAVE_C_BNDREGS_BIT, PCX86XSAVEBNDREGS);
+ for (unsigned i = 0; i < RT_ELEMENTS(pBndRegs->aRegs); i += 2)
+ pHlp->pfnPrintf(pHlp, "%sBNDREG%u=%016RX64/%016RX64 %sBNDREG%u=%016RX64/%016RX64\n",
+ pszPrefix, i, pBndRegs->aRegs[i].uLowerBound, pBndRegs->aRegs[i].uUpperBound,
+ pszPrefix, i + 1, pBndRegs->aRegs[i + 1].uLowerBound, pBndRegs->aRegs[i + 1].uUpperBound);
+ }
+
+ if (pCtx->fXStateMask & XSAVE_C_BNDCSR)
+ {
+ PCX86XSAVEBNDCFG pBndCfg = CPUMCTX_XSAVE_C_PTR(pCtx, XSAVE_C_BNDCSR_BIT, PCX86XSAVEBNDCFG);
+ pHlp->pfnPrintf(pHlp, "%sBNDCFG.CONFIG=%016RX64 %sBNDCFG.STATUS=%016RX64\n",
+ pszPrefix, pBndCfg->fConfig, pszPrefix, pBndCfg->fStatus);
+ }
+
+ for (unsigned i = 0; i < RT_ELEMENTS(pFpuCtx->au32RsrvdRest); i++)
+ if (pFpuCtx->au32RsrvdRest[i])
+ pHlp->pfnPrintf(pHlp, "%sRsrvdRest[i]=%RX32 (offset=%#x)\n",
+ pszPrefix, i, pFpuCtx->au32RsrvdRest[i], RT_OFFSETOF(X86FXSTATE, au32RsrvdRest[i]) );
}
- for (unsigned iXMM = 0; iXMM < RT_ELEMENTS(pFpuCtx->aXMM); iXMM++)
- pHlp->pfnPrintf(pHlp,
- iXMM & 1
- ? "%sXMM%u%s=%08RX32'%08RX32'%08RX32'%08RX32\n"
- : "%sXMM%u%s=%08RX32'%08RX32'%08RX32'%08RX32 ",
- pszPrefix, iXMM, iXMM < 10 ? " " : "",
- pFpuCtx->aXMM[iXMM].au32[3],
- pFpuCtx->aXMM[iXMM].au32[2],
- pFpuCtx->aXMM[iXMM].au32[1],
- pFpuCtx->aXMM[iXMM].au32[0]);
- for (unsigned i = 0; i < RT_ELEMENTS(pFpuCtx->au32RsrvdRest); i++)
- if (pFpuCtx->au32RsrvdRest[i])
- pHlp->pfnPrintf(pHlp, "%sRsrvdRest[i]=%RX32 (offset=%#x)\n",
- pszPrefix, i, pFpuCtx->au32RsrvdRest[i], RT_OFFSETOF(X86FXSTATE, au32RsrvdRest[i]) );
pHlp->pfnPrintf(pHlp,
"%sEFER =%016RX64\n"
diff --git a/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp b/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
index ef2036f..6cfa1b1 100644
--- a/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
+++ b/src/VBox/VMM/VMMR3/CPUMR3CpuId.cpp
@@ -2102,7 +2102,6 @@ typedef uint8_t CPUMISAEXTCFG;
*/
typedef struct CPUMCPUIDCONFIG
{
- bool fSyntheticCpu;
bool fNt4LeafLimit;
bool fInvariantTsc;
@@ -3510,21 +3509,12 @@ static int cpumR3CpuIdReadConfig(PVM pVM, PCPUMCPUIDCONFIG pConfig, PCFGMNODE pC
{
int rc;
- /** @cfgm{/CPUM/SyntheticCpu, boolean, false}
- * Enables the Synthetic CPU. The Vendor ID and Processor Name are
- * completely overridden by VirtualBox custom strings. Some
- * CPUID information is withheld, like the cache info.
- *
- * This is obsoleted by PortableCpuIdLevel. */
- rc = CFGMR3QueryBoolDef(pCpumCfg, "SyntheticCpu", &pConfig->fSyntheticCpu, false);
- AssertRCReturn(rc, rc);
-
/** @cfgm{/CPUM/PortableCpuIdLevel, 8-bit, 0, 3, 0}
* When non-zero CPUID features that could cause portability issues will be
* stripped. The higher the value the more features gets stripped. Higher
* values should only be used when older CPUs are involved since it may
* harm performance and maybe also cause problems with specific guests. */
- rc = CFGMR3QueryU8Def(pCpumCfg, "PortableCpuIdLevel", &pVM->cpum.s.u8PortableCpuIdLevel, pConfig->fSyntheticCpu ? 1 : 0);
+ rc = CFGMR3QueryU8Def(pCpumCfg, "PortableCpuIdLevel", &pVM->cpum.s.u8PortableCpuIdLevel, 0);
AssertLogRelRCReturn(rc, rc);
/** @cfgm{/CPUM/GuestCpuName, string}
@@ -3642,14 +3632,13 @@ static int cpumR3CpuIdReadConfig(PVM pVM, PCPUMCPUIDCONFIG pConfig, PCFGMNODE pC
rc = cpumR3CpuIdReadIsaExtCfgLegacy(pVM, pIsaExts, pCpumCfg, "SSE4.2", &pConfig->enmSse42, true);
AssertLogRelRCReturn(rc, rc);
-#if 0 /* Incomplete, so not yet enabled. */
+ /* Currently excluding older AMDs as we're seeing trouble booting 32-bit windows 7, due to
+ KiTrap07++ assuming the high 128-bit YMM component is in init state. Leading to a page fault. */
bool const fMayHaveXSave = fNestedPagingAndFullGuestExec
&& pVM->cpum.s.HostFeatures.fXSaveRstor
&& pVM->cpum.s.HostFeatures.fOpSysXSaveRstor
- && pVM->cpum.s.HostFeatures.enmCpuVendor == CPUMCPUVENDOR_INTEL /** @todo test and enable on AMD! */;
-#else
- bool const fMayHaveXSave = false;
-#endif
+ //&& !CPUMMICROARCH_IS_AMD_FAM_15H(pVM->cpum.s.HostFeatures.enmMicroarch);
+ && pVM->cpum.s.HostFeatures.enmCpuVendor != CPUMCPUVENDOR_AMD;
/** @cfgm{/CPUM/IsaExts/XSAVE, boolean, depends}
* Expose XSAVE/XRSTOR to the guest if available. For the time being the
* default is to only expose this to VMs with nested paging and AMD-V or
@@ -4902,6 +4891,129 @@ int cpumR3LoadCpuId(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion)
+/**
+ * Loads the CPU ID leaves saved by pass 0 in an pre 3.2 saved state.
+ *
+ * @returns VBox status code.
+ * @param pVM Pointer to the VM.
+ * @param pSSM The saved state handle.
+ * @param uVersion The format version.
+ */
+int cpumR3LoadCpuIdPre32(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion)
+{
+ AssertMsgReturn(uVersion < CPUM_SAVED_STATE_VERSION_VER3_2, ("%u\n", uVersion), VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION);
+
+ /*
+ * Restore the CPUID leaves.
+ *
+ * Note that we support restoring less than the current amount of standard
+ * leaves because we've been allowed more is newer version of VBox.
+ */
+ uint32_t cElements;
+ int rc = SSMR3GetU32(pSSM, &cElements); AssertRCReturn(rc, rc);
+ if (cElements > RT_ELEMENTS(pVM->cpum.s.aGuestCpuIdPatmStd))
+ return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
+ SSMR3GetMem(pSSM, &pVM->cpum.s.aGuestCpuIdPatmStd[0], cElements*sizeof(pVM->cpum.s.aGuestCpuIdPatmStd[0]));
+
+ rc = SSMR3GetU32(pSSM, &cElements); AssertRCReturn(rc, rc);
+ if (cElements != RT_ELEMENTS(pVM->cpum.s.aGuestCpuIdPatmExt))
+ return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
+ SSMR3GetMem(pSSM, &pVM->cpum.s.aGuestCpuIdPatmExt[0], sizeof(pVM->cpum.s.aGuestCpuIdPatmExt));
+
+ rc = SSMR3GetU32(pSSM, &cElements); AssertRCReturn(rc, rc);
+ if (cElements != RT_ELEMENTS(pVM->cpum.s.aGuestCpuIdPatmCentaur))
+ return VERR_SSM_DATA_UNIT_FORMAT_CHANGED;
+ SSMR3GetMem(pSSM, &pVM->cpum.s.aGuestCpuIdPatmCentaur[0], sizeof(pVM->cpum.s.aGuestCpuIdPatmCentaur));
+
+ SSMR3GetMem(pSSM, &pVM->cpum.s.GuestInfo.DefCpuId, sizeof(pVM->cpum.s.GuestInfo.DefCpuId));
+
+ /*
+ * Check that the basic cpuid id information is unchanged.
+ */
+ /** @todo we should check the 64 bits capabilities too! */
+ uint32_t au32CpuId[8] = {0,0,0,0, 0,0,0,0};
+ ASMCpuIdExSlow(0, 0, 0, 0, &au32CpuId[0], &au32CpuId[1], &au32CpuId[2], &au32CpuId[3]);
+ ASMCpuIdExSlow(1, 0, 0, 0, &au32CpuId[4], &au32CpuId[5], &au32CpuId[6], &au32CpuId[7]);
+ uint32_t au32CpuIdSaved[8];
+ rc = SSMR3GetMem(pSSM, &au32CpuIdSaved[0], sizeof(au32CpuIdSaved));
+ if (RT_SUCCESS(rc))
+ {
+ /* Ignore CPU stepping. */
+ au32CpuId[4] &= 0xfffffff0;
+ au32CpuIdSaved[4] &= 0xfffffff0;
+
+ /* Ignore APIC ID (AMD specs). */
+ au32CpuId[5] &= ~0xff000000;
+ au32CpuIdSaved[5] &= ~0xff000000;
+
+ /* Ignore the number of Logical CPUs (AMD specs). */
+ au32CpuId[5] &= ~0x00ff0000;
+ au32CpuIdSaved[5] &= ~0x00ff0000;
+
+ /* Ignore some advanced capability bits, that we don't expose to the guest. */
+ au32CpuId[6] &= ~( X86_CPUID_FEATURE_ECX_DTES64
+ | X86_CPUID_FEATURE_ECX_VMX
+ | X86_CPUID_FEATURE_ECX_SMX
+ | X86_CPUID_FEATURE_ECX_EST
+ | X86_CPUID_FEATURE_ECX_TM2
+ | X86_CPUID_FEATURE_ECX_CNTXID
+ | X86_CPUID_FEATURE_ECX_TPRUPDATE
+ | X86_CPUID_FEATURE_ECX_PDCM
+ | X86_CPUID_FEATURE_ECX_DCA
+ | X86_CPUID_FEATURE_ECX_X2APIC
+ );
+ au32CpuIdSaved[6] &= ~( X86_CPUID_FEATURE_ECX_DTES64
+ | X86_CPUID_FEATURE_ECX_VMX
+ | X86_CPUID_FEATURE_ECX_SMX
+ | X86_CPUID_FEATURE_ECX_EST
+ | X86_CPUID_FEATURE_ECX_TM2
+ | X86_CPUID_FEATURE_ECX_CNTXID
+ | X86_CPUID_FEATURE_ECX_TPRUPDATE
+ | X86_CPUID_FEATURE_ECX_PDCM
+ | X86_CPUID_FEATURE_ECX_DCA
+ | X86_CPUID_FEATURE_ECX_X2APIC
+ );
+
+ /* Make sure we don't forget to update the masks when enabling
+ * features in the future.
+ */
+ AssertRelease(!(pVM->cpum.s.aGuestCpuIdPatmStd[1].uEcx &
+ ( X86_CPUID_FEATURE_ECX_DTES64
+ | X86_CPUID_FEATURE_ECX_VMX
+ | X86_CPUID_FEATURE_ECX_SMX
+ | X86_CPUID_FEATURE_ECX_EST
+ | X86_CPUID_FEATURE_ECX_TM2
+ | X86_CPUID_FEATURE_ECX_CNTXID
+ | X86_CPUID_FEATURE_ECX_TPRUPDATE
+ | X86_CPUID_FEATURE_ECX_PDCM
+ | X86_CPUID_FEATURE_ECX_DCA
+ | X86_CPUID_FEATURE_ECX_X2APIC
+ )));
+ /* do the compare */
+ if (memcmp(au32CpuIdSaved, au32CpuId, sizeof(au32CpuIdSaved)))
+ {
+ if (SSMR3HandleGetAfter(pSSM) == SSMAFTER_DEBUG_IT)
+ LogRel(("cpumR3LoadExec: CpuId mismatch! (ignored due to SSMAFTER_DEBUG_IT)\n"
+ "Saved=%.*Rhxs\n"
+ "Real =%.*Rhxs\n",
+ sizeof(au32CpuIdSaved), au32CpuIdSaved,
+ sizeof(au32CpuId), au32CpuId));
+ else
+ {
+ LogRel(("cpumR3LoadExec: CpuId mismatch!\n"
+ "Saved=%.*Rhxs\n"
+ "Real =%.*Rhxs\n",
+ sizeof(au32CpuIdSaved), au32CpuIdSaved,
+ sizeof(au32CpuId), au32CpuId));
+ rc = VERR_SSM_LOAD_CPUID_MISMATCH;
+ }
+ }
+ }
+
+ return rc;
+}
+
+
/*
*
@@ -5068,6 +5180,8 @@ static DBGFREGSUBFIELD const g_aLeaf7Sub0EbxSubFields[] =
static DBGFREGSUBFIELD const g_aLeaf7Sub0EcxSubFields[] =
{
DBGFREGSUBFIELD_RO("PREFETCHWT1\0" "PREFETCHWT1 instruction", 0, 1, 0),
+ DBGFREGSUBFIELD_RO("PKU\0" "Protection Key for Usermode pages", 3, 1, 0),
+ DBGFREGSUBFIELD_RO("OSPKU\0" "CR4.PKU mirror", 4, 1, 0),
DBGFREGSUBFIELD_TERMINATOR()
};
diff --git a/src/VBox/VMM/VMMR3/GIM.cpp b/src/VBox/VMM/VMMR3/GIM.cpp
index 45af17a..f246689 100644
--- a/src/VBox/VMM/VMMR3/GIM.cpp
+++ b/src/VBox/VMM/VMMR3/GIM.cpp
@@ -87,6 +87,11 @@ VMMR3_INT_DECL(int) GIMR3Init(PVM pVM)
AssertCompile(sizeof(pVM->gim.s) <= sizeof(pVM->gim.padding));
/*
+ * Initialize members.
+ */
+ pVM->gim.s.hSemiReadOnlyMmio2Handler = NIL_PGMPHYSHANDLERTYPE;
+
+ /*
* Register the saved state data unit.
*/
int rc = SSMR3RegisterInternal(pVM, "GIM", 0 /* uInstance */, GIM_SAVED_STATE_VERSION, sizeof(GIM),
@@ -117,7 +122,7 @@ VMMR3_INT_DECL(int) GIMR3Init(PVM pVM)
/*
* Setup the GIM provider for this VM.
*/
- LogRel(("GIM: Using provider \"%s\" (Implementation version: %u)\n", szProvider, uVersion));
+ LogRel(("GIM: Using provider '%s' (Implementation version: %u)\n", szProvider, uVersion));
if (!RTStrCmp(szProvider, "None"))
pVM->gim.s.enmProviderId = GIMPROVIDERID_NONE;
else
@@ -142,7 +147,7 @@ VMMR3_INT_DECL(int) GIMR3Init(PVM pVM)
rc = gimR3KvmInit(pVM);
}
else
- rc = VMR3SetError(pVM->pUVM, VERR_GIM_INVALID_PROVIDER, RT_SRC_POS, "Provider \"%s\" unknown.", szProvider);
+ rc = VMR3SetError(pVM->pUVM, VERR_GIM_INVALID_PROVIDER, RT_SRC_POS, "Provider '%s' unknown.", szProvider);
}
return rc;
}
@@ -542,20 +547,28 @@ VMMR3_INT_DECL(int) GIMR3Mmio2Map(PVM pVM, PGIMMMIO2REGION pRegion, RTGCPHYS GCP
if (RT_SUCCESS(rc))
{
/*
- * Install access-handlers for the mapped page to prevent (ignore) writes to it from the guest.
+ * Install access-handlers for the mapped page to prevent (ignore) writes to it
+ * from the guest.
*/
- rc = PGMR3HandlerPhysicalRegister(pVM,
- PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
- GCPhysRegion, GCPhysRegion + (pRegion->cbRegion - 1),
- gimR3Mmio2WriteHandler, NULL /* pvUserR3 */,
- NULL /* pszModR0 */, NULL /* pszHandlerR0 */, NIL_RTR0PTR /* pvUserR0 */,
- NULL /* pszModRC */, NULL /* pszHandlerRC */, NIL_RTRCPTR /* pvUserRC */,
- pRegion->szDescription);
+ if (pVM->gim.s.hSemiReadOnlyMmio2Handler == NIL_PGMPHYSHANDLERTYPE)
+ rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_WRITE,
+ gimR3Mmio2WriteHandler,
+ NULL /* pszModR0 */, NULL /* pszHandlerR0 */,
+ NULL /* pszModRC */, NULL /* pszHandlerRC */,
+ "GIM read-only MMIO2 handler",
+ &pVM->gim.s.hSemiReadOnlyMmio2Handler);
if (RT_SUCCESS(rc))
{
- pRegion->fMapped = true;
- pRegion->GCPhysPage = GCPhysRegion;
- return rc;
+ rc = PGMHandlerPhysicalRegister(pVM, GCPhysRegion, GCPhysRegion + (pRegion->cbRegion - 1),
+ pVM->gim.s.hSemiReadOnlyMmio2Handler,
+ NULL /* pvUserR3 */, NIL_RTR0PTR /* pvUserR0 */, NIL_RTRCPTR /* pvUserRC */,
+ pRegion->szDescription);
+ if (RT_SUCCESS(rc))
+ {
+ pRegion->fMapped = true;
+ pRegion->GCPhysPage = GCPhysRegion;
+ return rc;
+ }
}
PDMDevHlpMMIO2Unmap(pDevIns, pRegion->iRegion, GCPhysRegion);
@@ -579,7 +592,7 @@ VMMR3_INT_DECL(int) GIMR3Mmio2HandlerPhysicalRegister(PVM pVM, PGIMMMIO2REGION p
AssertReturn(pRegion->fMapped, VERR_GIM_IPE_3);
return PGMR3HandlerPhysicalRegister(pVM,
- PGMPHYSHANDLERTYPE_PHYSICAL_WRITE,
+ PGMPHYSHANDLERKIND_WRITE,
pRegion->GCPhysPage, pRegion->GCPhysPage + (pRegion->cbRegion - 1),
gimR3Mmio2WriteHandler, NULL /* pvUserR3 */,
NULL /* pszModR0 */, NULL /* pszHandlerR0 */, NIL_RTR0PTR /* pvUserR0 */,
diff --git a/src/VBox/VMM/VMMR3/GIMHv.cpp b/src/VBox/VMM/VMMR3/GIMHv.cpp
index 409441d..99c711a 100644
--- a/src/VBox/VMM/VMMR3/GIMHv.cpp
+++ b/src/VBox/VMM/VMMR3/GIMHv.cpp
@@ -328,7 +328,7 @@ VMMR3_INT_DECL(void) gimR3HvReset(PVM pVM)
/*
* Unmap MMIO2 pages that the guest may have setup.
*/
- LogRel(("GIM: HyperV: Resetting Hyper-V MMIO2 regions and MSRs\n"));
+ LogRel(("GIM: HyperV: Resetting MMIO2 regions and MSRs\n"));
PGIMHV pHv = &pVM->gim.s.u.Hv;
for (unsigned i = 0; i < RT_ELEMENTS(pHv->aMmio2Regions); i++)
{
diff --git a/src/VBox/VMM/VMMR3/GIMKvm.cpp b/src/VBox/VMM/VMMR3/GIMKvm.cpp
index 1ce191f..7878a24 100644
--- a/src/VBox/VMM/VMMR3/GIMKvm.cpp
+++ b/src/VBox/VMM/VMMR3/GIMKvm.cpp
@@ -46,6 +46,17 @@
*/
#define GIM_KVM_SAVED_STATE_VERSION UINT32_C(1)
+/**
+ * VBox internal struct. to passback to EMT rendezvous callback while enabling
+ * the KVM wall-clock.
+ */
+typedef struct KVMWALLCLOCKINFO
+{
+ /** Guest physical address of the wall-clock struct. */
+ RTGCPHYS GCPhysWallClock;
+} KVMWALLCLOCKINFO;
+/** Pointer to the wall-clock info. struct. */
+typedef KVMWALLCLOCKINFO *PKVMWALLCLOCKINFO;
/*******************************************************************************
* Global Variables *
@@ -179,6 +190,10 @@ VMMR3_INT_DECL(int) gimR3KvmInitCompleted(PVM pVM)
{
if (TMR3CpuTickIsFixedRateMonotonic(pVM, true /* fWithParavirtEnabled */))
{
+ /** @todo We might want to consider just enabling this bit *always*. As far
+ * as I can see in the Linux guest, the "TSC_STABLE" bit is only
+ * translated as a "monotonic" bit which even in Async systems we
+ * -should- be reporting a strictly monotonic TSC to the guest. */
PGIMKVM pKvm = &pVM->gim.s.u.Kvm;
pKvm->uBaseFeat |= GIM_KVM_BASE_FEAT_TSC_STABLE;
@@ -237,6 +252,7 @@ VMMR3_INT_DECL(void) gimR3KvmRelocate(PVM pVM, RTGCINTPTR offDelta)
VMMR3_INT_DECL(void) gimR3KvmReset(PVM pVM)
{
VM_ASSERT_EMT0(pVM);
+ LogRel(("GIM: KVM: Resetting MSRs\n"));
/*
* Reset MSRs.
@@ -436,34 +452,55 @@ VMMR3_INT_DECL(int) gimR3KvmDisableSystemTime(PVM pVM)
/**
- * Enables the KVM wall-clock structure.
- *
- * @returns VBox status code.
- * @param pVM Pointer to the VM.
- * @param GCPhysWallClock Where the guest wall-clock structure is located.
- * @param uVersion The version (sequence number) value to use.
- *
- * @remarks Don't do any release assertions here, these can be triggered by
- * guest R0 code.
+ * @callback_method_impl{PFNVMMEMTRENDEZVOUS,
+ * Worker for gimR3KvmEnableWallClock}
*/
-VMMR3_INT_DECL(int) gimR3KvmEnableWallClock(PVM pVM, RTGCPHYS GCPhysWallClock, uint32_t uVersion)
+static DECLCALLBACK(VBOXSTRICTRC) gimR3KvmEnableWallClockCallback(PVM pVM, PVMCPU pVCpu, void *pvData)
{
+ Assert(pvData);
+ PKVMWALLCLOCKINFO pWallClockInfo = (PKVMWALLCLOCKINFO)pvData;
+ RTGCPHYS GCPhysWallClock = pWallClockInfo->GCPhysWallClock;
+
+ /*
+ * Read the wall-clock version (sequence) from the guest.
+ */
+ uint32_t uVersion;
+ Assert(PGMPhysIsGCPhysNormal(pVM, GCPhysWallClock));
+ int rc = PGMPhysSimpleReadGCPhys(pVM, &uVersion, GCPhysWallClock, sizeof(uVersion));
+ if (RT_FAILURE(rc))
+ {
+ LogRel(("GIM: KVM: Failed to read wall-clock struct. version at %#RGp. rc=%Rrc\n", GCPhysWallClock, rc));
+ return rc;
+ }
+
+ /*
+ * Ensure the version is incrementally even.
+ */
+ if (!(uVersion & 1))
+ ++uVersion;
+ ++uVersion;
+
+ /*
+ * Update wall-clock guest struct. with UTC information.
+ */
RTTIMESPEC TimeSpec;
int32_t iSec;
int32_t iNano;
-
TMR3UtcNow(pVM, &TimeSpec);
RTTimeSpecGetSecondsAndNano(&TimeSpec, &iSec, &iNano);
GIMKVMWALLCLOCK WallClock;
RT_ZERO(WallClock);
+ AssertCompile(sizeof(uVersion) == sizeof(WallClock.u32Version));
WallClock.u32Version = uVersion;
WallClock.u32Sec = iSec;
WallClock.u32Nano = iNano;
- Assert(PGMPhysIsGCPhysNormal(pVM, GCPhysWallClock));
- Assert(!(WallClock.u32Version & UINT32_C(1)));
- int rc = PGMPhysSimpleWriteGCPhys(pVM, GCPhysWallClock, &WallClock, sizeof(GIMKVMWALLCLOCK));
+ /*
+ * Write out the wall-clock struct. to guest memory.
+ */
+ Assert(!(WallClock.u32Version & 1));
+ rc = PGMPhysSimpleWriteGCPhys(pVM, GCPhysWallClock, &WallClock, sizeof(GIMKVMWALLCLOCK));
if (RT_SUCCESS(rc))
{
LogRel(("GIM: KVM: Enabled wall-clock struct. at %#RGp - u32Sec=%u u32Nano=%u uVersion=%#RU32\n", GCPhysWallClock,
@@ -471,7 +508,34 @@ VMMR3_INT_DECL(int) gimR3KvmEnableWallClock(PVM pVM, RTGCPHYS GCPhysWallClock, u
}
else
LogRel(("GIM: KVM: Failed to write wall-clock struct. at %#RGp. rc=%Rrc\n", GCPhysWallClock, rc));
-
return rc;
}
+
+/**
+ * Enables the KVM wall-clock structure.
+ *
+ * Since the wall-clock can be read by any VCPU but it is a global struct. in
+ * guest-memory, we do an EMT rendezvous here to be on the safe side. The
+ * alternative is to use an MMIO2 region and use the WallClock.u32Version field
+ * for transactional update. However, this MSR is rarely written to (typically
+ * once during bootup) it's currently not a performance issue especially since
+ * we're already in ring-3. If we really wanted better performance in this code
+ * path, we should be doing it in ring-0 with transactional update while make
+ * sure there is only 1 writer as well.
+ *
+ * @returns VBox status code.
+ * @param pVM Pointer to the VM.
+ * @param GCPhysWallClock Where the guest wall-clock structure is located.
+ * @param uVersion The version (sequence number) value to use.
+ *
+ * @remarks Don't do any release assertions here, these can be triggered by
+ * guest R0 code.
+ */
+VMMR3_INT_DECL(int) gimR3KvmEnableWallClock(PVM pVM, RTGCPHYS GCPhysWallClock)
+{
+ KVMWALLCLOCKINFO WallClockInfo;
+ WallClockInfo.GCPhysWallClock = GCPhysWallClock;
+ return VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ONCE, gimR3KvmEnableWallClockCallback, &WallClockInfo);
+}
+
diff --git a/src/VBox/VMM/VMMR3/IOM.cpp b/src/VBox/VMM/VMMR3/IOM.cpp
index 667ce9f..6afff0c 100644
--- a/src/VBox/VMM/VMMR3/IOM.cpp
+++ b/src/VBox/VMM/VMMR3/IOM.cpp
@@ -181,46 +181,58 @@ VMMR3_INT_DECL(int) IOMR3Init(PVM pVM)
{
pVM->iom.s.pTreesRC = MMHyperR3ToRC(pVM, pVM->iom.s.pTreesR3);
pVM->iom.s.pTreesR0 = MMHyperR3ToR0(pVM, pVM->iom.s.pTreesR3);
- pVM->iom.s.pfnMMIOHandlerRC = NIL_RTGCPTR;
- pVM->iom.s.pfnMMIOHandlerR0 = NIL_RTR0PTR;
/*
- * Info.
+ * Register the MMIO access handler type.
*/
- DBGFR3InfoRegisterInternal(pVM, "ioport", "Dumps all IOPort ranges. No arguments.", &iomR3IOPortInfo);
- DBGFR3InfoRegisterInternal(pVM, "mmio", "Dumps all MMIO ranges. No arguments.", &iomR3MMIOInfo);
+ rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_MMIO,
+ IOMR3MMIOHandler,
+ NULL, "IOMMMIOHandler",
+ NULL, "IOMMMIOHandler",
+ "MMIO",
+ &pVM->iom.s.hMmioHandlerType);
+ AssertRC(rc);
+ if (RT_SUCCESS(rc))
+ {
- /*
- * Statistics.
- */
- STAM_REG(pVM, &pVM->iom.s.StatRZMMIOHandler, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler", STAMUNIT_TICKS_PER_CALL, "Profiling of the IOMMMIOHandler() body, only success calls.");
- STAM_REG(pVM, &pVM->iom.s.StatRZMMIO1Byte, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Access1", STAMUNIT_OCCURENCES, "MMIO access by 1 byte counter.");
- STAM_REG(pVM, &pVM->iom.s.StatRZMMIO2Bytes, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Access2", STAMUNIT_OCCURENCES, "MMIO access by 2 bytes counter.");
- STAM_REG(pVM, &pVM->iom.s.StatRZMMIO4Bytes, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Access4", STAMUNIT_OCCURENCES, "MMIO access by 4 bytes counter.");
- STAM_REG(pVM, &pVM->iom.s.StatRZMMIO8Bytes, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Access8", STAMUNIT_OCCURENCES, "MMIO access by 8 bytes counter.");
- STAM_REG(pVM, &pVM->iom.s.StatRZMMIOFailures, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/MMIOFailures", STAMUNIT_OCCURENCES, "Number of times IOMMMIOHandler() didn't service the request.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstMov, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/MOV", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOV instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstCmp, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/CMP", STAMUNIT_TICKS_PER_CALL, "Profiling of the CMP instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstAnd, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/AND", STAMUNIT_TICKS_PER_CALL, "Profiling of the AND instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstOr, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/OR", STAMUNIT_TICKS_PER_CALL, "Profiling of the OR instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstXor, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/XOR", STAMUNIT_TICKS_PER_CALL, "Profiling of the XOR instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstBt, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/BT", STAMUNIT_TICKS_PER_CALL, "Profiling of the BT instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstTest, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/TEST", STAMUNIT_TICKS_PER_CALL, "Profiling of the TEST instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstXchg, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/XCHG", STAMUNIT_TICKS_PER_CALL, "Profiling of the XCHG instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstStos, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/STOS", STAMUNIT_TICKS_PER_CALL, "Profiling of the STOS instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstLods, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/LODS", STAMUNIT_TICKS_PER_CALL, "Profiling of the LODS instruction emulation.");
+ /*
+ * Info.
+ */
+ DBGFR3InfoRegisterInternal(pVM, "ioport", "Dumps all IOPort ranges. No arguments.", &iomR3IOPortInfo);
+ DBGFR3InfoRegisterInternal(pVM, "mmio", "Dumps all MMIO ranges. No arguments.", &iomR3MMIOInfo);
+
+ /*
+ * Statistics.
+ */
+ STAM_REG(pVM, &pVM->iom.s.StatRZMMIOHandler, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler", STAMUNIT_TICKS_PER_CALL, "Profiling of the IOMMMIOHandler() body, only success calls.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZMMIO1Byte, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Access1", STAMUNIT_OCCURENCES, "MMIO access by 1 byte counter.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZMMIO2Bytes, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Access2", STAMUNIT_OCCURENCES, "MMIO access by 2 bytes counter.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZMMIO4Bytes, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Access4", STAMUNIT_OCCURENCES, "MMIO access by 4 bytes counter.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZMMIO8Bytes, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Access8", STAMUNIT_OCCURENCES, "MMIO access by 8 bytes counter.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZMMIOFailures, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/MMIOFailures", STAMUNIT_OCCURENCES, "Number of times IOMMMIOHandler() didn't service the request.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstMov, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/MOV", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOV instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstCmp, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/CMP", STAMUNIT_TICKS_PER_CALL, "Profiling of the CMP instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstAnd, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/AND", STAMUNIT_TICKS_PER_CALL, "Profiling of the AND instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstOr, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/OR", STAMUNIT_TICKS_PER_CALL, "Profiling of the OR instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstXor, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/XOR", STAMUNIT_TICKS_PER_CALL, "Profiling of the XOR instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstBt, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/BT", STAMUNIT_TICKS_PER_CALL, "Profiling of the BT instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstTest, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/TEST", STAMUNIT_TICKS_PER_CALL, "Profiling of the TEST instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstXchg, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/XCHG", STAMUNIT_TICKS_PER_CALL, "Profiling of the XCHG instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstStos, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/STOS", STAMUNIT_TICKS_PER_CALL, "Profiling of the STOS instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstLods, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/LODS", STAMUNIT_TICKS_PER_CALL, "Profiling of the LODS instruction emulation.");
#ifdef IOM_WITH_MOVS_SUPPORT
- STAM_REG(pVM, &pVM->iom.s.StatRZInstMovs, STAMTYPE_PROFILE_ADV, "/IOM/RZ-MMIOHandler/Inst/MOVS", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOVS instruction emulation.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstMovsToMMIO, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/MOVS/ToMMIO", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOVS instruction emulation - Mem2MMIO.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstMovsFromMMIO, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/MOVS/FromMMIO", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOVS instruction emulation - MMIO2Mem.");
- STAM_REG(pVM, &pVM->iom.s.StatRZInstMovsMMIO, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/MOVS/MMIO2MMIO", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOVS instruction emulation - MMIO2MMIO.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstMovs, STAMTYPE_PROFILE_ADV, "/IOM/RZ-MMIOHandler/Inst/MOVS", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOVS instruction emulation.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstMovsToMMIO, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/MOVS/ToMMIO", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOVS instruction emulation - Mem2MMIO.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstMovsFromMMIO, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/MOVS/FromMMIO", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOVS instruction emulation - MMIO2Mem.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstMovsMMIO, STAMTYPE_PROFILE, "/IOM/RZ-MMIOHandler/Inst/MOVS/MMIO2MMIO", STAMUNIT_TICKS_PER_CALL, "Profiling of the MOVS instruction emulation - MMIO2MMIO.");
#endif
- STAM_REG(pVM, &pVM->iom.s.StatRZInstOther, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Inst/Other", STAMUNIT_OCCURENCES, "Other instructions counter.");
- STAM_REG(pVM, &pVM->iom.s.StatR3MMIOHandler, STAMTYPE_COUNTER, "/IOM/R3-MMIOHandler", STAMUNIT_OCCURENCES, "Number of calls to IOMR3MMIOHandler.");
- STAM_REG(pVM, &pVM->iom.s.StatInstIn, STAMTYPE_COUNTER, "/IOM/IOWork/In", STAMUNIT_OCCURENCES, "Counter of any IN instructions.");
- STAM_REG(pVM, &pVM->iom.s.StatInstOut, STAMTYPE_COUNTER, "/IOM/IOWork/Out", STAMUNIT_OCCURENCES, "Counter of any OUT instructions.");
- STAM_REG(pVM, &pVM->iom.s.StatInstIns, STAMTYPE_COUNTER, "/IOM/IOWork/Ins", STAMUNIT_OCCURENCES, "Counter of any INS instructions.");
- STAM_REG(pVM, &pVM->iom.s.StatInstOuts, STAMTYPE_COUNTER, "/IOM/IOWork/Outs", STAMUNIT_OCCURENCES, "Counter of any OUTS instructions.");
+ STAM_REG(pVM, &pVM->iom.s.StatRZInstOther, STAMTYPE_COUNTER, "/IOM/RZ-MMIOHandler/Inst/Other", STAMUNIT_OCCURENCES, "Other instructions counter.");
+ STAM_REG(pVM, &pVM->iom.s.StatR3MMIOHandler, STAMTYPE_COUNTER, "/IOM/R3-MMIOHandler", STAMUNIT_OCCURENCES, "Number of calls to IOMR3MMIOHandler.");
+ STAM_REG(pVM, &pVM->iom.s.StatInstIn, STAMTYPE_COUNTER, "/IOM/IOWork/In", STAMUNIT_OCCURENCES, "Counter of any IN instructions.");
+ STAM_REG(pVM, &pVM->iom.s.StatInstOut, STAMTYPE_COUNTER, "/IOM/IOWork/Out", STAMUNIT_OCCURENCES, "Counter of any OUT instructions.");
+ STAM_REG(pVM, &pVM->iom.s.StatInstIns, STAMTYPE_COUNTER, "/IOM/IOWork/Ins", STAMUNIT_OCCURENCES, "Counter of any INS instructions.");
+ STAM_REG(pVM, &pVM->iom.s.StatInstOuts, STAMTYPE_COUNTER, "/IOM/IOWork/Outs", STAMUNIT_OCCURENCES, "Counter of any OUTS instructions.");
+ }
}
/* Redundant, but just in case we change something in the future */
@@ -308,9 +320,6 @@ VMMR3_INT_DECL(void) IOMR3Relocate(PVM pVM, RTGCINTPTR offDelta)
RTAvlroIOPortDoWithAll(&pVM->iom.s.pTreesR3->IOPortTreeRC, true, iomR3RelocateIOPortCallback, &offDelta);
RTAvlroGCPhysDoWithAll(&pVM->iom.s.pTreesR3->MMIOTree, true, iomR3RelocateMMIOCallback, &offDelta);
- if (pVM->iom.s.pfnMMIOHandlerRC != NIL_RTRCPTR)
- pVM->iom.s.pfnMMIOHandlerRC += offDelta;
-
/*
* Reset the raw-mode cache (don't bother relocating it).
*/
@@ -1378,20 +1387,6 @@ IOMR3MmioRegisterR3(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, uint32_t
VERR_INVALID_PARAMETER);
/*
- * Resolve the GC/R0 handler addresses lazily because of init order.
- */
- if (pVM->iom.s.pfnMMIOHandlerR0 == NIL_RTR0PTR)
- {
- if (!HMIsEnabled(pVM))
- {
- rc = PDMR3LdrGetSymbolRC(pVM, NULL, "IOMMMIOHandler", &pVM->iom.s.pfnMMIOHandlerRC);
- AssertLogRelRCReturn(rc, rc);
- }
- rc = PDMR3LdrGetSymbolR0(pVM, NULL, "IOMMMIOHandler", &pVM->iom.s.pfnMMIOHandlerR0);
- AssertLogRelRCReturn(rc, rc);
- }
-
- /*
* Allocate new range record and initialize it.
*/
PIOMMMIORANGE pRange;
@@ -1428,10 +1423,8 @@ IOMR3MmioRegisterR3(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhysStart, uint32_t
/*
* Try register it with PGM and then insert it into the tree.
*/
- rc = PGMR3PhysMMIORegister(pVM, GCPhysStart, cbRange,
- IOMR3MMIOHandler, pRange,
- pVM->iom.s.pfnMMIOHandlerR0, MMHyperR3ToR0(pVM, pRange),
- pVM->iom.s.pfnMMIOHandlerRC, MMHyperR3ToRC(pVM, pRange), pszDesc);
+ rc = PGMR3PhysMMIORegister(pVM, GCPhysStart, cbRange, pVM->iom.s.hMmioHandlerType,
+ pRange, MMHyperR3ToR0(pVM, pRange), MMHyperR3ToRC(pVM, pRange), pszDesc);
if (RT_SUCCESS(rc))
{
IOM_LOCK_EXCL(pVM);
diff --git a/src/VBox/VMM/VMMR3/MM.cpp b/src/VBox/VMM/VMMR3/MM.cpp
index 8fd7f94..315429c 100644
--- a/src/VBox/VMM/VMMR3/MM.cpp
+++ b/src/VBox/VMM/VMMR3/MM.cpp
@@ -502,6 +502,18 @@ VMMR3DECL(void) MMR3TermUVM(PUVM pUVM)
/**
+ * Checks if the both VM and UVM parts of MM have been initialized.
+ *
+ * @returns true if initialized, false if not.
+ * @param pVM Pointer to the cross context VM structure.
+ */
+VMMR3_INT_DECL(bool) MMR3IsInitialized(PVM pVM)
+{
+ return pVM->mm.s.pHyperHeapR3 != NULL;
+}
+
+
+/**
* Execute state save operation.
*
* @returns VBox status code.
diff --git a/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp b/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp
index c44aa48..59fbc29 100644
--- a/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp
+++ b/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp
@@ -820,7 +820,7 @@ static int pdmacFileInitialize(PPDMASYNCCOMPLETIONEPCLASS pClassGlobals, PCFGMNO
if (RT_FAILURE(rc))
return rc;
- LogRel(("AIOMgr: Default manager type is \"%s\"\n", pdmacFileMgrTypeToName(pEpClassFile->enmMgrTypeOverride)));
+ LogRel(("AIOMgr: Default manager type is '%s'\n", pdmacFileMgrTypeToName(pEpClassFile->enmMgrTypeOverride)));
/* Query default backend type */
rc = CFGMR3QueryStringAllocDef(pCfgNode, "FileBackend", &pszVal, "NonBuffered");
@@ -831,7 +831,7 @@ static int pdmacFileInitialize(PPDMASYNCCOMPLETIONEPCLASS pClassGlobals, PCFGMNO
if (RT_FAILURE(rc))
return rc;
- LogRel(("AIOMgr: Default file backend is \"%s\"\n", pdmacFileBackendTypeToName(pEpClassFile->enmEpBackendDefault)));
+ LogRel(("AIOMgr: Default file backend is '%s'\n", pdmacFileBackendTypeToName(pEpClassFile->enmEpBackendDefault)));
#ifdef RT_OS_LINUX
if ( pEpClassFile->enmMgrTypeOverride == PDMACEPFILEMGRTYPE_ASYNC
diff --git a/src/VBox/VMM/VMMR3/PDMBlkCache.cpp b/src/VBox/VMM/VMMR3/PDMBlkCache.cpp
index cd1c188..17996a8 100644
--- a/src/VBox/VMM/VMMR3/PDMBlkCache.cpp
+++ b/src/VBox/VMM/VMMR3/PDMBlkCache.cpp
@@ -1129,7 +1129,7 @@ int pdmR3BlkCacheInit(PVM pVM)
NULL, pdmR3BlkCacheLoadExec, NULL);
if (RT_SUCCESS(rc))
{
- LogRel(("BlkCache: Cache successfully initialised. Cache size is %u bytes\n", pBlkCacheGlobal->cbMax));
+ LogRel(("BlkCache: Cache successfully initialized. Cache size is %u bytes\n", pBlkCacheGlobal->cbMax));
LogRel(("BlkCache: Cache commit interval is %u ms\n", pBlkCacheGlobal->u32CommitTimeoutMs));
LogRel(("BlkCache: Cache commit threshold is %u bytes\n", pBlkCacheGlobal->cbCommitDirtyThreshold));
pUVM->pdm.s.pBlkCacheGlobal = pBlkCacheGlobal;
diff --git a/src/VBox/VMM/VMMR3/PDMLdr.cpp b/src/VBox/VMM/VMMR3/PDMLdr.cpp
index b597f68..72c45f0 100644
--- a/src/VBox/VMM/VMMR3/PDMLdr.cpp
+++ b/src/VBox/VMM/VMMR3/PDMLdr.cpp
@@ -101,7 +101,11 @@ int pdmR3LdrInitU(PUVM pUVM)
*/
PVM pVM = pUVM->pVM; AssertPtr(pVM);
if (!HMIsEnabled(pVM))
- return PDMR3LdrLoadRC(pVM, NULL, VMMGC_MAIN_MODULE_NAME);
+ {
+ int rc = PDMR3LdrLoadRC(pVM, NULL, VMMGC_MAIN_MODULE_NAME);
+ if (RT_FAILURE(rc))
+ return rc;
+ }
#endif
return VINF_SUCCESS;
}
@@ -245,7 +249,7 @@ int pdmR3LoadR3U(PUVM pUVM, const char *pszFilename, const char *pszName)
/*
* Validate input.
*/
- AssertMsg(PDMCritSectIsInitialized(&pUVM->pVM->pdm.s.CritSect), ("bad init order!\n"));
+ AssertMsg(RTCritSectIsInitialized(&pUVM->pdm.s.ListCritSect), ("bad init order!\n"));
Assert(pszFilename);
size_t cchFilename = strlen(pszFilename);
Assert(pszName);
@@ -438,6 +442,11 @@ static DECLCALLBACK(int) pdmR3GetImportRC(RTLDRMOD hLdrMod, const char *pszModul
* region).
*
* @returns VBox status code.
+ * @retval VINF_PDM_ALREADY_LOADED if the module is already loaded (name +
+ * filename match).
+ * @retval VERR_PDM_MODULE_NAME_CLASH if a different file has already been
+ * loaded with the name module name.
+ *
* @param pVM The VM to load it into.
* @param pszFilename Filename of the module binary.
* @param pszName Module name. Case sensitive and the length is limited!
@@ -447,35 +456,47 @@ VMMR3DECL(int) PDMR3LdrLoadRC(PVM pVM, const char *pszFilename, const char *pszN
/*
* Validate input.
*/
- AssertMsg(PDMCritSectIsInitialized(&pVM->pdm.s.CritSect), ("bad init order!\n"));
+ AssertMsg(MMR3IsInitialized(pVM), ("bad init order!\n"));
AssertReturn(!HMIsEnabled(pVM), VERR_PDM_HM_IPE);
- PUVM pUVM = pVM->pUVM;
+ /*
+ * Find the file if not specified.
+ */
+ char *pszFile = NULL;
+ if (!pszFilename)
+ pszFilename = pszFile = pdmR3FileRC(pszName, NULL);
+
+ /*
+ * Check if a module by that name is already loaded.
+ */
+ int rc;
+ PUVM pUVM = pVM->pUVM;
RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
- PPDMMOD pCur = pUVM->pdm.s.pModules;
+ PPDMMOD pCur = pUVM->pdm.s.pModules;
while (pCur)
{
if (!strcmp(pCur->szName, pszName))
{
+ /* Name clash. Hopefully due to it being the same file. */
+ if (!strcmp(pCur->szFilename, pszFilename))
+ rc = VINF_PDM_ALREADY_LOADED;
+ else
+ {
+ rc = VERR_PDM_MODULE_NAME_CLASH;
+ AssertMsgFailed(("We've already got a module '%s' loaded!\n", pszName));
+ }
RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
- AssertMsgFailed(("We've already got a module '%s' loaded!\n", pszName));
- return VERR_PDM_MODULE_NAME_CLASH;
+ RTMemTmpFree(pszFile);
+ return rc;
}
/* next */
pCur = pCur->pNext;
}
/*
- * Find the file if not specified.
- */
- char *pszFile = NULL;
- if (!pszFilename)
- pszFilename = pszFile = pdmR3FileRC(pszName, NULL);
-
- /*
* Allocate the module list node.
*/
- PPDMMOD pModule = (PPDMMOD)RTMemAllocZ(sizeof(*pModule) + strlen(pszFilename));
+ PPDMMOD pModule = (PPDMMOD)RTMemAllocZ(sizeof(*pModule) + strlen(pszFilename));
if (!pModule)
{
RTCritSectLeave(&pUVM->pdm.s.ListCritSect);
@@ -494,7 +515,7 @@ VMMR3DECL(int) PDMR3LdrLoadRC(PVM pVM, const char *pszFilename, const char *pszN
*/
RTERRINFOSTATIC ErrInfo;
RTErrInfoInitStatic(&ErrInfo);
- int rc = SUPR3HardenedVerifyPlugIn(pszFilename, &ErrInfo.Core);
+ rc = SUPR3HardenedVerifyPlugIn(pszFilename, &ErrInfo.Core);
if (RT_SUCCESS(rc))
{
RTErrInfoClear(&ErrInfo.Core);
@@ -726,12 +747,12 @@ VMMR3_INT_DECL(int) PDMR3LdrGetSymbolR3(PVM pVM, const char *pszModule, const ch
AssertPtr(pVM);
AssertPtr(pszModule);
AssertPtr(ppvValue);
- AssertMsg(PDMCritSectIsInitialized(&pVM->pdm.s.CritSect), ("bad init order!\n"));
+ PUVM pUVM = pVM->pUVM;
+ AssertMsg(RTCritSectIsInitialized(&pUVM->pdm.s.ListCritSect), ("bad init order!\n"));
/*
* Find the module.
*/
- PUVM pUVM = pVM->pUVM;
RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
for (PPDMMOD pModule = pUVM->pdm.s.pModules; pModule; pModule = pModule->pNext)
{
@@ -785,7 +806,8 @@ VMMR3DECL(int) PDMR3LdrGetSymbolR0(PVM pVM, const char *pszModule, const char *p
AssertPtr(pVM);
AssertPtrNull(pszModule);
AssertPtr(ppvValue);
- AssertMsg(PDMCritSectIsInitialized(&pVM->pdm.s.CritSect), ("bad init order!\n"));
+ PUVM pUVM = pVM->pUVM;
+ AssertMsg(RTCritSectIsInitialized(&pUVM->pdm.s.ListCritSect), ("bad init order!\n"));
if (!pszModule)
pszModule = "VMMR0.r0";
@@ -793,7 +815,6 @@ VMMR3DECL(int) PDMR3LdrGetSymbolR0(PVM pVM, const char *pszModule, const char *p
/*
* Find the module.
*/
- PUVM pUVM = pVM->pUVM;
RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
for (PPDMMOD pModule = pUVM->pdm.s.pModules; pModule; pModule = pModule->pNext)
{
@@ -841,7 +862,8 @@ VMMR3DECL(int) PDMR3LdrGetSymbolR0Lazy(PVM pVM, const char *pszModule, const cha
AssertPtr(pVM);
AssertPtrNull(pszModule);
AssertPtr(ppvValue);
- AssertMsg(PDMCritSectIsInitialized(&pVM->pdm.s.CritSect), ("bad init order!\n"));
+ PUVM pUVM = pVM->pUVM;
+ AssertMsg(RTCritSectIsInitialized(&pUVM->pdm.s.ListCritSect), ("bad init order!\n"));
/*
* Since we're lazy, we'll only check if the module is present
@@ -850,7 +872,6 @@ VMMR3DECL(int) PDMR3LdrGetSymbolR0Lazy(PVM pVM, const char *pszModule, const cha
if (pszModule)
{
AssertMsgReturn(!strpbrk(pszModule, "/\\:\n\r\t"), ("pszModule=%s\n", pszModule), VERR_INVALID_PARAMETER);
- PUVM pUVM = pVM->pUVM;
PPDMMOD pModule;
RTCritSectEnter(&pUVM->pdm.s.ListCritSect);
for (pModule = pUVM->pdm.s.pModules; pModule; pModule = pModule->pNext)
@@ -893,7 +914,7 @@ VMMR3DECL(int) PDMR3LdrGetSymbolRC(PVM pVM, const char *pszModule, const char *p
AssertPtr(pVM);
AssertPtrNull(pszModule);
AssertPtr(pRCPtrValue);
- AssertMsg(PDMCritSectIsInitialized(&pVM->pdm.s.CritSect), ("bad init order!\n"));
+ AssertMsg(MMR3IsInitialized(pVM), ("bad init order!\n"));
if (!pszModule)
pszModule = "VMMGC.gc";
@@ -958,7 +979,7 @@ VMMR3DECL(int) PDMR3LdrGetSymbolRCLazy(PVM pVM, const char *pszModule, const cha
AssertPtr(pVM);
AssertPtrNull(pszModule);
AssertPtr(pRCPtrValue);
- AssertMsg(PDMCritSectIsInitialized(&pVM->pdm.s.CritSect), ("bad init order!\n"));
+ AssertMsg(MMR3IsInitialized(pVM), ("bad init order!\n"));
/*
* Since we're lazy, we'll only check if the module is present
diff --git a/src/VBox/VMM/VMMR3/PDMNetShaper.cpp b/src/VBox/VMM/VMMR3/PDMNetShaper.cpp
index 48fc435..255062b 100644
--- a/src/VBox/VMM/VMMR3/PDMNetShaper.cpp
+++ b/src/VBox/VMM/VMMR3/PDMNetShaper.cpp
@@ -159,7 +159,7 @@ static int pdmNsBwGroupCreate(PPDMNETSHAPER pShaper, const char *pszBwGroup, uin
MM_TAG_PDM_NET_SHAPER, (void **)&pBwGroup);
if (RT_SUCCESS(rc))
{
- rc = PDMR3CritSectInit(pShaper->pVM, &pBwGroup->Lock, RT_SRC_POS, "BWGRP");
+ rc = PDMR3CritSectInit(pShaper->pVM, &pBwGroup->Lock, RT_SRC_POS, "BWGRP-%s", pszBwGroup);
if (RT_SUCCESS(rc))
{
pBwGroup->pszNameR3 = MMR3HeapStrDup(pShaper->pVM, MM_TAG_PDM_NET_SHAPER, pszBwGroup);
diff --git a/src/VBox/VMM/VMMR3/PGM.cpp b/src/VBox/VMM/VMMR3/PGM.cpp
index 3eb381b..1a46b6b 100644
--- a/src/VBox/VMM/VMMR3/PGM.cpp
+++ b/src/VBox/VMM/VMMR3/PGM.cpp
@@ -1401,44 +1401,62 @@ VMMR3DECL(int) PGMR3Init(PVM pVM)
{
pVM->pgm.s.pTreesR0 = MMHyperR3ToR0(pVM, pVM->pgm.s.pTreesR3);
pVM->pgm.s.pTreesRC = MMHyperR3ToRC(pVM, pVM->pgm.s.pTreesR3);
+ }
- /*
- * Allocate the zero page.
- */
+ /*
+ * Allocate the zero page.
+ */
+ if (RT_SUCCESS(rc))
+ {
rc = MMHyperAlloc(pVM, PAGE_SIZE, PAGE_SIZE, MM_TAG_PGM, &pVM->pgm.s.pvZeroPgR3);
+ if (RT_SUCCESS(rc))
+ {
+ pVM->pgm.s.pvZeroPgRC = MMHyperR3ToRC(pVM, pVM->pgm.s.pvZeroPgR3);
+ pVM->pgm.s.pvZeroPgR0 = MMHyperR3ToR0(pVM, pVM->pgm.s.pvZeroPgR3);
+ pVM->pgm.s.HCPhysZeroPg = MMR3HyperHCVirt2HCPhys(pVM, pVM->pgm.s.pvZeroPgR3);
+ AssertRelease(pVM->pgm.s.HCPhysZeroPg != NIL_RTHCPHYS);
+ }
}
+
+ /*
+ * Allocate the invalid MMIO page.
+ * (The invalid bits in HCPhysInvMmioPg are set later on init complete.)
+ */
if (RT_SUCCESS(rc))
{
- pVM->pgm.s.pvZeroPgRC = MMHyperR3ToRC(pVM, pVM->pgm.s.pvZeroPgR3);
- pVM->pgm.s.pvZeroPgR0 = MMHyperR3ToR0(pVM, pVM->pgm.s.pvZeroPgR3);
- pVM->pgm.s.HCPhysZeroPg = MMR3HyperHCVirt2HCPhys(pVM, pVM->pgm.s.pvZeroPgR3);
- AssertRelease(pVM->pgm.s.HCPhysZeroPg != NIL_RTHCPHYS);
-
- /*
- * Allocate the invalid MMIO page.
- * (The invalid bits in HCPhysInvMmioPg are set later on init complete.)
- */
rc = MMHyperAlloc(pVM, PAGE_SIZE, PAGE_SIZE, MM_TAG_PGM, &pVM->pgm.s.pvMmioPgR3);
+ if (RT_SUCCESS(rc))
+ {
+ ASMMemFill32(pVM->pgm.s.pvMmioPgR3, PAGE_SIZE, 0xfeedface);
+ pVM->pgm.s.HCPhysMmioPg = MMR3HyperHCVirt2HCPhys(pVM, pVM->pgm.s.pvMmioPgR3);
+ AssertRelease(pVM->pgm.s.HCPhysMmioPg != NIL_RTHCPHYS);
+ pVM->pgm.s.HCPhysInvMmioPg = pVM->pgm.s.HCPhysMmioPg;
+ }
}
+
+ /*
+ * Register the physical access handler protecting ROMs.
+ */
if (RT_SUCCESS(rc))
- {
- ASMMemFill32(pVM->pgm.s.pvMmioPgR3, PAGE_SIZE, 0xfeedface);
- pVM->pgm.s.HCPhysMmioPg = MMR3HyperHCVirt2HCPhys(pVM, pVM->pgm.s.pvMmioPgR3);
- AssertRelease(pVM->pgm.s.HCPhysMmioPg != NIL_RTHCPHYS);
- pVM->pgm.s.HCPhysInvMmioPg = pVM->pgm.s.HCPhysMmioPg;
+ rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_WRITE,
+ pgmR3PhysRomWriteHandler,
+ NULL, "pgmPhysRomWriteHandler",
+ NULL, "pgmPhysRomWriteHandler",
+ "ROM write protection",
+ &pVM->pgm.s.hRomPhysHandlerType);
- /*
- * Init the paging.
- */
+ /*
+ * Init the paging.
+ */
+ if (RT_SUCCESS(rc))
rc = pgmR3InitPaging(pVM);
- }
+
+ /*
+ * Init the page pool.
+ */
if (RT_SUCCESS(rc))
- {
- /*
- * Init the page pool.
- */
rc = pgmR3PoolInit(pVM);
- }
+
if (RT_SUCCESS(rc))
{
for (VMCPUID i = 0; i < pVM->cCpus; i++)
@@ -2390,6 +2408,14 @@ VMMR3DECL(void) PGMR3Relocate(PVM pVM, RTGCINTPTR offDelta)
*/
RTAvlroGCPhysDoWithAll(&pVM->pgm.s.pTreesR3->PhysHandlers, true, pgmR3RelocatePhysHandler, &offDelta);
pVM->pgm.s.pLastPhysHandlerRC = NIL_RTRCPTR;
+
+ PPGMPHYSHANDLERTYPEINT pCurPhysType;
+ RTListOff32ForEach(&pVM->pgm.s.pTreesR3->HeadPhysHandlerTypes, pCurPhysType, PGMPHYSHANDLERTYPEINT, ListNode)
+ {
+ if (pCurPhysType->pfnHandlerRC)
+ pCurPhysType->pfnHandlerRC += offDelta;
+ }
+
RTAvlroGCPtrDoWithAll(&pVM->pgm.s.pTreesR3->VirtHandlers, true, pgmR3RelocateVirtHandler, &offDelta);
RTAvlroGCPtrDoWithAll(&pVM->pgm.s.pTreesR3->HyperVirtHandlers, true, pgmR3RelocateHyperVirtHandler, &offDelta);
@@ -2421,8 +2447,6 @@ static DECLCALLBACK(int) pgmR3RelocatePhysHandler(PAVLROGCPHYSNODECORE pNode, vo
{
PPGMPHYSHANDLER pHandler = (PPGMPHYSHANDLER)pNode;
RTGCINTPTR offDelta = *(PRTGCINTPTR)pvUser;
- if (pHandler->pfnHandlerRC)
- pHandler->pfnHandlerRC += offDelta;
if (pHandler->pvUserRC >= 0x10000)
pHandler->pvUserRC += offDelta;
return 0;
@@ -3868,10 +3892,10 @@ static DECLCALLBACK(int) pgmR3CmdPhysToFile(PCDBGCCMD pCmd, PDBGCCMDHLP pCmdHlp,
DBGC_CMDHLP_REQ_UVM_RET(pCmdHlp, pCmd, pUVM);
PVM pVM = pUVM->pVM;
DBGC_CMDHLP_ASSERT_PARSER_RET(pCmdHlp, pCmd, 0, cArgs == 1 || cArgs == 2);
- DBGC_CMDHLP_ASSERT_PARSER_RET(pCmdHlp, pCmd, 0, paArgs[0].enmType != DBGCVAR_TYPE_STRING);
+ DBGC_CMDHLP_ASSERT_PARSER_RET(pCmdHlp, pCmd, 0, paArgs[0].enmType == DBGCVAR_TYPE_STRING);
if (cArgs == 2)
{
- DBGC_CMDHLP_ASSERT_PARSER_RET(pCmdHlp, pCmd, 1, paArgs[2].enmType != DBGCVAR_TYPE_STRING);
+ DBGC_CMDHLP_ASSERT_PARSER_RET(pCmdHlp, pCmd, 1, paArgs[1].enmType == DBGCVAR_TYPE_STRING);
if (strcmp(paArgs[1].u.pszString, "nozero"))
return DBGCCmdHlpFail(pCmdHlp, pCmd, "Invalid 2nd argument '%s', must be 'nozero'.\n", paArgs[1].u.pszString);
}
@@ -4005,9 +4029,12 @@ static DECLCALLBACK(int) pgmR3CheckIntegrityPhysHandlerNode(PAVLROGCPHYSNODECORE
PPGMCHECKINTARGS pArgs = (PPGMCHECKINTARGS)pvUser;
PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)pNode;
AssertReleaseReturn(!((uintptr_t)pCur & 7), 1);
- AssertReleaseMsg(pCur->Core.Key <= pCur->Core.KeyLast,("pCur=%p %RGp-%RGp %s\n", pCur, pCur->Core.Key, pCur->Core.KeyLast, pCur->pszDesc));
+ AssertReleaseMsg(pCur->Core.Key <= pCur->Core.KeyLast,
+ ("pCur=%p %RGp-%RGp %s\n", pCur, pCur->Core.Key, pCur->Core.KeyLast, pCur->pszDesc));
AssertReleaseMsg( !pArgs->pPrevPhys
- || (pArgs->fLeftToRight ? pArgs->pPrevPhys->Core.KeyLast < pCur->Core.Key : pArgs->pPrevPhys->Core.KeyLast > pCur->Core.Key),
+ || ( pArgs->fLeftToRight
+ ? pArgs->pPrevPhys->Core.KeyLast < pCur->Core.Key
+ : pArgs->pPrevPhys->Core.KeyLast > pCur->Core.Key),
("pPrevPhys=%p %RGp-%RGp %s\n"
" pCur=%p %RGp-%RGp %s\n",
pArgs->pPrevPhys, pArgs->pPrevPhys->Core.Key, pArgs->pPrevPhys->Core.KeyLast, pArgs->pPrevPhys->pszDesc,
diff --git a/src/VBox/VMM/VMMR3/PGMHandler.cpp b/src/VBox/VMM/VMMR3/PGMHandler.cpp
index bfffa97..dbeaa19 100644
--- a/src/VBox/VMM/VMMR3/PGMHandler.cpp
+++ b/src/VBox/VMM/VMMR3/PGMHandler.cpp
@@ -64,33 +64,89 @@ static DECLCALLBACK(int) pgmR3InfoHandlersVirtualOne(PAVLROGCPTRNODECORE pNode,
+
/**
- * Register a access handler for a physical range.
+ * Register a physical page access handler type, extended version.
*
* @returns VBox status code.
- * @param pVM Pointer to the VM.
- * @param enmType Handler type. Any of the PGMPHYSHANDLERTYPE_PHYSICAL* enums.
- * @param GCPhys Start physical address.
- * @param GCPhysLast Last physical address. (inclusive)
- * @param pfnHandlerR3 The R3 handler.
- * @param pvUserR3 User argument to the R3 handler.
- * @param pszModR0 The R0 handler module. NULL means the default R0 module.
- * @param pszHandlerR0 The R0 handler symbol name.
- * @param pvUserR0 User argument to the R0 handler.
- * @param pszModRC The RC handler module. NULL means the default RC
- * module.
- * @param pszHandlerRC The RC handler symbol name.
- * @param pvUserRC User argument to the RC handler. Values less than
- * 0x10000 will not be relocated.
- * @param pszDesc Pointer to description string. This must not be freed.
+ * @param pVM Pointer to the cross context VM structure.
+ * @param enmKind The kind of access handler.
+ * @param pfnHandlerR3 Pointer to the ring-3 handler callback.
+ * @param pfnHandlerR0 Pointer to the ring-0 handler callback.
+ * @param pfnHandlerRC Pointer to the raw-mode context handler callback.
+ * @param pszDesc The type description.
+ * @param phType Where to return the type handle (cross context
+ * safe).
*/
-VMMR3DECL(int) PGMR3HandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS GCPhysLast,
- PFNPGMR3PHYSHANDLER pfnHandlerR3, void *pvUserR3,
- const char *pszModR0, const char *pszHandlerR0, RTR0PTR pvUserR0,
- const char *pszModRC, const char *pszHandlerRC, RTRCPTR pvUserRC, const char *pszDesc)
+VMM_INT_DECL(int) PGMR3HandlerPhysicalTypeRegisterEx(PVM pVM, PGMPHYSHANDLERKIND enmKind,
+ PFNPGMR3PHYSHANDLER pfnHandlerR3,
+ R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0,
+ RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC,
+ const char *pszDesc, PPGMPHYSHANDLERTYPE phType)
{
- LogFlow(("PGMR3HandlerPhysicalRegister: enmType=%d GCPhys=%RGp GCPhysLast=%RGp pfnHandlerR3=%RHv pvUserHC=%RHv pszModR0=%s pszHandlerR0=%s pvUserR0=%RHv pszModRC=%s pszHandlerRC=%s pvUser=%RRv pszDesc=%s\n",
- enmType, GCPhys, GCPhysLast, pfnHandlerR3, pvUserR3, pszModR0, pszHandlerR0, pvUserR0, pszHandlerRC, pszModRC, pvUserRC, pszDesc));
+ AssertPtrReturn(pfnHandlerR3, VERR_INVALID_POINTER);
+ AssertReturn(pfnHandlerR0 != NIL_RTR0PTR, VERR_INVALID_POINTER);
+ AssertReturn(pfnHandlerRC != NIL_RTRCPTR || HMIsEnabled(pVM), VERR_INVALID_POINTER);
+ AssertPtrReturn(pszDesc, VERR_INVALID_POINTER);
+ AssertReturn( enmKind == PGMPHYSHANDLERKIND_WRITE
+ || enmKind == PGMPHYSHANDLERKIND_ALL
+ || enmKind == PGMPHYSHANDLERKIND_MMIO,
+ VERR_INVALID_PARAMETER);
+
+ PPGMPHYSHANDLERTYPEINT pType;
+ int rc = MMHyperAlloc(pVM, sizeof(*pType), 0, MM_TAG_PGM_HANDLER_TYPES, (void **)&pType);
+ if (RT_SUCCESS(rc))
+ {
+ pType->u32Magic = PGMPHYSHANDLERTYPEINT_MAGIC;
+ pType->cRefs = 1;
+ pType->enmKind = enmKind;
+ pType->uState = enmKind == PGMPHYSHANDLERKIND_WRITE ? PGM_PAGE_HNDL_PHYS_STATE_WRITE : PGM_PAGE_HNDL_PHYS_STATE_ALL;
+ pType->pfnHandlerR3 = pfnHandlerR3;
+ pType->pfnHandlerR0 = pfnHandlerR0;
+ pType->pfnHandlerRC = pfnHandlerRC;
+ pType->pszDesc = pszDesc;
+
+ pgmLock(pVM);
+ RTListOff32Append(&pVM->pgm.s.CTX_SUFF(pTrees)->HeadPhysHandlerTypes, &pType->ListNode);
+ pgmUnlock(pVM);
+
+ *phType = MMHyperHeapPtrToOffset(pVM, pType);
+ LogFlow(("PGMR3HandlerPhysicalTypeRegisterEx: %p/%#x: enmKind=%d pfnHandlerR3=%RHv pfnHandlerR0=%RHv pfnHandlerRC=%RRv pszDesc=%s\n",
+ pType, *phType, enmKind, pfnHandlerR3, pfnHandlerR0, pfnHandlerRC, pszDesc));
+ return VINF_SUCCESS;
+ }
+ *phType = NIL_PGMPHYSHANDLERTYPE;
+ return rc;
+}
+
+
+/**
+ * Register a physical page access handler type.
+ *
+ * @returns VBox status code.
+ * @param pVM Pointer to the cross context VM structure.
+ * @param enmKind The kind of access handler.
+ * @param pfnHandlerR3 Pointer to the ring-3 handler callback.
+ * @param pszModR0 The name of the ring-0 module, NULL is an alias for
+ * the main ring-0 module.
+ * @param pszHandlerR0 The name of the ring-0 handler, NULL if the ring-3
+ * handler should be called.
+ * @param pszModRC The name of the raw-mode context module, NULL is an
+ * alias for the main RC module.
+ * @param pszHandlerRC The name of the raw-mode context handler, NULL if
+ * the ring-3 handler should be called.
+ * @param pszDesc The type description.
+ * @param phType Where to return the type handle (cross context
+ * safe).
+ */
+VMMR3DECL(int) PGMR3HandlerPhysicalTypeRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind,
+ R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3,
+ const char *pszModR0, const char *pszHandlerR0,
+ const char *pszModRC, const char *pszHandlerRC, const char *pszDesc,
+ PPGMPHYSHANDLERTYPE phType)
+{
+ LogFlow(("PGMR3HandlerPhysicalTypeRegister: enmKind=%d pfnHandlerR3=%RHv pszModR0=%s pszHandlerR0=%s pszModRC=%s pszHandlerRC=%s pszDesc=%s\n",
+ enmKind, pfnHandlerR3, pszModR0, pszHandlerR0, pszHandlerRC, pszModRC, pszDesc));
/*
* Validate input.
@@ -111,8 +167,7 @@ VMMR3DECL(int) PGMR3HandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType,
* Resolve the R0 handler.
*/
R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0 = NIL_RTR0PTR;
- int rc = VINF_SUCCESS;
- rc = PDMR3LdrGetSymbolR0Lazy(pVM, pszModR0, NULL /*pszSearchPath*/, pszHandlerR0, &pfnHandlerR0);
+ int rc = PDMR3LdrGetSymbolR0Lazy(pVM, pszModR0, NULL /*pszSearchPath*/, pszHandlerR0, &pfnHandlerR0);
if (RT_SUCCESS(rc))
{
/*
@@ -122,8 +177,7 @@ VMMR3DECL(int) PGMR3HandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType,
if (!HMIsEnabled(pVM))
rc = PDMR3LdrGetSymbolRCLazy(pVM, pszModRC, NULL /*pszSearchPath*/, pszHandlerRC, &pfnHandlerRC);
if (RT_SUCCESS(rc))
- return PGMHandlerPhysicalRegisterEx(pVM, enmType, GCPhys, GCPhysLast, pfnHandlerR3, pvUserR3,
- pfnHandlerR0, pvUserR0, pfnHandlerRC, pvUserRC, pszDesc);
+ return PGMR3HandlerPhysicalTypeRegisterEx(pVM, enmKind, pfnHandlerR3, pfnHandlerR0, pfnHandlerRC, pszDesc, phType);
AssertMsgFailed(("Failed to resolve %s.%s, rc=%Rrc.\n", pszModRC, pszHandlerRC, rc));
}
@@ -194,12 +248,13 @@ static DECLCALLBACK(int) pgmR3HandlerPhysicalOneClear(PAVLROGCPHYSNODECORE pNode
*/
static DECLCALLBACK(int) pgmR3HandlerPhysicalOneSet(PAVLROGCPHYSNODECORE pNode, void *pvUser)
{
- PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)pNode;
- unsigned uState = pgmHandlerPhysicalCalcState(pCur);
- PPGMRAMRANGE pRamHint = NULL;
- RTGCPHYS GCPhys = pCur->Core.Key;
- RTUINT cPages = pCur->cPages;
- PVM pVM = (PVM)pvUser;
+ PVM pVM = (PVM)pvUser;
+ PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)pNode;
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pVM, pCur);
+ unsigned uState = pCurType->uState;
+ PPGMRAMRANGE pRamHint = NULL;
+ RTGCPHYS GCPhys = pCur->Core.Key;
+ RTUINT cPages = pCur->cPages;
for (;;)
{
PPGMPAGE pPage;
@@ -523,6 +578,8 @@ typedef struct PGMHANDLERINFOARG
{
/** The output helpers.*/
PCDBGFINFOHLP pHlp;
+ /** Pointer to the cross context VM handle. */
+ PVM pVM;
/** Set if statistics should be dumped. */
bool fStats;
} PGMHANDLERINFOARG, *PPGMHANDLERINFOARG;
@@ -539,7 +596,7 @@ DECLCALLBACK(void) pgmR3InfoHandlers(PVM pVM, PCDBGFINFOHLP pHlp, const char *ps
/*
* Test input.
*/
- PGMHANDLERINFOARG Args = { pHlp, /* .fStats = */ true };
+ PGMHANDLERINFOARG Args = { pHlp, pVM, /* .fStats = */ true };
bool fPhysical = !pszArgs || !*pszArgs;
bool fVirtual = fPhysical;
bool fHyper = fPhysical;
@@ -603,20 +660,22 @@ DECLCALLBACK(void) pgmR3InfoHandlers(PVM pVM, PCDBGFINFOHLP pHlp, const char *ps
*/
static DECLCALLBACK(int) pgmR3InfoHandlersPhysicalOne(PAVLROGCPHYSNODECORE pNode, void *pvUser)
{
- PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)pNode;
- PPGMHANDLERINFOARG pArgs= (PPGMHANDLERINFOARG)pvUser;
- PCDBGFINFOHLP pHlp = pArgs->pHlp;
+ PPGMPHYSHANDLER pCur = (PPGMPHYSHANDLER)pNode;
+ PPGMHANDLERINFOARG pArgs = (PPGMHANDLERINFOARG)pvUser;
+ PCDBGFINFOHLP pHlp = pArgs->pHlp;
+ PPGMPHYSHANDLERTYPEINT pCurType = PGMPHYSHANDLER_GET_TYPE(pArgs->pVM, pCur);
const char *pszType;
- switch (pCur->enmType)
+ switch (pCurType->enmKind)
{
- case PGMPHYSHANDLERTYPE_MMIO: pszType = "MMIO "; break;
- case PGMPHYSHANDLERTYPE_PHYSICAL_WRITE: pszType = "Write "; break;
- case PGMPHYSHANDLERTYPE_PHYSICAL_ALL: pszType = "All "; break;
- default: pszType = "????"; break;
+ case PGMPHYSHANDLERKIND_MMIO: pszType = "MMIO "; break;
+ case PGMPHYSHANDLERKIND_WRITE: pszType = "Write "; break;
+ case PGMPHYSHANDLERKIND_ALL: pszType = "All "; break;
+ default: pszType = "????"; break;
}
pHlp->pfnPrintf(pHlp,
"%RGp - %RGp %RHv %RHv %RRv %RRv %s %s\n",
- pCur->Core.Key, pCur->Core.KeyLast, pCur->pfnHandlerR3, pCur->pvUserR3, pCur->pfnHandlerRC, pCur->pvUserRC, pszType, pCur->pszDesc);
+ pCur->Core.Key, pCur->Core.KeyLast, pCurType->pfnHandlerR3, pCur->pvUserR3, pCurType->pfnHandlerRC, pCur->pvUserRC,
+ pszType, pCur->pszDesc);
#ifdef VBOX_WITH_STATISTICS
if (pArgs->fStats)
pHlp->pfnPrintf(pHlp, " cPeriods: %9RU64 cTicks: %11RU64 Min: %11RU64 Avg: %11RU64 Max: %11RU64\n",
diff --git a/src/VBox/VMM/VMMR3/PGMPhys.cpp b/src/VBox/VMM/VMMR3/PGMPhys.cpp
index ac96671..89d23f2 100644
--- a/src/VBox/VMM/VMMR3/PGMPhys.cpp
+++ b/src/VBox/VMM/VMMR3/PGMPhys.cpp
@@ -54,12 +54,6 @@
#define PGMPHYS_FREE_PAGE_BATCH_SIZE 128
-/*******************************************************************************
-* Internal Functions *
-*******************************************************************************/
-static DECLCALLBACK(int) pgmR3PhysRomWriteHandler(PVM pVM, RTGCPHYS GCPhys, void *pvPhys, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser);
-
-
/*
* PGMR3PhysReadU8-64
* PGMR3PhysWriteU8-64
@@ -2171,19 +2165,14 @@ int pgmR3PhysRamTerm(PVM pVM)
* @param pVM Pointer to the VM.
* @param GCPhys The start of the MMIO region.
* @param cb The size of the MMIO region.
- * @param pfnHandlerR3 The address of the ring-3 handler. (IOMR3MMIOHandler)
+ * @param hType The physical access handler type registration.
* @param pvUserR3 The user argument for R3.
- * @param pfnHandlerR0 The address of the ring-0 handler. (IOMMMIOHandler)
* @param pvUserR0 The user argument for R0.
- * @param pfnHandlerRC The address of the RC handler. (IOMMMIOHandler)
* @param pvUserRC The user argument for RC.
* @param pszDesc The description of the MMIO region.
*/
-VMMR3DECL(int) PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb,
- R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3, RTR3PTR pvUserR3,
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0, RTR0PTR pvUserR0,
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC, RTRCPTR pvUserRC,
- R3PTRTYPE(const char *) pszDesc)
+VMMR3DECL(int) PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb, PGMPHYSHANDLERTYPE hType,
+ RTR3PTR pvUserR3, RTR0PTR pvUserR0, RTRCPTR pvUserRC, const char *pszDesc)
{
/*
* Assert on some assumption.
@@ -2193,6 +2182,7 @@ VMMR3DECL(int) PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb,
AssertReturn(!(GCPhys & PAGE_OFFSET_MASK), VERR_INVALID_PARAMETER);
AssertPtrReturn(pszDesc, VERR_INVALID_POINTER);
AssertReturn(*pszDesc, VERR_INVALID_PARAMETER);
+ Assert(((PPGMPHYSHANDLERTYPEINT)MMHyperHeapOffsetToPtr(pVM, hType))->enmKind == PGMPHYSHANDLERKIND_MMIO);
int rc = pgmLock(pVM);
AssertRCReturn(rc, rc);
@@ -2305,10 +2295,7 @@ VMMR3DECL(int) PGMR3PhysMMIORegister(PVM pVM, RTGCPHYS GCPhys, RTGCPHYS cb,
/*
* Register the access handler.
*/
- rc = PGMHandlerPhysicalRegisterEx(pVM, PGMPHYSHANDLERTYPE_MMIO, GCPhys, GCPhysLast,
- pfnHandlerR3, pvUserR3,
- pfnHandlerR0, pvUserR0,
- pfnHandlerRC, pvUserRC, pszDesc);
+ rc = PGMHandlerPhysicalRegister(pVM, GCPhys, GCPhysLast, hType, pvUserR3, pvUserR0, pvUserRC, pszDesc);
if ( RT_FAILURE(rc)
&& !fRamExists)
{
@@ -3337,17 +3324,15 @@ static int pgmR3PhysRomRegister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhys, RT
#ifdef VBOX_WITH_REM
REMR3NotifyPhysRomRegister(pVM, GCPhys, cb, NULL, true /* fShadowed */);
#endif
- rc = PGMR3HandlerPhysicalRegister(pVM, PGMPHYSHANDLERTYPE_PHYSICAL_WRITE, GCPhys, GCPhysLast,
- pgmR3PhysRomWriteHandler, pRomNew,
- NULL, "pgmPhysRomWriteHandler", MMHyperCCToR0(pVM, pRomNew),
- NULL, "pgmPhysRomWriteHandler", MMHyperCCToRC(pVM, pRomNew), pszDesc);
+ rc = PGMHandlerPhysicalRegister(pVM, GCPhys, GCPhysLast, pVM->pgm.s.hRomPhysHandlerType,
+ pRomNew, MMHyperCCToR0(pVM, pRomNew), MMHyperCCToRC(pVM, pRomNew),
+ pszDesc);
}
else
{
- rc = PGMR3HandlerPhysicalRegister(pVM, PGMPHYSHANDLERTYPE_PHYSICAL_WRITE, GCPhys, GCPhysLast,
- pgmR3PhysRomWriteHandler, pRomNew,
- NULL, "pgmPhysRomWriteHandler", MMHyperCCToR0(pVM, pRomNew),
- NULL, "pgmPhysRomWriteHandler", MMHyperCCToRC(pVM, pRomNew), pszDesc);
+ rc = PGMHandlerPhysicalRegister(pVM, GCPhys, GCPhysLast, pVM->pgm.s.hRomPhysHandlerType,
+ pRomNew, MMHyperCCToR0(pVM, pRomNew), MMHyperCCToRC(pVM, pRomNew),
+ pszDesc);
#ifdef VBOX_WITH_REM
REMR3NotifyPhysRomRegister(pVM, GCPhys, cb, NULL, false /* fShadowed */);
#endif
@@ -3521,8 +3506,8 @@ VMMR3DECL(int) PGMR3PhysRomRegister(PVM pVM, PPDMDEVINS pDevIns, RTGCPHYS GCPhys
* @param enmAccessType The access type.
* @param pvUser User argument.
*/
-static DECLCALLBACK(int) pgmR3PhysRomWriteHandler(PVM pVM, RTGCPHYS GCPhys, void *pvPhys, void *pvBuf, size_t cbBuf,
- PGMACCESSTYPE enmAccessType, void *pvUser)
+DECLCALLBACK(int) pgmR3PhysRomWriteHandler(PVM pVM, RTGCPHYS GCPhys, void *pvPhys, void *pvBuf, size_t cbBuf,
+ PGMACCESSTYPE enmAccessType, void *pvUser)
{
PPGMROMRANGE pRom = (PPGMROMRANGE)pvUser;
const uint32_t iPage = (GCPhys - pRom->GCPhys) >> PAGE_SHIFT;
diff --git a/src/VBox/VMM/VMMR3/PGMPool.cpp b/src/VBox/VMM/VMMR3/PGMPool.cpp
index 15a005a..41e4735 100644
--- a/src/VBox/VMM/VMMR3/PGMPool.cpp
+++ b/src/VBox/VMM/VMMR3/PGMPool.cpp
@@ -279,8 +279,16 @@ int pgmR3PoolInit(PVM pVM)
pPool->iAgeHead = NIL_PGMPOOL_IDX;
pPool->iAgeTail = NIL_PGMPOOL_IDX;
pPool->fCacheEnabled = fCacheEnabled;
- pPool->pfnAccessHandlerR3 = pgmR3PoolAccessHandler;
- pPool->pszAccessHandler = "Guest Paging Access Handler";
+
+ pPool->hAccessHandlerType = NIL_PGMPHYSHANDLERTYPE;
+ rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_WRITE,
+ pgmR3PoolAccessHandler,
+ NULL, "pgmPoolAccessHandler",
+ NULL, "pgmPoolAccessHandler",
+ "Guest Paging Access Handler",
+ &pPool->hAccessHandlerType);
+ AssertLogRelRCReturn(rc, rc);
+
pPool->HCPhysTree = 0;
/*
@@ -410,19 +418,6 @@ void pgmR3PoolRelocate(PVM pVM)
pVM->pgm.s.pPoolR3->pVMRC = pVM->pVMRC;
pVM->pgm.s.pPoolR3->paUsersRC = MMHyperR3ToRC(pVM, pVM->pgm.s.pPoolR3->paUsersR3);
pVM->pgm.s.pPoolR3->paPhysExtsRC = MMHyperR3ToRC(pVM, pVM->pgm.s.pPoolR3->paPhysExtsR3);
-
- if (!HMIsEnabled(pVM))
- {
- int rc = PDMR3LdrGetSymbolRC(pVM, NULL, "pgmPoolAccessHandler", &pVM->pgm.s.pPoolR3->pfnAccessHandlerRC);
- AssertReleaseRC(rc);
- }
-
- /* init order hack. */
- if (!pVM->pgm.s.pPoolR3->pfnAccessHandlerR0)
- {
- int rc = PDMR3LdrGetSymbolR0(pVM, NULL, "pgmPoolAccessHandler", &pVM->pgm.s.pPoolR3->pfnAccessHandlerR0);
- AssertReleaseRC(rc);
- }
}
diff --git a/src/VBox/VMM/VMMR3/SSM.cpp b/src/VBox/VMM/VMMR3/SSM.cpp
index de07040..f08cd77 100644
--- a/src/VBox/VMM/VMMR3/SSM.cpp
+++ b/src/VBox/VMM/VMMR3/SSM.cpp
@@ -3713,7 +3713,7 @@ VMMR3DECL(int) SSMR3PutStructEx(PSSMHANDLE pSSM, const void *pvStruct, size_t cb
* Put the fields
*/
rc = VINF_SUCCESS;
- uint32_t off = 0;
+ uint32_t off = 0;
for (PCSSMFIELD pCur = paFields;
pCur->cb != UINT32_MAX && pCur->off != UINT32_MAX;
pCur++)
@@ -6544,46 +6544,49 @@ VMMR3DECL(int) SSMR3GetStruct(PSSMHANDLE pSSM, void *pvStruct, PCSSMFIELD paFiel
pCur->cb != UINT32_MAX && pCur->off != UINT32_MAX;
pCur++)
{
- uint8_t *pbField = (uint8_t *)pvStruct + pCur->off;
- switch ((uintptr_t)pCur->pfnGetPutOrTransformer)
+ if (pCur->uFirstVer <= pSSM->u.Read.uCurUnitVer)
{
- case SSMFIELDTRANS_NO_TRANSFORMATION:
- rc = ssmR3DataRead(pSSM, pbField, pCur->cb);
- break;
+ uint8_t *pbField = (uint8_t *)pvStruct + pCur->off;
+ switch ((uintptr_t)pCur->pfnGetPutOrTransformer)
+ {
+ case SSMFIELDTRANS_NO_TRANSFORMATION:
+ rc = ssmR3DataRead(pSSM, pbField, pCur->cb);
+ break;
- case SSMFIELDTRANS_GCPTR:
- AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField);
- break;
+ case SSMFIELDTRANS_GCPTR:
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField);
+ break;
- case SSMFIELDTRANS_GCPHYS:
- AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField);
- break;
+ case SSMFIELDTRANS_GCPHYS:
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField);
+ break;
- case SSMFIELDTRANS_RCPTR:
- AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField);
- break;
+ case SSMFIELDTRANS_RCPTR:
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField);
+ break;
- case SSMFIELDTRANS_RCPTR_ARRAY:
+ case SSMFIELDTRANS_RCPTR_ARRAY:
+ {
+ uint32_t const cEntries = pCur->cb / sizeof(RTRCPTR);
+ AssertMsgBreakStmt(pCur->cb == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = VINF_SUCCESS;
+ for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
+ rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]);
+ break;
+ }
+
+ default:
+ AssertMsgFailedBreakStmt(("%#x\n", pCur->pfnGetPutOrTransformer), rc = VERR_SSM_FIELD_COMPLEX);
+ }
+ if (RT_FAILURE(rc))
{
- uint32_t const cEntries = pCur->cb / sizeof(RTRCPTR);
- AssertMsgBreakStmt(pCur->cb == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = VINF_SUCCESS;
- for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
- rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]);
- break;
+ if (RT_SUCCESS(pSSM->rc))
+ pSSM->rc = rc;
+ return rc;
}
-
- default:
- AssertMsgFailedBreakStmt(("%#x\n", pCur->pfnGetPutOrTransformer), rc = VERR_SSM_FIELD_COMPLEX);
- }
- if (RT_FAILURE(rc))
- {
- if (RT_SUCCESS(pSSM->rc))
- pSSM->rc = rc;
- return rc;
}
}
@@ -6707,182 +6710,185 @@ VMMR3DECL(int) SSMR3GetStructEx(PSSMHANDLE pSSM, void *pvStruct, size_t cbStruct
("off=%#x offField=%#x (%s)\n", off, offField, pCur->pszName),
pSSM->rc = VERR_SSM_FIELD_NOT_CONSECUTIVE);
- rc = VINF_SUCCESS;
- uint8_t *pbField = (uint8_t *)pvStruct + offField;
- switch ((uintptr_t)pCur->pfnGetPutOrTransformer)
+ if (pCur->uFirstVer <= pSSM->u.Read.uCurUnitVer)
{
- case SSMFIELDTRANS_NO_TRANSFORMATION:
- rc = ssmR3DataRead(pSSM, pbField, cbField);
- break;
-
- case SSMFIELDTRANS_GCPHYS:
- AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField);
- break;
+ rc = VINF_SUCCESS;
+ uint8_t *pbField = (uint8_t *)pvStruct + offField;
+ switch ((uintptr_t)pCur->pfnGetPutOrTransformer)
+ {
+ case SSMFIELDTRANS_NO_TRANSFORMATION:
+ rc = ssmR3DataRead(pSSM, pbField, cbField);
+ break;
- case SSMFIELDTRANS_GCPTR:
- AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField);
- break;
+ case SSMFIELDTRANS_GCPHYS:
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField);
+ break;
- case SSMFIELDTRANS_RCPTR:
- AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField);
- break;
+ case SSMFIELDTRANS_GCPTR:
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField);
+ break;
- case SSMFIELDTRANS_RCPTR_ARRAY:
- {
- uint32_t const cEntries = cbField / sizeof(RTRCPTR);
- AssertMsgBreakStmt(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = VINF_SUCCESS;
- for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
- rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]);
- break;
- }
+ case SSMFIELDTRANS_RCPTR:
+ AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField);
+ break;
- case SSMFIELDTRANS_HCPTR_NI:
- AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = ssmR3GetHCPtrNI(pSSM, (void **)pbField, fFlags);
- break;
+ case SSMFIELDTRANS_RCPTR_ARRAY:
+ {
+ uint32_t const cEntries = cbField / sizeof(RTRCPTR);
+ AssertMsgBreakStmt(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = VINF_SUCCESS;
+ for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
+ rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]);
+ break;
+ }
- case SSMFIELDTRANS_HCPTR_NI_ARRAY:
- {
- uint32_t const cEntries = cbField / sizeof(void *);
- AssertMsgBreakStmt(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = VINF_SUCCESS;
- for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
- rc = ssmR3GetHCPtrNI(pSSM, &((void **)pbField)[i], fFlags);
- break;
- }
+ case SSMFIELDTRANS_HCPTR_NI:
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = ssmR3GetHCPtrNI(pSSM, (void **)pbField, fFlags);
+ break;
- case SSMFIELDTRANS_HCPTR_HACK_U32:
- AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- *(uintptr_t *)pbField = 0;
- rc = ssmR3DataRead(pSSM, pbField, sizeof(uint32_t));
- if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && ssmR3GetHostBits(pSSM) == 64)
+ case SSMFIELDTRANS_HCPTR_NI_ARRAY:
{
- uint32_t u32;
- rc = ssmR3DataRead(pSSM, &u32, sizeof(uint32_t));
- AssertMsgBreakStmt(RT_FAILURE(rc) || u32 == 0 || (fFlags & SSMSTRUCT_FLAGS_SAVED_AS_MEM),
- ("high=%#x low=%#x (%s)\n", u32, *(uint32_t *)pbField, pCur->pszName),
- rc = VERR_SSM_FIELD_INVALID_VALUE);
+ uint32_t const cEntries = cbField / sizeof(void *);
+ AssertMsgBreakStmt(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = VINF_SUCCESS;
+ for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++)
+ rc = ssmR3GetHCPtrNI(pSSM, &((void **)pbField)[i], fFlags);
+ break;
}
- break;
- case SSMFIELDTRANS_U32_ZX_U64:
- AssertMsgBreakStmt(cbField == sizeof(uint64_t), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- ((uint32_t *)pbField)[1] = 0;
- rc = SSMR3GetU32(pSSM, (uint32_t *)pbField);
- break;
+ case SSMFIELDTRANS_HCPTR_HACK_U32:
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ *(uintptr_t *)pbField = 0;
+ rc = ssmR3DataRead(pSSM, pbField, sizeof(uint32_t));
+ if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && ssmR3GetHostBits(pSSM) == 64)
+ {
+ uint32_t u32;
+ rc = ssmR3DataRead(pSSM, &u32, sizeof(uint32_t));
+ AssertMsgBreakStmt(RT_FAILURE(rc) || u32 == 0 || (fFlags & SSMSTRUCT_FLAGS_SAVED_AS_MEM),
+ ("high=%#x low=%#x (%s)\n", u32, *(uint32_t *)pbField, pCur->pszName),
+ rc = VERR_SSM_FIELD_INVALID_VALUE);
+ }
+ break;
+ case SSMFIELDTRANS_U32_ZX_U64:
+ AssertMsgBreakStmt(cbField == sizeof(uint64_t), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ ((uint32_t *)pbField)[1] = 0;
+ rc = SSMR3GetU32(pSSM, (uint32_t *)pbField);
+ break;
- case SSMFIELDTRANS_IGNORE:
- if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
- rc = SSMR3Skip(pSSM, cbField);
- break;
- case SSMFIELDTRANS_IGN_GCPHYS:
- AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
- rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys);
- break;
+ case SSMFIELDTRANS_IGNORE:
+ if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
+ rc = SSMR3Skip(pSSM, cbField);
+ break;
- case SSMFIELDTRANS_IGN_GCPTR:
- AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
- rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr);
- break;
+ case SSMFIELDTRANS_IGN_GCPHYS:
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
+ rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys);
+ break;
- case SSMFIELDTRANS_IGN_RCPTR:
- AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
- rc = SSMR3Skip(pSSM, sizeof(RTRCPTR));
- break;
+ case SSMFIELDTRANS_IGN_GCPTR:
+ AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
+ rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr);
+ break;
- case SSMFIELDTRANS_IGN_HCPTR:
- AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
- rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8);
- break;
+ case SSMFIELDTRANS_IGN_RCPTR:
+ AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
+ rc = SSMR3Skip(pSSM, sizeof(RTRCPTR));
+ break;
+ case SSMFIELDTRANS_IGN_HCPTR:
+ AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
+ rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8);
+ break;
- case SSMFIELDTRANS_OLD:
- AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3Skip(pSSM, pCur->cb);
- break;
- case SSMFIELDTRANS_OLD_GCPHYS:
- AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys);
- break;
+ case SSMFIELDTRANS_OLD:
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3Skip(pSSM, pCur->cb);
+ break;
- case SSMFIELDTRANS_OLD_GCPTR:
- AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr);
- break;
+ case SSMFIELDTRANS_OLD_GCPHYS:
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys);
+ break;
- case SSMFIELDTRANS_OLD_RCPTR:
- AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3Skip(pSSM, sizeof(RTRCPTR));
- break;
+ case SSMFIELDTRANS_OLD_GCPTR:
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr);
+ break;
- case SSMFIELDTRANS_OLD_HCPTR:
- AssertMsgBreakStmt(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8);
- break;
+ case SSMFIELDTRANS_OLD_RCPTR:
+ AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3Skip(pSSM, sizeof(RTRCPTR));
+ break;
- case SSMFIELDTRANS_OLD_PAD_HC:
- AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) == 64 ? RT_HIWORD(pCur->cb) : RT_LOWORD(pCur->cb));
- break;
+ case SSMFIELDTRANS_OLD_HCPTR:
+ AssertMsgBreakStmt(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8);
+ break;
- case SSMFIELDTRANS_OLD_PAD_MSC32:
- AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
- if (ssmR3IsHostMsc32(pSSM))
- rc = SSMR3Skip(pSSM, pCur->cb);
- break;
+ case SSMFIELDTRANS_OLD_PAD_HC:
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) == 64 ? RT_HIWORD(pCur->cb) : RT_LOWORD(pCur->cb));
+ break;
+ case SSMFIELDTRANS_OLD_PAD_MSC32:
+ AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE);
+ if (ssmR3IsHostMsc32(pSSM))
+ rc = SSMR3Skip(pSSM, pCur->cb);
+ break;
- case SSMFIELDTRANS_PAD_HC:
- case SSMFIELDTRANS_PAD_HC32:
- case SSMFIELDTRANS_PAD_HC64:
- case SSMFIELDTRANS_PAD_HC_AUTO:
- case SSMFIELDTRANS_PAD_MSC32_AUTO:
- {
- uint32_t cb32 = RT_BYTE1(pCur->cb);
- uint32_t cb64 = RT_BYTE2(pCur->cb);
- uint32_t cbCtx = HC_ARCH_BITS == 64
- || ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
- && !SSM_HOST_IS_MSC_32)
- ? cb64 : cb32;
- uint32_t cbSaved = ssmR3GetHostBits(pSSM) == 64
- || ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
- && !ssmR3IsHostMsc32(pSSM))
- ? cb64 : cb32;
- AssertMsgBreakStmt( cbField == cbCtx
- && ( ( pCur->off == UINT32_MAX / 2
- && ( cbField == 0
- || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO
- || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
+
+ case SSMFIELDTRANS_PAD_HC:
+ case SSMFIELDTRANS_PAD_HC32:
+ case SSMFIELDTRANS_PAD_HC64:
+ case SSMFIELDTRANS_PAD_HC_AUTO:
+ case SSMFIELDTRANS_PAD_MSC32_AUTO:
+ {
+ uint32_t cb32 = RT_BYTE1(pCur->cb);
+ uint32_t cb64 = RT_BYTE2(pCur->cb);
+ uint32_t cbCtx = HC_ARCH_BITS == 64
+ || ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
+ && !SSM_HOST_IS_MSC_32)
+ ? cb64 : cb32;
+ uint32_t cbSaved = ssmR3GetHostBits(pSSM) == 64
+ || ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
+ && !ssmR3IsHostMsc32(pSSM))
+ ? cb64 : cb32;
+ AssertMsgBreakStmt( cbField == cbCtx
+ && ( ( pCur->off == UINT32_MAX / 2
+ && ( cbField == 0
+ || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO
+ || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
+ )
)
- )
- || (pCur->off != UINT32_MAX / 2 && cbField != 0)
- )
- , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
- cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
- rc = VERR_SSM_FIELD_INVALID_PADDING_SIZE);
- if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
- rc = SSMR3Skip(pSSM, cbSaved);
- break;
- }
+ || (pCur->off != UINT32_MAX / 2 && cbField != 0)
+ )
+ , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
+ cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
+ rc = VERR_SSM_FIELD_INVALID_PADDING_SIZE);
+ if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
+ rc = SSMR3Skip(pSSM, cbSaved);
+ break;
+ }
- default:
- AssertBreakStmt(pCur->pfnGetPutOrTransformer, rc = VERR_SSM_FIELD_INVALID_CALLBACK);
- rc = pCur->pfnGetPutOrTransformer(pSSM, pCur, pvStruct, fFlags, true /*fGetOrPut*/, pvUser);
+ default:
+ AssertBreakStmt(pCur->pfnGetPutOrTransformer, rc = VERR_SSM_FIELD_INVALID_CALLBACK);
+ rc = pCur->pfnGetPutOrTransformer(pSSM, pCur, pvStruct, fFlags, true /*fGetOrPut*/, pvUser);
+ break;
+ }
+ if (RT_FAILURE(rc))
break;
}
- if (RT_FAILURE(rc))
- break;
off = offField + cbField;
}
diff --git a/src/VBox/VMM/VMMR3/TM.cpp b/src/VBox/VMM/VMMR3/TM.cpp
index 2b0a318..933743b 100644
--- a/src/VBox/VMM/VMMR3/TM.cpp
+++ b/src/VBox/VMM/VMMR3/TM.cpp
@@ -3116,8 +3116,9 @@ static DECLCALLBACK(VBOXSTRICTRC) tmR3CpuTickParavirtEnable(PVM pVM, PVMCPU pVCp
Assert(uRawNewTsc - pVCpu->tm.s.offTSCRawSrc >= uOldTsc); /* paranoia^256 */
}
+ LogRel(("TM: Switching TSC mode from '%s' to '%s'\n", tmR3GetTSCModeNameEx(pVM->tm.s.enmTSCMode),
+ tmR3GetTSCModeNameEx(TMTSCMODE_REAL_TSC_OFFSET)));
pVM->tm.s.enmTSCMode = TMTSCMODE_REAL_TSC_OFFSET;
- LogRel(("TM: Switched TSC mode. New enmTSCMode=%d (%s)\n", pVM->tm.s.enmTSCMode, tmR3GetTSCModeName(pVM)));
return VINF_SUCCESS;
}
@@ -3139,8 +3140,8 @@ VMMR3_INT_DECL(int) TMR3CpuTickParavirtEnable(PVM pVM)
rc = VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ONCE, tmR3CpuTickParavirtEnable, NULL);
}
else
- LogRel(("TM: Host/VM is not suitable for using TSC mode %d (%s). Request to change TSC mode ignored.\n",
- TMTSCMODE_REAL_TSC_OFFSET, tmR3GetTSCModeNameEx(TMTSCMODE_REAL_TSC_OFFSET)));
+ LogRel(("TM: Host/VM is not suitable for using TSC mode '%s', request to change TSC mode ignored\n",
+ tmR3GetTSCModeNameEx(TMTSCMODE_REAL_TSC_OFFSET)));
pVM->tm.s.fParavirtTscEnabled = true;
return rc;
}
@@ -3173,8 +3174,10 @@ static DECLCALLBACK(VBOXSTRICTRC) tmR3CpuTickParavirtDisable(PVM pVM, PVMCPU pVC
need it) while in pure TSC-offsetting mode. */
pVCpu->tm.s.u64TSCLastSeen = uOldTsc;
}
+
+ LogRel(("TM: Switching TSC mode from '%s' to '%s'\n", tmR3GetTSCModeNameEx(pVM->tm.s.enmTSCMode),
+ tmR3GetTSCModeNameEx(pVM->tm.s.enmOriginalTSCMode)));
pVM->tm.s.enmTSCMode = pVM->tm.s.enmOriginalTSCMode;
- LogRel(("TM: Switched TSC mode. New enmTSCMode=%d (%s)\n", pVM->tm.s.enmTSCMode, tmR3GetTSCModeName(pVM)));
return VINF_SUCCESS;
}
diff --git a/src/VBox/VMM/VMMR3/VMM.cpp b/src/VBox/VMM/VMMR3/VMM.cpp
index b424fc2..8d74683 100644
--- a/src/VBox/VMM/VMMR3/VMM.cpp
+++ b/src/VBox/VMM/VMMR3/VMM.cpp
@@ -1429,8 +1429,13 @@ DECLCALLBACK(int) vmmR3SendInitIpi(PVM pVM, VMCPUID idCpu)
Log(("vmmR3SendInitIpi for VCPU %d\n", idCpu));
PGMR3ResetCpu(pVM, pVCpu);
+ PDMR3ResetCpu(pVCpu); /* Clear any pending interrupts */
+ TRPMR3ResetCpu(pVCpu);
CPUMR3ResetCpu(pVM, pVCpu);
+ EMR3ResetCpu(pVCpu);
+ HMR3ResetCpu(pVCpu);
+ /* This will trickle up on the target EMT. */
return VINF_EM_WAIT_SIPI;
}
diff --git a/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac b/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac
index 9cc77cb..bd30898 100644
--- a/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac
+++ b/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac
@@ -808,6 +808,8 @@ ENDPROC vmmR0ToRawModeAsm
; * @param HCPhysCpuPage VMXON physical address [rsp+8]
; * @param HCPhysVmcs VMCS physical address [rsp+16]
; * @param pCache VMCS cache [rsp+24]
+; * @param pVM The VM handle [rbp+28h]
+; * @param pVM The VMCPU handle. [rbp+30h]
; * @param pCtx Guest context (rsi)
; */
BEGINPROC VMXRCStartVM64
@@ -952,6 +954,7 @@ ALIGN(16)
; Manual save and restore:
; - General purpose registers except RIP, RSP
+ ; - XCR0
;
; Trashed:
; - CR2 (we don't care)
@@ -964,6 +967,31 @@ ALIGN(16)
mov qword [rbx + VMCSCACHE.uPos], 5
%endif
+ ;
+ ; Save the host XCR0 and load the guest one if necessary.
+ ; Note! Trashes rdx and rcx.
+ ;
+ mov rax, [rbp + 30h] ; pVCpu
+ test byte [rax + VMCPU.hm + HMCPU.fLoadSaveGuestXcr0], 1
+ jz .xcr0_before_skip
+
+ xor ecx, ecx
+ xgetbv ; Save the host one on the stack.
+ push rdx
+ push rax
+
+ mov eax, [xSI + CPUMCTX.aXcr] ; Load the guest one.
+ mov edx, [xSI + CPUMCTX.aXcr + 4]
+ xor ecx, ecx ; paranoia
+ xsetbv
+
+ push 0 ; Indicate that we must restore XCR0 (popped into ecx, thus 0).
+ jmp .xcr0_before_done
+
+.xcr0_before_skip:
+ push 3fh ; indicate that we need not.
+.xcr0_before_done:
+
; Save the pCtx pointer
push rsi
@@ -1038,6 +1066,15 @@ ALIGNCODE(16)
pop rsi ; pCtx (needed in rsi by the macros below)
+ ; Restore the host xcr0 if necessary.
+ pop rcx
+ test ecx, ecx
+ jnz .xcr0_after_skip
+ pop rax
+ pop rdx
+ xsetbv ; ecx is already zero.
+.xcr0_after_skip:
+
%ifdef VMX_USE_CACHED_VMCS_ACCESSES
pop rdi ; Saved pCache
@@ -1115,6 +1152,15 @@ ALIGN(16)
.vmstart64_invalid_vmcs_ptr:
pop rsi ; pCtx (needed in rsi by the macros below)
+ ; Restore the host xcr0 if necessary.
+ pop rcx
+ test ecx, ecx
+ jnz .xcr0_after_skip2
+ pop rax
+ pop rdx
+ xsetbv ; ecx is already zero.
+.xcr0_after_skip2:
+
%ifdef VMX_USE_CACHED_VMCS_ACCESSES
pop rdi ; pCache
%ifdef VBOX_WITH_CRASHDUMP_MAGIC
@@ -1137,6 +1183,15 @@ ALIGN(16)
.vmstart64_start_failed:
pop rsi ; pCtx (needed in rsi by the macros below)
+ ; Restore the host xcr0 if necessary.
+ pop rcx
+ test ecx, ecx
+ jnz .xcr0_after_skip3
+ pop rax
+ pop rdx
+ xsetbv ; ecx is already zero.
+.xcr0_after_skip3:
+
%ifdef VMX_USE_CACHED_VMCS_ACCESSES
pop rdi ; pCache
@@ -1158,14 +1213,16 @@ ALIGN(16)
ENDPROC VMXRCStartVM64
-;/**
-; * Prepares for and executes VMRUN (64 bits guests)
-; *
-; * @returns VBox status code
-; * @param HCPhysVMCB Physical address of host VMCB (rsp+8)
-; * @param HCPhysVMCB Physical address of guest VMCB (rsp+16)
-; * @param pCtx Guest context (rsi)
-; */
+;;
+; Prepares for and executes VMRUN (64 bits guests)
+;
+; @returns VBox status code
+; @param HCPhysVMCB Physical address of host VMCB [rbp+10h]
+; @param HCPhysVMCB Physical address of guest VMCB [rbp+18h]
+; @param pVM The VM handle [rbp+20h]
+; @param pVCpu The VMCPU handle. [rbp+28h]
+; @param pCtx Guest context [rsi]
+;
BEGINPROC SVMRCVMRun64
push rbp
mov rbp, rsp
@@ -1181,6 +1238,30 @@ BEGINPROC SVMRCVMRun64
; - DRx (presumably not changed at all)
; - DR7 (reset to 0x400)
+ ;
+ ; Save the host XCR0 and load the guest one if necessary.
+ ;
+ mov rax, [rbp + 28h] ; pVCpu
+ test byte [rax + VMCPU.hm + HMCPU.fLoadSaveGuestXcr0], 1
+ jz .xcr0_before_skip
+
+ xor ecx, ecx
+ xgetbv ; Save the host one on the stack.
+ push rdx
+ push rax
+
+ mov eax, [xSI + CPUMCTX.aXcr] ; Load the guest one.
+ mov edx, [xSI + CPUMCTX.aXcr + 4]
+ xor ecx, ecx ; paranoia
+ xsetbv
+
+ push 0 ; Indicate that we must restore XCR0 (popped into ecx, thus 0).
+ jmp .xcr0_before_done
+
+.xcr0_before_skip:
+ push 3fh ; indicate that we need not.
+.xcr0_before_done:
+
; Save the Guest CPU context pointer.
push rsi ; Push for saving the state at the end
@@ -1248,6 +1329,17 @@ BEGINPROC SVMRCVMRun64
mov qword [rax + CPUMCTX.r14], r14
mov qword [rax + CPUMCTX.r15], r15
+ ;
+ ; Restore the host xcr0 if necessary.
+ ;
+ pop rcx
+ test ecx, ecx
+ jnz .xcr0_after_skip
+ pop rax
+ pop rdx
+ xsetbv ; ecx is already zero.
+.xcr0_after_skip:
+
mov eax, VINF_SUCCESS
popf
diff --git a/src/VBox/VMM/include/CPUMInternal.h b/src/VBox/VMM/include/CPUMInternal.h
index a9425a2..8ec19e4 100644
--- a/src/VBox/VMM/include/CPUMInternal.h
+++ b/src/VBox/VMM/include/CPUMInternal.h
@@ -122,7 +122,11 @@ typedef uint64_t STAMCOUNTER;
/** @name CPUM Saved State Version.
* @{ */
/** The current saved state version. */
-#define CPUM_SAVED_STATE_VERSION 16
+#define CPUM_SAVED_STATE_VERSION CPUM_SAVED_STATE_VERSION_XSAVE
+/** The saved state version including XSAVE state. */
+#define CPUM_SAVED_STATE_VERSION_XSAVE 17
+/** The saved state version with good CPUID leaf count. */
+#define CPUM_SAVED_STATE_VERSION_GOOD_CPUID_COUNT 16
/** CPUID changes with explode forgetting to update the leaf count on
* restore, resulting in garbage being saved restoring+saving old states). */
#define CPUM_SAVED_STATE_VERSION_BAD_CPUID_COUNT 15
@@ -525,6 +529,7 @@ int cpumR3CpuIdExplodeFeatures(PCCPUMCPUIDLEAF paLeaves, uint32_
int cpumR3InitCpuIdAndMsrs(PVM pVM);
void cpumR3SaveCpuId(PVM pVM, PSSMHANDLE pSSM);
int cpumR3LoadCpuId(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion);
+int cpumR3LoadCpuIdPre32(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion);
DECLCALLBACK(void) cpumR3CpuIdInfo(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs);
int cpumR3DbGetCpuInfo(const char *pszName, PCPUMINFO pInfo);
diff --git a/src/VBox/VMM/include/GIMInternal.h b/src/VBox/VMM/include/GIMInternal.h
index 414a073..f00956a 100644
--- a/src/VBox/VMM/include/GIMInternal.h
+++ b/src/VBox/VMM/include/GIMInternal.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2014 Oracle Corporation
+ * Copyright (C) 2014-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -19,6 +19,7 @@
#define ___GIMInternal_h
#include <VBox/vmm/gim.h>
+#include <VBox/vmm/pgm.h>
#include "GIMHvInternal.h"
#include "GIMKvmInternal.h"
#include "GIMMinimalInternal.h"
@@ -45,6 +46,11 @@ typedef struct GIM
/** The interface implementation version. */
uint32_t u32Version;
+ /** Physical access handler type for semi-read-only MMIO2 memory. Lazy creation. */
+ PGMPHYSHANDLERTYPE hSemiReadOnlyMmio2Handler;
+ /** Alignment padding. */
+ uint32_t u32Padding;
+
/** Pointer to the GIM device - ring-3 context. */
R3PTRTYPE(PPDMDEVINS) pDevInsR3;
#if 0
diff --git a/src/VBox/VMM/include/GIMKvmInternal.h b/src/VBox/VMM/include/GIMKvmInternal.h
index 608ddf1..c6c93e6 100644
--- a/src/VBox/VMM/include/GIMKvmInternal.h
+++ b/src/VBox/VMM/include/GIMKvmInternal.h
@@ -252,7 +252,7 @@ VMMR3_INT_DECL(int) gimR3KvmLoad(PVM pVM, PSSMHANDLE pSSM, uint32_t
VMMR3_INT_DECL(int) gimR3KvmDisableSystemTime(PVM pVM);
VMMR3_INT_DECL(int) gimR3KvmEnableSystemTime(PVM pVM, PVMCPU pVCpu, PGIMKVMCPU pKvmCpu, uint8_t fFlags);
-VMMR3_INT_DECL(int) gimR3KvmEnableWallClock(PVM pVM, RTGCPHYS GCPhysSysTime, uint32_t uVersion);
+VMMR3_INT_DECL(int) gimR3KvmEnableWallClock(PVM pVM, RTGCPHYS GCPhysSysTime);
#endif /* IN_RING3 */
VMM_INT_DECL(bool) gimKvmIsParavirtTscEnabled(PVM pVM);
diff --git a/src/VBox/VMM/include/HMInternal.h b/src/VBox/VMM/include/HMInternal.h
index 4d30d5b..fe23d99 100644
--- a/src/VBox/VMM/include/HMInternal.h
+++ b/src/VBox/VMM/include/HMInternal.h
@@ -562,6 +562,9 @@ typedef R0PTRTYPE(FNHMSVMVMRUN *) PFNHMSVMVMRUN;
/**
* HM VMCPU Instance data.
+ *
+ * Note! If you change members of this struct, make sure to check if the
+ * assembly counterpart in HMInternal.mac needs to be updated as well.
*/
typedef struct HMCPU
{
@@ -581,12 +584,15 @@ typedef struct HMCPU
bool fUsingHyperDR7;
/** Whether to preload the guest-FPU state to avoid #NM VM-exit overhead. */
bool fPreloadGuestFpu;
+ /** Set if XCR0 needs to be loaded and saved when entering and exiting guest
+ * code execution. */
+ bool fLoadSaveGuestXcr0;
/** Whether #UD needs to be intercepted (required by certain GIM providers). */
bool fGIMTrapXcptUD;
/** Whether paravirt. hypercalls are enabled. */
bool fHypercallsEnabled;
- uint8_t u8Alignment0[6];
+ uint8_t u8Alignment0[5];
/** World switch exit counter. */
volatile uint32_t cWorldSwitchExits;
diff --git a/src/VBox/VMM/include/HMInternal.mac b/src/VBox/VMM/include/HMInternal.mac
index b974947..6345dbd 100644
--- a/src/VBox/VMM/include/HMInternal.mac
+++ b/src/VBox/VMM/include/HMInternal.mac
@@ -62,3 +62,28 @@ struc VMCSCACHE
%endif
endstruc
+
+struc HMCPU
+ .fForceTLBFlush resb 1
+ .fActive resb 1
+ .fCheckedTLBFlush resb 1
+ .fSingleInstruction resb 1
+ .fClearTrapFlag resb 1
+ .fLeaveDone resb 1
+ .fUsingHyperDR7 resb 1
+ .fPreloadGuestFpu resb 1
+ .fLoadSaveGuestXcr0 resb 1
+ .fGIMTrapXcptUD resb 1
+ .fHypercallsEnabled resb 1
+ alignb 8
+ .cWorldSwitchExits resd 1
+ .fContextUseFlags resd 1
+ .idLastCpu resd 1
+ .cTlbFlushes resd 1
+ .uCurrentAsid resd 1
+ .u32HMError resd 1
+ alignb 8
+ .u64HostTscAux resq 1
+
+ ; incomplete to save unnecessary pain...
+endstruc
diff --git a/src/VBox/VMM/include/IOMInternal.h b/src/VBox/VMM/include/IOMInternal.h
index 1b80383..375f846 100644
--- a/src/VBox/VMM/include/IOMInternal.h
+++ b/src/VBox/VMM/include/IOMInternal.h
@@ -319,13 +319,9 @@ typedef struct IOM
/** Pointer to the trees - R0 ptr. */
R0PTRTYPE(PIOMTREES) pTreesR0;
- /** The ring-0 address of IOMMMIOHandler. */
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnMMIOHandlerR0;
- /** The RC address of IOMMMIOHandler. */
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnMMIOHandlerRC;
-#if HC_ARCH_BITS == 64
- RTRCPTR padding;
-#endif
+ /** MMIO physical access handler type. */
+ PGMPHYSHANDLERTYPE hMmioHandlerType;
+ uint32_t u32Padding;
/** Lock serializing EMT access to IOM. */
#ifdef IOM_WITH_CRIT_SECT_RW
diff --git a/src/VBox/VMM/include/PGMInline.h b/src/VBox/VMM/include/PGMInline.h
index 995cad9..0a06ca6 100644
--- a/src/VBox/VMM/include/PGMInline.h
+++ b/src/VBox/VMM/include/PGMInline.h
@@ -1199,29 +1199,6 @@ DECLINLINE(PPGMPHYSHANDLER) pgmHandlerPhysicalLookup(PVM pVM, RTGCPHYS GCPhys)
/**
- * Gets the page state for a physical handler.
- *
- * @returns The physical handler page state.
- * @param pCur The physical handler in question.
- */
-DECLINLINE(unsigned) pgmHandlerPhysicalCalcState(PPGMPHYSHANDLER pCur)
-{
- switch (pCur->enmType)
- {
- case PGMPHYSHANDLERTYPE_PHYSICAL_WRITE:
- return PGM_PAGE_HNDL_PHYS_STATE_WRITE;
-
- case PGMPHYSHANDLERTYPE_MMIO:
- case PGMPHYSHANDLERTYPE_PHYSICAL_ALL:
- return PGM_PAGE_HNDL_PHYS_STATE_ALL;
-
- default:
- AssertFatalMsgFailed(("Invalid type %d\n", pCur->enmType));
- }
-}
-
-
-/**
* Gets the page state for a virtual handler.
*
* @returns The virtual handler page state.
diff --git a/src/VBox/VMM/include/PGMInternal.h b/src/VBox/VMM/include/PGMInternal.h
index f18c277..8259930 100644
--- a/src/VBox/VMM/include/PGMInternal.h
+++ b/src/VBox/VMM/include/PGMInternal.h
@@ -4,7 +4,7 @@
*/
/*
- * Copyright (C) 2006-2014 Oracle Corporation
+ * Copyright (C) 2006-2015 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
@@ -39,6 +39,7 @@
#include <iprt/assert.h>
#include <iprt/avl.h>
#include <iprt/critsect.h>
+#include <iprt/list-off32.h>
#include <iprt/sha.h>
@@ -574,6 +575,48 @@ typedef struct PGMMAPPING *PPGMMAPPING;
/**
+ * Physical page access handler type registration.
+ */
+typedef struct PGMPHYSHANDLERTYPEINT
+{
+ /** Number of references. */
+ uint32_t volatile cRefs;
+ /** Magic number (PGMPHYSHANDLERTYPEINT_MAGIC). */
+ uint32_t u32Magic;
+ /** Link of handler types anchored in PGMTREES::HeadPhysHandlerTypes. */
+ RTLISTOFF32NODE ListNode;
+ /** The kind of accesses we're handling. */
+ PGMPHYSHANDLERKIND enmKind;
+ /** The PGM_PAGE_HNDL_PHYS_STATE_XXX value corresponding to enmKind. */
+ uint32_t uState;
+ /** Pointer to RC callback function. */
+ RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC;
+ /** Explicit alignment padding. */
+ RTRCPTR RCPtrPadding;
+ /** Pointer to R3 callback function. */
+ R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3;
+ /** Pointer to R0 callback function. */
+ R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0;
+ /** Description / Name. For easing debugging. */
+ R3PTRTYPE(const char *) pszDesc;
+} PGMPHYSHANDLERTYPEINT;
+/** Pointer to a physical access handler type registration. */
+typedef PGMPHYSHANDLERTYPEINT *PPGMPHYSHANDLERTYPEINT;
+/** Magic value for the physical handler callbacks (Robert A. Heinlein). */
+#define PGMPHYSHANDLERTYPEINT_MAGIC UINT32_C(0x19070707)
+/** Magic value for the physical handler callbacks. */
+#define PGMPHYSHANDLERTYPEINT_MAGIC_DEAD UINT32_C(0x19880508)
+
+/**
+ * Converts a handle to a pointer.
+ * @returns PPGMPHYSHANDLERTYPEINT
+ * @param a_pVM Pointer to the cross context VM structure.
+ * @param a_hType Physical access handler handle.
+ */
+#define PGMPHYSHANDLERTYPEINT_FROM_HANDLE(a_pVM, a_hType) ((PPGMPHYSHANDLERTYPEINT)MMHyperHeapOffsetToPtr(a_pVM, a_hType))
+
+
+/**
* Physical page access handler structure.
*
* This is used to keep track of physical address ranges
@@ -582,26 +625,23 @@ typedef struct PGMMAPPING *PPGMMAPPING;
typedef struct PGMPHYSHANDLER
{
AVLROGCPHYSNODECORE Core;
- /** Access type. */
- PGMPHYSHANDLERTYPE enmType;
/** Number of pages to update. */
uint32_t cPages;
/** Set if we have pages that have been aliased. */
uint32_t cAliasedPages;
/** Set if we have pages that have temporarily been disabled. */
uint32_t cTmpOffPages;
- /** Pointer to R3 callback function. */
- R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnHandlerR3;
+ /** Registered handler type handle (heap offset). */
+ PGMPHYSHANDLERTYPE hType;
+ /** User argument for RC handlers. */
+ RCPTRTYPE(void *) pvUserRC;
+#if HC_ARCH_BITS == 64
+ RTRCPTR Padding0; /**< Explicit alignment padding. */
+#endif
/** User argument for R3 handlers. */
R3PTRTYPE(void *) pvUserR3;
- /** Pointer to R0 callback function. */
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnHandlerR0;
/** User argument for R0 handlers. */
R0PTRTYPE(void *) pvUserR0;
- /** Pointer to RC callback function. */
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnHandlerRC;
- /** User argument for RC handlers. */
- RCPTRTYPE(void *) pvUserRC;
/** Description / Name. For easing debugging. */
R3PTRTYPE(const char *) pszDesc;
#ifdef VBOX_WITH_STATISTICS
@@ -612,6 +652,15 @@ typedef struct PGMPHYSHANDLER
/** Pointer to a physical page access handler structure. */
typedef PGMPHYSHANDLER *PPGMPHYSHANDLER;
+/**
+ * Gets the type record for a physical handler (no reference added).
+ * @returns PPGMPHYSHANDLERTYPEINT
+ * @param a_pVM Pointer to the cross context VM structure.
+ * @param a_pPhysHandler Pointer to the physical handler structure
+ * (PGMPHYSHANDLER).
+ */
+#define PGMPHYSHANDLER_GET_TYPE(a_pVM, a_pPhysHandler) PGMPHYSHANDLERTYPEINT_FROM_HANDLE(a_pVM, (a_pPhysHandler)->hType)
+
/**
* Cache node for the physical addresses covered by a virtual handler.
@@ -2313,18 +2362,8 @@ typedef struct PGMPOOL
uint16_t iModifiedHead;
/** The current number of modified pages. */
uint16_t cModifiedPages;
- /** Access handler, RC. */
- RCPTRTYPE(PFNPGMRCPHYSHANDLER) pfnAccessHandlerRC;
- /** Access handler, R0. */
- R0PTRTYPE(PFNPGMR0PHYSHANDLER) pfnAccessHandlerR0;
- /** Access handler, R3. */
- R3PTRTYPE(PFNPGMR3PHYSHANDLER) pfnAccessHandlerR3;
- /** The access handler description (R3 ptr). */
- R3PTRTYPE(const char *) pszAccessHandler;
-# if HC_ARCH_BITS == 32
- /** Alignment padding. */
- uint32_t u32Padding2;
-# endif
+ /** Physical access handler type registration handle. */
+ PGMPHYSHANDLERTYPE hAccessHandlerType;
/** Next available slot (in aDirtyPages). */
uint32_t idxFreeDirtyPage;
/** Number of active dirty pages. */
@@ -2610,9 +2649,12 @@ DECLINLINE(void *) pgmPoolMapPageStrict(PPGMPOOLPAGE a_pPage, const char *pszCal
/**
- * Trees are using self relative offsets as pointers.
- * So, all its data, including the root pointer, must be in the heap for HC and GC
- * to have the same layout.
+ * Roots and anchors for trees and list employing self relative offsets as
+ * pointers.
+ *
+ * When using self-relative offsets instead of pointers, the offsets needs to be
+ * the same in all offsets. Thus the roots and anchors needs to live on the
+ * hyper heap just like the nodes.
*/
typedef struct PGMTREES
{
@@ -2624,6 +2666,9 @@ typedef struct PGMTREES
AVLROGCPHYSTREE PhysToVirtHandlers;
/** Virtual access handlers for the hypervisor (AVL range + GC ptr tree). */
AVLROGCPTRTREE HyperVirtHandlers;
+ /** List of physical access handler types (offset pointers) of type
+ * PGMPHYSHANDLERTYPEINT. This is needed for relocations. */
+ RTLISTOFF32ANCHOR HeadPhysHandlerTypes;
} PGMTREES;
/** Pointer to PGM trees. */
typedef PGMTREES *PPGMTREES;
@@ -3156,6 +3201,11 @@ typedef struct PGM
/** The address of the previous RAM range mapping. */
RTGCPTR GCPtrPrevRamRangeMapping;
+ /** Physical access handler type for ROM protection. */
+ PGMPHYSHANDLERTYPE hRomPhysHandlerType;
+ /** Alignment padding. */
+ uint32_t u32Padding;
+
/** 4 MB page mask; 32 or 36 bits depending on PSE-36 (identical for all VCPUs) */
RTGCPHYS GCPhys4MBPSEMask;
/** Mask containing the invalid bits of a guest physical address.
@@ -4058,6 +4108,8 @@ int pgmPhysGetPageExSlow(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage)
int pgmPhysGetPageAndRangeExSlow(PVM pVM, RTGCPHYS GCPhys, PPPGMPAGE ppPage, PPGMRAMRANGE *ppRam);
#ifdef IN_RING3
+DECLCALLBACK(int) pgmR3PhysRomWriteHandler(PVM pVM, RTGCPHYS GCPhys, void *pvPhys, void *pvBuf, size_t cbBuf,
+ PGMACCESSTYPE enmAccessType, void *pvUser);
void pgmR3PhysRelinkRamRanges(PVM pVM);
int pgmR3PhysRamPreAllocate(PVM pVM);
int pgmR3PhysRamReset(PVM pVM);
diff --git a/src/VBox/VMM/include/REMInternal.h b/src/VBox/VMM/include/REMInternal.h
index 1f41096..3007f59 100644
--- a/src/VBox/VMM/include/REMInternal.h
+++ b/src/VBox/VMM/include/REMInternal.h
@@ -78,7 +78,7 @@ typedef struct REMHANDLERNOTIFICATION
{
RTGCPHYS GCPhys;
RTGCPHYS cb;
- PGMPHYSHANDLERTYPE enmType;
+ PGMPHYSHANDLERKIND enmKind;
bool fHasHCHandler;
} PhysicalRegister;
@@ -86,7 +86,7 @@ typedef struct REMHANDLERNOTIFICATION
{
RTGCPHYS GCPhys;
RTGCPHYS cb;
- PGMPHYSHANDLERTYPE enmType;
+ PGMPHYSHANDLERKIND enmKind;
bool fHasHCHandler;
bool fRestoreAsRAM;
} PhysicalDeregister;
@@ -96,7 +96,7 @@ typedef struct REMHANDLERNOTIFICATION
RTGCPHYS GCPhysOld;
RTGCPHYS GCPhysNew;
RTGCPHYS cb;
- PGMPHYSHANDLERTYPE enmType;
+ PGMPHYSHANDLERKIND enmKind;
bool fHasHCHandler;
bool fRestoreAsRAM;
} PhysicalModify;
diff --git a/src/VBox/VMM/testcase/Makefile.kmk b/src/VBox/VMM/testcase/Makefile.kmk
index 728f59b..5ea5a6b 100644
--- a/src/VBox/VMM/testcase/Makefile.kmk
+++ b/src/VBox/VMM/testcase/Makefile.kmk
@@ -611,6 +611,7 @@ $(VBOX_VMM_TESTCASE_OUT_DIR)/tstAsmStructsHC.h: $(VBOX_VMM_TESTCASE_OUT_DIR)/tst
-e '/VMCPU_size$$/d' \
-e '/VMMCPU_size$$/d' \
-e '/SUPDRVTRACERUSRCTX32_size$$/d' \
+ -e '/HMCPU_size$$/d' \
\
-e '/00[0-9a-fA-F]* [aA] [^_.]*_size$$/!d' \
-e 's/\(00[0-9a-fA-F]*\) [aA] \([^_.]*\)_size/ CHECK_SIZE(\2, 0x0\1);/' \
diff --git a/src/VBox/VMM/testcase/tstIEMCheckMc.cpp b/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
index 1c80fa5..760bf71 100644
--- a/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
+++ b/src/VBox/VMM/testcase/tstIEMCheckMc.cpp
@@ -107,6 +107,7 @@ typedef VBOXSTRICTRC (* PFNIEMOP)(PIEMCPU pIemCpu);
#define IEMOP_HLP_CLEAR_REX_NOT_BEFORE_OPCODE(a_szPrf) do { } while (0)
#define IEMOP_HLP_DONE_DECODING() do { } while (0)
#define IEMOP_HLP_DONE_DECODING_NO_LOCK_PREFIX() do { } while (0)
+#define IEMOP_HLP_DONE_DECODING_NO_LOCK_REPZ_OR_REPNZ_PREFIXES() do { } while (0)
#define IEMOP_HLP_DECODED_NL_1(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_fDisOpType) do { } while (0)
#define IEMOP_HLP_DECODED_NL_2(a_uDisOpNo, a_fIemOpFlags, a_uDisParam0, a_uDisParam1, a_fDisOpType) do { } while (0)
#define IEMOP_RAISE_DIVIDE_ERROR() VERR_TRPM_ACTIVE_TRAP
diff --git a/src/VBox/VMM/testcase/tstVMStruct.h b/src/VBox/VMM/testcase/tstVMStruct.h
index 71fa043..fe47184 100644
--- a/src/VBox/VMM/testcase/tstVMStruct.h
+++ b/src/VBox/VMM/testcase/tstVMStruct.h
@@ -775,17 +775,24 @@
GEN_CHECK_SIZE(PGMPHYSHANDLER);
GEN_CHECK_OFF(PGMPHYSHANDLER, Core);
GEN_CHECK_SIZE(((PPGMPHYSHANDLER)0)->Core);
- GEN_CHECK_OFF(PGMPHYSHANDLER, enmType);
GEN_CHECK_OFF(PGMPHYSHANDLER, cPages);
GEN_CHECK_OFF(PGMPHYSHANDLER, cAliasedPages);
GEN_CHECK_OFF(PGMPHYSHANDLER, cTmpOffPages);
- GEN_CHECK_OFF(PGMPHYSHANDLER, pfnHandlerR3);
+ GEN_CHECK_OFF(PGMPHYSHANDLER, hType);
GEN_CHECK_OFF(PGMPHYSHANDLER, pvUserR3);
- GEN_CHECK_OFF(PGMPHYSHANDLER, pfnHandlerR0);
GEN_CHECK_OFF(PGMPHYSHANDLER, pvUserR0);
- GEN_CHECK_OFF(PGMPHYSHANDLER, pfnHandlerRC);
GEN_CHECK_OFF(PGMPHYSHANDLER, pvUserRC);
- GEN_CHECK_OFF(PGMPHYSHANDLER, pszDesc);
+ //GEN_CHECK_OFF(PGMPHYSHANDLER, pszDesc);
+ GEN_CHECK_SIZE(PGMPHYSHANDLERTYPEINT);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, u32Magic);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, cRefs);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, ListNode);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, enmKind);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, uState);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pfnHandlerR3);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pfnHandlerR0);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pfnHandlerRC);
+ GEN_CHECK_OFF(PGMPHYSHANDLERTYPEINT, pszDesc);
GEN_CHECK_SIZE(PGMPHYS2VIRTHANDLER);
GEN_CHECK_OFF(PGMPHYS2VIRTHANDLER, Core);
GEN_CHECK_OFF(PGMPHYS2VIRTHANDLER, offVirtHandler);
@@ -959,17 +966,17 @@
GEN_CHECK_OFF(REMHANDLERNOTIFICATION, u);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalRegister.GCPhys);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalRegister.cb);
- GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalRegister.enmType);
+ GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalRegister.enmKind);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalRegister.fHasHCHandler);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalDeregister.GCPhys);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalDeregister.cb);
- GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalDeregister.enmType);
+ GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalDeregister.enmKind);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalDeregister.fHasHCHandler);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalDeregister.fRestoreAsRAM);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalModify.GCPhysOld);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalModify.GCPhysNew);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalModify.cb);
- GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalModify.enmType);
+ GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalModify.enmKind);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalModify.fHasHCHandler);
GEN_CHECK_OFF_DOT(REMHANDLERNOTIFICATION, u.PhysicalModify.fRestoreAsRAM);
GEN_CHECK_OFF(REMHANDLERNOTIFICATION, idxSelf);
diff --git a/src/VBox/ValidationKit/common/__init__.py b/src/VBox/ValidationKit/common/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/constants/__init__.py b/src/VBox/ValidationKit/common/constants/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/constants/result.py b/src/VBox/ValidationKit/common/constants/result.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/constants/rtexitcode.py b/src/VBox/ValidationKit/common/constants/rtexitcode.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/constants/tbreq.py b/src/VBox/ValidationKit/common/constants/tbreq.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/constants/tbresp.py b/src/VBox/ValidationKit/common/constants/tbresp.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/constants/valueunit.py b/src/VBox/ValidationKit/common/constants/valueunit.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/utils.py b/src/VBox/ValidationKit/common/utils.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/common/webutils.py b/src/VBox/ValidationKit/common/webutils.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testanalysis/__init__.py b/src/VBox/ValidationKit/testanalysis/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testanalysis/diff.py b/src/VBox/ValidationKit/testanalysis/diff.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/setup.sh b/src/VBox/ValidationKit/testboxscript/setup.sh
old mode 100644
new mode 100755
diff --git a/src/VBox/ValidationKit/testboxscript/testboxcommand.py b/src/VBox/ValidationKit/testboxscript/testboxcommand.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxcommons.py b/src/VBox/ValidationKit/testboxscript/testboxcommons.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxconnection.py b/src/VBox/ValidationKit/testboxscript/testboxconnection.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxtasks.py b/src/VBox/ValidationKit/testboxscript/testboxtasks.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/testboxupgrade.py b/src/VBox/ValidationKit/testboxscript/testboxupgrade.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testboxscript/win/readme.txt b/src/VBox/ValidationKit/testboxscript/win/readme.txt
index 43104a1..4733788 100644
--- a/src/VBox/ValidationKit/testboxscript/win/readme.txt
+++ b/src/VBox/ValidationKit/testboxscript/win/readme.txt
@@ -91,6 +91,8 @@ Preparations:
22. Disable loading CONIME. Set "HKEY_CURRENT_USER\Console\LoadConIme" to 0.
+23. Windows 2012 R2: If you experience mouse pointer problems connecting with rdesktop,
+ open the mouse pointer settings and disable mouse pointer shadow.
The install:
diff --git a/src/VBox/ValidationKit/testdriver/__init__.py b/src/VBox/ValidationKit/testdriver/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/base.py b/src/VBox/ValidationKit/testdriver/base.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/reporter.py b/src/VBox/ValidationKit/testdriver/reporter.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/tst-txsclient.py b/src/VBox/ValidationKit/testdriver/tst-txsclient.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/txsclient.py b/src/VBox/ValidationKit/testdriver/txsclient.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/vbox.py b/src/VBox/ValidationKit/testdriver/vbox.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/vboxtestvms.py b/src/VBox/ValidationKit/testdriver/vboxtestvms.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/vboxwrappers.py b/src/VBox/ValidationKit/testdriver/vboxwrappers.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testdriver/winbase.py b/src/VBox/ValidationKit/testdriver/winbase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/__init__.py b/src/VBox/ValidationKit/testmanager/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/config.py b/src/VBox/ValidationKit/testmanager/config.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/__init__.py b/src/VBox/ValidationKit/testmanager/core/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/base.py b/src/VBox/ValidationKit/testmanager/core/base.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/build.py b/src/VBox/ValidationKit/testmanager/core/build.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/buildblacklist.py b/src/VBox/ValidationKit/testmanager/core/buildblacklist.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/buildsource.py b/src/VBox/ValidationKit/testmanager/core/buildsource.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/coreconsts.py b/src/VBox/ValidationKit/testmanager/core/coreconsts.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/db.py b/src/VBox/ValidationKit/testmanager/core/db.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/dbobjcache.py b/src/VBox/ValidationKit/testmanager/core/dbobjcache.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/failurecategory.py b/src/VBox/ValidationKit/testmanager/core/failurecategory.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/failurereason.py b/src/VBox/ValidationKit/testmanager/core/failurereason.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/globalresource.py b/src/VBox/ValidationKit/testmanager/core/globalresource.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/report.py b/src/VBox/ValidationKit/testmanager/core/report.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/schedgroup.py b/src/VBox/ValidationKit/testmanager/core/schedgroup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/schedulerbase.py b/src/VBox/ValidationKit/testmanager/core/schedulerbase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/schedulerbeci.py b/src/VBox/ValidationKit/testmanager/core/schedulerbeci.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/systemlog.py b/src/VBox/ValidationKit/testmanager/core/systemlog.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testbox.py b/src/VBox/ValidationKit/testmanager/core/testbox.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testboxcontroller.py b/src/VBox/ValidationKit/testmanager/core/testboxcontroller.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testboxstatus.py b/src/VBox/ValidationKit/testmanager/core/testboxstatus.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testcase.py b/src/VBox/ValidationKit/testmanager/core/testcase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testcaseargs.py b/src/VBox/ValidationKit/testmanager/core/testcaseargs.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testgroup.py b/src/VBox/ValidationKit/testmanager/core/testgroup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testresults.py b/src/VBox/ValidationKit/testmanager/core/testresults.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/testset.py b/src/VBox/ValidationKit/testmanager/core/testset.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/useraccount.py b/src/VBox/ValidationKit/testmanager/core/useraccount.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/vcsrevisions.py b/src/VBox/ValidationKit/testmanager/core/vcsrevisions.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/webservergluebase.py b/src/VBox/ValidationKit/testmanager/core/webservergluebase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/core/webservergluecgi.py b/src/VBox/ValidationKit/testmanager/core/webservergluecgi.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/debug/__init__.py b/src/VBox/ValidationKit/testmanager/debug/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/__init__.py b/src/VBox/ValidationKit/testmanager/webui/__init__.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadmin.py b/src/VBox/ValidationKit/testmanager/webui/wuiadmin.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminbuild.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminbuild.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildblacklist.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildblacklist.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildcategory.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildcategory.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildsource.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminbuildsource.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminfailurereason.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminfailurereason.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminglobalrsrc.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminglobalrsrc.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminschedgroup.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminschedgroup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminsystemlog.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminsystemlog.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadmintestbox.py b/src/VBox/ValidationKit/testmanager/webui/wuiadmintestbox.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadmintestcase.py b/src/VBox/ValidationKit/testmanager/webui/wuiadmintestcase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadmintestgroup.py b/src/VBox/ValidationKit/testmanager/webui/wuiadmintestgroup.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuiadminuseraccount.py b/src/VBox/ValidationKit/testmanager/webui/wuiadminuseraccount.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuibase.py b/src/VBox/ValidationKit/testmanager/webui/wuibase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py b/src/VBox/ValidationKit/testmanager/webui/wuicontentbase.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuifailurecategory.py b/src/VBox/ValidationKit/testmanager/webui/wuifailurecategory.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuigraphwiz.py b/src/VBox/ValidationKit/testmanager/webui/wuigraphwiz.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpform.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphgooglechart.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphgooglechart.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphmatplotlib.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphmatplotlib.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphsimple.py b/src/VBox/ValidationKit/testmanager/webui/wuihlpgraphsimple.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuilogviewer.py b/src/VBox/ValidationKit/testmanager/webui/wuilogviewer.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuimain.py b/src/VBox/ValidationKit/testmanager/webui/wuimain.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuireport.py b/src/VBox/ValidationKit/testmanager/webui/wuireport.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuitestresult.py b/src/VBox/ValidationKit/testmanager/webui/wuitestresult.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/testmanager/webui/wuivcshistory.py b/src/VBox/ValidationKit/testmanager/webui/wuivcshistory.py
old mode 100755
new mode 100644
diff --git a/src/VBox/ValidationKit/tests/additions/tdAddGuestCtrl.py b/src/VBox/ValidationKit/tests/additions/tdAddGuestCtrl.py
index d96175d..4aac2a2 100755
--- a/src/VBox/ValidationKit/tests/additions/tdAddGuestCtrl.py
+++ b/src/VBox/ValidationKit/tests/additions/tdAddGuestCtrl.py
@@ -8,7 +8,7 @@ VirtualBox Validation Kit - Guest Control Tests.
__copyright__ = \
"""
-Copyright (C) 2010-2014 Oracle Corporation
+Copyright (C) 2010-2015 Oracle Corporation
This file is part of VirtualBox Open Source Edition (OSE), as
available from http://www.virtualbox.org. This file is free software;
@@ -27,7 +27,7 @@ CDDL are applicable instead of those of the GPL.
You may elect to license modified versions of this file under the
terms and conditions of either the GPL or the CDDL or both.
"""
-__version__ = "$Revision: 96152 $"
+__version__ = "$Revision: 100056 $"
# Disable bitching about too many arguments per function.
# pylint: disable=R0913
@@ -261,7 +261,7 @@ class tdTestExec(tdTestGuestCtrlBase):
tdTestGuestCtrlBase.__init__(self);
self.oCreds = tdCtxCreds(sUser, sPassword, sDomain);
self.sCmd = sCmd;
- self.aArgs = aArgs;
+ self.aArgs = aArgs if aArgs is not None else [sCmd,];
self.aEnv = aEnv;
self.aFlags = aFlags or [];
self.timeoutMS = timeoutMS;
@@ -339,6 +339,28 @@ class tdTestFileReadWrite(tdTestGuestCtrlBase):
self.cbToReadWrite = cbToReadWrite;
self.aBuf = aBuf;
+ def getOpenAction(self):
+ """ Converts string disposition to open action enum. """
+ if self.sDisposition == 'oe': return vboxcon.FileOpenAction_OpenExisting;
+ if self.sDisposition == 'oc': return vboxcon.FileOpenAction_OpenOrCreate;
+ if self.sDisposition == 'ce': return vboxcon.FileOpenAction_CreateNew;
+ if self.sDisposition == 'ca': return vboxcon.FileOpenAction_CreateOrReplace;
+ if self.sDisposition == 'ot': return vboxcon.FileOpenAction_OpenExistingTruncated;
+ if self.sDisposition == 'oa': return vboxcon.FileOpenAction_AppendOrCreate;
+ raise base.GenError(self.sDisposition);
+
+ def getAccessMode(self):
+ """ Converts open mode to access mode enum. """
+ if self.sOpenMode == 'r': return vboxcon.FileOpenMode_ReadOnly;
+ if self.sOpenMode == 'w': return vboxcon.FileOpenMode_WriteOnly;
+ if self.sOpenMode == 'w+': return vboxcon.FileOpenMode_ReadWrite;
+ if self.sOpenMode == 'r+': return vboxcon.FileOpenMode_ReadWrite;
+ raise base.GenError(self.sOpenMode);
+
+ def getSharingMode(self):
+ """ Converts the sharing mode. """
+ return vboxcon.FileSharingMode_All;
+
class tdTestSession(tdTestGuestCtrlBase):
"""
Test the guest session handling.
@@ -656,7 +678,10 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
fRc = True; # Be optimistic.
try:
reporter.log2('Copying guest file "%s" to host "%s"' % (sSrc, sDst));
- curProgress = oGuestSession.copyFrom(sSrc, sDst, aFlags);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curProgress = oGuestSession.fileCopyFromGuest(sSrc, sDst, aFlags);
+ else:
+ curProgress = oGuestSession.copyFrom(sSrc, sDst, aFlags);
if curProgress is not None:
oProgress = vboxwrappers.ProgressWrapper(curProgress, self.oTstDrv.oVBoxMgr, self, "gctrlCopyFrm");
try:
@@ -683,7 +708,10 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
fRc = True; # Be optimistic.
try:
reporter.log2('Copying host file "%s" to guest "%s"' % (sSrc, sDst));
- curProgress = oGuestSession.copyTo(sSrc, sDst, aFlags);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curProgress = oGuestSession.fileCopyToGuest(sSrc, sDst, aFlags);
+ else:
+ curProgress = oGuestSession.copyTo(sSrc, sDst, aFlags);
if curProgress is not None:
oProgress = vboxwrappers.ProgressWrapper(curProgress, self.oTstDrv.oVBoxMgr, self, "gctrlCopyTo");
try:
@@ -864,7 +892,10 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
try:
oGuestSession.directoryCreate(oTest.sDirectory, \
oTest.fMode, oTest.aFlags);
- fDirExists = oGuestSession.directoryExists(oTest.sDirectory);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ fDirExists = oGuestSession.directoryExists(oTest.sDirectory, False);
+ else:
+ fDirExists = oGuestSession.directoryExists(oTest.sDirectory);
if fDirExists is False \
and oRes.fRc is True:
# Directory does not exist but we want it to.
@@ -997,9 +1028,9 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
% (oTest.sCmd, oTest.aFlags, oTest.timeoutMS, \
oTest.aArgs, oTest.aEnv));
try:
- curProc = oGuestSession.processCreate(oTest.sCmd, \
- oTest.aArgs, oTest.aEnv, \
- oTest.aFlags, oTest.timeoutMS);
+ curProc = oGuestSession.processCreate(oTest.sCmd,
+ oTest.aArgs if self.oTstDrv.fpApiVer >= 5.0 else oTest.aArgs[1:],
+ oTest.aEnv, oTest.aFlags, oTest.timeoutMS);
if curProc is not None:
reporter.log2('Process start requested, waiting for start (%ldms) ...' % (oTest.timeoutMS,));
fWaitFor = [ vboxcon.ProcessWaitForFlag_Start ];
@@ -1069,7 +1100,7 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
def testGuestCtrlSessionEnvironment(self, oSession, oTxsSession, oTestVm): # pylint: disable=R0914
"""
- Tests the guest session environment.
+ Tests the guest session environment changes.
"""
if oTestVm.isWindows():
@@ -1111,6 +1142,9 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
tdTestResultSessionEnv(fRc = True, cNumVars = 1) ]
];
+ # The IGuestSession::environment attribute changed late in 5.0 development.
+ sEnvironmentChangesAttr = 'environmentChanges' if self.oTstDrv.fpApiVer >= 5.0 else 'environment';
+
# Parameters.
fRc = True;
for (i, aTest) in enumerate(aaTests):
@@ -1126,29 +1160,32 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
fRc = False;
break;
# Make sure environment is empty.
- curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, 'environment');
+ curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, sEnvironmentChangesAttr);
reporter.log2('Test #%d: Environment initially has %d elements' % (i, len(curEnv)));
if len(curEnv) != 0:
reporter.error('Test #%d failed: Initial session environment has %d vars, expected 0' % (i, len(curEnv)));
fRc = False;
break;
try:
- for (_, aEnv) in enumerate(curTest.aEnv): # Enumerate only will work with a sequence (e.g > 1 entries).
+ for (_, aEnv) in enumerate(curTest.aEnv):
aElems = aEnv.split('=');
- strKey = '';
+ strKey = ''; ## @todo s/Key/Var/g
strValue = '';
if len(aElems) > 0:
strKey = aElems[0];
if len(aElems) == 2:
strValue = aElems[1];
- reporter.log2('Test #%d: Single key="%s", value="%s" (%d) ...' \
+ reporter.log2('Test #%d: Single var="%s", value="%s" (%d) ...' \
% (i, strKey, strValue, len(aElems)));
try:
- curGuestSession.environmentSet(strKey, strValue); # No return (e.g. boolean) value available thru wrapper.
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curGuestSession.environmentScheduleSet(strKey, strValue);
+ else:
+ curGuestSession.environmentSet(strKey, strValue);
except:
# Setting environment variables might fail (e.g. if empty name specified). Check.
reporter.logXcpt('Test #%d failed: Setting environment variable failed:' % (i,));
- curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, 'environment');
+ curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, sEnvironmentChangesAttr);
if len(curEnv) is not curRes.cNumVars:
reporter.error('Test #%d failed: Session environment has %d vars, expected %d' \
% (i, len(curEnv), curRes.cNumVars));
@@ -1156,30 +1193,35 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
break;
else:
reporter.log('Test #%d: API reported an error (single), good' % (i,));
- reporter.log2('Getting key="%s" ...' % (strKey,));
- try:
- strValue2 = curGuestSession.environmentGet(strKey);
- if strKey.isalnum() \
- and strValue != strValue2:
- reporter.error('Test #%d failed: Got environment variable "%s", expected "%s" (key: "%s")' \
- % (i, strValue2, strValue, strKey));
- fRc = False;
- break;
- # Getting back an empty value when specifying an invalid key is fine.
- reporter.log2('Got key "%s=%s"' % (strKey, strValue2));
- except UnicodeDecodeError: # Might happen on unusal values, fine.
- if strValue != strValue2:
- reporter.error('Test #%d failed: Got (undecoded) environment variable "%s", ' \
- 'expected "%s" (key: "%s")' \
- % (i, strValue2, strValue, strKey));
- fRc = False;
- break;
- except:
- if strKey == "" \
- or not strKey.isalnum():
- reporter.log('Test #%d: API reported an error (invalid key "%s"), good' % (i, strKey));
- else:
- reporter.errorXcpt('Test #%d failed: Getting environment variable:' % (i));
+ ## @todo environmentGet() has been removed in 5.0 because it's not up to the task of returning all the
+ ## putenv strings forms and gives the impression that the environment is something it isn't. This test
+ ## should be rewritten using the attribute. What's more, there should be an Unset test here, shouldn't
+ ## there?
+ #
+ #reporter.log2('Getting key="%s" ...' % (strKey,));
+ #try:
+ # strValue2 = curGuestSession.environmentGet(strKey);
+ # if strKey.isalnum() \
+ # and strValue != strValue2:
+ # reporter.error('Test #%d failed: Got environment value "%s", expected "%s" (var: "%s")' \
+ # % (i, strValue2, strValue, strKey));
+ # fRc = False;
+ # break;
+ # # Getting back an empty value when specifying an invalid key is fine.
+ # reporter.log2('Got key "%s=%s"' % (strKey, strValue2));
+ #except UnicodeDecodeError: # Might happen on unusal values, fine.
+ # if strValue != strValue2:
+ # reporter.error('Test #%d failed: Got (undecoded) environment variable "%s", ' \
+ # 'expected "%s" (var: "%s")' \
+ # % (i, strValue2, strValue, strKey));
+ # fRc = False;
+ # break;
+ #except:
+ # if strKey == "" \
+ # or not strKey.isalnum():
+ # reporter.log('Test #%d: API reported an error (invalid key "%s"), good' % (i, strKey));
+ # else:
+ # reporter.errorXcpt('Test #%d failed: Getting environment variable:' % (i));
if fRc is False:
continue;
# Set the same stuff again, this time all at once using the array.
@@ -1191,7 +1233,7 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
pass;
except:
# Setting environment variables might fail (e.g. if empty name specified). Check.
- curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, 'environment');
+ curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, sEnvironmentChangesAttr);
if len(curEnv) is not curRes.cNumVars:
reporter.error('Test #%d failed: Session environment has %d vars, expected %d (array)' \
% (i, len(curEnv), curRes.cNumVars));
@@ -1201,15 +1243,16 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
reporter.log('Test #%d: API reported an error (array), good' % (i,));
## @todo Get current system environment and add it to curRes.cNumVars before comparing!
reporter.log('Test #%d: Environment size' % (i,));
- curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, 'environment');
+ curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, sEnvironmentChangesAttr);
reporter.log2('Test #%d: Environment (%d) -> %s' % (i, len(curEnv), curEnv));
if len(curEnv) != curRes.cNumVars:
reporter.error('Test #%d failed: Session environment has %d vars (%s), expected %d' \
% (i, len(curEnv), curEnv, curRes.cNumVars));
fRc = False;
break;
- curGuestSession.environmentClear(); # No return (e.g. boolean) value available thru wrapper.
- curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, 'environment');
+
+ self.oTstDrv.oVBoxMgr.setArray(curGuestSession, sEnvironmentChangesAttr, []);
+ curEnv = self.oTstDrv.oVBoxMgr.getArray(curGuestSession, sEnvironmentChangesAttr);
if len(curEnv) is not 0:
reporter.error('Test #%d failed: Session environment has %d vars, expected 0');
fRc = False;
@@ -1412,7 +1455,10 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
reporter.log2('Opening stale files');
for i in range(0, cStaleFiles):
try:
- oGuestSession.fileOpen(sFile, "r", "oe", 0);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ oGuestSession.fileOpen(sFile, vboxcon.FileAccessMode_ReadOnly, vboxcon.FileOpenAction_OpenExisting, 0);
+ else:
+ oGuestSession.fileOpen(sFile, "r", "oe", 0);
# Note: Use a timeout in the call above for not letting the stale processes
# hanging around forever. This can happen if the installed Guest Additions
# do not support terminating guest processes.
@@ -1435,7 +1481,11 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
aaFiles = [];
for i in range(0, cStaleFiles):
try:
- oCurFile = oGuestSession.fileOpen(sFile, "r", "oe", 0);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ oCurFile = oGuestSession.fileOpen(sFile, vboxcon.FileAccessMode_ReadOnly,
+ vboxcon.FileOpenAction_OpenExisting, 0);
+ else:
+ oCurFile = oGuestSession.fileOpen(sFile, "r", "oe", 0);
aaFiles.append(oCurFile);
except:
reporter.errorXcpt('Opening non-stale file #%ld failed:' % (i,));
@@ -1510,7 +1560,7 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
sPassword = "password";
sDomain = "";
sCmd = "C:\\windows\\system32\\cmd.exe";
- sArgs = [];
+ aArgs = [sCmd,];
# Number of stale guest processes to create.
cStaleProcs = 10;
@@ -1541,8 +1591,8 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
reporter.log2('Starting stale processes');
for i in range(0, cStaleProcs):
try:
- oGuestSession.processCreate(sCmd, \
- sArgs, [], \
+ oGuestSession.processCreate(sCmd,
+ aArgs if self.oTstDrv.fpApiVer >= 5.0 else aArgs[1:], [],
[ vboxcon.ProcessCreateFlag_WaitForStdOut ], \
30 * 1000);
# Note: Use a timeout in the call above for not letting the stale processes
@@ -1564,15 +1614,13 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
# Fire off non-stale processes and wait for termination.
#
if oTestVm.isWindows():
- sArgs = [ '/C', 'dir', '/S', 'C:\\Windows\\system'];
+ aArgs = [ sCmd, '/C', 'dir', '/S', 'C:\\Windows\\system'];
reporter.log2('Starting non-stale processes');
aaProcs = [];
for i in range(0, cStaleProcs):
try:
- oCurProc = oGuestSession.processCreate(sCmd, \
- sArgs, [], \
- [], \
- 0); # Infinite timeout.
+ oCurProc = oGuestSession.processCreate(sCmd, aArgs if self.oTstDrv.fpApiVer >= 5.0 else aArgs[1:],
+ [], [], 0); # Infinite timeout.
aaProcs.append(oCurProc);
except:
reporter.logXcpt('Creating non-stale process #%ld failed:' % (i,));
@@ -1616,14 +1664,13 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
# Fire off blocking processes which are terminated via terminate().
if oTestVm.isWindows():
- sArgs = [ '/C', 'dir', '/S', 'C:\\Windows'];
+ aArgs = [ sCmd, '/C', 'dir', '/S', 'C:\\Windows'];
reporter.log2('Starting blocking processes');
aaProcs = [];
for i in range(0, cStaleProcs):
try:
- oCurProc = oGuestSession.processCreate(sCmd, \
- sArgs, [], \
- [], 30 * 1000);
+ oCurProc = oGuestSession.processCreate(sCmd, aArgs if self.oTstDrv.fpApiVer >= 5.0 else aArgs[1:],
+ [], [], 30 * 1000);
# Note: Use a timeout in the call above for not letting the stale processes
# hanging around forever. This can happen if the installed Guest Additions
# do not support terminating guest processes.
@@ -1697,62 +1744,62 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
];
if oTestVm.isWindows():
+ sVBoxControl = "C:\\Program Files\\Oracle\\VirtualBox Guest Additions\\VBoxControl.exe";
aaExec = [
# Basic executon.
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'c:\\windows\\system32' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'c:\\windows\\system32' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True) ],
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'c:\\windows\\system32\\kernel32.dll' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'c:\\windows\\system32\\kernel32.dll' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True) ],
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'c:\\windows\\system32\\nonexist.dll' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'c:\\windows\\system32\\nonexist.dll' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 1) ],
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', '/wrongparam' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', '/wrongparam' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 1) ],
# Paths with spaces.
## @todo Get path of installed Guest Additions. Later.
- [ tdTestExec(sCmd = "C:\\Program Files\\Oracle\\VirtualBox Guest Additions\\VBoxControl.exe",
- aArgs = [ 'version' ],
+ [ tdTestExec(sCmd = sVBoxControl, aArgs = [ sVBoxControl, 'version' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True) ],
# StdOut.
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'c:\\windows\\system32' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'c:\\windows\\system32' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True) ],
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'stdout-non-existing' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'stdout-non-existing' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 1) ],
# StdErr.
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'c:\\windows\\system32' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'c:\\windows\\system32' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True) ],
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'stderr-non-existing' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'stderr-non-existing' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 1) ],
# StdOut + StdErr.
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'c:\\windows\\system32' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'c:\\windows\\system32' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True) ],
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir', '/S', 'stdouterr-non-existing' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir', '/S', 'stdouterr-non-existing' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 1) ]
# FIXME: Failing tests.
# Environment variables.
- # [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'set', 'TEST_NONEXIST' ],
+ # [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'set', 'TEST_NONEXIST' ],
# sUser = sUser, sPassword = sPassword),
# tdTestResultExec(fRc = True, iExitCode = 1) ]
- # [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'set', 'windir' ],
+ # [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'set', 'windir' ],
# sUser = sUser, sPassword = sPassword,
# aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut, vboxcon.ProcessCreateFlag_WaitForStdErr ]),
# tdTestResultExec(fRc = True, sBuf = 'windir=C:\\WINDOWS\r\n') ],
- # [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'set', 'TEST_FOO' ],
+ # [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'set', 'TEST_FOO' ],
# sUser = sUser, sPassword = sPassword,
# aEnv = [ 'TEST_FOO=BAR' ],
# aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut, vboxcon.ProcessCreateFlag_WaitForStdErr ]),
# tdTestResultExec(fRc = True, sBuf = 'TEST_FOO=BAR\r\n') ],
- # [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'set', 'TEST_FOO' ],
+ # [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'set', 'TEST_FOO' ],
# sUser = sUser, sPassword = sPassword,
# aEnv = [ 'TEST_FOO=BAR', 'TEST_BAZ=BAR' ],
# aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut, vboxcon.ProcessCreateFlag_WaitForStdErr ]),
@@ -1764,7 +1811,7 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
# Manual test, not executed automatically.
aaManual = [
- [ tdTestExec(sCmd = sImageOut, aArgs = [ '/C', 'dir /S C:\\Windows' ],
+ [ tdTestExec(sCmd = sImageOut, aArgs = [ sImageOut, '/C', 'dir /S C:\\Windows' ],
sUser = sUser, sPassword = sPassword,
aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut, vboxcon.ProcessCreateFlag_WaitForStdErr ]),
tdTestResultExec(fRc = True, cbStdOut = 497917) ] ];
@@ -1921,64 +1968,64 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
if oTestVm.isWindows():
aaTests.extend([
# Simple.
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'wrongcommand' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'wrongcommand' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 1) ],
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'exit', '22' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'exit', '22' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 22) ],
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'set', 'ERRORLEVEL=234' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'set', 'ERRORLEVEL=234' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 0) ],
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'echo', '%WINDIR%' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'echo', '%WINDIR%' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 0) ],
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'set', 'ERRORLEVEL=0' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'set', 'ERRORLEVEL=0' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 0) ],
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\windows\\system32' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\windows\\system32' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 0) ],
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\windows\\system32\\kernel32.dll' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\windows\\system32\\kernel32.dll' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 0) ],
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\nonexisting-file' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\nonexisting-file' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 1) ],
- [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\nonexisting-dir\\' ],
+ [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\nonexisting-dir\\' ],
sUser = sUser, sPassword = sPassword),
tdTestResultExec(fRc = True, iExitCode = 1) ]
# FIXME: Failing tests.
# With stdout.
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\windows\\system32' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\windows\\system32' ],
# sUser = sUser, sPassword = sPassword, aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut ]),
# tdTestResultExec(fRc = True, iExitCode = 0) ],
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\nonexisting-file' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\nonexisting-file' ],
# sUser = sUser, sPassword = sPassword, aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut ]),
# tdTestResultExec(fRc = True, iExitCode = 1) ],
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\nonexisting-dir\\' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\nonexisting-dir\\' ],
# sUser = sUser, sPassword = sPassword, aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut ]),
# tdTestResultExec(fRc = True, iExitCode = 1) ],
# With stderr.
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\windows\\system32' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\windows\\system32' ],
# sUser = sUser, sPassword = sPassword, aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdErr ]),
# tdTestResultExec(fRc = True, iExitCode = 0) ],
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\nonexisting-file' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\nonexisting-file' ],
# sUser = sUser, sPassword = sPassword, aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdErr ]),
# tdTestResultExec(fRc = True, iExitCode = 1) ],
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\nonexisting-dir\\' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\nonexisting-dir\\' ],
# sUser = sUser, sPassword = sPassword, aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdErr ]),
# tdTestResultExec(fRc = True, iExitCode = 1) ],
# With stdout/stderr.
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\windows\\system32' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\windows\\system32' ],
# sUser = sUser, sPassword = sPassword,
# aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut, vboxcon.ProcessCreateFlag_WaitForStdErr ]),
# tdTestResultExec(fRc = True, iExitCode = 0) ],
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\nonexisting-file' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\nonexisting-file' ],
# sUser = sUser, sPassword = sPassword,
# aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut, vboxcon.ProcessCreateFlag_WaitForStdErr ]),
# tdTestResultExec(fRc = True, iExitCode = 1) ],
- # [ tdTestExec(sCmd = sImage, aArgs = [ '/C', 'dir', 'c:\\nonexisting-dir\\' ],
+ # [ tdTestExec(sCmd = sImage, aArgs = [ sImage, '/C', 'dir', 'c:\\nonexisting-dir\\' ],
# sUser = sUser, sPassword = sPassword,
# aFlags = [ vboxcon.ProcessCreateFlag_WaitForStdOut, vboxcon.ProcessCreateFlag_WaitForStdErr ]),
# tdTestResultExec(fRc = True, iExitCode = 1) ]
@@ -2030,7 +2077,7 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
# Create a process which never terminates and should timeout when
# waiting for termination.
try:
- curProc = oGuestSession.processCreate(sImage, [], \
+ curProc = oGuestSession.processCreate(sImage, [sImage,] if self.oTstDrv.fpApiVer >= 5.0 else [], \
[], [], 30 * 1000);
reporter.log('Waiting for process 1 being started ...');
waitRes = curProc.waitForArray([ vboxcon.ProcessWaitForFlag_Start ], 30 * 1000);
@@ -2061,7 +2108,7 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
# guest because it ran out of execution time (5 seconds).
if fRc:
try:
- curProc = oGuestSession.processCreate(sImage, [], \
+ curProc = oGuestSession.processCreate(sImage, [sImage,] if self.oTstDrv.fpApiVer >= 5.0 else [], \
[], [], 5 * 1000);
reporter.log('Waiting for process 2 being started ...');
waitRes = curProc.waitForArray([ vboxcon.ProcessWaitForFlag_Start ], 30 * 1000);
@@ -2325,7 +2372,10 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
curTest.closeSession();
if sDirTemp != "":
reporter.log2('Temporary directory is: %s' % (sDirTemp,));
- fExists = curGuestSession.directoryExists(sDirTemp);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ fExists = curGuestSession.directoryExists(sDirTemp, False);
+ else:
+ fExists = curGuestSession.directoryExists(sDirTemp);
if fExists is False:
reporter.error('Test #%d failed: Temporary directory "%s" does not exists' % (i, sDirTemp));
fRc = False;
@@ -2469,7 +2519,10 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
reporter.error('Test #%d failed: Could not create session' % (i,));
break;
try:
- curGuestSession.fileRemove(curTest.sFile);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curGuestSession.fsObjRemove(curTest.sFile);
+ else:
+ curGuestSession.fileRemove(curTest.sFile);
except:
if curRes.fRc is True:
reporter.errorXcpt('Removing file "%s" failed:' % (curTest.sFile,));
@@ -2541,7 +2594,10 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
break;
fileObjInfo = None;
try:
- fileObjInfo = curGuestSession.fileQueryInfo(curTest.sFile);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ fileObjInfo = curGuestSession.fsObjQueryInfo(curTest.sFile, True);
+ else:
+ fileObjInfo = curGuestSession.fileQueryInfo(curTest.sFile);
except:
if curRes.fRc is True:
reporter.errorXcpt('Querying file information for "%s" failed:' % (curTest.sFile,));
@@ -2663,9 +2719,14 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
reporter.error('Test #%d failed: Could not create session' % (i,));
break;
try:
- if curTest.cbOffset > 0:
- curFile = curGuestSession.fileOpenEx(curTest.sFile, curTest.sOpenMode, curTest.sDisposition, \
- curTest.sSharingMode, curTest.lCreationMode, curTest.cbOffset);
+ if curTest.cbOffset > 0: # The offset parameter is gone.
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curFile = curGuestSession.fileOpenEx(curTest.sFile, curTest.getAccessMode(), curTest.getOpenAction(),
+ curTest.getSharingMode(), curTest.lCreationMode, []);
+ curFile.seek(curTest.cbOffset, vboxcon.FileSeekOrigin_Begin);
+ else:
+ curFile = curGuestSession.fileOpenEx(curTest.sFile, curTest.sOpenMode, curTest.sDisposition, \
+ curTest.sSharingMode, curTest.lCreationMode, curTest.cbOffset);
curOffset = long(curFile.offset);
resOffset = long(curTest.cbOffset);
if curOffset != resOffset:
@@ -2673,8 +2734,12 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
% (i, curOffset, resOffset));
fRc = False;
else:
- curFile = curGuestSession.fileOpen(curTest.sFile, curTest.sOpenMode, curTest.sDisposition, \
- curTest.lCreationMode);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curFile = curGuestSession.fileOpen(curTest.sFile, curTest.getAccessMode(), curTest.getOpenAction(),
+ curTest.lCreationMode);
+ else:
+ curFile = curGuestSession.fileOpen(curTest.sFile, curTest.sOpenMode, curTest.sDisposition, \
+ curTest.lCreationMode);
if fRc \
and curTest.cbToReadWrite > 0:
## @todo Split this up in 64K reads. Later.
@@ -2768,9 +2833,14 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
reporter.error('Test #%d failed: Could not create session' % (i,));
break;
try:
- if curTest.cbOffset > 0:
- curFile = curGuestSession.fileOpenEx(curTest.sFile, curTest.sOpenMode, curTest.sDisposition, \
- curTest.sSharingMode, curTest.lCreationMode, curTest.cbOffset);
+ if curTest.cbOffset > 0: # The offset parameter is gone.
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curFile = curGuestSession.fileOpenEx(curTest.sFile, curTest.getAccessMode(), curTest.getOpenAction(),
+ curTest.getSharingMode(), []);
+ curFile.seek(curTest.cbOffset, vboxcon.FileSeekOrigin_Begin);
+ else:
+ curFile = curGuestSession.fileOpenEx(curTest.sFile, curTest.sOpenMode, curTest.sDisposition, \
+ curTest.sSharingMode, curTest.lCreationMode, curTest.cbOffset);
curOffset = long(curFile.offset);
resOffset = long(curTest.cbOffset);
if curOffset != resOffset:
@@ -2778,8 +2848,12 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
% (i, curOffset, resOffset));
fRc = False;
else:
- curFile = curGuestSession.fileOpen(curTest.sFile, curTest.sOpenMode, curTest.sDisposition, \
- curTest.lCreationMode);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curFile = curGuestSession.fileOpen(curTest.sFile, curTest.getAccessMode(), curTest.getOpenAction(),
+ curTest.lCreationMode);
+ else:
+ curFile = curGuestSession.fileOpen(curTest.sFile, curTest.sOpenMode, curTest.sDisposition, \
+ curTest.lCreationMode);
if fRc \
and curTest.cbToReadWrite > 0:
## @todo Split this up in 64K writes. Later.
@@ -2794,7 +2868,10 @@ class SubTstDrvAddGuestCtrl(base.SubTestDriverBase):
# Verify written content by seeking back to the initial offset and
# re-read & compare the written data.
try:
- curFile.seek(-(curTest.cbToReadWrite), vboxcon.FileSeekType_Current);
+ if self.oTstDrv.fpApiVer >= 5.0:
+ curFile.seek(-(curTest.cbToReadWrite), vboxcon.FileSeekOrigin_Current);
+ else:
+ curFile.seek(-(curTest.cbToReadWrite), vboxcon.FileSeekType_Current);
except:
reporter.logXcpt('Seeking back to initial write position failed:');
fRc = False;
@@ -3281,14 +3358,13 @@ class tdAddGuestCtrl(vbox.TestDriver): #
_ = oGuestSession.waitForArray(aWaitFor, 30 * 1000);
sCmd = 'c:\\windows\\system32\\cmd.exe';
- aArgs = [ '/C', 'dir', '/S', 'c:\\windows' ];
+ aArgs = [ sCmd, '/C', 'dir', '/S', 'c:\\windows' ];
aEnv = [];
aFlags = [];
for _ in range(100):
- oProc = oGuestSession.processCreate(sCmd,
- aArgs, aEnv,
- aFlags, 30 * 1000);
+ oProc = oGuestSession.processCreate(sCmd, aArgs if self.fpApiVer >= 5.0 else aArgs[1:],
+ aEnv, aFlags, 30 * 1000);
aWaitFor = [ vboxcon.ProcessWaitForFlag_Terminate ];
_ = oProc.waitForArray(aWaitFor, 30 * 1000);
diff --git a/src/bldprogs/scm.cpp b/src/bldprogs/scm.cpp
index 4e4a2eb..f0fb15a 100644
--- a/src/bldprogs/scm.cpp
+++ b/src/bldprogs/scm.cpp
@@ -481,7 +481,7 @@ static int scmSettingsBaseParseString(PSCMSETTINGSBASE pBase, const char *pszLin
{
int cArgs;
char **papszArgs;
- int rc = RTGetOptArgvFromString(&papszArgs, &cArgs, pszLine, NULL);
+ int rc = RTGetOptArgvFromString(&papszArgs, &cArgs, pszLine, RTGETOPTARGV_CNV_QUOTE_BOURNE_SH, NULL);
if (RT_SUCCESS(rc))
{
RTGETOPTUNION ValueUnion;
@@ -1540,7 +1540,7 @@ int main(int argc, char **argv)
case 'V':
{
/* The following is assuming that svn does it's job here. */
- static const char s_szRev[] = "$Revision: 89658 $";
+ static const char s_szRev[] = "$Revision: 100060 $";
const char *psz = RTStrStripL(strchr(s_szRev, ' '));
RTPrintf("r%.*s\n", strchr(psz, ' ') - psz, psz);
return 0;
diff --git a/src/libs/Makefile.kmk b/src/libs/Makefile.kmk
index 5073992..28f1b30 100644
--- a/src/libs/Makefile.kmk
+++ b/src/libs/Makefile.kmk
@@ -39,8 +39,8 @@ endif # !VBOX_ONLY_DOCS
# Libcurl for inet access
if defined(VBOX_WITH_LIBCURL) && !defined(VBOX_ONLY_EXTPACKS_USE_IMPLIBS) && !defined(VBOX_ONLY_SDK) && !defined(VBOX_ONLY_VALIDATIONKIT) \
- && "$(SDK_VBOX_LIBCURL_INCS)" == "$(PATH_ROOT)/src/libs/curl-7.27.0/include"
- include $(PATH_SUB_CURRENT)/curl-7.27.0/Makefile.kmk
+ && "$(SDK_VBOX_LIBCURL_INCS)" == "$(PATH_ROOT)/src/libs/curl-7.42.1/include"
+ include $(PATH_SUB_CURRENT)/curl-7.42.1/Makefile.kmk
endif
# The kStuff lib used by IPRT and the debugger.
diff --git a/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c b/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
index a9e791d..6d8574f 100644
--- a/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
+++ b/src/libs/kStuff/kStuff/kLdr/kLdrModMachO.c
@@ -1,4 +1,4 @@
-/* $Id: kLdrModMachO.c 66 2014-01-20 11:33:48Z bird $ */
+/* $Id: kLdrModMachO.c 69 2015-04-29 12:18:07Z bird $ */
/** @file
* kLdr - The Module Interpreter for the MACH-O format.
*/
@@ -1020,6 +1020,9 @@ static int kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_hea
/** @todo valid command size. */
break;
+ case LC_FUNCTION_STARTS: /** @todo dylib++ */
+ /* Ignore for now. */
+ break;
case LC_ID_DYLIB: /** @todo dylib */
case LC_LOAD_DYLIB: /** @todo dylib */
case LC_LOAD_DYLINKER: /** @todo dylib */
@@ -1032,7 +1035,6 @@ static int kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_hea
case LC_DYLD_INFO: /** @todo dylib */
case LC_DYLD_INFO_ONLY: /** @todo dylib */
case LC_LOAD_UPWARD_DYLIB: /** @todo dylib */
- case LC_FUNCTION_STARTS: /** @todo dylib++ */
case LC_DYLD_ENVIRONMENT: /** @todo dylib */
case LC_MAIN: /** @todo parse this and find and entry point or smth. */
/** @todo valid command size. */
@@ -3077,10 +3079,12 @@ static int kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBi
KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_length == 2, KLDR_ERR_BAD_FIXUP);
SymAddr -= 4;
break;
- case X86_64_RELOC_SIGNED_1: SymAddr -= 1; break;
- case X86_64_RELOC_SIGNED_2: SymAddr -= 2; break;
case X86_64_RELOC_SIGNED:
- case X86_64_RELOC_SIGNED_4: SymAddr -= 4; break;
+ case X86_64_RELOC_SIGNED_1:
+ case X86_64_RELOC_SIGNED_2:
+ case X86_64_RELOC_SIGNED_4:
+ SymAddr -= 4;
+ break;
default:
KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_BAD_FIXUP);
}
@@ -3160,55 +3164,73 @@ static int kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBi
&& Fixup2.r_length == Fixup.r.r_length
&& Fixup2.r_type == X86_64_RELOC_UNSIGNED
&& !Fixup2.r_pcrel
- && Fixup2.r_extern /*??*/
&& Fixup2.r_symbolnum < cSyms,
KLDR_ERR_BAD_FIXUP);
- pSym = &paSyms[Fixup.r.r_symbolnum];
- KLDRMODMACHO_CHECK_RETURN(!(pSym->n_type & MACHO_N_STAB), KLDR_ERR_BAD_FIXUP);
-
- /* Add it's value to SymAddr. */
- switch (pSym->n_type & MACHO_N_TYPE)
+ if (Fixup2.r_extern)
{
- case MACHO_N_SECT:
- {
- PKLDRMODMACHOSECT pSymSect;
- KLDRMODMACHO_CHECK_RETURN((KU32)pSym->n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
- pSymSect = &pModMachO->paSections[pSym->n_sect - 1];
- SymAddr += pSym->n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
- break;
- }
+ KLDRMODMACHO_CHECK_RETURN(Fixup2.r_symbolnum < cSyms, KLDR_ERR_BAD_FIXUP);
+ pSym = &paSyms[Fixup2.r_symbolnum];
+ KLDRMODMACHO_CHECK_RETURN(!(pSym->n_type & MACHO_N_STAB), KLDR_ERR_BAD_FIXUP);
- case MACHO_N_UNDF:
- case MACHO_N_ABS:
- SymAddr += pSym->n_value;
- break;
+ /* Add it's value to SymAddr. */
+ switch (pSym->n_type & MACHO_N_TYPE)
+ {
+ case MACHO_N_SECT:
+ {
+ PKLDRMODMACHOSECT pSymSect;
+ KLDRMODMACHO_CHECK_RETURN((KU32)pSym->n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
+ pSymSect = &pModMachO->paSections[pSym->n_sect - 1];
+ SymAddr += pSym->n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
+ break;
+ }
+
+ case MACHO_N_UNDF:
+ case MACHO_N_ABS:
+ SymAddr += pSym->n_value;
+ break;
- case MACHO_N_INDR:
- case MACHO_N_PBUD:
- KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_TODO);
- default:
- KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_MACHO_BAD_SYMBOL);
+ case MACHO_N_INDR:
+ case MACHO_N_PBUD:
+ KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_TODO);
+ default:
+ KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_MACHO_BAD_SYMBOL);
+ }
+ }
+ else if (Fixup2.r_symbolnum != R_ABS)
+ {
+ PKLDRMODMACHOSECT pSymSect;
+ KLDRMODMACHO_CHECK_RETURN(Fixup2.r_symbolnum <= pModMachO->cSections, KLDR_ERR_BAD_FIXUP);
+ pSymSect = &pModMachO->paSections[Fixup2.r_symbolnum - 1];
+ SymAddr += pSymSect->RVA + NewBaseAddress;
}
+ else
+ KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_BAD_FIXUP);
}
break;
}
}
else
{
- /* verify against fixup type */
+ /* verify against fixup type and make adjustments */
switch (Fixup.r.r_type)
{
case X86_64_RELOC_UNSIGNED:
- case X86_64_RELOC_SIGNED:
+ KLDRMODMACHO_CHECK_RETURN(!Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
+ break;
case X86_64_RELOC_BRANCH:
- /*case X86_64_RELOC_GOT_LOAD:*/
- /*case X86_64_RELOC_GOT: */
- /*case X86_64_RELOC_SUBTRACTOR: - ???*/
+ KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
+ SymAddr += 4; /* dunno what the assmbler/linker really is doing here... */
+ break;
+ case X86_64_RELOC_SIGNED:
case X86_64_RELOC_SIGNED_1:
case X86_64_RELOC_SIGNED_2:
case X86_64_RELOC_SIGNED_4:
+ KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
break;
+ /*case X86_64_RELOC_GOT_LOAD:*/
+ /*case X86_64_RELOC_GOT: */
+ /*case X86_64_RELOC_SUBTRACTOR: - must be r_extern=1 says as. */
default:
KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_BAD_FIXUP);
}
@@ -3220,6 +3242,8 @@ static int kldrModMachOFixupSectionAMD64(PKLDRMODMACHO pModMachO, KU8 *pbSectBi
SymAddr -= pSymSect->LinkAddress;
SymAddr += pSymSect->RVA + NewBaseAddress;
+ if (Fixup.r.r_pcrel)
+ SymAddr += Fixup.r.r_address;
}
}
diff --git a/src/libs/xpcom18a4/nsprpub/Makefile.in b/src/libs/xpcom18a4/nsprpub/Makefile.in
old mode 100644
new mode 100755
diff --git a/src/libs/xpcom18a4/nsprpub/config/config.mk b/src/libs/xpcom18a4/nsprpub/config/config.mk
old mode 100644
new mode 100755
diff --git a/src/libs/xpcom18a4/nsprpub/config/rules.mk b/src/libs/xpcom18a4/nsprpub/config/rules.mk
old mode 100644
new mode 100755
diff --git a/src/libs/xpcom18a4/python/client/__init__.py b/src/libs/xpcom18a4/python/client/__init__.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/file.py b/src/libs/xpcom18a4/python/file.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/primitives.py b/src/libs/xpcom18a4/python/primitives.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/__init__.py b/src/libs/xpcom18a4/python/server/__init__.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/enumerator.py b/src/libs/xpcom18a4/python/server/enumerator.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/factory.py b/src/libs/xpcom18a4/python/server/factory.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/loader.py b/src/libs/xpcom18a4/python/server/loader.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/module.py b/src/libs/xpcom18a4/python/server/module.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/server/policy.py b/src/libs/xpcom18a4/python/server/policy.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/pyxpcom_test_tools.py b/src/libs/xpcom18a4/python/test/pyxpcom_test_tools.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_com_exceptions.py b/src/libs/xpcom18a4/python/test/test_com_exceptions.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_comfile.py b/src/libs/xpcom18a4/python/test/test_comfile.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_component/py_test_component.py b/src/libs/xpcom18a4/python/test/test_component/py_test_component.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_components.py b/src/libs/xpcom18a4/python/test/test_components.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_isupports_primitives.py b/src/libs/xpcom18a4/python/test/test_isupports_primitives.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_misc.py b/src/libs/xpcom18a4/python/test/test_misc.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_streams.py b/src/libs/xpcom18a4/python/test/test_streams.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_test_component.py b/src/libs/xpcom18a4/python/test/test_test_component.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/test/test_weakreferences.py b/src/libs/xpcom18a4/python/test/test_weakreferences.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/tools/regxpcom.py b/src/libs/xpcom18a4/python/tools/regxpcom.py
old mode 100755
new mode 100644
diff --git a/src/libs/xpcom18a4/python/xpt.py b/src/libs/xpcom18a4/python/xpt.py
old mode 100755
new mode 100644
diff --git a/src/recompiler/Makefile.kmk b/src/recompiler/Makefile.kmk
index b5c809a..b5afebb 100644
--- a/src/recompiler/Makefile.kmk
+++ b/src/recompiler/Makefile.kmk
@@ -318,7 +318,7 @@ $$(VBoxREMImp_0_OUTDIR)/VBoxREMOS2.def: $(VBOX_PATH_RECOMPILER_SRC)/VBoxREM.def
$$(VBoxREMImp_0_OUTDIR)/VBoxREMWin.def: $(VBOX_PATH_RECOMPILER_SRC)/VBoxREM.def $(MAKEFILE_CURRENT) | $$(dir $$@)
$(CP) -f $< $@
-$$(VBoxREMImp_0_OUTDIR)/VBoxREMRes.o: $(VBOX_PATH_RECOMPILER_SRC)/VBoxREM.rc $(MAKEFILE_CURRENT) | $$(dir $$@)
+$$(VBoxREMImp_0_OUTDIR)/VBoxREMRes.o: $(VBOX_PATH_RECOMPILER_SRC)/VBoxREM.rc $(MAKEFILE_CURRENT) $(VBOX_VERSION_MK) | $$(dir $$@)
$(call MSG_GENERATE,,$@)
$(QUIET)$(REDIRECT) -E 'COMSPEC=$(VBOX_GOOD_COMSPEC_BS)' -- $(TOOL_MINGWW64_PREFIX)windres \
$(addprefix -I,$(INCS) $(PATH_SDK_$(VBOX_WINPSDK)_INC) $(PATH_TOOL_$(VBOX_VCC_TOOL)_INC)) \
diff --git a/src/recompiler/VBoxREMWrapper.cpp b/src/recompiler/VBoxREMWrapper.cpp
index c713a8c..be8b243 100644
--- a/src/recompiler/VBoxREMWrapper.cpp
+++ b/src/recompiler/VBoxREMWrapper.cpp
@@ -365,9 +365,9 @@ static DECLCALLBACKPTR(void, pfnREMR3ReplayHandlerNotifications)(PVM pVM);
static DECLCALLBACKPTR(void, pfnREMR3NotifyPhysRamRegister)(PVM, RTGCPHYS, RTGCPHYS, unsigned);
static DECLCALLBACKPTR(void, pfnREMR3NotifyPhysRamDeregister)(PVM, RTGCPHYS, RTUINT);
static DECLCALLBACKPTR(void, pfnREMR3NotifyPhysRomRegister)(PVM, RTGCPHYS, RTUINT, void *, bool);
-static DECLCALLBACKPTR(void, pfnREMR3NotifyHandlerPhysicalModify)(PVM, PGMPHYSHANDLERTYPE, RTGCPHYS, RTGCPHYS, RTGCPHYS, bool, bool);
-static DECLCALLBACKPTR(void, pfnREMR3NotifyHandlerPhysicalRegister)(PVM, PGMPHYSHANDLERTYPE, RTGCPHYS, RTGCPHYS, bool);
-static DECLCALLBACKPTR(void, pfnREMR3NotifyHandlerPhysicalDeregister)(PVM, PGMPHYSHANDLERTYPE, RTGCPHYS, RTGCPHYS, bool, bool);
+static DECLCALLBACKPTR(void, pfnREMR3NotifyHandlerPhysicalModify)(PVM, PGMPHYSHANDLERKIND, RTGCPHYS, RTGCPHYS, RTGCPHYS, bool, bool);
+static DECLCALLBACKPTR(void, pfnREMR3NotifyHandlerPhysicalRegister)(PVM, PGMPHYSHANDLERKIND, RTGCPHYS, RTGCPHYS, bool);
+static DECLCALLBACKPTR(void, pfnREMR3NotifyHandlerPhysicalDeregister)(PVM, PGMPHYSHANDLERKIND, RTGCPHYS, RTGCPHYS, bool, bool);
static DECLCALLBACKPTR(void, pfnREMR3NotifyInterruptSet)(PVM, PVMCPU);
static DECLCALLBACKPTR(void, pfnREMR3NotifyInterruptClear)(PVM, PVMCPU);
static DECLCALLBACKPTR(void, pfnREMR3NotifyTimerPending)(PVM, PVMCPU);
@@ -483,7 +483,7 @@ static const REMPARMDESC g_aArgsNotifyPhysRomRegister[] =
static const REMPARMDESC g_aArgsNotifyHandlerPhysicalModify[] =
{
{ REMPARMDESC_FLAGS_INT, sizeof(PVM), NULL },
- { REMPARMDESC_FLAGS_INT, sizeof(PGMPHYSHANDLERTYPE), NULL },
+ { REMPARMDESC_FLAGS_INT, sizeof(PGMPHYSHANDLERKIND), NULL },
{ REMPARMDESC_FLAGS_GCPHYS, sizeof(RTGCPHYS), NULL },
{ REMPARMDESC_FLAGS_GCPHYS, sizeof(RTGCPHYS), NULL },
{ REMPARMDESC_FLAGS_GCPHYS, sizeof(RTGCPHYS), NULL },
@@ -493,7 +493,7 @@ static const REMPARMDESC g_aArgsNotifyHandlerPhysicalModify[] =
static const REMPARMDESC g_aArgsNotifyHandlerPhysicalRegister[] =
{
{ REMPARMDESC_FLAGS_INT, sizeof(PVM), NULL },
- { REMPARMDESC_FLAGS_INT, sizeof(PGMPHYSHANDLERTYPE), NULL },
+ { REMPARMDESC_FLAGS_INT, sizeof(PGMPHYSHANDLERKIND), NULL },
{ REMPARMDESC_FLAGS_GCPHYS, sizeof(RTGCPHYS), NULL },
{ REMPARMDESC_FLAGS_GCPHYS, sizeof(RTGCPHYS), NULL },
{ REMPARMDESC_FLAGS_INT, sizeof(bool), NULL }
@@ -501,7 +501,7 @@ static const REMPARMDESC g_aArgsNotifyHandlerPhysicalRegister[] =
static const REMPARMDESC g_aArgsNotifyHandlerPhysicalDeregister[] =
{
{ REMPARMDESC_FLAGS_INT, sizeof(PVM), NULL },
- { REMPARMDESC_FLAGS_INT, sizeof(PGMPHYSHANDLERTYPE), NULL },
+ { REMPARMDESC_FLAGS_INT, sizeof(PGMPHYSHANDLERKIND), NULL },
{ REMPARMDESC_FLAGS_GCPHYS, sizeof(RTGCPHYS), NULL },
{ REMPARMDESC_FLAGS_GCPHYS, sizeof(RTGCPHYS), NULL },
{ REMPARMDESC_FLAGS_INT, sizeof(bool), NULL },
@@ -2381,27 +2381,27 @@ REMR3DECL(void) REMR3NotifyPhysRamDeregister(PVM pVM, RTGCPHYS GCPhys, RTUINT cb
#endif
}
-REMR3DECL(void) REMR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler)
+REMR3DECL(void) REMR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler)
{
#ifndef USE_REM_STUBS
Assert(VALID_PTR(pfnREMR3NotifyHandlerPhysicalRegister));
- pfnREMR3NotifyHandlerPhysicalRegister(pVM, enmType, GCPhys, cb, fHasHCHandler);
+ pfnREMR3NotifyHandlerPhysicalRegister(pVM, enmKind, GCPhys, cb, fHasHCHandler);
#endif
}
-REMR3DECL(void) REMR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
+REMR3DECL(void) REMR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
{
#ifndef USE_REM_STUBS
Assert(VALID_PTR(pfnREMR3NotifyHandlerPhysicalDeregister));
- pfnREMR3NotifyHandlerPhysicalDeregister(pVM, enmType, GCPhys, cb, fHasHCHandler, fRestoreAsRAM);
+ pfnREMR3NotifyHandlerPhysicalDeregister(pVM, enmKind, GCPhys, cb, fHasHCHandler, fRestoreAsRAM);
#endif
}
-REMR3DECL(void) REMR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
+REMR3DECL(void) REMR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
{
#ifndef USE_REM_STUBS
Assert(VALID_PTR(pfnREMR3NotifyHandlerPhysicalModify));
- pfnREMR3NotifyHandlerPhysicalModify(pVM, enmType, GCPhysOld, GCPhysNew, cb, fHasHCHandler, fRestoreAsRAM);
+ pfnREMR3NotifyHandlerPhysicalModify(pVM, enmKind, GCPhysOld, GCPhysNew, cb, fHasHCHandler, fRestoreAsRAM);
#endif
}
diff --git a/src/recompiler/VBoxRecompiler.c b/src/recompiler/VBoxRecompiler.c
index cdd15b0..ba19156 100644
--- a/src/recompiler/VBoxRecompiler.c
+++ b/src/recompiler/VBoxRecompiler.c
@@ -115,9 +115,10 @@ static void remR3HandlerWriteU8(void *pvVM, target_phys_addr_t GCPhys, uint3
static void remR3HandlerWriteU16(void *pvVM, target_phys_addr_t GCPhys, uint32_t u32);
static void remR3HandlerWriteU32(void *pvVM, target_phys_addr_t GCPhys, uint32_t u32);
-static void remR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
-static void remR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler);
-static void remR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
+static void remR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
+static void remR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler);
+static void remR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM);
+
/*******************************************************************************
* Global Variables *
@@ -3089,7 +3090,7 @@ REMR3DECL(void) REMR3ReplayHandlerNotifications(PVM pVM)
{
case REMHANDLERNOTIFICATIONKIND_PHYSICAL_REGISTER:
remR3NotifyHandlerPhysicalRegister(pVM,
- pCur->u.PhysicalRegister.enmType,
+ pCur->u.PhysicalRegister.enmKind,
pCur->u.PhysicalRegister.GCPhys,
pCur->u.PhysicalRegister.cb,
pCur->u.PhysicalRegister.fHasHCHandler);
@@ -3097,7 +3098,7 @@ REMR3DECL(void) REMR3ReplayHandlerNotifications(PVM pVM)
case REMHANDLERNOTIFICATIONKIND_PHYSICAL_DEREGISTER:
remR3NotifyHandlerPhysicalDeregister(pVM,
- pCur->u.PhysicalDeregister.enmType,
+ pCur->u.PhysicalDeregister.enmKind,
pCur->u.PhysicalDeregister.GCPhys,
pCur->u.PhysicalDeregister.cb,
pCur->u.PhysicalDeregister.fHasHCHandler,
@@ -3106,7 +3107,7 @@ REMR3DECL(void) REMR3ReplayHandlerNotifications(PVM pVM)
case REMHANDLERNOTIFICATIONKIND_PHYSICAL_MODIFY:
remR3NotifyHandlerPhysicalModify(pVM,
- pCur->u.PhysicalModify.enmType,
+ pCur->u.PhysicalModify.enmKind,
pCur->u.PhysicalModify.GCPhysOld,
pCur->u.PhysicalModify.GCPhysNew,
pCur->u.PhysicalModify.cb,
@@ -3310,7 +3311,7 @@ REMR3DECL(void) REMR3NotifyPhysRamDeregister(PVM pVM, RTGCPHYS GCPhys, RTUINT cb
* Notification about a successful PGMR3HandlerPhysicalRegister() call.
*
* @param pVM VM Handle.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhys Handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler has a HC callback function.
@@ -3318,10 +3319,11 @@ REMR3DECL(void) REMR3NotifyPhysRamDeregister(PVM pVM, RTGCPHYS GCPhys, RTUINT cb
* @remark MMR3PhysRomRegister assumes that this function will not apply the
* Handler memory type to memory which has no HC handler.
*/
-static void remR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler)
+static void remR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb,
+ bool fHasHCHandler)
{
- Log(("REMR3NotifyHandlerPhysicalRegister: enmType=%d GCPhys=%RGp cb=%RGp fHasHCHandler=%d\n",
- enmType, GCPhys, cb, fHasHCHandler));
+ Log(("REMR3NotifyHandlerPhysicalRegister: enmKind=%d GCPhys=%RGp cb=%RGp fHasHCHandler=%d\n",
+ enmKind, GCPhys, cb, fHasHCHandler));
VM_ASSERT_EMT(pVM);
Assert(RT_ALIGN_T(GCPhys, PAGE_SIZE, RTGCPHYS) == GCPhys);
@@ -3331,7 +3333,7 @@ static void remR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmTy
ASMAtomicIncU32(&pVM->rem.s.cIgnoreAll);
PDMCritSectEnter(&pVM->rem.s.CritSectRegister, VERR_SEM_BUSY);
- if (enmType == PGMPHYSHANDLERTYPE_MMIO)
+ if (enmKind == PGMPHYSHANDLERKIND_MMIO)
cpu_register_physical_memory_offset(GCPhys, cb, pVM->rem.s.iMMIOMemType, GCPhys);
else if (fHasHCHandler)
cpu_register_physical_memory_offset(GCPhys, cb, pVM->rem.s.iHandlerMemType, GCPhys);
@@ -3344,7 +3346,7 @@ static void remR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmTy
* Notification about a successful PGMR3HandlerPhysicalRegister() call.
*
* @param pVM VM Handle.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhys Handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler has a HC callback function.
@@ -3352,27 +3354,29 @@ static void remR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmTy
* @remark MMR3PhysRomRegister assumes that this function will not apply the
* Handler memory type to memory which has no HC handler.
*/
-REMR3DECL(void) REMR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler)
+REMR3DECL(void) REMR3NotifyHandlerPhysicalRegister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb,
+ bool fHasHCHandler)
{
REMR3ReplayHandlerNotifications(pVM);
- remR3NotifyHandlerPhysicalRegister(pVM, enmType, GCPhys, cb, fHasHCHandler);
+ remR3NotifyHandlerPhysicalRegister(pVM, enmKind, GCPhys, cb, fHasHCHandler);
}
/**
* Notification about a successful PGMR3HandlerPhysicalDeregister() operation.
*
* @param pVM VM Handle.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhys Handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler has a HC callback function.
* @param fRestoreAsRAM Whether the to restore it as normal RAM or as unassigned memory.
*/
-static void remR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
+static void remR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb,
+ bool fHasHCHandler, bool fRestoreAsRAM)
{
- Log(("REMR3NotifyHandlerPhysicalDeregister: enmType=%d GCPhys=%RGp cb=%RGp fHasHCHandler=%RTbool fRestoreAsRAM=%RTbool RAM=%08x\n",
- enmType, GCPhys, cb, fHasHCHandler, fRestoreAsRAM, MMR3PhysGetRamSize(pVM)));
+ Log(("REMR3NotifyHandlerPhysicalDeregister: enmKind=%d GCPhys=%RGp cb=%RGp fHasHCHandler=%RTbool fRestoreAsRAM=%RTbool RAM=%08x\n",
+ enmKind, GCPhys, cb, fHasHCHandler, fRestoreAsRAM, MMR3PhysGetRamSize(pVM)));
VM_ASSERT_EMT(pVM);
@@ -3380,7 +3384,7 @@ static void remR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enm
PDMCritSectEnter(&pVM->rem.s.CritSectRegister, VERR_SEM_BUSY);
/** @todo this isn't right, MMIO can (in theory) be restored as RAM. */
- if (enmType == PGMPHYSHANDLERTYPE_MMIO)
+ if (enmKind == PGMPHYSHANDLERKIND_MMIO)
cpu_register_physical_memory_offset(GCPhys, cb, IO_MEM_UNASSIGNED, GCPhys);
else if (fHasHCHandler)
{
@@ -3405,16 +3409,16 @@ static void remR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enm
* Notification about a successful PGMR3HandlerPhysicalDeregister() operation.
*
* @param pVM VM Handle.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhys Handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler has a HC callback function.
* @param fRestoreAsRAM Whether the to restore it as normal RAM or as unassigned memory.
*/
-REMR3DECL(void) REMR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
+REMR3DECL(void) REMR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhys, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
{
REMR3ReplayHandlerNotifications(pVM);
- remR3NotifyHandlerPhysicalDeregister(pVM, enmType, GCPhys, cb, fHasHCHandler, fRestoreAsRAM);
+ remR3NotifyHandlerPhysicalDeregister(pVM, enmKind, GCPhys, cb, fHasHCHandler, fRestoreAsRAM);
}
@@ -3422,19 +3426,19 @@ REMR3DECL(void) REMR3NotifyHandlerPhysicalDeregister(PVM pVM, PGMPHYSHANDLERTYPE
* Notification about a successful PGMR3HandlerPhysicalModify() call.
*
* @param pVM VM Handle.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhysOld Old handler range address.
* @param GCPhysNew New handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler has a HC callback function.
* @param fRestoreAsRAM Whether the to restore it as normal RAM or as unassigned memory.
*/
-static void remR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
+static void remR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
{
- Log(("REMR3NotifyHandlerPhysicalModify: enmType=%d GCPhysOld=%RGp GCPhysNew=%RGp cb=%RGp fHasHCHandler=%RTbool fRestoreAsRAM=%RTbool\n",
- enmType, GCPhysOld, GCPhysNew, cb, fHasHCHandler, fRestoreAsRAM));
+ Log(("REMR3NotifyHandlerPhysicalModify: enmKind=%d GCPhysOld=%RGp GCPhysNew=%RGp cb=%RGp fHasHCHandler=%RTbool fRestoreAsRAM=%RTbool\n",
+ enmKind, GCPhysOld, GCPhysNew, cb, fHasHCHandler, fRestoreAsRAM));
VM_ASSERT_EMT(pVM);
- AssertReleaseMsg(enmType != PGMPHYSHANDLERTYPE_MMIO, ("enmType=%d\n", enmType));
+ AssertReleaseMsg(enmKind != PGMPHYSHANDLERKIND_MMIO, ("enmKind=%d\n", enmKind));
if (fHasHCHandler)
{
@@ -3470,18 +3474,18 @@ static void remR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType
* Notification about a successful PGMR3HandlerPhysicalModify() call.
*
* @param pVM VM Handle.
- * @param enmType Handler type.
+ * @param enmKind Kind of access handler.
* @param GCPhysOld Old handler range address.
* @param GCPhysNew New handler range address.
* @param cb Size of the handler range.
* @param fHasHCHandler Set if the handler has a HC callback function.
* @param fRestoreAsRAM Whether the to restore it as normal RAM or as unassigned memory.
*/
-REMR3DECL(void) REMR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERTYPE enmType, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
+REMR3DECL(void) REMR3NotifyHandlerPhysicalModify(PVM pVM, PGMPHYSHANDLERKIND enmKind, RTGCPHYS GCPhysOld, RTGCPHYS GCPhysNew, RTGCPHYS cb, bool fHasHCHandler, bool fRestoreAsRAM)
{
REMR3ReplayHandlerNotifications(pVM);
- remR3NotifyHandlerPhysicalModify(pVM, enmType, GCPhysOld, GCPhysNew, cb, fHasHCHandler, fRestoreAsRAM);
+ remR3NotifyHandlerPhysicalModify(pVM, enmKind, GCPhysOld, GCPhysNew, cb, fHasHCHandler, fRestoreAsRAM);
}
/**
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-virtualbox/virtualbox.git
More information about the Pkg-virtualbox-commits
mailing list