diff options
| author | Felix Geyer <debfx-pkg@fobos.de> | 2011-04-22 11:24:51 +0200 |
|---|---|---|
| committer | Felix Geyer <debfx-pkg@fobos.de> | 2011-04-22 11:24:51 +0200 |
| commit | 3c3b014d3682252dbc133a6d2cd5dd2f8a028bbe (patch) | |
| tree | b5eb77e20ee70b9bd9b767e52888639d4136c81d /src/VBox | |
| parent | 0eeddfd8dc6b9702278fdefa2dee1d3f465e0ea2 (diff) | |
| download | virtualbox-3c3b014d3682252dbc133a6d2cd5dd2f8a028bbe.tar.gz | |
Imported Upstream version 4.0.6-dfsgupstream/4.0.6-dfsg
Diffstat (limited to 'src/VBox')
325 files changed, 19888 insertions, 12163 deletions
diff --git a/src/VBox/Additions/Makefile.kmk b/src/VBox/Additions/Makefile.kmk index abe2756ad..273240621 100644 --- a/src/VBox/Additions/Makefile.kmk +++ b/src/VBox/Additions/Makefile.kmk @@ -71,6 +71,41 @@ ifndef VBOX_ONLY_TESTSUITE include $(PATH_SUB_CURRENT)/darwin/Makefile.kmk endif + ifeq ($(KBUILD_TARGET),linux) + INSTALLS += LnxAddIso-scripts + LnxAddIso-scripts_INST = bin/additions + LnxAddIso-scripts_MODE = a+rx,u+w + LnxAddIso-scripts_SOURCES = \ + $(LnxAddIso-scripts_0_OUTDIR)/runasroot.sh \ + $(LnxAddIso-scripts_0_OUTDIR)/autorun.sh + LnxAddIso-scripts_CLEAN = \ + $(LnxAddIso-scripts_0_OUTDIR)/runasroot.sh \ + $(LnxAddIso-scripts_0_OUTDIR)/autorun.sh + + $$(LnxAddIso-scripts_0_OUTDIR)/runasroot.sh: \ + $(PATH_SUB_CURRENT)/../Installer/linux/runasroot.sh \ + $(PATH_SUB_CURRENT)/../Installer/linux/sh-utils.sh \ + | $$(dir $$@) + $(QUIET)$(SED) \ + -e '/#include sh-utils.sh/ {' \ + -e "r $(PATH_ROOT)/src/VBox/Installer/linux/sh-utils.sh" \ + -e 'd' \ + -e '}' \ + --output $@ \ + $< + + $$(LnxAddIso-scripts_0_OUTDIR)/autorun.sh: \ + $(PATH_SUB_CURRENT)/linux/installer/autorun.sh \ + $(PATH_SUB_CURRENT)/../Installer/linux/sh-utils.sh \ + | $$(dir $$@) + $(QUIET)$(SED) \ + -e '/#include sh-utils.sh/ {' \ + -e "r $(PATH_ROOT)/src/VBox/Installer/linux/sh-utils.sh" \ + -e 'd' \ + -e '}' \ + --output $@ \ + $< + endif # KBUILD_TARGET == linux ifeq ($(KBUILD_TARGET),win) # # Inf2Cat requires all the files referenced in the .inf file @@ -189,6 +224,7 @@ ifdef VBOX_WITH_ADDITIONS_ISO.linux.x86 endif GUESTADDITIONS_FILESPEC.linux.x86 = \ $(VBOX_LNX_ADD_X86_RUN_PKG)=$(VBOX_PATH_ADDITIONS.linux.x86)/VBoxLinuxAdditions.run \ + runasroot.sh=$(VBOX_PATH_ADDITIONS.linux.x86)/runasroot.sh \ autorun.sh=$(VBOX_PATH_ADDITIONS.linux.x86)/autorun.sh endif diff --git a/src/VBox/Additions/common/VBoxGuest/Makefile.kmk b/src/VBox/Additions/common/VBoxGuest/Makefile.kmk index 9c49278ae..df0cda7ef 100644 --- a/src/VBox/Additions/common/VBoxGuest/Makefile.kmk +++ b/src/VBox/Additions/common/VBoxGuest/Makefile.kmk @@ -43,6 +43,7 @@ if1of ($(KBUILD_TARGET), freebsd $(if $(defined VBOX_WITH_ADDITION_DRIVERS),linu ifdef VBOX_WITH_GUEST_BUGCHECK_DETECTION VBoxGuest_DEFS.win += VBOX_WITH_GUEST_BUGCHECK_DETECTION endif + #VBoxGuest_DEFS.win += LOG_ENABLED LOG_TO_BACKDOOR VBoxGuest_DEPS.solaris += $(VBOX_SVN_REV_KMK) VBoxGuest_DEPS.linux += $(VBOX_SVN_REV_HEADER) VBoxGuest_DEPS.freebsd += $(VBOX_SVN_REV_HEADER) diff --git a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win-pnp.cpp b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win-pnp.cpp index 42a5ec9fb..69ffcb308 100644 --- a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win-pnp.cpp +++ b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win-pnp.cpp @@ -153,6 +153,8 @@ NTSTATUS vboxguestwinPnP(PDEVICE_OBJECT pDevObj, PIRP pIrp) case IRP_MN_START_DEVICE: { Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: START_DEVICE\n")); + + /* This must be handled first by the lower driver. */ rc = vboxguestwinSendIrpSynchronously(pDevExt->win.s.pNextLowerDriver, pIrp, TRUE); if ( NT_SUCCESS(rc) @@ -183,16 +185,43 @@ NTSTATUS vboxguestwinPnP(PDEVICE_OBJECT pDevObj, PIRP pIrp) break; } - case IRP_MN_QUERY_PNP_DEVICE_STATE: + case IRP_MN_CANCEL_REMOVE_DEVICE: { - Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: QUERY_PNP_DEVICE_STATE\n")); + Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: CANCEL_REMOVE_DEVICE\n")); + + /* This must be handled first by the lower driver. */ + rc = vboxguestwinSendIrpSynchronously(pDevExt->win.s.pNextLowerDriver, pIrp, TRUE); + + if (NT_SUCCESS(rc) && pDevExt->win.s.devState == PENDINGREMOVE) + { + /* Return to the state prior to receiving the IRP_MN_QUERY_REMOVE_DEVICE request. */ + pDevExt->win.s.devState = pDevExt->win.s.prevDevState; + } + + /* Complete the IRP. */ break; } - case IRP_MN_CANCEL_REMOVE_DEVICE: + case IRP_MN_SURPRISE_REMOVAL: { - Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: CANCEL_REMOVE_DEVICE\n")); - break; + Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: IRP_MN_SURPRISE_REMOVAL\n")); + + VBOXGUEST_UPDATE_DEVSTATE(pDevExt, SURPRISEREMOVED); + + /* Do nothing here actually. Cleanup is done in IRP_MN_REMOVE_DEVICE. + * This request is not expected for VBoxGuest. + */ + LogRel(("VBoxGuest: unexpected device removal\n")); + + /* Pass to the lower driver. */ + pIrp->IoStatus.Status = STATUS_SUCCESS; + + IoSkipCurrentIrpStackLocation(pIrp); + + rc = IoCallDriver(pDevExt->win.s.pNextLowerDriver, pIrp); + + /* Do not complete the IRP. */ + return rc; } case IRP_MN_QUERY_REMOVE_DEVICE: @@ -200,90 +229,114 @@ NTSTATUS vboxguestwinPnP(PDEVICE_OBJECT pDevObj, PIRP pIrp) Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: QUERY_REMOVE_DEVICE\n")); #ifdef VBOX_REBOOT_ON_UNINSTALL - /* The device can not be removed without a reboot. */ - if (pDevExt->win.s.devState == WORKING) - { - Log(("VBoxGuest::vboxguestwinGuestPnp: QUERY_REMOVE_DEVICE: Device cannot be removed without a reboot!\n")); - pDevExt->win.s.devState = PENDINGREMOVE; - } + Log(("VBoxGuest::vboxguestwinGuestPnp: QUERY_REMOVE_DEVICE: Device cannot be removed without a reboot.\n")); rc = STATUS_UNSUCCESSFUL; - Log(("VBoxGuest::vboxguestwinGuestPnp: QUERY_REMOVE_DEVICE: Refuse with rc = %Rrc\n", rc)); -#else - if (pDevExt->win.s.devState == WORKING) - pDevExt->win.s.devState = PENDINGREMOVE; #endif /* VBOX_REBOOT_ON_UNINSTALL */ + + if (NT_SUCCESS(rc)) + { + VBOXGUEST_UPDATE_DEVSTATE(pDevExt, PENDINGREMOVE); + + /* This IRP passed down to lower driver. */ + pIrp->IoStatus.Status = STATUS_SUCCESS; + + rc = vboxguestwinSendIrpSynchronously(pDevExt->win.s.pNextLowerDriver, pIrp, TRUE); + + /* Do not complete the IRP. */ + return rc; + } + + /* Complete the IRP on failure. */ break; } case IRP_MN_REMOVE_DEVICE: { Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: REMOVE_DEVICE\n")); - if (pDevExt->win.s.devState == PENDINGREMOVE) - { - rc = vboxguestwinCleanup(pDevObj); - if (NT_SUCCESS(rc)) - { - /* - * We need to send the remove down the stack before we detach, - * but we don't need to wait for the completion of this operation - * (and to register a completion routine). - */ - pIrp->IoStatus.Status = STATUS_SUCCESS; - IoSkipCurrentIrpStackLocation(pIrp); - if (pDevExt->win.s.pNextLowerDriver != NULL) - { - rc = IoCallDriver(pDevExt->win.s.pNextLowerDriver, pIrp); - IoDetachDevice(pDevExt->win.s.pNextLowerDriver); + VBOXGUEST_UPDATE_DEVSTATE(pDevExt, REMOVED); - Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Next lower driver replied rc = 0x%x\n", rc)); - } + /* Free hardware resources. */ + /* @todo this should actually free I/O ports, interrupts, etc. */ + rc = vboxguestwinCleanup(pDevObj); + Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: vboxguestwinCleanup rc = 0x%08X\n", rc)); + + /* + * We need to send the remove down the stack before we detach, + * but we don't need to wait for the completion of this operation + * (and to register a completion routine). + */ + pIrp->IoStatus.Status = STATUS_SUCCESS; + + IoSkipCurrentIrpStackLocation(pIrp); - Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Removing device ...\n")); + rc = IoCallDriver(pDevExt->win.s.pNextLowerDriver, pIrp); + Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Next lower driver replied rc = 0x%x\n", rc)); - /* Remove DOS device + symbolic link. */ - UNICODE_STRING win32Name; - RtlInitUnicodeString(&win32Name, VBOXGUEST_DEVICE_NAME_DOS); - IoDeleteSymbolicLink(&win32Name); + IoDetachDevice(pDevExt->win.s.pNextLowerDriver); - pDevExt->win.s.devState = REMOVED; + Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Removing device ...\n")); - Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Deleting device ...\n")); + /* Destroy device extension and clean up everything else. */ + VBoxGuestDeleteDevExt(pDevExt); - /* Last action: Delete our device! pDevObj is *not* failed - * anymore after this call! */ - IoDeleteDevice(pDevObj); + /* Remove DOS device + symbolic link. */ + UNICODE_STRING win32Name; + RtlInitUnicodeString(&win32Name, VBOXGUEST_DEVICE_NAME_DOS); + IoDeleteSymbolicLink(&win32Name); - Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Device removed!\n")); - return rc; /* Make sure that we don't do anything below here anymore! */ - } - else - Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Error while cleaning up, rc = 0x%x\n", rc)); - } - else - Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Devices state is not PENDINGREMOVE but %d\n", - pDevExt->win.s.devState)); - break; + Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Deleting device ...\n")); + + /* Last action: Delete our device! pDevObj is *not* failed + * anymore after this call! */ + IoDeleteDevice(pDevObj); + + Log(("VBoxGuest::vboxguestwinGuestPnp: REMOVE_DEVICE: Device removed!\n")); + + /* Propagating rc from IoCallDriver. */ + return rc; /* Make sure that we don't do anything below here anymore! */ } case IRP_MN_CANCEL_STOP_DEVICE: { Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: CANCEL_STOP_DEVICE\n")); + + /* This must be handled first by the lower driver. */ + rc = vboxguestwinSendIrpSynchronously(pDevExt->win.s.pNextLowerDriver, pIrp, TRUE); + + if (NT_SUCCESS(rc) && pDevExt->win.s.devState == PENDINGSTOP) + { + /* Return to the state prior to receiving the IRP_MN_QUERY_STOP_DEVICE request. */ + pDevExt->win.s.devState = pDevExt->win.s.prevDevState; + } + + /* Complete the IRP. */ break; } case IRP_MN_QUERY_STOP_DEVICE: { Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: QUERY_STOP_DEVICE\n")); - if (pDevExt->win.s.devState == WORKING) - pDevExt->win.s.devState = PENDINGSTOP; -#ifdef VBOX_REBOOT_ON_UNINSTALL - Log(("VBoxGuest::vboxguestwinGuestPnp: QUERY_STOP_DEVICE: Device cannot be stopped!\n")); - /* The device can not be stopped without a reboot. */ +#ifdef VBOX_REBOOT_ON_UNINSTALL + Log(("VBoxGuest::vboxguestwinGuestPnp: QUERY_STOP_DEVICE: Device cannot be stopped without a reboot!\n")); pIrp->IoStatus.Status = STATUS_UNSUCCESSFUL; - Log(("VBoxGuest::vboxguestwinGuestPnp: QUERY_STOP_DEVICE: Refuse with rc = 0x%x\n", rc)); #endif /* VBOX_REBOOT_ON_UNINSTALL */ + + if (NT_SUCCESS(rc)) + { + VBOXGUEST_UPDATE_DEVSTATE(pDevExt, PENDINGSTOP); + + /* This IRP passed down to lower driver. */ + pIrp->IoStatus.Status = STATUS_SUCCESS; + + rc = vboxguestwinSendIrpSynchronously(pDevExt->win.s.pNextLowerDriver, pIrp, TRUE); + + /* Do not complete the IRP. */ + return rc; + } + + /* Complete the IRP on failure. */ break; } @@ -291,22 +344,22 @@ NTSTATUS vboxguestwinPnP(PDEVICE_OBJECT pDevObj, PIRP pIrp) { Log(("VBoxGuest::vboxguestwinVBoxGuestPnP: STOP_DEVICE\n")); - if (pDevExt->win.s.devState == PENDINGSTOP) - { - rc = vboxguestwinCleanup(pDevObj); - if (NT_SUCCESS(rc)) - { - pDevExt->win.s.devState = STOPPED; - IoInvalidateDeviceState(pDevObj); - Log(("VBoxGuest::vboxguestwinGuestPnp: STOP_DEVICE: Device has been disabled\n")); - } - else - Log(("VBoxGuest::vboxguestwinGuestPnp: STOP_DEVICE: Error while cleaning up, rc = 0x%x\n", rc)); - } - else - Log(("VBoxGuest::vboxguestwinGuestPnp: STOP_DEVICE: Devices state is not PENDINGSTOP but %d\n", - pDevExt->win.s.devState)); - break; + VBOXGUEST_UPDATE_DEVSTATE(pDevExt, STOPPED); + + /* Free hardware resources. */ + /* @todo this should actually free I/O ports, interrupts, etc. */ + rc = vboxguestwinCleanup(pDevObj); + Log(("VBoxGuest::vboxguestwinGuestPnp: STOP_DEVICE: cleaning up, rc = 0x%x\n", rc)); + + /* Pass to the lower driver. */ + pIrp->IoStatus.Status = STATUS_SUCCESS; + + IoSkipCurrentIrpStackLocation(pIrp); + + rc = IoCallDriver(pDevExt->win.s.pNextLowerDriver, pIrp); + Log(("VBoxGuest::vboxguestwinGuestPnp: STOP_DEVICE: Next lower driver replied rc = 0x%x\n", rc)); + + return rc; } default: diff --git a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp index 57664ddb1..b04292694 100644 --- a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp +++ b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.cpp @@ -222,6 +222,7 @@ static NTSTATUS vboxguestwinAddDevice(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDe RtlZeroMemory(pDevExt, sizeof(VBOXGUESTDEVEXT)); pDevExt->win.s.pDeviceObject = pDeviceObject; + pDevExt->win.s.prevDevState = STOPPED; pDevExt->win.s.devState = STOPPED; pDevExt->win.s.pNextLowerDriver = IoAttachDeviceToDeviceStack(pDeviceObject, pDevObj); @@ -500,7 +501,7 @@ NTSTATUS vboxguestwinInit(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICO { /* Ready to rumble! */ Log(("VBoxGuest::vboxguestwinInit: Device is ready!\n")); - pDevExt->win.s.devState = WORKING; + VBOXGUEST_UPDATE_DEVSTATE(pDevExt, WORKING); } else { @@ -513,7 +514,8 @@ NTSTATUS vboxguestwinInit(PDRIVER_OBJECT pDrvObj, PDEVICE_OBJECT pDevObj, PUNICO /** - * Cleans up all data (like device extension and guest mapping). + * Cleans up hardware resources. + * Do not delete DevExt here. * * @param pDrvObj Driver object. */ @@ -529,9 +531,6 @@ NTSTATUS vboxguestwinCleanup(PDEVICE_OBJECT pDevObj) #endif /* According to MSDN we have to unmap previously mapped memory. */ vboxguestwinUnmapVMMDevMemory(pDevExt); - - /* Destroy device extension and clean up everything else. */ - VBoxGuestDeleteDevExt(pDevExt); } return STATUS_SUCCESS; } @@ -547,6 +546,11 @@ void vboxguestwinUnload(PDRIVER_OBJECT pDrvObj) Log(("VBoxGuest::vboxguestwinGuestUnload\n")); #ifdef TARGET_NT4 vboxguestwinCleanup(pDrvObj->DeviceObject); + + /* Destroy device extension and clean up everything else. */ + if (pDrvObj->DeviceObject && pDrvObj->DeviceObject->DeviceExtension) + VBoxGuestDeleteDevExt((PVBOXGUESTDEVEXT)pDrvObj->DeviceObject->DeviceExtension); + /* * I don't think it's possible to unload a driver which processes have * opened, at least we'll blindly assume that here. @@ -581,12 +585,18 @@ NTSTATUS vboxguestwinCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp) PVBOXGUESTDEVEXT pDevExt = (PVBOXGUESTDEVEXT)pDevObj->DeviceExtension; NTSTATUS rc = STATUS_SUCCESS; - /* - * We are not remotely similar to a directory... - * (But this is possible.) - */ - if (pStack->Parameters.Create.Options & FILE_DIRECTORY_FILE) + if (pDevExt->win.s.devState != WORKING) { + Log(("VBoxGuest::vboxguestwinGuestCreate: device is not working currently: %d!\n", + pDevExt->win.s.devState)); + rc = STATUS_UNSUCCESSFUL; + } + else if (pStack->Parameters.Create.Options & FILE_DIRECTORY_FILE) + { + /* + * We are not remotely similar to a directory... + * (But this is possible.) + */ Log(("VBoxGuest::vboxguestwinGuestCreate: Uhm, we're not a directory!\n")); rc = STATUS_NOT_A_DIRECTORY; } diff --git a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.h b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.h index 683009da9..f0a3f41a0 100644 --- a/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.h +++ b/src/VBox/Additions/common/VBoxGuest/VBoxGuest-win.h @@ -103,6 +103,7 @@ typedef struct VBOXGUESTDEVEXTWIN /** Device state. */ DEVSTATE devState; + DEVSTATE prevDevState; /** Last system power action set (see VBoxGuestPower). */ POWER_ACTION LastSystemPowerAction; @@ -116,6 +117,11 @@ typedef struct VBOXGUESTDEVEXTWIN PVBOXGUESTSESSION pKernelSession; } VBOXGUESTDEVEXTWIN, *PVBOXGUESTDEVEXTWIN; +#define VBOXGUEST_UPDATE_DEVSTATE(_pDevExt, _newDevState) do { \ + (_pDevExt)->win.s.prevDevState = (_pDevExt)->win.s.devState; \ + (_pDevExt)->win.s.devState = (_newDevState); \ +} while (0) + /******************************************************************************* * Defined Constants And Macros * diff --git a/src/VBox/Additions/common/VBoxGuest/freebsd/Makefile b/src/VBox/Additions/common/VBoxGuest/freebsd/Makefile index 53da37e38..cf5588377 100644 --- a/src/VBox/Additions/common/VBoxGuest/freebsd/Makefile +++ b/src/VBox/Additions/common/VBoxGuest/freebsd/Makefile @@ -77,6 +77,7 @@ SRCS += \ .PATH: ${.CURDIR}/common/string SRCS += \ RTStrCopy.c \ + RTStrCopyP.c \ strformat.c \ strformatrt.c \ strformattype.c \ diff --git a/src/VBox/Additions/common/VBoxGuest/freebsd/files_vboxguest b/src/VBox/Additions/common/VBoxGuest/freebsd/files_vboxguest index e2589e9b8..876b54afa 100755 --- a/src/VBox/Additions/common/VBoxGuest/freebsd/files_vboxguest +++ b/src/VBox/Additions/common/VBoxGuest/freebsd/files_vboxguest @@ -34,6 +34,7 @@ FILES_VBOXGUEST_NOBIN=" \ ${PATH_ROOT}/include/iprt/list.h=>include/iprt/list.h \ ${PATH_ROOT}/include/iprt/lockvalidator.h=>include/iprt/lockvalidator.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/memobj.h=>include/iprt/memobj.h \ ${PATH_ROOT}/include/iprt/mp.h=>include/iprt/mp.h \ @@ -69,6 +70,7 @@ FILES_VBOXGUEST_NOBIN=" \ ${PATH_ROOT}/include/VBox/VBoxGuest.h=>include/VBox/VBoxGuest.h \ ${PATH_ROOT}/include/VBox/VBoxGuest2.h=>include/VBox/VBoxGuest2.h \ ${PATH_ROOT}/include/VBox/VBoxGuestLib.h=>include/VBox/VBoxGuestLib.h \ + ${PATH_ROOT}/include/VBox/VBoxGuestMangling.h=>include/VBox/VBoxGuestMangling.h \ ${PATH_ROOT}/include/VBox/version.h=>include/VBox/version.h \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp=>VBoxGuest.c \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/VBoxGuest-freebsd.c=>VBoxGuest-freebsd.c \ @@ -109,6 +111,7 @@ FILES_VBOXGUEST_NOBIN=" \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/RTAssertMsg2WeakV.cpp=>common/misc/RTAssertMsg2WeakV.c \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/assert.cpp=>common/misc/assert.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/RTStrCopy.cpp=>common/string/RTStrCopy.c \ + ${PATH_ROOT}/src/VBox/Runtime/common/string/RTStrCopyP.cpp=>common/string/RTStrCopyP.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformat.cpp=>common/string/strformat.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformatrt.cpp=>common/string/strformatrt.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformattype.cpp=>common/string/strformattype.c \ diff --git a/src/VBox/Additions/common/VBoxGuest/linux/Makefile b/src/VBox/Additions/common/VBoxGuest/linux/Makefile index 1b212142f..61a1cd53c 100644 --- a/src/VBox/Additions/common/VBoxGuest/linux/Makefile +++ b/src/VBox/Additions/common/VBoxGuest/linux/Makefile @@ -1,4 +1,4 @@ -# $Revision: 66720 $ +# $Revision: 70883 $ ## @file # VirtualBox Guest Additions Module Makefile. # @@ -109,6 +109,7 @@ OBJS = \ common/misc/RTAssertMsg2WeakV.o \ common/misc/assert.o \ common/string/RTStrCopy.o \ + common/string/RTStrCopyP.o \ common/string/strformat.o \ common/string/strformatrt.o \ common/string/strformattype.o \ @@ -228,6 +229,11 @@ ifndef INCL INCL += $(addprefix -I$(KBUILD_EXTMOD)/vboxguest,/ /include /r0drv/linux) export INCL endif +ifneq ($(wildcard $(KBUILD_EXTMOD)/vboxguest),) + MANGLING := $(KBUILD_EXTMOD)/vboxguest/include/VBox/VBoxGuestMangling.h +else + MANGLING := $(KBUILD_EXTMOD)/include/VBox/VBoxGuestMangling.h +endif KFLAGS := -D__KERNEL__ -DMODULE \ -DVBOX -DRT_OS_LINUX -DIN_RING0 -DIN_RT_R0 -DIN_GUEST -DIN_GUEST_R0 \ -DIN_MODULE -DRT_WITH_VBOX -DVBGL_VBOXGUEST -DVBOX_WITH_HGCM @@ -270,7 +276,7 @@ MODULE_EXT := ko $(MODULE)-y := $(OBJS) # build defs -EXTRA_CFLAGS += $(INCL) $(KFLAGS) $(KDEBUG) +EXTRA_CFLAGS += -include $(MANGLING) $(INCL) $(KFLAGS) $(KDEBUG) all: $(MODULE) @@ -288,6 +294,14 @@ install: $(MODULE) endif # eq($(MAKECMDGOALS),clean) +check: $(MODULE) + @if ! readelf -p __ksymtab_strings vboxguest.ko | grep -E "\[.*\] *(RT|g_..*RT.*)"; then \ + echo "All exported IPRT symbols are properly renamed!"; \ + else \ + echo "error: Some exported IPRT symbols was not properly renamed! See above." >&2; \ + false; \ + fi + clean: for f in . linux r0drv generic r0drv/linux r0drv/generic VBox \ common/alloc common/err common/log common/math/gcc common/misc common/string common/time; \ diff --git a/src/VBox/Additions/common/VBoxGuest/linux/files_vboxguest b/src/VBox/Additions/common/VBoxGuest/linux/files_vboxguest index 238aefdf1..9a23c6159 100755 --- a/src/VBox/Additions/common/VBoxGuest/linux/files_vboxguest +++ b/src/VBox/Additions/common/VBoxGuest/linux/files_vboxguest @@ -34,6 +34,7 @@ FILES_VBOXGUEST_NOBIN=" \ ${PATH_ROOT}/include/iprt/list.h=>include/iprt/list.h \ ${PATH_ROOT}/include/iprt/lockvalidator.h=>include/iprt/lockvalidator.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/memobj.h=>include/iprt/memobj.h \ ${PATH_ROOT}/include/iprt/mp.h=>include/iprt/mp.h \ @@ -62,6 +63,7 @@ FILES_VBOXGUEST_NOBIN=" \ ${PATH_ROOT}/include/VBox/VBoxGuest.h=>include/VBox/VBoxGuest.h \ ${PATH_ROOT}/include/VBox/VBoxGuest2.h=>include/VBox/VBoxGuest2.h \ ${PATH_ROOT}/include/VBox/VBoxGuestLib.h=>include/VBox/VBoxGuestLib.h \ + ${PATH_ROOT}/include/VBox/VBoxGuestMangling.h=>include/VBox/VBoxGuestMangling.h \ ${PATH_ROOT}/include/VBox/version.h=>include/VBox/version.h \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp=>VBoxGuest.c \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuest/VBoxGuest-linux.c=>VBoxGuest-linux.c \ @@ -113,6 +115,7 @@ FILES_VBOXGUEST_NOBIN=" \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/RTAssertMsg2WeakV.cpp=>common/misc/RTAssertMsg2WeakV.c \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/assert.cpp=>common/misc/assert.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/RTStrCopy.cpp=>common/string/RTStrCopy.c \ + ${PATH_ROOT}/src/VBox/Runtime/common/string/RTStrCopyP.cpp=>common/string/RTStrCopyP.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformat.cpp=>common/string/strformat.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformatrt.cpp=>common/string/strformatrt.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformattype.cpp=>common/string/strformattype.c \ diff --git a/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp b/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp index 957fde1c8..bea8334bd 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp @@ -1,4 +1,4 @@ -/* $Revision: 64879 $ */ +/* $Revision: 71297 $ */ /** @file * VBoxGuestLibR0 - Generic VMMDev request management. */ @@ -109,7 +109,7 @@ DECLVBGL(int) VbglGRAlloc (VMMDevRequestHeader **ppReq, uint32_t cbSize, VMMDevR if (!ppReq || cbSize < sizeof (VMMDevRequestHeader)) { - dprintf(("VbglGRAlloc: Invalid parameter: ppReq = %p, cbSize = %d\n", ppReq, cbSize)); + dprintf(("VbglGRAlloc: Invalid parameter: ppReq = %p, cbSize = %u\n", ppReq, cbSize)); return VERR_INVALID_PARAMETER; } diff --git a/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp b/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp index 2301ecc6a..733560430 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp @@ -1,4 +1,4 @@ -/* $Revision: 67140 $ */ +/* $Revision: 70398 $ */ /** @file * VBoxGuestLib - Host-Guest Communication Manager internal functions, implemented by VBoxGuest */ @@ -399,7 +399,7 @@ static int vbglR0HGCMInternalPreprocessCall(VBoxGuestHGCMCallInfo const *pCallIn if (VBGLR0_CAN_USE_PHYS_PAGE_LIST()) { - size_t cPages = RTR0MemObjSize(hObj); + size_t const cPages = RTR0MemObjSize(hObj) >> PAGE_SHIFT; *pcbExtra += RT_OFFSETOF(HGCMPageListInfo, aPages[cPages]); } } diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp index f30d5f28c..ce834f4ba 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3Lib.cpp @@ -213,8 +213,7 @@ static int vbglR3Init(const char *pszDeviceName) PRTLOGGER pReleaseLogger; static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES; int rc2 = RTLogCreate(&pReleaseLogger, 0, "all", "VBOX_RELEASE_LOG", - RT_ELEMENTS(s_apszGroups), &s_apszGroups[0], - RTLOGDEST_USER, NULL); + RT_ELEMENTS(s_apszGroups), &s_apszGroups[0], RTLOGDEST_USER, NULL); /* This may legitimately fail if we are using the mini-runtime. */ if (RT_SUCCESS(rc2)) RTLogRelSetDefaultInstance(pReleaseLogger); diff --git a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp index 4db65732c..27f86c4b9 100644 --- a/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp +++ b/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibGuestProp.cpp @@ -58,7 +58,7 @@ extern "C" void* xf86memset(const void*,int,xf86size_t); DECLINLINE(char const *) RTStrEnd(char const *pszString, size_t cchMax) { /* Avoid potential issues with memchr seen in glibc. */ - if (cchMax > RTSTR_MEMCHR_MAX) + while (cchMax > RTSTR_MEMCHR_MAX) { char const *pszRet = (char const *)memchr(pszString, '\0', RTSTR_MEMCHR_MAX); if (RT_LIKELY(pszRet)) @@ -72,7 +72,7 @@ DECLINLINE(char const *) RTStrEnd(char const *pszString, size_t cchMax) DECLINLINE(char *) RTStrEnd(char *pszString, size_t cchMax) { /* Avoid potential issues with memchr seen in glibc. */ - if (cchMax > RTSTR_MEMCHR_MAX) + while (cchMax > RTSTR_MEMCHR_MAX) { char *pszRet = (char *)memchr(pszString, '\0', RTSTR_MEMCHR_MAX); if (RT_LIKELY(pszRet)) diff --git a/src/VBox/Additions/common/VBoxService/Makefile.kmk b/src/VBox/Additions/common/VBoxService/Makefile.kmk index 9a32effbe..ee88c6ba8 100644 --- a/src/VBox/Additions/common/VBoxService/Makefile.kmk +++ b/src/VBox/Additions/common/VBoxService/Makefile.kmk @@ -4,7 +4,7 @@ # # -# Copyright (C) 2007-2010 Oracle Corporation +# Copyright (C) 2007-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -68,7 +68,9 @@ VBoxService_SOURCES = \ ifdef VBOX_WITH_GUEST_CONTROL VBoxService_SOURCES += \ VBoxServiceControl.cpp \ - VBoxServiceControlExec.cpp + VBoxServiceControlExec.cpp \ + VBoxServiceControlExecThread.cpp \ + VBoxServicePipeBuf.cpp endif ifdef VBOX_WITH_MEMBALLOON diff --git a/src/VBox/Additions/common/VBoxService/VBoxService.cpp b/src/VBox/Additions/common/VBoxService/VBoxService.cpp index 42307e006..d8880addd 100644 --- a/src/VBox/Additions/common/VBoxService/VBoxService.cpp +++ b/src/VBox/Additions/common/VBoxService/VBoxService.cpp @@ -514,6 +514,8 @@ void VBoxServiceMainWait(void) int main(int argc, char **argv) { + RTEXITCODE rcExit; + /* * Init globals and such. */ @@ -521,18 +523,16 @@ int main(int argc, char **argv) g_pszProgName = RTPathFilename(argv[0]); - int rc; + #ifdef VBOXSERVICE_TOOLBOX - if (argc > 1) - { - /* - * Run toolbox code before all other stuff, especially before checking the global - * mutex because VBoxService might spawn itself to execute some commands. - */ - int iExitCode; - if (VBoxServiceToolboxMain(argc - 1, &argv[1], &iExitCode)) - return iExitCode; - } + /* + * Run toolbox code before all other stuff since these things are simpler + * shell/file/text utility like programs that just happens to be inside + * VBoxService and shouldn't be subject to /dev/vboxguest, pid-files and + * global mutex restrictions. + */ + if (VBoxServiceToolboxMain(argc, argv, &rcExit)) + return rcExit; #endif /* @@ -542,7 +542,7 @@ int main(int argc, char **argv) * do to some initial stuff with it. */ VBoxServiceVerbose(2, "Calling VbgR3Init()\n"); - rc = VbglR3Init(); + int rc = VbglR3Init(); if (RT_FAILURE(rc)) return VBoxServiceError("VbglR3Init failed with rc=%Rrc.\n", rc); @@ -722,7 +722,6 @@ int main(int argc, char **argv) /* * Daemonize if requested. */ - RTEXITCODE rcExit; if (fDaemonize && !fDaemonized) { #ifdef RT_OS_WINDOWS diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp index ce38766ba..63943e688 100644 --- a/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp +++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2010 Oracle Corporation + * Copyright (C) 2011 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,7 +19,6 @@ /******************************************************************************* * Header Files * *******************************************************************************/ -#include <iprt/asm.h> #include <iprt/assert.h> #include <iprt/getopt.h> #include <iprt/mem.h> @@ -29,6 +28,7 @@ #include <VBox/HostServices/GuestControlSvc.h> #include "VBoxServiceInternal.h" #include "VBoxServiceUtils.h" +#include "VBoxServiceControlExecThread.h" using namespace guestControl; @@ -41,9 +41,10 @@ uint32_t g_ControlInterval = 0; static RTSEMEVENTMULTI g_hControlEvent = NIL_RTSEMEVENTMULTI; /** The Guest Control service client ID. */ static uint32_t g_GuestControlSvcClientID = 0; -/** List of spawned processes */ +/** List of spawned processes. */ RTLISTNODE g_GuestControlExecThreads; - +/** Critical section protecting g_GuestControlExecThreads. */ +RTCRITSECT g_GuestControlExecThreadsCritSect; /** @copydoc VBOXSERVICE::pfnPreInit */ static DECLCALLBACK(int) VBoxServiceControlPreInit(void) @@ -85,6 +86,8 @@ static DECLCALLBACK(int) VBoxServiceControlInit(void) /* Init thread list. */ RTListInit(&g_GuestControlExecThreads); + rc = RTCritSectInit(&g_GuestControlExecThreadsCritSect); + AssertRC(rc); } else { @@ -215,49 +218,7 @@ static DECLCALLBACK(void) VBoxServiceControlTerm(void) { VBoxServiceVerbose(3, "Control: Terminating ...\n"); - /* Signal all threads that we want to shutdown. */ - PVBOXSERVICECTRLTHREAD pNode; - RTListForEach(&g_GuestControlExecThreads, pNode, VBOXSERVICECTRLTHREAD, Node) - ASMAtomicXchgBool(&pNode->fShutdown, true); - - /* Wait for threads to shutdown. */ - RTListForEach(&g_GuestControlExecThreads, pNode, VBOXSERVICECTRLTHREAD, Node) - { - if (pNode->Thread != NIL_RTTHREAD) - { - /* Wait a bit ... */ - int rc2 = RTThreadWait(pNode->Thread, 30 * 1000 /* Wait 30 seconds max. */, NULL); - if (RT_FAILURE(rc2)) - VBoxServiceError("Control: Thread failed to stop; rc2=%Rrc\n", rc2); - } - - /* Destroy thread specific data. */ - switch (pNode->enmType) - { - case kVBoxServiceCtrlThreadDataExec: - VBoxServiceControlExecDestroyThreadData((PVBOXSERVICECTRLTHREADDATAEXEC)pNode->pvData); - break; - - default: - break; - } - } - - /* Finally destroy thread list. */ - pNode = RTListGetFirst(&g_GuestControlExecThreads, VBOXSERVICECTRLTHREAD, Node); - while (pNode) - { - PVBOXSERVICECTRLTHREAD pNext = RTListNodeGetNext(&pNode->Node, VBOXSERVICECTRLTHREAD, Node); - bool fLast = RTListNodeIsLast(&g_GuestControlExecThreads, &pNode->Node); - - RTListNodeRemove(&pNode->Node); - RTMemFree(pNode); - - if (fLast) - break; - - pNode = pNext; - } + VBoxServiceControlExecThreadsShutdown(); VbglR3GuestCtrlDisconnect(g_GuestControlSvcClientID); g_GuestControlSvcClientID = 0; diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp index 3828ea363..136679fe8 100644 --- a/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp +++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2010 Oracle Corporation + * Copyright (C) 2011 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,18 +33,21 @@ #include <iprt/poll.h> #include <iprt/process.h> #include <iprt/string.h> -#include <iprt/semaphore.h> #include <iprt/stream.h> #include <iprt/thread.h> #include <VBox/version.h> #include <VBox/VBoxGuestLib.h> #include <VBox/HostServices/GuestControlSvc.h> + #include "VBoxServiceInternal.h" #include "VBoxServiceUtils.h" +#include "VBoxServicePipeBuf.h" +#include "VBoxServiceControlExecThread.h" using namespace guestControl; extern RTLISTNODE g_GuestControlExecThreads; +extern RTCRITSECT g_GuestControlExecThreadsCritSect; /** @@ -59,26 +62,34 @@ extern RTLISTNODE g_GuestControlExecThreads; static int VBoxServiceControlExecProcHandleStdInErrorEvent(RTPOLLSET hPollSet, uint32_t fPollEvt, PRTPIPE phStdInW, PVBOXSERVICECTRLEXECPIPEBUF pStdInBuf) { - int rc = RTCritSectEnter(&pStdInBuf->CritSect); - if (RT_SUCCESS(rc)) + int rc = RTPollSetRemove(hPollSet, VBOXSERVICECTRLPIPEID_STDIN_WRITABLE); + /* Don't assert if writable handle is not in poll set anymore. */ + if ( RT_FAILURE(rc) + && rc != VERR_POLL_HANDLE_ID_NOT_FOUND) { - int rc2 = RTPollSetRemove(hPollSet, VBOXSERVICECTRLPIPEID_STDIN_WRITABLE); - AssertRC(rc2); - - rc2 = RTPipeClose(*phStdInW); - AssertRC(rc2); - *phStdInW = NIL_RTPIPE; + AssertRC(rc); + } - /* Mark the stdin buffer as dead; we're not using it anymore. */ - pStdInBuf->fAlive = false; + /* Close writable stdin pipe. */ + rc = RTPipeClose(*phStdInW); + AssertRC(rc); + *phStdInW = NIL_RTPIPE; - rc2 = RTPollSetRemove(hPollSet, VBOXSERVICECTRLPIPEID_STDIN_ERROR); - AssertRC(rc2); + /* Mark the stdin buffer as dead; we're not using it anymore. */ + rc = VBoxServicePipeBufSetStatus(pStdInBuf, false /* Disabled */); + AssertRC(rc); - rc2 = RTCritSectLeave(&pStdInBuf->CritSect); - if (RT_SUCCESS(rc)) - rc = rc2; + /* Remove stdin error handle from set. */ + rc = RTPollSetRemove(hPollSet, VBOXSERVICECTRLPIPEID_STDIN_ERROR); + /* Don't assert if writable handle is not in poll set anymore. */ + if ( RT_FAILURE(rc) + && rc != VERR_POLL_HANDLE_ID_NOT_FOUND) + { + AssertRC(rc); } + else + rc = VINF_SUCCESS; + return rc; } @@ -89,80 +100,37 @@ static int VBoxServiceControlExecProcHandleStdInErrorEvent(RTPOLLSET hPollSet, u * @returns IPRT status code. * @retval VINF_TRY_AGAIN if there is still data left in the buffer. * + * @param hPollSet The polling set. * @param pStdInBuf The standard input buffer. * @param hStdInW The standard input pipe. * @param pfClose Pointer to a flag whether the pipe needs to be closed afterwards. */ -static int VBoxServiceControlExecProcWriteStdIn(PVBOXSERVICECTRLEXECPIPEBUF pStdInBuf, RTPIPE hStdInW, +static int VBoxServiceControlExecProcWriteStdIn(RTPOLLSET hPollSet, PVBOXSERVICECTRLEXECPIPEBUF pStdInBuf, RTPIPE hStdInW, size_t *pcbWritten, bool *pfClose) { + AssertPtrReturn(pStdInBuf, VERR_INVALID_PARAMETER); AssertPtrReturn(pcbWritten, VERR_INVALID_PARAMETER); AssertPtrReturn(pfClose, VERR_INVALID_PARAMETER); - int rc = RTCritSectEnter(&pStdInBuf->CritSect); - if (RT_SUCCESS(rc)) - { - size_t cbToWrite = pStdInBuf->cbSize - pStdInBuf->cbOffset; - cbToWrite = RT_MIN(cbToWrite, _1M); - *pfClose = false; - if (cbToWrite && pStdInBuf->fAlive) - { - rc = RTPipeWrite(hStdInW, &pStdInBuf->pbData[pStdInBuf->cbOffset], cbToWrite, pcbWritten); - if (RT_SUCCESS(rc)) - { - pStdInBuf->fNeedNotification = true; - if (rc == VINF_TRY_AGAIN) - { - //if (pStdInBuf->fNeedNotification) - } - else - { - pStdInBuf->cbOffset += *pcbWritten; - } + size_t cbLeft; + int rc = VBoxServicePipeBufWriteToPipe(pStdInBuf, hStdInW, pcbWritten, &cbLeft); - /* Did somebody tell us that we should come to an end, - * e.g. no more data coming in? */ - if (pStdInBuf->fPendingClose) - { - /* When we wrote out all data in the buffer we - * can finally shutdown. */ - if (pStdInBuf->cbSize == pStdInBuf->cbOffset) - { - *pfClose = true; - } - else if (pStdInBuf->fNeedNotification) - { - /* Still data to push out - so we need another - * poll round! Write something into the notification pipe. */ - size_t cbWrittenIgnore; - int rc2 = RTPipeWrite(pStdInBuf->hNotificationPipeW, "i", 1, &cbWrittenIgnore); + /* If we have written all data which is in the buffer set the close flag. */ + *pfClose = (cbLeft == 0) && VBoxServicePipeBufIsClosing(pStdInBuf); - /* Disable notification until it is set again on successful write. */ - pStdInBuf->fNeedNotification = !RT_SUCCESS(rc2); - } - } - } - else - { - *pcbWritten = 0; - pStdInBuf->fAlive = pStdInBuf->fAlive; - } -#ifdef DEBUG - VBoxServiceVerbose(1, "ControlExec: Written StdIn: cbOffset=%u, pcbWritten=%u, rc=%Rrc, cbAlloc=%u, cbSize=%u\n", - pStdInBuf->cbOffset, *pcbWritten, rc, - pStdInBuf->cbAllocated, pStdInBuf->cbSize); -#endif - } - else - { - *pcbWritten = 0; - pStdInBuf->fNeedNotification = pStdInBuf->fAlive; - //rc = VERR_BAD_PIPE; - } - int rc2 = RTCritSectLeave(&pStdInBuf->CritSect); - if (RT_SUCCESS(rc)) - rc = rc2; + if ( !*pcbWritten + && VBoxServicePipeBufIsEnabled(pStdInBuf)) + { + /* + * Nothing else left to write now? Remove the writable event from the poll set + * to not trigger too high CPU loads. + */ + int rc2 = RTPollSetRemove(hPollSet, VBOXSERVICECTRLPIPEID_STDIN_WRITABLE); + AssertRC(rc2); } + + VBoxServiceVerbose(3, "VBoxServiceControlExecProcWriteStdIn: Written=%u, Left=%u, rc=%Rrc\n", + *pcbWritten, cbLeft, rc); return rc; } @@ -186,8 +154,11 @@ static int VBoxServiceControlExecProcHandleStdInWritableEvent(RTPOLLSET hPollSe if (!(fPollEvt & RTPOLL_EVT_ERROR)) { bool fClose; - rc = VBoxServiceControlExecProcWriteStdIn(pStdInBuf, *phStdInW, pcbWritten, &fClose); - if (rc == VINF_TRY_AGAIN) + rc = VBoxServiceControlExecProcWriteStdIn(hPollSet, + pStdInBuf, *phStdInW, + pcbWritten, &fClose); + if ( rc == VINF_TRY_AGAIN + || rc == VERR_MORE_DATA) rc = VINF_SUCCESS; if (RT_FAILURE(rc)) { @@ -219,25 +190,6 @@ static int VBoxServiceControlExecProcHandleStdInWritableEvent(RTPOLLSET hPollSe /** - * Handle a transport event or successful pfnPollIn() call. - * - * @returns IPRT status code from client send. - * @retval VINF_EOF indicates ABORT command. - * - * @param hPollSet The polling set. - * @param fPollEvt The event mask returned by RTPollNoResume. - * @param idPollHnd The handle ID. - * @param hStdInW The standard input pipe. - * @param pStdInBuf The standard input buffer. - */ -static int VBoxServiceControlExecProcHandleTransportEvent(RTPOLLSET hPollSet, uint32_t fPollEvt, uint32_t idPollHnd, - PRTPIPE phStdInW, PVBOXSERVICECTRLEXECPIPEBUF pStdInBuf) -{ - return 0; //RTPollSetAddPipe(hPollSet, *phStdInW, RTPOLL_EVT_WRITE, 4 /*TXSEXECHNDID_STDIN_WRITABLE*/); -} - - -/** * Handle pending output data or error on standard out, standard error or the * test pipe. * @@ -268,32 +220,16 @@ static int VBoxServiceControlExecProcHandleOutputEvent(RTPOLLSET hPollSet, uint3 int rc2 = RTPipeRead(*phPipeR, abBuf, sizeof(abBuf), &cbRead); if (RT_SUCCESS(rc2) && cbRead) { -#if 0 - /* Only used for "real-time" stdout/stderr data; gets sent immediately (later)! */ - rc = VbglR3GuestCtrlExecSendOut(pThread->uClientID, pThread->uContextID, - pData->uPID, uHandleId, 0 /* u32Flags */, - abBuf, cbRead); - if (RT_FAILURE(rc)) + uint32_t cbWritten; + rc = VBoxServicePipeBufWriteToBuf(pStdOutBuf, abBuf, + cbRead, false /* Pending close */, &cbWritten); + if (RT_SUCCESS(rc)) { - VBoxServiceError("ControlExec: Error while sending real-time output data, rc=%Rrc, cbRead=%u, CID=%u, PID=%u\n", - rc, cbRead, pThread->uClientID, pData->uPID); + Assert(cbRead == cbWritten); + /* Make sure we go another poll round in case there was too much data + for the buffer to hold. */ + fPollEvt &= RTPOLL_EVT_ERROR; } - else - { -#endif - uint32_t cbWritten; - rc = VBoxServiceControlExecWritePipeBuffer(pStdOutBuf, abBuf, - cbRead, false /* Pending close */, &cbWritten); - if (RT_SUCCESS(rc)) - { - Assert(cbRead == cbWritten); - /* Make sure we go another poll round in case there was too much data - for the buffer to hold. */ - fPollEvt &= RTPOLL_EVT_ERROR; - } -#if 0 - } -#endif } else if (RT_FAILURE(rc2)) { @@ -317,17 +253,43 @@ static int VBoxServiceControlExecProcHandleOutputEvent(RTPOLLSET hPollSet, uint3 } +int VBoxServiceControlExecProcHandleStdInputNotify(RTPOLLSET hPollSet, + PRTPIPE phNotificationPipeR, PRTPIPE phInputPipeW) +{ +#ifdef DEBUG + VBoxServiceVerbose(4, "ControlExec: HandleStdInputNotify\n"); +#endif + /* Drain the notification pipe. */ + uint8_t abBuf[8]; + size_t cbIgnore; + int rc = RTPipeRead(*phNotificationPipeR, abBuf, sizeof(abBuf), &cbIgnore); + if (RT_SUCCESS(rc)) + { + /* + * When the writable handle previously was removed from the poll set we need to add + * it here again so that writable events from the started procecss get handled correctly. + */ + RTHANDLE hWritableIgnored; + rc = RTPollSetQueryHandle(hPollSet, VBOXSERVICECTRLPIPEID_STDIN_WRITABLE, &hWritableIgnored); + if (rc == VERR_POLL_HANDLE_ID_NOT_FOUND) + rc = RTPollSetAddPipe(hPollSet, *phInputPipeW, RTPOLL_EVT_WRITE, VBOXSERVICECTRLPIPEID_STDIN_WRITABLE); + } + return rc; +} + + /** - * TODO + * Execution loop which runs in a dedicated per-started-process thread and + * handles all pipe input/output and signalling stuff. * * @return IPRT status code. - * @param pThread - * @param hProcess - * @param cMillies - * @param hPollSet - * @param hStdInW - * @param hStdOutR - * @param hStdErrR + * @param pThread The process' thread handle. + * @param hProcess The actual process handle. + * @param cMsTimeout Time limit (in ms) of the process' life time. + * @param hPollSet The poll set to use. + * @param hStdInW Handle to the process' stdin write end. + * @param hStdOutR Handle to the process' stdout read end. + * @param hStdErrR Handle to the process' stderr read end. */ static int VBoxServiceControlExecProcLoop(PVBOXSERVICECTRLTHREAD pThread, RTPROCESS hProcess, RTMSINTERVAL cMsTimeout, RTPOLLSET hPollSet, @@ -386,9 +348,7 @@ static int VBoxServiceControlExecProcLoop(PVBOXSERVICECTRLTHREAD pThread, if (RT_SUCCESS(rc2)) { -#ifdef DEBUG VBoxServiceVerbose(4, "ControlExec: RTPollNoResume idPollHnd=%u\n", idPollHnd); -#endif switch (idPollHnd) { case VBOXSERVICECTRLPIPEID_STDIN_ERROR: @@ -396,13 +356,10 @@ static int VBoxServiceControlExecProcLoop(PVBOXSERVICECTRLTHREAD pThread, break; case VBOXSERVICECTRLPIPEID_STDIN_INPUT_NOTIFY: - { - /* Drain the notification pipe. */ - uint8_t abBuf[8]; - size_t cbIgnore; - RTPipeRead(pData->stdIn.hNotificationPipeR, abBuf, sizeof(abBuf), &cbIgnore); - } - /* Fall through. */ + rc = VBoxServiceControlExecProcHandleStdInputNotify(hPollSet, + &pData->stdIn.hNotificationPipeR, &pData->pipeStdInW); + AssertRC(rc); + /* Fall through. */ case VBOXSERVICECTRLPIPEID_STDIN_WRITABLE: { size_t cbWritten; @@ -544,10 +501,14 @@ static int VBoxServiceControlExecProcLoop(PVBOXSERVICECTRLTHREAD pThread, */ if (RT_SUCCESS(rc)) { + VBoxServicePipeBufSetStatus(&pData->stdIn, false /* Disabled */); + VBoxServicePipeBufSetStatus(&pData->stdOut, false /* Disabled */); + VBoxServicePipeBufSetStatus(&pData->stdErr, false /* Disabled */); + /* Since the process is not alive anymore, destroy its local * stdin pipe buffer - it's not used anymore and can eat up quite * a bit of memory. */ - VBoxServiceControlExecDeletePipeBuffer(&pData->stdIn); + VBoxServicePipeBufDestroy(&pData->stdIn); uint32_t uStatus = PROC_STS_UNDEFINED; uint32_t uFlags = 0; @@ -578,21 +539,24 @@ static int VBoxServiceControlExecProcLoop(PVBOXSERVICECTRLTHREAD pThread, } else if (ProcessStatus.enmReason == RTPROCEXITREASON_NORMAL) { - VBoxServiceVerbose(3, "ControlExec: Process ended with RTPROCEXITREASON_NORMAL\n"); + VBoxServiceVerbose(3, "ControlExec: Process ended with RTPROCEXITREASON_NORMAL (%u)\n", + ProcessStatus.iStatus); uStatus = PROC_STS_TEN; uFlags = ProcessStatus.iStatus; } else if (ProcessStatus.enmReason == RTPROCEXITREASON_SIGNAL) { - VBoxServiceVerbose(3, "ControlExec: Process ended with RTPROCEXITREASON_SIGNAL\n"); + VBoxServiceVerbose(3, "ControlExec: Process ended with RTPROCEXITREASON_SIGNAL (%u)\n", + ProcessStatus.iStatus); uStatus = PROC_STS_TES; uFlags = ProcessStatus.iStatus; } else if (ProcessStatus.enmReason == RTPROCEXITREASON_ABEND) { - VBoxServiceVerbose(3, "ControlExec: Process ended with RTPROCEXITREASON_ABEND\n"); + VBoxServiceVerbose(3, "ControlExec: Process ended with RTPROCEXITREASON_ABEND (%u)\n", + ProcessStatus.iStatus); uStatus = PROC_STS_TEA; uFlags = ProcessStatus.iStatus; @@ -608,6 +572,26 @@ static int VBoxServiceControlExecProcLoop(PVBOXSERVICECTRLTHREAD pThread, pData->uPID, uStatus, uFlags, NULL /* pvData */, 0 /* cbData */); VBoxServiceVerbose(3, "ControlExec: Process loop ended with rc=%Rrc\n", rc); + + /* + * Dump stdout for debugging purposes. + * Only do that on *very* high verbosity (5+). + */ + if (g_cVerbosity >= 5) + { + uint8_t szBuf[_64K]; + uint32_t cbOffset = 0; + uint32_t cbRead, cbLeft; + while (RT_SUCCESS( VBoxServicePipeBufPeek(&pData->stdOut, szBuf, sizeof(szBuf), + cbOffset, &cbRead, &cbLeft)) + && cbRead) + { + VBoxServiceVerbose(5, "[%u]: %s\n", pData->uPID, szBuf); + cbOffset += cbRead; + if (!cbLeft) + break; + } + } } else VBoxServiceError("ControlExec: Process loop failed with rc=%Rrc\n", rc); @@ -630,9 +614,9 @@ static int VBoxServiceControlExecProcLoop(PVBOXSERVICECTRLTHREAD pThread, */ static int VBoxServiceControlExecSetupPipe(int fd, PRTHANDLE ph, PRTHANDLE *pph, PRTPIPE phPipe) { - AssertPtr(ph); - AssertPtr(pph); - AssertPtr(phPipe); + AssertPtrReturn(ph, VERR_INVALID_PARAMETER); + AssertPtrReturn(pph, VERR_INVALID_PARAMETER); + AssertPtrReturn(phPipe, VERR_INVALID_PARAMETER); ph->enmType = RTHANDLETYPE_PIPE; ph->u.hPipe = NIL_RTPIPE; @@ -666,368 +650,15 @@ static int VBoxServiceControlExecSetupPipe(int fd, PRTHANDLE ph, PRTHANDLE *pph, /** - * Initializes a pipe buffer. - * - * @returns IPRT status code. - * @param pBuf The pipe buffer to initialize. - * @param fNeedNotificationPipe Whether the buffer needs a notification - * pipe or not. - */ -static int VBoxServiceControlExecInitPipeBuffer(PVBOXSERVICECTRLEXECPIPEBUF pBuf, bool fNeedNotificationPipe) -{ - AssertPtr(pBuf); - - /** @todo Add allocation size as function parameter! */ - pBuf->pbData = (uint8_t *)RTMemAlloc(_64K); /* Start with a 64k buffer. */ - AssertReturn(pBuf->pbData, VERR_NO_MEMORY); - pBuf->cbAllocated = _64K; - pBuf->cbSize = 0; - pBuf->cbOffset = 0; - pBuf->fAlive = true; - pBuf->fPendingClose = false; - pBuf->fNeedNotification = fNeedNotificationPipe; - pBuf->hNotificationPipeW = NIL_RTPIPE; - pBuf->hNotificationPipeR = NIL_RTPIPE; - - int rc = RTCritSectInit(&pBuf->CritSect); - if (RT_SUCCESS(rc) && fNeedNotificationPipe) - { - rc = RTPipeCreate(&pBuf->hNotificationPipeR, &pBuf->hNotificationPipeW, 0); - if (RT_FAILURE(rc)) - RTCritSectDelete(&pBuf->CritSect); - } - return rc; -} - - -/** - * Deletes a pipe buffer. - * - * @param pBuf The pipe buffer. - */ -void VBoxServiceControlExecDeletePipeBuffer(PVBOXSERVICECTRLEXECPIPEBUF pBuf) -{ - AssertPtr(pBuf); - if (pBuf->pbData) - { - RTMemFree(pBuf->pbData); - pBuf->pbData = NULL; - pBuf->cbAllocated = 0; - pBuf->cbSize = 0; - pBuf->cbOffset = 0; - pBuf->fAlive = false; - } - - RTPipeClose(pBuf->hNotificationPipeR); - pBuf->hNotificationPipeR = NIL_RTPIPE; - RTPipeClose(pBuf->hNotificationPipeW); - pBuf->hNotificationPipeW = NIL_RTPIPE; - RTCritSectDelete(&pBuf->CritSect); -} - - -/** - * TODO - * - * @return IPRT status code. - * @param pBuf - * @param pbBuffer - * @param cbBuffer - * @param pcbToRead - */ -int VBoxServiceControlExecReadPipeBufferContent(PVBOXSERVICECTRLEXECPIPEBUF pBuf, - uint8_t *pbBuffer, uint32_t cbBuffer, uint32_t *pcbToRead) -{ - AssertPtr(pBuf); - AssertPtr(pcbToRead); - - int rc = RTCritSectEnter(&pBuf->CritSect); - if (RT_SUCCESS(rc)) - { - Assert(pBuf->cbSize >= pBuf->cbOffset); - if (*pcbToRead > pBuf->cbSize - pBuf->cbOffset) - *pcbToRead = pBuf->cbSize - pBuf->cbOffset; - - if (*pcbToRead > cbBuffer) - *pcbToRead = cbBuffer; - - if (*pcbToRead > 0) - { - memcpy(pbBuffer, pBuf->pbData + pBuf->cbOffset, *pcbToRead); - pBuf->cbOffset += *pcbToRead; - } - else - { - pbBuffer = NULL; - *pcbToRead = 0; - } - rc = RTCritSectLeave(&pBuf->CritSect); - } - return rc; -} - - -/** - * TODO - * - * @return IPRT status code. - * @param pBuf - * @param pbData - * @param cbData - * @param fPendingClose - * @param pcbWritten - */ -int VBoxServiceControlExecWritePipeBuffer(PVBOXSERVICECTRLEXECPIPEBUF pBuf, - uint8_t *pbData, uint32_t cbData, bool fPendingClose, - uint32_t *pcbWritten) -{ - AssertPtrReturn(pBuf, VERR_INVALID_PARAMETER); - AssertPtrReturn(pcbWritten, VERR_INVALID_PARAMETER); - - int rc; - if (pBuf->fAlive) - { - rc = RTCritSectEnter(&pBuf->CritSect); - if (RT_SUCCESS(rc)) - { - /* Rewind the buffer if it's empty. */ - size_t cbInBuf = pBuf->cbSize - pBuf->cbOffset; - bool const fAddToSet = cbInBuf == 0; - if (fAddToSet) - pBuf->cbSize = pBuf->cbOffset = 0; - - /* Try and see if we can simply append the data. */ - if (cbData + pBuf->cbSize <= pBuf->cbAllocated) - { - memcpy(&pBuf->pbData[pBuf->cbSize], pbData, cbData); - pBuf->cbSize += cbData; - } - else - { - /* Move any buffered data to the front. */ - cbInBuf = pBuf->cbSize - pBuf->cbOffset; - if (cbInBuf == 0) - pBuf->cbSize = pBuf->cbOffset = 0; - else if (pBuf->cbOffset) /* Do we have something to move? */ - { - memmove(pBuf->pbData, &pBuf->pbData[pBuf->cbOffset], cbInBuf); - pBuf->cbSize = cbInBuf; - pBuf->cbOffset = 0; - } - - /* Do we need to grow the buffer? */ - if (cbData + pBuf->cbSize > pBuf->cbAllocated) - { - size_t cbAlloc = pBuf->cbSize + cbData; - cbAlloc = RT_ALIGN_Z(cbAlloc, _64K); - void *pvNew = RTMemRealloc(pBuf->pbData, cbAlloc); - if (pvNew) - { - pBuf->pbData = (uint8_t *)pvNew; - pBuf->cbAllocated = cbAlloc; - } - else - rc = VERR_NO_MEMORY; - } - - /* Finally, copy the data. */ - if (RT_SUCCESS(rc)) - { - if (cbData + pBuf->cbSize <= pBuf->cbAllocated) - { - memcpy(&pBuf->pbData[pBuf->cbSize], pbData, cbData); - pBuf->cbSize += cbData; - } - else - rc = VERR_BUFFER_OVERFLOW; - } - } - - if (RT_SUCCESS(rc)) - { - /* Report back written bytes. */ - *pcbWritten = cbData; - - /* - * Was this the final read/write to do on this buffer? The close it - * next time we have the chance to. - */ - if (fPendingClose) - pBuf->fPendingClose = fPendingClose; - - /* - * Wake up the thread servicing the process so it can feed it - * (if we have a notification helper pipe). - */ - if (pBuf->fNeedNotification) - { - size_t cbWritten; - int rc2 = RTPipeWrite(pBuf->hNotificationPipeW, "i", 1, &cbWritten); - - /* Disable notification until it is set again on successful write. */ - pBuf->fNeedNotification = !RT_SUCCESS(rc2); - } - } - int rc2 = RTCritSectLeave(&pBuf->CritSect); - if (RT_SUCCESS(rc)) - rc = rc2; - } - } - else - rc = VERR_BAD_PIPE; - return rc; -} - - -/** - * Allocates and gives back a thread data struct which then can be used by the worker thread. - * Needs to be freed with VBoxServiceControlExecDestroyThreadData(). + * Expands a file name / path to its real content. This only works on Windows + * for now (e.g. translating "%TEMP%\foo.exe" to "C:\Windows\Temp" when starting + * with system / administrative rights). * * @return IPRT status code. - * @param pThread - * @param u32ContextID - * @param pszCmd - * @param uFlags - * @param pszArgs - * @param uNumArgs - * @param pszEnv - * @param cbEnv - * @param uNumEnvVars - * @param pszUser - * @param pszPassword - * @param uTimeLimitMS + * @param pszPath Path to resolve. + * @param pszExpanded Pointer to string to store the resolved path in. + * @param cbExpanded Size (in bytes) of string to store the resolved path. */ -static int VBoxServiceControlExecAllocateThreadData(PVBOXSERVICECTRLTHREAD pThread, - uint32_t u32ContextID, - const char *pszCmd, uint32_t uFlags, - const char *pszArgs, uint32_t uNumArgs, - const char *pszEnv, uint32_t cbEnv, uint32_t uNumEnvVars, - const char *pszUser, const char *pszPassword, uint32_t uTimeLimitMS) -{ - AssertPtr(pThread); - - /* General stuff. */ - pThread->Node.pPrev = NULL; - pThread->Node.pNext = NULL; - - pThread->fShutdown = false; - pThread->fStarted = false; - pThread->fStopped = false; - - pThread->uContextID = u32ContextID; - /* ClientID will be assigned when thread is started! */ - - /* Specific stuff. */ - PVBOXSERVICECTRLTHREADDATAEXEC pData = (PVBOXSERVICECTRLTHREADDATAEXEC)RTMemAlloc(sizeof(VBOXSERVICECTRLTHREADDATAEXEC)); - if (pData == NULL) - return VERR_NO_MEMORY; - - pData->uPID = 0; /* Don't have a PID yet. */ - pData->pszCmd = RTStrDup(pszCmd); - pData->uFlags = uFlags; - pData->uNumEnvVars = 0; - pData->uNumArgs = 0; /* Initialize in case of RTGetOptArgvFromString() is failing ... */ - - /* Prepare argument list. */ - int rc = RTGetOptArgvFromString(&pData->papszArgs, (int*)&pData->uNumArgs, - (uNumArgs > 0) ? pszArgs : "", NULL); - /* Did we get the same result? */ - Assert(uNumArgs == pData->uNumArgs); - - if (RT_SUCCESS(rc)) - { - /* Prepare environment list. */ - if (uNumEnvVars) - { - pData->papszEnv = (char **)RTMemAlloc(uNumEnvVars * sizeof(char*)); - AssertPtr(pData->papszEnv); - pData->uNumEnvVars = uNumEnvVars; - - const char *pszCur = pszEnv; - uint32_t i = 0; - uint32_t cbLen = 0; - while (cbLen < cbEnv) - { - /* sanity check */ - if (i >= uNumEnvVars) - { - rc = VERR_INVALID_PARAMETER; - break; - } - int cbStr = RTStrAPrintf(&pData->papszEnv[i++], "%s", pszCur); - if (cbStr < 0) - { - rc = VERR_NO_STR_MEMORY; - break; - } - pszCur += cbStr + 1; /* Skip terminating '\0' */ - cbLen += cbStr + 1; /* Skip terminating '\0' */ - } - } - - pData->pszUser = RTStrDup(pszUser); - pData->pszPassword = RTStrDup(pszPassword); - pData->uTimeLimitMS = uTimeLimitMS; - - /* Adjust time limit value. */ - pData->uTimeLimitMS = ( uTimeLimitMS == UINT32_MAX - || uTimeLimitMS == 0) - ? RT_INDEFINITE_WAIT : uTimeLimitMS; - - /* Init buffers. */ - rc = VBoxServiceControlExecInitPipeBuffer(&pData->stdOut, false /*fNeedNotificationPipe*/); - if (RT_SUCCESS(rc)) - { - rc = VBoxServiceControlExecInitPipeBuffer(&pData->stdErr, false /*fNeedNotificationPipe*/); - if (RT_SUCCESS(rc)) - rc = VBoxServiceControlExecInitPipeBuffer(&pData->stdIn, true /*fNeedNotificationPipe*/); - } - } - - if (RT_FAILURE(rc)) - { - VBoxServiceControlExecDestroyThreadData(pData); - } - else - { - pThread->enmType = kVBoxServiceCtrlThreadDataExec; - pThread->pvData = pData; - } - return rc; -} - - -/** - * Frees an allocated thread data structure along with all its allocated parameters. - * - * @param pData Pointer to thread data to free. - */ -void VBoxServiceControlExecDestroyThreadData(PVBOXSERVICECTRLTHREADDATAEXEC pData) -{ - if (pData) - { - RTStrFree(pData->pszCmd); - if (pData->uNumEnvVars) - { - for (uint32_t i = 0; i < pData->uNumEnvVars; i++) - RTStrFree(pData->papszEnv[i]); - RTMemFree(pData->papszEnv); - } - RTGetOptArgvFree(pData->papszArgs); - RTStrFree(pData->pszUser); - RTStrFree(pData->pszPassword); - - VBoxServiceControlExecDeletePipeBuffer(&pData->stdOut); - VBoxServiceControlExecDeletePipeBuffer(&pData->stdErr); - VBoxServiceControlExecDeletePipeBuffer(&pData->stdIn); - - RTMemFree(pData); - pData = NULL; - } -} - - -/** @todo Maybe we want to have an own IPRT function for that! */ static int VBoxServiceControlExecMakeFullPath(const char *pszPath, char *pszExpanded, size_t cbExpanded) { int rc = VINF_SUCCESS; @@ -1039,13 +670,22 @@ static int VBoxServiceControlExecMakeFullPath(const char *pszPath, char *pszExpa rc = RTStrCopy(pszExpanded, cbExpanded, pszPath); #endif #ifdef DEBUG - VBoxServiceVerbose(3, "ControlExec: VBoxServiceControlExecMakeFullPath: %s -> %s\n", - pszPath, pszExpanded); + VBoxServiceVerbose(3, "ControlExec: VBoxServiceControlExecMakeFullPath: %s -> %s\n", + pszPath, pszExpanded); #endif return rc; } +/** + * Resolves the full path of a specified executable name. This function also + * resolves internal VBoxService tools to its appropriate executable path + name. + * + * @return IPRT status code. + * @param pszFileName File name to resovle. + * @param pszResolved Pointer to a string where the resolved file name will be stored. + * @param cbResolved Size (in bytes) of resolved file name string. + */ static int VBoxServiceControlExecResolveExecutable(const char *pszFileName, char *pszResolved, size_t cbResolved) { int rc = VINF_SUCCESS; @@ -1061,14 +701,6 @@ static int VBoxServiceControlExecResolveExecutable(const char *pszFileName, char /* We just want to execute VBoxService (no toolbox). */ pszExecResolved = RTStrDup(szVBoxService); } -#ifdef VBOXSERVICE_TOOLBOX - else if (RTStrStr(pszFileName, "vbox_") == pszFileName) - { - /* We want to use the internal toolbox (all internal - * tools are starting with "vbox_" (e.g. "vbox_cat"). */ - pszExecResolved = RTStrDup(szVBoxService); - } -#endif else /* Nothing to resolve, copy original. */ pszExecResolved = RTStrDup(pszFileName); AssertPtr(pszExecResolved); @@ -1084,85 +716,81 @@ static int VBoxServiceControlExecResolveExecutable(const char *pszFileName, char } -#ifdef VBOXSERVICE_TOOLBOX /** - * Constructs the argv command line of a VBoxService program - * by first appending the full path of VBoxService along with the given - * tool name (e.g. "vbox_cat") + the tool's actual command line parameters. + * Constructs the argv command line by resolving environment variables + * and relative paths. * * @return IPRT status code. - * @param pszFileName File name (full path) of this process. - * @param papszArgs Original argv command line from the host. + * @param pszArgv0 First argument (argv0), either original or modified version. + * @param papszArgs Original argv command line from the host, starting at argv[1]. * @param ppapszArgv Pointer to a pointer with the new argv command line. * Needs to be freed with RTGetOptArgvFree. */ -static int VBoxServiceControlExecPrepareArgv(const char *pszFileName, +static int VBoxServiceControlExecPrepareArgv(const char *pszArgv0, const char * const *papszArgs, char ***ppapszArgv) { - AssertPtrReturn(pszFileName, VERR_INVALID_PARAMETER); - AssertPtrReturn(papszArgs, VERR_INVALID_PARAMETER); - AssertPtrReturn(ppapszArgv, VERR_INVALID_PARAMETER); - - char *pszArgs; - int rc = RTGetOptArgvToString(&pszArgs, papszArgs, - RTGETOPTARGV_CNV_QUOTE_MS_CRT); /* RTGETOPTARGV_CNV_QUOTE_BOURNE_SH */ +/** @todo RTGetOptArgvToString converts to MSC quoted string, while + * RTGetOptArgvFromString takes bourne shell according to the docs... + * Actually, converting to and from here is a very roundabout way of prepending + * an entry (pszFilename) to an array (*ppapszArgv). */ + int rc = VINF_SUCCESS; + char *pszNewArgs = NULL; + if (pszArgv0) + rc = RTStrAAppend(&pszNewArgs, pszArgv0); if ( RT_SUCCESS(rc) - && pszArgs) + && papszArgs) + { - /* - * Construct the new command line by appending the actual - * tool name to new process' command line. - */ - char szArgsExp[RTPATH_MAX]; - rc = VBoxServiceControlExecMakeFullPath(pszArgs, szArgsExp, sizeof(szArgsExp)); + char *pszArgs; + rc = RTGetOptArgvToString(&pszArgs, papszArgs, + RTGETOPTARGV_CNV_QUOTE_MS_CRT); /* RTGETOPTARGV_CNV_QUOTE_BOURNE_SH */ if (RT_SUCCESS(rc)) { - char *pszNewArgs; - if (RTStrAPrintf(&pszNewArgs, "%s %s", pszFileName, szArgsExp)) - { -#ifdef DEBUG - VBoxServiceVerbose(3, "ControlExec: VBoxServiceControlExecPrepareArgv: %s\n", - pszNewArgs); -#endif - int iNumArgsIgnored; - rc = RTGetOptArgvFromString(ppapszArgv, &iNumArgsIgnored, - pszNewArgs, NULL /* Use standard separators. */); - RTStrFree(pszNewArgs); - } + rc = RTStrAAppend(&pszNewArgs, " "); + if (RT_SUCCESS(rc)) + rc = RTStrAAppend(&pszNewArgs, pszArgs); } - RTStrFree(pszArgs); } - else /* No arguments given, just use the resolved file name as argv[0]. */ + + if (RT_SUCCESS(rc)) { int iNumArgsIgnored; rc = RTGetOptArgvFromString(ppapszArgv, &iNumArgsIgnored, - pszFileName, NULL /* Use standard separators. */); + pszNewArgs ? pszNewArgs : "", NULL /* Use standard separators. */); } + + if (pszNewArgs) + RTStrFree(pszNewArgs); return rc; } -#endif /** - * TODO + * Helper function to create/start a process on the guest. * * @return IPRT status code. - * @param pszExec - * @param papszArgs - * @param hEnv - * @param fFlags - * @param phStdIn - * @param phStdOut - * @param phStdErr - * @param pszAsUser - * @param pszPassword - * @param phProcess + * @param pszExec Full qualified path of process to start (without arguments). + * @param papszArgs Pointer to array of command line arguments. + * @param hEnv Handle to environment block to use. + * @param fFlags Process execution flags. + * @param phStdIn Handle for the process' stdin pipe. + * @param phStdOut Handle for the process' stdout pipe. + * @param phStdErr Handle for the process' stderr pipe. + * @param pszAsUser User name (account) to start the process under. + * @param pszPassword Password of the specified user. + * @param phProcess Pointer which will receive the process handle after + * successful process start. */ static int VBoxServiceControlExecCreateProcess(const char *pszExec, const char * const *papszArgs, RTENV hEnv, uint32_t fFlags, PCRTHANDLE phStdIn, PCRTHANDLE phStdOut, PCRTHANDLE phStdErr, const char *pszAsUser, const char *pszPassword, PRTPROCESS phProcess) { + AssertPtrReturn(pszExec, VERR_INVALID_PARAMETER); + AssertPtrReturn(papszArgs, VERR_INVALID_PARAMETER); + AssertPtrReturn(phProcess, VERR_INVALID_PARAMETER); + int rc = VINF_SUCCESS; + char szExecExp[RTPATH_MAX]; #ifdef RT_OS_WINDOWS /* * If sysprep should be executed do this in the context of VBoxService, which @@ -1171,8 +799,13 @@ static int VBoxServiceControlExecCreateProcess(const char *pszExec, const char * */ if (RTStrICmp(pszExec, "sysprep") == 0) { - /* Get the predefined path of sysprep.exe (depending on Windows OS). */ + /* Use a predefined sysprep path as default. */ char szSysprepCmd[RTPATH_MAX] = "C:\\sysprep\\sysprep.exe"; + + /* + * On Windows Vista (and up) sysprep is located in "system32\\sysprep\\sysprep.exe", + * so detect the OS and use a different path. + */ OSVERSIONINFOEX OSInfoEx; RT_ZERO(OSInfoEx); OSInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); @@ -1184,22 +817,45 @@ static int VBoxServiceControlExecCreateProcess(const char *pszExec, const char * if (RT_SUCCESS(rc)) rc = RTPathAppend(szSysprepCmd, sizeof(szSysprepCmd), "system32\\sysprep\\sysprep.exe"); } - rc = RTProcCreateEx(szSysprepCmd, papszArgs, hEnv, 0 /* fFlags */, - phStdIn, phStdOut, phStdErr, NULL /* pszAsUser */, - NULL /* pszPassword */, phProcess); + + if (RT_SUCCESS(rc)) + { + char **papszArgsExp; + rc = VBoxServiceControlExecPrepareArgv(szSysprepCmd /* argv0 */, papszArgs, &papszArgsExp); + if (RT_SUCCESS(rc)) + { + rc = RTProcCreateEx(szSysprepCmd, papszArgsExp, hEnv, 0 /* fFlags */, + phStdIn, phStdOut, phStdErr, NULL /* pszAsUser */, + NULL /* pszPassword */, phProcess); + } + RTGetOptArgvFree(papszArgsExp); + } return rc; } #endif /* RT_OS_WINDOWS */ - /* - * Do the environment variables expansion on executable and arguments. - */ - char szExecExp[RTPATH_MAX]; - rc = VBoxServiceControlExecResolveExecutable(pszExec, szExecExp, sizeof(szExecExp)); +#ifdef VBOXSERVICE_TOOLBOX + if (RTStrStr(pszExec, "vbox_") == pszExec) + { + /* We want to use the internal toolbox (all internal + * tools are starting with "vbox_" (e.g. "vbox_cat"). */ + rc = VBoxServiceControlExecResolveExecutable(VBOXSERVICE_NAME, szExecExp, sizeof(szExecExp)); + } + else + { +#endif + /* + * Do the environment variables expansion on executable and arguments. + */ + rc = VBoxServiceControlExecResolveExecutable(pszExec, szExecExp, sizeof(szExecExp)); +#ifdef VBOXSERVICE_TOOLBOX + } +#endif if (RT_SUCCESS(rc)) { char **papszArgsExp; - rc = VBoxServiceControlExecPrepareArgv(szExecExp, papszArgs, &papszArgsExp); + rc = VBoxServiceControlExecPrepareArgv(pszExec /* Always use the unmodified executable name as argv0. */, + papszArgs /* Append the rest of the argument vector (if any). */, &papszArgsExp); if (RT_SUCCESS(rc)) { uint32_t uProcFlags = 0; @@ -1216,17 +872,21 @@ static int VBoxServiceControlExecCreateProcess(const char *pszExec, const char * * Otherwise use the RTPROC_FLAGS_SERVICE to use some special authentication * code (at least on Windows) for running processes as different users * started from our system service. */ - if (strlen(pszAsUser)) + if (*pszAsUser) uProcFlags |= RTPROC_FLAGS_SERVICE; - +#ifdef DEBUG + VBoxServiceVerbose(3, "Command: %s\n", szExecExp); + for (size_t i = 0; papszArgsExp[i]; i++) + VBoxServiceVerbose(3, "\targv[%ld]: %s\n", i, papszArgsExp[i]); +#endif /* Do normal execution. */ rc = RTProcCreateEx(szExecExp, papszArgsExp, hEnv, uProcFlags, phStdIn, phStdOut, phStdErr, - strlen(pszAsUser) ? pszAsUser : NULL, - strlen(pszPassword) ? pszPassword : NULL, + *pszAsUser ? pszAsUser : NULL, + *pszPassword ? pszPassword : NULL, phProcess); + RTGetOptArgvFree(papszArgsExp); } - RTGetOptArgvFree(papszArgsExp); } return rc; } @@ -1316,7 +976,8 @@ static DECLCALLBACK(int) VBoxServiceControlExecProcessWorker(PVBOXSERVICECTRLTHR phStdIn, phStdOut, phStdErr, pData->pszUser, pData->pszPassword, &hProcess); - + if (RT_FAILURE(rc)) + VBoxServiceError("ControlExec: Error starting process, rc=%Rrc\n", rc); /* * Tell the control thread that it can continue * spawning services. This needs to be done after the new @@ -1401,32 +1062,6 @@ static DECLCALLBACK(int) VBoxServiceControlExecProcessWorker(PVBOXSERVICECTRLTHR /** - * Finds a (formerly) started process given by its PID. - * - * @return PVBOXSERVICECTRLTHREAD Process structure if found, otherwise NULL. - * @param uPID PID to search for. - */ -static PVBOXSERVICECTRLTHREAD VBoxServiceControlExecFindProcess(uint32_t uPID) -{ - PVBOXSERVICECTRLTHREAD pNode; - bool fFound = false; - RTListForEach(&g_GuestControlExecThreads, pNode, VBOXSERVICECTRLTHREAD, Node) - { - if ( pNode->fStarted - && pNode->enmType == kVBoxServiceCtrlThreadDataExec) - { - PVBOXSERVICECTRLTHREADDATAEXEC pData = (PVBOXSERVICECTRLTHREADDATAEXEC)pNode->pvData; - if (pData && pData->uPID == uPID) - { - return pNode; - } - } - } - return NULL; -} - - -/** * Thread main routine for a started process. * * @return IPRT status code. @@ -1443,38 +1078,40 @@ static DECLCALLBACK(int) VBoxServiceControlExecThread(RTTHREAD ThreadSelf, void /** - * TODO + * Executes (starts) a process on the guest. This causes a new thread to be created + * so that this function will not block the overall program execution. * - * @return int - * @param uContextID - * @param pszCmd - * @param uFlags - * @param pszArgs - * @param uNumArgs - * @param pszEnv - * @param cbEnv - * @param uNumEnvVars - * @param pszUser - * @param pszPassword - * @param uTimeLimitMS + * @return IPRT status code. + * @param uContextID Context ID to associate the process to start with. + * @param pszCmd Full qualified path of process to start (without arguments). + * @param uFlags Process execution flags. + * @param pszArgs String of arguments to pass to the process to start. + * @param uNumArgs Number of arguments specified in pszArgs. + * @param pszEnv String of environment variables ("FOO=BAR") to pass to the process + * to start. + * @param cbEnv Size (in bytes) of environment variables. + * @param uNumEnvVars Number of environment variables specified in pszEnv. + * @param pszUser User name (account) to start the process under. + * @param pszPassword Password of specified user name (account). + * @param uTimeLimitMS Time limit (in ms) of the process' life time. */ int VBoxServiceControlExecProcess(uint32_t uContextID, const char *pszCmd, uint32_t uFlags, const char *pszArgs, uint32_t uNumArgs, const char *pszEnv, uint32_t cbEnv, uint32_t uNumEnvVars, const char *pszUser, const char *pszPassword, uint32_t uTimeLimitMS) { - PVBOXSERVICECTRLTHREAD pThread = (PVBOXSERVICECTRLTHREAD)RTMemAlloc(sizeof(VBOXSERVICECTRLTHREAD)); - int rc; + + PVBOXSERVICECTRLTHREAD pThread = (PVBOXSERVICECTRLTHREAD)RTMemAlloc(sizeof(VBOXSERVICECTRLTHREAD)); if (pThread) { - rc = VBoxServiceControlExecAllocateThreadData(pThread, - uContextID, - pszCmd, uFlags, - pszArgs, uNumArgs, - pszEnv, cbEnv, uNumEnvVars, - pszUser, pszPassword, - uTimeLimitMS); + rc = VBoxServiceControlExecThreadAlloc(pThread, + uContextID, + pszCmd, uFlags, + pszArgs, uNumArgs, + pszEnv, cbEnv, uNumEnvVars, + pszUser, pszPassword, + uTimeLimitMS); if (RT_SUCCESS(rc)) { rc = RTThreadCreate(&pThread->Thread, VBoxServiceControlExecThread, @@ -1504,7 +1141,7 @@ int VBoxServiceControlExecProcess(uint32_t uContextID, const char *pszCmd, uint3 } if (RT_FAILURE(rc)) - VBoxServiceControlExecDestroyThreadData((PVBOXSERVICECTRLTHREADDATAEXEC)pThread->pvData); + VBoxServiceControlExecThreadDestroy((PVBOXSERVICECTRLTHREADDATAEXEC)pThread->pvData); } if (RT_FAILURE(rc)) RTMemFree(pThread); @@ -1516,11 +1153,11 @@ int VBoxServiceControlExecProcess(uint32_t uContextID, const char *pszCmd, uint3 /** - * TODO + * Handles starting processes on the guest. * - * @return IPRT status code. - * @param u32ClientId - * @param uNumParms + * @returns IPRT status code. + * @param u32ClientId The HGCM client session ID. + * @param uNumParms The number of parameters the host is offering. */ int VBoxServiceControlExecHandleCmdStartProcess(uint32_t u32ClientId, uint32_t uNumParms) { @@ -1581,13 +1218,13 @@ int VBoxServiceControlExecHandleCmdStartProcess(uint32_t u32ClientId, uint32_t u /** - * Handles input for the started process by copying the received data into its + * Handles input for a started process by copying the received data into its * stdin pipe. * * @returns IPRT status code. - * @param u32ClientId idClient The HGCM client session ID. - * @param uNumParms cParms The number of parameters the host is - * offering. + * @param u32ClientId The HGCM client session ID. + * @param uNumParms The number of parameters the host is offering. + * @param cMaxBufSize The maximum buffer size for retrieving the input data. */ int VBoxServiceControlExecHandleCmdSetInput(uint32_t u32ClientId, uint32_t uNumParms, size_t cbMaxBufSize) { @@ -1600,6 +1237,9 @@ int VBoxServiceControlExecHandleCmdSetInput(uint32_t u32ClientId, uint32_t uNumP uint8_t *pabBuffer = (uint8_t*)RTMemAlloc(cbMaxBufSize); AssertPtrReturn(pabBuffer, VERR_NO_MEMORY); + uint32_t uStatus = INPUT_STS_UNDEFINED; /* Status sent back to the host. */ + uint32_t cbWritten = 0; /* Number of bytes written to the guest. */ + /* * Ask the host for the input data. */ @@ -1612,89 +1252,77 @@ int VBoxServiceControlExecHandleCmdSetInput(uint32_t u32ClientId, uint32_t uNumP } else if (cbSize > cbMaxBufSize) { - VBoxServiceError("ControlExec: Input size is invalid! cbSize=%u\n", cbSize); + VBoxServiceError("ControlExec: Maximum input buffer size is too small! cbSize=%u, cbMaxBufSize=%u\n", + cbSize, cbMaxBufSize); rc = VERR_INVALID_PARAMETER; } else { /* - * Resolve the PID. + * Is this the last input block we need to deliver? Then let the pipe know ... */ -#ifdef DEBUG - VBoxServiceVerbose(4, "ControlExec: Input (PID %u) received: cbSize=%u\n", uPID, cbSize); -#endif - PVBOXSERVICECTRLTHREAD pNode = VBoxServiceControlExecFindProcess(uPID); - if (pNode) + bool fPendingClose = false; + if (uFlags & INPUT_FLAG_EOF) { - PVBOXSERVICECTRLTHREADDATAEXEC pData = (PVBOXSERVICECTRLTHREADDATAEXEC)pNode->pvData; - AssertPtr(pData); - - /* - * Is this the last input block we need to deliver? Then let the pipe know ... - */ - bool fPendingClose = false; - if (uFlags & INPUT_FLAG_EOF) - fPendingClose = true; -#ifdef DEBUG - if (fPendingClose) - VBoxServiceVerbose(4, "ControlExec: Got last input block ...\n"); -#endif - /* - * Feed the data to the pipe. - */ - uint32_t cbWritten; - rc = VBoxServiceControlExecWritePipeBuffer(&pData->stdIn, pabBuffer, cbSize, fPendingClose, &cbWritten); -#ifdef DEBUG - VBoxServiceVerbose(4, "ControlExec: Written to StdIn buffer (PID %u): rc=%Rrc, uFlags=0x%x, cbAlloc=%u, cbSize=%u, cbOffset=%u\n", - uPID, rc, uFlags, - pData->stdIn.cbAllocated, pData->stdIn.cbSize, pData->stdIn.cbOffset); -#endif - uint32_t uStatus = INPUT_STS_UNDEFINED; - if (RT_SUCCESS(rc)) - { - if (cbWritten || !cbSize) /* Did we write something or was there anything to write at all? */ - { - uStatus = INPUT_STS_WRITTEN; - uFlags = 0; - } - } - else - { - if (rc == VERR_BAD_PIPE) - uStatus = INPUT_STS_TERMINATED; - else if (rc == VERR_BUFFER_OVERFLOW) - uStatus = INPUT_STS_OVERFLOW; - else - { - uStatus = INPUT_STS_ERROR; - uFlags = rc; - } - } + fPendingClose = true; + VBoxServiceVerbose(4, "ControlExec: Got last input block (PID %u) of size %u ...\n", uPID, cbSize); + } - if (uStatus > INPUT_STS_UNDEFINED) + rc = VBoxServiceControlExecThreadSetInput(uPID, fPendingClose, pabBuffer, + cbSize, &cbWritten); + VBoxServiceVerbose(4, "ControlExec: Written input (PID %u): rc=%Rrc, uFlags=0x%x, fPendingClose=%d, cbSize=%u, cbWritten=%u\n", + uPID, rc, uFlags, fPendingClose, cbSize, cbWritten); + if (RT_SUCCESS(rc)) + { + if (cbWritten || !cbSize) /* Did we write something or was there anything to write at all? */ { - /* Note: Since the context ID is unique the request *has* to be completed here, - * regardless whether we got data or not! Otherwise the progress object - * on the host never will get completed! */ - rc = VbglR3GuestCtrlExecReportStatusIn(u32ClientId, uContextID, uPID, - uStatus, uFlags, (uint32_t)cbWritten); + uStatus = INPUT_STS_WRITTEN; + uFlags = 0; } } else - rc = VERR_NOT_FOUND; /* PID not found! */ + { + if (rc == VERR_BAD_PIPE) + uStatus = INPUT_STS_TERMINATED; + else if (rc == VERR_BUFFER_OVERFLOW) + uStatus = INPUT_STS_OVERFLOW; + } } RTMemFree(pabBuffer); + + /* + * If there was an error and we did not set the host status + * yet, then do it now. + */ + if ( RT_FAILURE(rc) + && uStatus == INPUT_STS_UNDEFINED) + { + uStatus = INPUT_STS_ERROR; + uFlags = rc; + } + Assert(uStatus > INPUT_STS_UNDEFINED); + + VBoxServiceVerbose(3, "ControlExec: Input processed (PID %u), Status=%u, Flags=0x%x, cbWritten=%u\n", + uPID, uStatus, uFlags, cbWritten); + + /* Note: Since the context ID is unique the request *has* to be completed here, + * regardless whether we got data or not! Otherwise the progress object + * on the host never will get completed! */ + rc = VbglR3GuestCtrlExecReportStatusIn(u32ClientId, uContextID, uPID, + uStatus, uFlags, (uint32_t)cbWritten); + VBoxServiceVerbose(3, "ControlExec: VBoxServiceControlExecHandleCmdSetInput returned with %Rrc\n", rc); return rc; } /** - * + * Handles the guest control output command. * * @return IPRT status code. - * @param u32ClientId - * @param uNumParms + * @param u32ClientId idClient The HGCM client session ID. + * @param uNumParms cParms The number of parameters the host is + * offering. */ int VBoxServiceControlExecHandleCmdGetOutput(uint32_t u32ClientId, uint32_t uNumParms) { @@ -1707,35 +1335,25 @@ int VBoxServiceControlExecHandleCmdGetOutput(uint32_t u32ClientId, uint32_t uNum &uContextID, &uPID, &uHandleID, &uFlags); if (RT_SUCCESS(rc)) { - PVBOXSERVICECTRLTHREAD pNode = VBoxServiceControlExecFindProcess(uPID); - if (pNode) + uint32_t cbRead; + uint8_t *pBuf = (uint8_t*)RTMemAlloc(_64K); + if (pBuf) { - PVBOXSERVICECTRLTHREADDATAEXEC pData = (PVBOXSERVICECTRLTHREADDATAEXEC)pNode->pvData; - AssertPtr(pData); - - const uint32_t cbSize = _1M; - uint32_t cbRead = cbSize; - uint8_t *pBuf = (uint8_t*)RTMemAlloc(cbSize); - if (pBuf) + rc = VBoxServiceControlExecThreadGetOutput(uPID, uHandleID, RT_INDEFINITE_WAIT /* Timeout */, + pBuf, _64K /* cbSize */, &cbRead); + if (RT_SUCCESS(rc)) { - /** @todo Use uHandleID to distinguish between stdout/stderr! */ - rc = VBoxServiceControlExecReadPipeBufferContent(&pData->stdOut, pBuf, cbSize, &cbRead); - if (RT_SUCCESS(rc)) - { - /* Note: Since the context ID is unique the request *has* to be completed here, - * regardless whether we got data or not! Otherwise the progress object - * on the host never will get completed! */ - /* cbRead now contains actual size. */ - rc = VbglR3GuestCtrlExecSendOut(u32ClientId, uContextID, uPID, 0 /* Handle ID */, 0 /* Flags */, - pBuf, cbRead); - } - RTMemFree(pBuf); + /* Note: Since the context ID is unique the request *has* to be completed here, + * regardless whether we got data or not! Otherwise the progress object + * on the host never will get completed! */ + /* cbRead now contains actual size. */ + rc = VbglR3GuestCtrlExecSendOut(u32ClientId, uContextID, uPID, uHandleID, 0 /* Flags */, + pBuf, cbRead); } - else - rc = VERR_NO_MEMORY; + RTMemFree(pBuf); } else - rc = VERR_NOT_FOUND; /* PID not found! */ + rc = VERR_NO_MEMORY; } else VBoxServiceError("ControlExec: Failed to retrieve exec output command! Error: %Rrc\n", rc); diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControlExecThread.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceControlExecThread.cpp new file mode 100644 index 000000000..fc5879b8e --- /dev/null +++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControlExecThread.cpp @@ -0,0 +1,385 @@ +/* $Id: VBoxServiceControlExecThread.cpp $ */ +/** @file + * VBoxServiceControlExecThread - Thread for an executed guest process. + */ + +/* + * Copyright (C) 2011 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/asm.h> +#include <iprt/assert.h> +#include <iprt/getopt.h> +#include <iprt/mem.h> +#include <iprt/pipe.h> +#include <iprt/semaphore.h> +#include <iprt/string.h> + +#include "VBoxServicePipeBuf.h" +#include "VBoxServiceControlExecThread.h" + +extern RTLISTNODE g_GuestControlExecThreads; +extern RTCRITSECT g_GuestControlExecThreadsCritSect; + + +/** + * Allocates and gives back a thread data struct which then can be used by the worker thread. + * Needs to be freed with VBoxServiceControlExecDestroyThreadData(). + * + * @return IPRT status code. + * @param pThread The thread's handle to allocate the data for. + * @param u32ContextID The context ID bound to this request / command. + * @param pszCmd Full qualified path of process to start (without arguments). + * @param uFlags Process execution flags. + * @param pszArgs String of arguments to pass to the process to start. + * @param uNumArgs Number of arguments specified in pszArgs. + * @param pszEnv String of environment variables ("FOO=BAR") to pass to the process + * to start. + * @param cbEnv Size (in bytes) of environment variables. + * @param uNumEnvVars Number of environment variables specified in pszEnv. + * @param pszUser User name (account) to start the process under. + * @param pszPassword Password of specified user name (account). + * @param uTimeLimitMS Time limit (in ms) of the process' life time. + */ +int VBoxServiceControlExecThreadAlloc(PVBOXSERVICECTRLTHREAD pThread, + uint32_t u32ContextID, + const char *pszCmd, uint32_t uFlags, + const char *pszArgs, uint32_t uNumArgs, + const char *pszEnv, uint32_t cbEnv, uint32_t uNumEnvVars, + const char *pszUser, const char *pszPassword, uint32_t uTimeLimitMS) +{ + AssertPtr(pThread); + + /* General stuff. */ + pThread->Node.pPrev = NULL; + pThread->Node.pNext = NULL; + + pThread->fShutdown = false; + pThread->fStarted = false; + pThread->fStopped = false; + + pThread->uContextID = u32ContextID; + /* ClientID will be assigned when thread is started! */ + + /* Specific stuff. */ + PVBOXSERVICECTRLTHREADDATAEXEC pData = (PVBOXSERVICECTRLTHREADDATAEXEC)RTMemAlloc(sizeof(VBOXSERVICECTRLTHREADDATAEXEC)); + if (pData == NULL) + return VERR_NO_MEMORY; + + pData->uPID = 0; /* Don't have a PID yet. */ + pData->pszCmd = RTStrDup(pszCmd); + pData->uFlags = uFlags; + pData->uNumEnvVars = 0; + pData->uNumArgs = 0; /* Initialize in case of RTGetOptArgvFromString() is failing ... */ + + /* Prepare argument list. */ + int rc = RTGetOptArgvFromString(&pData->papszArgs, (int*)&pData->uNumArgs, + (uNumArgs > 0) ? pszArgs : "", NULL); + /* Did we get the same result? */ + Assert(uNumArgs == pData->uNumArgs); + + if (RT_SUCCESS(rc)) + { + /* Prepare environment list. */ + if (uNumEnvVars) + { + pData->papszEnv = (char **)RTMemAlloc(uNumEnvVars * sizeof(char*)); + AssertPtr(pData->papszEnv); + pData->uNumEnvVars = uNumEnvVars; + + const char *pszCur = pszEnv; + uint32_t i = 0; + uint32_t cbLen = 0; + while (cbLen < cbEnv) + { + /* sanity check */ + if (i >= uNumEnvVars) + { + rc = VERR_INVALID_PARAMETER; + break; + } + int cbStr = RTStrAPrintf(&pData->papszEnv[i++], "%s", pszCur); + if (cbStr < 0) + { + rc = VERR_NO_STR_MEMORY; + break; + } + pszCur += cbStr + 1; /* Skip terminating '\0' */ + cbLen += cbStr + 1; /* Skip terminating '\0' */ + } + } + + pData->pszUser = RTStrDup(pszUser); + pData->pszPassword = RTStrDup(pszPassword); + pData->uTimeLimitMS = uTimeLimitMS; + + /* Adjust time limit value. */ + pData->uTimeLimitMS = ( uTimeLimitMS == UINT32_MAX + || uTimeLimitMS == 0) + ? RT_INDEFINITE_WAIT : uTimeLimitMS; + + /* Init buffers. */ + rc = VBoxServicePipeBufInit(&pData->stdOut, false /*fNeedNotificationPipe*/); + if (RT_SUCCESS(rc)) + { + rc = VBoxServicePipeBufInit(&pData->stdErr, false /*fNeedNotificationPipe*/); + if (RT_SUCCESS(rc)) + rc = VBoxServicePipeBufInit(&pData->stdIn, true /*fNeedNotificationPipe*/); + } + } + + if (RT_FAILURE(rc)) + { + VBoxServiceControlExecThreadDestroy(pData); + } + else + { + pThread->enmType = kVBoxServiceCtrlThreadDataExec; + pThread->pvData = pData; + } + return rc; +} + + +/** + * Frees an allocated thread data structure along with all its allocated parameters. + * + * @param pData Pointer to thread data to free. + */ +void VBoxServiceControlExecThreadDestroy(PVBOXSERVICECTRLTHREADDATAEXEC pData) +{ + if (pData) + { + RTStrFree(pData->pszCmd); + if (pData->uNumEnvVars) + { + for (uint32_t i = 0; i < pData->uNumEnvVars; i++) + RTStrFree(pData->papszEnv[i]); + RTMemFree(pData->papszEnv); + } + RTGetOptArgvFree(pData->papszArgs); + RTStrFree(pData->pszUser); + RTStrFree(pData->pszPassword); + + VBoxServicePipeBufDestroy(&pData->stdOut); + VBoxServicePipeBufDestroy(&pData->stdErr); + VBoxServicePipeBufDestroy(&pData->stdIn); + + RTMemFree(pData); + pData = NULL; + } +} + + +/** + * Finds a (formerly) started process given by its PID. + * Internal function, does not do locking -- this must be done from the caller function! + * + * @return PVBOXSERVICECTRLTHREAD Process structure if found, otherwise NULL. + * @param uPID PID to search for. + */ +PVBOXSERVICECTRLTHREAD vboxServiceControlExecThreadGetByPID(uint32_t uPID) +{ + PVBOXSERVICECTRLTHREAD pNode = NULL; + RTListForEach(&g_GuestControlExecThreads, pNode, VBOXSERVICECTRLTHREAD, Node) + { + if ( pNode->fStarted + && pNode->enmType == kVBoxServiceCtrlThreadDataExec) + { + PVBOXSERVICECTRLTHREADDATAEXEC pData = (PVBOXSERVICECTRLTHREADDATAEXEC)pNode->pvData; + if (pData && pData->uPID == uPID) + return pNode; + } + } + return NULL; +} + + +/** + * Injects input to a specified running process. + * + * @return IPRT status code. + * @param uPID PID of process to set the input for. + * @param fPendingClose Flag indicating whether this is the last input block sent to the process. + * @param pBuf Pointer to a buffer containing the actual input data. + * @param cbSize Size (in bytes) of the input buffer data. + * @param pcbWritten Pointer to number of bytes written to the process. Optional. + */ +int VBoxServiceControlExecThreadSetInput(uint32_t uPID, bool fPendingClose, uint8_t *pBuf, + uint32_t cbSize, uint32_t *pcbWritten) +{ + AssertPtrReturn(pBuf, VERR_INVALID_PARAMETER); + + int rc = RTCritSectEnter(&g_GuestControlExecThreadsCritSect); + if (RT_SUCCESS(rc)) + { + PVBOXSERVICECTRLTHREAD pNode = vboxServiceControlExecThreadGetByPID(uPID); + if (pNode) + { + PVBOXSERVICECTRLTHREADDATAEXEC pData = (PVBOXSERVICECTRLTHREADDATAEXEC)pNode->pvData; + AssertPtr(pData); + + if (VBoxServicePipeBufIsEnabled(&pData->stdIn)) + { + uint32_t cbWritten; + /* + * Feed the data to the pipe. + */ + rc = VBoxServicePipeBufWriteToBuf(&pData->stdIn, pBuf, + cbSize, fPendingClose, &cbWritten); + if (pcbWritten) + *pcbWritten = cbWritten; + } + else + { + /* If input buffer is not enabled anymore we cannot handle that data ... */ + rc = VERR_BAD_PIPE; + } + } + else + rc = VERR_NOT_FOUND; /* PID not found! */ + RTCritSectLeave(&g_GuestControlExecThreadsCritSect); + } + return rc; +} + + +/** + * Gets output from stdout/stderr of a specified process. + * + * @return IPRT status code. + * @param uPID PID of process to retrieve the output from. + * @param uHandleId Stream ID (stdout = 0, stderr = 2) to get the output from. + * @param uTimeout Timeout (in ms) to wait for output becoming available. + * @param pBuf Pointer to a pre-allocated buffer to store the output. + * @param cbSize Size (in bytes) of the pre-allocated buffer. + * @param pcbRead Pointer to number of bytes read. Optional. + */ +int VBoxServiceControlExecThreadGetOutput(uint32_t uPID, uint32_t uHandleId, uint32_t uTimeout, + uint8_t *pBuf, uint32_t cbSize, uint32_t *pcbRead) +{ + AssertPtrReturn(pBuf, VERR_INVALID_PARAMETER); + + int rc = RTCritSectEnter(&g_GuestControlExecThreadsCritSect); + if (RT_SUCCESS(rc)) + { + PVBOXSERVICECTRLTHREAD pNode = vboxServiceControlExecThreadGetByPID(uPID); + if (pNode) + { + PVBOXSERVICECTRLTHREADDATAEXEC pData = (PVBOXSERVICECTRLTHREADDATAEXEC)pNode->pvData; + AssertPtr(pData); + + PVBOXSERVICECTRLEXECPIPEBUF pPipeBuf; + switch (uHandleId) + { + case 2: /* StdErr */ + pPipeBuf = &pData->stdErr; + break; + + case 0: /* StdOut */ + default: + pPipeBuf = &pData->stdOut; + break; + } + AssertPtr(pPipeBuf); + + /* If the stdout pipe buffer is enabled (that is, still could be filled by a running + * process) wait for the signal to arrive so that we don't return without any actual + * data read. */ + if (VBoxServicePipeBufIsEnabled(pPipeBuf)) + rc = VBoxServicePipeBufWaitForEvent(pPipeBuf, uTimeout); + + if (RT_SUCCESS(rc)) + { + uint32_t cbRead = cbSize; + rc = VBoxServicePipeBufRead(pPipeBuf, pBuf, cbSize, &cbRead); + if (RT_SUCCESS(rc)) + { + if (pcbRead) + *pcbRead = cbRead; + } + } + } + else + rc = VERR_NOT_FOUND; /* PID not found! */ + + int rc2 = RTCritSectLeave(&g_GuestControlExecThreadsCritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + return rc; +} + + +/** + * Gracefully shuts down all process execution threads. + * + */ +void VBoxServiceControlExecThreadsShutdown(void) +{ + int rc = RTCritSectEnter(&g_GuestControlExecThreadsCritSect); + if (RT_SUCCESS(rc)) + { + /* Signal all threads that we want to shutdown. */ + PVBOXSERVICECTRLTHREAD pNode; + RTListForEach(&g_GuestControlExecThreads, pNode, VBOXSERVICECTRLTHREAD, Node) + ASMAtomicXchgBool(&pNode->fShutdown, true); + + /* Wait for threads to shutdown. */ + RTListForEach(&g_GuestControlExecThreads, pNode, VBOXSERVICECTRLTHREAD, Node) + { + if (pNode->Thread != NIL_RTTHREAD) + { + /* Wait a bit ... */ + int rc2 = RTThreadWait(pNode->Thread, 30 * 1000 /* Wait 30 seconds max. */, NULL); + if (RT_FAILURE(rc2)) + VBoxServiceError("Control: Thread failed to stop; rc2=%Rrc\n", rc2); + } + + /* Destroy thread specific data. */ + switch (pNode->enmType) + { + case kVBoxServiceCtrlThreadDataExec: + VBoxServiceControlExecThreadDestroy((PVBOXSERVICECTRLTHREADDATAEXEC)pNode->pvData); + break; + + default: + break; + } + } + + /* Finally destroy thread list. */ + pNode = RTListGetFirst(&g_GuestControlExecThreads, VBOXSERVICECTRLTHREAD, Node); + while (pNode) + { + PVBOXSERVICECTRLTHREAD pNext = RTListNodeGetNext(&pNode->Node, VBOXSERVICECTRLTHREAD, Node); + bool fLast = RTListNodeIsLast(&g_GuestControlExecThreads, &pNode->Node); + + RTListNodeRemove(&pNode->Node); + RTMemFree(pNode); + + if (fLast) + break; + + pNode = pNext; + } + + int rc2 = RTCritSectLeave(&g_GuestControlExecThreadsCritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + RTCritSectDelete(&g_GuestControlExecThreadsCritSect); +} + diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceControlExecThread.h b/src/VBox/Additions/common/VBoxService/VBoxServiceControlExecThread.h new file mode 100644 index 000000000..5caf644a0 --- /dev/null +++ b/src/VBox/Additions/common/VBoxService/VBoxServiceControlExecThread.h @@ -0,0 +1,37 @@ +/* $Id: VBoxServiceControlExecThread.h $ */ +/** @file + * VBoxServiceControlExecThread - Thread for an executed guest process. + */ + +/* + * Copyright (C) 2011 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 ___VBoxServiceControlExecThread_h +#define ___VBoxServiceControlExecThread_h + +#include "VBoxServiceInternal.h" + +int VBoxServiceControlExecThreadAlloc(PVBOXSERVICECTRLTHREAD pThread, + uint32_t u32ContextID, + const char *pszCmd, uint32_t uFlags, + const char *pszArgs, uint32_t uNumArgs, + const char *pszEnv, uint32_t cbEnv, uint32_t uNumEnvVars, + const char *pszUser, const char *pszPassword, uint32_t uTimeLimitMS); +void VBoxServiceControlExecThreadDestroy(PVBOXSERVICECTRLTHREADDATAEXEC pData); +int VBoxServiceControlExecThreadSetInput(uint32_t uPID, bool fPendingClose, uint8_t *pBuf, + uint32_t cbSize, uint32_t *pcbWritten); +int VBoxServiceControlExecThreadGetOutput(uint32_t uPID, uint32_t uHandleId, uint32_t uTimeout, + uint8_t *pBuf, uint32_t cbSize, uint32_t *pcbRead); +void VBoxServiceControlExecThreadsShutdown(void); + +#endif /* !___VBoxServiceControlExecThread_h */ + diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h b/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h index 5c7aa8168..020651b98 100644 --- a/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h +++ b/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007-2010 Oracle Corporation + * Copyright (C) 2007-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -135,8 +135,10 @@ typedef struct uint32_t cbOffset; /** Critical section protecting this buffer structure. */ RTCRITSECT CritSect; - /** Indicates the health condition of the child process. */ - bool fAlive; + /** Flag indicating whether this pipe buffer accepts new + * data to be written to or not. If not enabled, already + * (allocated) buffered data still can be read out. */ + bool fEnabled; /** Set if it's necessary to write to the notification pipe. */ bool fNeedNotification; /** Set if the pipe needs to be closed after the next read/write. */ @@ -146,6 +148,9 @@ typedef struct RTPIPE hNotificationPipeW; /** The other end of hNotificationPipeW. */ RTPIPE hNotificationPipeR; + /** The event semaphore for getting notified whether something + * has changed, e.g. written or read from this buffer. */ + RTSEMEVENT hEventSem; } VBOXSERVICECTRLEXECPIPEBUF; /** Pointer to buffered pipe data. */ typedef VBOXSERVICECTRLEXECPIPEBUF *PVBOXSERVICECTRLEXECPIPEBUF; @@ -279,7 +284,7 @@ extern void VBoxServiceWinSetStopPendingStatus(uint32_t uCheckPoint); #endif #ifdef VBOXSERVICE_TOOLBOX -extern bool VBoxServiceToolboxMain(int argc, char **argv, int *piExitCode); +extern bool VBoxServiceToolboxMain(int argc, char **argv, RTEXITCODE *prcExit); #endif #ifdef RT_OS_WINDOWS @@ -297,12 +302,7 @@ extern int VBoxServiceControlExecProcess(uint32_t uContext, const char const char *pszArgs, uint32_t uNumArgs, const char *pszEnv, uint32_t cbEnv, uint32_t uNumEnvVars, const char *pszUser, const char *pszPassword, uint32_t uTimeLimitMS); -extern void VBoxServiceControlExecDestroyThreadData(PVBOXSERVICECTRLTHREADDATAEXEC pThread); -extern void VBoxServiceControlExecDeletePipeBuffer(PVBOXSERVICECTRLEXECPIPEBUF pBuf); -extern int VBoxServiceControlExecReadPipeBufferContent(PVBOXSERVICECTRLEXECPIPEBUF pBuf, - uint8_t *pbBuffer, uint32_t cbBuffer, uint32_t *pcbToRead); -extern int VBoxServiceControlExecWritePipeBuffer(PVBOXSERVICECTRLEXECPIPEBUF pBuf, - uint8_t *pbData, uint32_t cbData, bool fPendingClose, uint32_t *pcbWritten); +extern void VBoxServiceControlExecThreadDestroy(PVBOXSERVICECTRLTHREADDATAEXEC pThread); #endif /* VBOX_WITH_GUEST_CONTROL */ #ifdef VBOXSERVICE_MANAGEMENT diff --git a/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp b/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp new file mode 100644 index 000000000..5a9027480 --- /dev/null +++ b/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.cpp @@ -0,0 +1,466 @@ +/* $Id: VBoxServicePipeBuf.cpp $ */ +/** @file + * VBoxServicePipeBuf - Pipe buffering. + */ + +/* + * Copyright (C) 2010-2011 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/assert.h> +#include <iprt/mem.h> +#include <iprt/pipe.h> +#include <iprt/semaphore.h> +#include <iprt/string.h> + +#include "VBoxServicePipeBuf.h" + + +/** + * Initializes a pipe buffer. + * + * @returns IPRT status code. + * @param pBuf The pipe buffer to initialize. + * @param fNeedNotificationPipe Whether the buffer needs a notification + * pipe or not. + */ +int VBoxServicePipeBufInit(PVBOXSERVICECTRLEXECPIPEBUF pBuf, bool fNeedNotificationPipe) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + + /** @todo Add allocation size as function parameter! */ + pBuf->pbData = (uint8_t *)RTMemAlloc(_64K); /* Start with a 64k buffer. */ + AssertReturn(pBuf->pbData, VERR_NO_MEMORY); + pBuf->cbAllocated = _64K; + pBuf->cbSize = 0; + pBuf->cbOffset = 0; + pBuf->fEnabled = true; + pBuf->fPendingClose = false; + pBuf->fNeedNotification = fNeedNotificationPipe; + pBuf->hNotificationPipeW = NIL_RTPIPE; + pBuf->hNotificationPipeR = NIL_RTPIPE; + pBuf->hEventSem = NIL_RTSEMEVENT; + + int rc = RTSemEventCreate(&pBuf->hEventSem); + if (RT_SUCCESS(rc)) + { + rc = RTCritSectInit(&pBuf->CritSect); + if (RT_SUCCESS(rc) && fNeedNotificationPipe) + { + rc = RTPipeCreate(&pBuf->hNotificationPipeR, &pBuf->hNotificationPipeW, 0); + if (RT_FAILURE(rc)) + { + RTCritSectDelete(&pBuf->CritSect); + if (pBuf->hEventSem != NIL_RTSEMEVENT) + RTSemEventDestroy(pBuf->hEventSem); + } + } + } + return rc; +} + + +/** + * Reads out data from a specififed pipe buffer. + * + * @return IPRT status code. + * @param pBuf Pointer to pipe buffer to read the data from. + * @param pbBuffer Pointer to buffer to store the read out data. + * @param cbBuffer Size (in bytes) of the buffer where to store the data. + * @param pcbToRead Pointer to desired amount (in bytes) of data to read, + * will reflect the actual amount read on return. + */ +int VBoxServicePipeBufRead(PVBOXSERVICECTRLEXECPIPEBUF pBuf, + uint8_t *pbBuffer, uint32_t cbBuffer, uint32_t *pcbToRead) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + AssertPtrReturn(pbBuffer, VERR_INVALID_POINTER); + AssertReturn(cbBuffer, VERR_INVALID_PARAMETER); + AssertPtrReturn(pcbToRead, VERR_INVALID_POINTER); + AssertReturn(*pcbToRead > 0, VERR_INVALID_PARAMETER); /* Nothing to read makes no sense ... */ + + int rc = RTCritSectEnter(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + { + Assert(pBuf->cbSize >= pBuf->cbOffset); + if (*pcbToRead > pBuf->cbSize - pBuf->cbOffset) + *pcbToRead = pBuf->cbSize - pBuf->cbOffset; + + if (*pcbToRead > cbBuffer) + *pcbToRead = cbBuffer; + + if (*pcbToRead > 0) + { + memcpy(pbBuffer, pBuf->pbData + pBuf->cbOffset, *pcbToRead); + pBuf->cbOffset += *pcbToRead; + + if (pBuf->hEventSem != NIL_RTSEMEVENT) + { + rc = RTSemEventSignal(pBuf->hEventSem); + AssertRC(rc); + } + } + else + { + pbBuffer = NULL; + *pcbToRead = 0; + } + + int rc2 = RTCritSectLeave(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + return rc; +} + + +int VBoxServicePipeBufPeek(PVBOXSERVICECTRLEXECPIPEBUF pBuf, + uint8_t *pbBuffer, uint32_t cbBuffer, + uint32_t cbOffset, + uint32_t *pcbRead, uint32_t *pcbLeft) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + AssertPtrReturn(pbBuffer, VERR_INVALID_POINTER); + AssertReturn(cbBuffer, VERR_INVALID_PARAMETER); + + int rc = RTCritSectEnter(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + { + Assert(pBuf->cbSize >= pBuf->cbOffset); + if (cbOffset > pBuf->cbSize) + cbOffset = pBuf->cbSize; + uint32_t cbToRead = pBuf->cbSize - cbOffset; + if (cbToRead > cbBuffer) + cbToRead = cbBuffer; + if (cbToRead) + { + memcpy(pbBuffer, pBuf->pbData + cbOffset, cbToRead); + pbBuffer[cbBuffer - 1] = '\0'; + } + if (pcbRead) + *pcbRead = cbToRead; + if (pcbLeft) + *pcbLeft = pBuf->cbSize - (cbOffset + cbToRead); + + int rc2 = RTCritSectLeave(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + return rc; +} + + +/** + * Writes data into a specififed pipe buffer. + * + * @return IPRT status code. + * @param pBuf Pointer to pipe buffer to write data into. + * @param pbData Pointer to byte data to write. + * @param cbData Data size (in bytes) to write. + * @param fPendingClose Needs the pipe (buffer) to be closed next time we have the chance to? + * @param pcbWritten Pointer to where the amount of written bytes get stored. Optional. + */ +int VBoxServicePipeBufWriteToBuf(PVBOXSERVICECTRLEXECPIPEBUF pBuf, + uint8_t *pbData, uint32_t cbData, bool fPendingClose, + uint32_t *pcbWritten) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + + int rc = RTCritSectEnter(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + { + AssertPtrReturn(pbData, VERR_INVALID_POINTER); + if (pBuf->fEnabled) + { + /* Rewind the buffer if it's empty. */ + size_t cbInBuf = pBuf->cbSize - pBuf->cbOffset; + bool const fAddToSet = cbInBuf == 0; + if (fAddToSet) + pBuf->cbSize = pBuf->cbOffset = 0; + + /* Try and see if we can simply append the data. */ + if (cbData + pBuf->cbSize <= pBuf->cbAllocated) + { + memcpy(&pBuf->pbData[pBuf->cbSize], pbData, cbData); + pBuf->cbSize += cbData; + } + else + { + /* Move any buffered data to the front. */ + cbInBuf = pBuf->cbSize - pBuf->cbOffset; + if (cbInBuf == 0) + pBuf->cbSize = pBuf->cbOffset = 0; + else if (pBuf->cbOffset) /* Do we have something to move? */ + { + memmove(pBuf->pbData, &pBuf->pbData[pBuf->cbOffset], cbInBuf); + pBuf->cbSize = cbInBuf; + pBuf->cbOffset = 0; + } + + /* Do we need to grow the buffer? */ + if (cbData + pBuf->cbSize > pBuf->cbAllocated) + { + size_t cbAlloc = pBuf->cbSize + cbData; + cbAlloc = RT_ALIGN_Z(cbAlloc, _64K); + void *pvNew = RTMemRealloc(pBuf->pbData, cbAlloc); + if (pvNew) + { + pBuf->pbData = (uint8_t *)pvNew; + pBuf->cbAllocated = cbAlloc; + } + else + rc = VERR_NO_MEMORY; + } + + /* Finally, copy the data. */ + if (RT_SUCCESS(rc)) + { + if (cbData + pBuf->cbSize <= pBuf->cbAllocated) + { + memcpy(&pBuf->pbData[pBuf->cbSize], pbData, cbData); + pBuf->cbSize += cbData; + } + else + rc = VERR_BUFFER_OVERFLOW; + } + } + + if (RT_SUCCESS(rc)) + { + /* + * Was this the final read/write to do on this buffer? Then close it + * next time we have the chance to. + */ + if (fPendingClose) + pBuf->fPendingClose = fPendingClose; + + /* + * Wake up the thread servicing the process so it can feed it + * (if we have a notification helper pipe). + */ + if (pBuf->fNeedNotification) + { + size_t cbWritten; + int rc2 = RTPipeWrite(pBuf->hNotificationPipeW, "i", 1, &cbWritten); + + /* Disable notification until it is set again on successful write. */ + pBuf->fNeedNotification = !RT_SUCCESS(rc2); + } + + /* Report back written bytes (if wanted). */ + if (pcbWritten) + *pcbWritten = cbData; + + if (pBuf->hEventSem != NIL_RTSEMEVENT) + { + rc = RTSemEventSignal(pBuf->hEventSem); + AssertRC(rc); + } + } + } + else + rc = VERR_BAD_PIPE; + + int rc2 = RTCritSectLeave(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + return rc; +} + + +int VBoxServicePipeBufWriteToPipe(PVBOXSERVICECTRLEXECPIPEBUF pBuf, RTPIPE hPipe, + size_t *pcbWritten, size_t *pcbLeft) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + AssertPtrReturn(pcbWritten, VERR_INVALID_POINTER); + AssertPtrReturn(pcbLeft, VERR_INVALID_POINTER); + + int rc = RTCritSectEnter(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + { + Assert(pBuf->cbSize >= pBuf->cbOffset); + size_t cbToWrite = pBuf->cbSize - pBuf->cbOffset; + cbToWrite = RT_MIN(cbToWrite, _64K); + + /* Set current bytes left in pipe buffer. It's okay + * to have no data in yet ... */ + *pcbLeft = pBuf->cbSize - pBuf->cbOffset; + + if ( pBuf->fEnabled + && cbToWrite) + { + rc = RTPipeWrite(hPipe, &pBuf->pbData[pBuf->cbOffset], cbToWrite, pcbWritten); + if (RT_SUCCESS(rc)) + { + pBuf->fNeedNotification = true; + if (rc != VINF_TRY_AGAIN) + pBuf->cbOffset += *pcbWritten; + + /* Did somebody tell us that we should come to an end, + * e.g. no more data coming in? */ + if (pBuf->fPendingClose) + { + /* Is there more data to write out? */ + if (pBuf->cbSize > pBuf->cbOffset) + { + /* We have a pending close, but there's more data that we can write out + * from buffer to pipe ... */ + if (pBuf->fNeedNotification) + { + /* Still data to push out - so we need another + * poll round! Write something into the notification pipe. */ + size_t cbWrittenIgnore; + int rc2 = RTPipeWrite(pBuf->hNotificationPipeW, "i", 1, &cbWrittenIgnore); + AssertRC(rc2); + + /* Disable notification until it is set again on successful write. */ + pBuf->fNeedNotification = !RT_SUCCESS(rc2); + } + } + } + + /* Set new bytes left in pipe buffer afer we wrote to the pipe above. */ + *pcbLeft = pBuf->cbSize - pBuf->cbOffset; + } + else + { + *pcbWritten = 0; + pBuf->fEnabled = false; + } + } + else + { + *pcbWritten = 0; + pBuf->fNeedNotification = pBuf->fEnabled; + } + + int rc2 = RTCritSectLeave(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + return rc; +} + + +/** + * Returns whether a pipe buffer is active or not. + * + * @return bool True if pipe buffer is active, false if not. + * @param pBuf The pipe buffer. + */ +bool VBoxServicePipeBufIsEnabled(PVBOXSERVICECTRLEXECPIPEBUF pBuf) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + + bool fEnabled = false; + if ( RTCritSectIsInitialized(&pBuf->CritSect) + && RT_SUCCESS(RTCritSectEnter(&pBuf->CritSect))) + { + fEnabled = pBuf->fEnabled; + RTCritSectLeave(&pBuf->CritSect); + } + return fEnabled; +} + + +/** + * Returns whether a pipe buffer is in a pending close state or + * not. This means that someone has written the last chunk into + * the pipe buffer with the fPendingClose flag set. + * + * @return bool True if pipe buffer is in pending + * close state, false if not. + * @param pBuf The pipe buffer. + */ +bool VBoxServicePipeBufIsClosing(PVBOXSERVICECTRLEXECPIPEBUF pBuf) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + + bool fClosing = false; + if ( RTCritSectIsInitialized(&pBuf->CritSect) + && RT_SUCCESS(RTCritSectEnter(&pBuf->CritSect))) + { + fClosing = pBuf->fPendingClose; + RTCritSectLeave(&pBuf->CritSect); + } + return fClosing; +} + + +/** + * Sets the current status (enabled/disabled) of a pipe buffer. + * + * @return IPRT status code. + * @param pBuf The pipe buffer. + * @param fEnabled Pipe buffer status to set. + */ +int VBoxServicePipeBufSetStatus(PVBOXSERVICECTRLEXECPIPEBUF pBuf, bool fEnabled) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + + int rc = RTCritSectEnter(&pBuf->CritSect); + if (RT_SUCCESS(rc)) + { + pBuf->fEnabled = fEnabled; + /* Let waiter know that something has changed ... */ + if (pBuf->hEventSem) + RTSemEventSignal(pBuf->hEventSem); + rc = RTCritSectLeave(&pBuf->CritSect); + } + return rc; +} + + +int VBoxServicePipeBufWaitForEvent(PVBOXSERVICECTRLEXECPIPEBUF pBuf, RTMSINTERVAL cMillies) +{ + AssertPtrReturn(pBuf, VERR_INVALID_POINTER); + + /* Don't enter the critical section here; someone else could signal the event semaphore + * and this will deadlock then ... */ + return RTSemEventWait(pBuf->hEventSem, cMillies); +} + + +/** + * Deletes a pipe buffer. + * + * @note Not thread safe -- only call this when nobody is relying on the + * data anymore! + * + * @param pBuf The pipe buffer. + */ +void VBoxServicePipeBufDestroy(PVBOXSERVICECTRLEXECPIPEBUF pBuf) +{ + AssertPtr(pBuf); + if (pBuf->pbData) + { + RTMemFree(pBuf->pbData); + pBuf->pbData = NULL; + pBuf->cbAllocated = 0; + pBuf->cbSize = 0; + pBuf->cbOffset = 0; + } + + RTPipeClose(pBuf->hNotificationPipeR); + pBuf->hNotificationPipeR = NIL_RTPIPE; + RTPipeClose(pBuf->hNotificationPipeW); + pBuf->hNotificationPipeW = NIL_RTPIPE; + + RTCritSectDelete(&pBuf->CritSect); + if (pBuf->hEventSem != NIL_RTSEMEVENT) + RTSemEventDestroy(pBuf->hEventSem); +} + diff --git a/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.h b/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.h new file mode 100644 index 000000000..89e2c4317 --- /dev/null +++ b/src/VBox/Additions/common/VBoxService/VBoxServicePipeBuf.h @@ -0,0 +1,41 @@ +/* $Id: VBoxServicePipeBuf.h $ */ +/** @file + * VBoxServicePipeBuf - Pipe buffering. + */ + +/* + * Copyright (C) 2010-2011 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 ___VBoxServicePipeBuf_h +#define ___VBoxServicePipeBuf_h + +#include "VBoxServiceInternal.h" + +int VBoxServicePipeBufInit(PVBOXSERVICECTRLEXECPIPEBUF pBuf, bool fNeedNotificationPipe); +int VBoxServicePipeBufRead(PVBOXSERVICECTRLEXECPIPEBUF pBuf, + uint8_t *pbBuffer, uint32_t cbBuffer, uint32_t *pcbToRead); +int VBoxServicePipeBufPeek(PVBOXSERVICECTRLEXECPIPEBUF pBuf, + uint8_t *pbBuffer, uint32_t cbBuffer, + uint32_t cbOffset, + uint32_t *pcbRead, uint32_t *pcbLeft); +int VBoxServicePipeBufWriteToBuf(PVBOXSERVICECTRLEXECPIPEBUF pBuf, + uint8_t *pbData, uint32_t cbData, bool fPendingClose, uint32_t *pcbWritten); +int VBoxServicePipeBufWriteToPipe(PVBOXSERVICECTRLEXECPIPEBUF pBuf, RTPIPE hPipe, + size_t *pcbWritten, size_t *pcbLeft); +bool VBoxServicePipeBufIsEnabled(PVBOXSERVICECTRLEXECPIPEBUF pBuf); +bool VBoxServicePipeBufIsClosing(PVBOXSERVICECTRLEXECPIPEBUF pBuf); +int VBoxServicePipeBufSetStatus(PVBOXSERVICECTRLEXECPIPEBUF pBuf, bool fEnabled); +int VBoxServicePipeBufWaitForEvent(PVBOXSERVICECTRLEXECPIPEBUF pBuf, RTMSINTERVAL cMillies); +void VBoxServicePipeBufDestroy(PVBOXSERVICECTRLEXECPIPEBUF pBuf); + +#endif /* !___VBoxServicePipeBuf_h */ + diff --git a/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.cpp b/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.cpp index a7245c4b0..a06aabe86 100644 --- a/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.cpp +++ b/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.cpp @@ -98,18 +98,24 @@ int vboxServicePropCacheWritePropF(uint32_t u32ClientId, const char *pszName, ui char *pszValue; if (RTStrAPrintfV(&pszValue, pszValueFormat, va) >= 0) { - if (fFlags & VBOXSERVICEPROPCACHEFLAG_TEMPORARY) + if (fFlags & VBOXSERVICEPROPCACHEFLAG_TRANSIENT) { /* * Because a value can be temporary we have to make sure it also * gets deleted when the property cache did not have the chance to * gracefully clean it up (due to a hard VM reset etc), so set this - * guest property using the TRANSIENT flag. + * guest property using the TRANSRESET flag.. */ - rc = VbglR3GuestPropWrite(u32ClientId, pszName, pszValue, "TRANSIENT"); + rc = VbglR3GuestPropWrite(u32ClientId, pszName, pszValue, "TRANSRESET"); + if (rc == VERR_PARSE_ERROR) + { + /* Host does not support the "TRANSRESET" flag, so only + * use the "TRANSIENT" flag -- better than nothing :-). */ + rc = VbglR3GuestPropWrite(u32ClientId, pszName, pszValue, "TRANSIENT"); + } } else - rc = VbglR3GuestPropWriteValue(u32ClientId, pszName, pszValue); + rc = VbglR3GuestPropWriteValue(u32ClientId, pszName, pszValue /* No transient flags set */); RTStrFree(pszValue); } else @@ -374,13 +380,11 @@ void VBoxServicePropCacheDestroy(PVBOXSERVICEVEPROPCACHE pCache) VBOXSERVICEVEPROPCACHEENTRY, NodeSucc); RTListNodeRemove(&pNode->NodeSucc); - /* - * When destroying the cache and we have a temporary value, remove the - * (eventually) set TRANSIENT flag from it so that it doesn't get deleted - * by the host side in order to put the actual reset value in it. - */ if (pNode->fFlags & VBOXSERVICEPROPCACHEFLAG_TEMPORARY) - vboxServicePropCacheWritePropF(pCache->uClientID, pNode->pszName, 0 /* Flags, clear all */, pNode->pszValueReset); + { + rc = vboxServicePropCacheWritePropF(pCache->uClientID, pNode->pszName, + pNode->fFlags, pNode->pszValueReset); + } AssertPtr(pNode->pszName); RTStrFree(pNode->pszName); diff --git a/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.h b/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.h index 94e28406a..430f9a7df 100644 --- a/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.h +++ b/src/VBox/Additions/common/VBoxService/VBoxServicePropCache.h @@ -20,10 +20,22 @@ #include "VBoxServiceInternal.h" -#ifdef VBOX_WITH_GUEST_PROPS +# ifdef VBOX_WITH_GUEST_PROPS -#define VBOXSERVICEPROPCACHEFLAG_TEMPORARY RT_BIT(1) -#define VBOXSERVICEPROPCACHEFLAG_ALWAYS_UPDATE RT_BIT(2) +/** Indicates wheter a guest property is temporary and either should + * - a) get a "reset" value assigned (via VBoxServicePropCacheUpdateEntry) + * as soon as the property cache gets destroyed, or + * - b) get deleted when no reset value is specified. + */ +#define VBOXSERVICEPROPCACHEFLAG_TEMPORARY RT_BIT(1) +/** Indicates whether a property every time needs to be updated, regardless + * if its real value changed or not. */ +#define VBOXSERVICEPROPCACHEFLAG_ALWAYS_UPDATE RT_BIT(2) +/** The guest property gets deleted when + * - a) the property cache gets destroyed, or + * - b) the VM gets reset / shutdown / destroyed. + */ +#define VBOXSERVICEPROPCACHEFLAG_TRANSIENT RT_BIT(3) int VBoxServicePropCacheCreate(PVBOXSERVICEVEPROPCACHE pCache, uint32_t uClientId); int VBoxServicePropCacheUpdateEntry(PVBOXSERVICEVEPROPCACHE pCache, const char *pszName, uint32_t fFlags, const char *pszValueReset); @@ -31,7 +43,7 @@ int VBoxServicePropCacheUpdate(PVBOXSERVICEVEPROPCACHE pCache, const char *pszNa int VBoxServicePropCacheUpdateByPath(PVBOXSERVICEVEPROPCACHE pCache, const char *pszValue, uint32_t fFlags, const char *pszPathFormat, ...); int VBoxServicePropCacheFlush(PVBOXSERVICEVEPROPCACHE pCache); void VBoxServicePropCacheDestroy(PVBOXSERVICEVEPROPCACHE pCache); -#endif +# endif /* VBOX_WITH_GUEST_PROPS */ -#endif +#endif /* ___VBoxServicePropCache_h */ diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp index 8c3521f0f..8584eef46 100644 --- a/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp +++ b/src/VBox/Additions/common/VBoxService/VBoxServiceToolBox.cpp @@ -185,7 +185,7 @@ static int VBoxServiceToolboxCatOutput(RTFILE hInput, RTFILE hOutput) for (;;) { rc = RTFileRead(hInput, abBuf, sizeof(abBuf), &cbRead); - if (RT_SUCCESS(rc)) + if (RT_SUCCESS(rc) && cbRead > 0) { rc = RTFileWrite(hOutput, abBuf, cbRead, NULL /* Try to write all at once! */); cbRead = 0; @@ -194,6 +194,8 @@ static int VBoxServiceToolboxCatOutput(RTFILE hInput, RTFILE hOutput) { if (rc == VERR_BROKEN_PIPE) rc = VINF_SUCCESS; + else if (RT_FAILURE(rc)) + RTMsgError("cat: Error while reading input, rc=%Rrc\n", rc); break; } } @@ -209,7 +211,7 @@ static int VBoxServiceToolboxCatOutput(RTFILE hInput, RTFILE hOutput) * @param argc Number of arguments. * @param argv Pointer to argument array. */ -static int VBoxServiceToolboxMkDir(int argc, char **argv) +static RTEXITCODE VBoxServiceToolboxMkDir(int argc, char **argv) { static const RTGETOPTDEF s_aOptions[] = { @@ -331,7 +333,7 @@ static int VBoxServiceToolboxMkDir(int argc, char **argv) * @param argc Number of arguments. * @param argv Pointer to argument array. */ -static int VBoxServiceToolboxCat(int argc, char **argv) +static RTEXITCODE VBoxServiceToolboxCat(int argc, char **argv) { static const RTGETOPTDEF s_aOptions[] = { @@ -485,23 +487,24 @@ static int VBoxServiceToolboxCat(int argc, char **argv) * @return True if an internal tool was handled, false if not. * @param argc Number of arguments. * @param argv Pointer to argument array. - * @param piExitCode Pointer to receive exit code when internal command - * was handled. + * @param prcExit Where to store the exit code when an + * internal toolbox command was handled. */ -bool VBoxServiceToolboxMain(int argc, char **argv, int *piExitCode) +bool VBoxServiceToolboxMain(int argc, char **argv, RTEXITCODE *prcExit) { if (argc > 0) /* Do we have at least a main command? */ { if ( !strcmp(argv[0], "cat") || !strcmp(argv[0], "vbox_cat")) { - *piExitCode = VBoxServiceToolboxCat(argc, argv); + *prcExit = VBoxServiceToolboxCat(argc, argv); return true; } - else if ( !strcmp(argv[0], "mkdir") - || !strcmp(argv[0], "vbox_mkdir")) + + if ( !strcmp(argv[0], "mkdir") + || !strcmp(argv[0], "vbox_mkdir")) { - *piExitCode = VBoxServiceToolboxMkDir(argc, argv); + *prcExit = VBoxServiceToolboxMkDir(argc, argv); return true; } } diff --git a/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp b/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp index 10688fb4b..f31cc2459 100644 --- a/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp +++ b/src/VBox/Additions/common/VBoxService/VBoxServiceVMInfo.cpp @@ -146,11 +146,11 @@ static DECLCALLBACK(int) VBoxServiceVMInfoInit(void) * Declare some guest properties with flags and reset values. */ VBoxServicePropCacheUpdateEntry(&g_VMInfoPropCache, "/VirtualBox/GuestInfo/OS/LoggedInUsersList", - VBOXSERVICEPROPCACHEFLAG_TEMPORARY, NULL /* Delete on exit */); + VBOXSERVICEPROPCACHEFLAG_TEMPORARY | VBOXSERVICEPROPCACHEFLAG_TRANSIENT, NULL /* Delete on exit */); VBoxServicePropCacheUpdateEntry(&g_VMInfoPropCache, "/VirtualBox/GuestInfo/OS/LoggedInUsers", - VBOXSERVICEPROPCACHEFLAG_TEMPORARY, "0"); + VBOXSERVICEPROPCACHEFLAG_TEMPORARY | VBOXSERVICEPROPCACHEFLAG_TRANSIENT, "0"); VBoxServicePropCacheUpdateEntry(&g_VMInfoPropCache, "/VirtualBox/GuestInfo/OS/NoLoggedInUsers", - VBOXSERVICEPROPCACHEFLAG_TEMPORARY, "true"); + VBOXSERVICEPROPCACHEFLAG_TEMPORARY | VBOXSERVICEPROPCACHEFLAG_TRANSIENT, "true"); VBoxServicePropCacheUpdateEntry(&g_VMInfoPropCache, "/VirtualBox/GuestInfo/Net/Count", VBOXSERVICEPROPCACHEFLAG_TEMPORARY | VBOXSERVICEPROPCACHEFLAG_ALWAYS_UPDATE, NULL /* Delete on exit */); } diff --git a/src/VBox/Additions/linux/Makefile b/src/VBox/Additions/linux/Makefile index 5b2383965..2b89dcad7 100644 --- a/src/VBox/Additions/linux/Makefile +++ b/src/VBox/Additions/linux/Makefile @@ -59,7 +59,6 @@ all: fi; \ fi - install: @$(MAKE) KBUILD_VERBOSE=$(KBUILD_VERBOSE) -C vboxguest install @if [ -d vboxsf ]; then \ @@ -79,6 +78,9 @@ clean: fi rm -f vboxguest.*o vboxsf.*o vboxvideo.*o +check: + @$(MAKE) KBUILD_VERBOSE=$(KBUILD_VERBOSE) -C vboxguest check + load: @/sbin/rmmod vboxvideo || true @/sbin/rmmod vboxvfs || true diff --git a/src/VBox/Additions/linux/Makefile.kmk b/src/VBox/Additions/linux/Makefile.kmk index 185190a4c..e4a737e50 100644 --- a/src/VBox/Additions/linux/Makefile.kmk +++ b/src/VBox/Additions/linux/Makefile.kmk @@ -326,11 +326,6 @@ lnx_add_inst-license_MODE = a+r,u+w lnx_add_inst-license_SOURCES = \ $(VBOX_BRAND_LICENSE_TXT)=>LICENSE -INSTALLS += AutoRun-sh -AutoRun-sh_INST = bin/additions/ -AutoRun-sh_MODE = a+rx,u+w -AutoRun-sh_SOURCES = $(VBOX_REL_LNX_ADD_INST)autorun.sh - # # Install the sources of our (sanity) test kernel module diff --git a/src/VBox/Additions/linux/drm/Makefile.module b/src/VBox/Additions/linux/drm/Makefile.module index 058d68317..5611df78f 100644 --- a/src/VBox/Additions/linux/drm/Makefile.module +++ b/src/VBox/Additions/linux/drm/Makefile.module @@ -152,6 +152,11 @@ ifndef INCL INCL += $(addprefix -I$(KBUILD_EXTMOD)/vboxvideo,/ /include /r0drv/linux) export INCL endif +ifneq ($(wildcard $(KBUILD_EXTMOD)/vboxvideo),) + MANGLING := $(KBUILD_EXTMOD)/vboxvideo/include/VBox/VBoxGuestMangling.h +else + MANGLING := $(KBUILD_EXTMOD)/include/VBox/VBoxGuestMangling.h +endif KFLAGS := -D__KERNEL__ -DMODULE -DRT_OS_LINUX -DIN_RING0 -DIN_RT_R0 \ -DIN_SUP_R0 -DVBOX -DVBOX_WITH_HGCM -DLOG_TO_BACKDOOR -DIN_MODULE \ -DIN_GUEST_R0 @@ -214,7 +219,7 @@ else endif # build defs -EXTRA_CFLAGS += $(INCL) $(KFLAGS) $(KDEBUG) +EXTRA_CFLAGS += -include $(MANGLING) $(INCL) $(KFLAGS) $(KDEBUG) all: $(MODULE) diff --git a/src/VBox/Additions/linux/drm/files_vboxvideo_drm b/src/VBox/Additions/linux/drm/files_vboxvideo_drm index cb6027cc6..038acc5cb 100755 --- a/src/VBox/Additions/linux/drm/files_vboxvideo_drm +++ b/src/VBox/Additions/linux/drm/files_vboxvideo_drm @@ -17,6 +17,8 @@ # FILES_VBOXVIDEO_DRM_NOBIN=" \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ + ${PATH_ROOT}/include/VBox/VBoxGuestMangling.h=>include/VBox/VBoxGuestMangling.h \ ${PATH_ROOT}/src/VBox/Additions/linux/drm/vboxvideo_drm.c=>vboxvideo_drm.c \ ${PATH_ROOT}/src/VBox/Additions/linux/drm/vboxvideo_drm.h=>vboxvideo_drm.h \ ${PATH_OUT}/version-generated.h=>version-generated.h \ diff --git a/src/VBox/Additions/linux/drm/vboxvideo_drm.c b/src/VBox/Additions/linux/drm/vboxvideo_drm.c index 4e213d106..8ac7896fc 100644 --- a/src/VBox/Additions/linux/drm/vboxvideo_drm.c +++ b/src/VBox/Additions/linux/drm/vboxvideo_drm.c @@ -66,63 +66,83 @@ #include "vboxvideo_drm.h" static struct pci_device_id pciidlist[] = { - vboxvideo_PCI_IDS + vboxvideo_PCI_IDS }; int vboxvideo_driver_load(struct drm_device * dev, unsigned long flags) { # if LINUX_VERSION_CODE >= KERNEL_VERSION (2, 6, 28) - return drm_vblank_init(dev, 1); + return drm_vblank_init(dev, 1); #else return 0; #endif } -static struct drm_driver driver = { - /* .driver_features = DRIVER_USE_MTRR, */ - .load = vboxvideo_driver_load, - .reclaim_buffers = drm_core_reclaim_buffers, - /* As of Linux 2.65.37, always the internal functions are used. */ +static struct drm_driver driver = +{ + /* .driver_features = DRIVER_USE_MTRR, */ + .load = vboxvideo_driver_load, + .reclaim_buffers = drm_core_reclaim_buffers, + /* As of Linux 2.65.37, always the internal functions are used. */ #if LINUX_VERSION_CODE < KERNEL_VERSION (2, 6, 37) - .get_map_ofs = drm_core_get_map_ofs, - .get_reg_ofs = drm_core_get_reg_ofs, + .get_map_ofs = drm_core_get_map_ofs, + .get_reg_ofs = drm_core_get_reg_ofs, #endif - .fops = { - .owner = THIS_MODULE, - .open = drm_open, - .release = drm_release, - /* This was changed with Linux 2.6.33 but Fedora backported this - * change to their 2.6.32 kernel. */ + .fops = + { + .owner = THIS_MODULE, + .open = drm_open, + .release = drm_release, + /* This was changed with Linux 2.6.33 but Fedora backported this + * change to their 2.6.32 kernel. */ #if defined(DRM_UNLOCKED) || LINUX_VERSION_CODE >= KERNEL_VERSION (2, 6, 33) - .unlocked_ioctl = drm_ioctl, + .unlocked_ioctl = drm_ioctl, #else - .ioctl = drm_ioctl, + .ioctl = drm_ioctl, +#endif + .mmap = drm_mmap, + .poll = drm_poll, + .fasync = drm_fasync, + }, +#if LINUX_VERSION_CODE < KERNEL_VERSION (2, 6, 39) + .pci_driver = + { + .name = DRIVER_NAME, + .id_table = pciidlist, + }, #endif - .mmap = drm_mmap, - .poll = drm_poll, - .fasync = drm_fasync, - }, - .pci_driver = { - .name = DRIVER_NAME, - .id_table = pciidlist, - }, + .name = DRIVER_NAME, + .desc = DRIVER_DESC, + .date = DRIVER_DATE, + .major = DRIVER_MAJOR, + .minor = DRIVER_MINOR, + .patchlevel = DRIVER_PATCHLEVEL, +}; - .name = DRIVER_NAME, - .desc = DRIVER_DESC, - .date = DRIVER_DATE, - .major = DRIVER_MAJOR, - .minor = DRIVER_MINOR, - .patchlevel = DRIVER_PATCHLEVEL, +#if LINUX_VERSION_CODE >= KERNEL_VERSION (2, 6, 39) +static struct pci_driver pci_driver = +{ + .name = DRIVER_NAME, + .id_table = pciidlist, }; +#endif static int __init vboxvideo_init(void) { - return drm_init(&driver); +#if LINUX_VERSION_CODE < KERNEL_VERSION (2, 6, 39) + return drm_init(&driver); +#else + return drm_pci_init(&driver, &pci_driver); +#endif } static void __exit vboxvideo_exit(void) { - drm_exit(&driver); +#if LINUX_VERSION_CODE < KERNEL_VERSION (2, 6, 39) + drm_exit(&driver); +#else + drm_pci_exit(&driver, &pci_driver); +#endif } module_init(vboxvideo_init); diff --git a/src/VBox/Additions/linux/installer/autorun.sh b/src/VBox/Additions/linux/installer/autorun.sh index 486dd290c..45afb034a 100755 --- a/src/VBox/Additions/linux/installer/autorun.sh +++ b/src/VBox/Additions/linux/installer/autorun.sh @@ -1,10 +1,11 @@ #!/bin/sh +# $Id: autorun.sh $ # -# VirtualBox Guest Additions installation script for Linux +# VirtualBox Guest Additions installation script for *nix guests # # -# Copyright (C) 2009-2010 Oracle Corporation +# Copyright (C) 2009-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -17,6 +18,8 @@ PATH=$PATH:/bin:/sbin:/usr/sbin +#include sh-utils.sh + ostype=`uname -s` if test "$ostype" != "Linux" && test "$ostype" != "SunOS" ; then echo "Linux/Solaris not detected." @@ -40,9 +43,19 @@ esac # execute the installer if test "$ostype" = "Linux"; then - if test -f "$path/VBoxLinuxAdditions.run"; then - exec gksu /bin/sh "$path/VBoxLinuxAdditions.run" - fi + for i in "$path/VBoxLinuxAdditions.run" \ + "$path/VBoxLinuxAdditions-$arch.run"; do + if test -f "$i"; then + getxterm + case "$gxtpath" in ?*) + TITLE="VirtualBox Guest Additions installation" + BINARY="`quotify "$i"`" + exec "$gxtpath" "$gxttitle" "$TITLE" "$gxtexec" /bin/sh "$path/runasroot.sh" --has-terminal "$TITLE" "/bin/sh $BINARY --xwin" "Please try running "\""$i"\"" manually." + exit + ;; + esac + fi + done # else: unknown failure echo "Linux guest additions installer not found -- try to start them manually." diff --git a/src/VBox/Additions/linux/installer/vboxadd-service.sh b/src/VBox/Additions/linux/installer/vboxadd-service.sh index df3ff83ce..02016ee4a 100755 --- a/src/VBox/Additions/linux/installer/vboxadd-service.sh +++ b/src/VBox/Additions/linux/installer/vboxadd-service.sh @@ -100,7 +100,7 @@ if [ "$system" = "debian" ]; then } killproc() { - start-stop-daemon --stop --exec $@ + start-stop-daemon --stop --retry 2 --exec $@ } fail_msg() { @@ -123,7 +123,7 @@ if [ "$system" = "gentoo" ]; then } killproc() { - start-stop-daemon --stop --exec $@ + start-stop-daemon --stop --retry 2 --exec $@ } fail_msg() { diff --git a/src/VBox/Additions/linux/installer/vboxadd-x11.sh b/src/VBox/Additions/linux/installer/vboxadd-x11.sh index 6686746b0..90ec958df 100755 --- a/src/VBox/Additions/linux/installer/vboxadd-x11.sh +++ b/src/VBox/Additions/linux/installer/vboxadd-x11.sh @@ -1,6 +1,6 @@ #! /bin/sh # -# Linux Additions X11 setup init script ($Revision: 70080 $) +# Linux Additions X11 setup init script ($Revision: 71289 $) # # @@ -319,12 +319,12 @@ setup() esac fi case $x_version in - 1.10.99.* ) + 1.*.99.* ) echo "Warning: unsupported pre-release version of X.Org Server installed. Not" echo "installing the X.Org drivers." dox11config="" ;; - 1.9.99.* | 1.10.* ) + 1.10.* ) begin "Installing X.Org Server 1.10 modules" vboxvideo_src=vboxvideo_drv_110.so vboxmouse_src=vboxmouse_drv_110.so @@ -332,7 +332,7 @@ setup() # Does Fedora still ship without vboxvideo detection? # test "$system" = "redhat" || setupxorgconf="" ;; - 1.8.99.* | 1.9.* ) + 1.9.* ) begin "Installing X.Org Server 1.9 modules" vboxvideo_src=vboxvideo_drv_19.so vboxmouse_src=vboxmouse_drv_19.so @@ -340,7 +340,7 @@ setup() # Fedora 14 looks likely to ship without vboxvideo detection # test "$system" = "redhat" || setupxorgconf="" ;; - 1.7.99.* | 1.8.* ) + 1.8.* ) begin "Installing X.Org Server 1.8 modules" vboxvideo_src=vboxvideo_drv_18.so vboxmouse_src=vboxmouse_drv_18.so @@ -348,36 +348,32 @@ setup() # Fedora 13 shipped without vboxvideo detection test "$system" = "redhat" || setupxorgconf="" ;; - 1.6.99.* | 1.7.* ) + 1.7.* ) begin "Installing X.Org Server 1.7 modules" vboxvideo_src=vboxvideo_drv_17.so vboxmouse_src=vboxmouse_drv_17.so setupxorgconf="" test "$system" = "debian" && doxorgconfd="true" ;; - 1.5.99.* | 1.6.* ) + 1.6.* ) begin "Installing X.Org Server 1.6 modules" vboxvideo_src=vboxvideo_drv_16.so vboxmouse_src=vboxmouse_drv_16.so - # SUSE with X.Org Server 1.6 knows about vboxvideo - test "$system" = "suse" && setupxorgconf="" - ;; - 1.4.99.901 | 1.4.99.902 ) - echo "Warning: you are using a pre-release version of X.Org server 1.5 which is known" - echo "not to work with the VirtualBox Guest Additions. Please update to a more" - echo "recent version (for example by installing all updates in your guest) and then" - echo "set up the Guest Additions for X.Org server by running" - echo "" - echo " /usr/lib[64]/VBoxGuestAdditions/vboxadd-x11 setup" - dox11config="" + # SUSE SLE* with X.Org 1.6 does not do input autodetection; + # openSUSE does. + if grep -q -E '^SLE[^ ]' /etc/SuSE-brand 2>/dev/null; then + automouse="" + newmouse="--newMouse" + else + test "$system" = "suse" && setupxorgconf="" + fi ;; - 1.4.99.* | 1.5.* ) - # Fedora 9 shipped X.Org Server version 1.4.99.9x (1.5.0 RC) - # in its released version + 1.5.* ) begin "Installing X.Org Server 1.5 modules" vboxvideo_src=vboxvideo_drv_15.so vboxmouse_src=vboxmouse_drv_15.so - # SUSE with X.Org 1.5 is a special case, and is handled specially + # SUSE with X.Org 1.5 is another special case, and is also + # handled specially test "$system" = "suse" && { automouse=""; newmouse="--newMouse"; } ;; @@ -492,7 +488,7 @@ setup() # This is normally silent. I have purposely not redirected # error output as I want to know if something goes wrong, # particularly if the command syntax ever changes. - udevadm trigger --action=change --subsystem-match=misc --subsystem-match=input + udevadm trigger --action=change --subsystem-match=misc fi test -d /usr/share/X11/xorg.conf.d && install -o 0 -g 0 -m 0644 "$share_dir/50-vboxmouse.conf" /usr/share/X11/xorg.conf.d @@ -640,7 +636,7 @@ EOF # Remove other files rm /etc/hal/fdi/policy/90-vboxguest.fdi 2>/dev/null rm /etc/udev/rules.d/70-xorg-vboxmouse.rules 2>/dev/null - udevadm trigger --action=change --subsystem-match=misc --subsystem-match=input 2>/dev/null + udevadm trigger --action=change --subsystem-match=misc 2>/dev/null rm /usr/lib/X11/xorg.conf.d/50-vboxmouse.conf 2>/dev/null rm /usr/share/X11/xorg.conf.d/50-vboxmouse.conf 2>/dev/null rm /usr/share/xserver-xorg/pci/vboxvideo.ids 2>/dev/null diff --git a/src/VBox/Additions/linux/sharedfolders/Makefile.module b/src/VBox/Additions/linux/sharedfolders/Makefile.module index 118c8c880..d17eced2a 100644 --- a/src/VBox/Additions/linux/sharedfolders/Makefile.module +++ b/src/VBox/Additions/linux/sharedfolders/Makefile.module @@ -176,6 +176,11 @@ ifndef INCL INCL += $(addprefix -I$(KBUILD_EXTMOD)/vboxsf,/ /include /r0drv/linux) export INCL endif +ifneq ($(wildcard $(KBUILD_EXTMOD)/vboxsf),) + MANGLING := $(KBUILD_EXTMOD)/vboxsf/include/VBox/VBoxGuestMangling.h +else + MANGLING := $(KBUILD_EXTMOD)/include/VBox/VBoxGuestMangling.h +endif KFLAGS := -D__KERNEL__ -DMODULE -DRT_OS_LINUX -DIN_RING0 -DIN_RT_R0 \ -DIN_SUP_R0 -DVBOX -DVBOX_WITH_HGCM -DIN_MODULE -DIN_GUEST_R0 # our module does not export any symbol @@ -237,7 +242,7 @@ else endif # build defs -EXTRA_CFLAGS += $(INCL) $(KFLAGS) $(KDEBUG) +EXTRA_CFLAGS += -include $(MANGLING) $(INCL) $(KFLAGS) $(KDEBUG) all: $(MODULE) diff --git a/src/VBox/Additions/linux/sharedfolders/dirops.c b/src/VBox/Additions/linux/sharedfolders/dirops.c index 5aa3c61e7..bb5eabcb0 100644 --- a/src/VBox/Additions/linux/sharedfolders/dirops.c +++ b/src/VBox/Additions/linux/sharedfolders/dirops.c @@ -774,15 +774,19 @@ static int sf_symlink(struct inode *parent, struct dentry *dentry, const char *s memcpy(ssymname->String.utf8, symname, symname_len); rc = vboxCallSymlink(&client_handle, &sf_g->map, path, ssymname, &info); + kfree(ssymname); + if (RT_FAILURE(rc)) { if (rc == VERR_WRITE_PROTECT) { err = -EROFS; - goto fail2; + goto fail1; } + LogFunc(("vboxCallSymlink(%s) failed rc=%Rrc\n", + sf_i->path->String.utf8, rc)); err = -EPROTO; - goto fail2; + goto fail1; } err = sf_instantiate(parent, dentry, path, &info, SHFL_HANDLE_NIL); @@ -790,11 +794,12 @@ static int sf_symlink(struct inode *parent, struct dentry *dentry, const char *s { LogFunc(("could not instantiate dentry for %s err=%d\n", sf_i->path->String.utf8, err)); - goto fail2; + goto fail1; } -fail2: - kfree(ssymname); + sf_i->force_restat = 1; + return 0; + fail1: kfree(path); fail0: diff --git a/src/VBox/Additions/linux/sharedfolders/files_vboxsf b/src/VBox/Additions/linux/sharedfolders/files_vboxsf index 102078690..94c98f5dc 100755 --- a/src/VBox/Additions/linux/sharedfolders/files_vboxsf +++ b/src/VBox/Additions/linux/sharedfolders/files_vboxsf @@ -27,6 +27,7 @@ FILES_VBOXSF_NOBIN=" \ ${PATH_ROOT}/include/iprt/err.h=>include/iprt/err.h \ ${PATH_ROOT}/include/iprt/fs.h=>include/iprt/fs.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/param.h=>include/iprt/param.h \ ${PATH_ROOT}/include/iprt/path.h=>include/iprt/path.h \ @@ -48,6 +49,7 @@ FILES_VBOXSF_NOBIN=" \ ${PATH_ROOT}/include/VBox/VBoxGuest.h=>include/VBox/VBoxGuest.h \ ${PATH_ROOT}/include/VBox/VBoxGuest2.h=>include/VBox/VBoxGuest2.h \ ${PATH_ROOT}/include/VBox/VBoxGuestLib.h=>include/VBox/VBoxGuestLib.h \ + ${PATH_ROOT}/include/VBox/VBoxGuestMangling.h=>include/VBox/VBoxGuestMangling.h \ ${PATH_ROOT}/include/VBox/VMMDev.h=>include/VBox/VMMDev.h \ ${PATH_ROOT}/include/VBox/VMMDev2.h=>include/VBox/VMMDev2.h \ ${PATH_ROOT}/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp=>GenericRequest.c \ diff --git a/src/VBox/Additions/linux/sharedfolders/regops.c b/src/VBox/Additions/linux/sharedfolders/regops.c index 4abd9be4b..523c458e1 100644 --- a/src/VBox/Additions/linux/sharedfolders/regops.c +++ b/src/VBox/Additions/linux/sharedfolders/regops.c @@ -472,7 +472,10 @@ static struct page *sf_reg_nopage(struct vm_area_struct *vma, unsigned long vadd } #endif - page = alloc_page(GFP_HIGHUSER); + /* Don't use GFP_HIGHUSER as long as sf_reg_read_aux() calls vboxCallRead() + * which works on virtual addresses. On Linux cannot reliably determine the + * physical address for high memory, see rtR0MemObjNativeLockKernel(). */ + page = alloc_page(GFP_USER); if (!page) { LogRelFunc(("failed to allocate page\n")); #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 25) diff --git a/src/VBox/Additions/linux/sharedfolders/vfsmod.c b/src/VBox/Additions/linux/sharedfolders/vfsmod.c index f73519f30..b0228096e 100644 --- a/src/VBox/Additions/linux/sharedfolders/vfsmod.c +++ b/src/VBox/Additions/linux/sharedfolders/vfsmod.c @@ -446,27 +446,38 @@ sf_read_super_26(struct super_block *sb, void *data, int flags) return err; } -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) +# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) static struct super_block *sf_get_sb(struct file_system_type *fs_type, int flags, - const char *dev_name, void *data) + const char *dev_name, void *data) { TRACE(); return get_sb_nodev(fs_type, flags, data, sf_read_super_26); } -#else +# elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) static int sf_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount *mnt) { TRACE(); return get_sb_nodev(fs_type, flags, data, sf_read_super_26, mnt); } -#endif +# else +static struct dentry *sf_mount(struct file_system_type *fs_type, int flags, + const char *dev_name, void *data) +{ + TRACE(); + return mount_nodev(fs_type, flags, data, sf_read_super_26); +} +# endif static struct file_system_type vboxsf_fs_type = { .owner = THIS_MODULE, .name = "vboxsf", +# if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 39) .get_sb = sf_get_sb, +# else + .mount = sf_mount, +# endif .kill_sb = kill_anon_super }; #endif diff --git a/src/VBox/Additions/solaris/Installer/postinstall.sh b/src/VBox/Additions/solaris/Installer/postinstall.sh index f7689b0aa..d1fbe74d3 100755 --- a/src/VBox/Additions/solaris/Installer/postinstall.sh +++ b/src/VBox/Additions/solaris/Installer/postinstall.sh @@ -33,11 +33,15 @@ uncompress_files() /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_15.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_16.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_17.so.Z" 1>/dev/null + /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_18.so.Z" 1>/dev/null + /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_19.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxvideo_drv_71.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_14.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_15.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_16.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_17.so.Z" 1>/dev/null + /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_18.so.Z" 1>/dev/null + /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_19.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_70.so.Z" 1>/dev/null /usr/sbin/removef $PKGINST "$1/vboxmouse_drv_71.so.Z" 1>/dev/null @@ -50,11 +54,15 @@ uncompress_files() /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_15.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_16.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_17.so" f + /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_18.so" f + /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_19.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxvideo_drv_71.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_14.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_15.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_16.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_17.so" f + /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_18.so" f + /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_19.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_70.so" f /usr/sbin/installf -c none $PKGINST "$1/vboxmouse_drv_71.so" f @@ -67,11 +75,15 @@ uncompress_files() uncompress -f "$1/vboxvideo_drv_15.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxvideo_drv_16.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxvideo_drv_17.so.Z" > /dev/null 2>&1 + uncompress -f "$1/vboxvideo_drv_18.so.Z" > /dev/null 2>&1 + uncompress -f "$1/vboxvideo_drv_19.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxvideo_drv_71.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxmouse_drv_14.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxmouse_drv_15.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxmouse_drv_16.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxmouse_drv_17.so.Z" > /dev/null 2>&1 + uncompress -f "$1/vboxmouse_drv_18.so.Z" > /dev/null 2>&1 + uncompress -f "$1/vboxmouse_drv_19.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxmouse_drv_70.so.Z" > /dev/null 2>&1 uncompress -f "$1/vboxmouse_drv_71.so.Z" > /dev/null 2>&1 } @@ -170,6 +182,14 @@ if test ! -z "$xorgbin"; then vboxmouse_src="vboxmouse_drv_17.so" vboxvideo_src="vboxvideo_drv_17.so" ;; + 1.8.*) + vboxmouse_src="vboxmouse_drv_18.so" + vboxvideo_src="vboxvideo_drv_18.so" + ;; + 1.9.*) + vboxmouse_src="vboxmouse_drv_19.so" + vboxvideo_src="vboxvideo_drv_19.so" + ;; 7.1.* | *7.2.* ) vboxmouse_src="vboxmouse_drv_71.so" vboxvideo_src="vboxvideo_drv_71.so" @@ -267,7 +287,7 @@ if test ! -z "$xorgbin"; then 7.1.* | 7.2.* | 6.9.* | 7.0.* | 1.3.* ) $vboxadditions_path/x11config.pl ;; - 1.4.* | 1.5.* | 1.6.* | 1.7.* ) + 1.4.* | 1.5.* | 1.6.* | 1.7.* | 1.8.* | 1.9.* ) $vboxadditions_path/x11config15sol.pl ;; esac diff --git a/src/VBox/Additions/solaris/Makefile.kmk b/src/VBox/Additions/solaris/Makefile.kmk index 28502d693..9a145c011 100644 --- a/src/VBox/Additions/solaris/Makefile.kmk +++ b/src/VBox/Additions/solaris/Makefile.kmk @@ -181,6 +181,8 @@ SOLARIS_ADD_XORG_DRIVERS = \ vboxmouse_drv_15.so \ vboxmouse_drv_16.so \ vboxmouse_drv_17.so \ + vboxmouse_drv_18.so \ + vboxmouse_drv_19.so \ vboxmouse_drv_70.so \ vboxmouse_drv_71.so \ vboxvideo_drv_13.so \ @@ -188,6 +190,8 @@ SOLARIS_ADD_XORG_DRIVERS = \ vboxvideo_drv_15.so \ vboxvideo_drv_16.so \ vboxvideo_drv_17.so \ + vboxvideo_drv_18.so \ + vboxvideo_drv_19.so \ vboxvideo_drv_70.so \ vboxvideo_drv_71.so @@ -431,12 +435,16 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_15.so \ $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_16.so \ $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_17.so \ + $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_18.so \ + $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_19.so \ $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_70.so \ $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_71.so \ $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_14.so \ $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_15.so \ $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_16.so \ $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_17.so \ + $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_18.so \ + $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_19.so \ $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_70.so \ $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_71.so \ $(SOLARIS_ADD_BIN_32)/vboxguest \ @@ -451,12 +459,16 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_15.so \ $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_16.so \ $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_17.so \ + $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_18.so \ + $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_19.so \ $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_70.so \ $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_71.so \ $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_14.so \ $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_15.so \ $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_16.so \ $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_17.so \ + $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_18.so \ + $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_19.so \ $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_70.so \ $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_71.so ifdef VBOX_WITH_CROGL @@ -484,12 +496,16 @@ else $(SOLARIS_ADD_BIN)/vboxvideo_drv_15.so \ $(SOLARIS_ADD_BIN)/vboxvideo_drv_16.so \ $(SOLARIS_ADD_BIN)/vboxvideo_drv_17.so \ + $(SOLARIS_ADD_BIN)/vboxvideo_drv_18.so \ + $(SOLARIS_ADD_BIN)/vboxvideo_drv_19.so \ $(SOLARIS_ADD_BIN)/vboxvideo_drv_70.so \ $(SOLARIS_ADD_BIN)/vboxvideo_drv_71.so \ $(SOLARIS_ADD_BIN)/vboxmouse_drv_14.so \ $(SOLARIS_ADD_BIN)/vboxmouse_drv_15.so \ $(SOLARIS_ADD_BIN)/vboxmouse_drv_16.so \ $(SOLARIS_ADD_BIN)/vboxmouse_drv_17.so \ + $(SOLARIS_ADD_BIN)/vboxmouse_drv_18.so \ + $(SOLARIS_ADD_BIN)/vboxmouse_drv_19.so \ $(SOLARIS_ADD_BIN)/vboxmouse_drv_70.so \ $(SOLARIS_ADD_BIN)/vboxmouse_drv_71.so ifdef VBOX_WITH_CROGL @@ -565,12 +581,16 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_15.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_15.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_16.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_16.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_17.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_17.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_18.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_18.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_19.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_19.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_70.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_70.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxvideo_drv_71.so $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_71.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_14.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_14.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_15.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_15.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_16.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_16.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_17.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_17.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_18.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_18.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_19.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_19.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_70.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_70.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_64)/vboxmouse_drv_71.so $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_71.so $(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN_64)/VBoxOGL.so $(SOLARIS_ADD_INST_DIR_64)/VBoxOGL.so @@ -592,12 +612,16 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_15.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_15.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_16.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_16.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_17.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_17.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_18.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_18.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_19.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_19.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_70.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_70.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxvideo_drv_71.so $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_71.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_14.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_14.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_15.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_15.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_16.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_16.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_17.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_17.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_18.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_18.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_19.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_19.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_70.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_70.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN_32)/vboxmouse_drv_71.so $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_71.so $(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN_32)/VBoxOGL.so $(SOLARIS_ADD_INST_DIR_32)/VBoxOGL.so @@ -617,12 +641,16 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_15.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_16.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_17.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_18.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_19.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_70.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxvideo_drv_71.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_14.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_15.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_16.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_17.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_18.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_19.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_70.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_64)/vboxmouse_drv_71.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/VBoxClient @@ -633,12 +661,16 @@ ifdef VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_15.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_16.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_17.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_18.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_19.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_70.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxvideo_drv_71.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_14.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_15.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_16.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_17.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_18.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_19.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_70.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_32)/vboxmouse_drv_71.so endif # VBOX_COMPRESS @@ -655,12 +687,16 @@ else # !VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_15.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_15.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_16.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_16.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_17.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_17.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_18.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_18.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_19.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_19.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_70.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_70.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxvideo_drv_71.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_71.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_14.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_14.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_15.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_15.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_16.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_16.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_17.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_17.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_18.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_18.so + $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_19.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_19.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_70.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_70.so $(QUIET)$(BIN_COPY) $(SOLARIS_ADD_BIN)/vboxmouse_drv_71.so $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_71.so $(QUIET)$(INSTALL) -s -m 0755 $(SOLARIS_ADD_BIN)/VBoxOGL.so $(SOLARIS_ADD_INST_DIR_ISA)/VBoxOGL.so @@ -680,12 +716,16 @@ else # !VBOX_WITH_COMBINED_SOLARIS_GUEST_PACKAGE $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_15.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_16.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_17.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_18.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_19.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_70.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxvideo_drv_71.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_14.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_15.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_16.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_17.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_18.so + $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_19.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_70.so $(QUIET)$(VBOX_COMPRESS) $(SOLARIS_ADD_INST_DIR_ISA)/vboxmouse_drv_71.so endif # VBOX_COMPRESS diff --git a/src/VBox/Additions/x11/vboxmouse/Makefile.kmk b/src/VBox/Additions/x11/vboxmouse/Makefile.kmk index 7c84ee86b..5a3183f89 100644 --- a/src/VBox/Additions/x11/vboxmouse/Makefile.kmk +++ b/src/VBox/Additions/x11/vboxmouse/Makefile.kmk @@ -226,7 +226,7 @@ vboxmouse_drv_110_INCS := \ $(VBOX_PATH_X11_ROOT)/libpciaccess-0.10.8 \ $(VBOX_PATH_X11_ROOT)/pixman-0.16.0 \ $(VBOX_PATH_X11_ROOT)/xextproto-7.1.1 \ - $(VBOX_PATH_X11_ROOT)/xorg-server-1.9.99.901+git20110131.be3be758 \ + $(VBOX_PATH_X11_ROOT)/xorg-server-1.10.0 \ $(VBOX_PATH_X11_ROOT)/xorg-server-1.6.0-local \ $(VBOX_PATH_X11_ROOT)/xproto-7.0.18 \ $(PATH_SUB_CURRENT) @@ -325,9 +325,9 @@ $$(vboxmouse_drv_19_0_OUTDIR)/tstvboxmouse19.run: $$(INSTARGET_vboxmouse_drv_19) $(INSTARGET_vboxmouse_drv_19) $(VBOXMOUSE_SRC_PATH)/undefined_15 $(QUIET)$(APPEND) -t "$@" "done" - TESTING += $(vboxmouse_drv_110_0_OUTDIR)/tstvboxmouse19.run - OTHERS += $(vboxmouse_drv_110_0_OUTDIR)/tstvboxmouse19.run -$$(vboxmouse_drv_110_0_OUTDIR)/tstvboxmouse19.run: $$(INSTARGET_vboxmouse_drv_110) + TESTING += $(vboxmouse_drv_110_0_OUTDIR)/tstvboxmouse110.run + OTHERS += $(vboxmouse_drv_110_0_OUTDIR)/tstvboxmouse110.run +$$(vboxmouse_drv_110_0_OUTDIR)/tstvboxmouse110.run: $$(INSTARGET_vboxmouse_drv_110) $(QUIET)$(call MSG_L1,Checking for unresolved symbols in $<) $(QUIET)/bin/sh $(PATH_ROOT)/src/bldprogs/checkUndefined.sh $(KBUILD_TARGET) \ $(INSTARGET_vboxmouse_drv_110) $(VBOXMOUSE_SRC_PATH)/undefined_15 diff --git a/src/VBox/Additions/x11/vboxvideo/Makefile.kmk b/src/VBox/Additions/x11/vboxvideo/Makefile.kmk index 224ddf6b9..fe6d31a0c 100644 --- a/src/VBox/Additions/x11/vboxvideo/Makefile.kmk +++ b/src/VBox/Additions/x11/vboxvideo/Makefile.kmk @@ -310,7 +310,7 @@ vboxvideo_drv_110_INCS = \ $(VBOX_PATH_X11_ROOT)/renderproto-0.11 \ $(VBOX_PATH_X11_ROOT)/xextproto-7.1.1 \ $(VBOX_PATH_X11_ROOT)/xf86driproto-2.1.0 \ - $(VBOX_PATH_X11_ROOT)/xorg-server-1.9.99.901+git20110131.be3be758 \ + $(VBOX_PATH_X11_ROOT)/xorg-server-1.10.0 \ $(VBOX_PATH_X11_ROOT)/xorg-server-1.6.0-local \ $(VBOX_PATH_X11_ROOT)/xproto-7.0.18 vboxvideo_drv_110_INCS += $(PATH_ROOT)/src/VBox/Runtime/include diff --git a/src/VBox/Devices/Audio/dsoundaudio.c b/src/VBox/Devices/Audio/dsoundaudio.c index a0ce014b2..68f31eec1 100644 --- a/src/VBox/Devices/Audio/dsoundaudio.c +++ b/src/VBox/Devices/Audio/dsoundaudio.c @@ -988,7 +988,7 @@ static void dsound_audio_fini (void *opaque) dsound *s = opaque; if (!s->dsound) { - return; + goto dsound_audio_fini_exit; } hr = IDirectSound_Release (s->dsound); @@ -998,7 +998,7 @@ static void dsound_audio_fini (void *opaque) s->dsound = NULL; if (!s->dsound_capture) { - return; + goto dsound_audio_fini_exit; } hr = IDirectSoundCapture_Release (s->dsound_capture); @@ -1006,6 +1006,9 @@ static void dsound_audio_fini (void *opaque) dsound_logerr (hr, "Could not release DirectSoundCapture\n"); } s->dsound_capture = NULL; + +dsound_audio_fini_exit: + CoUninitialize(); } static void *dsound_audio_init (void) @@ -1039,6 +1042,7 @@ static void *dsound_audio_init (void) LogRel(("DSound: Could not create DirectSound instance\n")); dsound_log_hresult(hr); #endif + CoUninitialize(); return NULL; } @@ -1056,6 +1060,7 @@ static void *dsound_audio_init (void) dsound_logerr (hr, "Could not release DirectSound\n"); } s->dsound = NULL; + CoUninitialize(); return NULL; } diff --git a/src/VBox/Devices/Audio/filteraudio.c b/src/VBox/Devices/Audio/filteraudio.c index df54ccf02..4a3bf9782 100644 --- a/src/VBox/Devices/Audio/filteraudio.c +++ b/src/VBox/Devices/Audio/filteraudio.c @@ -602,6 +602,13 @@ static int filteraudio_run_in(HWVoiceIn *phw) if (!pVoice->fIntercepted) { + if (!pVoice->fHostOK) + { + /* Host did not initialize the voice. */ + Log(("FilterAudio: [Input]: run_in voice %p (hw %p) not available on host\n", pVoice, pVoice->phw)); + return -1; + } + Log(("FilterAudio: [Input]: forwarding run_in for voice %p (hw %p)\n", pVoice, pVoice->phw)); return filter_conf.pDrv->pcm_ops->run_in(phw); } diff --git a/src/VBox/Devices/EFI/Thunk/EfiThunk.asm b/src/VBox/Devices/EFI/Thunk/EfiThunk.asm index 5fdfff423..728c050f0 100644 --- a/src/VBox/Devices/EFI/Thunk/EfiThunk.asm +++ b/src/VBox/Devices/EFI/Thunk/EfiThunk.asm @@ -75,7 +75,7 @@ efi_thunk_GDT: dw 0xffff, 0, 0x9300, 0x0000 ; 16 bit data segment base=0x0 limit=0xffff - FIXME: ditto. dw 0xffff, 0, 0x9300, 0x00cf ; 32 bit flat stack segment (0x30) dw 0xffff, 0, 0x9a00, 0x00af ; 64 bit flat code segment (0x38) - dw 0, 0, 0, 0 ; ditto + dw 0xffff, 0, 0x8900, 0x0080 ; 64 bit TSS descriptor (0x40) dw 0, 0, 0, 0 ; ditto ;; For lidt @@ -91,7 +91,7 @@ efi_thunk_gdtr: dw efi_thunk_GDT ; base 15:00 db 0x0f ; base 23:16 db 0x00 ; unused - + BITS 32 ;; @@ -223,38 +223,38 @@ trampoline_64: loop %%loop %endmacro -%define base 0x800000;0xfffff000 +%define base 0x800000;0xfffff000 mov ecx, 0x800 ; pde size mov ebx, base - (6 << X86_PAGE_4K_SHIFT) xor eax, eax - ;; or flags to eax - or eax, (X86_PDE_P|X86_PDE_A|X86_PDE_PS|X86_PDE_PCD|X86_PDE_RW|RT_BIT(6)) + ;; or flags to eax + or eax, (X86_PDE_P|X86_PDE_A|X86_PDE_PS|X86_PDE_PCD|X86_PDE_RW|RT_BIT(6)) fill_pkt (1 << X86_PAGE_2M_SHIFT) ;; pdpt (1st 4 entries describe 4Gb) mov ebx, base - (2 << X86_PAGE_4K_SHIFT) - mov eax, base - (6 << X86_PAGE_4K_SHIFT) ;; + mov eax, base - (6 << X86_PAGE_4K_SHIFT) ;; or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD) mov [ebx],eax xor edx,edx mov [ebx + 4], edx add ebx, 8 - mov eax, base - 5 * (1 << X86_PAGE_4K_SHIFT) ;; + mov eax, base - 5 * (1 << X86_PAGE_4K_SHIFT) ;; or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD) mov [ebx],eax xor edx,edx mov [ebx + 4], edx add ebx, 8 - mov eax, base - 4 * (1 << X86_PAGE_4K_SHIFT) ;; + mov eax, base - 4 * (1 << X86_PAGE_4K_SHIFT) ;; or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD) mov [ebx],eax xor edx,edx mov [ebx + 4], edx add ebx, 8 - mov eax, base - 3 * (1 << X86_PAGE_4K_SHIFT) ;; + mov eax, base - 3 * (1 << X86_PAGE_4K_SHIFT) ;; or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD) mov [ebx],eax xor edx,edx @@ -263,16 +263,16 @@ trampoline_64: mov ecx, 0x1f7 ; pdte size mov ebx, base - 2 * (1 << X86_PAGE_4K_SHIFT) + 4 * 8 - mov eax, base - 6 * (1 << X86_PAGE_4K_SHIFT);; + mov eax, base - 6 * (1 << X86_PAGE_4K_SHIFT);; or eax, (X86_PDPE_P|X86_PDPE_RW|X86_PDPE_A|X86_PDPE_PCD) - ;; or flags to eax + ;; or flags to eax fill_pkt 3 * (1 << X86_PAGE_4K_SHIFT) - + mov ecx, 0x200 ; pml4 size mov ebx, base - (1 << X86_PAGE_4K_SHIFT) - mov eax, base - 2 * (1 << X86_PAGE_4K_SHIFT) ;; + mov eax, base - 2 * (1 << X86_PAGE_4K_SHIFT) ;; or eax, (X86_PML4E_P|X86_PML4E_PCD|X86_PML4E_A|X86_PML4E_RW) - ;; or flags to eax + ;; or flags to eax fill_pkt 0 mov eax, base - (1 << X86_PAGE_4K_SHIFT) @@ -282,12 +282,15 @@ trampoline_64: mov eax,cr4 or eax, X86_CR4_PAE|X86_CR4_OSFSXR|X86_CR4_OSXMMEEXCPT mov cr4,eax - + mov ecx, MSR_K6_EFER rdmsr or eax, MSR_K6_EFER_LME wrmsr + mov ax, 0x40 + ltr ax + mov eax, cr0 or eax, X86_CR0_PG mov cr0, eax diff --git a/src/VBox/Devices/Network/DevINIP.cpp b/src/VBox/Devices/Network/DevINIP.cpp index 4189cc679..5a44d8782 100644 --- a/src/VBox/Devices/Network/DevINIP.cpp +++ b/src/VBox/Devices/Network/DevINIP.cpp @@ -74,6 +74,8 @@ typedef struct DEVINTNETIP PDMIBASE IBase; /** The network port this device provides (LUN\#0). */ PDMINETWORKDOWN INetworkDown; + /** Tzhe network configuration port this device provides (LUN\#0). */ + PDMINETWORKCONFIG INetworkConfig; /** The base interface of the network driver below us. */ PPDMIBASE pDrvBase; /** The connector of the network driver below us. */ @@ -101,6 +103,8 @@ typedef struct DEVINTNETIP /** hack: get linking right. remove this eventually, once the device * provides a proper interface to all IP stack functions. */ const void *pLinkHack; + /** Flag whether the link is up. */ + bool fLnkUp; } DEVINTNETIP, *PDEVINTNETIP; @@ -225,6 +229,11 @@ static DECLCALLBACK(err_t) devINIPOutputRaw(struct netif *netif, if (g_pDevINIPData) { PPDMSCATTERGATHER pSgBuf; + + rc = g_pDevINIPData->pDrv->pfnBeginXmit(g_pDevINIPData->pDrv, true /* fOnWorkerThread */); + if (RT_FAILURE(rc)) + return ERR_IF; + rc = g_pDevINIPData->pDrv->pfnAllocBuf(g_pDevINIPData->pDrv, DEVINIP_MAX_FRAME, NULL /*pGso*/, &pSgBuf); if (RT_SUCCESS(rc)) { @@ -252,7 +261,10 @@ static DECLCALLBACK(err_t) devINIPOutputRaw(struct netif *netif, } } if (cbBuf) - rc = g_pDevINIPData->pDrv->pfnSendBuf(g_pDevINIPData->pDrv, pSgBuf, false); + { + pSgBuf->cbUsed = cbBuf; + rc = g_pDevINIPData->pDrv->pfnSendBuf(g_pDevINIPData->pDrv, pSgBuf, true /* fOnWorkerThread */); + } else rc = g_pDevINIPData->pDrv->pfnFreeBuf(g_pDevINIPData->pDrv, pSgBuf); @@ -260,6 +272,8 @@ static DECLCALLBACK(err_t) devINIPOutputRaw(struct netif *netif, lwip_pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */ #endif } + + g_pDevINIPData->pDrv->pfnEndXmit(g_pDevINIPData->pDrv); } err_t lrc = ERR_OK; @@ -399,6 +413,68 @@ static DECLCALLBACK(void) devINIPTcpipInitDone(void *arg) lwip_sys_sem_signal(*sem); } + +/** + * Gets the current Media Access Control (MAC) address. + * + * @returns VBox status code. + * @param pInterface Pointer to the interface structure containing the called function pointer. + * @param pMac Where to store the MAC address. + * @thread EMT + */ +static DECLCALLBACK(int) devINIPGetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac) +{ + PDEVINTNETIP pThis = RT_FROM_MEMBER(pInterface, DEVINTNETIP, INetworkConfig); + memcpy(pMac, pThis->MAC.au8, sizeof(RTMAC)); + return VINF_SUCCESS; +} + +/** + * Gets the new link state. + * + * @returns The current link state. + * @param pInterface Pointer to the interface structure containing the called function pointer. + * @thread EMT + */ +static DECLCALLBACK(PDMNETWORKLINKSTATE) devINIPGetLinkState(PPDMINETWORKCONFIG pInterface) +{ + PDEVINTNETIP pThis = RT_FROM_MEMBER(pInterface, DEVINTNETIP, INetworkConfig); + if (pThis->fLnkUp) + return PDMNETWORKLINKSTATE_UP; + return PDMNETWORKLINKSTATE_DOWN; +} + + +/** + * Sets the new link state. + * + * @returns VBox status code. + * @param pInterface Pointer to the interface structure containing the called function pointer. + * @param enmState The new link state + */ +static DECLCALLBACK(int) devINIPSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState) +{ + PDEVINTNETIP pThis = RT_FROM_MEMBER(pInterface, DEVINTNETIP, INetworkConfig); + bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP; + + if (fNewUp != pThis->fLnkUp) + { + if (fNewUp) + { + LogFlowFunc(("Link is up\n")); + pThis->fLnkUp = true; + } + else + { + LogFlowFunc(("Link is down\n")); + pThis->fLnkUp = false; + } + if (pThis->pDrv) + pThis->pDrv->pfnNotifyLinkChanged(pThis->pDrv, enmState); + } + return VINF_SUCCESS; +} + /* -=-=-=-=- PDMIBASE -=-=-=-=- */ /** @@ -410,6 +486,7 @@ static DECLCALLBACK(void *) devINIPQueryInterface(PPDMIBASE pInterface, PDEVINTNETIP pThis = RT_FROM_MEMBER(pInterface, DEVINTNETIP, IBase); PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pThis->IBase); PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKDOWN, &pThis->INetworkDown); + PDMIBASE_RETURN_INTERFACE(pszIID, PDMINETWORKCONFIG, &pThis->INetworkConfig); return NULL; } @@ -490,6 +567,10 @@ static DECLCALLBACK(int) devINIPConstruct(PPDMDEVINS pDevIns, int iInstance, pThis->INetworkDown.pfnWaitReceiveAvail = devINIPNetworkDown_WaitInputAvail; pThis->INetworkDown.pfnReceive = devINIPNetworkDown_Input; pThis->INetworkDown.pfnXmitPending = devINIPNetworkDown_XmitPending; + /* INetworkConfig */ + pThis->INetworkConfig.pfnGetMac = devINIPGetMac; + pThis->INetworkConfig.pfnGetLinkState = devINIPGetLinkState; + pThis->INetworkConfig.pfnSetLinkState = devINIPSetLinkState; /* * Get the configuration settings. diff --git a/src/VBox/Devices/Network/DrvIntNet.cpp b/src/VBox/Devices/Network/DrvIntNet.cpp index c7022b291..11910b371 100644 --- a/src/VBox/Devices/Network/DrvIntNet.cpp +++ b/src/VBox/Devices/Network/DrvIntNet.cpp @@ -182,6 +182,19 @@ AssertCompileMemberAlignment(DRVINTNET, StatSentGso, 8); /** Pointer to instance data of the internal networking driver. */ typedef DRVINTNET *PDRVINTNET; +/** + * Config value to flag translation structure. + */ +typedef struct DRVINTNETFLAG +{ + /** The value. */ + const char *pszChoice; + /** The corresponding flag. */ + uint32_t fFlag; +} DRVINTNETFLAG; +/** Pointer to a const flag value translation. */ +typedef DRVINTNETFLAG const *PCDRVINTNETFLAG; + #ifdef IN_RING3 @@ -1133,7 +1146,7 @@ static DECLCALLBACK(void) drvR3IntNetDestruct(PPDMDRVINS pDrvIns) AbortWaitReq.hIf = pThis->hIf; AbortWaitReq.fNoMoreWaits = true; int rc = PDMDrvHlpSUPCallVMMR0Ex(pDrvIns, VMMR0_DO_INTNET_IF_ABORT_WAIT, &AbortWaitReq, sizeof(AbortWaitReq)); - AssertRC(rc); + AssertMsg(RT_SUCCESS(rc) || rc == VERR_SEM_DESTROYED, ("%Rrc\n", rc)); } /* @@ -1217,6 +1230,73 @@ static DECLCALLBACK(void) drvR3IntNetDestruct(PPDMDRVINS pDrvIns) /** + * Queries a policy config value and translates it into open network flag. + * + * @returns VBox status code (error set on failure). + * @param pDrvIns The driver instance. + * @param pszName The value name. + * @param paFlags The open network flag descriptors. + * @param cFlags The number of descriptors. + * @param fFlags The fixed flag. + * @param pfFlags The flags variable to update. + */ +static int drvIntNetR3CfgGetPolicy(PPDMDRVINS pDrvIns, const char *pszName, PCDRVINTNETFLAG paFlags, size_t cFlags, + uint32_t fFixedFlag, uint32_t *pfFlags) +{ + char szValue[64]; + int rc = CFGMR3QueryString(pDrvIns->pCfg, pszName, szValue, sizeof(szValue)); + if (RT_FAILURE(rc)) + { + if (rc == VERR_CFGM_VALUE_NOT_FOUND) + return VINF_SUCCESS; + return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, + N_("Configuration error: Failed to query value of \"%s\""), pszName); + } + + /* + * Check for +fixed first, so it can be stripped off. + */ + char *pszSep = strpbrk(szValue, "+,;"); + if (pszSep) + { + *pszSep++ = '\0'; + const char *pszFixed = RTStrStripL(pszSep); + if (strcmp(pszFixed, "fixed")) + { + *pszSep = '+'; + return PDMDrvHlpVMSetError(pDrvIns, VERR_INVALID_PARAMETER, RT_SRC_POS, + N_("Configuration error: The value of \"%s\" is unknown: \"%s\""), pszName, szValue); + } + *pfFlags |= fFixedFlag; + RTStrStripR(szValue); + } + + /* + * Match against the flag values. + */ + size_t i = cFlags; + while (i-- > 0) + if (!strcmp(paFlags[i].pszChoice, szValue)) + { + *pfFlags |= paFlags[i].fFlag; + return VINF_SUCCESS; + } + + if (!strcmp(szValue, "none")) + return VINF_SUCCESS; + + if (!strcmp(szValue, "fixed")) + { + *pfFlags |= fFixedFlag; + return VINF_SUCCESS; + } + + return PDMDrvHlpVMSetError(pDrvIns, VERR_INVALID_PARAMETER, RT_SRC_POS, + N_("Configuration error: The value of \"%s\" is unknown: \"%s\""), pszName, szValue); +} + + +/** * Construct a TAP network transport driver instance. * * @copydoc FNPDMDRVCONSTRUCT @@ -1225,7 +1305,6 @@ static DECLCALLBACK(int) drvR3IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg { PDRVINTNET pThis = PDMINS_2_DATA(pDrvIns, PDRVINTNET); bool f; - bool fIgnoreConnectFailure; PDMDRV_CHECK_VERSIONS_RETURN(pDrvIns); /* @@ -1260,25 +1339,26 @@ static DECLCALLBACK(int) drvR3IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg /* * Validate the config. */ - if (!CFGMR3AreValuesValid(pCfg, - "Network\0" - "Trunk\0" - "TrunkType\0" - "ReceiveBufferSize\0" - "SendBufferSize\0" - "RestrictAccess\0" - "SharedMacOnWire\0" - "IgnoreAllPromisc\0" - "QuietlyIgnoreAllPromisc\0" - "IgnoreClientPromisc\0" - "QuietlyIgnoreClientPromisc\0" - "IgnoreTrunkWirePromisc\0" - "QuietlyIgnoreTrunkWirePromisc\0" - "IgnoreTrunkHostPromisc\0" - "IgnoreConnectFailure\0" - "QuietlyIgnoreTrunkHostPromisc\0" - "IsService\0")) - return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES; + PDMDRV_VALIDATE_CONFIG_RETURN(pDrvIns, + "Network" + "|Trunk" + "|TrunkType" + "|ReceiveBufferSize" + "|SendBufferSize" + "|SharedMacOnWire" + "|RestrictAccess" + "|RequireExactPolicyMatch" + "|RequireAsRestrictivePolicy" + "|AccessPolicy" + "|PromiscPolicyClients" + "|PromiscPolicyHost" + "|PromiscPolicyWire" + "|IfPolicyPromisc" + "|TrunkPolicyHost" + "|TrunkPolicyWire" + "|IsService" + "|IgnoreConnectFailure", + ""); /* * Check that no-one is attached to us. @@ -1302,7 +1382,7 @@ static DECLCALLBACK(int) drvR3IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg * Read the configuration. */ INTNETOPENREQ OpenReq; - memset(&OpenReq, 0, sizeof(OpenReq)); + RT_ZERO(OpenReq); OpenReq.Hdr.cbReq = sizeof(OpenReq); OpenReq.Hdr.u32Magic = SUPVMMR0REQHDR_MAGIC; OpenReq.pSession = NIL_RTR0PTR; @@ -1338,117 +1418,7 @@ static DECLCALLBACK(int) drvR3IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg return PDMDRV_SET_ERROR(pDrvIns, rc, N_("Configuration error: Failed to get the \"Trunk\" value")); - /** @cfgm{RestrictAccess, boolean, true} - * Whether to restrict the access to the network or if it should be public. Everyone on - * the computer can connect to a public network. Don't change this. - */ - bool fRestrictAccess; - rc = CFGMR3QueryBool(pCfg, "RestrictAccess", &fRestrictAccess); - if (rc == VERR_CFGM_VALUE_NOT_FOUND) - fRestrictAccess = true; - else if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"RestrictAccess\" value")); - OpenReq.fFlags = fRestrictAccess ? 0 : INTNET_OPEN_FLAGS_PUBLIC; - - /** @cfgm{IgnoreAllPromisc, boolean, false} - * When set all request for operating any interface or trunk in promiscuous - * mode will be ignored. */ - rc = CFGMR3QueryBoolDef(pCfg, "IgnoreAllPromisc", &f, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"IgnoreAllPromisc\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_IGNORE_PROMISC; - - /** @cfgm{QuietlyIgnoreAllPromisc, boolean, false} - * When set all request for operating any interface or trunk in promiscuous - * mode will be ignored. This differs from IgnoreAllPromisc in that clients - * won't get VERR_INTNET_INCOMPATIBLE_FLAGS. */ - rc = CFGMR3QueryBoolDef(pCfg, "QuietlyIgnoreAllPromisc", &f, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"QuietlyIgnoreAllPromisc\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_QUIETLY_IGNORE_PROMISC; - - /** @cfgm{IgnoreClientPromisc, boolean, false} - * When set all request for operating any non-trunk interface in promiscuous - * mode will be ignored. */ - rc = CFGMR3QueryBoolDef(pCfg, "IgnoreClientPromisc", &f, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"IgnoreClientPromisc\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_IGNORE_PROMISC; /** @todo add special flag for this. */ - - /** @cfgm{QuietlyIgnoreClientPromisc, boolean, false} - * When set all request for operating any non-trunk interface promiscuous mode - * will be ignored. This differs from IgnoreClientPromisc in that clients won't - * get VERR_INTNET_INCOMPATIBLE_FLAGS. */ - rc = CFGMR3QueryBoolDef(pCfg, "QuietlyIgnoreClientPromisc", &f, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"QuietlyIgnoreClientPromisc\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_QUIETLY_IGNORE_PROMISC; /** @todo add special flag for this. */ - - /** @cfgm{IgnoreTrunkWirePromisc, boolean, false} - * When set all request for operating the trunk-wire connection in promiscuous - * mode will be ignored. */ - rc = CFGMR3QueryBoolDef(pCfg, "IgnoreTrunkWirePromisc", &f, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"IgnoreTrunkWirePromisc\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_IGNORE_PROMISC_TRUNK_WIRE; - - /** @cfgm{QuietlyIgnoreTrunkWirePromisc, boolean, false} - * When set all request for operating any trunk-wire connection promiscuous mode - * will be ignored. This differs from IgnoreTrunkWirePromisc in that clients - * won't get VERR_INTNET_INCOMPATIBLE_FLAGS. */ - rc = CFGMR3QueryBoolDef(pCfg, "QuietlyIgnoreTrunkWirePromisc", &f, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"QuietlyIgnoreTrunkWirePromisc\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_QUIETLY_IGNORE_PROMISC_TRUNK_WIRE; - - /** @cfgm{IgnoreTrunkHostPromisc, boolean, false} - * When set all request for operating the trunk-host connection in promiscuous - * mode will be ignored. */ - rc = CFGMR3QueryBoolDef(pCfg, "IgnoreTrunkHostPromisc", &f, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"IgnoreTrunkHostPromisc\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_IGNORE_PROMISC_TRUNK_HOST; - - /** @cfgm{QuietlyIgnoreTrunkHostPromisc, boolean, false} - * When set all request for operating any trunk-host connection promiscuous mode - * will be ignored. This differs from IgnoreTrunkHostPromisc in that clients - * won't get VERR_INTNET_INCOMPATIBLE_FLAGS. */ - rc = CFGMR3QueryBoolDef(pCfg, "QuietlyIgnoreTrunkHostPromisc", &f, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"QuietlyIgnoreTrunkHostPromisc\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_QUIETLY_IGNORE_PROMISC_TRUNK_HOST; - - /** @todo flags for not sending to the host and for setting the trunk-wire - * connection in promiscuous mode. */ - - - /** @cfgm{IgnoreConnectFailure, boolean, false} - * When set only raise a runtime error if we cannot connect to the internal - * network. */ - rc = CFGMR3QueryBoolDef(pCfg, "IgnoreConnectFailure", &fIgnoreConnectFailure, false); - if (RT_FAILURE(rc)) - return PDMDRV_SET_ERROR(pDrvIns, rc, - N_("Configuration error: Failed to get the \"IgnoreConnectFailure\" value")); - if (f) - OpenReq.fFlags |= INTNET_OPEN_FLAGS_IGNORE_PROMISC; - + OpenReq.fFlags = 0; /** @cfgm{SharedMacOnWire, boolean, false} * Whether to shared the MAC address of the host interface when using the wire. When @@ -1462,6 +1432,123 @@ static DECLCALLBACK(int) drvR3IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg if (fSharedMacOnWire) OpenReq.fFlags |= INTNET_OPEN_FLAGS_SHARED_MAC_ON_WIRE; + /** @cfgm{RestrictAccess, boolean, true} + * Whether to restrict the access to the network or if it should be public. + * Everyone on the computer can connect to a public network. + * @deprecated Use AccessPolicy instead. + */ + rc = CFGMR3QueryBool(pCfg, "RestrictAccess", &f); + if (RT_SUCCESS(rc)) + { + if (f) + OpenReq.fFlags |= INTNET_OPEN_FLAGS_ACCESS_RESTRICTED; + else + OpenReq.fFlags |= INTNET_OPEN_FLAGS_ACCESS_PUBLIC; + OpenReq.fFlags |= INTNET_OPEN_FLAGS_ACCESS_FIXED; + } + else if (rc != VERR_CFGM_VALUE_NOT_FOUND) + return PDMDRV_SET_ERROR(pDrvIns, rc, + N_("Configuration error: Failed to get the \"RestrictAccess\" value")); + + + /** @cfgm{AccessPolicy, string, "none"} + * The access policy of the network: + * public, public+fixed, restricted, restricted+fixed, none or fixed. + * + * A "public" network is accessible to everyone on the same host, while a + * "restricted" one is only accessible to VMs & services started by the + * same user. The "none" policy, which is the default, means no policy + * change or choice is made and that the current (existing network) or + * default (new) policy should be used. */ + static const DRVINTNETFLAG s_aAccessPolicyFlags[] = + { + { "public", INTNET_OPEN_FLAGS_ACCESS_PUBLIC }, + { "restricted", INTNET_OPEN_FLAGS_ACCESS_RESTRICTED } + }; + rc = drvIntNetR3CfgGetPolicy(pDrvIns, "AccessPolicy", &s_aAccessPolicyFlags[0], RT_ELEMENTS(s_aAccessPolicyFlags), + INTNET_OPEN_FLAGS_ACCESS_FIXED, &OpenReq.fFlags); + AssertRCReturn(rc, rc); + + /** @cfgm{PromiscPolicyClients, string, "none"} + * The network wide promiscuous mode policy for client (non-trunk) + * interfaces: allow, allow+fixed, deny, deny+fixed, none or fixed. */ + static const DRVINTNETFLAG s_aPromiscPolicyClient[] = + { + { "allow", INTNET_OPEN_FLAGS_PROMISC_ALLOW_CLIENTS }, + { "deny", INTNET_OPEN_FLAGS_PROMISC_DENY_CLIENTS } + }; + rc = drvIntNetR3CfgGetPolicy(pDrvIns, "PromiscPolicyClients", &s_aPromiscPolicyClient[0], RT_ELEMENTS(s_aPromiscPolicyClient), + INTNET_OPEN_FLAGS_PROMISC_FIXED, &OpenReq.fFlags); + AssertRCReturn(rc, rc); + /** @cfgm{PromiscPolicyHost, string, "none"} + * The promiscuous mode policy for the trunk-host + * connection: allow, allow+fixed, deny, deny+fixed, none or fixed. */ + static const DRVINTNETFLAG s_aPromiscPolicyHost[] = + { + { "allow", INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_HOST }, + { "deny", INTNET_OPEN_FLAGS_PROMISC_DENY_TRUNK_HOST } + }; + rc = drvIntNetR3CfgGetPolicy(pDrvIns, "PromiscPolicyHost", &s_aPromiscPolicyHost[0], RT_ELEMENTS(s_aPromiscPolicyHost), + INTNET_OPEN_FLAGS_PROMISC_FIXED, &OpenReq.fFlags); + AssertRCReturn(rc, rc); + /** @cfgm{PromiscPolicyWire, string, "none"} + * The promiscuous mode policy for the trunk-host + * connection: allow, allow+fixed, deny, deny+fixed, none or fixed. */ + static const DRVINTNETFLAG s_aPromiscPolicyWire[] = + { + { "allow", INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_WIRE }, + { "deny", INTNET_OPEN_FLAGS_PROMISC_DENY_TRUNK_WIRE } + }; + rc = drvIntNetR3CfgGetPolicy(pDrvIns, "PromiscPolicyWire", &s_aPromiscPolicyWire[0], RT_ELEMENTS(s_aPromiscPolicyWire), + INTNET_OPEN_FLAGS_PROMISC_FIXED, &OpenReq.fFlags); + AssertRCReturn(rc, rc); + + + /** @cfgm{IfPolicyPromisc, string, "none"} + * The promiscuous mode policy for this + * interface: deny, deny+fixed, allow-all, allow-all+fixed, allow-network, + * allow-network+fixed, none or fixed. */ + static const DRVINTNETFLAG s_aIfPolicyPromisc[] = + { + { "allow-all", INTNET_OPEN_FLAGS_IF_PROMISC_ALLOW | INTNET_OPEN_FLAGS_IF_PROMISC_SEE_TRUNK }, + { "allow-network", INTNET_OPEN_FLAGS_IF_PROMISC_ALLOW | INTNET_OPEN_FLAGS_IF_PROMISC_NO_TRUNK }, + { "deny", INTNET_OPEN_FLAGS_IF_PROMISC_DENY } + }; + rc = drvIntNetR3CfgGetPolicy(pDrvIns, "IfPolicyPromisc", &s_aIfPolicyPromisc[0], RT_ELEMENTS(s_aIfPolicyPromisc), + INTNET_OPEN_FLAGS_IF_FIXED, &OpenReq.fFlags); + AssertRCReturn(rc, rc); + + + /** @cfgm{TrunkPolicyHost, string, "none"} + * The trunk-host policy: promisc, promisc+fixed, enabled, enabled+fixed, + * disabled, disabled+fixed, none or fixed + * + * This can be used to prevent packages to be routed to the host. */ + static const DRVINTNETFLAG s_aTrunkPolicyHost[] = + { + { "promisc", INTNET_OPEN_FLAGS_TRUNK_HOST_ENABLED | INTNET_OPEN_FLAGS_TRUNK_HOST_PROMISC_MODE }, + { "enabled", INTNET_OPEN_FLAGS_TRUNK_HOST_ENABLED }, + { "disabled", INTNET_OPEN_FLAGS_TRUNK_HOST_DISABLED } + }; + rc = drvIntNetR3CfgGetPolicy(pDrvIns, "TrunkPolicyHost", &s_aTrunkPolicyHost[0], RT_ELEMENTS(s_aTrunkPolicyHost), + INTNET_OPEN_FLAGS_TRUNK_FIXED, &OpenReq.fFlags); + AssertRCReturn(rc, rc); + /** @cfgm{TrunkPolicyWire, string, "none"} + * The trunk-host policy: promisc, promisc+fixed, enabled, enabled+fixed, + * disabled, disabled+fixed, none or fixed. + * + * This can be used to prevent packages to be routed to the wire. */ + static const DRVINTNETFLAG s_aTrunkPolicyWire[] = + { + { "promisc", INTNET_OPEN_FLAGS_TRUNK_WIRE_ENABLED | INTNET_OPEN_FLAGS_TRUNK_WIRE_PROMISC_MODE }, + { "enabled", INTNET_OPEN_FLAGS_TRUNK_WIRE_ENABLED }, + { "disabled", INTNET_OPEN_FLAGS_TRUNK_WIRE_DISABLED } + }; + rc = drvIntNetR3CfgGetPolicy(pDrvIns, "TrunkPolicyWire", &s_aTrunkPolicyWire[0], RT_ELEMENTS(s_aTrunkPolicyWire), + INTNET_OPEN_FLAGS_TRUNK_FIXED, &OpenReq.fFlags); + AssertRCReturn(rc, rc); + + /** @cfgm{ReceiveBufferSize, uint32_t, 318 KB} * The size of the receive buffer. */ @@ -1503,9 +1590,19 @@ static DECLCALLBACK(int) drvR3IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg return PDMDRV_SET_ERROR(pDrvIns, rc, N_("Configuration error: Failed to get the \"IsService\" value")); - LogRel(("IntNet#%u: szNetwork={%s} enmTrunkType=%d szTrunk={%s} fFlags=%#x cbRecv=%u cbSend=%u\n", + + /** @cfgm{IgnoreConnectFailure, boolean, false} + * When set only raise a runtime error if we cannot connect to the internal + * network. */ + bool fIgnoreConnectFailure; + rc = CFGMR3QueryBoolDef(pCfg, "IgnoreConnectFailure", &fIgnoreConnectFailure, false); + if (RT_FAILURE(rc)) + return PDMDRV_SET_ERROR(pDrvIns, rc, + N_("Configuration error: Failed to get the \"IgnoreConnectFailure\" value")); + + LogRel(("IntNet#%u: szNetwork={%s} enmTrunkType=%d szTrunk={%s} fFlags=%#x cbRecv=%u cbSend=%u fIgnoreConnectFailure=%RTbool\n", pDrvIns->iInstance, OpenReq.szNetwork, OpenReq.enmTrunkType, OpenReq.szTrunk, OpenReq.fFlags, - OpenReq.cbRecv, OpenReq.cbSend)); + OpenReq.cbRecv, OpenReq.cbSend, fIgnoreConnectFailure)); #ifdef RT_OS_DARWIN /* Temporary hack: attach to a network with the name 'if=en0' and you're hitting the wire. */ @@ -1558,19 +1655,16 @@ static DECLCALLBACK(int) drvR3IntNetConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfg * VM settings are locked and the user has no chance to fix network settings. * Therefore don't abort but just raise a runtime warning. */ - PDMDrvHlpVMSetRuntimeError (pDrvIns, 0 /*fFlags*/, "HostIfNotConnecting", - N_ ("Cannot connect to the network interface '%s'. The virtual " - "network card will appear to work but the guest will not " - "be able to connect. Please choose a different network in the " - "network settings"), OpenReq.szTrunk); + PDMDrvHlpVMSetRuntimeError(pDrvIns, 0 /*fFlags*/, "HostIfNotConnecting", + N_ ("Cannot connect to the network interface '%s'. The virtual " + "network card will appear to work but the guest will not " + "be able to connect. Please choose a different network in the " + "network settings"), OpenReq.szTrunk); return VERR_PDM_NO_ATTACHED_DRIVER; } - else - { - return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, - N_("Failed to open/create the internal network '%s'"), pThis->szNetwork); - } + return PDMDrvHlpVMSetError(pDrvIns, rc, RT_SRC_POS, + N_("Failed to open/create the internal network '%s'"), pThis->szNetwork); } AssertRelease(OpenReq.hIf != INTNET_HANDLE_INVALID); diff --git a/src/VBox/Devices/Network/SrvIntNetR0.cpp b/src/VBox/Devices/Network/SrvIntNetR0.cpp index aeffe318f..74a0ffb1f 100644 --- a/src/VBox/Devices/Network/SrvIntNetR0.cpp +++ b/src/VBox/Devices/Network/SrvIntNetR0.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 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,8 +71,10 @@ typedef struct INTNETMACTABENTRY { /** The MAC address of this entry. */ RTMAC MacAddr; - /** Is it promiscuous. */ - bool fPromiscuous; + /** Is it is effectively promiscuous mode. */ + bool fPromiscuousEff; + /** Is it promiscuous and should it see unrelated trunk traffic. */ + bool fPromiscuousSeeTrunk; /** Is it active. * We ignore the entry if this is clear and may end up sending packets addressed * to this interface onto the trunk. The reasoning for this is that this could @@ -99,15 +101,27 @@ typedef struct INTNETMACTAB /** Table entries. */ PINTNETMACTABENTRY paEntries; + /** The number of interface entries currently in promicuous mode. */ + uint32_t cPromiscuousEntries; + /** The number of interface entries currently in promicuous mode that + * shall not see unrelated trunk traffic. */ + uint32_t cPromiscuousNoTrunkEntries; + /** The host MAC address (reported). */ RTMAC HostMac; - /** The host promiscuous setting (reported). */ - bool fHostPromiscuous; + /** The effective host promiscuous setting (reported). */ + bool fHostPromiscuousEff; + /** The real host promiscuous setting (reported). */ + bool fHostPromiscuousReal; /** Whether the host is active. */ bool fHostActive; /** Whether the wire is promiscuous (config). */ - bool fWirePromiscuous; + bool fWirePromiscuousEff; + /** Whether the wire is promiscuous (config). + * (Shadows INTNET_OPEN_FLAGS_TRUNK_WIRE_PROMISC_MODE in + * INTNETNETWORK::fFlags.) */ + bool fWirePromiscuousReal; /** Whether the wire is active. */ bool fWireActive; @@ -214,15 +228,16 @@ typedef struct INTNETIF RTMAC MacAddr; /** Set if the INTNET::MacAddr member has been explicitly set. */ bool fMacSet; - /** Set if the interface is in promiscuous mode. - * This is shadowed by INTNETMACTABENTRY::fPromiscuous. */ - bool fPromiscuous; + /** Tracks the desired promiscuous setting of the interface. */ + bool fPromiscuousReal; /** Whether the interface is active or not. * This is shadowed by INTNETMACTABENTRY::fActive. */ bool fActive; /** Whether someone is currently in the destructor or has indicated that * the end is nigh by means of IntNetR0IfAbortWait. */ bool volatile fDestroying; + /** The flags specified when opening this interface. */ + uint32_t fOpenFlags; /** Number of yields done to try make the interface read pending data. * We will stop yielding when this reaches a threshold assuming that the VM is * paused or that it simply isn't worth all the delay. It is cleared when a @@ -356,6 +371,9 @@ typedef struct INTNETNETWORK uint8_t *pbTmp; /** Network creation flags (INTNET_OPEN_FLAGS_*). */ uint32_t fFlags; + /** Any restrictive policies required as a minimum by some interface. + * (INTNET_OPEN_FLAGS_REQUIRE_AS_RESTRICTIVE_POLICIES) */ + uint32_t fMinFlags; /** The number of active interfaces (excluding the trunk). */ uint32_t cActiveIFs; /** The length of the network name. */ @@ -369,6 +387,8 @@ typedef struct INTNETNETWORK } INTNETNETWORK; /** Pointer to an internal network. */ typedef INTNETNETWORK *PINTNETNETWORK; +/** Pointer to a const internal network. */ +typedef const INTNETNETWORK *PCINTNETNETWORK; /** The size of the buffer INTNETNETWORK::pbTmp points at. */ #define INTNETNETWORK_TMP_SIZE 2048 @@ -402,6 +422,32 @@ typedef struct INTNET *PINTNET; /** Pointer to the internal network instance data. */ static PINTNET volatile g_pIntNet = NULL; +static const struct INTNETOPENNETWORKFLAGS +{ + uint32_t fRestrictive; /**< The restrictive flag (deny/disabled). */ + uint32_t fRelaxed; /**< The relaxed flag (allow/enabled). */ + uint32_t fFixed; /**< The config-fixed flag. */ + uint32_t fPair; /**< The pair of restrictive and relaxed flags. */ +} +/** Open network policy flags relating to the network. */ +g_afIntNetOpenNetworkNetFlags[] = +{ + { INTNET_OPEN_FLAGS_ACCESS_RESTRICTED, INTNET_OPEN_FLAGS_ACCESS_PUBLIC, INTNET_OPEN_FLAGS_ACCESS_FIXED, INTNET_OPEN_FLAGS_ACCESS_RESTRICTED | INTNET_OPEN_FLAGS_ACCESS_PUBLIC }, + { INTNET_OPEN_FLAGS_PROMISC_DENY_CLIENTS, INTNET_OPEN_FLAGS_PROMISC_ALLOW_CLIENTS, INTNET_OPEN_FLAGS_PROMISC_FIXED, INTNET_OPEN_FLAGS_PROMISC_DENY_CLIENTS | INTNET_OPEN_FLAGS_PROMISC_ALLOW_CLIENTS }, + { INTNET_OPEN_FLAGS_PROMISC_DENY_TRUNK_HOST, INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_HOST, INTNET_OPEN_FLAGS_PROMISC_FIXED, INTNET_OPEN_FLAGS_PROMISC_DENY_TRUNK_HOST | INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_HOST }, + { INTNET_OPEN_FLAGS_PROMISC_DENY_TRUNK_WIRE, INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_WIRE, INTNET_OPEN_FLAGS_PROMISC_FIXED, INTNET_OPEN_FLAGS_PROMISC_DENY_TRUNK_WIRE | INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_WIRE }, + { INTNET_OPEN_FLAGS_TRUNK_HOST_DISABLED, INTNET_OPEN_FLAGS_TRUNK_HOST_ENABLED, INTNET_OPEN_FLAGS_TRUNK_FIXED, INTNET_OPEN_FLAGS_TRUNK_HOST_DISABLED | INTNET_OPEN_FLAGS_TRUNK_HOST_ENABLED }, + { INTNET_OPEN_FLAGS_TRUNK_HOST_CHASTE_MODE, INTNET_OPEN_FLAGS_TRUNK_HOST_PROMISC_MODE, INTNET_OPEN_FLAGS_TRUNK_FIXED, INTNET_OPEN_FLAGS_TRUNK_HOST_CHASTE_MODE | INTNET_OPEN_FLAGS_TRUNK_HOST_PROMISC_MODE }, + { INTNET_OPEN_FLAGS_TRUNK_WIRE_DISABLED, INTNET_OPEN_FLAGS_TRUNK_WIRE_ENABLED, INTNET_OPEN_FLAGS_TRUNK_FIXED, INTNET_OPEN_FLAGS_TRUNK_WIRE_DISABLED | INTNET_OPEN_FLAGS_TRUNK_WIRE_ENABLED }, + { INTNET_OPEN_FLAGS_TRUNK_WIRE_CHASTE_MODE, INTNET_OPEN_FLAGS_TRUNK_WIRE_PROMISC_MODE, INTNET_OPEN_FLAGS_TRUNK_FIXED, INTNET_OPEN_FLAGS_TRUNK_WIRE_CHASTE_MODE | INTNET_OPEN_FLAGS_TRUNK_WIRE_PROMISC_MODE }, +}, +/** Open network policy flags relating to the new interface. */ +g_afIntNetOpenNetworkIfFlags[] = +{ + { INTNET_OPEN_FLAGS_IF_PROMISC_DENY, INTNET_OPEN_FLAGS_IF_PROMISC_ALLOW, INTNET_OPEN_FLAGS_IF_FIXED, INTNET_OPEN_FLAGS_IF_PROMISC_DENY | INTNET_OPEN_FLAGS_IF_PROMISC_ALLOW }, + { INTNET_OPEN_FLAGS_IF_PROMISC_NO_TRUNK, INTNET_OPEN_FLAGS_IF_PROMISC_SEE_TRUNK, INTNET_OPEN_FLAGS_IF_FIXED, INTNET_OPEN_FLAGS_IF_PROMISC_NO_TRUNK | INTNET_OPEN_FLAGS_IF_PROMISC_SEE_TRUNK }, +}; + /******************************************************************************* * Internal Functions * @@ -1418,7 +1464,7 @@ static INTNETSWDECISION intnetR0NetworkSwitchLevel3(PINTNETNETWORK pNetwork, PCR { PINTNETIF pIf = pTab->paEntries[iIfMac].pIf; AssertPtr(pIf); Assert(pIf->pNetwork == pNetwork); bool fExact = intnetR0IfAddrCacheLookup(&pIf->aAddrCache[enmL3AddrType], pL3Addr, cbL3Addr) >= 0; - if (fExact || pTab->paEntries[iIfMac].fPromiscuous) + if (fExact || pTab->paEntries[iIfMac].fPromiscuousSeeTrunk) { cExactHits += fExact; @@ -1430,13 +1476,37 @@ static INTNETSWDECISION intnetR0NetworkSwitchLevel3(PINTNETNETWORK pNetwork, PCR } } + /* Network only promicuous mode ifs should see related trunk traffic. */ + if ( cExactHits + && fSrc + && pNetwork->MacTab.cPromiscuousNoTrunkEntries) + { + iIfMac = pTab->cEntries; + while (iIfMac-- > 0) + { + if ( pTab->paEntries[iIfMac].fActive + && pTab->paEntries[iIfMac].fPromiscuousEff + && !pTab->paEntries[iIfMac].fPromiscuousSeeTrunk) + { + PINTNETIF pIf = pTab->paEntries[iIfMac].pIf; AssertPtr(pIf); Assert(pIf->pNetwork == pNetwork); + if (intnetR0IfAddrCacheLookup(&pIf->aAddrCache[enmL3AddrType], pL3Addr, cbL3Addr) < 0) + { + uint32_t iIfDst = pDstTab->cIfs++; + pDstTab->aIfs[iIfDst].pIf = pIf; + pDstTab->aIfs[iIfDst].fReplaceDstMac = false; + intnetR0BusyIncIf(pIf); + } + } + } + } + /* Does it match the host, or is the host promiscuous? */ if (pTab->fHostActive) { bool fExact = intnetR0AreMacAddrsEqual(&pTab->HostMac, pDstMacAddr); if ( fExact || intnetR0IsMacAddrDummy(&pTab->HostMac) - || pTab->fHostPromiscuous) + || pTab->fHostPromiscuousEff) { cExactHits += fExact; pDstTab->fTrunkDst |= INTNETTRUNKDIR_HOST; @@ -1444,7 +1514,7 @@ static INTNETSWDECISION intnetR0NetworkSwitchLevel3(PINTNETNETWORK pNetwork, PCR } /* Hit the wire if there are no exact matches or if it's in promiscuous mode. */ - if (pTab->fWireActive && (!cExactHits || pTab->fWirePromiscuous)) + if (pTab->fWireActive && (!cExactHits || pTab->fWirePromiscuousEff)) pDstTab->fTrunkDst |= INTNETTRUNKDIR_WIRE; pDstTab->fTrunkDst &= ~fSrc; if (pDstTab->fTrunkDst) @@ -1475,6 +1545,7 @@ static INTNETSWDECISION intnetR0NetworkPreSwitchUnicast(PINTNETNETWORK pNetwork, PCRTMAC pDstAddr) { Assert(!intnetR0IsMacAddrMulticast(pDstAddr)); + Assert(fSrc); /* * Grab the spinlock first and do the switching. @@ -1496,6 +1567,10 @@ static INTNETSWDECISION intnetR0NetworkPreSwitchUnicast(PINTNETNETWORK pNetwork, if (intnetR0IsMacAddrDummy(&pTab->paEntries[iIfMac].MacAddr)) break; + /* Promiscuous mode? */ + if (pTab->paEntries[iIfMac].fPromiscuousSeeTrunk) + break; + /* Paranoia - this shouldn't happen, right? */ if ( pSrcAddr && intnetR0AreMacAddrsEqual(&pTab->paEntries[iIfMac].MacAddr, pSrcAddr)) @@ -1504,7 +1579,7 @@ static INTNETSWDECISION intnetR0NetworkPreSwitchUnicast(PINTNETNETWORK pNetwork, /* Exact match? */ if (intnetR0AreMacAddrsEqual(&pTab->paEntries[iIfMac].MacAddr, pDstAddr)) { - enmSwDecision = pTab->fHostPromiscuous && fSrc == INTNETTRUNKDIR_WIRE + enmSwDecision = pTab->fHostPromiscuousEff && fSrc == INTNETTRUNKDIR_WIRE ? INTNETSWDECISION_BROADCAST : INTNETSWDECISION_INTNET; break; @@ -1556,7 +1631,9 @@ static INTNETSWDECISION intnetR0NetworkSwitchUnicast(PINTNETNETWORK pNetwork, ui bool fExact = intnetR0AreMacAddrsEqual(&pTab->paEntries[iIfMac].MacAddr, pDstAddr); if ( fExact || intnetR0IsMacAddrDummy(&pTab->paEntries[iIfMac].MacAddr) - || pTab->paEntries[iIfMac].fPromiscuous) + || ( pTab->paEntries[iIfMac].fPromiscuousSeeTrunk + || (!fSrc && pTab->paEntries[iIfMac].fPromiscuousEff) ) + ) { cExactHits += fExact; @@ -1572,6 +1649,29 @@ static INTNETSWDECISION intnetR0NetworkSwitchUnicast(PINTNETNETWORK pNetwork, ui } } + /* Network only promicuous mode ifs should see related trunk traffic. */ + if ( cExactHits + && fSrc + && pNetwork->MacTab.cPromiscuousNoTrunkEntries) + { + iIfMac = pTab->cEntries; + while (iIfMac-- > 0) + { + if ( pTab->paEntries[iIfMac].fPromiscuousEff + && !pTab->paEntries[iIfMac].fPromiscuousSeeTrunk + && pTab->paEntries[iIfMac].fActive + && !intnetR0AreMacAddrsEqual(&pTab->paEntries[iIfMac].MacAddr, pDstAddr) + && !intnetR0IsMacAddrDummy(&pTab->paEntries[iIfMac].MacAddr) ) + { + PINTNETIF pIf = pTab->paEntries[iIfMac].pIf; AssertPtr(pIf); Assert(pIf->pNetwork == pNetwork); + uint32_t iIfDst = pDstTab->cIfs++; + pDstTab->aIfs[iIfDst].pIf = pIf; + pDstTab->aIfs[iIfDst].fReplaceDstMac = false; + intnetR0BusyIncIf(pIf); + } + } + } + /* Does it match the host, or is the host promiscuous? */ if ( fSrc != INTNETTRUNKDIR_HOST && pTab->fHostActive) @@ -1579,7 +1679,7 @@ static INTNETSWDECISION intnetR0NetworkSwitchUnicast(PINTNETNETWORK pNetwork, ui bool fExact = intnetR0AreMacAddrsEqual(&pTab->HostMac, pDstAddr); if ( fExact || intnetR0IsMacAddrDummy(&pTab->HostMac) - || pTab->fHostPromiscuous) + || pTab->fHostPromiscuousEff) { cExactHits += fExact; pDstTab->fTrunkDst |= INTNETTRUNKDIR_HOST; @@ -1589,7 +1689,7 @@ static INTNETSWDECISION intnetR0NetworkSwitchUnicast(PINTNETNETWORK pNetwork, ui /* Hit the wire if there are no exact matches or if it's in promiscuous mode. */ if ( fSrc != INTNETTRUNKDIR_WIRE && pTab->fWireActive - && (!cExactHits || pTab->fWirePromiscuous) + && (!cExactHits || pTab->fWirePromiscuousEff) ) pDstTab->fTrunkDst |= INTNETTRUNKDIR_WIRE; @@ -1701,7 +1801,9 @@ static INTNETSWDECISION intnetR0NetworkSwitchTrunkAndPromisc(PINTNETNETWORK pNet while (iIfMac-- > 0) { if ( pTab->paEntries[iIfMac].fActive - && pTab->paEntries[iIfMac].fPromiscuous) + && ( pTab->paEntries[iIfMac].fPromiscuousSeeTrunk + || (!fSrc && pTab->paEntries[iIfMac].fPromiscuousEff) ) + ) { PINTNETIF pIf = pTab->paEntries[iIfMac].pIf; AssertPtr(pIf); Assert(pIf->pNetwork == pNetwork); uint32_t iIfDst = pDstTab->cIfs++; @@ -3601,16 +3703,41 @@ INTNETR0DECL(int) IntNetR0IfSetPromiscuousMode(INTNETIFHANDLE hIf, PSUPDRVSESSIO RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; RTSpinlockAcquireNoInts(pNetwork->hAddrSpinlock, &Tmp); - if (pIf->fPromiscuous != fPromiscuous) + if (pIf->fPromiscuousReal != fPromiscuous) { - Log(("IntNetR0IfSetPromiscuousMode: hIf=%RX32: Changed from %d -> %d\n", - hIf, !fPromiscuous, !!fPromiscuous)); - ASMAtomicUoWriteBool(&pIf->fPromiscuous, fPromiscuous); + const bool fPromiscuousEff = fPromiscuous + && (pIf->fOpenFlags & INTNET_OPEN_FLAGS_IF_PROMISC_ALLOW) + && (pNetwork->fFlags & INTNET_OPEN_FLAGS_PROMISC_ALLOW_CLIENTS); + Log(("IntNetR0IfSetPromiscuousMode: hIf=%RX32: Changed from %d -> %d (%d)\n", + hIf, !fPromiscuous, !!fPromiscuous, fPromiscuousEff)); + + pIf->fPromiscuousReal = fPromiscuous; PINTNETMACTABENTRY pEntry = intnetR0NetworkFindMacAddrEntry(pNetwork, pIf); Assert(pEntry); if (RT_LIKELY(pEntry)) - pEntry->fPromiscuous = fPromiscuous; - pIf->fPromiscuous = fPromiscuous; + { + if (pEntry->fPromiscuousEff) + { + pNetwork->MacTab.cPromiscuousEntries--; + if (!pEntry->fPromiscuousSeeTrunk) + pNetwork->MacTab.cPromiscuousNoTrunkEntries--; + Assert(pNetwork->MacTab.cPromiscuousEntries < pNetwork->MacTab.cEntries); + Assert(pNetwork->MacTab.cPromiscuousNoTrunkEntries < pNetwork->MacTab.cEntries); + } + + pEntry->fPromiscuousEff = fPromiscuousEff; + pEntry->fPromiscuousSeeTrunk = fPromiscuousEff + && (pIf->fOpenFlags & INTNET_OPEN_FLAGS_IF_PROMISC_SEE_TRUNK); + + if (pEntry->fPromiscuousEff) + { + pNetwork->MacTab.cPromiscuousEntries++; + if (!pEntry->fPromiscuousSeeTrunk) + pNetwork->MacTab.cPromiscuousNoTrunkEntries++; + } + Assert(pNetwork->MacTab.cPromiscuousEntries <= pNetwork->MacTab.cEntries); + Assert(pNetwork->MacTab.cPromiscuousNoTrunkEntries <= pNetwork->MacTab.cEntries); + } } RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock, &Tmp); @@ -3780,8 +3907,8 @@ static int intnetR0NetworkSetIfActive(PINTNETNETWORK pNetwork, PINTNETIF pIf, bo pTrunk = pNetwork->MacTab.pTrunk; if (pTrunk) { - pNetwork->MacTab.fHostActive = true; - pNetwork->MacTab.fWireActive = true; + pNetwork->MacTab.fHostActive = RT_BOOL(pNetwork->fFlags & INTNET_OPEN_FLAGS_TRUNK_HOST_ENABLED); + pNetwork->MacTab.fWireActive = RT_BOOL(pNetwork->fFlags & INTNET_OPEN_FLAGS_TRUNK_WIRE_ENABLED); } } } @@ -4170,6 +4297,15 @@ static DECLCALLBACK(void) intnetR0IfDestruct(void *pvObj, void *pvUser1, void *p while (iIf-- > 0) if (pNetwork->MacTab.paEntries[iIf].pIf == pIf) { + if (pNetwork->MacTab.paEntries[iIf].fPromiscuousEff) + { + pNetwork->MacTab.cPromiscuousEntries--; + if (!pNetwork->MacTab.paEntries[iIf].fPromiscuousSeeTrunk) + pNetwork->MacTab.cPromiscuousNoTrunkEntries--; + } + Assert(pNetwork->MacTab.cPromiscuousEntries < pNetwork->MacTab.cEntries); + Assert(pNetwork->MacTab.cPromiscuousNoTrunkEntries < pNetwork->MacTab.cEntries); + if (iIf + 1 < pNetwork->MacTab.cEntries) memmove(&pNetwork->MacTab.paEntries[iIf], &pNetwork->MacTab.paEntries[iIf + 1], @@ -4178,6 +4314,21 @@ static DECLCALLBACK(void) intnetR0IfDestruct(void *pvObj, void *pvUser1, void *p break; } + /* recalc the min flags. */ + if (pIf->fOpenFlags & INTNET_OPEN_FLAGS_REQUIRE_AS_RESTRICTIVE_POLICIES) + { + uint32_t fMinFlags = 0; + iIf = pNetwork->MacTab.cEntries; + while (iIf-- > 0) + { + PINTNETIF pIf2 = pNetwork->MacTab.paEntries[iIf].pIf; + if ( pIf2 /* paranoia */ + && (pIf2->fOpenFlags & INTNET_OPEN_FLAGS_REQUIRE_AS_RESTRICTIVE_POLICIES)) + fMinFlags |= pIf2->fOpenFlags & INTNET_OPEN_FLAGS_STRICT_MASK; + } + pNetwork->fMinFlags = fMinFlags; + } + PINTNETTRUNKIF pTrunk = pNetwork->MacTab.pTrunk; RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock, &Tmp); @@ -4280,13 +4431,15 @@ static DECLCALLBACK(void) intnetR0IfDestruct(void *pvObj, void *pvUser1, void *p * @param pSession The session handle. * @param cbSend The size of the send buffer. * @param cbRecv The size of the receive buffer. + * @param fFlags The open network flags. * @param phIf Where to store the interface handle. */ -static int intnetR0NetworkCreateIf(PINTNETNETWORK pNetwork, PSUPDRVSESSION pSession, unsigned cbSend, unsigned cbRecv, +static int intnetR0NetworkCreateIf(PINTNETNETWORK pNetwork, PSUPDRVSESSION pSession, + unsigned cbSend, unsigned cbRecv, uint32_t fFlags, PINTNETIFHANDLE phIf) { - LogFlow(("intnetR0NetworkCreateIf: pNetwork=%p pSession=%p cbSend=%u cbRecv=%u phIf=%p\n", - pNetwork, pSession, cbSend, cbRecv, phIf)); + LogFlow(("intnetR0NetworkCreateIf: pNetwork=%p pSession=%p cbSend=%u cbRecv=%u fFlags=%#x phIf=%p\n", + pNetwork, pSession, cbSend, cbRecv, fFlags, phIf)); /* * Assert input. @@ -4295,6 +4448,16 @@ static int intnetR0NetworkCreateIf(PINTNETNETWORK pNetwork, PSUPDRVSESSION pSess AssertPtr(phIf); /* + * Adjust the flags with defaults for the interface policies. + * Note: Main restricts promiscuous mode per interface. + */ + uint32_t const fDefFlags = INTNET_OPEN_FLAGS_IF_PROMISC_ALLOW + | INTNET_OPEN_FLAGS_IF_PROMISC_SEE_TRUNK; + for (uint32_t i = 0; i < RT_ELEMENTS(g_afIntNetOpenNetworkIfFlags); i++) + if (!(fFlags & g_afIntNetOpenNetworkIfFlags[i].fPair)) + fFlags |= g_afIntNetOpenNetworkIfFlags[i].fPair & fDefFlags; + + /* * Make sure that all destination tables as well as the have space of */ int rc = intnetR0NetworkEnsureTabSpace(pNetwork); @@ -4310,9 +4473,10 @@ static int intnetR0NetworkCreateIf(PINTNETNETWORK pNetwork, PSUPDRVSESSION pSess memset(&pIf->MacAddr, 0xff, sizeof(pIf->MacAddr)); /* broadcast */ //pIf->fMacSet = false; - //pIf->fPromiscuous = false; + //pIf->fPromiscuousReal = false; //pIf->fActive = false; //pIf->fDestroying = false; + pIf->fOpenFlags = fFlags; //pIf->cYields = 0; //pIf->pIntBuf = 0; //pIf->pIntBufR3 = NIL_RTR3PTR; @@ -4377,10 +4541,11 @@ static int intnetR0NetworkCreateIf(PINTNETNETWORK pNetwork, PSUPDRVSESSION pSess uint32_t iIf = pNetwork->MacTab.cEntries; Assert(iIf + 1 <= pNetwork->MacTab.cEntriesAllocated); - pNetwork->MacTab.paEntries[iIf].MacAddr = pIf->MacAddr; - pNetwork->MacTab.paEntries[iIf].fActive = false; - pNetwork->MacTab.paEntries[iIf].fPromiscuous = false; - pNetwork->MacTab.paEntries[iIf].pIf = pIf; + pNetwork->MacTab.paEntries[iIf].MacAddr = pIf->MacAddr; + pNetwork->MacTab.paEntries[iIf].fActive = false; + pNetwork->MacTab.paEntries[iIf].fPromiscuousEff = false; + pNetwork->MacTab.paEntries[iIf].fPromiscuousSeeTrunk = false; + pNetwork->MacTab.paEntries[iIf].pIf = pIf; pNetwork->MacTab.cEntries = iIf + 1; pIf->pNetwork = pNetwork; @@ -4491,7 +4656,10 @@ static DECLCALLBACK(void) intnetR0TrunkIfPortReportPromiscuousMode(PINTNETTRUNKS RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; RTSpinlockAcquireNoInts(pNetwork->hAddrSpinlock, &Tmp); - pNetwork->MacTab.fHostPromiscuous = fPromiscuous; + pNetwork->MacTab.fHostPromiscuousReal = fPromiscuous + || (pNetwork->fFlags & INTNET_OPEN_FLAGS_TRUNK_HOST_PROMISC_MODE); + pNetwork->MacTab.fHostPromiscuousEff = pNetwork->MacTab.fHostPromiscuousReal + && (pNetwork->fFlags & INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_HOST); RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock, &Tmp); } @@ -4944,12 +5112,16 @@ static int intnetR0NetworkCreateTrunkIf(PINTNETNETWORK pNetwork, PSUPDRVSESSION * * Note! We don't need to lock the MacTab here - creation time. */ - pNetwork->MacTab.pTrunk = pTrunk; - pNetwork->MacTab.HostMac = pTrunk->MacAddr; - pNetwork->MacTab.fHostPromiscuous = false; - pNetwork->MacTab.fHostActive = false; - pNetwork->MacTab.fWirePromiscuous = false; /** @todo !!(fFlags & INTNET_OPEN_FLAGS_PROMISC_TRUNK_WIRE); */ - pNetwork->MacTab.fWireActive = false; + pNetwork->MacTab.pTrunk = pTrunk; + pNetwork->MacTab.HostMac = pTrunk->MacAddr; + pNetwork->MacTab.fHostPromiscuousReal = false; + pNetwork->MacTab.fHostPromiscuousEff = (pNetwork->fFlags & INTNET_OPEN_FLAGS_TRUNK_HOST_PROMISC_MODE) + && (pNetwork->fFlags & INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_HOST); + pNetwork->MacTab.fHostActive = false; + pNetwork->MacTab.fWirePromiscuousReal = RT_BOOL(pNetwork->fFlags & INTNET_OPEN_FLAGS_TRUNK_WIRE_PROMISC_MODE); + pNetwork->MacTab.fWirePromiscuousEff = pNetwork->MacTab.fWirePromiscuousReal + && (pNetwork->fFlags & INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_WIRE); + pNetwork->MacTab.fWireActive = false; #ifdef IN_RING0 /* (testcase is ring-3) */ /* @@ -5124,6 +5296,166 @@ static DECLCALLBACK(void) intnetR0NetworkDestruct(void *pvObj, void *pvUser1, vo /** + * Checks if the open network flags are compatible. + * + * @returns VBox status code. + * @param pNetwork The network. + * @param fFlags The open network flags. + */ +static int intnetR0CheckOpenNetworkFlags(PINTNETNETWORK pNetwork, uint32_t fFlags) +{ + uint32_t const fNetFlags = pNetwork->fFlags; + + if ( (fFlags & INTNET_OPEN_FLAGS_SHARED_MAC_ON_WIRE) + ^ (fNetFlags & INTNET_OPEN_FLAGS_SHARED_MAC_ON_WIRE)) + return VERR_INTNET_INCOMPATIBLE_FLAGS; + + if (fFlags & INTNET_OPEN_FLAGS_REQUIRE_EXACT) + { + for (uint32_t i = 0; i < RT_ELEMENTS(g_afIntNetOpenNetworkNetFlags); i++) + if ( (fFlags & g_afIntNetOpenNetworkNetFlags[i].fPair) + && (fFlags & g_afIntNetOpenNetworkNetFlags[i].fPair) + != (fNetFlags & g_afIntNetOpenNetworkNetFlags[i].fPair) ) + return VERR_INTNET_INCOMPATIBLE_FLAGS; + } + + if (fFlags & INTNET_OPEN_FLAGS_REQUIRE_AS_RESTRICTIVE_POLICIES) + { + for (uint32_t i = 0; i < RT_ELEMENTS(g_afIntNetOpenNetworkNetFlags); i++) + if ( (fFlags & g_afIntNetOpenNetworkNetFlags[i].fRestrictive) + && !(fNetFlags & g_afIntNetOpenNetworkNetFlags[i].fRestrictive) + && (fNetFlags & g_afIntNetOpenNetworkNetFlags[i].fFixed) ) + return VERR_INTNET_INCOMPATIBLE_FLAGS; + } + + return VINF_SUCCESS; +} + + +/** + * Adapts flag changes on network opening. + * + * @returns VBox status code. + * @param pNetwork The network. + * @param fFlags The open network flags. + */ +static int intnetR0AdaptOpenNetworkFlags(PINTNETNETWORK pNetwork, uint32_t fFlags) +{ + /* + * Upgrade the minimum policy flags. + */ + uint32_t fNetMinFlags = pNetwork->fMinFlags; + Assert(!(fNetMinFlags & INTNET_OPEN_FLAGS_RELAXED_MASK)); + if (fFlags & INTNET_OPEN_FLAGS_REQUIRE_AS_RESTRICTIVE_POLICIES) + { + fNetMinFlags |= fFlags & INTNET_OPEN_FLAGS_STRICT_MASK; + if (fNetMinFlags != pNetwork->fMinFlags) + { + LogRel(("INTNET: %s - min flags changed %#x -> %#x\n", pNetwork->szName, pNetwork->fMinFlags, fNetMinFlags)); + pNetwork->fMinFlags = fNetMinFlags; + } + } + + /* + * Calculate the new network flags. + * (Depends on fNetMinFlags being recalculated first.) + */ + uint32_t fNetFlags = pNetwork->fFlags; + + for (uint32_t i = 0; i < RT_ELEMENTS(g_afIntNetOpenNetworkNetFlags); i++) + { + Assert(fNetFlags & g_afIntNetOpenNetworkNetFlags[i].fPair); + Assert(!(fNetMinFlags & g_afIntNetOpenNetworkNetFlags[i].fRelaxed)); + + if (!(fFlags & g_afIntNetOpenNetworkNetFlags[i].fPair)) + continue; + if (fNetFlags & g_afIntNetOpenNetworkNetFlags[i].fFixed) + continue; + + if ( (fNetMinFlags & g_afIntNetOpenNetworkNetFlags[i].fRestrictive) + || (fFlags & g_afIntNetOpenNetworkNetFlags[i].fRestrictive) ) + { + fNetFlags &= ~g_afIntNetOpenNetworkNetFlags[i].fPair; + fNetFlags |= g_afIntNetOpenNetworkNetFlags[i].fRestrictive; + } + else if (!(fFlags & INTNET_OPEN_FLAGS_REQUIRE_AS_RESTRICTIVE_POLICIES)) + { + fNetFlags &= ~g_afIntNetOpenNetworkNetFlags[i].fPair; + fNetFlags |= g_afIntNetOpenNetworkNetFlags[i].fRelaxed; + } + } + + for (uint32_t i = 0; i < RT_ELEMENTS(g_afIntNetOpenNetworkNetFlags); i++) + { + Assert(fNetFlags & g_afIntNetOpenNetworkNetFlags[i].fPair); + fNetFlags |= fFlags & g_afIntNetOpenNetworkNetFlags[i].fFixed; + } + + /* + * Apply the flags if they changed. + */ + uint32_t const fOldNetFlags = pNetwork->fFlags; + if (fOldNetFlags != fNetFlags) + { + LogRel(("INTNET: %s - flags changed %#x -> %#x\n", pNetwork->szName, fOldNetFlags, fNetFlags)); + + RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; + RTSpinlockAcquireNoInts(pNetwork->hAddrSpinlock, &Tmp); + + pNetwork->fFlags = fNetFlags; + + /* Recalculate some derived switcher variables. */ + bool fActiveTrunk = pNetwork->MacTab.pTrunk + && pNetwork->cActiveIFs > 0; + pNetwork->MacTab.fHostActive = fActiveTrunk + && (fNetFlags & INTNET_OPEN_FLAGS_TRUNK_HOST_ENABLED); + pNetwork->MacTab.fHostPromiscuousEff = ( pNetwork->MacTab.fHostPromiscuousReal + || (fNetFlags & INTNET_OPEN_FLAGS_TRUNK_HOST_PROMISC_MODE)) + && (fNetFlags & INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_HOST); + + pNetwork->MacTab.fWireActive = fActiveTrunk + && (fNetFlags & INTNET_OPEN_FLAGS_TRUNK_HOST_ENABLED); + pNetwork->MacTab.fWirePromiscuousReal= RT_BOOL(fNetFlags & INTNET_OPEN_FLAGS_TRUNK_WIRE_PROMISC_MODE); + pNetwork->MacTab.fWirePromiscuousEff = pNetwork->MacTab.fWirePromiscuousReal + && (fNetFlags & INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_WIRE); + + if ((fOldNetFlags ^ fNetFlags) & INTNET_OPEN_FLAGS_PROMISC_ALLOW_CLIENTS) + { + pNetwork->MacTab.cPromiscuousEntries = 0; + pNetwork->MacTab.cPromiscuousNoTrunkEntries = 0; + + uint32_t iIf = pNetwork->MacTab.cEntries; + while (iIf-- > 0) + { + PINTNETMACTABENTRY pEntry = &pNetwork->MacTab.paEntries[iIf]; + PINTNETIF pIf2 = pEntry->pIf; + if ( pIf2 /* paranoia */ + && pIf2->fPromiscuousReal) + { + bool fPromiscuousEff = (fNetFlags & INTNET_OPEN_FLAGS_PROMISC_ALLOW_CLIENTS) + && (pIf2->fOpenFlags & INTNET_OPEN_FLAGS_IF_PROMISC_ALLOW); + pEntry->fPromiscuousEff = fPromiscuousEff; + pEntry->fPromiscuousSeeTrunk = fPromiscuousEff + && (pIf2->fOpenFlags & INTNET_OPEN_FLAGS_IF_PROMISC_SEE_TRUNK); + + if (pEntry->fPromiscuousEff) + { + pNetwork->MacTab.cPromiscuousEntries++; + if (!pEntry->fPromiscuousSeeTrunk) + pNetwork->MacTab.cPromiscuousNoTrunkEntries++; + } + } + } + } + + RTSpinlockReleaseNoInts(pNetwork->hAddrSpinlock, &Tmp); + } + + return VINF_SUCCESS; +} + + +/** * Opens an existing network. * * The call must own the INTNET::hMtxCreateOpenDestroy. @@ -5149,7 +5481,7 @@ static int intnetR0OpenNetwork(PINTNET pIntNet, PSUPDRVSESSION pSession, const c AssertPtr(pszNetwork); Assert(enmTrunkType > kIntNetTrunkType_Invalid && enmTrunkType < kIntNetTrunkType_End); AssertPtr(pszTrunk); - Assert(!(fFlags & ~(INTNET_OPEN_FLAGS_MASK))); + Assert(!(fFlags & ~INTNET_OPEN_FLAGS_MASK)); AssertPtr(ppNetwork); *ppNetwork = NULL; @@ -5175,7 +5507,8 @@ static int intnetR0OpenNetwork(PINTNET pIntNet, PSUPDRVSESSION pSession, const c || ( pCur->enmTrunkType == enmTrunkType && !strcmp(pCur->szTrunk, pszTrunk))) { - if (!((pCur->fFlags ^ fFlags) & INTNET_OPEN_FLAGS_COMPATIBILITY_XOR_MASK)) + rc = intnetR0CheckOpenNetworkFlags(pCur, fFlags); + if (RT_SUCCESS(rc)) { /* * Increment the reference and check that the session @@ -5184,22 +5517,16 @@ static int intnetR0OpenNetwork(PINTNET pIntNet, PSUPDRVSESSION pSession, const c rc = SUPR0ObjAddRef(pCur->pvObj, pSession); if (RT_SUCCESS(rc)) { - if (!(pCur->fFlags & INTNET_OPEN_FLAGS_PUBLIC)) + if (pCur->fFlags & INTNET_OPEN_FLAGS_ACCESS_RESTRICTED) rc = SUPR0ObjVerifyAccess(pCur->pvObj, pSession, pCur->szName); if (RT_SUCCESS(rc)) - { - pCur->fFlags |= fFlags & INTNET_OPEN_FLAGS_SECURITY_OR_MASK; - *ppNetwork = pCur; - } else SUPR0ObjRelease(pCur->pvObj, pSession); } else if (rc == VERR_WRONG_ORDER) rc = VERR_NOT_FOUND; /* destruction race, pretend the other isn't there. */ } - else - rc = VERR_INTNET_INCOMPATIBLE_FLAGS; } else { @@ -5252,9 +5579,34 @@ static int intnetR0CreateNetwork(PINTNET pIntNet, PSUPDRVSESSION pSession, const AssertPtr(pszTrunk); Assert(!(fFlags & ~INTNET_OPEN_FLAGS_MASK)); AssertPtr(ppNetwork); + *ppNetwork = NULL; /* + * Adjust the flags with defaults for the network policies. + * Note: Main restricts promiscuous mode on the per interface level. + */ + fFlags &= ~( INTNET_OPEN_FLAGS_IF_FIXED + | INTNET_OPEN_FLAGS_IF_PROMISC_ALLOW + | INTNET_OPEN_FLAGS_IF_PROMISC_DENY + | INTNET_OPEN_FLAGS_IF_PROMISC_SEE_TRUNK + | INTNET_OPEN_FLAGS_IF_PROMISC_NO_TRUNK + | INTNET_OPEN_FLAGS_REQUIRE_AS_RESTRICTIVE_POLICIES + | INTNET_OPEN_FLAGS_REQUIRE_EXACT); + uint32_t const fDefFlags = INTNET_OPEN_FLAGS_ACCESS_RESTRICTED + | INTNET_OPEN_FLAGS_PROMISC_ALLOW_CLIENTS + | INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_HOST + | INTNET_OPEN_FLAGS_PROMISC_ALLOW_TRUNK_WIRE + | INTNET_OPEN_FLAGS_TRUNK_HOST_ENABLED + | INTNET_OPEN_FLAGS_TRUNK_HOST_CHASTE_MODE + | INTNET_OPEN_FLAGS_TRUNK_WIRE_ENABLED + | INTNET_OPEN_FLAGS_TRUNK_WIRE_CHASTE_MODE + ; + for (uint32_t i = 0; i < RT_ELEMENTS(g_afIntNetOpenNetworkNetFlags); i++) + if (!(fFlags & g_afIntNetOpenNetworkNetFlags[i].fPair)) + fFlags |= g_afIntNetOpenNetworkNetFlags[i].fPair & fDefFlags; + + /* * Allocate and initialize. */ size_t cb = sizeof(INTNETNETWORK); @@ -5263,31 +5615,36 @@ static int intnetR0CreateNetwork(PINTNET pIntNet, PSUPDRVSESSION pSession, const PINTNETNETWORK pNetwork = (PINTNETNETWORK)RTMemAllocZ(cb); if (!pNetwork) return VERR_NO_MEMORY; - //pNetwork->pNext = NULL; - //pNetwork->pIfs = NULL; - pNetwork->hAddrSpinlock = NIL_RTSPINLOCK; - pNetwork->MacTab.cEntries = 0; - pNetwork->MacTab.cEntriesAllocated = INTNET_GROW_DSTTAB_SIZE; - pNetwork->MacTab.paEntries = NULL; - pNetwork->MacTab.fHostPromiscuous = false; - pNetwork->MacTab.fHostActive = false; - pNetwork->MacTab.fWirePromiscuous = false; - pNetwork->MacTab.fWireActive = false; - pNetwork->MacTab.pTrunk = NULL; - pNetwork->hEvtBusyIf = NIL_RTSEMEVENT; - pNetwork->pIntNet = pIntNet; - //pNetwork->pvObj = NULL; + //pNetwork->pNext = NULL; + //pNetwork->pIfs = NULL; + pNetwork->hAddrSpinlock = NIL_RTSPINLOCK; + pNetwork->MacTab.cEntries = 0; + pNetwork->MacTab.cEntriesAllocated = INTNET_GROW_DSTTAB_SIZE; + //pNetwork->MacTab.cPromiscuousEntries = 0; + //pNetwork->MacTab.cPromiscuousNoTrunkEntries = 0; + pNetwork->MacTab.paEntries = NULL; + pNetwork->MacTab.fHostPromiscuousReal = false; + pNetwork->MacTab.fHostPromiscuousEff = false; + pNetwork->MacTab.fHostActive = false; + pNetwork->MacTab.fWirePromiscuousReal = false; + pNetwork->MacTab.fWirePromiscuousEff = false; + pNetwork->MacTab.fWireActive = false; + pNetwork->MacTab.pTrunk = NULL; + pNetwork->hEvtBusyIf = NIL_RTSEMEVENT; + pNetwork->pIntNet = pIntNet; + //pNetwork->pvObj = NULL; if (fFlags & INTNET_OPEN_FLAGS_SHARED_MAC_ON_WIRE) - pNetwork->pbTmp = RT_ALIGN_PT(pNetwork + 1, 64, uint8_t *); + pNetwork->pbTmp = RT_ALIGN_PT(pNetwork + 1, 64, uint8_t *); //else - // pNetwork->pbTmp = NULL; - pNetwork->fFlags = fFlags; - //pNetwork->cActiveIFs = 0; - size_t cchName = strlen(pszNetwork); - pNetwork->cchName = (uint8_t)cchName; + // pNetwork->pbTmp = NULL; + pNetwork->fFlags = fFlags; + //pNetwork->fMinFlags = 0; + //pNetwork->cActiveIFs = 0; + size_t cchName = strlen(pszNetwork); + pNetwork->cchName = (uint8_t)cchName; Assert(cchName && cchName < sizeof(pNetwork->szName)); /* caller's responsibility. */ memcpy(pNetwork->szName, pszNetwork, cchName); /* '\0' at courtesy of alloc. */ - pNetwork->enmTrunkType = enmTrunkType; + pNetwork->enmTrunkType = enmTrunkType; Assert(strlen(pszTrunk) < sizeof(pNetwork->szTrunk)); /* caller's responsibility. */ strcpy(pNetwork->szTrunk, pszTrunk); @@ -5421,6 +5778,12 @@ INTNETR0DECL(int) IntNetR0Open(PSUPDRVSESSION pSession, const char *pszNetwork, } AssertMsgReturn(!(fFlags & ~INTNET_OPEN_FLAGS_MASK), ("%#x\n", fFlags), VERR_INVALID_PARAMETER); + for (uint32_t i = 0; i < RT_ELEMENTS(g_afIntNetOpenNetworkNetFlags); i++) + AssertMsgReturn((fFlags & g_afIntNetOpenNetworkNetFlags[i].fPair) != g_afIntNetOpenNetworkNetFlags[i].fPair, + ("%#x (%#x)\n", fFlags, g_afIntNetOpenNetworkNetFlags[i].fPair), VERR_INVALID_PARAMETER); + for (uint32_t i = 0; i < RT_ELEMENTS(g_afIntNetOpenNetworkIfFlags); i++) + AssertMsgReturn((fFlags & g_afIntNetOpenNetworkIfFlags[i].fPair) != g_afIntNetOpenNetworkIfFlags[i].fPair, + ("%#x (%#x)\n", fFlags, g_afIntNetOpenNetworkIfFlags[i].fPair), VERR_INVALID_PARAMETER); AssertPtrReturn(phIf, VERR_INVALID_PARAMETER); /* @@ -5438,9 +5801,12 @@ INTNETR0DECL(int) IntNetR0Open(PSUPDRVSESSION pSession, const char *pszNetwork, rc = intnetR0OpenNetwork(pIntNet, pSession, pszNetwork, enmTrunkType, pszTrunk, fFlags, &pNetwork); if (RT_SUCCESS(rc)) { - rc = intnetR0NetworkCreateIf(pNetwork, pSession, cbSend, cbRecv, phIf); + rc = intnetR0NetworkCreateIf(pNetwork, pSession, cbSend, cbRecv, fFlags, phIf); if (RT_SUCCESS(rc)) + { + intnetR0AdaptOpenNetworkFlags(pNetwork, fFlags); rc = VINF_ALREADY_INITIALIZED; + } else SUPR0ObjRelease(pNetwork->pvObj, pSession); } @@ -5449,7 +5815,7 @@ INTNETR0DECL(int) IntNetR0Open(PSUPDRVSESSION pSession, const char *pszNetwork, rc = intnetR0CreateNetwork(pIntNet, pSession, pszNetwork, enmTrunkType, pszTrunk, fFlags, &pNetwork); if (RT_SUCCESS(rc)) { - rc = intnetR0NetworkCreateIf(pNetwork, pSession, cbSend, cbRecv, phIf); + rc = intnetR0NetworkCreateIf(pNetwork, pSession, cbSend, cbRecv, fFlags, phIf); if (RT_FAILURE(rc)) SUPR0ObjRelease(pNetwork->pvObj, pSession); } diff --git a/src/VBox/Devices/Network/slirp/debug.c b/src/VBox/Devices/Network/slirp/debug.c index a3b0430c2..b6a51b11b 100644 --- a/src/VBox/Devices/Network/slirp/debug.c +++ b/src/VBox/Devices/Network/slirp/debug.c @@ -247,10 +247,10 @@ print_ether_address(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, int cchWidth, int cchPrecision, unsigned fFlags, void *pvUser) { - char *ether = (char *)pvUser; + char *ether = (char *)pvValue; AssertReturn(strcmp(pszType, "ether") == 0, 0); - if (ether != NULL) + if (ether) return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "[ether %hhx:%hhx:%hhx:%hhx:%hhx:%hhx]", ether[0], ether[1], ether[2], diff --git a/src/VBox/Devices/Network/slirp/slirp.c b/src/VBox/Devices/Network/slirp/slirp.c index ca4dc38f5..ffb663c1b 100644 --- a/src/VBox/Devices/Network/slirp/slirp.c +++ b/src/VBox/Devices/Network/slirp/slirp.c @@ -1459,7 +1459,14 @@ static void arp_input(PNATState pData, struct mbuf *m) /* We've received an announce about address assignment, * let's do an ARP cache update */ - slirp_arp_cache_update_or_add(pData, *(uint32_t *)ah->ar_tip, &eh->h_dest[0]); + static bool fGratuitousArpReported; + if (!fGratuitousArpReported) + { + LogRel(("NAT: Gratuitous ARP [IP:%R[IP4], ether:%R[ether]]\n", + ah->ar_sip, ah->ar_sha)); + fGratuitousArpReported = true; + } + slirp_arp_cache_update_or_add(pData, *(uint32_t *)ah->ar_sip, &ah->ar_sha[0]); } break; @@ -1957,7 +1964,8 @@ int slirp_arp_lookup_ether_by_ip(PNATState pData, uint32_t ip, uint8_t *ether) LIST_FOREACH(ac, &pData->arp_cache, list) { - if (ac->ip == ip) + if ( ac->ip == ip + && memcmp(ac->ether, broadcast_ethaddr, ETH_ALEN) != 0) { memcpy(ether, ac->ether, ETH_ALEN); return VINF_SUCCESS; @@ -2021,24 +2029,19 @@ void slirp_arp_who_has(PNATState pData, uint32_t dst) if_encap(pData, ETH_P_ARP, m, ETH_ENCAP_URG); } -int slirp_arp_cache_update_or_add(PNATState pData, uint32_t dst, const uint8_t *mac) -{ - if (slirp_arp_cache_update(pData, dst, mac)) - slirp_arp_cache_add(pData, dst, mac); - - return 0; -} - /* updates the arp cache + * @note: this is helper function, slirp_arp_cache_update_or_add should be used. * @returns 0 - if has found and updated * 1 - if hasn't found. */ -int slirp_arp_cache_update(PNATState pData, uint32_t dst, const uint8_t *mac) +static inline int slirp_arp_cache_update(PNATState pData, uint32_t dst, const uint8_t *mac) { struct arp_cache_entry *ac; + Assert(( memcmp(mac, broadcast_ethaddr, ETH_ALEN) + && memcmp(mac, zerro_ethaddr, ETH_ALEN))); LIST_FOREACH(ac, &pData->arp_cache, list) { - if (memcmp(ac->ether, mac, ETH_ALEN) == 0) + if (!memcmp(ac->ether, mac, ETH_ALEN)) { ac->ip = dst; return 0; @@ -2046,10 +2049,16 @@ int slirp_arp_cache_update(PNATState pData, uint32_t dst, const uint8_t *mac) } return 1; } +/** + * add entry to the arp cache + * @note: this is helper function, slirp_arp_cache_update_or_add should be used. + */ -void slirp_arp_cache_add(PNATState pData, uint32_t ip, const uint8_t *ether) +static inline void slirp_arp_cache_add(PNATState pData, uint32_t ip, const uint8_t *ether) { struct arp_cache_entry *ac = NULL; + Assert(( memcmp(ether, broadcast_ethaddr, ETH_ALEN) + && memcmp(ether, zerro_ethaddr, ETH_ALEN))); ac = RTMemAllocZ(sizeof(struct arp_cache_entry)); if (ac == NULL) { @@ -2061,6 +2070,31 @@ void slirp_arp_cache_add(PNATState pData, uint32_t ip, const uint8_t *ether) LIST_INSERT_HEAD(&pData->arp_cache, ac, list); } +/* updates or adds entry to the arp cache + * @returns 0 - if has found and updated + * 1 - if hasn't found. + */ +int slirp_arp_cache_update_or_add(PNATState pData, uint32_t dst, const uint8_t *mac) +{ + if ( !memcmp(mac, broadcast_ethaddr, ETH_ALEN) + || !memcmp(mac, zerro_ethaddr, ETH_ALEN)) + { + static bool fBroadcastEtherAddReported; + if (!fBroadcastEtherAddReported) + { + LogRel(("NAT: Attempt to add pair [%R[ether]:%R[IP4]] in ARP cache was ignored\n", + mac, &dst)); + fBroadcastEtherAddReported = true; + } + return 1; + } + if (slirp_arp_cache_update(pData, dst, mac)) + slirp_arp_cache_add(pData, dst, mac); + + return 0; +} + + void slirp_set_mtu(PNATState pData, int mtu) { if (mtu < 20 || mtu >= 16000) diff --git a/src/VBox/Devices/Network/slirp/slirp.h b/src/VBox/Devices/Network/slirp/slirp.h index e6268d755..b7f844d3f 100644 --- a/src/VBox/Devices/Network/slirp/slirp.h +++ b/src/VBox/Devices/Network/slirp/slirp.h @@ -343,8 +343,6 @@ struct tcpcb *tcp_drop(PNATState, struct tcpcb *tp, int err); /*slirp.c*/ void slirp_arp_who_has(PNATState pData, uint32_t dst); -int slirp_arp_cache_update(PNATState pData, uint32_t dst, const uint8_t *mac); -void slirp_arp_cache_add(PNATState pData, uint32_t ip, const uint8_t *ether); int slirp_arp_cache_update_or_add(PNATState pData, uint32_t dst, const uint8_t *mac); int slirp_init_dns_list(PNATState pData); void slirp_release_dns_list(PNATState pData); diff --git a/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp b/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp index 8397c4331..b6b7c7497 100644 --- a/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp +++ b/src/VBox/Devices/Network/testcase/tstIntNet-1.cpp @@ -447,7 +447,7 @@ static void doPacketSniffing(INTNETIFHANDLE hIf, PSUPDRVSESSION pSession, PINTNE WaitReq.hIf = hIf; WaitReq.cMillies = cMillies - (uint32_t)cElapsedMillies; int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_WAIT, 0, &WaitReq.Hdr); - if (rc == VERR_TIMEOUT) + if (rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED) break; if (RT_FAILURE(rc)) { @@ -749,7 +749,7 @@ int main(int argc, char **argv) return 1; case 'V': - RTPrintf("$Revision: 69206 $\n"); + RTPrintf("$Revision: 70859 $\n"); return 0; default: diff --git a/src/VBox/Devices/PC/DevHPET.cpp b/src/VBox/Devices/PC/DevHPET.cpp index 517aa89ae..467110b00 100644 --- a/src/VBox/Devices/PC/DevHPET.cpp +++ b/src/VBox/Devices/PC/DevHPET.cpp @@ -740,12 +740,12 @@ PDMBOTHCBDECL(int) hpetMMIORead(PPDMDEVINS pDevIns, rc = VINF_SUCCESS; break; } - // for 8-byte accesses we just split them, happens under lock anyway if ((iIndex >= 0x100) && (iIndex < 0x400)) { uint32_t iTimer = (iIndex - 0x100) / 0x20; uint32_t iTimerReg = (iIndex - 0x100) % 0x20; - + + /* for most 8-byte accesses we just split them, happens under lock anyway. */ rc = hpetTimerRegRead32(pThis, iTimer, iTimerReg, &value.u32[0]); if (RT_UNLIKELY(rc != VINF_SUCCESS)) break; @@ -753,10 +753,27 @@ PDMBOTHCBDECL(int) hpetMMIORead(PPDMDEVINS pDevIns, } else { - rc = hpetConfigRegRead32(pThis, iIndex, &value.u32[0]); - if (RT_UNLIKELY(rc != VINF_SUCCESS)) - break; - rc = hpetConfigRegRead32(pThis, iIndex+4, &value.u32[1]); + if (iIndex == HPET_COUNTER) + { + /* When reading HPET counter we must read it in a single read, + to avoid unexpected time jumps on 32-bit overflow. */ + value.u64 = + (pThis->u64HpetConfig & HPET_CFG_ENABLE) != 0 + ? + hpetGetTicks(pThis) + : + pThis->u64HpetCounter; + rc = VINF_SUCCESS; + } + else + { + /* for most 8-byte accesses we just split them, happens under lock anyway. */ + + rc = hpetConfigRegRead32(pThis, iIndex, &value.u32[0]); + if (RT_UNLIKELY(rc != VINF_SUCCESS)) + break; + rc = hpetConfigRegRead32(pThis, iIndex+4, &value.u32[1]); + } } if (rc == VINF_SUCCESS) *(uint64_t*)pv = value.u64; diff --git a/src/VBox/Devices/Storage/ATAController.cpp b/src/VBox/Devices/Storage/ATAController.cpp index 2855cd882..854276edc 100644 --- a/src/VBox/Devices/Storage/ATAController.cpp +++ b/src/VBox/Devices/Storage/ATAController.cpp @@ -1648,9 +1648,11 @@ static bool atapiGetConfigurationSS(AHCIATADevState *s) memset(pbBuf, '\0', 32); ataH2BE_U32(pbBuf, 16); /** @todo implement switching between CD-ROM and DVD-ROM profile (the only - * way to differentiate them right now is based on the image size). Also - * implement signalling "no current profile" if no medium is loaded. */ - ataH2BE_U16(pbBuf + 6, 0x08); /* current profile: read-only CD */ + * way to differentiate them right now is based on the image size). */ + if (s->cTotalSectors) + ataH2BE_U16(pbBuf + 6, 0x08); /* current profile: read-only CD */ + else + ataH2BE_U16(pbBuf + 6, 0x00); /* current profile: none -> no media */ ataH2BE_U16(pbBuf + 8, 0); /* feature 0: list of profiles supported */ pbBuf[10] = (0 << 2) | (1 << 1) | (1 || 0); /* version 0, persistent, current */ @@ -2289,7 +2291,7 @@ static void atapiParseCmdVirtualATAPI(AHCIATADevState *s) rc = VMR3ReqCallWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY, (PFNRT)s->pDrvMount->pfnUnmount, 3, s->pDrvMount, false /*=fForce*/, true /*=fEeject*/); - AssertReleaseRC(rc); + Assert(RT_SUCCESS(rc) || (rc == VERR_PDM_MEDIA_LOCKED) || (rc = VERR_PDM_MEDIA_NOT_MOUNTED)); { STAM_PROFILE_START(&pCtl->StatLockWait, a); PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS); diff --git a/src/VBox/Devices/Storage/DevAHCI.cpp b/src/VBox/Devices/Storage/DevAHCI.cpp index 2bb23abcc..a38b69d9f 100644 --- a/src/VBox/Devices/Storage/DevAHCI.cpp +++ b/src/VBox/Devices/Storage/DevAHCI.cpp @@ -3080,9 +3080,11 @@ static int atapiGetConfigurationSS(PAHCIPORTTASKSTATE pAhciPortTaskState, PAHCIP memset(aBuf, '\0', 32); ataH2BE_U32(aBuf, 16); /** @todo implement switching between CD-ROM and DVD-ROM profile (the only - * way to differentiate them right now is based on the image size). Also - * implement signalling "no current profile" if no medium is loaded. */ - ataH2BE_U16(aBuf + 6, 0x08); /* current profile: read-only CD */ + * way to differentiate them right now is based on the image size). */ + if (pAhciPort->cTotalSectors) + ataH2BE_U16(aBuf + 6, 0x08); /* current profile: read-only CD */ + else + ataH2BE_U16(aBuf + 6, 0x00); /* current profile: none -> no media */ ataH2BE_U16(aBuf + 8, 0); /* feature 0: list of profiles supported */ aBuf[10] = (0 << 2) | (1 << 1) | (1 || 0); /* version 0, persistent, current */ @@ -4040,7 +4042,7 @@ static AHCITXDIR atapiParseCmdVirtualATAPI(PAHCIPort pAhciPort, PAHCIPORTTASKSTA rc2 = VMR3ReqCallWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY, (PFNRT)pAhciPort->pDrvMount->pfnUnmount, 3, pAhciPort->pDrvMount, false/*=fForce*/, true/*=fEject*/); - Assert(RT_SUCCESS(rc2) || (rc == VERR_PDM_MEDIA_LOCKED)); + Assert(RT_SUCCESS(rc2) || (rc2 == VERR_PDM_MEDIA_LOCKED) || (rc2 = VERR_PDM_MEDIA_NOT_MOUNTED)); } break; case 3: /* 11 - Load media */ diff --git a/src/VBox/Devices/Storage/DevATA.cpp b/src/VBox/Devices/Storage/DevATA.cpp index 12f1d8b9c..3e054ebd0 100644 --- a/src/VBox/Devices/Storage/DevATA.cpp +++ b/src/VBox/Devices/Storage/DevATA.cpp @@ -2342,9 +2342,11 @@ static bool atapiGetConfigurationSS(ATADevState *s) memset(pbBuf, '\0', 32); ataH2BE_U32(pbBuf, 16); /** @todo implement switching between CD-ROM and DVD-ROM profile (the only - * way to differentiate them right now is based on the image size). Also - * implement signalling "no current profile" if no medium is loaded. */ - ataH2BE_U16(pbBuf + 6, 0x08); /* current profile: read-only CD */ + * way to differentiate them right now is based on the image size). */ + if (s->cTotalSectors) + ataH2BE_U16(pbBuf + 6, 0x08); /* current profile: read-only CD */ + else + ataH2BE_U16(pbBuf + 6, 0x00); /* current profile: none -> no media */ ataH2BE_U16(pbBuf + 8, 0); /* feature 0: list of profiles supported */ pbBuf[10] = (0 << 2) | (1 << 1) | (1 || 0); /* version 0, persistent, current */ @@ -2983,7 +2985,7 @@ static void atapiParseCmdVirtualATAPI(ATADevState *s) rc = VMR3ReqCallWait(PDMDevHlpGetVM(pDevIns), VMCPUID_ANY, (PFNRT)s->pDrvMount->pfnUnmount, 3, s->pDrvMount /*=fForce*/, true /*=fEject*/); - Assert(RT_SUCCESS(rc) || (rc == VERR_PDM_MEDIA_LOCKED)); + Assert(RT_SUCCESS(rc) || (rc == VERR_PDM_MEDIA_LOCKED) || (rc = VERR_PDM_MEDIA_NOT_MOUNTED)); { STAM_PROFILE_START(&pCtl->StatLockWait, a); PDMCritSectEnter(&pCtl->lock, VINF_SUCCESS); diff --git a/src/VBox/Devices/Storage/DevBusLogic.cpp b/src/VBox/Devices/Storage/DevBusLogic.cpp index d0e7ed72a..5193030da 100644 --- a/src/VBox/Devices/Storage/DevBusLogic.cpp +++ b/src/VBox/Devices/Storage/DevBusLogic.cpp @@ -401,6 +401,14 @@ typedef struct BUSLOGIC /** List of tasks which can be redone. */ R3PTRTYPE(volatile PBUSLOGICTASKSTATE) pTasksRedoHead; +#ifdef LOG_ENABLED +# if HC_ARCH_BITS == 64 + uint32_t Alignment4; +# endif + + volatile uint32_t cInMailboxesReady; +#endif + } BUSLOGIC, *PBUSLOGIC; /** Register offsets in the I/O port space. */ @@ -812,6 +820,23 @@ static void buslogicSetInterrupt(PBUSLOGIC pBusLogic, bool fSuppressIrq) } #if defined(IN_RING3) + +/** + * Advances the mailbox pointer to the next slot. + */ +DECLINLINE(void) buslogicOutgoingMailboxAdvance(PBUSLOGIC pBusLogic) +{ + pBusLogic->uMailboxOutgoingPositionCurrent = (pBusLogic->uMailboxOutgoingPositionCurrent + 1) % pBusLogic->cMailbox; +} + +/** + * Returns the physical address of the next outgoing mailbox to process. + */ +DECLINLINE(RTGCPHYS) buslogicOutgoingMailboxGetGCPhys(PBUSLOGIC pBusLogic) +{ + return pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->uMailboxOutgoingPositionCurrent * sizeof(Mailbox)); +} + /** * Initialize local RAM of host adapter with default values. * @@ -939,11 +964,19 @@ static void buslogicSendIncomingMailbox(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE RTGCPHYS GCPhysAddrMailboxIncoming = pBusLogic->GCPhysAddrMailboxIncomingBase + (pBusLogic->uMailboxIncomingPositionCurrent * sizeof(Mailbox)); RTGCPHYS GCPhysAddrCCB = (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB; + LogFlowFunc(("Completing CCB %RGp\n", GCPhysAddrCCB)); + /* Update CCB. */ pTaskState->CommandControlBlockGuest.uHostAdapterStatus = uHostAdapterStatus; pTaskState->CommandControlBlockGuest.uDeviceStatus = uDeviceStatus; PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrCCB, &pTaskState->CommandControlBlockGuest, sizeof(CommandControlBlock)); +#ifdef RT_STRICT + Mailbox Tmp; + PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming, &Tmp, sizeof(Mailbox)); + Assert(Tmp.u.in.uCompletionCode == BUSLOGIC_MAILBOX_INCOMING_COMPLETION_FREE); +#endif + /* Update mailbox. */ PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming, &pTaskState->MailboxGuest, sizeof(Mailbox)); @@ -952,6 +985,10 @@ static void buslogicSendIncomingMailbox(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE if (pBusLogic->uMailboxIncomingPositionCurrent >= pBusLogic->cMailbox) pBusLogic->uMailboxIncomingPositionCurrent = 0; +#ifdef LOG_ENABLED + ASMAtomicIncU32(&pBusLogic->cInMailboxesReady); +#endif + pBusLogic->regInterrupt |= BUSLOGIC_REGISTER_INTERRUPT_INCOMING_MAILBOX_LOADED; buslogicSetInterrupt(pBusLogic, false); @@ -1598,6 +1635,11 @@ static int buslogicRegisterWrite(PBUSLOGIC pBusLogic, unsigned iRegister, uint8_ if (rc != VINF_SUCCESS) return rc; +#ifdef LOG_ENABLED + uint32_t cMailboxesReady = ASMAtomicXchgU32(&pBusLogic->cInMailboxesReady, 0); + Log(("%u incoming mailboxes are ready when this interrupt was cleared\n", cMailboxesReady)); +#endif + if (uVal & BUSLOGIC_REGISTER_CONTROL_INTERRUPT_RESET) buslogicClearInterrupt(pBusLogic); @@ -1619,8 +1661,6 @@ static int buslogicRegisterWrite(PBUSLOGIC pBusLogic, unsigned iRegister, uint8_ /* Fast path for mailbox execution command. */ if ((uVal == BUSLOGICCOMMAND_EXECUTE_MAILBOX_COMMAND) && (pBusLogic->uOperationCode == 0xff)) { - AssertMsg(pBusLogic->cMailboxesReady < pBusLogic->cMailbox, - ("Mailbox count exceeded, max is %u\n", pBusLogic->cMailbox)); ASMAtomicIncU32(&pBusLogic->cMailboxesReady); if (!ASMAtomicXchgBool(&pBusLogic->fNotificationSend, true)) { @@ -2260,35 +2300,53 @@ static int buslogicProcessMailboxNext(PBUSLOGIC pBusLogic) if (!pBusLogic->fStrictRoundRobinMode) { - /* Search for a filled mailbox. */ + /* Search for a filled mailbox - stop if we have scanned all mailboxes. */ + uint8_t uMailboxPosCur = pBusLogic->uMailboxOutgoingPositionCurrent; + do { /* Fetch mailbox from guest memory. */ - GCPhysAddrMailboxCurrent = pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->uMailboxOutgoingPositionCurrent * sizeof(Mailbox)); + GCPhysAddrMailboxCurrent = buslogicOutgoingMailboxGetGCPhys(pBusLogic); PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent, &pTaskState->MailboxGuest, sizeof(Mailbox)); - pBusLogic->uMailboxOutgoingPositionCurrent++; - - /* Check if we reached the end and start from the beginning if so. */ - if (pBusLogic->uMailboxOutgoingPositionCurrent >= pBusLogic->cMailbox) - pBusLogic->uMailboxOutgoingPositionCurrent = 0; - } while (pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_FREE); + /* Check the next mailbox. */ + buslogicOutgoingMailboxAdvance(pBusLogic); + } while ( pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_FREE + && uMailboxPosCur != pBusLogic->uMailboxOutgoingPositionCurrent); } else { /* Fetch mailbox from guest memory. */ - GCPhysAddrMailboxCurrent = pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->uMailboxOutgoingPositionCurrent * sizeof(Mailbox)); + GCPhysAddrMailboxCurrent = buslogicOutgoingMailboxGetGCPhys(pBusLogic); PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent, &pTaskState->MailboxGuest, sizeof(Mailbox)); } + /* + * Check if the mailbox is actually loaded. + * It might be possible that the guest notified us without + * a loaded mailbox. Do nothing in that case but leave a + * log entry. + */ + if (pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_FREE) + { + Log(("No loaded mailbox left\n")); + RTMemCacheFree(pBusLogic->hTaskCache, pTaskState); + return VERR_NO_DATA; + } + + LogFlow(("Got loaded mailbox at slot %u, CCB phys %RGp\n", pBusLogic->uMailboxOutgoingPositionCurrent, pTaskState->MailboxGuest.u32PhysAddrCCB)); #ifdef DEBUG buslogicDumpMailboxInfo(&pTaskState->MailboxGuest, true); #endif + /* We got the mailbox, mark it as free in the guest. */ + uint8_t uActionCode = BUSLOGIC_MAILBOX_OUTGOING_ACTION_FREE; + PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent + RT_OFFSETOF(Mailbox, u.out.uActionCode), &uActionCode, sizeof(uActionCode)); + if (pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_START_COMMAND) rc = buslogicDeviceSCSIRequestSetup(pBusLogic, pTaskState); else if (pTaskState->MailboxGuest.u.out.uActionCode == BUSLOGIC_MAILBOX_OUTGOING_ACTION_ABORT_COMMAND) @@ -2300,18 +2358,9 @@ static int buslogicProcessMailboxNext(PBUSLOGIC pBusLogic) AssertRC(rc); - /* We got the mailbox, mark it as free in the guest. */ - pTaskState->MailboxGuest.u.out.uActionCode = BUSLOGIC_MAILBOX_OUTGOING_ACTION_FREE; - PDMDevHlpPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent, &pTaskState->MailboxGuest, sizeof(Mailbox)); - + /* Advance to the next mailbox. */ if (pBusLogic->fStrictRoundRobinMode) - { - pBusLogic->uMailboxOutgoingPositionCurrent++; - - /* Check if we reached the end and start from the beginning if so. */ - if (pBusLogic->uMailboxOutgoingPositionCurrent >= pBusLogic->cMailbox) - pBusLogic->uMailboxOutgoingPositionCurrent = 0; - } + buslogicOutgoingMailboxAdvance(pBusLogic); return rc; } @@ -2328,28 +2377,19 @@ static int buslogicProcessMailboxNext(PBUSLOGIC pBusLogic) static DECLCALLBACK(bool) buslogicNotifyQueueConsumer(PPDMDEVINS pDevIns, PPDMQUEUEITEMCORE pItem) { PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC); - uint32_t cMailboxesReady = 0; /* Reset notification send flag now. */ Assert(pBusLogic->fNotificationSend); ASMAtomicXchgBool(&pBusLogic->fNotificationSend, false); - - /* - * It is possible that there is a notification send but that there is no mailbox ready - * in the SMP case. Just do nothing. - */ - cMailboxesReady = ASMAtomicXchgU32(&pBusLogic->cMailboxesReady, 0); - if (!cMailboxesReady) - return true; + ASMAtomicXchgU32(&pBusLogic->cMailboxesReady, 0); /* @todo: Actually not required anymore but to stay compatible with older saved states. */ /* Process mailboxes. */ + int rc; do { - int rc; - rc = buslogicProcessMailboxNext(pBusLogic); - AssertMsgRC(rc, ("Processing mailbox failed rc=%Rrc\n", rc)); - } while (--cMailboxesReady > 0); + AssertMsg(RT_SUCCESS(rc) || rc == VERR_NO_DATA, ("Processing mailbox failed rc=%Rrc\n", rc)); + } while (RT_SUCCESS(rc)); return true; } diff --git a/src/VBox/Devices/Storage/DrvVD.cpp b/src/VBox/Devices/Storage/DrvVD.cpp index d9faea633..2b906cb24 100644 --- a/src/VBox/Devices/Storage/DrvVD.cpp +++ b/src/VBox/Devices/Storage/DrvVD.cpp @@ -744,7 +744,7 @@ static DECLCALLBACK(int) drvvdINIPSelectOne(VDSOCKET Sock, RTMSINTERVAL cMillies PINIPSOCKET pSocketInt = (PINIPSOCKET)Sock; fd_set fdsetR; FD_ZERO(&fdsetR); - FD_SET((uintptr_t)Sock, &fdsetR); + FD_SET((uintptr_t)pSocketInt->hSock, &fdsetR); fd_set fdsetE = fdsetR; int rc; diff --git a/src/VBox/Devices/USB/USBProxyDevice.cpp b/src/VBox/Devices/USB/USBProxyDevice.cpp index f13898ccc..8c036e07b 100644 --- a/src/VBox/Devices/USB/USBProxyDevice.cpp +++ b/src/VBox/Devices/USB/USBProxyDevice.cpp @@ -268,6 +268,34 @@ static int count_descriptors(struct desc_counts *cnt, uint8_t *buf, size_t len) return 1; } +/* Given the pointer to an interface or endpoint descriptor, find any following + * non-standard (vendor or class) descriptors. + */ +static const void *collect_stray_bits(uint8_t *this_desc, uint8_t *end, uint16_t *cbExtra) +{ + uint8_t *tmp, *buf; + uint8_t type; + + Assert(*(this_desc + 1) == VUSB_DT_INTERFACE || *(this_desc + 1) == VUSB_DT_ENDPOINT); + buf = this_desc; + + /* Skip the current interface/endpoint descriptor. */ + buf += *(uint8_t *)buf; + + /* Loop until we find another descriptor we understand. */ + for (tmp = buf; ((tmp + 1) < end) && *tmp; tmp += *tmp) + { + type = *(tmp + 1); + if (type == VUSB_DT_INTERFACE || type == VUSB_DT_ENDPOINT) + break; + } + *cbExtra = tmp - buf; + if (*cbExtra) + return buf; + else + return NULL; +} + /* Setup a vusb_interface structure given some preallocated structures * to use, (we counted them already) */ @@ -278,6 +306,7 @@ static int copy_interface(PVUSBINTERFACE pIf, uint8_t ifnum, PVUSBDESCINTERFACEEX cur_if = NULL; uint32_t altmap[4] = {0,}; uint8_t *tmp, *end = buf + len; + uint8_t *orig_desc = buf; uint8_t alt; int state; size_t num_ep = 0; @@ -319,7 +348,15 @@ static int copy_interface(PVUSBINTERFACE pIf, uint8_t ifnum, pIf->paSettings = cur_if; memcpy(cur_if, ifd, sizeof(cur_if->Core)); - /** @todo copy any additional descriptor bytes into pvMore */ + + /* Point to additional interface descriptor bytes, if any. */ + AssertCompile(sizeof(cur_if->Core) == VUSB_DT_INTERFACE_MIN_LEN); + if (cur_if->Core.bLength - VUSB_DT_INTERFACE_MIN_LEN > 0) + cur_if->pvMore = tmp + VUSB_DT_INTERFACE_MIN_LEN; + else + cur_if->pvMore = NULL; + + cur_if->pvClass = collect_stray_bits(tmp, end, &cur_if->cbClass); pIf->cSettings++; @@ -342,7 +379,16 @@ static int copy_interface(PVUSBINTERFACE pIf, uint8_t ifnum, return 0; memcpy(cur_ep, epd, sizeof(cur_ep->Core)); - /** @todo copy any additional descriptor bytes into pvMore */ + + /* Point to additional endpoint descriptor bytes, if any. */ + AssertCompile(sizeof(cur_ep->Core) == VUSB_DT_ENDPOINT_MIN_LEN); + if (cur_ep->Core.bLength - VUSB_DT_ENDPOINT_MIN_LEN > 0) + cur_ep->pvMore = tmp + VUSB_DT_ENDPOINT_MIN_LEN; + else + cur_ep->pvMore = NULL; + + cur_ep->pvClass = collect_stray_bits(tmp, end, &cur_ep->cbClass); + cur_ep->Core.wMaxPacketSize = RT_LE2H_U16(cur_ep->Core.wMaxPacketSize); num_ep++; @@ -404,6 +450,9 @@ static bool copy_config(PUSBPROXYDEV pProxyDev, uint8_t idx, PVUSBDESCCONFIGEX o return false; } + /* Stash a pointer to the raw config descriptor; we may need bits of it later. */ + out->pvOriginal = descs; + pIf = (PVUSBINTERFACE)out->paIfs; ifd = (PVUSBDESCINTERFACEEX)&pIf[cnt.num_if]; epd = (PVUSBDESCENDPOINTEX)&ifd[cnt.num_id]; @@ -420,12 +469,11 @@ static bool copy_config(PUSBPROXYDEV pProxyDev, uint8_t idx, PVUSBDESCCONFIGEX o for(i=0; i < 4; i++) for(x=0; x < 32; x++) if ( cnt.idmap[i] & (1 << x) ) - if ( !copy_interface(pIf++, (i << 6) | x, &ifd, &epd, (uint8_t *)descs, tot_len) ) { + if ( !copy_interface(pIf++, (i << 6) | x, &ifd, &epd, (uint8_t *)out->pvOriginal, tot_len) ) { Log(("copy_interface(%d,,) failed\n", pIf - 1)); goto err; } - free_desc(descs); return true; err: Log(("usb-proxy: config%u: Corrupted configuration descriptor\n", idx)); @@ -668,7 +716,10 @@ static DECLCALLBACK(void) usbProxyDestruct(PPDMUSBINS pUsbIns) if (pThis->paCfgDescs) { for (unsigned i = 0; i < pThis->DevDesc.bNumConfigurations; i++) + { RTMemFree((void *)pThis->paCfgDescs[i].paIfs); + RTMemFree((void *)pThis->paCfgDescs[i].pvOriginal); + } /** @todo bugref{2693} cleanup */ RTMemFree(pThis->paCfgDescs); pThis->paCfgDescs = NULL; diff --git a/src/VBox/Devices/VMMDev/VMMDev.cpp b/src/VBox/Devices/VMMDev/VMMDev.cpp index 11fb0099b..bd9f65e81 100644 --- a/src/VBox/Devices/VMMDev/VMMDev.cpp +++ b/src/VBox/Devices/VMMDev/VMMDev.cpp @@ -437,8 +437,16 @@ static DECLCALLBACK(int) vmmdevRequestHandler(PPDMDEVINS pDevIns, void *pvUser, && requestHeader.requestType != VMMDevReq_ReportGuestInfo && requestHeader.requestType != VMMDevReq_WriteCoreDump) { - Log(("VMMDev: guest has not yet reported to us. Refusing operation.\n")); + Log(("VMMDev: guest has not yet reported to us. Refusing operation of request #%d!\n", + requestHeader.requestType)); requestHeader.rc = VERR_NOT_SUPPORTED; + static int cRelWarn; + if (cRelWarn < 10) + { + cRelWarn++; + LogRel(("VMMDev: the guest has not yet reported to us -- refusing operation of request #%d\n", + requestHeader.requestType)); + } rcRet = VINF_SUCCESS; goto l_end; } @@ -446,7 +454,12 @@ static DECLCALLBACK(int) vmmdevRequestHandler(PPDMDEVINS pDevIns, void *pvUser, /* Check upper limit */ if (requestHeader.size > VMMDEV_MAX_VMMDEVREQ_SIZE) { - LogRel(("VMMDev: request packet too big (%x). Refusing operation.\n", requestHeader.size)); + static int cRelWarn; + if (cRelWarn < 50) + { + cRelWarn++; + LogRel(("VMMDev: request packet too big (%x). Refusing operation.\n", requestHeader.size)); + } requestHeader.rc = VERR_NOT_SUPPORTED; rcRet = VINF_SUCCESS; goto l_end; diff --git a/src/VBox/Frontends/Common/VBoxKeyboard/keyboard.c b/src/VBox/Frontends/Common/VBoxKeyboard/keyboard.c index 224d7c6e1..835abe295 100644 --- a/src/VBox/Frontends/Common/VBoxKeyboard/keyboard.c +++ b/src/VBox/Frontends/Common/VBoxKeyboard/keyboard.c @@ -609,6 +609,10 @@ X11DRV_InitKeyboardByXkb(Display *pDisplay) * succeeded, and to 0 otherwise * @param remapScancode array of tuples that remap the keycode (first * part) to a scancode (second part) + * @note Xkb takes precedence over byType takes precedence over byLayout, + * for anyone who wants to log information about which method is in + * use. byLayout is the fallback, as it is likely to be partly usable + * even if it doesn't initialise correctly. */ unsigned X11DRV_InitKeyboard(Display *display, unsigned *byLayoutOK, unsigned *byTypeOK, unsigned *byXkbOK, diff --git a/src/VBox/Frontends/Common/VBoxKeyboard/xkbtoscan.h b/src/VBox/Frontends/Common/VBoxKeyboard/xkbtoscan.h index 623d75dd7..f9f346b3d 100644 --- a/src/VBox/Frontends/Common/VBoxKeyboard/xkbtoscan.h +++ b/src/VBox/Frontends/Common/VBoxKeyboard/xkbtoscan.h @@ -168,9 +168,9 @@ struct { "I128", 0x0 }, { "I129", 0x7e }, { "HNGL", 0xf2 }, - { "HJCV", 0xf1 }, + { "HJCV", 0xf1 }, */ { "AE13", 0x7d }, - { "LWIN", 0x15b }, +/* { "LWIN", 0x15b }, { "RWIN", 0x15c }, { "COMP", 0x15d }, { "STOP", 0x168 }, diff --git a/src/VBox/Frontends/Makefile.kmk b/src/VBox/Frontends/Makefile.kmk index 215c0826d..bef60be9d 100644 --- a/src/VBox/Frontends/Makefile.kmk +++ b/src/VBox/Frontends/Makefile.kmk @@ -4,7 +4,7 @@ # # -# Copyright (C) 2006-2007 Oracle Corporation +# Copyright (C) 2006-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -23,6 +23,9 @@ ifdef VBOX_WITH_MAIN include $(PATH_SUB_CURRENT)/VBoxManage/Makefile.kmk endif ifndef VBOX_ONLY_DOCS + ifndef VBOX_OSE + include $(PATH_SUB_CURRENT)/VBoxBalloonCtrl/Makefile.kmk + endif ifdef VBOX_WITH_VBOXSDL include $(PATH_SUB_CURRENT)/VBoxSDL/Makefile.kmk endif diff --git a/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp b/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp index 8c30c5d33..d798924dd 100644 --- a/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp +++ b/src/VBox/Frontends/VBoxBFE/VBoxBFE.cpp @@ -10,7 +10,7 @@ */ /* - * Copyright (C) 2006-2009 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -1135,8 +1135,9 @@ DECLCALLBACK(int) VMPowerUpThread(RTTHREAD Thread, void *pvUser) static char s_szError[RTPATH_MAX + 128] = ""; PRTLOGGER pLogger; rc2 = RTLogCreateEx(&pLogger, RTLOGFLAGS_PREFIX_TIME_PROG, "all", - "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, - RTLOGDEST_FILE, s_szError, sizeof(s_szError), "./VBoxBFE.log"); + "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, RTLOGDEST_FILE, + NULL /* pfnBeginEnd */, 0 /* cHistory */, 0 /* cbHistoryFileMax */, 0 /* uHistoryTimeMax */, + s_szError, sizeof(s_szError), "./VBoxBFE.log"); if (RT_SUCCESS(rc2)) { /* some introductory information */ diff --git a/src/VBox/Frontends/VBoxBalloonCtrl/Makefile.kmk b/src/VBox/Frontends/VBoxBalloonCtrl/Makefile.kmk new file mode 100644 index 000000000..a5e3742e6 --- /dev/null +++ b/src/VBox/Frontends/VBoxBalloonCtrl/Makefile.kmk @@ -0,0 +1,29 @@ +# $Id: Makefile.kmk $ +## @file +# VBoxBalloonCtrl - Memory balloon control. +# + +# +# Copyright (C) 2011 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. +# + +SUB_DEPTH = ../../../.. +include $(KBUILD_PATH)/subheader.kmk + +PROGRAMS += VBoxBalloonCtrl + VBoxBalloonCtrl_TEMPLATE = VBOXMAINCLIENTEXE + VBoxBalloonCtrl_DEFS += \ + VBOX_BUILD_TARGET=\"$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)\" + VBoxBalloonCtrl_DEFS.win = _WIN32_WINNT=0x0500 + VBoxBalloonCtrl_SOURCES = \ + VBoxBalloonCtrl.cpp + +include $(KBUILD_PATH)/subfooter.kmk diff --git a/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.cpp b/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.cpp new file mode 100644 index 000000000..70cd3dbdd --- /dev/null +++ b/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.cpp @@ -0,0 +1,1368 @@ +/* $Id: VBoxBalloonCtrl.cpp $ */ +/** @file + * VBoxBalloonCtrl - VirtualBox Ballooning Control Service. + */ + +/* + * Copyright (C) 2011 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 * +*******************************************************************************/ +#ifndef VBOX_ONLY_DOCS +# include <VBox/com/com.h> +# include <VBox/com/string.h> +# include <VBox/com/Guid.h> +# include <VBox/com/array.h> +# include <VBox/com/ErrorInfo.h> +# include <VBox/com/errorprint.h> + +# include <VBox/com/EventQueue.h> +# include <VBox/com/listeners.h> +# include <VBox/com/VirtualBox.h> +#endif /* !VBOX_ONLY_DOCS */ + +#include <VBox/err.h> +#include <VBox/log.h> +#include <VBox/version.h> + +#include <package-generated.h> + +#include <iprt/asm.h> +#include <iprt/buildconfig.h> +#include <iprt/critsect.h> +#include <iprt/getopt.h> +#include <iprt/initterm.h> +#include <iprt/path.h> +#include <iprt/process.h> +#include <iprt/semaphore.h> +#include <iprt/stream.h> +#include <iprt/string.h> +#include <iprt/system.h> + +#include <map> +#include <string> +#include <signal.h> + +#include "VBoxBalloonCtrl.h" + +using namespace com; + +/* When defined, use a global performance collector instead + * of a per-machine based one. */ +#define VBOX_BALLOONCTRL_GLOBAL_PERFCOL + +/** The semaphore we're blocking on. */ +static RTSEMEVENTMULTI g_BalloonControlEvent = NIL_RTSEMEVENTMULTI; + +/** The critical section for keep our stuff in sync. */ +static RTCRITSECT g_MapCritSect; + +/** Set by the signal handler. */ +static volatile bool g_fCanceled = false; + +static uint32_t g_cHistory = 10; /* Enable log rotation, 10 files. */ +static uint32_t g_uHistoryFileTime = RT_SEC_1DAY; /* Max 1 day per file. */ +static uint64_t g_uHistoryFileSize = 100 * _1M; /* Max 100MB per file. */ + +static bool g_fVerbose = false; + +#if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) || defined (RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) +/** Run in background. */ +static bool g_fDaemonize = false; +#endif + +/** + * RTGetOpt-IDs for the command line. + */ +enum GETOPTDEF_BALLOONCTRL +{ + GETOPTDEF_BALLOONCTRL_BALLOOINC = 1000, + GETOPTDEF_BALLOONCTRL_BALLOONDEC, + GETOPTDEF_BALLOONCTRL_BALLOONLOWERLIMIT, + GETOPTDEF_BALLOONCTRL_BALLOONMAX +}; + +/** + * Command line arguments. + */ +static const RTGETOPTDEF g_aOptions[] = { +#if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) || defined (RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) + { "--background", 'b', RTGETOPT_REQ_NOTHING }, +#endif + /** For displayHelp(). */ + { "--help", 'h', RTGETOPT_REQ_NOTHING }, + /** Sets g_ulTimeoutMS. */ + { "--interval", 'i', RTGETOPT_REQ_INT32 }, + /** Sets g_ulMemoryBalloonIncrementMB. */ + { "--balloon-inc", GETOPTDEF_BALLOONCTRL_BALLOOINC, RTGETOPT_REQ_INT32 }, + /** Sets g_ulMemoryBalloonDecrementMB. */ + { "--balloon-dec", GETOPTDEF_BALLOONCTRL_BALLOONDEC, RTGETOPT_REQ_INT32 }, + { "--balloon-lower-limit", GETOPTDEF_BALLOONCTRL_BALLOONLOWERLIMIT, RTGETOPT_REQ_INT32 }, + /** Global max. balloon limit. */ + { "--balloon-max", GETOPTDEF_BALLOONCTRL_BALLOONMAX, RTGETOPT_REQ_INT32 }, + { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, + { "--pidfile", 'P', RTGETOPT_REQ_STRING }, + { "--logfile", 'F', RTGETOPT_REQ_STRING }, + { "--logrotate", 'R', RTGETOPT_REQ_UINT32 }, + { "--logsize", 'S', RTGETOPT_REQ_UINT64 }, + { "--loginterval", 'I', RTGETOPT_REQ_UINT32 } +}; + +unsigned long g_ulTimeoutMS = 30 * 1000; /* Default is 30 seconds timeout. */ +unsigned long g_ulMemoryBalloonIncrementMB = 256; +unsigned long g_ulMemoryBalloonDecrementMB = 128; +/** Global balloon limit is 0, so disabled. Can be overridden by a per-VM + * "VBoxInternal/Guest/BalloonSizeMax" value. */ +unsigned long g_ulMemoryBalloonMaxMB = 0; +unsigned long g_ulLowerMemoryLimitMB = 64; + +/** Global objects. */ +static ComPtr<IVirtualBoxClient> g_pVirtualBoxClient = NULL; +static ComPtr<IVirtualBox> g_pVirtualBox = NULL; +static ComPtr<ISession> g_pSession = NULL; +static ComPtr<IEventSource> g_pEventSource = NULL; +static ComPtr<IEventSource> g_pEventSourceClient = NULL; +static ComPtr<IEventListener> g_pVBoxEventListener = NULL; +# ifdef VBOX_BALLOONCTRL_GLOBAL_PERFCOL +static ComPtr<IPerformanceCollector> g_pPerfCollector = NULL; +# endif +static EventQueue *g_pEventQ = NULL; + +/** A machine's internal entry. */ +typedef struct VBOXBALLOONCTRL_MACHINE +{ + ComPtr<IMachine> machine; + unsigned long ulBalloonSizeMax; +#ifndef VBOX_BALLOONCTRL_GLOBAL_PERFCOL + ComPtr<IPerformanceCollector> collector; +#endif +} VBOXBALLOONCTRL_MACHINE, *PVBOXBALLOONCTRL_MACHINE; +typedef std::map<Bstr, VBOXBALLOONCTRL_MACHINE> mapVM; +typedef std::map<Bstr, VBOXBALLOONCTRL_MACHINE>::iterator mapVMIter; +typedef std::map<Bstr, VBOXBALLOONCTRL_MACHINE>::const_iterator mapVMIterConst; +mapVM g_mapVM; + +/* Prototypes. */ +#define serviceLogVerbose(a) if (g_fVerbose) { serviceLog a; } +void serviceLog(const char *pszFormat, ...); + +bool machineIsRunning(MachineState_T enmState); +mapVMIter machineGetByUUID(const Bstr &strUUID); +int machineAdd(const ComPtr<IMachine> &rptrMachine); +int machineUpdate(const ComPtr<IMachine> &rptrMachine, MachineState_T enmState); +int machineUpdate(mapVMIter it, MachineState_T enmState); +void machineRemove(mapVMIter it); + +unsigned long balloonGetMaxSize(const ComPtr<IMachine> &rptrMachine); +bool balloonIsRequired(mapVMIter it); +int balloonUpdate(mapVMIterConst it); + +HRESULT balloonCtrlSetup(); +void balloonCtrlShutdown(); + +HRESULT createGlobalObjects(); +void deleteGlobalObjects(); + +#ifdef RT_OS_WINDOWS +/* Required for ATL. */ +static CComModule _Module; +#endif + +/** + * Handler for global events. + */ +class VirtualBoxEventListener +{ + public: + VirtualBoxEventListener() + { + } + + virtual ~VirtualBoxEventListener() + { + } + + STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent *aEvent) + { + switch (aType) + { + case VBoxEventType_OnMachineRegistered: + { + ComPtr<IMachineRegisteredEvent> pEvent = aEvent; + Assert(pEvent); + + Bstr uuid; + BOOL fRegistered; + HRESULT hr = pEvent->COMGETTER(Registered)(&fRegistered); + if (SUCCEEDED(hr)) + hr = pEvent->COMGETTER(MachineId)(uuid.asOutParam()); + + if (SUCCEEDED(hr)) + { + int rc = RTCritSectEnter(&g_MapCritSect); + if (RT_SUCCESS(rc)) + { + if (fRegistered) + { + ComPtr <IMachine> machine; + hr = g_pVirtualBox->FindMachine(uuid.raw(), machine.asOutParam()); + if (SUCCEEDED(hr)) + rc = machineAdd(machine); + else + rc = VERR_NOT_FOUND; + } + else + machineRemove(machineGetByUUID(uuid)); + AssertRC(rc); + + int rc2 = RTCritSectLeave(&g_MapCritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + } + break; + } + + case VBoxEventType_OnMachineStateChanged: + { + ComPtr<IMachineStateChangedEvent> pEvent = aEvent; + Assert(pEvent); + + MachineState_T machineState; + Bstr uuid; + + HRESULT hr = pEvent->COMGETTER(State)(&machineState); + if (SUCCEEDED(hr)) + hr = pEvent->COMGETTER(MachineId)(uuid.asOutParam()); + + if (SUCCEEDED(hr)) + { + int rc = RTCritSectEnter(&g_MapCritSect); + if (RT_SUCCESS(rc)) + { + mapVMIter it = machineGetByUUID(uuid); + if (it == g_mapVM.end()) + { + /* Use the machine object to figure out if we + * need to do something. */ + ComPtr <IMachine> machine; + hr = g_pVirtualBox->FindMachine(uuid.raw(), machine.asOutParam()); + if (SUCCEEDED(hr)) + rc = machineUpdate(machine, machineState); + } + else /* Update an existing machine. */ + rc = machineUpdate(it, machineState); + AssertRC(rc); + + int rc2 = RTCritSectLeave(&g_MapCritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + } + break; + } + + case VBoxEventType_OnVBoxSVCAvailabilityChanged: + { + ComPtr<IVBoxSVCAvailabilityChangedEvent> pVSACEv = aEvent; + Assert(pVSACEv); + BOOL fAvailable = FALSE; + pVSACEv->COMGETTER(Available)(&fAvailable); + if (!fAvailable) + { + serviceLog("VBoxSVC became unavailable\n"); + { + balloonCtrlShutdown(); + deleteGlobalObjects(); + } + } + else + { + serviceLog("VBoxSVC became available\n"); + HRESULT hrc = createGlobalObjects(); + if (FAILED(hrc)) + serviceLog("Unable to re-create local COM objects (rc=%Rhrc)!\n", hrc); + else + { + hrc = balloonCtrlSetup(); + if (FAILED(hrc)) + serviceLog("Unable to re-set up ballooning (rc=%Rhrc)!\n", hrc); + } + } + break; + } + + default: + /* Not handled event, just skip it. */ + break; + } + + return S_OK; + } + + private: +}; +typedef ListenerImpl<VirtualBoxEventListener> VirtualBoxEventListenerImpl; +VBOX_LISTENER_DECLARE(VirtualBoxEventListenerImpl) + + +/** + * Signal handler that sets g_fGuestCtrlCanceled. + * + * This can be executed on any thread in the process, on Windows it may even be + * a thread dedicated to delivering this signal. Do not doing anything + * unnecessary here. + */ +static void signalHandler(int iSignal) +{ + NOREF(iSignal); + ASMAtomicWriteBool(&g_fCanceled, true); + + if (g_BalloonControlEvent != NIL_RTSEMEVENTMULTI) + { + int rc = RTSemEventMultiSignal(g_BalloonControlEvent); + if (RT_FAILURE(rc)) + serviceLog("Error: RTSemEventMultiSignal failed with rc=%Rrc\n"); + } +} + +/** + * Installs a custom signal handler to get notified + * whenever the user wants to intercept the program. + */ +static void signalHandlerInstall() +{ + signal(SIGINT, signalHandler); +#ifdef SIGBREAK + signal(SIGBREAK, signalHandler); +#endif +} + +/** + * Uninstalls a previously installed signal handler. + */ +static void signalHandlerUninstall() +{ + signal(SIGINT, SIG_DFL); +#ifdef SIGBREAK + signal(SIGBREAK, SIG_DFL); +#endif +} + +long getlBalloonDelta(unsigned long ulCurrentDesktopBalloonSize, unsigned long ulDesktopFreeMemory, unsigned long ulMaxBalloonSize) +{ + if (ulCurrentDesktopBalloonSize > ulMaxBalloonSize) + return (ulMaxBalloonSize - ulCurrentDesktopBalloonSize); + + long lBalloonDelta = 0; + if (ulDesktopFreeMemory < g_ulLowerMemoryLimitMB) + { + /* Guest is running low on memory, we need to + * deflate the balloon. */ + lBalloonDelta = (g_ulMemoryBalloonDecrementMB * -1); + + /* Ensure that the delta will not return a negative + * balloon size. */ + if ((long)ulCurrentDesktopBalloonSize + lBalloonDelta < 0) + lBalloonDelta = 0; + } + else if (ulMaxBalloonSize > ulCurrentDesktopBalloonSize) + { + /* We want to inflate the balloon if we have room. */ + long lIncrement = g_ulMemoryBalloonIncrementMB; + while (lIncrement >= 16 && (ulDesktopFreeMemory - lIncrement) < g_ulLowerMemoryLimitMB) + { + lIncrement = (lIncrement / 2); + } + + if ((ulDesktopFreeMemory - lIncrement) > g_ulLowerMemoryLimitMB) + lBalloonDelta = lIncrement; + } + if (ulCurrentDesktopBalloonSize + lBalloonDelta > ulMaxBalloonSize) + lBalloonDelta = (ulMaxBalloonSize - ulCurrentDesktopBalloonSize); + return lBalloonDelta; +} + +/** + * Indicates whether a VM is up and running (regardless of its running + * state, could be paused as well). + * + * @return bool Flag indicating whether the VM is running or not. + * @param enmState The VM's machine state to judge whether it's running or not. + */ +bool machineIsRunning(MachineState_T enmState) +{ + switch (enmState) + { + case MachineState_Running: +#if 0 + /* Not required for ballooning. */ + case MachineState_Teleporting: + case MachineState_LiveSnapshotting: + case MachineState_Paused: + case MachineState_TeleportingPausedVM: +#endif + return true; + default: + break; + } + return false; +} + +mapVMIter machineGetByUUID(const Bstr &strUUID) +{ + return g_mapVM.find(strUUID); +} + +int machineAdd(const ComPtr<IMachine> &rptrMachine) +{ + HRESULT rc; + + do + { + VBOXBALLOONCTRL_MACHINE m; + m.machine = rptrMachine; + + /* + * Setup metrics. + */ + com::SafeArray<BSTR> metricNames(1); + com::SafeIfaceArray<IUnknown> metricObjects(1); + com::SafeIfaceArray<IPerformanceMetric> metricAffected; + + Bstr strMetricNames(L"Guest/RAM*"); + strMetricNames.cloneTo(&metricNames[0]); + + m.machine.queryInterfaceTo(&metricObjects[0]); + +#ifdef VBOX_BALLOONCTRL_GLOBAL_PERFCOL + CHECK_ERROR_BREAK(g_pPerfCollector, SetupMetrics(ComSafeArrayAsInParam(metricNames), + ComSafeArrayAsInParam(metricObjects), + 5 /* 5 seconds */, + 1 /* One sample is enough */, + ComSafeArrayAsOutParam(metricAffected))); +#else + CHECK_ERROR_BREAK(g_pVirtualBox, COMGETTER(PerformanceCollector)(m.collector.asOutParam())); + CHECK_ERROR_BREAK(m.collector, SetupMetrics(ComSafeArrayAsInParam(metricNames), + ComSafeArrayAsInParam(metricObjects), + 5 /* 5 seconds */, + 1 /* One sample is enough */, + ComSafeArrayAsOutParam(metricAffected))); +#endif + /* + * Add machine to map. + */ + Bstr strUUID; + CHECK_ERROR_BREAK(rptrMachine, COMGETTER(Id)(strUUID.asOutParam())); + + mapVMIter it = g_mapVM.find(strUUID); + Assert(it == g_mapVM.end()); + + g_mapVM.insert(std::make_pair(strUUID, m)); + + serviceLogVerbose(("Added machine \"%s\"\n", Utf8Str(strUUID).c_str())); + + } while (0); + + return SUCCEEDED(rc) ? VINF_SUCCESS : VERR_COM_IPRT_ERROR; /* @todo Find a better error! */ +} + +void machineRemove(mapVMIter it) +{ + if (it != g_mapVM.end()) + { + /* Must log before erasing the iterator because of the UUID ref! */ + serviceLogVerbose(("Removing machine \"%s\"\n", Utf8Str(it->first).c_str())); + + /* + * Remove machine from map. + */ + g_mapVM.erase(it); + } +} + +int machineUpdate(const ComPtr<IMachine> &rptrMachine, MachineState_T enmState) +{ + if ( !balloonGetMaxSize(rptrMachine) + || !machineIsRunning(enmState)) + { + return VINF_SUCCESS; /* Machine is not required to be added. */ + } + return machineAdd(rptrMachine); +} + +int machineUpdate(mapVMIter it, MachineState_T enmState) +{ + Assert(it != g_mapVM.end()); + + if ( !balloonIsRequired(it) + || !machineIsRunning(enmState)) + { + machineRemove(it); + return VINF_SUCCESS; + } + + return balloonUpdate(it); +} + +int getMetric(mapVMIterConst it, const Bstr& strName, LONG *pulData) +{ + AssertPtrReturn(pulData, VERR_INVALID_PARAMETER); + + /* Input. */ + com::SafeArray<BSTR> metricNames(1); + com::SafeIfaceArray<IUnknown> metricObjects(1); + it->second.machine.queryInterfaceTo(&metricObjects[0]); + + /* Output. */ + com::SafeArray<BSTR> retNames; + com::SafeIfaceArray<IUnknown> retObjects; + com::SafeArray<BSTR> retUnits; + com::SafeArray<ULONG> retScales; + com::SafeArray<ULONG> retSequenceNumbers; + com::SafeArray<ULONG> retIndices; + com::SafeArray<ULONG> retLengths; + com::SafeArray<LONG> retData; + + /* Query current memory free. */ + strName.cloneTo(&metricNames[0]); +#ifdef VBOX_BALLOONCTRL_GLOBAL_PERFCOL + HRESULT hrc = g_pPerfCollector->QueryMetricsData( +#else + HRESULT hrc = it->second.collector->QueryMetricsData( +#endif + ComSafeArrayAsInParam(metricNames), + ComSafeArrayAsInParam(metricObjects), + ComSafeArrayAsOutParam(retNames), + ComSafeArrayAsOutParam(retObjects), + ComSafeArrayAsOutParam(retUnits), + ComSafeArrayAsOutParam(retScales), + ComSafeArrayAsOutParam(retSequenceNumbers), + ComSafeArrayAsOutParam(retIndices), + ComSafeArrayAsOutParam(retLengths), + ComSafeArrayAsOutParam(retData)); +#if 0 + /* Useful for metrics debugging. */ + for (unsigned j = 0; j < retNames.size(); j++) + { + Bstr metricUnit(retUnits[j]); + Bstr metricName(retNames[j]); + RTPrintf("%-20ls ", metricName.raw()); + const char *separator = ""; + for (unsigned k = 0; k < retLengths[j]; k++) + { + if (retScales[j] == 1) + RTPrintf("%s%d %ls", separator, retData[retIndices[j] + k], metricUnit.raw()); + else + RTPrintf("%s%d.%02d%ls", separator, retData[retIndices[j] + k] / retScales[j], + (retData[retIndices[j] + k] * 100 / retScales[j]) % 100, metricUnit.raw()); + separator = ", "; + } + RTPrintf("\n"); + } +#endif + + if (SUCCEEDED(hrc)) + *pulData = retData.size() ? retData[retIndices[0]] : 0; + + return SUCCEEDED(hrc) ? VINF_SUCCESS : VINF_NOT_SUPPORTED; +} + +/** + * Determines the maximum balloon size to set for the specified machine. + * + * @return unsigned long Balloon size (in MB) to set, 0 if no ballooning required. + * @param rptrMachine Pointer to specified machine. + */ +unsigned long balloonGetMaxSize(const ComPtr<IMachine> &rptrMachine) +{ + /* + * Try to retrieve the balloon maximum size via the following order: + * - command line parameter ("--balloon-max") + * - per-VM parameter ("VBoxInternal/Guest/BalloonSizeMax") + * - global parameter ("VBoxInternal/Guest/BalloonSizeMax") + */ + unsigned long ulBalloonMax = g_ulMemoryBalloonMaxMB; /* Use global limit as default. */ + if (!ulBalloonMax) /* Not set by command line? */ + { + /* Try per-VM approach. */ + Bstr strValue; + HRESULT rc = rptrMachine->GetExtraData(Bstr("VBoxInternal/Guest/BalloonSizeMax").raw(), + strValue.asOutParam()); + if ( SUCCEEDED(rc) + && !strValue.isEmpty()) + { + ulBalloonMax = Utf8Str(strValue).toUInt32(); + } + } + if (!ulBalloonMax) /* Still not set by per-VM value? */ + { + /* Try global approach. */ + Bstr strValue; + HRESULT rc = g_pVirtualBox->GetExtraData(Bstr("VBoxInternal/Guest/BalloonSizeMax").raw(), + strValue.asOutParam()); + if ( SUCCEEDED(rc) + && !strValue.isEmpty()) + { + ulBalloonMax = Utf8Str(strValue).toUInt32(); + } + } + return ulBalloonMax; +} + +/** + * Determines whether ballooning is required to the spcified VM. + * + * @return bool True if ballooning is required, false if not. + * @param it Iterator pointing to the VM to be processed. + */ +bool balloonIsRequired(mapVMIter it) +{ + /* Only do ballooning if we have a maximum balloon size set. */ + it->second.ulBalloonSizeMax = balloonGetMaxSize(it->second.machine); + + return it->second.ulBalloonSizeMax ? true : false; +} + +/** + * Does the actual ballooning and assumes the machine is + * capable and ready for ballooning. + * + * @return IPRT status code. + * @param it Iterator pointing to the VM to be processed. + */ +int balloonUpdate(mapVMIterConst it) +{ + /* + * Get metrics collected at this point. + */ + LONG lMemFree, lBalloonCur; + int vrc = getMetric(it, L"Guest/RAM/Usage/Free", &lMemFree); + if (RT_SUCCESS(vrc)) + vrc = getMetric(it, L"Guest/RAM/Usage/Balloon", &lBalloonCur); + + if (RT_SUCCESS(vrc)) + { + /* If guest statistics are not up and running yet, skip this iteration + * and try next time. */ + if (lMemFree <= 0) + { +#ifdef DEBUG + serviceLogVerbose(("%s: No metrics available yet!\n", Utf8Str(it->first).c_str())); +#endif + return VINF_SUCCESS; + } + + lMemFree /= 1024; + lBalloonCur /= 1024; + + serviceLogVerbose(("%s: Balloon: %ld, Free mem: %ld, Max ballon: %ld\n", + Utf8Str(it->first).c_str(), + lBalloonCur, lMemFree, it->second.ulBalloonSizeMax)); + + /* Calculate current balloon delta. */ + long lDelta = getlBalloonDelta(lBalloonCur, lMemFree, it->second.ulBalloonSizeMax); + if (lDelta) /* Only do ballooning if there's really smth. to change ... */ + { + lBalloonCur = lBalloonCur + lDelta; + Assert(lBalloonCur > 0); + + serviceLog("%s: %s balloon by %ld to %ld ...\n", + Utf8Str(it->first).c_str(), + lDelta > 0 ? "Inflating" : "Deflating", lDelta, lBalloonCur); + + HRESULT rc; + + /* Open a session for the VM. */ + CHECK_ERROR(it->second.machine, LockMachine(g_pSession, LockType_Shared)); + + do + { + /* Get the associated console. */ + ComPtr<IConsole> console; + CHECK_ERROR_BREAK(g_pSession, COMGETTER(Console)(console.asOutParam())); + + ComPtr <IGuest> guest; + rc = console->COMGETTER(Guest)(guest.asOutParam()); + if (SUCCEEDED(rc)) + CHECK_ERROR_BREAK(guest, COMSETTER(MemoryBalloonSize)(lBalloonCur)); + else + serviceLog("Error: Unable to set new balloon size %ld for machine \"%s\", rc=%Rhrc", + lBalloonCur, Utf8Str(it->first).c_str(), rc); + } while (0); + + /* Unlock the machine again. */ + g_pSession->UnlockMachine(); + } + } + else + serviceLog("Error: Unable to retrieve metrics for machine \"%s\", rc=%Rrc", + Utf8Str(it->first).c_str(), vrc); + return vrc; +} + +void vmListDestroy() +{ + serviceLogVerbose(("Destroying VM list ...\n")); + + int rc = RTCritSectEnter(&g_MapCritSect); + if (RT_SUCCESS(rc)) + { + mapVMIter it = g_mapVM.begin(); + while (it != g_mapVM.end()) + { +#ifndef VBOX_BALLOONCTRL_GLOBAL_PERFCOL + it->second.collector.setNull(); +#endif + it->second.machine.setNull(); + it++; + } + + g_mapVM.clear(); + + rc = RTCritSectLeave(&g_MapCritSect); + } + AssertRC(rc); +} + +int vmListBuild() +{ + serviceLogVerbose(("Building VM list ...\n")); + + int rc = RTCritSectEnter(&g_MapCritSect); + if (RT_SUCCESS(rc)) + { + /* + * Make sure the list is empty. + */ + g_mapVM.clear(); + + /* + * Get the list of all _running_ VMs + */ + com::SafeIfaceArray<IMachine> machines; + HRESULT hrc = g_pVirtualBox->COMGETTER(Machines)(ComSafeArrayAsOutParam(machines)); + if (SUCCEEDED(hrc)) + { + /* + * Iterate through the collection + */ + for (size_t i = 0; i < machines.size(); ++i) + { + if (machines[i]) + { + Bstr strUUID; + CHECK_ERROR_BREAK(machines[i], COMGETTER(Id)(strUUID.asOutParam())); + + BOOL fAccessible; + CHECK_ERROR_BREAK(machines[i], COMGETTER(Accessible)(&fAccessible)); + if (!fAccessible) + { + serviceLogVerbose(("Machine \"%s\" is inaccessible, skipping\n", + Utf8Str(strUUID).c_str())); + continue; + } + + MachineState_T machineState; + CHECK_ERROR_BREAK(machines[i], COMGETTER(State)(&machineState)); + + if (g_fVerbose) + serviceLogVerbose(("Processing machine \"%s\" (state: %ld)\n", + Utf8Str(strUUID).c_str(), machineState)); + + if (machineIsRunning(machineState)) + { + rc = machineAdd(machines[i]); + if (RT_FAILURE(rc)) + break; + } + } + } + + if (!machines.size()) + serviceLogVerbose(("No machines to add found at the moment!\n")); + } + + int rc2 = RTCritSectLeave(&g_MapCritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + return rc; +} + +int balloonCtrlCheck() +{ + int rc = RTCritSectEnter(&g_MapCritSect); + if (RT_SUCCESS(rc)) + { + mapVMIter it = g_mapVM.begin(); + while (it != g_mapVM.end()) + { + MachineState_T machineState; + HRESULT hrc = it->second.machine->COMGETTER(State)(&machineState); + if (SUCCEEDED(hrc)) + { + rc = machineUpdate(it, machineState); + if (RT_FAILURE(rc)) + break; + } + it++; + } + + int rc2 = RTCritSectLeave(&g_MapCritSect); + if (RT_SUCCESS(rc)) + rc = rc2; + } + + return rc; +} + +HRESULT balloonCtrlSetup() +{ + HRESULT rc = S_OK; + + serviceLog("Setting up ballooning ...\n"); + + do + { + /* + * Setup metrics. + */ +#ifdef VBOX_BALLOONCTRL_GLOBAL_PERFCOL + CHECK_ERROR_BREAK(g_pVirtualBox, COMGETTER(PerformanceCollector)(g_pPerfCollector.asOutParam())); +#endif + + /* + * Build up initial VM list. + */ + int vrc = vmListBuild(); + if (RT_FAILURE(vrc)) + { + rc = VBOX_E_IPRT_ERROR; + break; + } + + } while (0); + + return rc; +} + +void balloonCtrlShutdown() +{ + serviceLog("Shutting down ballooning ...\n"); + + vmListDestroy(); + +#ifdef VBOX_BALLOONCTRL_GLOBAL_PERFCOL + g_pPerfCollector.setNull(); +#endif +} + +RTEXITCODE balloonCtrlMain(HandlerArg *a) +{ + HRESULT rc = S_OK; + + do + { + /* Initialize global weak references. */ + g_pEventQ = com::EventQueue::getMainEventQueue(); + + RTCritSectInit(&g_MapCritSect); + + int vrc = RTSemEventMultiCreate(&g_BalloonControlEvent); + AssertRCReturn(vrc, RTEXITCODE_FAILURE); + + /* + * Install signal handlers. + */ + signal(SIGINT, signalHandler); + #ifdef SIGBREAK + signal(SIGBREAK, signalHandler); + #endif + + /* + * Setup the global event listeners: + * - g_pEventSource for machine events + * - g_pEventSourceClient for VBoxClient events (like VBoxSVC handling) + */ + CHECK_ERROR_BREAK(g_pVirtualBox, COMGETTER(EventSource)(g_pEventSource.asOutParam())); + CHECK_ERROR_BREAK(g_pVirtualBoxClient, COMGETTER(EventSource)(g_pEventSourceClient.asOutParam())); + + com::SafeArray <VBoxEventType_T> eventTypes; + eventTypes.push_back(VBoxEventType_OnMachineRegistered); + eventTypes.push_back(VBoxEventType_OnMachineStateChanged); + eventTypes.push_back(VBoxEventType_OnVBoxSVCAvailabilityChanged); /* Processed by g_pEventSourceClient. */ + + g_pVBoxEventListener = new VirtualBoxEventListenerImpl(); + CHECK_ERROR_BREAK(g_pEventSource, RegisterListener(g_pVBoxEventListener, ComSafeArrayAsInParam(eventTypes), true /* Active listener */)); + CHECK_ERROR_BREAK(g_pEventSourceClient, RegisterListener(g_pVBoxEventListener, ComSafeArrayAsInParam(eventTypes), true /* Active listener */)); + + /* + * Set up ballooning stuff. + */ + rc = balloonCtrlSetup(); + if (FAILED(rc)) + break; + + for (;;) + { + /* + * Do the actual work. + */ + vrc = balloonCtrlCheck(); + if (RT_FAILURE(vrc)) + { + serviceLog("Error while doing ballooning control; rc=%Rrc\n", vrc); + break; + } + + /* + * Process pending events, then wait for new ones. Note, this + * processes NULL events signalling event loop termination. + */ + g_pEventQ->processEventQueue(500); + + if (g_fCanceled) + { + serviceLog("Signal caught, exiting ...\n"); + break; + } + + vrc = RTSemEventMultiWait(g_BalloonControlEvent, g_ulTimeoutMS); + if (vrc != VERR_TIMEOUT && RT_FAILURE(vrc)) + { + serviceLog("Error: RTSemEventMultiWait failed; rc=%Rrc\n", vrc); + break; + } + } + + signal(SIGINT, SIG_DFL); + #ifdef SIGBREAK + signal(SIGBREAK, SIG_DFL); + #endif + + /* VirtualBox callback unregistration. */ + if (g_pVBoxEventListener) + { + if (!g_pEventSource.isNull()) + CHECK_ERROR(g_pEventSource, UnregisterListener(g_pVBoxEventListener)); + g_pVBoxEventListener.setNull(); + } + + g_pEventSource.setNull(); + g_pEventSourceClient.setNull(); + + balloonCtrlShutdown(); + + RTCritSectDelete(&g_MapCritSect); + RTSemEventMultiDestroy(g_BalloonControlEvent); + g_BalloonControlEvent = NIL_RTSEMEVENTMULTI; + + if (RT_FAILURE(vrc)) + rc = VBOX_E_IPRT_ERROR; + + } while (0); + + return SUCCEEDED(rc) ? RTEXITCODE_SUCCESS : RTEXITCODE_FAILURE; +} + +void serviceLog(const char *pszFormat, ...) +{ + va_list args; + va_start(args, pszFormat); + char *psz = NULL; + RTStrAPrintfV(&psz, pszFormat, args); + va_end(args); + + LogRel(("%s", psz)); + + RTStrFree(psz); +} + +void logHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHASEMSG pfnLog) +{ + /* Some introductory information. */ + static RTTIMESPEC s_TimeSpec; + char szTmp[256]; + if (enmPhase == RTLOGPHASE_BEGIN) + RTTimeNow(&s_TimeSpec); + RTTimeSpecToString(&s_TimeSpec, szTmp, sizeof(szTmp)); + + switch (enmPhase) + { + case RTLOGPHASE_BEGIN: + { + pfnLog(pLoggerRelease, + "VirtualBox Ballooning Control Service %s r%u %s (%s %s) release log\n" +#ifdef VBOX_BLEEDING_EDGE + "EXPERIMENTAL build " VBOX_BLEEDING_EDGE "\n" +#endif + "Log opened %s\n", + VBOX_VERSION_STRING, RTBldCfgRevision(), VBOX_BUILD_TARGET, + __DATE__, __TIME__, szTmp); + + int vrc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, sizeof(szTmp)); + if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) + pfnLog(pLoggerRelease, "OS Product: %s\n", szTmp); + vrc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szTmp, sizeof(szTmp)); + if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) + pfnLog(pLoggerRelease, "OS Release: %s\n", szTmp); + vrc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szTmp, sizeof(szTmp)); + if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) + pfnLog(pLoggerRelease, "OS Version: %s\n", szTmp); + if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) + pfnLog(pLoggerRelease, "OS Service Pack: %s\n", szTmp); + + /* the package type is interesting for Linux distributions */ + char szExecName[RTPATH_MAX]; + char *pszExecName = RTProcGetExecutablePath(szExecName, sizeof(szExecName)); + pfnLog(pLoggerRelease, + "Executable: %s\n" + "Process ID: %u\n" + "Package type: %s" +#ifdef VBOX_OSE + " (OSE)" +#endif + "\n", + pszExecName ? pszExecName : "unknown", + RTProcSelf(), + VBOX_PACKAGE_STRING); + break; + } + + case RTLOGPHASE_PREROTATE: + pfnLog(pLoggerRelease, "Log rotated - Log started %s\n", szTmp); + break; + + case RTLOGPHASE_POSTROTATE: + pfnLog(pLoggerRelease, "Log continuation - Log started %s\n", szTmp); + break; + + case RTLOGPHASE_END: + pfnLog(pLoggerRelease, "End of log file - Log started %s\n", szTmp); + break; + + default: + /* nothing */; + } +} + +void displayHelp() +{ + RTStrmPrintf(g_pStdErr, "\nUsage: VBoxBalloonCtrl [options]\n\nSupported options (default values in brackets):\n"); + for (unsigned i = 0; + i < RT_ELEMENTS(g_aOptions); + ++i) + { + std::string str(g_aOptions[i].pszLong); + if (g_aOptions[i].iShort < 1000) /* Don't show short options which are defined by an ID! */ + { + str += ", -"; + str += g_aOptions[i].iShort; + } + str += ":"; + + const char *pcszDescr = ""; + + switch (g_aOptions[i].iShort) + { + case 'h': + pcszDescr = "Print this help message and exit."; + break; + + case 'i': /* Interval. */ + pcszDescr = "Sets the check interval in ms (30 seconds)."; + break; + +#if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) || defined (RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) + case 'b': + pcszDescr = "Run in background (daemon mode)."; + break; +#endif + case GETOPTDEF_BALLOONCTRL_BALLOOINC: + pcszDescr = "Sets the ballooning increment in MB (256 MB)."; + break; + + case GETOPTDEF_BALLOONCTRL_BALLOONDEC: + pcszDescr = "Sets the ballooning decrement in MB (128 MB)."; + break; + + case GETOPTDEF_BALLOONCTRL_BALLOONLOWERLIMIT: + pcszDescr = "Sets the ballooning lower limit in MB (64 MB)."; + break; + + case GETOPTDEF_BALLOONCTRL_BALLOONMAX: + pcszDescr = "Sets the balloon maximum limit in MB (0 MB)."; + break; + + case 'P': + pcszDescr = "Name of the PID file which is created when the daemon was started."; + break; + + case 'F': + pcszDescr = "Name of file to write log to (no file)."; + break; + + case 'R': + pcszDescr = "Number of log files (0 disables log rotation)."; + break; + + case 'S': + pcszDescr = "Maximum size of a log file to trigger rotation (bytes)."; + break; + + case 'I': + pcszDescr = "Maximum time interval to trigger log rotation (seconds)."; + break; + } + + RTStrmPrintf(g_pStdErr, "%-23s%s\n", str.c_str(), pcszDescr); + } + + RTStrmPrintf(g_pStdErr, "\nUse environment variable VBOXBALLOONCTRL_RELEASE_LOG for logging options.\n" + "Set \"VBoxInternal/Guest/BalloonSizeMax\" for a per-VM maximum ballooning size.\n"); +} + +void deleteGlobalObjects() +{ + serviceLogVerbose(("Deleting local objects ...\n")); + + g_pSession.setNull(); + g_pVirtualBox.setNull(); +} + +/** + * Creates all global COM objects. + * + * @return HRESULT + */ +HRESULT createGlobalObjects() +{ + serviceLogVerbose(("Creating local objects ...\n")); + + HRESULT hrc = g_pVirtualBoxClient->COMGETTER(VirtualBox)(g_pVirtualBox.asOutParam()); + if (FAILED(hrc)) + { + RTMsgError("Failed to get VirtualBox object (rc=%Rhrc)!", hrc); + } + else + { + hrc = g_pSession.createInprocObject(CLSID_Session); + if (FAILED(hrc)) + RTMsgError("Failed to create a session object (rc=%Rhrc)!", hrc); + } + + return hrc; +} + +int main(int argc, char *argv[]) +{ + /* + * Before we do anything, init the runtime without loading + * the support driver. + */ + int rc = RTR3Init(); + if (RT_FAILURE(rc)) + return RTMsgInitFailure(rc); + + RTPrintf(VBOX_PRODUCT " Balloon Control " VBOX_VERSION_STRING "\n" + "(C) " VBOX_C_YEAR " " VBOX_VENDOR "\n" + "All rights reserved.\n\n"); + + /* + * Parse the global options + */ + int c; + const char *pszLogFile = NULL; + const char *pszPidFile = NULL; + RTGETOPTUNION ValueUnion; + RTGETOPTSTATE GetState; + RTGetOptInit(&GetState, argc, argv, g_aOptions, RT_ELEMENTS(g_aOptions), 1, 0 /*fFlags*/); + while ((c = RTGetOpt(&GetState, &ValueUnion))) + { + switch (c) + { + case 'h': + displayHelp(); + return 0; + + case 'i': /* Interval. */ + g_ulTimeoutMS = ValueUnion.u32; + break; + + case 'v': + g_fVerbose = true; + break; + +#if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) || defined (RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) + case 'b': + g_fDaemonize = true; + break; +#endif + case 'V': + RTPrintf("%sr%s\n", RTBldCfgVersion(), RTBldCfgRevisionStr()); + return 0; + + case GETOPTDEF_BALLOONCTRL_BALLOOINC: + g_ulMemoryBalloonIncrementMB = ValueUnion.u32; + break; + + case GETOPTDEF_BALLOONCTRL_BALLOONDEC: + g_ulMemoryBalloonDecrementMB = ValueUnion.u32; + break; + + case GETOPTDEF_BALLOONCTRL_BALLOONLOWERLIMIT: + g_ulLowerMemoryLimitMB = ValueUnion.u32; + break; + + case GETOPTDEF_BALLOONCTRL_BALLOONMAX: + g_ulMemoryBalloonMaxMB = ValueUnion.u32; + break; + + case 'P': + pszPidFile = ValueUnion.psz; + break; + + case 'F': + pszLogFile = ValueUnion.psz; + break; + + case 'R': + g_cHistory = ValueUnion.u32; + break; + + case 'S': + g_uHistoryFileSize = ValueUnion.u64; + break; + + case 'I': + g_uHistoryFileTime = ValueUnion.u32; + break; + + default: + rc = RTGetOptPrintError(c, &ValueUnion); + return rc; + } + } + + /* create release logger */ + PRTLOGGER pLoggerRelease; + static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES; + RTUINT fFlags = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG; +#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2) + fFlags |= RTLOGFLAGS_USECRLF; +#endif + char szError[RTPATH_MAX + 128] = ""; + rc = RTLogCreateEx(&pLoggerRelease, fFlags, "all", + "VBOXBALLOONCTRL_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, RTLOGDEST_STDOUT, + logHeaderFooter, g_cHistory, g_uHistoryFileSize, g_uHistoryFileTime, + szError, sizeof(szError), pszLogFile); + if (RT_SUCCESS(rc)) + { + /* register this logger as the release logger */ + RTLogRelSetDefaultInstance(pLoggerRelease); + + /* Explicitly flush the log in case of VBOXWEBSRV_RELEASE_LOG=buffered. */ + RTLogFlush(pLoggerRelease); + } + else + return RTMsgErrorExit(RTEXITCODE_FAILURE, "failed to open release log (%s, %Rrc)", szError, rc); + +#if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) || defined (RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) + if (g_fDaemonize) + { + /* prepare release logging */ + char szLogFile[RTPATH_MAX]; + + rc = com::GetVBoxUserHomeDirectory(szLogFile, sizeof(szLogFile)); + if (RT_FAILURE(rc)) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "could not get base directory for logging: %Rrc", rc); + rc = RTPathAppend(szLogFile, sizeof(szLogFile), "vboxballoonctrl.log"); + if (RT_FAILURE(rc)) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "could not construct logging path: %Rrc", rc); + + rc = RTProcDaemonizeUsingFork(false /* fNoChDir */, false /* fNoClose */, pszPidFile); + if (RT_FAILURE(rc)) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "failed to daemonize, rc=%Rrc. exiting.", rc); + + /* create release logger */ + PRTLOGGER pLoggerReleaseFile; + static const char * const s_apszGroupsFile[] = VBOX_LOGGROUP_NAMES; + RTUINT fFlagsFile = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG; +#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2) + fFlagsFile |= RTLOGFLAGS_USECRLF; +#endif + char szErrorFile[RTPATH_MAX + 128] = ""; + int vrc = RTLogCreateEx(&pLoggerReleaseFile, fFlagsFile, "all", + "VBOXBALLOONCTRL_RELEASE_LOG", RT_ELEMENTS(s_apszGroupsFile), s_apszGroupsFile, RTLOGDEST_FILE, + logHeaderFooter, g_cHistory, g_uHistoryFileSize, g_uHistoryFileTime, + szErrorFile, sizeof(szErrorFile), szLogFile); + if (RT_SUCCESS(vrc)) + { + /* register this logger as the release logger */ + RTLogRelSetDefaultInstance(pLoggerReleaseFile); + + /* Explicitly flush the log in case of VBOXBALLOONCTRL_RELEASE_LOG=buffered. */ + RTLogFlush(pLoggerReleaseFile); + } + else + return RTMsgErrorExit(RTEXITCODE_FAILURE, "failed to open release log (%s, %Rrc)", szErrorFile, vrc); + } +#endif + +#ifndef VBOX_ONLY_DOCS + /* + * Initialize COM. + */ + using namespace com; + HRESULT hrc = com::Initialize(); + if (FAILED(hrc)) + return RTMsgErrorExit(RTEXITCODE_FAILURE, "Failed to initialize COM!"); + + hrc = g_pVirtualBoxClient.createInprocObject(CLSID_VirtualBoxClient); + if (FAILED(hrc)) + { + RTMsgError("failed to create the VirtualBoxClient object!"); + com::ErrorInfo info; + if (!info.isFullAvailable() && !info.isBasicAvailable()) + { + com::GluePrintRCMessage(hrc); + RTMsgError("Most likely, the VirtualBox COM server is not running or failed to start."); + } + else + com::GluePrintErrorInfo(info); + return RTEXITCODE_FAILURE; + } + + hrc = createGlobalObjects(); + if (FAILED(hrc)) + return RTEXITCODE_FAILURE; + + HandlerArg handlerArg = { argc, argv }; + RTEXITCODE rcExit = balloonCtrlMain(&handlerArg); + + EventQueue::getMainEventQueue()->processEventQueue(0); + + deleteGlobalObjects(); + + g_pVirtualBoxClient.setNull(); + + com::Shutdown(); + + return rcExit; +#else /* VBOX_ONLY_DOCS */ + return RTEXITCODE_SUCCESS; +#endif /* VBOX_ONLY_DOCS */ +} + diff --git a/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.h b/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.h new file mode 100644 index 000000000..64adeda60 --- /dev/null +++ b/src/VBox/Frontends/VBoxBalloonCtrl/VBoxBalloonCtrl.h @@ -0,0 +1,52 @@ +/* $Id: VBoxBalloonCtrl.h $ */ +/** @file + * VBoxBalloonCtrl - VirtualBox Ballooning Control Service. + */ + +/* + * Copyright (C) 2011 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 ___H_VBOXBALLOONCTRL +#define ___H_VBOXBALLOONCTRL + +#ifndef VBOX_ONLY_DOCS +#include <VBox/com/com.h> +#include <VBox/com/ptr.h> +#include <VBox/com/VirtualBox.h> +#include <VBox/com/string.h> +#endif /* !VBOX_ONLY_DOCS */ + +#include <iprt/types.h> +#include <iprt/message.h> +#include <iprt/stream.h> + +//////////////////////////////////////////////////////////////////////////////// +// +// definitions +// +//////////////////////////////////////////////////////////////////////////////// + +/** command handler argument */ +struct HandlerArg +{ + int argc; + char **argv; +}; + +//////////////////////////////////////////////////////////////////////////////// +// +// prototypes +// +//////////////////////////////////////////////////////////////////////////////// + +#endif /* !___H_VBOXBALLOONCTRL */ + diff --git a/src/VBox/Frontends/VBoxHeadless/FramebufferVNC.cpp b/src/VBox/Frontends/VBoxHeadless/FramebufferVNC.cpp index c0b0baf33..bc211dbfe 100644 --- a/src/VBox/Frontends/VBoxHeadless/FramebufferVNC.cpp +++ b/src/VBox/Frontends/VBoxHeadless/FramebufferVNC.cpp @@ -232,7 +232,7 @@ void VNCFB::handleVncKeyboardEvent(int down, int keycode) static int codes_low[] = { //Conversion table for VNC key code range 32-127 - 0x0239, 0x0102, 0x0128, 0x0104, 0x0105, 0x0106, 0x0108, 0x0028, 0x010a, 0x010b, 0x0109, 0x010d, 0x0029, 0x000c, 0x0034, 0x0035, //space, !"#$%&'()*+`-./ + 0x0239, 0x0102, 0x0128, 0x0104, 0x0105, 0x0106, 0x0108, 0x0028, 0x010a, 0x010b, 0x0109, 0x010d, 0x0033, 0x000c, 0x0034, 0x0035, //space, !"#$%&'()*+,-./ 0x0b, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, //0123456789 0x0127, 0x0027, 0x0133, 0x000d, 0x0134, 0x0135, 0x0103, //:;<=>?@ 0x11e, 0x130, 0x12e, 0x120, 0x112, 0x121, 0x122, 0x123, 0x117, 0x124, 0x125, 0x126, 0x132, 0x131, 0x118, 0x119, 0x110, 0x113, 0x11f, 0x114, 0x116, 0x12f, 0x111, 0x12d, 0x115, 0x12c, //A-Z diff --git a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp index 7cc025bda..4abeb7fb4 100644 --- a/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp +++ b/src/VBox/Frontends/VBoxHeadless/VBoxHeadless.cpp @@ -189,40 +189,53 @@ public: if (fProcessDisconnectOnGuestLogout) { + bool fDropConnection = false; + Bstr value; gpcev->COMGETTER(Value)(value.asOutParam()); Utf8Str utf8Value = value; - if (utf8Value == "true") + + if (!mfNoLoggedInUsers) /* Only if the property really changes. */ { - if (!mfNoLoggedInUsers) /* 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; + fDropConnection = true; + } + } + else if (utf8Value == "false") + mfNoLoggedInUsers = false; + /* Guest property got deleted due to reset, + * take the shortcut without touching the mfNoLoggedInUsers + * state. */ + else if (utf8Value.isEmpty()) + fDropConnection = true; - /* If there is a connection, drop it. */ - ComPtr<IVRDEServerInfo> info; - hrc = gConsole->COMGETTER(VRDEServerInfo)(info.asOutParam()); - if (SUCCEEDED(hrc) && info) + if (fDropConnection) + { + /* If there is a connection, drop it. */ + ComPtr<IVRDEServerInfo> info; + hrc = gConsole->COMGETTER(VRDEServerInfo)(info.asOutParam()); + if (SUCCEEDED(hrc) && info) + { + ULONG cClients = 0; + hrc = info->COMGETTER(NumberOfClients)(&cClients); + if (SUCCEEDED(hrc) && cClients > 0) { - ULONG cClients = 0; - hrc = info->COMGETTER(NumberOfClients)(&cClients); - if (SUCCEEDED(hrc) && cClients > 0) + ComPtr <IVRDEServer> vrdeServer; + hrc = machine->COMGETTER(VRDEServer)(vrdeServer.asOutParam()); + if (SUCCEEDED(hrc) && vrdeServer) { - ComPtr <IVRDEServer> vrdeServer; - hrc = machine->COMGETTER(VRDEServer)(vrdeServer.asOutParam()); - if (SUCCEEDED(hrc) && vrdeServer) - { - LogRel(("VRDE: the guest user has logged out, disconnecting remote clients.\n")); - vrdeServer->COMSETTER(Enabled)(FALSE); - vrdeServer->COMSETTER(Enabled)(TRUE); - } + LogRel(("VRDE: the guest user has logged out, disconnecting remote clients.\n")); + vrdeServer->COMSETTER(Enabled)(FALSE); + vrdeServer->COMSETTER(Enabled)(TRUE); } } } } - else - { - mfNoLoggedInUsers = false; - } } } break; diff --git a/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp b/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp index 645b90e28..a48dad6f8 100644 --- a/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp +++ b/src/VBox/Frontends/VBoxManage/VBoxInternalManage.cpp @@ -185,8 +185,9 @@ void printUsageInternal(USAGECATEGORY u64Cmd, PRTSTREAM pStrm) " (the partitioning information in the MBR file is ignored).\n" " The diskname is on Linux e.g. /dev/sda, and on Windows e.g.\n" " \\\\.\\PhysicalDrive0).\n" - " On Linux host the parameter -relative causes a VMDK file to be created\n" - " which refers to individual partitions instead to the entire disk.\n" + " On Linux or FreeBSD host the parameter -relative causes a VMDK file to\n" + " be created which refers to individual partitions instead to the entire\n" + " disk.\n" " The necessary partition numbers can be queried with\n" " VBoxManage internalcommands listpartitions\n" "\n" @@ -962,12 +963,12 @@ static int CmdCreateRawVMDK(int argc, char **argv, ComPtr<IVirtualBox> aVirtualB i++; pszPartitions = argv[i]; } -#ifdef RT_OS_LINUX +#if defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD) else if (strcmp(argv[i], "-relative") == 0) { fRelative = true; } -#endif /* RT_OS_LINUX */ +#endif /* RT_OS_LINUX || RT_OS_FREEBSD */ else return errorSyntax(USAGE_CREATERAWVMDK, "Invalid parameter '%s'", argv[i]); } @@ -1315,10 +1316,16 @@ static int CmdCreateRawVMDK(int argc, char **argv, ComPtr<IVirtualBox> aVirtualB { if (fRelative) { -#ifdef RT_OS_LINUX +#if defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD) /* Refer to the correct partition and use offset 0. */ char *psz; - RTStrAPrintf(&psz, "%s%u", rawdisk.c_str(), + RTStrAPrintf(&psz, +#if defined(RT_OS_LINUX) + "%s%u", +#elif defined(RT_OS_FREEBSD) + "%ss%u", +#endif + rawdisk.c_str(), partitions.aPartitions[i].uIndex); if (!psz) { diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp index ee0ca297d..75fe0ae71 100644 --- a/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp +++ b/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp @@ -404,8 +404,13 @@ static int handleCtrlExecProgram(HandlerArg *a) case VINF_GETOPT_NOT_OPTION: { - /* The actual command we want to execute on the guest. */ - Utf8Cmd = ValueUnion.psz; + if (!strlen(ValueUnion.psz)) + continue; + + if (args.size() == 0 && Utf8Cmd.isEmpty()) + Utf8Cmd = ValueUnion.psz; + else + args.push_back(Bstr(ValueUnion.psz).raw()); break; } @@ -491,7 +496,6 @@ static int handleCtrlExecProgram(HandlerArg *a) /* Wait for process to exit ... */ BOOL fCompleted = FALSE; BOOL fCanceled = FALSE; - int cMilliesSleep = 0; while (SUCCEEDED(progress->COMGETTER(Completed(&fCompleted)))) { SafeArray<BYTE> aOutputData; @@ -546,9 +550,6 @@ static int handleCtrlExecProgram(HandlerArg *a) * has been marked as complete. */ if (fCompleted) break; - - /* Then wait a little while ... */ - progress->WaitForCompletion(1 /* ms */); } /* Process async cancelation */ @@ -575,17 +576,6 @@ static int handleCtrlExecProgram(HandlerArg *a) progress->Cancel(); break; } - - /* Don't hog the CPU in a busy loop! */ - if (cbOutputData <= 0) - { - if (cMilliesSleep < 100) - cMilliesSleep++; - RTPrintf("cMilliesSleep = %d\n", cMilliesSleep); - RTThreadSleep(cMilliesSleep); - } - else - cMilliesSleep = 0; } /* Undo signal handling */ @@ -1138,9 +1128,9 @@ static int handleCtrlCopyTo(HandlerArg *a) } RTLISTNODE listToCopy; - uint32_t cObjects = 0; + uint32_t cTotalObjects = 0; vrc = ctrlCopyInit(Utf8Source.c_str(), Utf8Dest.c_str(), uFlags, - &cObjects, &listToCopy); + &cTotalObjects, &listToCopy); if (RT_FAILURE(vrc)) { switch (vrc) @@ -1167,10 +1157,10 @@ static int handleCtrlCopyTo(HandlerArg *a) { if (fCopyRecursive) RTPrintf("Recursively copying \"%s\" to \"%s\" (%u file(s)) ...\n", - Utf8Source.c_str(), Utf8Dest.c_str(), cObjects); + Utf8Source.c_str(), Utf8Dest.c_str(), cTotalObjects); else RTPrintf("Copying \"%s\" to \"%s\" (%u file(s)) ...\n", - Utf8Source.c_str(), Utf8Dest.c_str(), cObjects); + Utf8Source.c_str(), Utf8Dest.c_str(), cTotalObjects); } uint32_t uCurObject = 1; @@ -1180,7 +1170,7 @@ static int handleCtrlCopyTo(HandlerArg *a) { if (fVerbose) RTPrintf("Copying \"%s\" to \"%s\" (%u/%u) ...\n", - pNode->pszSourcePath, pNode->pszDestPath, uCurObject, cObjects); + pNode->pszSourcePath, pNode->pszDestPath, uCurObject, cTotalObjects); /* Finally copy the desired file (if no dry run selected). */ if (!fDryRun) vrc = ctrlCopyFileToGuest(guest, fVerbose, pNode->pszSourcePath, pNode->pszDestPath, @@ -1192,6 +1182,13 @@ static int handleCtrlCopyTo(HandlerArg *a) } if (RT_SUCCESS(vrc) && fVerbose) RTPrintf("Copy operation successful!\n"); + + Assert(cTotalObjects >= uCurObject - 1); + if (cTotalObjects != uCurObject - 1) + RTPrintf("Warning: %u elements instead of %ld were copied!\n", + uCurObject - 1, cTotalObjects); + else if (RT_SUCCESS(vrc) && fVerbose) + RTPrintf("Copy operation successful!\n"); } ctrlDirectoryListDestroy(&listToCopy); } diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp index 5ea73f92a..04315d0ec 100644 --- a/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp +++ b/src/VBox/Frontends/VBoxManage/VBoxManageMisc.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -318,7 +318,7 @@ int handleStartVM(HandlerArg *a) } #endif else - return errorArgument("Invalid session type '%s'", ValueUnion.psz); + sessionType = ValueUnion.psz; break; case VINF_GETOPT_NOT_OPTION: @@ -369,23 +369,26 @@ int handleStartVM(HandlerArg *a) ComPtr<IProgress> progress; CHECK_ERROR_RET(machine, LaunchVMProcess(a->session, sessionType.raw(), env.raw(), progress.asOutParam()), rc); - RTPrintf("Waiting for the VM to power on...\n"); - CHECK_ERROR_RET(progress, WaitForCompletion(-1), 1); + if (!progress.isNull()) + { + RTPrintf("Waiting for the VM to power on...\n"); + CHECK_ERROR_RET(progress, WaitForCompletion(-1), 1); - BOOL completed; - CHECK_ERROR_RET(progress, COMGETTER(Completed)(&completed), rc); - ASSERT(completed); + BOOL completed; + CHECK_ERROR_RET(progress, COMGETTER(Completed)(&completed), rc); + ASSERT(completed); - LONG iRc; - CHECK_ERROR_RET(progress, COMGETTER(ResultCode)(&iRc), rc); - if (FAILED(iRc)) - { - ProgressErrorInfo info(progress); - com::GluePrintErrorInfo(info); - } - else - { - RTPrintf("VM has been successfully started.\n"); + LONG iRc; + CHECK_ERROR_RET(progress, COMGETTER(ResultCode)(&iRc), rc); + if (FAILED(iRc)) + { + ProgressErrorInfo info(progress); + com::GluePrintErrorInfo(info); + } + else + { + RTPrintf("VM has been successfully started.\n"); + } } } diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp index f99a3aa8a..ea8f2ec5c 100644 --- a/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp +++ b/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -1035,7 +1035,7 @@ int handleStorageController(HandlerArg *a) } else { - errorArgument("Invalid --bootable argument '%s'", pszHostIOCache); + errorArgument("Invalid --bootable argument '%s'", pszBootable); rc = E_FAIL; } } diff --git a/src/VBox/Frontends/VBoxShell/vboxshell.py b/src/VBox/Frontends/VBoxShell/vboxshell.py index ae8d1d142..416330d4c 100755 --- a/src/VBox/Frontends/VBoxShell/vboxshell.py +++ b/src/VBox/Frontends/VBoxShell/vboxshell.py @@ -2153,7 +2153,7 @@ def registerHddCmd(ctx,args): imageId = "" setParentId = False parentId = "" - hdd = vb.openHardDisk(loc, ctx['global'].constants.AccessMode_ReadWrite, setImageId, imageId, setParentId, parentId) + hdd = vb.openMedium(loc, ctx['global'].constants.DeviceType_HardDisk, ctx['global'].constants.AccessMode_ReadWrite) print "registered HDD as %s" %(hdd.id) return 0 @@ -2268,8 +2268,7 @@ def registerIsoCmd(ctx,args): return 0 vb = ctx['vb'] loc = args[1] - id = "" - iso = vb.openDVDImage(loc, id) + iso = vb.openMedium(loc, ctx['global'].constants.DeviceType_DVD, ctx['global'].constants.AccessMode_ReadOnly) print "registered ISO as %s" %(iso.id) return 0 @@ -2281,13 +2280,13 @@ def unregisterIsoCmd(ctx,args): vb = ctx['vb'] loc = args[1] try: - dvd = vb.findMedium(loc, ) + dvd = vb.findMedium(loc, ctx['global'].constants.DeviceType_DVD) except: print "no DVD with path %s registered" %(loc) return 0 progress = dvd.close() - print "Unregistered ISO at %s" %(colPath(ctx,dvd.location)) + print "Unregistered ISO at %s" %(colPath(ctx,loc)) return 0 diff --git a/src/VBox/Frontends/VirtualBox/Makefile.kmk b/src/VBox/Frontends/VirtualBox/Makefile.kmk index 81670d021..a2d0d4942 100644 --- a/src/VBox/Frontends/VirtualBox/Makefile.kmk +++ b/src/VBox/Frontends/VirtualBox/Makefile.kmk @@ -276,7 +276,6 @@ VirtualBox_QT_MOCHDRS = \ src/extensions/QIArrowSplitter.h \ src/extensions/QIDialog.h \ src/extensions/QIFileDialog.h \ - src/extensions/QIHotKeyEdit.h \ src/extensions/QIHttp.h \ src/extensions/QILabel.h \ src/extensions/QILabelSeparator.h \ @@ -328,6 +327,7 @@ VirtualBox_QT_MOCHDRS = \ src/widgets/UIDownloader.h \ src/widgets/UIDownloaderAdditions.h \ src/widgets/UIDownloaderUserManual.h \ + src/widgets/UIHotKeyEditor.h \ src/widgets/UIPopupBox.h \ src/widgets/UIProgressDialog.h \ src/widgets/UISpacerWidgets.h \ @@ -443,7 +443,6 @@ VirtualBox_SOURCES = \ src/extensions/QIDialog.cpp \ src/extensions/QIDialogButtonBox.cpp \ src/extensions/QIFileDialog.cpp \ - src/extensions/QIHotKeyEdit.cpp \ src/extensions/QILabel.cpp \ src/extensions/QILabelSeparator.cpp \ src/extensions/QILineEdit.cpp \ @@ -493,6 +492,7 @@ VirtualBox_SOURCES = \ src/widgets/UIDownloader.cpp \ src/widgets/UIDownloaderAdditions.cpp \ src/widgets/UIDownloaderUserManual.cpp \ + src/widgets/UIHotKeyEditor.cpp \ src/widgets/UIPopupBox.cpp \ src/widgets/UIProgressDialog.cpp \ src/widgets/UISpecialControls.cpp \ diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ar.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ar.ts index db6e7a83c..30836e251 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ar.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ar.ts @@ -144,185 +144,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>يسار</translation> - </message> - <message> - <source>Right </source> - <translation>يمين</translation> - </message> - <message> - <source>Left Shift</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Shift</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left Ctrl</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Ctrl</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left Alt</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Alt</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left WinKey</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right WinKey</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Menu key</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Alt Gr</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Caps Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Scroll Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source><key_%1></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Pause</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Print Screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F1</source> - <translation type="unfinished">F1</translation> - </message> - <message> - <source>F2</source> - <translation type="unfinished">F2</translation> - </message> - <message> - <source>F3</source> - <translation type="unfinished">F3</translation> - </message> - <message> - <source>F4</source> - <translation type="unfinished">F4</translation> - </message> - <message> - <source>F5</source> - <translation type="unfinished">F5</translation> - </message> - <message> - <source>F6</source> - <translation type="unfinished">F6</translation> - </message> - <message> - <source>F7</source> - <translation type="unfinished">F7</translation> - </message> - <message> - <source>F8</source> - <translation type="unfinished">F8</translation> - </message> - <message> - <source>F9</source> - <translation type="unfinished">F9</translation> - </message> - <message> - <source>F10</source> - <translation type="unfinished">F10</translation> - </message> - <message> - <source>F11</source> - <translation type="unfinished">F11</translation> - </message> - <message> - <source>F12</source> - <translation type="unfinished">F12</translation> - </message> - <message> - <source>F13</source> - <translation type="unfinished">F13</translation> - </message> - <message> - <source>F14</source> - <translation type="unfinished">F14</translation> - </message> - <message> - <source>F15</source> - <translation type="unfinished">F15</translation> - </message> - <message> - <source>F16</source> - <translation type="unfinished">F16</translation> - </message> - <message> - <source>F17</source> - <translation type="unfinished">F17</translation> - </message> - <message> - <source>F18</source> - <translation type="unfinished">F18</translation> - </message> - <message> - <source>F19</source> - <translation type="unfinished">F19</translation> - </message> - <message> - <source>F20</source> - <translation type="unfinished">F20</translation> - </message> - <message> - <source>F21</source> - <translation type="unfinished">F21</translation> - </message> - <message> - <source>F22</source> - <translation type="unfinished">F22</translation> - </message> - <message> - <source>F23</source> - <translation type="unfinished">F23</translation> - </message> - <message> - <source>F24</source> - <translation type="unfinished">F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Forward</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Back</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -488,10 +309,6 @@ <translation></translation> </message> <message> - <source>ACPI S&hutdown</source> - <translation></translation> - </message> - <message> <source>Send the ACPI Power Button press event to the virtual machine</source> <translation></translation> </message> @@ -1253,6 +1070,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1304,19 +1125,19 @@ <translation type="unfinished"></translation> </message> <message> - <source>Reset Host Key</source> + <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resets the key used as a Host Key in the VM window.</source> + <source>&Auto Capture Keyboard</source> <translation type="unfinished"></translation> </message> <message> - <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> + <source>Reset host combination</source> <translation type="unfinished"></translation> </message> <message> - <source>&Auto Capture Keyboard</source> + <source>Resets the key combination used as the host combination in the VM window.</source> <translation type="unfinished"></translation> </message> </context> @@ -1510,7 +1331,7 @@ <translation type="unfinished">إسم</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -1668,6 +1489,169 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>يسار</translation> + </message> + <message> + <source>Right </source> + <translation>يمين</translation> + </message> + <message> + <source>Left Shift</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Shift</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left Ctrl</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Ctrl</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left Alt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Alt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left WinKey</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right WinKey</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Menu key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Alt Gr</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Caps Lock</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Scroll Lock</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><key_%1></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -1845,7 +1829,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>Ùيرتول بوكس Ø£ÙˆØ¦ÙØ³Ø¦ÙÙŠ</translation> + <translation type="obsolete">Ùيرتول بوكس Ø£ÙˆØ¦ÙØ³Ø¦ÙÙŠ</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3051,6 +3035,10 @@ <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -5352,15 +5340,15 @@ <context> <name>VBoxGlobalSettings</name> <message> - <source>'%1 (0x%2)' is an invalid host key code.</source> + <source>Cannot delete the key '%1'.</source> <translation type="unfinished"></translation> </message> <message> - <source>Cannot delete the key '%1'.</source> + <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> <translation type="unfinished"></translation> </message> <message> - <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> + <source>'%1' is an invalid host-combination code-sequence.</source> <translation type="unfinished"></translation> </message> </context> @@ -6595,10 +6583,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -6683,6 +6667,18 @@ <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -6737,7 +6733,7 @@ <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>Ùيرتول بوكس Ø£ÙˆØ¦ÙØ³Ø¦ÙÙŠ</translation> + <translation type="obsolete">Ùيرتول بوكس Ø£ÙˆØ¦ÙØ³Ø¦ÙÙŠ</translation> </message> <message> <source>&Details</source> @@ -6909,10 +6905,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>R&esume</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Resume the execution of the virtual machine</source> <translation type="unfinished"></translation> </message> @@ -6981,6 +6973,7 @@ </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts index a5888921c..90fef4c0b 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_bg.ts @@ -137,185 +137,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>ЛÑва Ñтрелка</translation> - </message> - <message> - <source>Right </source> - <translation>ДÑÑна Ñтрелка</translation> - </message> - <message> - <source>Left Shift</source> - <translation>ЛÑв Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>ДеÑен Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>ЛÑв Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>ДеÑен Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>ЛÑв Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>ДеÑен Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>ЛÑв Win клавиш</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>ДеÑен Win клавиш</translation> - </message> - <message> - <source>Menu key</source> - <translation>Клавиш Меню</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>Ðапред</translation> - </message> - <message> - <source>Back</source> - <translation>Ðазад</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -507,7 +328,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI Из&ключване</translation> + <translation type="obsolete">ACPI Из&ключване</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1639,6 +1460,10 @@ p, li { white-space: pre-wrap; </style></head><body style=" <source>Extension package files (%1)</source> <translation>Файлове на пакети Ñ Ñ€Ð°Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">РазширениÑ</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1707,11 +1532,11 @@ p, li { white-space: pre-wrap; </style></head><body style=" </message> <message> <source>Reset Host Key</source> - <translation>Ðулиране на ОÑÐ½Ð¾Ð²Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ</translation> + <translation type="obsolete">Ðулиране на ОÑÐ½Ð¾Ð²Ð½Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Ðулира наÑтройката за ОÑновен клавиш в прозореца на ВМ.</translation> + <translation type="obsolete">Ðулира наÑтройката за ОÑновен клавиш в прозореца на ВМ.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1721,6 +1546,14 @@ p, li { white-space: pre-wrap; </style></head><body style=" <source>&Auto Capture Keyboard</source> <translation>&Ðвто прихващане на клавиатурата</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1923,7 +1756,11 @@ p, li { white-space: pre-wrap; </style></head><body style=" </message> <message> <source>New Host-Only Interface</source> - <translation>Ðов Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñамо-хоÑÑ‚</translation> + <translation type="obsolete">Ðов Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñамо-хоÑÑ‚</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2080,6 +1917,189 @@ p, li { white-space: pre-wrap; </style></head><body style=" </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>ЛÑва Ñтрелка</translation> + </message> + <message> + <source>Right </source> + <translation>ДÑÑна Ñтрелка</translation> + </message> + <message> + <source>Left Shift</source> + <translation>ЛÑв Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>ДеÑен Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>ЛÑв Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>ДеÑен Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>ЛÑв Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>ДеÑен Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>ЛÑв Win клавиш</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>ДеÑен Win клавиш</translation> + </message> + <message> + <source>Menu key</source> + <translation>Клавиш Меню</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Ðапред</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Ðазад</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2307,7 +2327,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3857,6 +3877,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7048,7 +7072,7 @@ p, li { white-space: pre-wrap; } <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' е невалиден код за ОÑновен клавиш.</translation> + <translation type="obsolete">'%1 (0x%2)' е невалиден код за ОÑновен клавиш.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7058,6 +7082,10 @@ p, li { white-space: pre-wrap; } <source>Cannot delete the key '%1'.</source> <translation>Ðе може да Ñе изтрие клавишът '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -8444,7 +8472,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Sorry, some generic error happens.</source> - <translation>СъжалÑвам, възникна нÑкакъв оÑновен проблем.</translation> + <translation type="obsolete">СъжалÑвам, възникна нÑкакъв оÑновен проблем.</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> @@ -8531,6 +8559,18 @@ p, li { white-space: pre-wrap; } <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>Пакетът Ñ Ñ€Ð°Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ <br><nobr><b>%1</b><nobr><br> е инÑталиран уÑпешно.</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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8665,7 +8705,7 @@ p, li { white-space: pre-wrap; } <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8774,7 +8814,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>R&esume</source> - <translation>Продъл&жаване</translation> + <translation type="obsolete">Продъл&жаване</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8849,6 +8889,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Управление</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts index 1b55e0c0a..aa53cc497 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca.ts @@ -178,185 +178,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Esquerra</translation> - </message> - <message> - <source>Right </source> - <translation>Dreta</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Tecla de majúscules esquerra</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Tecla de majúscules dreta</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Control esquerra</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Control dreta</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt esquerra</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt dreta</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Tecla de Windows esquerra</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Tecla de Windows dreta</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tecla de menú</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Bloq Majús</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Bloq Despl</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pausa</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Tecla d'impressió de pantalla</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Bloq Num</translation> - </message> - <message> - <source>Forward</source> - <translation>Endavant</translation> - </message> - <message> - <source>Back</source> - <translation>Enrere</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -563,7 +384,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>At&urada ACPI</translation> + <translation type="obsolete">At&urada ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1736,6 +1557,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Fitxers de paquet d'extensions (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">Extensions</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1808,11 +1633,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Reinicialitza la telca d'amfitrió</translation> + <translation type="obsolete">Reinicialitza la telca d'amfitrió</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Reinicialitza la tecla que es fa servir com a tecla d'amfitrió a la finestra de la mà quina virtual.</translation> + <translation type="obsolete">Reinicialitza la tecla que es fa servir com a tecla d'amfitrió a la finestra de la mà quina virtual.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1822,6 +1647,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>&Auto-captura el teclat</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -2024,7 +1857,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Nova interfÃcie de només amfitrió</translation> + <translation type="obsolete">Nova interfÃcie de només amfitrió</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2181,6 +2018,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Esquerra</translation> + </message> + <message> + <source>Right </source> + <translation>Dreta</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Tecla de majúscules esquerra</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Tecla de majúscules dreta</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Control esquerra</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Control dreta</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt esquerra</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt dreta</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Tecla de Windows esquerra</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Tecla de Windows dreta</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tecla de menú</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Bloq Majús</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Bloq Despl</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pausa</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Tecla d'impressió de pantalla</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Bloq Num</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Endavant</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Enrere</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Cap</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2414,7 +2434,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -4182,6 +4202,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><nobr>Estat: %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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -8242,7 +8266,7 @@ Versió %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' no és un codi de tecla d'amfitrió và lid.</translation> + <translation type="obsolete">'%1 (0x%2)' no és un codi de tecla d'amfitrió và lid.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8252,6 +8276,10 @@ Versió %1</translation> <source>Cannot delete the key '%1'.</source> <translation>No es pot eliminar la tecla '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -10388,7 +10416,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source>Sorry, some generic error happens.</source> - <translation>S'han produït alguns errors genèrics.</translation> + <translation type="obsolete">S'han produït alguns errors genèrics.</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> @@ -10475,6 +10503,18 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>S'ha instal·lat el paquet d'extensió br><nobr><b>%1</b><nobr><br>.</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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10862,7 +10902,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&VirtualBox Web Site...</source> @@ -10874,7 +10914,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source>R&esume</source> - <translation>R&eprèn</translation> + <translation type="obsolete">R&eprèn</translation> </message> <message> <source>Resume</source> @@ -10961,6 +11001,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Gestor</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts index a27b68c48..ab4eda99c 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ca_VA.ts @@ -178,185 +178,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Esquerra</translation> - </message> - <message> - <source>Right </source> - <translation>Dreta</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Tecla de majúscules esquerra</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Tecla de majúscules dreta</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Control esquerra</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Control dreta</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt esquerra</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt dreta</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Tecla de Windows esquerra</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Tecla de Windows dreta</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tecla de menú</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Bloq Majús</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Bloq Despl</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pausa</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Tecla d'impressió de pantalla</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Bloq Num</translation> - </message> - <message> - <source>Forward</source> - <translation>Avant</translation> - </message> - <message> - <source>Back</source> - <translation>Arrere</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -563,7 +384,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>At&urada ACPI</translation> + <translation type="obsolete">At&urada ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1112,7 +933,7 @@ <name>UIDownloaderUserManual</name> <message> <source>Select folder to save User Manual to</source> - <translation>Seleccioneu la carpeta on s'alçarà el manual de l'usuari</translation> + <translation>Seleccioneu la carpeta on s'alçarà el manual de l'usuari</translation> </message> </context> <context> @@ -1736,6 +1557,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Fitxers de paquet d'extensions (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">Extensions</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1808,11 +1633,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Reinicialitza la telca d'amfitrió</translation> + <translation type="obsolete">Reinicialitza la telca d'amfitrió</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Reinicialitza la tecla que es fa servir com a tecla d'amfitrió a la finestra de la mà quina virtual.</translation> + <translation type="obsolete">Reinicialitza la tecla que es fa servir com a tecla d'amfitrió a la finestra de la mà quina virtual.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1822,6 +1647,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>&Auto-captura el teclat</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -2024,7 +1857,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Nova interfÃcie de només amfitrió</translation> + <translation type="obsolete">Nova interfÃcie de només amfitrió</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2181,6 +2018,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Esquerra</translation> + </message> + <message> + <source>Right </source> + <translation>Dreta</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Tecla de majúscules esquerra</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Tecla de majúscules dreta</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Control esquerra</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Control dreta</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt esquerra</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt dreta</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Tecla de Windows esquerra</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Tecla de Windows dreta</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tecla de menú</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Bloq Majús</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Bloq Despl</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pausa</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Tecla d'impressió de pantalla</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Bloq Num</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Avant</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Arrere</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Cap</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2414,7 +2434,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -2473,7 +2493,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineSettingsAudio</name> <message> <source>When checked, a virtual PCI audio card will be plugged into the virtual machine and will communicate with the host audio system using the specified driver.</source> - <translation>Quan estiga marcat, la tarjeta de so PCI virtual es connectarà a dins de la mà quina virtual, la qual farà servir un controlador especÃfic per comunicar-s'amb la tarjeta de so de l'amfitrió.</translation> + <translation>Quan estiga marcat, la tarjeta de so PCI virtual es connectarà a dins de la mà quina virtual, la qual farà servir un controlador especÃfic per comunicar-s'amb la tarjeta de so de l'amfitrió.</translation> </message> <message> <source>Enable &Audio</source> @@ -2485,7 +2505,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Controls the audio output driver. The <b>Null Audio Driver</b> makes the guest see an audio card, however every access to it will be ignored.</source> - <translation>Gestiona el controlador d'eixida de so. El <b>controlador d'à udio Nul</b> fa que el client veja una tarjeta de so, però l'accés a ella s'ignorarà .</translation> + <translation>Gestiona el controlador d'eixida de so. El <b>controlador d'à udio Nul</b> fa que el client veja una tarjeta de so, però l'accés a ella s'ignorarà .</translation> </message> <message> <source>Audio &Controller:</source> @@ -2540,7 +2560,7 @@ p, li { white-space: pre-wrap; } </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> - <translation>Quan estiga marcat, la mà quina virtual actuarà com un servidor RDP (protocol d'escriptori remot), de forma que es permetrà a clients remots connectar-s'i operar amb la mà quina virtual (quan estiga en execució) fent servir un client està ndard RDP.</translation> + <translation>Quan estiga marcat, la mà quina virtual actuarà com un servidor RDP (protocol d'escriptori remot), de forma que es permetrà a clients remots connectar-s'i operar amb la mà quina virtual (quan estiga en execució) fent servir un client està ndard RDP.</translation> </message> <message> <source>&Enable Server</source> @@ -2631,7 +2651,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Displays 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>Mostra el camà on les captures d'esta mà quina virtual s'alçaran. Tingueu en compte que les captures poden ocupar prou quantitat d'espai al disc dur.</translation> + <translation>Mostra el camà on les captures d'esta mà quina virtual s'alçaran. Tingueu en compte que les captures poden ocupar prou quantitat d'espai al disc dur.</translation> </message> <message> <source>&Basic</source> @@ -2795,7 +2815,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>If checked, any change to mounted CD/DVD or Floppy media performed during machine execution will be saved in the settings file in order to preserve the configuration of mounted media between runs.</source> - <translation>Si està marcat, qualsevol canvi al CD/DVD o disquet muntat s'alçarà al fitxer de configuració per tal de preservar la configuració dels suports muntats entre cada execució de la mà quina virtual.</translation> + <translation>Si està marcat, qualsevol canvi al CD/DVD o disquet muntat s'alçarà al fitxer de configuració per tal de preservar la configuració dels suports muntats entre cada execució de la mà quina virtual.</translation> </message> <message> <source>&Remember Mounted Media</source> @@ -2847,7 +2867,7 @@ p, li { white-space: pre-wrap; } </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>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>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> @@ -3558,7 +3578,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>If checked, shows the differencing hard disks that are attached to slots rather than their base hard disks (shown for indirect attachments) and allows explicit attaching of differencing hard disks. Check this only if you need a complex hard disk setup.</source> - <translation type="obsolete">Si està marcat, mostrarà de forma diferenciada els discos durs connectats a les ranures en lloc d'als discos durs base (mostrat en cas d'adjuncions indirectes), a més permetrà connectar altres discos durs explÃcitament. Marqueu això només si necessiteu una configuració complexa del disc dur.</translation> + <translation type="obsolete">Si està marcat, mostrarà de forma diferenciada els discos durs connectats a les ranures en lloc d'als discos durs base (mostrat en cas d'adjuncions indirectes), a més permetrà connectar altres discos durs explÃcitament. Marqueu això només si necessiteu una configuració complexa del disc dur.</translation> </message> <message> <source>&Show Differencing Hard Disks</source> @@ -4182,6 +4202,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><nobr>Estat: %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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -5207,7 +5231,7 @@ pas i connectar discos durs més avant, fent servir el dià leg de configuració </message> <message> <source><p>Saves the current execution state of the virtual machine to the physical hard disk of the host PC.</p><p>Next time this machine is started, it will be restored from the saved state and continue execution from the same place you saved it at, which will let you continue your work immediately.</p><p>Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to the virtual machine.</p></source> - <translation><p>Alça l'estat d'execució actual de la mà quina virtual al disc dur fÃsic de l'ordinador amfitrió.</p><p>La propera vegada que s'inicià esta mà quina, es restaurarà des de l'estat alçat i continuarà l'execució des del mateix lloc en què l'heu alçat, cosa que permetrà continuar immediatament amb el vostre treball.</p><p>Tingueu en compte que l'operació d'alçar l'estat de la mà quina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la mà quina virtual.</p></translation> + <translation><p>Alça l'estat d'execució actual de la mà quina virtual al disc dur fÃsic de l'ordinador amfitrió.</p><p>La propera vegada que s'inicià esta mà quina, es restaurarà des de l'estat alçat i continuarà l'execució des del mateix lloc en què l'heu alçat, cosa que permetrà continuar immediatament amb el vostre treball.</p><p>Tingueu en compte que l'operació d'alçar l'estat de la mà quina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la mà quina virtual.</p></translation> </message> <message> <source>&Save the machine state</source> @@ -5215,7 +5239,7 @@ pas i connectar discos durs més avant, fent servir el dià leg de configuració </message> <message> <source><p>Sends the ACPI Power Button press event to the virtual machine.</p><p>Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.</p><p>If the machine doesn't respond to this action then the guest operating system may be misconfigured or doesn't understand ACPI Power Button events at all. In this case you should select the <b>Power off the machine</b> action to stop virtual machine execution.</p></source> - <translation><p>Envia a la mà quina virtual l'esdeveniment de prémer el botó ACPI Power.</p><p>Normalment, el sistema operatiu client que s'està executant a dins de la mà quina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la mà quina virtual perquè totes les aplicacions que s'estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.</p><p>Si la mà quina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l'acció <b>Atura la mà quina</b> per aturar l'execució de la mà quina virtual.</p></translation> + <translation><p>Envia a la mà quina virtual l'esdeveniment de prémer el botó ACPI Power.</p><p>Normalment, el sistema operatiu client que s'està executant a dins de la mà quina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la mà quina virtual perquè totes les aplicacions que s'estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.</p><p>Si la mà quina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l'acció <b>Atura la mà quina</b> per aturar l'execució de la mà quina virtual.</p></translation> </message> <message> <source>S&end the shutdown signal</source> @@ -5693,7 +5717,7 @@ Versió %1</translation> <p>Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to the virtual machine.</p></source> <translation type="obsolete"><p>Alça l'estat d'execució actual de la mà quina virtual al disc dur fÃsic de l'ordinador d'amfitrió.</p> <p>La propera vegada que s'engegue esta mà quina, es restaurarà des de l'estat alçat i continuarà l'execució des del mateix lloc en què l'heu alçat, cosa que vos permetrà continuar immediatament amb el vostre treball.</p> -<p>Tingueu en compte que l'operació d'alçar l'estat de la mà quina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la mà quina virtual.</p></translation> +<p>Tingueu en compte que l'operació d'alçar l'estat de la mà quina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la mà quina virtual.</p></translation> </message> <message> <source>S&end the shutdown signal</source> @@ -5704,7 +5728,7 @@ Versió %1</translation> <p>Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.</p> <p>If the machine doesn't respond to this action then the guest operating system may be misconfigured or doesn't understand ACPI Power Button events at all. In this case you should select the <b>Power off the machine</b> action to stop virtual machine execution.</p></source> <translation type="obsolete"><p>Envia a la mà quina virtual l'esdeveniment de prémer el botó ACPI Power.</p> -<p>Normalment, el sistema operatiu client que s'està executant a dins de la mà quina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la mà quina virtual perquè totes les aplicacions que s'estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.</p> +<p>Normalment, el sistema operatiu client que s'està executant a dins de la mà quina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la mà quina virtual perquè totes les aplicacions que s'estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.</p> <p>Si la mà quina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l'acció <b>Atura la mà quina</b> per aturar l'execució de la mà quina virtual.</p></translation> </message> <message> @@ -5719,11 +5743,11 @@ Versió %1</translation> </message> <message> <source><p>Saves the current execution state of the virtual machine to the physical hard disk of the host PC.</p><p>Next time this machine is started, it will be restored from the saved state and continue execution from the same place you saved it at, which will let you continue your work immediately.</p><p>Note that saving the machine state may take a long time, depending on the guest operating system type and the amount of memory you assigned to the virtual machine.</p></source> - <translation type="obsolete"><p>Alça l'estat d'execució actual de la mà quina virtual al disc dur fÃsic de l'ordinador amfitrió.</p><p>La propera vegada que s'inicià esta mà quina, es restaurarà des de l'estat alçat i continuarà l'execució des del mateix lloc en què l'heu alçat, cosa que permetrà continuar immediatament amb el vostre treball.</p><p>Tingueu en compte que l'operació d'alçar l'estat de la mà quina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la mà quina virtual.</p></translation> + <translation type="obsolete"><p>Alça l'estat d'execució actual de la mà quina virtual al disc dur fÃsic de l'ordinador amfitrió.</p><p>La propera vegada que s'inicià esta mà quina, es restaurarà des de l'estat alçat i continuarà l'execució des del mateix lloc en què l'heu alçat, cosa que permetrà continuar immediatament amb el vostre treball.</p><p>Tingueu en compte que l'operació d'alçar l'estat de la mà quina pot prendre molt de temps, depenent del tipus de sistema operatiu client i la quantitat de memòria assignada a la mà quina virtual.</p></translation> </message> <message> <source><p>Sends the ACPI Power Button press event to the virtual machine.</p><p>Normally, the guest operating system running inside the virtual machine will detect this event and perform a clean shutdown procedure. This is a recommended way to turn off the virtual machine because all applications running inside it will get a chance to save their data and state.</p><p>If the machine doesn't respond to this action then the guest operating system may be misconfigured or doesn't understand ACPI Power Button events at all. In this case you should select the <b>Power off the machine</b> action to stop virtual machine execution.</p></source> - <translation type="obsolete"><p>Envia a la mà quina virtual l'esdeveniment de prémer el botó ACPI Power.</p><p>Normalment, el sistema operatiu client que s'està executant a dins de la mà quina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la mà quina virtual perquè totes les aplicacions que s'estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.</p><p>Si la mà quina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l'acció <b>Atura la mà quina</b> per aturar l'execució de la mà quina virtual.</p></translation> + <translation type="obsolete"><p>Envia a la mà quina virtual l'esdeveniment de prémer el botó ACPI Power.</p><p>Normalment, el sistema operatiu client que s'està executant a dins de la mà quina virtual detectarà este esdeveniment i realitzarà un procediment de tancament net. Esta és una manera recomanada de tancar la mà quina virtual perquè totes les aplicacions que s'estan executant en ella tindran la possibilitat d'alçar les seues dades i estat.</p><p>Si la mà quina no respon a esta acció potser el sistema operatiu client pot estar mal configurat o no entén els events del botó ACPI Power. En este cas, seleccioneu l'acció <b>Atura la mà quina</b> per aturar l'execució de la mà quina virtual.</p></translation> </message> <message> <source><p>Turns off the virtual machine.</p><p>Note that this action will stop machine execution immediately so that the guest operating system running inside it will not be able to perform a clean shutdown procedure which may result in <i>data loss</i> inside the virtual machine. Selecting this action is recommended only if the virtual machine does not respond to the <b>Send the shutdown signal</b> action.</p></source> @@ -8242,7 +8266,7 @@ Versió %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' no és un codi de tecla d'amfitrió và lid.</translation> + <translation type="obsolete">'%1 (0x%2)' no és un codi de tecla d'amfitrió và lid.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8252,6 +8276,10 @@ Versió %1</translation> <source>Cannot delete the key '%1'.</source> <translation>No es pot eliminar la tecla '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -9471,7 +9499,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </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 status bar will look like&nbsp;<img src=mouse_seamless_16px.png/>&nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.</p><p><b>Note</b>: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.</p></source> - <translation type="obsolete"><p>La Mà quina Virtual ha informat que el sistema client suporta <b>integració del punter del ratolÃ</b>. Això significa que no necessiteu <i>capturar</i> el punter del ratolà per poder fer-lo servir al sistema client -- totes les accions que executeu quan el punter del ratolà estiga a sobre de la Mà quina virtual s'enviaran directament al sistema client. Si es captura el ratolÃ, automà ticament es tornarà al mode normal.</p><p>La icona del ratolà a la barra d'estat es mostrarà com&nbsp;<img src=mouse_seamless_16px.png/>&nbsp;per informar-vos que la integració del punter està suportada pel sistema client que està actiu.</p><p><b>Nota</b>: Algunes aplicacions poden comportar-s'incorrectament treballant en el mode d'integració del ratolÃ. Sempre podeu inhabilitar-ho a la sessió actual (o habilitar-ho) seleccionat l'opció corresponent a la barra de menú.</p></translation> + <translation type="obsolete"><p>La Mà quina Virtual ha informat que el sistema client suporta <b>integració del punter del ratolÃ</b>. Això significa que no necessiteu <i>capturar</i> el punter del ratolà per poder fer-lo servir al sistema client -- totes les accions que executeu quan el punter del ratolà estiga a sobre de la Mà quina virtual s'enviaran directament al sistema client. Si es captura el ratolÃ, automà ticament es tornarà al mode normal.</p><p>La icona del ratolà a la barra d'estat es mostrarà com&nbsp;<img src=mouse_seamless_16px.png/>&nbsp;per informar-vos que la integració del punter està suportada pel sistema client que està actiu.</p><p><b>Nota</b>: Algunes aplicacions poden comportar-s'incorrectament treballant en el mode d'integració del ratolÃ. Sempre podeu inhabilitar-ho a la sessió actual (o habilitar-ho) seleccionat l'opció corresponent a la barra de menú.</p></translation> </message> <message> <source><p>The virtual machine window is optimized to work in <b>%1&nbsp;bit</b> color mode but the virtual display is currently set to <b>%2&nbsp;bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3&nbsp;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 OS/2, may actually work in 32&nbsp;bit mode but report it as 24&nbsp;bit (16 million colors). You may try to select a different color mode to see if this message disappears or you can simply disable the message now if you are sure the required color mode (%4&nbsp;bit) is not available in the guest OS.</p></source> @@ -9650,7 +9678,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source><p>The following VirtualBox settings files have been automatically converted to the new settings file format version <b>%1</b>.</p><p>However, the results of the conversion were not saved back to disk yet. Please press:</p><ul><li><b>Save</b> to save all auto-converted files now (it will not be possible to use these settings files with an older version of VirtualBox in the future);</li><li><b>Backup</b> to create backup copies of the settings files in the old format before saving them in the new format;</li><li><b>Cancel</b> to not save the auto-converted settings files now.<li></ul><p>Note that if you select <b>Cancel</b>, the auto-converted settings files will be implicitly saved in the new format anyway once you change a setting or start a virtual machine, but <b>no</b> backup copies will be created in this case.</p></source> - <translation type="obsolete"><p>Els següents fitxers de parà metres del VirtualBox s'han convertit automà ticament al nou format <b>%1</b>.</p><p>Tot i aixÃ, els resultats de la conversió encara no s'han alçat al disc. Premeu:</p><ul><li><b>Alça</b> per alçar ara els fitxers auto-convertits (ja no serà possible fer servir estos parà metres amb una versió anterior del VirtualBox);</li><li><b>Còpia de seguretat</b> per crear una còpia de seguretat dels fitxers de parà metres en el format antic abans d'alçar-los en el nou format;</li><li><b>Cancel·la</b> per no alçar ara els fitxers de parà metres auto-convertits.</li></ul><p>Tingueu en compte que si seleccioneu <b>Cancel·la</b>, els fitxers de parà metres auto-convertits s'alçaran implÃcitament en el nou format tot i que una vegada que canvieu algun parà metre o inicieu una mà quina virtual, en canvi en este cas <b>no</b> es faran còpies de seguretat.</p></translation> + <translation type="obsolete"><p>Els següents fitxers de parà metres del VirtualBox s'han convertit automà ticament al nou format <b>%1</b>.</p><p>Tot i aixÃ, els resultats de la conversió encara no s'han alçat al disc. Premeu:</p><ul><li><b>Alça</b> per alçar ara els fitxers auto-convertits (ja no serà possible fer servir estos parà metres amb una versió anterior del VirtualBox);</li><li><b>Còpia de seguretat</b> per crear una còpia de seguretat dels fitxers de parà metres en el format antic abans d'alçar-los en el nou format;</li><li><b>Cancel·la</b> per no alçar ara els fitxers de parà metres auto-convertits.</li></ul><p>Tingueu en compte que si seleccioneu <b>Cancel·la</b>, els fitxers de parà metres auto-convertits s'alçaran implÃcitament en el nou format tot i que una vegada que canvieu algun parà metre o inicieu una mà quina virtual, en canvi en este cas <b>no</b> es faran còpies de seguretat.</p></translation> </message> <message> <source>&Save</source> @@ -9740,7 +9768,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </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 status bar will look like&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.</p><p><b>Note</b>: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.</p></source> - <translation><p>La Mà quina Virtual ha informat que el sistema client suporta <b>integració del punter</b>. Això significa que no necessiteu <i>capturar</i> el punter per poder fer-lo servir al sistema client -- totes les accions que executeu quan el punter estiga a sobre de la Mà quina virtual s'enviaran directament al sistema client. Si es captura el punter, automà ticament es tornarà al mode normal.</p><p>La icona del punter a la barra d'estat es mostrarà com&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;per informar-vos que la integració del punter està suportada pel sistema client que està actiu.</p><p><b>Nota</b>: Algunes aplicacions poden comportar-s'incorrectament treballant en el mode d'integració del punter. Sempre podeu inhabilitar-ho a la sessió actual (o habilitar-ho) seleccionat l'opció corresponent a la barra de menú.</p></translation> + <translation><p>La Mà quina Virtual ha informat que el sistema client suporta <b>integració del punter</b>. Això significa que no necessiteu <i>capturar</i> el punter per poder fer-lo servir al sistema client -- totes les accions que executeu quan el punter estiga a sobre de la Mà quina virtual s'enviaran directament al sistema client. Si es captura el punter, automà ticament es tornarà al mode normal.</p><p>La icona del punter a la barra d'estat es mostrarà com&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;per informar-vos que la integració del punter està suportada pel sistema client que està actiu.</p><p><b>Nota</b>: Algunes aplicacions poden comportar-s'incorrectament treballant en el mode d'integració del punter. Sempre podeu inhabilitar-ho a la sessió actual (o habilitar-ho) seleccionat l'opció corresponent a la barra de menú.</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>. 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> @@ -9996,7 +10024,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source><p>The following VirtualBox settings files have been automatically converted to the new settings file format version <b>%1</b>.</p><p>However, the results of the conversion were not saved back to disk yet. Please press:</p><ul><li><b>Backup</b> to create backup copies of the settings files in the old format before saving them in the new format;</li><li><b>Overwrite</b> to save all auto-converted files without creating backup copies (it will not be possible to use these settings files with an older version of VirtualBox afterwards);</li>%2</ul><p>It is recommended to always select <b>Backup</b> because in this case it will be possible to go back to the previous version of VirtualBox (if necessary) without losing your current settings. See the VirtualBox Manual for more information about downgrading.</p></source> - <translation type="obsolete"><p>Els següents fitxers de parà metres del VirtualBox s'han convertit automà ticament al nou format <b>%1</b>.</p><p>Tot i aixÃ, els resultats de la conversió encara no s'han alçat al disc. Premeu:</p><ul><li><b>Alça</b> per alçar ara els fitxers auto-convertits (ja no serà possible fer servir estos parà metres amb una versió anterior del VirtualBox);</li><li><b>Còpia de seguretat</b> per crear una còpia de seguretat dels fitxers de parà metres en el format antic abans d'alçar-los en el nou format;</li><li><b>Sobreescriu</b> per alçar tots els fitxers auto-convertitts sense crear còpies de seguretat;</li>%2</ul><p>Es recomana seleccionar en tot moment <b>Còpia de seguretat</b> perquè sempre serà possible tornar a l'estat anterior sense perdre els parà metres de configuració actuals. Mireu el manual del VirtualBox per a més informació sobre desactualització.</p></translation> + <translation type="obsolete"><p>Els següents fitxers de parà metres del VirtualBox s'han convertit automà ticament al nou format <b>%1</b>.</p><p>Tot i aixÃ, els resultats de la conversió encara no s'han alçat al disc. Premeu:</p><ul><li><b>Alça</b> per alçar ara els fitxers auto-convertits (ja no serà possible fer servir estos parà metres amb una versió anterior del VirtualBox);</li><li><b>Còpia de seguretat</b> per crear una còpia de seguretat dels fitxers de parà metres en el format antic abans d'alçar-los en el nou format;</li><li><b>Sobreescriu</b> per alçar tots els fitxers auto-convertitts sense crear còpies de seguretat;</li>%2</ul><p>Es recomana seleccionar en tot moment <b>Còpia de seguretat</b> perquè sempre serà possible tornar a l'estat anterior sense perdre els parà metres de configuració actuals. Mireu el manual del VirtualBox per a més informació sobre desactualització.</p></translation> </message> <message> <source><li><b>Exit</b> to terminate VirtualBox without saving the results of the conversion to disk.</li></source> @@ -10388,7 +10416,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source>Sorry, some generic error happens.</source> - <translation>S'han produït alguns errors genèrics.</translation> + <translation type="obsolete">S'han produït alguns errors genèrics.</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> @@ -10475,6 +10503,18 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>S'ha instal·lat el paquet d'extensió br><nobr><b>%1</b><nobr><br>.</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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10552,7 +10592,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source><p>Please fill out this registration form to let vos 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 use your personal data can be found in the <b>Privacy Policy</b> section of the VirtualBox Manual or on the <a href=http://www.virtualbox.org/wiki/PrivacyPolicy>Privacy Policy</a> page of the VirtualBox web-site.</p></source> - <translation type="obsolete"><p>Ompliu este formulari de registre per permetre'ns conèixer que feu servir el VirtualBox i, opcionalment, mantindre-vos informat sobre novetats i actualitzacions del VirtualBox.</p><p>Feu servir carà cters llatins per omplir els camps següents. Tingueu en compte que Sun Microsystems farà servir esta informació només per a usos estadÃstics i per enviar-vos notÃcies sobre el VirtualBox. Sun Microsystems mai compartirà les vostres dades amb terceres parts. Més informació detallada sobre l'ús de les vostres dades personals poden trobar-s'a la secció de <b>PolÃtica de privacitat</b> al manual de VirtualBox o al<a href=http://www.virtualbox.org/wiki/PrivacyPolicy>Privacy Policy</a> lloc web del VirtualBox.</p></translation> + <translation type="obsolete"><p>Ompliu este formulari de registre per permetre'ns conèixer que feu servir el VirtualBox i, opcionalment, mantindre-vos informat sobre novetats i actualitzacions del VirtualBox.</p><p>Feu servir carà cters llatins per omplir els camps següents. Tingueu en compte que Sun Microsystems farà servir esta informació només per a usos estadÃstics i per enviar-vos notÃcies sobre el VirtualBox. Sun Microsystems mai compartirà les vostres dades amb terceres parts. Més informació detallada sobre l'ús de les vostres dades personals poden trobar-s'a la secció de <b>PolÃtica de privacitat</b> al manual de VirtualBox o al<a href=http://www.virtualbox.org/wiki/PrivacyPolicy>Privacy Policy</a> lloc web del VirtualBox.</p></translation> </message> <message> <source>I &already have a Sun Online account:</source> @@ -10862,7 +10902,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&VirtualBox Web Site...</source> @@ -10874,7 +10914,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source>R&esume</source> - <translation>R&eprèn</translation> + <translation type="obsolete">R&eprèn</translation> </message> <message> <source>Resume</source> @@ -10961,6 +11001,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Gestor</translation> </message> <message> @@ -11032,7 +11073,7 @@ un disc dur per connectar a la ranura remarcada actualment.</a></translati <name>VBoxSettingsDialog</name> <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> - <translation type="obsolete"><i>Seleccioneu una categoria de parà metres en la llista de l'esquerra i deplaceu el punter sobre un element de la dreta per obtindre'n més informació</i>.</translation> + <translation type="obsolete"><i>Seleccioneu una categoria de parà metres en la llista de l'esquerra i deplaceu el punter sobre un element de la dreta per obtindre'n més informació</i>.</translation> </message> <message> <source>On the <b>%1</b> page, %2</source> @@ -12571,7 +12612,7 @@ o a ambdòs (<i>Qualsevol</i>).</qt></translation> </message> <message> <source>Displays 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="obsolete">Mostra la ruta on les captures d'esta mà quina virtual s'alçaran. Tingueu en compte que les captures poden ocupar prou quantitat d'espai al disc dur.</translation> + <translation type="obsolete">Mostra la ruta on les captures d'esta mà quina virtual s'alçaran. Tingueu en compte que les captures poden ocupar prou quantitat d'espai al disc dur.</translation> </message> <message> <source>Displays the virtual hard disk to attach to this IDE slot and allows to quickly select a different hard disk.</source> @@ -12667,7 +12708,7 @@ o a ambdòs (<i>Qualsevol</i>).</qt></translation> </message> <message> <source>If checked, any change to mounted CD/DVD or Floppy media performed during machine execution will be saved in the settings file in order to preserve the configuration of mounted media between runs.</source> - <translation type="obsolete">Si està marcat, qualsevol canvi al CD/DVD o disquet muntat s'alçarà al fitxer de configuració per tal de preservar la configuració dels suports muntats entre cada execució de la mà quina virtual.</translation> + <translation type="obsolete">Si està marcat, qualsevol canvi al CD/DVD o disquet muntat s'alçarà al fitxer de configuració per tal de preservar la configuració dels suports muntats entre cada execució de la mà quina virtual.</translation> </message> <message> <source>&Image File</source> @@ -12851,7 +12892,7 @@ o a ambdòs (<i>Qualsevol</i>).</qt></translation> <message> <source><qt>Controls the audio output driver. The <b>Null Audio Driver</b> makes the guest see an audio card, however every access to it will be ignored.</qt></source> - <translation type="obsolete"><qt>Gestiona el controlador d'eixida de so. El <b>controlador d'à udio Nul</b> + <translation type="obsolete"><qt>Gestiona el controlador d'eixida de so. El <b>controlador d'à udio Nul</b> fa que el client veja una tarjeta de so, però l'accés a ella s'ignorarà .</qt></translation> </message> <message> @@ -13010,7 +13051,7 @@ esta caracterÃstica després d'haver instal·lat un Windows al sistema ope </message> <message> <source>When checked, a virtual PCI audio card will be plugged into the virtual machine and will communicate with the host audio system using the specified driver.</source> - <translation type="obsolete">Quan estiga marcat, la tarjeta de so PCI virtual es connectarà a dins de la mà quina virtual, la qual farà servir un controlador especÃfic per comunicar-s'amb la tarjeta de so de l'amfitrió.</translation> + <translation type="obsolete">Quan estiga marcat, la tarjeta de so PCI virtual es connectarà a dins de la mà quina virtual, la qual farà servir un controlador especÃfic per comunicar-s'amb la tarjeta de so de l'amfitrió.</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> @@ -13366,7 +13407,7 @@ al sistema amfitrió.</qt></translation> <name>VBoxVMSettingsVRDP</name> <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> - <translation type="obsolete">Quan estiga marcat, la mà quina virtual actuarà com un servidor protocol d'escriptori remot (RDP), permetent als clients remots connectar-s'a la mà quina virtual (quan estiga executant-se) fent servir l'està ndard client RDP.</translation> + <translation type="obsolete">Quan estiga marcat, la mà quina virtual actuarà com un servidor protocol d'escriptori remot (RDP), permetent als clients remots connectar-s'a la mà quina virtual (quan estiga executant-se) fent servir l'està ndard client RDP.</translation> </message> <message> <source>&Enable VRDP Server</source> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts index b4a1632e1..1cb809d89 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_cs.ts @@ -178,185 +178,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Vlevo </translation> - </message> - <message> - <source>Right </source> - <translation>Vpravo </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Levý Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Pravý Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Levý Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Pravý Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Levý Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Pravý Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Levá klávesa Win</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Pravá klávesa Win</translation> - </message> - <message> - <source>Menu key</source> - <translation>Klávesa Menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation></translation> - </message> - <message> - <source>Caps Lock</source> - <translation></translation> - </message> - <message> - <source>Scroll Lock</source> - <translation></translation> - </message> - <message> - <source><key_%1></source> - <translation><klávesa_%1></translation> - </message> - <message> - <source>Pause</source> - <translation></translation> - </message> - <message> - <source>Print Screen</source> - <translation></translation> - </message> - <message> - <source>F1</source> - <translation></translation> - </message> - <message> - <source>F2</source> - <translation></translation> - </message> - <message> - <source>F3</source> - <translation></translation> - </message> - <message> - <source>F4</source> - <translation></translation> - </message> - <message> - <source>F5</source> - <translation></translation> - </message> - <message> - <source>F6</source> - <translation></translation> - </message> - <message> - <source>F7</source> - <translation></translation> - </message> - <message> - <source>F8</source> - <translation></translation> - </message> - <message> - <source>F9</source> - <translation></translation> - </message> - <message> - <source>F10</source> - <translation></translation> - </message> - <message> - <source>F11</source> - <translation></translation> - </message> - <message> - <source>F12</source> - <translation></translation> - </message> - <message> - <source>F13</source> - <translation></translation> - </message> - <message> - <source>F14</source> - <translation></translation> - </message> - <message> - <source>F15</source> - <translation></translation> - </message> - <message> - <source>F16</source> - <translation></translation> - </message> - <message> - <source>F17</source> - <translation></translation> - </message> - <message> - <source>F18</source> - <translation></translation> - </message> - <message> - <source>F19</source> - <translation></translation> - </message> - <message> - <source>F20</source> - <translation></translation> - </message> - <message> - <source>F21</source> - <translation></translation> - </message> - <message> - <source>F22</source> - <translation></translation> - </message> - <message> - <source>F23</source> - <translation></translation> - </message> - <message> - <source>F24</source> - <translation></translation> - </message> - <message> - <source>Num Lock</source> - <translation></translation> - </message> - <message> - <source>Forward</source> - <translation>VpÅ™ed</translation> - </message> - <message> - <source>Back</source> - <translation>ZpÄ›t</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -563,7 +384,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI &vypnutÃ</translation> + <translation type="obsolete">ACPI &vypnutÃ</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1686,6 +1507,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Soubory balÃÄku z rozÅ¡ÃÅ™enà (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">RozÅ¡ÃÅ™enÃ</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1758,11 +1583,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Resetovat klávesu hostitele</translation> + <translation type="obsolete">Resetovat klávesu hostitele</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Resetuje klávesu hostitele použitou v oknÄ› s virtuálnÃm poÄÃtaÄem.</translation> + <translation type="obsolete">Resetuje klávesu hostitele použitou v oknÄ› s virtuálnÃm poÄÃtaÄem.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1772,6 +1597,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>&Automaticky zachytávat klávesnici</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1974,7 +1807,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Nové rozhranà hostitele</translation> + <translation type="obsolete">Nové rozhranà hostitele</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2131,6 +1968,81 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Vlevo </translation> + </message> + <message> + <source>Right </source> + <translation>Vpravo </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Levý Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Pravý Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Levý Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Pravý Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Levý Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Pravý Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Levá klávesa Win</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Pravá klávesa Win</translation> + </message> + <message> + <source>Menu key</source> + <translation>Klávesa Menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation></translation> + </message> + <message> + <source>Caps Lock</source> + <translation></translation> + </message> + <message> + <source>Scroll Lock</source> + <translation></translation> + </message> + <message> + <source><key_%1></source> + <translation><klávesa_%1></translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">VpÅ™ed</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">ZpÄ›t</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2360,7 +2272,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -4128,6 +4040,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -8114,7 +8030,7 @@ Verze %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' je neplatný kód klávesy hostitele.</translation> + <translation type="obsolete">'%1 (0x%2)' je neplatný kód klávesy hostitele.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8124,6 +8040,10 @@ Verze %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Nelze smazat klávesu '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -9986,7 +9906,7 @@ na výchozà jazyk systému.</qt> </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Omlouváme se, vyskytla se obecná chyba.</translation> + <translation type="obsolete">Omlouváme se, vyskytla se obecná chyba.</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> @@ -10073,6 +9993,18 @@ na výchozà jazyk systému.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10230,10 +10162,6 @@ na výchozà jazyk systému.</qt> <context> <name>VBoxSelectorWnd</name> <message> - <source>VirtualBox OSE</source> - <translation></translation> - </message> - <message> <source>&Details</source> <translation type="obsolete">&Detaily</translation> </message> @@ -10428,7 +10356,7 @@ na výchozà jazyk systému.</qt> </message> <message> <source>R&esume</source> - <translation>Ob&novit</translation> + <translation type="obsolete">Ob&novit</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -10499,6 +10427,7 @@ na výchozà jazyk systému.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Správce</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts index 07c13a6c7..77a30c360 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_da.ts @@ -140,187 +140,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Venstre</translation> - </message> - <message> - <source>Right </source> - <translation>Højre</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Venstre Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Højre Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Venstre Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Højre Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Venstre Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Højre Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Venstre Windows-tast</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Højre Windows-tast</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menu tast</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><tast_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translatorcomment>Also known as a fighterjet :-)</translatorcomment> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translatorcomment>F18</translatorcomment> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>Fremad</translation> - </message> - <message> - <source>Back</source> - <translation>Tilbage</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -520,7 +339,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI sluk</translation> + <translation type="obsolete">ACPI sluk</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1661,6 +1480,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Udvidelsespakker (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation>Udvidelser</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1729,11 +1552,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Nulstil værtstast</translation> + <translation type="obsolete">Nulstil værtstast</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Nulstiller valget af værtstast til standardvalget.</translation> + <translation type="obsolete">Nulstiller valget af værtstast til standardvalget.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1743,6 +1566,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>Indf&ang tastatur automatisk</translation> </message> + <message> + <source>Reset host combination</source> + <translation>Nulstil værtstast-sekvens</translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>Nulstiller tastekombinationen brugt som værtstast-sekvens i VM-vinduet.</translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1945,7 +1776,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Nyt værtsbegrænset netkort</translation> + <translation type="obsolete">Nyt værtsbegrænset netkort</translation> + </message> + <message> + <source>Networking</source> + <translation>Netværk</translation> </message> </context> <context> @@ -2102,6 +1937,191 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Venstre</translation> + </message> + <message> + <source>Right </source> + <translation>Højre</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Venstre Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Højre Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Venstre Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Højre Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Venstre Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Højre Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Venstre Windows-tast</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Højre Windows-tast</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menu tast</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><tast_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translatorcomment>Also known as a fighterjet :-)</translatorcomment> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translatorcomment>F18</translatorcomment> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Fremad</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Tilbage</translation> + </message> + <message> + <source>None</source> + <translation>Ingen</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2335,7 +2355,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3731,6 +3751,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><nobr>Tilstand: %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. 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.</source> + <translation>USB 2.0 er pt aktiveret i denne virtuelle maskine. Dette kræver at <b>%1</b> installeres - denne kan hentes fra VirtualBox' hjemmeside. Derefter kan du reaktivere USB 2.0. USB 2.0 vil blive deaktiveret, medmindre du annullerer de nuværende ændringer.</translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -6890,7 +6914,7 @@ p, li { white-space: pre-wrap; } <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' er ikke en gyldig værtstast.</translation> + <translation type="obsolete">'%1 (0x%2)' er ikke en gyldig værtstast.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -6900,6 +6924,10 @@ p, li { white-space: pre-wrap; } <source>Cannot delete the key '%1'.</source> <translation>Kan ikke slette nøglen '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>'%1' er ikke en gyldig værtstast-sekvens.</translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -8277,7 +8305,7 @@ p, li { white-space: pre-wrap; } <message> <source>Sorry, some generic error happens.</source> <translatorcomment>Huh?</translatorcomment> - <translation>Beklager, der skete en fejl.</translation> + <translation type="obsolete">Beklager, der skete en fejl.</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> @@ -8364,6 +8392,18 @@ p, li { white-space: pre-wrap; } <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>Udvidelsespakken <br><nobr><b>%1</b><nobr><br> blev installeret korrekt.</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> + <translation>Sletning af samtlige filer, der tilhører VM'en er pt deaktiveret pÃ¥ Windows/x64 for at forhindre nedbrud. Problemet vil blive løst i næste version.</translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>Kan ikke oprette mappen <b>%1</b> i overmappen <nobr><b>%2</b>.</nobr></p><p>Tjek at overmappen findes og at du har rettigheder til at oprette mapper i den.</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> + <translation><p>USB 2.0 er pt aktiveret i denne virtuelle maskine. Dette kræver at <b><nobr>%1</nobr></b> installeres.</p><p>Denne kan hentes fra VirtualBox' hjemmeside. Derefter kan du reaktivere USB 2.0. USB 2.0 vil blive deaktiveret, medmindre du annullerer de nuværende ændringer.</p></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8474,7 +8514,7 @@ p, li { white-space: pre-wrap; } <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8583,7 +8623,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>R&esume</source> - <translation>G&enoptag</translation> + <translation type="obsolete">G&enoptag</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8658,6 +8698,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>HÃ¥ndtering</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts index 47e3bf994..113337b31 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_de.ts @@ -111,185 +111,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Links</translation> - </message> - <message> - <source>Right </source> - <translation>Rechts</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Umsch Links</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Umsch Rechts</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Strg Links</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Strg Rechts</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt Links</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt Rechts</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Win Links</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Win Rechts</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menü</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>AltGr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Umsch Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Rollen Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><Taste_%1></translation> - </message> - <message> - <source>Pause</source> - <translation type="obsolete">Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation type="obsolete">Druck</translation> - </message> - <message> - <source>F1</source> - <translation type="obsolete">F1</translation> - </message> - <message> - <source>F2</source> - <translation type="obsolete">F2</translation> - </message> - <message> - <source>F3</source> - <translation type="obsolete">F3</translation> - </message> - <message> - <source>F4</source> - <translation type="obsolete">F4</translation> - </message> - <message> - <source>F5</source> - <translation type="obsolete">F5</translation> - </message> - <message> - <source>F6</source> - <translation type="obsolete">F6</translation> - </message> - <message> - <source>F7</source> - <translation type="obsolete">F7</translation> - </message> - <message> - <source>F8</source> - <translation type="obsolete">F8</translation> - </message> - <message> - <source>F9</source> - <translation type="obsolete">F9</translation> - </message> - <message> - <source>F10</source> - <translation type="obsolete">F10</translation> - </message> - <message> - <source>F11</source> - <translation type="obsolete">F11</translation> - </message> - <message> - <source>F12</source> - <translation type="obsolete">F12</translation> - </message> - <message> - <source>F13</source> - <translation type="obsolete">F13</translation> - </message> - <message> - <source>F14</source> - <translation type="obsolete">F14</translation> - </message> - <message> - <source>F15</source> - <translation type="obsolete">F15</translation> - </message> - <message> - <source>F16</source> - <translation type="obsolete">F16</translation> - </message> - <message> - <source>F17</source> - <translation type="obsolete">F17</translation> - </message> - <message> - <source>F18</source> - <translation type="obsolete">F18</translation> - </message> - <message> - <source>F19</source> - <translation type="obsolete">F19</translation> - </message> - <message> - <source>F20</source> - <translation type="obsolete">F20</translation> - </message> - <message> - <source>F21</source> - <translation type="obsolete">F21</translation> - </message> - <message> - <source>F22</source> - <translation type="obsolete">F22</translation> - </message> - <message> - <source>F23</source> - <translation type="obsolete">F23</translation> - </message> - <message> - <source>F24</source> - <translation type="obsolete">F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation type="obsolete">Num</translation> - </message> - <message> - <source>Forward</source> - <translation type="obsolete">Vorw</translation> - </message> - <message> - <source>Back</source> - <translation type="obsolete">Rückw</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -441,10 +262,6 @@ <translation>Ausschalten per &ACPI</translation> </message> <message> - <source>ACPI S&hutdown</source> - <translation>Ausschalten per &ACPI</translation> - </message> - <message> <source>Send the ACPI Power Button press event to the virtual machine</source> <translation>Sendet das ACPI-Ereignis "Einschaltknopf gedrückt" an die virtuelle Maschine</translation> </message> @@ -1237,14 +1054,6 @@ <translation>Zeigt die Taste, die als Host-Taste für VM-Fenster verwendet wird. Aktivieren Sie dieses Feld und betätigen Sie eine Taste, um diese als Host-Taste festzulegen. Als Host-Taste eignen sich üblicherweise nur Strg, Umsch, Alt usw.</translation> </message> <message> - <source>Reset Host Key</source> - <translation>Host-Taste zurücksetzen</translation> - </message> - <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Zurücksetzen der Host-Taste für VM-Fenster.</translation> - </message> - <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation>Ist diese Funktion eingeschaltet, wird die Tastatur jedes Mal automatisch gefangen, wenn das VM-Fenster aktiviert wird. In diesem Fall werden alle Tastendrücke (einschließlich Alt-Tab) in die VM umgeleitet.</translation> </message> @@ -1252,6 +1061,14 @@ <source>&Auto Capture Keyboard</source> <translation>&Auto-Fangmodus für Tastatur</translation> </message> + <message> + <source>Reset host combination</source> + <translation>keine Tastenkombination</translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>Deaktiviert die VM-Steuerung über Host-Taste(n-Kombination).</translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1443,10 +1260,6 @@ <translation>Name</translation> </message> <message> - <source>New Host-Only Interface</source> - <translation type="obsolete">Neues Host-Only Interface</translation> - </message> - <message> <source>Networking</source> <translation>Netzwerk</translation> </message> @@ -1605,6 +1418,73 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source><key_%1></source> + <translation><Taste_%1></translation> + </message> + <message> + <source>Left </source> + <translation>Links</translation> + </message> + <message> + <source>Right </source> + <translation>Rechts</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Umsch Links</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Umsch Rechts</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Strg Links</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Strg Rechts</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt Links</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt Rechts</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Win Links</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Win Rechts</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menü</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>AltGr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Umsch Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Rollen Lock</translation> + </message> + <message> + <source>None</source> + <translation>keine</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -1777,10 +1657,6 @@ <context> <name>UIMachineLogic</name> <message> - <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> - </message> - <message> <source> EXPERIMENTAL build %1r%2 - %3</source> <translation> Experimentelle Version %1r%2 - %3</translation> </message> @@ -2972,6 +2848,10 @@ <comment>USB filter tooltip</comment> <translation><nobr>Zustand: %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. 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.</source> + <translation>wurde die USB-2.0-Unterstützung aktiviert. Dies erfordert allerdings die Installation des <b>%1</b>. Sie finden dieses Zusatzpaket auf der offiziellen Webseite von VirtualBox. Ohne dieses Paket wird diese Einstellung deaktiviert, sobald Sie die Einstellungen der VM abspeichern.</translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -4719,48 +4599,6 @@ <comment>medium</comment> <translation>Diese Basisfestplatte ist indirekt über die folgenden Differenzfestplatten eingebunden:</translation> </message> - <message numerus="yes"> - <source>%n year(s)</source> - <translation> - <numerusform>%n Jahr</numerusform> - <numerusform>%n Jahre</numerusform> - </translation> - </message> - <message numerus="yes"> - <source>%n month(s)</source> - <translation> - <numerusform>%n Monat</numerusform> - <numerusform>%n Monate</numerusform> - </translation> - </message> - <message numerus="yes"> - <source>%n day(s)</source> - <translation> - <numerusform>%n Tag</numerusform> - <numerusform>%n Tage</numerusform> - </translation> - </message> - <message numerus="yes"> - <source>%n hour(s)</source> - <translation> - <numerusform>%n Stunde</numerusform> - <numerusform>%n Stunden</numerusform> - </translation> - </message> - <message numerus="yes"> - <source>%n minute(s)</source> - <translation> - <numerusform>%n Minute</numerusform> - <numerusform>%n Minuten</numerusform> - </translation> - </message> - <message numerus="yes"> - <source>%n second(s)</source> - <translation> - <numerusform>%n Sekunde</numerusform> - <numerusform>%n Sekunden</numerusform> - </translation> - </message> <message> <source>(CD/DVD)</source> <translation>(CD/DVD)</translation> @@ -4960,14 +4798,52 @@ <source>and</source> <translation>und</translation> </message> + <message numerus="yes"> + <source>%n year(s)</source> + <translation> + <numerusform>%n Jahr</numerusform> + <numerusform>%n Jahre</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%n month(s)</source> + <translation> + <numerusform>%n Monat</numerusform> + <numerusform>%n Monate</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%n day(s)</source> + <translation> + <numerusform>%n Tag</numerusform> + <numerusform>%n Tage</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%n hour(s)</source> + <translation> + <numerusform>%n Stunde</numerusform> + <numerusform>%n Stunden</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%n minute(s)</source> + <translation> + <numerusform>%n Minute</numerusform> + <numerusform>%n Minuten</numerusform> + </translation> + </message> + <message numerus="yes"> + <source>%n second(s)</source> + <translation> + <numerusform>%n Sekunde</numerusform> + <numerusform>%n Sekunden</numerusform> + </translation> + </message> </context> <context> <name>VBoxGlobalSettings</name> <message> - <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' ist kein gültiger Tastencode.</translation> - </message> - <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> <translation>Der Wert '%1' des Schlüssels '%2' passt nicht auf den regulären Ausdruck '%3'.</translation> </message> @@ -4975,6 +4851,10 @@ <source>Cannot delete the key '%1'.</source> <translation>Der Schlüssel '%1' konnte nicht gelöscht werden.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>'%1' ist eine nicht zulässige Tastenkombination.</translation> + </message> </context> <context> <name>VBoxImportApplianceWgt</name> @@ -6178,7 +6058,19 @@ </message> <message> <source><p>Cannot create the machine folder:</p><p><b>%1</b></p><p>Please check you have the permissions required to do so.</p></source> - <translation><p>Der Ordner für die virtuelle Maschine kann nicht angelegt werden:</p><p><b>%1</b></p><p>Bitte überprüfen Sie die Zugriffsrechte.</p></translation> + <translation type="obsolete"><p>Der Ordner für die virtuelle Maschine kann nicht angelegt werden:</p><p><b>%1</b></p><p>Bitte überprüfen Sie die Zugriffsrechte.</p></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> + <translation type="unfinished"></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> + <translation><p>Für diese VM wurde USB-2.0-Unterstützung aktiviert. Dies erfordert allerdings die Installation des <b><nobr>%1</nobr></b>.</p><p>Sie finden dieses Zusatzpaket auf der offiziellen Webseite von VirtualBox. Nach der Installation können Sie die USB-2.0-Unterstützung aktivieren. Ohne dieses Paket wird diese Einstellung deaktiviert, sobald Sie die Einstellungen der VM abspeichern.</p></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>Das Verzeichnis für die virtuellen Maschinen <b>%1</b> kann im Verzeichnis <nobr><b>%2</nobr> nicht erzeugt werden. </p><p>Bitte stellen Sie sicher, dass das übergeordnete Verzeichnis vorhanden und schreibbar ist.</p></translation> </message> </context> <context> @@ -6206,10 +6098,6 @@ <context> <name>VBoxSelectorWnd</name> <message> - <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> - </message> - <message> <source>&Preferences...</source> <comment>global settings</comment> <translation>&Globale Einstellungen...</translation> @@ -6288,7 +6176,7 @@ </message> <message> <source>R&esume</source> - <translation>&Fortfahren</translation> + <translation type="obsolete">&Fortfahren</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -6366,10 +6254,6 @@ <translation>Virtuelle-Maschinen-Dateien (%1)</translation> </message> <message> - <source>Manager</source> - <translation type="obsolete">Manager</translation> - </message> - <message> <source>&Add...</source> <translation>&Hinzufügen...</translation> </message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_el.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_el.ts index cfe689c9c..12f028088 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_el.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_el.ts @@ -111,185 +111,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right </source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left Shift</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Shift</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left Ctrl</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Ctrl</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left Alt</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Alt</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left WinKey</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right WinKey</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Menu key</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Alt Gr</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Caps Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Scroll Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source><key_%1></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Pause</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Print Screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F2</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F3</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F4</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F5</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F6</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F7</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F8</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F9</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F10</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F11</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F12</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F13</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F14</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F15</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F16</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F17</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F18</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F19</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F20</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F21</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F22</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F23</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F24</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Num Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Forward</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Back</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -441,10 +262,6 @@ <translation></translation> </message> <message> - <source>ACPI S&hutdown</source> - <translation></translation> - </message> - <message> <source>Send the ACPI Power Button press event to the virtual machine</source> <translation></translation> </message> @@ -1182,6 +999,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1233,19 +1054,19 @@ <translation type="unfinished"></translation> </message> <message> - <source>Reset Host Key</source> + <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resets the key used as a Host Key in the VM window.</source> + <source>&Auto Capture Keyboard</source> <translation type="unfinished"></translation> </message> <message> - <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> + <source>Reset host combination</source> <translation type="unfinished"></translation> </message> <message> - <source>&Auto Capture Keyboard</source> + <source>Resets the key combination used as the host combination in the VM window.</source> <translation type="unfinished"></translation> </message> </context> @@ -1439,7 +1260,7 @@ <translation type="unfinished"></translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -1597,6 +1418,73 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left Shift</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Shift</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left Ctrl</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Ctrl</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left Alt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Alt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left WinKey</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right WinKey</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Menu key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Alt Gr</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Caps Lock</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Scroll Lock</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><key_%1></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -1769,10 +1657,6 @@ <context> <name>UIMachineLogic</name> <message> - <source>VirtualBox OSE</source> - <translation></translation> - </message> - <message> <source> EXPERIMENTAL build %1r%2 - %3</source> <translation></translation> </message> @@ -2964,6 +2848,10 @@ <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -4956,15 +4844,15 @@ <context> <name>VBoxGlobalSettings</name> <message> - <source>'%1 (0x%2)' is an invalid host key code.</source> + <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> <translation type="unfinished"></translation> </message> <message> - <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> + <source>Cannot delete the key '%1'.</source> <translation type="unfinished"></translation> </message> <message> - <source>Cannot delete the key '%1'.</source> + <source>'%1' is an invalid host-combination code-sequence.</source> <translation type="unfinished"></translation> </message> </context> @@ -6084,10 +5972,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -6172,6 +6056,18 @@ <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxSFDialog</name> @@ -6198,10 +6094,6 @@ <context> <name>VBoxSelectorWnd</name> <message> - <source>VirtualBox OSE</source> - <translation type="unfinished"></translation> - </message> - <message> <source>&Import Appliance...</source> <translation type="unfinished"></translation> </message> @@ -6299,10 +6191,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>R&esume</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Resume the execution of the virtual machine</source> <translation type="unfinished"></translation> </message> @@ -6351,6 +6239,7 @@ </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts index dcd0cad15..f2eff218b 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_es.ts @@ -186,185 +186,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Izquierda </translation> - </message> - <message> - <source>Right </source> - <translation>Derecha </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Mayús Izquierdo</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Mayús Derecho</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ctrl Izquierdo</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Ctrl Derecho</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt Izquierdo</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt Derecho</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Tecla Win Izquierda</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Tecla Win Derecha</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tecla menú</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Bloq Mayús</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Bloq Despl</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pausa</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Impr Pant</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Bloq Num</translation> - </message> - <message> - <source>Forward</source> - <translation>Adelante</translation> - </message> - <message> - <source>Back</source> - <translation>Atrás</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -574,7 +395,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>A&pagado ACPI</translation> + <translation type="obsolete">A&pagado ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1764,6 +1585,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Archivos de paquete de extensión (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation>Extensiones</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1836,11 +1661,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Restablecer tecla anfitrión</translation> + <translation type="obsolete">Restablecer tecla anfitrión</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Restablecer la tecla usada como tecla anfitrión en la ventana de la MV.</translation> + <translation type="obsolete">Restablecer la tecla usada como tecla anfitrión en la ventana de la MV.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1850,6 +1675,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>&Autocapturar teclado</translation> </message> + <message> + <source>Reset host combination</source> + <translation>Reiniciar combinación anfitrión</translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>Reiniciar la combinación de techas usada como combinación anfitrión en la ventana de MV.</translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -2052,7 +1885,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Nueva interfaz solo anfitrión</translation> + <translation type="obsolete">Nueva interfaz solo anfitrión</translation> + </message> + <message> + <source>Networking</source> + <translation>Red</translation> </message> </context> <context> @@ -2209,6 +2046,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Izquierda </translation> + </message> + <message> + <source>Right </source> + <translation>Derecha </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Mayús Izquierdo</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Mayús Derecho</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ctrl Izquierdo</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Ctrl Derecho</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt Izquierdo</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt Derecho</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Tecla Win Izquierda</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Tecla Win Derecha</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tecla menú</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Bloq Mayús</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Bloq Despl</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pausa</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Impr Pant</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Bloq Num</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Adelante</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Atrás</translation> + </message> + <message> + <source>None</source> + <translation>Ninguna</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2442,7 +2462,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3981,6 +4001,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><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. 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.</source> + <translation>USB 2.0 está habilitado para esta máquina virtual. Sin embargo esto requiere que <b>%1</b> esté instalado. Instale el Paquete de Extensiones desde el sitio de descargas de VirtualBox. Después de esto podrá rehabilitar USB 2.0. Por el momento será deshabilitado a menos que cancele los cambios de preferencias actuales.</translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -8189,7 +8213,7 @@ Versión %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' es un código de tecla anfitrión inválido.</translation> + <translation type="obsolete">'%1 (0x%2)' es un código de tecla anfitrión inválido.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8199,6 +8223,10 @@ Versión %1</translation> <source>Cannot delete the key '%1'.</source> <translation>No se puede borrar la tecla '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>«%1» es una combinación de teclas anfitrión inválida.</translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -9779,7 +9807,7 @@ volver al idioma por omisión del sistema.</qt> </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 ecuentra 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="unfinished"><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> @@ -10329,7 +10357,7 @@ volver al idioma por omisión del sistema.</qt> </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Lo sentimos, ha sucedido un error genérico.</translation> + <translation type="obsolete">Lo sentimos, ha sucedido un error genérico.</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> @@ -10416,6 +10444,18 @@ volver al idioma por omisión del sistema.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>El paquete de extensión <br><nobr><b>%1</b><nobr><br> se ha instalado correctamente.</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> + <translation>La eliminación de todos los archivos pertenecientes a la MV está actualmente deshabilitado en Windows/x64 para prevenir un fallo. Esto será corregido en la siguiente versión.</translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>No se puede crear la carpeta de la máquina <b>%1</b> en la carpeta padre <nobr><b>%2</b>.</nobr></p><p>Compruebe que la carpeta padre existe y que tiene permisos para crear la carpeta de la máquina.</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> + <translation><p>USB 2.0 está habilitado para esta máquina virtual. Sin embargo esto requiere que <b><nobr>%1</nobr></b> esté instalado.</p><p>Instale el Paquete de Extensiones desde el sitio de descargas de VirtualBox. Después de esto podrá rehabilitar USB 2.0. Por el momento será deshabilitado a menos que cancele los cambios de preferencias actuales.</p></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10578,7 +10618,7 @@ volver al idioma por omisión del sistema.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -10815,7 +10855,7 @@ volver al idioma por omisión del sistema.</qt> </message> <message> <source>R&esume</source> - <translation>R&eanudar</translation> + <translation type="obsolete">R&eanudar</translation> </message> <message> <source>Resume</source> @@ -10902,6 +10942,7 @@ volver al idioma por omisión del sistema.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Administrador</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts index 92f967b4a..4f7034c51 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_eu.ts @@ -158,185 +158,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Ezker </translation> - </message> - <message> - <source>Right </source> - <translation>Eskuin </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Esker Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Eskuin Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ezker Ktrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Eskuin Ktrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Ezker Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Eskuin Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Ezker WinTekla</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Eskuin WinTekla</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menu tekla</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><%1_tekla></translation> - </message> - <message> - <source>Pause</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Print Screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F1</source> - <translation type="unfinished">F1</translation> - </message> - <message> - <source>F2</source> - <translation type="unfinished">F2</translation> - </message> - <message> - <source>F3</source> - <translation type="unfinished">F3</translation> - </message> - <message> - <source>F4</source> - <translation type="unfinished">F4</translation> - </message> - <message> - <source>F5</source> - <translation type="unfinished">F5</translation> - </message> - <message> - <source>F6</source> - <translation type="unfinished">F6</translation> - </message> - <message> - <source>F7</source> - <translation type="unfinished">F7</translation> - </message> - <message> - <source>F8</source> - <translation type="unfinished">F8</translation> - </message> - <message> - <source>F9</source> - <translation type="unfinished">F9</translation> - </message> - <message> - <source>F10</source> - <translation type="unfinished">F10</translation> - </message> - <message> - <source>F11</source> - <translation type="unfinished">F11</translation> - </message> - <message> - <source>F12</source> - <translation type="unfinished">F12</translation> - </message> - <message> - <source>F13</source> - <translation type="unfinished">F13</translation> - </message> - <message> - <source>F14</source> - <translation type="unfinished">F14</translation> - </message> - <message> - <source>F15</source> - <translation type="unfinished">F15</translation> - </message> - <message> - <source>F16</source> - <translation type="unfinished">F16</translation> - </message> - <message> - <source>F17</source> - <translation type="unfinished">F17</translation> - </message> - <message> - <source>F18</source> - <translation type="unfinished">F18</translation> - </message> - <message> - <source>F19</source> - <translation type="unfinished">F19</translation> - </message> - <message> - <source>F20</source> - <translation type="unfinished">F20</translation> - </message> - <message> - <source>F21</source> - <translation type="unfinished">F21</translation> - </message> - <message> - <source>F22</source> - <translation type="unfinished">F22</translation> - </message> - <message> - <source>F23</source> - <translation type="unfinished">F23</translation> - </message> - <message> - <source>F24</source> - <translation type="unfinished">F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Forward</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Back</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -532,7 +353,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI It&zalia</translation> + <translation type="obsolete">ACPI It&zalia</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1448,6 +1269,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1503,19 +1328,19 @@ <translation type="unfinished">MB leihoan Ostalari Tekla bezala erabilitakoa tekla erakusten du. Eremua gaitu eta Ostalari Tekla berria sakatu. Kontutan izan alfazenbakizkoak, kurtsore mugimenduak eta edizio teklak ezin direla Ostalari tekla bezala erabili.</translation> </message> <message> - <source>Reset Host Key</source> - <translation type="unfinished"></translation> + <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> + <translation type="unfinished">Markaturik dagoenean, teklatua automatikoki kapturatuko da MB leiho aktibatzen den bakoitzean. Teklatua kapturatzen denean, tekla sakatze guztiak (Alt-TAb bezalako sistemakoak barne) makina birtualera bidaliko da.</translation> </message> <message> - <source>Resets the key used as a Host Key in the VM window.</source> + <source>&Auto Capture Keyboard</source> <translation type="unfinished"></translation> </message> <message> - <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> - <translation type="unfinished">Markaturik dagoenean, teklatua automatikoki kapturatuko da MB leiho aktibatzen den bakoitzean. Teklatua kapturatzen denean, tekla sakatze guztiak (Alt-TAb bezalako sistemakoak barne) makina birtualera bidaliko da.</translation> + <source>Reset host combination</source> + <translation type="unfinished"></translation> </message> <message> - <source>&Auto Capture Keyboard</source> + <source>Resets the key combination used as the host combination in the VM window.</source> <translation type="unfinished"></translation> </message> </context> @@ -1709,7 +1534,7 @@ <translation type="unfinished">Izena</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -1867,6 +1692,169 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Ezker </translation> + </message> + <message> + <source>Right </source> + <translation>Eskuin </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Esker Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Eskuin Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ezker Ktrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Eskuin Ktrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Ezker Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Eskuin Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Ezker WinTekla</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Eskuin WinTekla</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menu tekla</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><%1_tekla></translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Batez</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -2048,7 +2036,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3379,6 +3367,10 @@ <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -6820,7 +6812,7 @@ gogorrak erantsi ditzakezu.</p></translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' ostalari gako kode oker bat da.</translation> + <translation type="obsolete">'%1 (0x%2)' ostalari gako kode oker bat da.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -6830,6 +6822,10 @@ gogorrak erantsi ditzakezu.</p></translation> <source>Cannot delete the key '%1'.</source> <translation>Ezin da '%1' tekla ezabatu.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -8567,10 +8563,6 @@ sistemako lehenetsiriko hizkuntza berrezartzeko.</qt> <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -8655,6 +8647,18 @@ sistemako lehenetsiriko hizkuntza berrezartzeko.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8705,7 +8709,7 @@ sistemako lehenetsiriko hizkuntza berrezartzeko.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -8930,7 +8934,7 @@ sistemako lehenetsiriko hizkuntza berrezartzeko.</qt> </message> <message> <source>R&esume</source> - <translation type="unfinished">Ja&rraitu</translation> + <translation type="obsolete">Ja&rraitu</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -9001,6 +9005,7 @@ sistemako lehenetsiriko hizkuntza berrezartzeko.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts index 181e82beb..73d90fd5c 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fi.ts @@ -167,185 +167,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Vasen </translation> - </message> - <message> - <source>Right </source> - <translation>Oikea </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Vasen vaihtonäppäin</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Oikea vaihtonäppäin</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Vasen Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Oikea Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Vasen Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Oikeat Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Vasen Win</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Oikea Win</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menu-näppäin</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><avain_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Keskeytä</translation> - </message> - <message> - <source>Print Screen</source> - <translation>PrintScreen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>NumLock</translation> - </message> - <message> - <source>Forward</source> - <translation>Seuraava</translation> - </message> - <message> - <source>Back</source> - <translation>Edellinen</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -548,7 +369,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI-samm&utus</translation> + <translation type="obsolete">ACPI-samm&utus</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1522,6 +1343,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1589,14 +1414,6 @@ p, li { white-space: pre-wrap; } <translation type="unfinished">Näyttää virtuaalikoneen ikkunassa käytettävän isäntänäppäimen. Kohdista syötekohtaan ja syötä uusi isäntänäppäin. Huomaa, ettei numeroita, kirjaimia, kursori- tai muokkausnäppäimiä voi käyttää isäntänäppäimenä.</translation> </message> <message> - <source>Reset Host Key</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished"></translation> - </message> - <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished">Jos asetettu, näppäimistö kaapataan automaattisesti aina kun virtuaalikoneen ikkuna on valittu. Kun näppäimistö on kaapattu, kaikki näppäilyt ohjataan virtuaalikoneeseen, mukaanlukien järjestelmänäppäilyt kuten Alt-Tab.</translation> </message> @@ -1604,6 +1421,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation type="unfinished">Kaappaa näppäimistö &automaattisesti</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1805,7 +1630,7 @@ p, li { white-space: pre-wrap; } <translation>Nimi</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -1963,6 +1788,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Vasen </translation> + </message> + <message> + <source>Right </source> + <translation>Oikea </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Vasen vaihtonäppäin</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Oikea vaihtonäppäin</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Vasen Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Oikea Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Vasen Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Oikeat Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Vasen Win</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Oikea Win</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menu-näppäin</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><avain_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Keskeytä</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">PrintScreen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">NumLock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Seuraava</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Edellinen</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Ei mitään</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2196,7 +2204,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3871,6 +3879,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7515,7 +7527,7 @@ Version %1</source> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' on virheellinen isäntäavaimen koodi.</translation> + <translation type="obsolete">'%1 (0x%2)' on virheellinen isäntäavaimen koodi.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7525,6 +7537,10 @@ Version %1</source> <source>Cannot delete the key '%1'.</source> <translation>Avainta "%1" ei voi poistaa.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -9264,10 +9280,6 @@ Version %1</source> <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -9352,6 +9364,18 @@ Version %1</source> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -9446,7 +9470,7 @@ Version %1</source> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -9663,7 +9687,7 @@ Version %1</source> </message> <message> <source>R&esume</source> - <translation>J&atka</translation> + <translation type="obsolete">J&atka</translation> </message> <message> <source>Resume</source> @@ -9746,6 +9770,7 @@ Version %1</source> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts index d7f872ece..4f4c648f6 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_fr.ts @@ -111,186 +111,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Gauche </translation> - </message> - <message> - <source>Right </source> - <translation>Droite </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Maj gauche</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Maj droite</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ctrl gauche</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Ctrl droite</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt gauche</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt droite</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Windows gauche</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Windows droite</translation> - </message> - <message> - <source>Menu key</source> - <translation>Touche menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Verr Maj</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Arrêt défil</translation> - </message> - <message> - <source><key_%1></source> - <translation><Touche_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Impr écran</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Verr Num</translation> - </message> - <message> - <source>Forward</source> - <translatorcomment>Shouldn't it be "Page Up" ?</translatorcomment> - <translation>Suivant</translation> - </message> - <message> - <source>Back</source> - <translation>Précédent</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -471,7 +291,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>Extinction par &ACPI</translation> + <translation type="obsolete">Extinction par &ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1335,6 +1155,10 @@ <source>Extension package files (%1)</source> <translation>Fichiers extensions (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation>Extensions</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1395,11 +1219,11 @@ </message> <message> <source>Reset Host Key</source> - <translation>Réinitialiser la touche hôte</translation> + <translation type="obsolete">Réinitialiser la touche hôte</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Réinitialise la touche utilisée comme touche hôte dans la machine virtuelle.</translation> + <translation type="obsolete">Réinitialise la touche utilisée comme touche hôte dans la machine virtuelle.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1409,6 +1233,14 @@ <source>&Auto Capture Keyboard</source> <translation>Capture &automatique du clavier</translation> </message> + <message> + <source>Reset host combination</source> + <translation>Réinitialiser les touches hôte</translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>Réinitialise la combinaison de touches utilisée comme touches hôte dans la machine virtuelle.</translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1611,7 +1443,11 @@ </message> <message> <source>New Host-Only Interface</source> - <translation>Nouvelle interface privée hôte</translation> + <translation type="obsolete">Nouvelle interface privée hôte</translation> + </message> + <message> + <source>Networking</source> + <translation>Réseau</translation> </message> </context> <context> @@ -1768,6 +1604,190 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Gauche </translation> + </message> + <message> + <source>Right </source> + <translation>Droite </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Maj gauche</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Maj droite</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ctrl gauche</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Ctrl droite</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt gauche</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt droite</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Windows gauche</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Windows droite</translation> + </message> + <message> + <source>Menu key</source> + <translation>Touche menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Verr Maj</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Arrêt défil</translation> + </message> + <message> + <source><key_%1></source> + <translation><Touche_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Impr écran</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Verr Num</translation> + </message> + <message> + <source>Forward</source> + <translatorcomment>Shouldn't it be "Page Up" ?</translatorcomment> + <translation type="obsolete">Suivant</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Précédent</translation> + </message> + <message> + <source>None</source> + <translation>Aucune</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -1949,7 +1969,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3206,6 +3226,10 @@ <comment>USB filter tooltip</comment> <translation><nobr>État : %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. 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.</source> + <translation>USB 2.0 est active 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> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -5419,7 +5443,7 @@ And the size is not necessarily "in megabytes", the slider chooses the <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' est une clé invalide.</translation> + <translation type="obsolete">'%1 (0x%2)' est une clé invalide.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -5429,6 +5453,10 @@ And the size is not necessarily "in megabytes", the slider chooses the <source>Cannot delete the key '%1'.</source> <translation>Suppression de la clé '%1' impossible.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>'%1' est une combinaison de touches hôte invalide.</translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -6694,7 +6722,7 @@ And the size is not necessarily "in megabytes", the slider chooses the </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Une erreur non-identifiée s'est produite.</translation> + <translation type="obsolete">Une erreur non-identifiée s'est produite.</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> @@ -6781,6 +6809,18 @@ And the size is not necessarily "in megabytes", the slider chooses the <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>L'extension <br><nobr><b>%1</b><nobr><br> a été installée avec succès.</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> + <translation>La suppression de tous les fichiers d'une machine virtuelle n'est pas actuellement possible sur les systèmes Windows 64bits. Ceci sera rectifié dans la version suivante.</translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>Impossible de créer le dossier machine <b>%1</b> dans le dossier parent <nobr><b>%2</b>.</nobr></p><p>Veuillez vérifier que le parent existe réellement et que vous avez l'autorisation d'y créer des dossiers.</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> + <translation><p>USB 2.0 est active pour cette machine virtuelle, mais ceci nécessite que l'extension <b><nobr>%1</nobr></b> soit installée.</p><p>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.</p></translation> + </message> </context> <context> <name>VBoxSFDialog</name> @@ -6808,7 +6848,7 @@ And the size is not necessarily "in megabytes", the slider chooses the <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -6914,7 +6954,7 @@ And the size is not necessarily "in megabytes", the slider chooses the </message> <message> <source>R&esume</source> - <translation>R&eprendre</translation> + <translation type="obsolete">R&eprendre</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -6985,6 +7025,7 @@ And the size is not necessarily "in megabytes", the slider chooses the </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> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts index 1747dd2fe..8d513ee30 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_gl_ES.ts @@ -137,185 +137,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Esquerda </translation> - </message> - <message> - <source>Right </source> - <translation>Dereita </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Maiúsculas da esquerda</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Maiúsculas da dereita</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ctrl da esquerda</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Ctrl da dereita </translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt da esquerda</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt da dereita</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Tecla de windows da esquerda</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Tecla de windows da dereita</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tecla de menú</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Bloqueo maiúsculas</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Bloqueo de desprazamento</translation> - </message> - <message> - <source><key_%1></source> - <translation><tecla_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Deter</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Imprimir pantalla</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Bloqueo núm</translation> - </message> - <message> - <source>Forward</source> - <translation>Seguinte</translation> - </message> - <message> - <source>Back</source> - <translation>Volver</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -515,7 +336,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>Apa&gado ACPI</translation> + <translation type="obsolete">Apa&gado ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1600,6 +1421,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1667,14 +1492,6 @@ p, li { white-space: pre-wrap; } <translation type="unfinished">Mostra a tecla empregada como tecla anfitrión na xanela da máquina virtual. Active o campo de entrada e prema a nova tecla anfitrión. Nota que as teclas alfanuméricas, de movemento do cursor e as teclas de edición non é posÃbel empregalas como unha tecla anfitrión.</translation> </message> <message> - <source>Reset Host Key</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished"></translation> - </message> - <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished">Cando está marcada, capturarase automaticamente o teclado cada vez que a xanela da máquina virtual sexa activada. Cando o teclado está capturado, todas as combinacións de teclas (incluso as do sistema como Alt-Tab) son dirixidas á máquina virtual.</translation> </message> @@ -1682,6 +1499,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation type="unfinished">Capturar o teclado &automaticamente</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1883,7 +1708,7 @@ p, li { white-space: pre-wrap; } <translation>Nome</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -2041,6 +1866,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Esquerda </translation> + </message> + <message> + <source>Right </source> + <translation>Dereita </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Maiúsculas da esquerda</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Maiúsculas da dereita</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ctrl da esquerda</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Ctrl da dereita </translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt da esquerda</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt da dereita</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Tecla de windows da esquerda</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Tecla de windows da dereita</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tecla de menú</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Bloqueo maiúsculas</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Bloqueo de desprazamento</translation> + </message> + <message> + <source><key_%1></source> + <translation><tecla_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Deter</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Imprimir pantalla</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Bloqueo núm</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Seguinte</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Volver</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Ningún</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2274,7 +2282,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3612,6 +3620,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -6563,7 +6575,7 @@ p, li { white-space: pre-wrap; } <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' non é un código de tecla anfitrión válido.</translation> + <translation type="obsolete">'%1 (0x%2)' non é un código de tecla anfitrión válido.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -6573,6 +6585,10 @@ p, li { white-space: pre-wrap; } <source>Cannot delete the key '%1'.</source> <translation>Non é posÃbel borrar a chave '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -7908,10 +7924,6 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -7996,6 +8008,18 @@ p, li { white-space: pre-wrap; } <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8106,7 +8130,7 @@ p, li { white-space: pre-wrap; } <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8215,7 +8239,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>R&esume</source> - <translation>Con&tinuar</translation> + <translation type="obsolete">Con&tinuar</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8290,6 +8314,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts index 3201d5969..9b5378ced 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_hu.ts @@ -179,185 +179,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Bal </translation> - </message> - <message> - <source>Right </source> - <translation>Jobb </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Bal Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Jobb Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Bal Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Jobb Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Bal Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Jobb Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Bal Windows</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Jobb Windows</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menü gomb</translation> - </message> - <message> - <source>Alt Gr</source> - <translation></translation> - </message> - <message> - <source>Caps Lock</source> - <translation></translation> - </message> - <message> - <source>Scroll Lock</source> - <translation></translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation></translation> - </message> - <message> - <source>Print Screen</source> - <translation></translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation></translation> - </message> - <message> - <source>Forward</source> - <translation></translation> - </message> - <message> - <source>Back</source> - <translation>Vissza</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -564,7 +385,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>A&CPI leállÃtás</translation> + <translation type="obsolete">A&CPI leállÃtás</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1748,6 +1569,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>KiterjesztÅ‘ csomag (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">KiterjesztÅ‘k</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1824,11 +1649,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Gazda-billentyű visszaállÃtása</translation> + <translation type="obsolete">Gazda-billentyű visszaállÃtása</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>A VM ablakban Gazda-billentyűként használt gomb visszaállÃtása.</translation> + <translation type="obsolete">A VM ablakban Gazda-billentyűként használt gomb visszaállÃtása.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1838,6 +1663,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>&Automata billentyűzet-elkapás</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -2040,7 +1873,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Új host-only interfész</translation> + <translation type="obsolete">Új host-only interfész</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2197,6 +2034,173 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Bal </translation> + </message> + <message> + <source>Right </source> + <translation>Jobb </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Bal Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Jobb Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Bal Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Jobb Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Bal Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Jobb Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Bal Windows</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Jobb Windows</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menü gomb</translation> + </message> + <message> + <source>Alt Gr</source> + <translation></translation> + </message> + <message> + <source>Caps Lock</source> + <translation></translation> + </message> + <message> + <source>Scroll Lock</source> + <translation></translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Vissza</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2430,7 +2434,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -4073,6 +4077,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><nobr>Ãllapot: %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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -8114,7 +8122,7 @@ Verzió %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' érvénytelen billentyűzet kód.</translation> + <translation type="obsolete">'%1 (0x%2)' érvénytelen billentyűzet kód.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8124,6 +8132,10 @@ Verzió %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Nem lehet törölni a '%1' kulcsot.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -9931,7 +9943,7 @@ to the system default language.</qt> </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Sajnálom, véletlen hiba lépett fel.</translation> + <translation type="obsolete">Sajnálom, véletlen hiba lépett fel.</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> @@ -10018,6 +10030,18 @@ to the system default language.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10188,7 +10212,7 @@ to the system default language.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -10421,7 +10445,7 @@ to the system default language.</qt> </message> <message> <source>R&esume</source> - <translation>&Folytat</translation> + <translation type="obsolete">&Folytat</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -10492,6 +10516,7 @@ to the system default language.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>KezelÅ‘</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts index fff8f313b..5d964f3ff 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_id.ts @@ -174,185 +174,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Kiri </translation> - </message> - <message> - <source>Right </source> - <translation>Kanan </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Shift Kiri</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Shift Kanan</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ctrl Kiri</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Ctrl Kanan</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt Kiri</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt Kanan</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Tombol Windows Kiri</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Tombol Windows Kanan</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tombol Menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>Enter</translation> - </message> - <message> - <source>Back</source> - <translation>Back</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -552,7 +373,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI S&hutdown</translation> + <translation type="obsolete">ACPI S&hutdown</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1445,6 +1266,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1500,19 +1325,19 @@ <translation type="unfinished">Menunjukkan tombol yang digunakan sebagai tombol Host dalam window Mesin Virtual. Aktifkan firld entry dan tekan Tombol Host baru. Perhatikan bahwa alfanumerik, perpindahan kursor dan tombol untuk mengedit tidak dapat digunakan sebagai Tombol Host.</translation> </message> <message> - <source>Reset Host Key</source> - <translation type="unfinished"></translation> + <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> + <translation type="unfinished">Saat tertandai, keyboard secara otomatis tertangkap setiap kali window Mesin VIrtual diaktifkan. Saat keyboard ditangkap, semua tekanan tombol (termasuk untuk sistem seperti Alt+Tab) ditujukan ke Mesin Virtual.</translation> </message> <message> - <source>Resets the key used as a Host Key in the VM window.</source> + <source>&Auto Capture Keyboard</source> <translation type="unfinished"></translation> </message> <message> - <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> - <translation type="unfinished">Saat tertandai, keyboard secara otomatis tertangkap setiap kali window Mesin VIrtual diaktifkan. Saat keyboard ditangkap, semua tekanan tombol (termasuk untuk sistem seperti Alt+Tab) ditujukan ke Mesin Virtual.</translation> + <source>Reset host combination</source> + <translation type="unfinished"></translation> </message> <message> - <source>&Auto Capture Keyboard</source> + <source>Resets the key combination used as the host combination in the VM window.</source> <translation type="unfinished"></translation> </message> </context> @@ -1706,7 +1531,7 @@ <translation type="unfinished">Nama</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -1864,6 +1689,189 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Kiri </translation> + </message> + <message> + <source>Right </source> + <translation>Kanan </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Shift Kiri</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Shift Kanan</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ctrl Kiri</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Ctrl Kanan</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt Kiri</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt Kanan</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Tombol Windows Kiri</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Tombol Windows Kanan</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tombol Menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Enter</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Back</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Tidak Ada</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -2045,7 +2053,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>OSE VirtualBox</translation> + <translation type="obsolete">OSE VirtualBox</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3435,6 +3443,10 @@ <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -6953,7 +6965,7 @@ Versi %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' adalah host key code yang tidak sesuai.</translation> + <translation type="obsolete">'%1 (0x%2)' adalah host key code yang tidak sesuai.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -6963,6 +6975,10 @@ Versi %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Tidak dapat menghapus key '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -8983,10 +8999,6 @@ ke nilai awal bahasa sistem.</qt> <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -9071,6 +9083,18 @@ ke nilai awal bahasa sistem.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -9177,7 +9201,7 @@ ke nilai awal bahasa sistem.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>OSE VirtualBox</translation> + <translation type="obsolete">OSE VirtualBox</translation> </message> <message> <source>innotek VirtualBox</source> @@ -9410,7 +9434,7 @@ ke nilai awal bahasa sistem.</qt> </message> <message> <source>R&esume</source> - <translation>&Lanjutkan</translation> + <translation type="obsolete">&Lanjutkan</translation> </message> <message> <source>Resume</source> @@ -9493,6 +9517,7 @@ ke nilai awal bahasa sistem.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts index 7acc261a8..7651ec56c 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_it.ts @@ -178,185 +178,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Sinistra </translation> - </message> - <message> - <source>Right </source> - <translation>Destra </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Shift sinistro</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Shift destro</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ctrl sinistro</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Ctrl destro</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt sinistro</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt destro</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Win sinistro</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Win destro</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tasto Menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Bloc Maiusc</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Bloc Scorr</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pausa</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Stampa schermata</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Bloc Num</translation> - </message> - <message> - <source>Forward</source> - <translation>Avanti</translation> - </message> - <message> - <source>Back</source> - <translation>Indietro</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -563,7 +384,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>S&hutdown ACPI</translation> + <translation type="obsolete">S&hutdown ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1741,6 +1562,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>File di pacchetti di estensione (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation>Estensioni</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1813,11 +1638,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Reimposta il tasto host</translation> + <translation type="obsolete">Reimposta il tasto host</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Reimposta il tasto utilizzato come tasto host nella finestra della MV.</translation> + <translation type="obsolete">Reimposta il tasto utilizzato come tasto host nella finestra della MV.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1827,6 +1652,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>&Acquisizione automatica della tastiera</translation> </message> + <message> + <source>Reset host combination</source> + <translation>Ripristina la combinazione host</translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>Ripristina la comuinazione di tasti utilizzata per la combinazione host nella finestra della MV.</translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -2029,7 +1862,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Nuova interfaccia solo host</translation> + <translation type="obsolete">Nuova interfaccia solo host</translation> + </message> + <message> + <source>Networking</source> + <translation>Rete</translation> </message> </context> <context> @@ -2186,6 +2023,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Sinistra </translation> + </message> + <message> + <source>Right </source> + <translation>Destra </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Shift sinistro</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Shift destro</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ctrl sinistro</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Ctrl destro</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt sinistro</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt destro</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Win sinistro</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Win destro</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tasto Menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Bloc Maiusc</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Bloc Scorr</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pausa</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Stampa schermata</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Bloc Num</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Avanti</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Indietro</translation> + </message> + <message> + <source>None</source> + <translation>Nessuno</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2418,10 +2438,6 @@ p, li { white-space: pre-wrap; } <context> <name>UIMachineLogic</name> <message> - <source>VirtualBox OSE</source> - <translation></translation> - </message> - <message> <source> EXPERIMENTAL build %1r%2 - %3</source> <translation>Build SPERIMENTALE %1r%2 - %3</translation> </message> @@ -4179,6 +4195,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><nobr>Stato: %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. 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.</source> + <translation>USB 2.0 è attualmente abilitato per questa macchina virtuale. In ogni caso, ciò richiede che <b>%1</b> sia installato. Installa l'Extension Pack dal sito di VirtualBox. Una volta installato, sarà possibile ri-abilitare USB 2.0. Nel frattempo sarà disabilitato a meno che annulli le modifiche correnti alle impostazioni.</translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -8283,7 +8303,7 @@ Versione %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' non è un codice host key valido.</translation> + <translation type="obsolete">'%1 (0x%2)' non è un codice host key valido.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8293,6 +8313,10 @@ Versione %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Non è possibile eliminare la chiave '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>'%1' è una sequenza non valida di combinazione host.</translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -10457,7 +10481,7 @@ la lingua a quella predefinita di sistema.</qt> </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Spiacenti, si sono verificati alcuni errori generici.</translation> + <translation type="obsolete">Spiacenti, si sono verificati alcuni errori generici.</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> @@ -10544,6 +10568,18 @@ la lingua a quella predefinita di sistema.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>Il pacchetto di estensione <br><nobr><b>%1</b><nobr><br> è stato installato correttamente.</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> + <translation>L'eliminazione di tutti i file che appartengono alla MV è attualmente disabilitata su Windows/x64 per evitare una chiusura inattesa. Il problema sarà corretto nella prossima versione.</translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>Impossibile creare la cartella della macchina <b>%1</b> nella cartella superiore <nobr><b>%2</b>.</nobr></p><p>Controlla che tale cartella esista davvero e di avere i permessi per creare la cartella della macchina.</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> + <translation><p>USB 2.0 è attualmente abilitato per questa macchina virtuale. In ogni caso, ciò richiede che <b><nobr>%1</nobr></b> sia installato. Installa l'Extension Pack dal sito di VirtualBox. Una volta installato, sarà possibile ri-abilitare USB 2.0. Nel frattempo sarà disabilitato a meno che annulli le modifiche correnti alle impostazioni.</p></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10714,7 +10750,7 @@ la lingua a quella predefinita di sistema.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -10947,7 +10983,7 @@ la lingua a quella predefinita di sistema.</qt> </message> <message> <source>R&esume</source> - <translation>Ripr&endi</translation> + <translation type="obsolete">Ripr&endi</translation> </message> <message> <source>Resume</source> @@ -11032,6 +11068,7 @@ la lingua a quella predefinita di sistema.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Gestore</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts index 623ca2546..e5f068723 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ja.ts @@ -4,31 +4,31 @@ <context> <name>@@@</name> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2730"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2784"/> <source>English</source> <comment>Native language name</comment> <translation>日本語</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2741"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2795"/> <source>--</source> <comment>Native language country name (empty if this language is for all countries)</comment> <translation></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2754"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2808"/> <source>English</source> <comment>Language name, in English</comment> <translation>Japanese</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2765"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2819"/> <source>--</source> <comment>Language country name, in English (empty if native country name is empty)</comment> <translation></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Oracle Corporation</source> <comment>Comma-separated list of translators</comment> <translation>Toshimitsu Tanaka</translation> @@ -37,17 +37,17 @@ <context> <name>AttachmentsModel</name> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Double-click to add a new attachment</source> <translation type="obsolete">ãƒ€ãƒ–ãƒ«ã‚¯ãƒªãƒƒã‚¯ã§æ–°è¦ã®å‰²ã‚Šå½“ã¦ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Hard Disk</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Slot</source> <translation type="obsolete">スãƒãƒƒãƒˆ</translation> </message> @@ -55,22 +55,22 @@ <context> <name>BootItemsList</name> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Move Up (Ctrl-Up)</source> <translation type="obsolete">上ã«ç§»å‹•(Ctrl-Up)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Move Down (Ctrl-Down)</source> <translation type="obsolete">下ã«ç§»å‹•(Ctrl-Down)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Moves the selected boot device up.</source> <translation type="obsolete">é¸æŠžã—ãŸèµ·å‹•デãƒã‚¤ã‚¹ã‚’上ã«ç§»å‹•ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Moves the selected boot device down.</source> <translation type="obsolete">é¸æŠžã—ãŸèµ·å‹•デãƒã‚¤ã‚¹ã‚’下ã«ç§»å‹•ã—ã¾ã™ã€‚</translation> </message> @@ -78,7 +78,7 @@ <context> <name>BootItemsTable</name> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Defines the boot device order. Use the checkboxes on the left to enable or disable individual boot devices. Move items up and down to change the device order.</source> <translation type="obsolete">起動デãƒã‚¤ã‚¹ã®å„ªå…ˆé †åºã‚’指定ã—ã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’使ã„å„デãƒã‚¤ã‚¹ã‚’有効ã¾ãŸã¯ç„¡åйã«ã§ãã¾ã™ã€‚é …ç›®ã‚’ä¸Šã¾ãŸã¯ä¸‹ã«ç§»å‹•ã—ã¦ãƒ‡ãƒã‚¤ã‚¹ã®é †åºã‚’変更ã—ã¦ãã ã•ã„。</translation> </message> @@ -86,17 +86,17 @@ <context> <name>HDItemsModel</name> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Double-click to add a new attachment</source> <translation type="obsolete">ãƒ€ãƒ–ãƒ«ã‚¯ãƒªãƒƒã‚¯ã§æ–°è¦ã®å‰²ã‚Šå½“ã¦ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Hard Disk</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2778"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2832"/> <source>Slot</source> <translation type="obsolete">スãƒãƒƒãƒˆ</translation> </message> @@ -104,22 +104,22 @@ <context> <name>QApplication</name> <message> - <location filename="../src/main.cpp" line="447"/> + <location filename="../src/main.cpp" line="450"/> <source>Executable <b>%1</b> requires Qt %2.x, found Qt %3.</source> <translation>実行ファイル <b>%1</b> ã¯Qt %2.x ãŒå¿…è¦ã§ã™ã€‚Qt %3 ãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/main.cpp" line="452"/> + <location filename="../src/main.cpp" line="455"/> <source>Incompatible Qt Library Error</source> <translation>äº’æ›æ€§ã®ãªã„Qtライブラリエラー</translation> </message> <message> - <location filename="../src/main.cpp" line="675"/> + <location filename="../src/main.cpp" line="678"/> <source>VirtualBox - Error In %1</source> <translation>VirtualBox - %1 ã®ã‚¨ãƒ©ãƒ¼</translation> </message> <message> - <location filename="../src/main.cpp" line="680"/> + <location filename="../src/main.cpp" line="683"/> <source><html><b>%1 (rc=%2)</b><br/><br/></source> <translation><html><b>%1 (rc=%2)</b><br/><br/></translation> </message> @@ -144,22 +144,22 @@ <translation>カーãƒãƒ« ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãŒæ£ã—ããƒãƒ¼ãƒ‰ã•れãŸã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/main.cpp" line="602"/> + <location filename="../src/main.cpp" line="605"/> <source>VirtualBox - Runtime Error</source> <translation>VirtualBox - ランタイムエラー</translation> </message> <message> - <location filename="../src/main.cpp" line="608"/> + <location filename="../src/main.cpp" line="611"/> <source><b>Cannot access the kernel driver!</b><br/><br/></source> <translation><b>カーãƒãƒ«ãƒ‰ãƒ©ã‚¤ãƒã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ï¼</b><br/><br/></translation> </message> <message> - <location filename="../src/main.cpp" line="632"/> + <location filename="../src/main.cpp" line="635"/> <source>Unknown error %2 during initialization of the Runtime</source> <translation>ランタイムã®åˆæœŸåŒ–ä¸ã«äºˆæœŸã—ãªã„エラー(%2)</translation> </message> <message> - <location filename="../src/main.cpp" line="622"/> + <location filename="../src/main.cpp" line="625"/> <source>Kernel driver not accessible</source> <translation>カーãƒãƒ«ãƒ‰ãƒ©ã‚¤ãƒã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„</translation> </message> @@ -214,229 +214,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="424"/> - <source>Left </source> - <translation>å·¦</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="430"/> - <source>Right </source> - <translation>å³</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="331"/> - <source>Left Shift</source> - <translation>å·¦ Shift</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="332"/> - <source>Right Shift</source> - <translation>å³ Shift</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="333"/> - <source>Left Ctrl</source> - <translation>å·¦ Ctrl</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="334"/> - <source>Right Ctrl</source> - <translation>å³ Ctrl</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="335"/> - <source>Left Alt</source> - <translation>å·¦ Alt</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="336"/> - <source>Right Alt</source> - <translation>å³ Alt</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="337"/> - <source>Left WinKey</source> - <translation>å·¦ Windowsã‚ー</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="338"/> - <source>Right WinKey</source> - <translation>å³ Windowsã‚ー</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="339"/> - <source>Menu key</source> - <translation>メニューã‚ー</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="340"/> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="341"/> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="342"/> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="576"/> - <source><key_%1></source> - <translation><ã‚ー %1></translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="289"/> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="290"/> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="292"/> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="293"/> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="294"/> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="295"/> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="296"/> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="297"/> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="298"/> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="299"/> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="300"/> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="301"/> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="302"/> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="303"/> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="304"/> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="305"/> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="306"/> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="307"/> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="308"/> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="309"/> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="310"/> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="311"/> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="312"/> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="313"/> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="314"/> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="315"/> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="317"/> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="318"/> - <source>Forward</source> - <translation>Forward</translation> - </message> - <message> - <location filename="../src/extensions/QIHotKeyEdit.cpp" line="319"/> - <source>Back</source> - <translation>Back</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <location filename="../src/extensions/QIHttp.h" line="87"/> @@ -547,382 +324,382 @@ <context> <name>UIActionsPool</name> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="220"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="221"/> <source>&Machine</source> <translation>仮想マシン(&M)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="220"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="221"/> <source>&Fullscreen Mode</source> <translation type="obsolete">フルスクリーンモード(&F)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="220"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="221"/> <source>Switch to fullscreen mode</source> <translation type="obsolete">フルスクリーンモードã«åˆ‡ã‚Šæ›¿ãˆã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="220"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="221"/> <source>Seam&less Mode</source> <translation type="obsolete">シームレスモード(&L)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="220"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="221"/> <source>Switch to seamless desktop integration mode</source> <translation type="obsolete">シームレスモードã«åˆ‡ã‚Šæ›¿ãˆã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="311"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> <source>Auto-resize &Guest Display</source> <translation>ゲストOSã®ç”»é¢ã‚’自動リサイズ(&G)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="311"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> <source>Enter &Fullscreen Mode</source> <translation type="obsolete">フルスクリーンモードã«ã™ã‚‹(&F)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="311"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> <source>Exit &Fullscreen Mode</source> <translation type="obsolete">フルスクリーンモードを終了(&F)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="311"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> <source>Switch to normal mode</source> <translation type="obsolete">標準モードã«åˆ‡ã‚Šæ›ãˆã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="311"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> <source>Enter Seam&less Mode</source> <translation type="obsolete">シームレスモードã«ã™ã‚‹(&L)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="311"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> <source>Exit Seam&less Mode</source> <translation type="obsolete">シームレスモードを終了(&L)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="311"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> <source>Enable &Guest Display Auto-resize</source> <translation type="obsolete">ゲストOSç”»é¢ã®è‡ªå‹•リサイズを有効化(&G)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="313"/> <source>Automatically resize the guest display when the window is resized (requires Guest Additions)</source> <translation>ウィンドウをリサイズã—ãŸã¨ãã€ã‚²ã‚¹ãƒˆOSç”»é¢ã‚’自動的ã«ãƒªã‚µã‚¤ã‚ºã™ã‚‹(Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå¿…è¦)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="313"/> <source>Disable &Guest Display Auto-resize</source> <translation type="obsolete">ゲストOSç”»é¢ã®è‡ªå‹•リサイズを無効化(&G)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="312"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="313"/> <source>Disable automatic resize of the guest display when the window is resized</source> <translation type="obsolete">ゲストOSç”»é¢ã®è‡ªå‹•リサイズを無効ã«ã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="333"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="334"/> <source>&Adjust Window Size</source> <translation>ウィンドウã®ã‚µã‚¤ã‚ºã‚’調整(&A)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="334"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="335"/> <source>Adjust window size and position to best fit the guest display</source> <translation>ゲストOSç”»é¢ã«åˆã‚ã›ã¦ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã®ã‚µã‚¤ã‚ºã¨ä½ç½®ã‚’調整ã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="375"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="376"/> <source>Disable &Mouse Integration</source> <translation>マウス統åˆã‚’無効化(&M)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="376"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="377"/> <source>Temporarily disable host mouse pointer integration</source> <translation>一時的ã«ãƒ›ã‚¹ãƒˆ マウスãƒã‚¤ãƒ³ã‚¿ã®çµ±åˆæ©Ÿèƒ½ã‚’無効化</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="376"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="377"/> <source>Enable &Mouse Integration</source> <translation type="obsolete">マウス統åˆã‚’有効化(&M)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="376"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="377"/> <source>Enable temporarily disabled host mouse pointer integration</source> <translation type="obsolete">一時的ã«ç„¡åŠ¹åŒ–ã—ãŸãƒ›ã‚¹ãƒˆ マウスãƒã‚¤ãƒ³ã‚¿ã®çµ±åˆæ©Ÿèƒ½ã‚’有効化</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="397"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="398"/> <source>&Insert Ctrl-Alt-Del</source> <translation>Ctrl-Alt-Delã‚’é€ä¿¡(&I)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="398"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="399"/> <source>Send the Ctrl-Alt-Del sequence to the virtual machine</source> <translation>仮想マシンã«Ctrl-Alt-Delシーケンスをé€ä¿¡ã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="420"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="421"/> <source>&Insert Ctrl-Alt-Backspace</source> <translation>Ctrl-Alt-Backspaceã‚’é€ä¿¡(&I)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="421"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="422"/> <source>Send the Ctrl-Alt-Backspace sequence to the virtual machine</source> <translation>仮想マシンã«Ctrl-Alt-Backspaceシーケンスをé€ä¿¡ã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="443"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="444"/> <source>Take &Snapshot...</source> <translation>スナップショット作æˆ(&S)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="444"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="445"/> <source>Take a snapshot of the virtual machine</source> <translation>仮想マシンã®ã‚¹ãƒŠãƒƒãƒ—ショットを作æˆã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="444"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="445"/> <source>Session I&nformation Dialog</source> <translation type="obsolete">ã‚»ãƒƒã‚·ãƒ§ãƒ³æƒ…å ±ãƒ€ã‚¤ã‚¢ãƒã‚°(&N)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="466"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="467"/> <source>Show Session Information Dialog</source> <translation>ã‚»ãƒƒã‚·ãƒ§ãƒ³æƒ…å ±ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="487"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="488"/> <source>&Pause</source> <translation>ä¸€æ™‚åœæ¢(&P)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="488"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="489"/> <source>Suspend the execution of the virtual machine</source> <translation>仮想マシンã®å®Ÿè¡Œã‚’ä¸€æ™‚åœæ¢ã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="488"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="489"/> <source>R&esume</source> <translation type="obsolete">å†é–‹(&E)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="488"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="489"/> <source>Resume the execution of the virtual machine</source> <translation type="obsolete">仮想マシンã®å®Ÿè¡Œã‚’å†é–‹ã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="242"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="243"/> <source>Switch to &Fullscreen</source> <translation>フルスクリーンモードã«åˆ‡ã‚Šæ›¿ãˆã‚‹(&F)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="243"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="244"/> <source>Switch between normal and fullscreen mode</source> <translation>標準ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ¢ãƒ¼ãƒ‰ã¨ãƒ•ルスクリーンモードを切りæ›ãˆã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="265"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="266"/> <source>Switch to Seam&less Mode</source> <translation>シームレスモードã«åˆ‡ã‚Šæ›ãˆã‚‹(&L)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="266"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="267"/> <source>Switch between normal and seamless desktop integration mode</source> <translation>標準ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ¢ãƒ¼ãƒ‰ã¨ã‚·ãƒ¼ãƒ レスモードを切りæ›ãˆã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="288"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="289"/> <source>Switch to &Scale Mode</source> <translation>スケールモードã«åˆ‡ã‚Šæ›ãˆã‚‹(&S)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="289"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="290"/> <source>Switch between normal and scale mode</source> <translation>標準ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ¢ãƒ¼ãƒ‰ã¨ã‚¹ã‚±ãƒ¼ãƒ«ãƒ¢ãƒ¼ãƒ‰ã‚’切りæ›ãˆã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="465"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="466"/> <source>Session I&nformation</source> <translation>ã‚»ãƒƒã‚·ãƒ§ãƒ³æƒ…å ±(&N)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="509"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="510"/> <source>&Reset</source> <translation>リセット(&R)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="510"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="511"/> <source>Reset the virtual machine</source> <translation>仮想マシンをリセットã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="533"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="532"/> <source>ACPI Sh&utdown</source> <translation>ACPI シャットダウン(&U)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="535"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="532"/> <source>ACPI S&hutdown</source> - <translation>ACPI シャットダウン(&H)</translation> + <translation type="obsolete">ACPI シャットダウン(&H)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="538"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="533"/> <source>Send the ACPI Power Button press event to the virtual machine</source> <translation>仮想マシンã«é›»æºãƒœã‚¿ãƒ³ オフã®ACPIイベントをé€ä¿¡ã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="560"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="555"/> <source>&Close...</source> <translation>é–‰ã˜ã‚‹(&C)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="561"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="556"/> <source>Close the virtual machine</source> <translation>仮想マシンを閉ã˜ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="581"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="576"/> <source>&View</source> <translation>ビュー(&V)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="601"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="596"/> <source>&Devices</source> <translation>デãƒã‚¤ã‚¹(&D)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="622"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="617"/> <source>&CD/DVD Devices</source> <translation>CD/DVD デãƒã‚¤ã‚¹(&C)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="643"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="638"/> <source>&Floppy Devices</source> <translation>フãƒãƒƒãƒ”ー デãƒã‚¤ã‚¹(&F)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="665"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="660"/> <source>&USB Devices</source> <translation>USB デãƒã‚¤ã‚¹(&U)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="705"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="700"/> <source>&Network Adapters...</source> <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ アダプタ(&N)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="706"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="701"/> <source>Change the settings of network adapters</source> <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ アダプタã®è¨å®šå¤‰æ›´</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="746"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="741"/> <source>&Shared Folders...</source> <translation>共有フォルダ(&S)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="747"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="742"/> <source>Create or modify shared folders</source> <translation>共有フォルダè¨å®šãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‹ã</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="769"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="764"/> <source>Enable R&emote Display</source> <translation>リモートディスプレイを有効化(&E)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="769"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="764"/> <source>&Enable Remote Display</source> <translation type="obsolete">リモートディスプレイを有効化(&E)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="770"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="765"/> <source>Enable remote desktop (RDP) connections to this machine</source> <translation>ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã¸ã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—(RDP)接続を有効化</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="770"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="765"/> <source>&Disable Remote Display</source> <translation type="obsolete">リモートディスプレイを無効化(&D)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="770"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="765"/> <source>Disable remote desktop (RDP) connections to this machine</source> <translation type="obsolete">ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã¸ã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—(RDP)接続を無効化</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="873"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="868"/> <source>Enable &Logging...</source> <comment>debug action</comment> <translation>ãƒã‚°å‡ºåŠ›ã‚’æœ‰åŠ¹åŒ–(&L)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="873"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="868"/> <source>Disable &Logging...</source> <comment>debug action</comment> <translation type="obsolete">ãƒã‚°å‡ºåŠ›ã‚’ç„¡åŠ¹åŒ–(&L)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="873"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="868"/> <source>&Remote Display</source> <translation type="obsolete">リモートディスプレイ(&R)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="873"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="868"/> <source>Enable or disable remote desktop (RDP) connections to this machine</source> <translation type="obsolete">ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã¸ã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ‡ã‚¹ã‚¯ãƒˆãƒƒãƒ—(RDP)接続を有効化ã¾ãŸã¯ç„¡åŠ¹åŒ–</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="791"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="786"/> <source>&Install Guest Additions...</source> <translation>Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«(&I)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="792"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="787"/> <source>Mount the Guest Additions installation image</source> <translation>Guest Additions インストールイメージをマウントã™ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="813"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="808"/> <source>De&bug</source> <translation>デãƒãƒƒã‚°(&B)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="833"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="828"/> <source>&Statistics...</source> <comment>debug action</comment> <translation>統計(&S)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="853"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="848"/> <source>&Command Line...</source> <comment>debug action</comment> <translation>コマンドライン(&C)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="853"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="848"/> <source>&Logging...</source> <comment>debug action</comment> <translation type="obsolete">ãƒã‚°å–å¾—(&L)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="894"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="889"/> <source>&Help</source> <translation>ヘルプ(&H)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="1071"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="1066"/> <source>Dock Icon</source> <translation>ドック アイコン</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="1091"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="1086"/> <source>Show Monitor Preview</source> <translation>ディスプレイã®ãƒ—レビューを表示</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="1111"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="1106"/> <source>Show Application Icon</source> <translation>アプリケーション アイコンを表示</translation> </message> @@ -930,17 +707,17 @@ <context> <name>UIDescriptionPagePrivate</name> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1299"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1292"/> <source>No description. Press the Edit button below to add it.</source> <translation>説明ãŒã‚りã¾ã›ã‚“。[編集]ボタンをクリックã—ã¦è¿½åŠ ã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1301"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1294"/> <source>Edit</source> <translation>編集</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1303"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1296"/> <source>Edit (Ctrl+E)</source> <translation>編集(Ctrl+E)</translation> </message> @@ -948,329 +725,329 @@ <context> <name>UIDetailsPagePrivate</name> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="479"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="473"/> <source>Name</source> <comment>details report</comment> <translation>åå‰</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="481"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="475"/> <source>OS Type</source> <comment>details report</comment> <translation>OSタイプ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="500"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="494"/> <source>Base Memory</source> <comment>details report</comment> <translation>メインメモリ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="583"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="577"/> <source><nobr>%1 MB</nobr></source> <comment>details report</comment> <translation><nobr>%1 MB</nobr></translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="506"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="500"/> <source>Processors</source> <comment>details report</comment> <translation>プãƒã‚»ãƒƒã‚µ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="507"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="501"/> <source><nobr>%1</nobr></source> <comment>details report</comment> <translation><nobr>%1</nobr></translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="522"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="516"/> <source>Boot Order</source> <comment>details report</comment> <translation>èµ·å‹•é †åº</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="530"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="524"/> <source>ACPI</source> <comment>details report</comment> <translation>ACPI</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="534"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="528"/> <source>IO APIC</source> <comment>details report</comment> <translation>IO APIC</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="537"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="531"/> <source>BIOS</source> <comment>details report</comment> <translation>BIOS</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="546"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="540"/> <source>VT-x/AMD-V</source> <comment>details report</comment> <translation>VT-x/AMD-V</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="550"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="544"/> <source>Nested Paging</source> <comment>details report</comment> <translation>ãƒã‚¹ãƒ†ãƒƒãƒ‰ãƒšãƒ¼ã‚¸ãƒ³ã‚°</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="555"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="549"/> <source>PAE/NX</source> <comment>details report</comment> <translation>PAE/NX</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="603"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="597"/> <source>Acceleration</source> <comment>details report</comment> <translation>アクセラレーション</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="582"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="576"/> <source>Video Memory</source> <comment>details report</comment> <translation>ビデオメモリ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="590"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="584"/> <source>Screens</source> <comment>details report</comment> <translation>スクリーン</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="597"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="591"/> <source>2D Video</source> <comment>details report</comment> <translation>2D ビデオ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="600"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="594"/> <source>3D</source> <comment>details report</comment> <translation>3D</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="611"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="605"/> <source>Remote Desktop Server Port</source> <comment>details report (VRDE Server)</comment> <translation>リモートデスクトップ サーãƒãƒ¼ ãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="615"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="609"/> <source>Remote Desktop Server</source> <comment>details report (VRDE Server)</comment> <translation>リモートデスクトップ サーãƒãƒ¼</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="616"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="610"/> <source>Disabled</source> <comment>details report (VRDE Server)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="654"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="648"/> <source>(CD/DVD)</source> <translation>(CD/DVD)</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="685"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="679"/> <source>Not Attached</source> <comment>details report (Storage)</comment> <translation>未割り当ã¦</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="709"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="702"/> <source>Host Driver</source> <comment>details report (audio)</comment> <translation>ホスト ドライãƒ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="712"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="705"/> <source>Controller</source> <comment>details report (audio)</comment> <translation>コントãƒãƒ¼ãƒ©</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="716"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="709"/> <source>Disabled</source> <comment>details report (audio)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="748"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="741"/> <source>Bridged adapter, %1</source> <comment>details report (network)</comment> <translation>ブリッジ アダプタ, '%1'</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="751"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="744"/> <source>Internal network, '%1'</source> <comment>details report (network)</comment> <translation>内部ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯, '%1'</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="754"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="747"/> <source>Host-only adapter, '%1'</source> <comment>details report (network)</comment> <translation>ホストオンリー アダプタ, '%1'</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="758"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="751"/> <source>VDE network, '%1'</source> <comment>details report (network)</comment> <translation>VDE ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯, '%1'</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="765"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="758"/> <source>Adapter %1</source> <comment>details report (network)</comment> <translation>アダプタ %1</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="773"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="766"/> <source>Disabled</source> <comment>details report (network)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="812"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="805"/> <source>Port %1</source> <comment>details report (serial ports)</comment> <translation>ãƒãƒ¼ãƒˆ %1</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="820"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="813"/> <source>Disabled</source> <comment>details report (serial ports)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="853"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="846"/> <source>Port %1</source> <comment>details report (parallel ports)</comment> <translation>ãƒãƒ¼ãƒˆ %1</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="861"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="854"/> <source>Disabled</source> <comment>details report (parallel ports)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="898"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="891"/> <source>Device Filters</source> <comment>details report (USB)</comment> <translation>デãƒã‚¤ã‚¹ フィルタ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="899"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="892"/> <source>%1 (%2 active)</source> <comment>details report (USB)</comment> <translation>%1 (%2 アクティブ)</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="904"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="897"/> <source>Disabled</source> <comment>details report (USB)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="933"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="926"/> <source>Shared Folders</source> <comment>details report (shared folders)</comment> <translation>共有フォルダ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="938"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="931"/> <source>None</source> <comment>details report (shared folders)</comment> <translation>ãªã—</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="962"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="955"/> <source>None</source> <comment>details report (description)</comment> <translation>ãªã—</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1087"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1080"/> <source>The selected virtual machine is <i>inaccessible</i>. Please inspect the error message shown below and press the <b>Refresh</b> button if you want to repeat the accessibility check:</source> <translation>é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã«<i>アクセスã§ãã¾ã›ã‚“</i>。アクセスå¯å¦ã‚’å†ç¢ºèªã™ã‚‹ã«ã¯ä»¥ä¸‹ã«ç¤ºã•れãŸã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’調査ã—ã¦<b>[æœ€æ–°ã®æƒ…å ±ã«æ›´æ–°]</b>ボタンをクリックã—ã¦ãã ã•ã„:</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1102"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1095"/> <source>General</source> <comment>details report</comment> <translation>一般</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1108"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1101"/> <source>System</source> <comment>details report</comment> <translation>システム</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1114"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1107"/> <source>Preview</source> <comment>details report</comment> <translation>プレビュー</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1120"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1113"/> <source>Display</source> <comment>details report</comment> <translation>ディスプレイ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1126"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1119"/> <source>Storage</source> <comment>details report</comment> <translation>ストレージ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1132"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1125"/> <source>Audio</source> <comment>details report</comment> <translation>オーディオ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1138"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1131"/> <source>Network</source> <comment>details report</comment> <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1144"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1137"/> <source>Serial Ports</source> <comment>details report</comment> <translation>シリアルãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1151"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1144"/> <source>Parallel Ports</source> <comment>details report</comment> <translation>パラレルãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1158"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1151"/> <source>USB</source> <comment>details report</comment> <translation>USB</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1164"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1157"/> <source>Shared Folders</source> <comment>details report</comment> <translation>共有フォルダ</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source>Description</source> <comment>details report</comment> <translation>説明</translation> @@ -1279,42 +1056,42 @@ <context> <name>UIDownloader</name> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source>Cancel</source> <translation type="obsolete">ã‚ャンセル</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source>Downloading the VirtualBox Guest Additions CD image from <nobr><b>%1</b>...</nobr></source> <translation type="obsolete">VirtualBox Guest Additions CDイメージを<nobr><b>%1</b>ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰...</nobr></translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source>Cancel the VirtualBox Guest Additions CD image download</source> <translation type="obsolete">VirtualBox Guest Additions CDイメージã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã‚’ã‚ャンセル</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source>Could not locate the file on the server (response: %1).</source> <translation type="obsolete">サーãƒãƒ¼ä¸Šã«ãƒ•ァイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ(応ç”: %1)。</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source><p>Failed to save the downloaded file as <nobr><b>%1</b>.</nobr></p></source> <translation type="obsolete"><p>ダウンãƒãƒ¼ãƒ‰ã—ãŸãƒ•ァイル(<nobr><b>%1</b></nobr>)ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</p></translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source>Select folder to save Guest Additions image to</source> <translation type="obsolete">Guest Additionsイメージをä¿å˜ã™ã‚‹ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠž</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source>Connection timed out.</source> <translation type="obsolete">接続ãŒã‚¿ã‚¤ãƒ アウトã«ãªã‚Šã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1170"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1163"/> <source>The download process has been cancelled by the user.</source> <translation type="obsolete">ダウンãƒãƒ¼ãƒ‰å‡¦ç†ãŒãƒ¦ãƒ¼ã‚¶ãƒ¼ã«ã‚ˆã£ã¦ã‚ャンセルã•れã¾ã—ãŸã€‚</translation> </message> @@ -1751,17 +1528,17 @@ p, li { white-space: pre-wrap; } <translation type="obsolete">ユーザåã€ãƒ‘スワードã€ãƒ›ã‚¹ãƒˆåãŠã‚ˆã³ãƒã‚±ãƒƒãƒˆåãªã©ã®è¿½åŠ ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’ã™ã¹ã¦æŒ‡å®šã—ã¦ãã ã•ã„。最後ã«OVFターゲットã®ãƒ•ァイルåを指定ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/wizards/exportappliance/UIExportApplianceWzd.cpp" line="599"/> + <location filename="../src/wizards/exportappliance/UIExportApplianceWzd.cpp" line="602"/> <source>Checking files ...</source> <translation>ファイルを確èªä¸...</translation> </message> <message> - <location filename="../src/wizards/exportappliance/UIExportApplianceWzd.cpp" line="620"/> + <location filename="../src/wizards/exportappliance/UIExportApplianceWzd.cpp" line="623"/> <source>Removing files ...</source> <translation>ファイルを除去ä¸...</translation> </message> <message> - <location filename="../src/wizards/exportappliance/UIExportApplianceWzd.cpp" line="656"/> + <location filename="../src/wizards/exportappliance/UIExportApplianceWzd.cpp" line="659"/> <source>Exporting Appliance ...</source> <translation>仮想アプライアンスã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ...</translation> </message> @@ -2099,22 +1876,27 @@ p, li { white-space: pre-wrap; } <translation>ãƒãƒ¼ã‚¸ãƒ§ãƒ³</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="254"/> + <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="410"/> + <source>Extensions</source> + <translation>機能拡張</translation> + </message> + <message> + <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="273"/> <source>Add package</source> <translation>ãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="255"/> + <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="274"/> <source>Remove package</source> <translation>パッケージを除去</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="298"/> + <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="317"/> <source>Select an extension package file</source> <translation>æ©Ÿèƒ½æ‹¡å¼µãƒ‘ãƒƒã‚±ãƒ¼ã‚¸ã‚’é¸æŠž</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="302"/> + <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="321"/> <source>Extension package files (%1)</source> <translation>機能拡張パッケージファイル(%1)</translation> </message> @@ -2122,7 +1904,7 @@ p, li { white-space: pre-wrap; } <context> <name>UIGlobalSettingsGeneral</name> <message> - <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="302"/> + <location filename="../src/settings/global/UIGlobalSettingsExtension.cpp" line="321"/> <source>Displays the path to the default VDI folder. This folder is used, if not explicitly specified otherwise, when adding existing or creating new virtual hard disks.</source> <translation type="obsolete">デフォルトã®VDIフォルダã®ãƒ‘スを表示ã—ã¾ã™ã€‚æ–°è¦ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®ä½œæˆæ™‚ã«ä¿å˜å…ˆã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã—ãªã„å ´åˆã€ã“ã®ãƒ•ォルダãŒä½¿ç”¨ã•れã¾ã™ã€‚</translation> </message> @@ -2206,21 +1988,31 @@ p, li { white-space: pre-wrap; } </message> <message> <location filename="../src/settings/global/UIGlobalSettingsInput.ui" line="74"/> - <source>Reset Host Key</source> + <source>Reset host combination</source> <translation>ホストã‚ーã®ãƒªã‚»ãƒƒãƒˆ</translation> </message> <message> <location filename="../src/settings/global/UIGlobalSettingsInput.ui" line="77"/> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ãƒ›ã‚¹ãƒˆã‚ーã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã‚ーコンビãƒãƒ¼ã‚·ãƒ§ãƒ³ã‚’リセットã—ã¾ã™ã€‚</translation> + </message> + <message> + <location filename="../src/settings/global/UIGlobalSettingsInput.ui" line="77"/> + <source>Reset Host Key</source> + <translation type="obsolete">ホストã‚ーã®ãƒªã‚»ãƒƒãƒˆ</translation> + </message> + <message> + <location filename="../src/settings/global/UIGlobalSettingsInput.ui" line="77"/> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ãƒ›ã‚¹ãƒˆã‚ーã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã‚ーをリセットã—ã¾ã™ã€‚</translation> + <translation type="obsolete">仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ãƒ›ã‚¹ãƒˆã‚ーã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã‚ーをリセットã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsInput.ui" line="103"/> + <location filename="../src/settings/global/UIGlobalSettingsInput.ui" line="84"/> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã®ã¨ãã€ã‚ーボードを自動的ã«ã‚ャプãƒãƒ£ã—ã¾ã™ã€‚ã‚ーボードãŒã‚ャプãƒãƒ£ã•れるã¨ã€ã™ã¹ã¦ã®ã‚ーストãƒãƒ¼ã‚¯(Alt-Tabãªã©ã‚’å«ã‚€)ãŒä»®æƒ³ãƒžã‚·ãƒ³ã«é€ã‚‰ã‚Œã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsInput.ui" line="106"/> + <location filename="../src/settings/global/UIGlobalSettingsInput.ui" line="87"/> <source>&Auto Capture Keyboard</source> <translation>ã‚ーボードã®è‡ªå‹•ã‚ャプãƒãƒ£(&A)</translation> </message> @@ -2252,7 +2044,7 @@ p, li { white-space: pre-wrap; } <translation>デフォルト</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsLanguage.cpp" line="359"/> + <location filename="../src/settings/global/UIGlobalSettingsLanguage.cpp" line="356"/> <source>Language:</source> <translation>言語:</translation> </message> @@ -2287,7 +2079,7 @@ p, li { white-space: pre-wrap; } <translation>作者</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsLanguage.cpp" line="361"/> + <location filename="../src/settings/global/UIGlobalSettingsLanguage.cpp" line="358"/> <source>Author(s):</source> <translation>作者:</translation> </message> @@ -2295,7 +2087,7 @@ p, li { white-space: pre-wrap; } <context> <name>UIGlobalSettingsNetwork</name> <message> - <location filename="../src/settings/global/UIGlobalSettingsLanguage.cpp" line="361"/> + <location filename="../src/settings/global/UIGlobalSettingsLanguage.cpp" line="358"/> <source>%1 network</source> <comment><adapter name> network</comment> <translation type="obsolete">%1 ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</translation> @@ -2434,27 +2226,32 @@ p, li { white-space: pre-wrap; } <translation>上é™</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="473"/> + <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="395"/> <source>&Add host-only network</source> <translation>ホストオンリー ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’è¿½åŠ (&A)</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="474"/> + <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="396"/> <source>&Remove host-only network</source> <translation>ホストオンリー ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’除去(&R)</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="475"/> + <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="397"/> <source>&Edit host-only network</source> <translation>ホストオンリー ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’編集(&E)</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="495"/> + <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="473"/> + <source>Networking</source> + <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</translation> + </message> + <message> + <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="473"/> <source>New Host-Only Interface</source> - <translation>æ–°è¦ãƒ›ã‚¹ãƒˆ インターフェース</translation> + <translation type="obsolete">æ–°è¦ãƒ›ã‚¹ãƒˆ インターフェース</translation> </message> <message> - <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="495"/> + <location filename="../src/settings/global/UIGlobalSettingsNetwork.cpp" line="473"/> <source>Performing</source> <comment>creating/removing host-only network</comment> <translation type="obsolete">動作</translation> @@ -2665,14 +2462,242 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="127"/> + <source>Left </source> + <translation>å·¦</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="133"/> + <source>Right </source> + <translation>å³</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="248"/> + <source>Left Shift</source> + <translation>å·¦ Shift</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="249"/> + <source>Right Shift</source> + <translation>å³ Shift</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="250"/> + <source>Left Ctrl</source> + <translation>å·¦ Ctrl</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="251"/> + <source>Right Ctrl</source> + <translation>å³ Ctrl</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="252"/> + <source>Left Alt</source> + <translation>å·¦ Alt</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="253"/> + <source>Right Alt</source> + <translation>å³ Alt</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="254"/> + <source>Left WinKey</source> + <translation>å·¦ Windowsã‚ー</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="255"/> + <source>Right WinKey</source> + <translation>å³ Windowsã‚ー</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="256"/> + <source>Menu key</source> + <translation>メニューã‚ー</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="257"/> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="258"/> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="259"/> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="617"/> + <source>None</source> + <translation>ãªã—</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source><key_%1></source> + <translation><ã‚ー %1></translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>Forward</source> + <translation type="obsolete">Forward</translation> + </message> + <message> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> + <source>Back</source> + <translation type="obsolete">Back</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> - <location filename="../src/widgets/UISpecialControls.cpp" line="178"/> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> <source>Select an appliance to import</source> <translation type="obsolete">インãƒãƒ¼ãƒˆã™ã‚‹ä»®æƒ³ã‚¢ãƒ—ãƒ©ã‚¤ã‚¢ãƒ³ã‚¹ã‚’é¸æŠž</translation> </message> <message> - <location filename="../src/widgets/UISpecialControls.cpp" line="178"/> + <location filename="../src/widgets/UIHotKeyEditor.cpp" line="115"/> <source>Open Virtualization Format (%1)</source> <translation type="obsolete">Open Virtualization Format (%1)</translation> </message> @@ -2938,12 +2963,12 @@ p, li { white-space: pre-wrap; } <context> <name>UIMachineLogic</name> <message> - <location filename="../src/runtime/UIMachineWindow.cpp" line="149"/> + <location filename="../src/runtime/UIIndicatorsPool.cpp" line="663"/> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> - <location filename="../src/runtime/UIMachineWindow.cpp" line="154"/> + <location filename="../src/runtime/UIMachineWindow.cpp" line="150"/> <source> EXPERIMENTAL build %1r%2 - %3</source> <translation>試験的ビルド %1r%2 - %3</translation> </message> @@ -3192,7 +3217,7 @@ p, li { white-space: pre-wrap; } <translation type="obsolete"><qt>%1&nbsp;MB</qt></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsGeneral.cpp" line="182"/> + <location filename="../src/settings/machine/UIMachineSettingsGeneral.cpp" line="184"/> <source>Displays 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> </message> @@ -4105,12 +4130,12 @@ p, li { white-space: pre-wrap; } <context> <name>UIMachineSettingsSFDetails</name> <message> - <location filename="../src/settings/machine/UIMachineSettingsSFDetails.cpp" line="130"/> + <location filename="../src/settings/machine/UIMachineSettingsSFDetails.cpp" line="125"/> <source>Add Share</source> <translation>共有フォルダã®è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsSFDetails.cpp" line="133"/> + <location filename="../src/settings/machine/UIMachineSettingsSFDetails.cpp" line="128"/> <source>Edit Share</source> <translation>è¨å®šã®ç·¨é›†</translation> </message> @@ -4390,192 +4415,192 @@ p, li { white-space: pre-wrap; } <translation>イメージ</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="848"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="849"/> <source><nobr>Expand/Collapse&nbsp;Item</nobr></source> <translation><nobr>é …ç›®ã‚’å±•é–‹ã™ã‚‹/折り畳む&nbsp;</nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="851"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="852"/> <source><nobr>Add&nbsp;Hard&nbsp;Disk</nobr></source> <translation><nobr>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯&nbsp;ã®è¿½åŠ </nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="854"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="855"/> <source><nobr>Add&nbsp;CD/DVD&nbsp;Device</nobr></source> <translation><nobr>CD/DVD&nbsp;デãƒã‚¤ã‚¹&nbsp;ã®è¿½åŠ </nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="857"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="858"/> <source><nobr>Add&nbsp;Floppy&nbsp;Device</nobr></source> <translation><nobr>フãƒãƒƒãƒ”ー&nbsp;デãƒã‚¤ã‚¹&nbsp;ã®è¿½åŠ </nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="1972"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="1973"/> <source>No hard disk is selected for <i>%1</i>.</source> <translation> <i>%1</i>ã®ãŸã‚ã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="1978"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="1979"/> <source><i>%1</i> uses a medium that is already attached to <i>%2</i>.</source> <translation><i>%1</i>ãŒä½¿ç”¨ã™ã‚‹ãƒ¡ãƒ‡ã‚£ã‚¢ã¯ã™ã§ã«<i>%2</i>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="1998"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="1999"/> <source>Add Controller</source> <translation>コントãƒãƒ¼ãƒ©ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="1999"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2000"/> <source>Add IDE Controller</source> <translation>IDE コントãƒãƒ¼ãƒ©ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2000"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2001"/> <source>Add SATA Controller</source> <translation>SATA コントãƒãƒ¼ãƒ©ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2001"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2002"/> <source>Add SCSI Controller</source> <translation>SCSI コントãƒãƒ¼ãƒ©ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2002"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2003"/> <source>Add SAS Controller</source> <translation>SAS コントãƒãƒ¼ãƒ©ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2003"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2004"/> <source>Add Floppy Controller</source> <translation>フãƒãƒƒãƒ”ー コントãƒãƒ¼ãƒ©ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2004"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2005"/> <source>Remove Controller</source> <translation>コントãƒãƒ¼ãƒ©ã‚’除去</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2005"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2006"/> <source>Add Attachment</source> <translation>割り当ã¦ã®è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2006"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2007"/> <source>Add Hard Disk</source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2007"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2008"/> <source>Add CD/DVD Device</source> <translation>CD/DVD デãƒã‚¤ã‚¹ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2008"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2009"/> <source>Add Floppy Device</source> <translation>フãƒãƒƒãƒ”ー デãƒã‚¤ã‚¹ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2009"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2010"/> <source>Remove Attachment</source> <translation>割り当ã¦ã‚’除去</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2011"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2012"/> <source>Adds a new controller to the end of the Storage Tree.</source> <translation>æ–°ã—ã„コントãƒãƒ¼ãƒ©ã‚’ストレージ ãƒ„ãƒªãƒ¼ã®æœ€å¾Œã«è¿½åŠ ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2012"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2013"/> <source>Removes the controller highlighted in the Storage Tree.</source> <translation>ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤ºã•れãŸã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ ツリーã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã‚’除去ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2013"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2014"/> <source>Adds a new attachment to the Storage Tree using currently selected controller as parent.</source> <translation>ç¾åœ¨é¸æŠžã•れã¦ã„るコントãƒãƒ¼ãƒ©ã‚’親ã¨ã—ã¦æ–°ãŸãªå‰²ã‚Šå½“ã¦ã‚’ストレージ ツリーã«è¿½åŠ ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2015"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2016"/> <source>Removes the attachment highlighted in the Storage Tree.</source> <translation>ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤ºã•れãŸã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ ツリーã®å‰²ã‚Šå½“ã¦ã‚’除去ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="893"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="912"/> <source>IDE Controller</source> <translation>IDE コントãƒãƒ¼ãƒ©</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="901"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="920"/> <source>SATA Controller</source> <translation>SATA コントãƒãƒ¼ãƒ©</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="909"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="928"/> <source>SCSI Controller</source> <translation>SCSI コントãƒãƒ¼ãƒ©</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="917"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="936"/> <source>Floppy Controller</source> <translation>フãƒãƒƒãƒ”ー コントãƒãƒ¼ãƒ©</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="925"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="944"/> <source>SAS Controller</source> <translation>SAS コントãƒãƒ¼ãƒ©</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2275"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2276"/> <source>Hard &Disk:</source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯(&D):</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2277"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2278"/> <source>Choose or create a virtual hard disk file. The virtual machine will see the data in the file as the contents of the virtual hard disk.</source> <translation>仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠžã¾ãŸã¯ä½œæˆã—ã¾ã™ã€‚仮想マシンã¯ãƒ•ァイルã®ãƒ‡ãƒ¼ã‚¿ã‚’仮想的ãªãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®å†…容ã¨è¦‹ãªã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2279"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2280"/> <source>Set up the virtual hard disk</source> <translation>仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®è¨å®š</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2282"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2283"/> <source>CD/DVD &Drive:</source> <translation>CD/DVDドライブ(&D):</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2284"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2285"/> <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> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2287"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2288"/> <source>Set up the virtual CD/DVD drive</source> <translation>仮想CD/DVDドライブã®è¨å®š</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2290"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2291"/> <source>Floppy &Drive:</source> <translation>フãƒãƒƒãƒ”ー ドライブ(&D):</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2292"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2293"/> <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>仮想フãƒãƒƒãƒ”ãƒ¼ãƒ‡ã‚£ã‚¹ã‚¯ã‚’é¸æŠžã™ã‚‹ã‹ã€ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–を仮想ドライブã«å‰²ã‚Šå½“ã¦ã¾ã™ã€‚仮想マシンã¯ãƒ•ァイルã®ãƒ‡ãƒ¼ã‚¿ã¾ãŸã¯ç‰©ç†çš„ãªãƒ‰ãƒ©ã‚¤ãƒ–ã®å†…容ãŒä»®æƒ³ãƒ‰ãƒ©ã‚¤ãƒ–ã«æŒ¿å…¥ã•れã¦ã„ã‚‹ã¨è¦‹ãªã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2295"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2296"/> <source>Set up the virtual floppy drive</source> <translation>仮想フãƒãƒƒãƒ”ードライブã®è¨å®š</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2400"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2401"/> <source>Create a new hard disk...</source> <translation>æ–°è¦ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®ä½œæˆ...</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2405"/> + <location filename="../src/settings/machine/UIMachineSettingsStorage.cpp" line="2406"/> <source>Choose a virtual hard disk file...</source> <translation>仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãƒ•ァイルã®é¸æŠž...</translation> </message> @@ -4984,115 +5009,120 @@ p, li { white-space: pre-wrap; } <context> <name>UIMachineSettingsUSB</name> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="393"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="394"/> + <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. 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.</source> + <translation>ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã§USB 2.0を有効化ã™ã‚‹ã«ã¯<b>%1</b>ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå¿…è¦ã§ã™ã€‚VirtualBoxã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã‚µã‚¤ãƒˆã‹ã‚‰æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージをダウンãƒãƒ¼ãƒ‰ã—ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。機能拡張パッケージをインストールã™ã‚‹ã¨ã€USB 2.0を有効化ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ç¾åœ¨ã®è¨å®šã‚’ã‚ャンセルã—ãªã„å ´åˆã€USB 2.0ã¯ç„¡åŠ¹åŒ–ã•れã¾ã™ã€‚</translation> + </message> + <message> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="418"/> <source>&Add Empty Filter</source> <translation>空ã®ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ (&A)</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="394"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="419"/> <source>A&dd Filter From Device</source> <translation>デãƒã‚¤ã‚¹ã‹ã‚‰ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã™ã‚‹(&D)</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="395"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="420"/> <source>&Edit Filter</source> <translation>フィルタを編集ã™ã‚‹(&E)</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="396"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="421"/> <source>&Remove Filter</source> <translation>フィルタを除去ã™ã‚‹(&R)</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="397"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="422"/> <source>&Move Filter Up</source> <translation>フィルタを上ã«ç§»å‹•ã™ã‚‹(&M)</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="398"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="423"/> <source>M&ove Filter Down</source> <translation>フィルタを下ã«ç§»å‹•(&O)</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="413"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="438"/> <source>Adds a new USB filter with all fields initially set to empty strings. Note that such a filter will match any attached USB device.</source> <translation>ã™ã¹ã¦ã®ãƒ•ィールドãŒç©ºã®æ–°è¦USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã—ã¾ã™ã€‚注:ã“ã®ãƒ•ィルタã¯ã™ã¹ã¦ã®æŽ¥ç¶šã•れãŸUSB デãƒã‚¤ã‚¹ã«é©åˆã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="417"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="442"/> <source>Adds a new USB filter with all fields set to the values of the selected USB device attached to the host PC.</source> <translation>ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã«æŽ¥ç¶šã•れãŸã€é¸æŠžã—ãŸUSB デãƒã‚¤ã‚¹ã®å€¤ã‚’ã™ã¹ã¦ã®ãƒ•ィールドã«è¨å®šã—ãŸæ–°è¦USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="420"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="445"/> <source>Edits the selected USB filter.</source> <translation>é¸æŠžã—ãŸUSBフィルタを編集ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="421"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="446"/> <source>Removes the selected USB filter.</source> <translation>é¸æŠžã—ãŸUSBフィルタを除去ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="422"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="447"/> <source>Moves the selected USB filter up.</source> <translation>é¸æŠžã—ãŸUSBフィルタを上ã«ç§»å‹•ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="423"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="448"/> <source>Moves the selected USB filter down.</source> <translation>é¸æŠžã—ãŸUSBフィルタを下ã«ç§»å‹•ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="425"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="450"/> <source>New Filter %1</source> <comment>usb</comment> <translation>æ–°è¦ãƒ•ィルタ %1</translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="771"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="796"/> <source><nobr>Vendor ID: %1</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>ベンダID: %1</nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="775"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="800"/> <source><nobr>Product ID: %2</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>プãƒãƒ€ã‚¯ãƒˆID: %2</nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="779"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="804"/> <source><nobr>Revision: %3</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>リビジョン: %3</nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="783"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="808"/> <source><nobr>Product: %4</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>製å“: %4</nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="787"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="812"/> <source><nobr>Manufacturer: %5</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>メーカー: %5</nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="791"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="816"/> <source><nobr>Serial No.: %1</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>シリアルNo.: %1</nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="795"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="820"/> <source><nobr>Port: %1</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>ãƒãƒ¼ãƒˆ: %1</nobr></translation> </message> <message> - <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="800"/> + <location filename="../src/settings/machine/UIMachineSettingsUSB.cpp" line="825"/> <source><nobr>State: %1</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>状態: %1</nobr></translation> @@ -5262,7 +5292,7 @@ p, li { white-space: pre-wrap; } <context> <name>UIMachineWindowNormal</name> <message> - <location filename="../src/runtime/normal/UIMachineWindowNormal.cpp" line="261"/> + <location filename="../src/runtime/normal/UIMachineWindowNormal.cpp" line="273"/> <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>ç¾åœ¨å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„るホストã‚ーを表示ã—ã¾ã™ã€‚<br>ホストã‚ーをå˜ç‹¬ã§æŠ¼ã™ã¨ã€ã‚ーボートã¨ãƒžã‚¦ã‚¹ã®åˆ¶å¾¡ãŒåˆ‡ã‚Šæ›¿ã‚りã¾ã™ã€‚ã¾ãŸã€ä»–ã®ã‚ーã¨åˆã‚ã›ã¦ã‚ーボード ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã®æ“作ã«ä½¿ç”¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</translation> </message> @@ -6021,17 +6051,17 @@ step and attach hard disks later using the VM Settings dialog.</p></source <translation>MB</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="338"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="349"/> <source>Memory</source> <translation>メモリ</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="343"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="354"/> <source>The recommended base memory size is <b>%1</b> MB.</source> <translation>推奨ã•れるメインメモリã®ã‚µã‚¤ã‚ºã¯<b>%1</b>MBã§ã™ã€‚</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="343"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="354"/> <source>MB</source> <comment>size suffix MBytes=1024 KBytes</comment> <translation type="obsolete">MB</translation> @@ -6040,12 +6070,12 @@ step and attach hard disks later using the VM Settings dialog.</p></source <context> <name>UINewVMWzdPage4</name> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="343"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="354"/> <source><p>Select a hard disk image to be used as the boot hard disk of the virtual machine. You can either create a new hard disk using the <b>New</b> button or select an existing hard disk image from the drop-down list or by pressing the <b>Existing</b> button (to invoke the Virtual Media Manager dialog).</p><p>If you need a more complicated hard disk setup, you can also skip this step and attach hard disks later using the VM Settings dialog.</p></source> <translation type="obsolete"><p>仮想マシンã§èµ·å‹•ディスクã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’é¸æŠžã—ã¾ã™ã€‚<b>[æ–°è¦]</b>ボタンをクリックã—ã¦æ–°è¦ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’作æˆã™ã‚‹ã‹ã€ãƒ‰ãƒãƒƒãƒ—ダウンリストã¾ãŸã¯<b>[é¸æŠž]</b>ボタンをクリック(仮想メディアマãƒãƒ¼ã‚¸ãƒ£ã‚’èµ·å‹•)ã—ã¦æ—¢å˜ã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’é¸æŠžã—ã¾ã™ã€‚</p><p>より高度ãªãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯è¨å®šãŒå¿…è¦ã§ã‚れã°ã€ã“ã®ã‚¹ãƒ†ãƒƒãƒ—をスã‚ップã—ã€å¾Œã§ä»®æƒ³ãƒžã‚·ãƒ³è¨å®šãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’使用ã—ã¦ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’割り当ã¦ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="343"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="354"/> <source>Boot Hard &Disk (Primary Master)</source> <translation type="obsolete">起動ディスク (プライマリ マスター) (&D)</translation> </message> @@ -6075,17 +6105,17 @@ step and attach hard disks later using the VM Settings dialog.</p></source <translation>仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž...</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="432"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="443"/> <source>Virtual Hard Disk</source> <translation>仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="437"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="448"/> <source>The recommended size of the boot hard disk is <b>%1</b>.</source> <translation>推奨ã•れる起動ディスクã®ã‚µã‚¤ã‚ºã¯<b>%1</b>ã§ã™ã€‚</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="437"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="448"/> <source>The recommended size of the boot hard disk is <b>%1</b> MB.</source> <translation type="obsolete">推奨ã•れる起動ディスクã®ã‚µã‚¤ã‚ºã¯<b>%1</b>MBã§ã™ã€‚</translation> </message> @@ -6098,42 +6128,42 @@ step and attach hard disks later using the VM Settings dialog.</p></source <translation><p>æ–°è¦ä»®æƒ³ãƒžã‚·ãƒ³ã¯ä»¥ä¸‹ã®è¨å®šã§ä½œæˆã•れã¾ã™:</p></translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="636"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="647"/> <source>Summary</source> <translation>概è¦</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="652"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="663"/> <source>Name</source> <comment>summary</comment> <translation>åå‰</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="653"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="664"/> <source>OS Type</source> <comment>summary</comment> <translation>OSタイプ</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="654"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="665"/> <source>Base Memory</source> <comment>summary</comment> <translation>メインメモリ</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="654"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="665"/> <source>MB</source> <comment>size suffix MBytes=1024KBytes</comment> <translation type="obsolete">MB</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="664"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="675"/> <source>Boot Hard Disk</source> <comment>summary</comment> <translation>èµ·å‹• ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="671"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="682"/> <source><p>If the above is correct press the <b>%1</b> button. Once you press it, a new virtual machine will be created. </p><p>Note that you can alter these and all other setting of the created virtual machine at any time using the <b>Settings</b> dialog accessible through the menu of the main window.</p></source> <translation><p>上記ã®è¨å®šãŒæ£ã—ã‘れã°ã€<b>[%1]</b>ボタンをクリックã—ã¦ãã ã•ã„。新è¦ä»®æƒ³ãƒžã‚·ãƒ³ãŒä½œæˆã•れã¾ã™ã€‚ </p><p>注:メインウィンドウã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã§ãã‚‹ <b>[è¨å®š]</b>ダイアãƒã‚°ã‚’使用ã—ã¦ã€ä½œæˆã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã®è¨å®šã‚’変更ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p></translation> </message> @@ -6174,103 +6204,103 @@ step and attach hard disks later using the VM Settings dialog.</p></source <context> <name>UIProgressDialog</name> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>&Cancel</source> <translation>ã‚ャンセル(&C)</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>Time remaining: %1</source> <translation type="obsolete">残り時間: %1</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>%1 days, %2 hours remaining</source> <translation type="obsolete">残り時間 %1日㨠%2時間</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>%1 days, %2 minutes remaining</source> <translation type="obsolete">残り時間 %1日㨠%2分</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>%1 days remaining</source> <translation type="obsolete">残り時間 %1æ—¥</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>1 day, %1 hours remaining</source> <translation type="obsolete">残り時間 1日㨠%1時間</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>1 day, %1 minutes remaining</source> <translation type="obsolete">残り時間 1日㨠%1分</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>1 day remaining</source> <translation type="obsolete">残り時間 1æ—¥</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>%1 hours, %2 minutes remaining</source> <translation type="obsolete">残り時間 %1時間㨠%2分</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>1 hour, %1 minutes remaining</source> <translation type="obsolete">残り時間 1時間㨠%1分</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>1 hour remaining</source> <translation type="obsolete">残り時間 1時間</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>%1 minutes remaining</source> <translation type="obsolete">残り時間 %1分</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>1 minute, %2 seconds remaining</source> <translation type="obsolete">残り時間 1分㨠%2ç§’</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>1 minute remaining</source> <translation type="obsolete">残り時間 1分</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="143"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="136"/> <source>%1 seconds remaining</source> <translation type="obsolete">残り時間 %1ç§’</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="259"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="264"/> <source>A few seconds remaining</source> <translation>残り時間 æ•°ç§’</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="140"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="133"/> <source>Canceling...</source> <translation>ã‚ャンセル...</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="144"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="137"/> <source>Cancel the current operation</source> <translation>ç¾åœ¨ã®æ“作をã‚ャンセル</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="229"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="236"/> <source>%1, %2 remaining</source> <comment>You may wish to translate this more like "Time remaining: %1, %2"</comment> <translation>残り時間:%1, %2</translation> </message> <message> - <location filename="../src/widgets/UIProgressDialog.cpp" line="230"/> + <location filename="../src/widgets/UIProgressDialog.cpp" line="237"/> <source>%1 remaining</source> <comment>You may wish to translate this more like "Time remaining: %1"</comment> <translation>残り時間:%1</translation> @@ -6279,7 +6309,7 @@ step and attach hard disks later using the VM Settings dialog.</p></source <context> <name>UISession</name> <message> - <location filename="../src/runtime/UISession.cpp" line="376"/> + <location filename="../src/runtime/UISession.cpp" line="393"/> <source>Install</source> <translation>インストール</translation> </message> @@ -6297,17 +6327,17 @@ step and attach hard disks later using the VM Settings dialog.</p></source <translation><b>%1</b>ページ,%2</translation> </message> <message> - <location filename="../src/settings/UISettingsDialog.cpp" line="241"/> + <location filename="../src/settings/UISettingsDialog.cpp" line="204"/> <source>Invalid settings detected</source> <translation>無効ãªè¨å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ</translation> </message> <message> - <location filename="../src/settings/UISettingsDialog.cpp" line="242"/> + <location filename="../src/settings/UISettingsDialog.cpp" line="205"/> <source>Non-optimal settings detected</source> <translation>最é©åŒ–ã•れã¦ã„ãªã„è¨å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ</translation> </message> <message> - <location filename="../src/settings/UISettingsDialog.cpp" line="270"/> + <location filename="../src/settings/UISettingsDialog.cpp" line="233"/> <source>Settings</source> <translation>è¨å®š</translation> </message> @@ -6373,12 +6403,12 @@ step and attach hard disks later using the VM Settings dialog.</p></source <context> <name>UIVMDesktop</name> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1408"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1405"/> <source>&Details</source> <translation>詳細(&D)</translation> </message> <message> - <location filename="../src/selector/UIVMDesktop.cpp" line="1432"/> + <location filename="../src/selector/UIVMDesktop.cpp" line="1429"/> <source>&Snapshots</source> <translation>スナップショット(&S)</translation> </message> @@ -6446,37 +6476,37 @@ step and attach hard disks later using the VM Settings dialog.</p></source <context> <name>UIVMPreviewWindow</name> <message> - <location filename="../src/selector/UIVMPreviewWindow.cpp" line="118"/> + <location filename="../src/selector/UIVMPreviewWindow.cpp" line="120"/> <source>Update Disabled</source> <translation>更新を無効化</translation> </message> <message> - <location filename="../src/selector/UIVMPreviewWindow.cpp" line="119"/> + <location filename="../src/selector/UIVMPreviewWindow.cpp" line="121"/> <source>Every 0.5 s</source> <translation>0.5秒毎</translation> </message> <message> - <location filename="../src/selector/UIVMPreviewWindow.cpp" line="120"/> + <location filename="../src/selector/UIVMPreviewWindow.cpp" line="122"/> <source>Every 1 s</source> <translation>1秒毎</translation> </message> <message> - <location filename="../src/selector/UIVMPreviewWindow.cpp" line="121"/> + <location filename="../src/selector/UIVMPreviewWindow.cpp" line="123"/> <source>Every 2 s</source> <translation>2秒毎</translation> </message> <message> - <location filename="../src/selector/UIVMPreviewWindow.cpp" line="122"/> + <location filename="../src/selector/UIVMPreviewWindow.cpp" line="124"/> <source>Every 5 s</source> <translation>5秒毎</translation> </message> <message> - <location filename="../src/selector/UIVMPreviewWindow.cpp" line="123"/> + <location filename="../src/selector/UIVMPreviewWindow.cpp" line="125"/> <source>Every 10 s</source> <translation>10秒毎</translation> </message> <message> - <location filename="../src/selector/UIVMPreviewWindow.cpp" line="164"/> + <location filename="../src/selector/UIVMPreviewWindow.cpp" line="167"/> <source>No Preview</source> <translation>プレビューãªã—</translation> </message> @@ -6721,139 +6751,139 @@ Version %1</source> <translation>仮想システム%1</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="177"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="194"/> <source>Name</source> <translation>åå‰</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="178"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="195"/> <source>Product</source> <translation>製å“</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="179"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="196"/> <source>Product-URL</source> <translation>製å“-URL</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="180"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="197"/> <source>Vendor</source> <translation>ベンダ</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="181"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="198"/> <source>Vendor-URL</source> <translation>ベンダ-URL</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="182"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="199"/> <source>Version</source> <translation>ãƒãƒ¼ã‚¸ãƒ§ãƒ³</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="792"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="851"/> <source>Description</source> <translation>説明</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="184"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="201"/> <source>License</source> <translation>ライセンス</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="185"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="202"/> <source>Guest OS Type</source> <translation>ゲストOSã®ã‚¿ã‚¤ãƒ—</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="186"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="203"/> <source>CPU</source> <translation>CPU</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="187"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="204"/> <source>RAM</source> <translation>RAM</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="188"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="205"/> <source>Hard Disk Controller (IDE)</source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ コントãƒãƒ¼ãƒ© (IDE)</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="189"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="206"/> <source>Hard Disk Controller (SATA)</source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ コントãƒãƒ¼ãƒ© (SATA)</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="190"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="207"/> <source>Hard Disk Controller (SCSI)</source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ コントãƒãƒ¼ãƒ© (SCSI)</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="191"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="208"/> <source>Hard Disk Controller (SAS)</source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ コントãƒãƒ¼ãƒ© (SAS)</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="192"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="209"/> <source>DVD</source> <translation>DVD</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="193"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="210"/> <source>Floppy</source> <translation>フãƒãƒƒãƒ”ー</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="194"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="211"/> <source>Network Adapter</source> <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ アダプタ</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="195"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="212"/> <source>USB Controller</source> <translation>USB コントãƒãƒ¼ãƒ©</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="196"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="213"/> <source>Sound Card</source> <translation>サウンドカード</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="197"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="214"/> <source>Virtual Disk Image</source> <translation>仮想ディスクイメージ</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="198"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="215"/> <source>Unknown Hardware Item</source> <translation>䏿˜Žãªãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢é …ç›®</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="198"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="215"/> <source>MB</source> <comment>size suffix MBytes=1024 KBytes</comment> <translation type="obsolete">MB</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="198"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="215"/> <source>MB</source> <translation type="obsolete">MB</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="232"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="249"/> <source><b>Original Value:</b> %1</source> <translation><b>å…ƒã®å€¤:</b> %1</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="232"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="249"/> <source>MB</source> <comment>size suffix MBytes=1024KBytes</comment> <translation type="obsolete">MB</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="793"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="852"/> <source>Configuration</source> <translation>æ§‹æˆ</translation> </message> @@ -8242,670 +8272,670 @@ Version %1</source> <translation type="obsolete">差分</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1386"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1420"/> <source>Unknown device %1:%2</source> <comment>USB device details</comment> <translation>䏿˜Žãªãƒ‡ãƒã‚¤ã‚¹ %1:%2</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1411"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1445"/> <source><nobr>Vendor ID: %1</nobr><br><nobr>Product ID: %2</nobr><br><nobr>Revision: %3</nobr></source> <comment>USB device tooltip</comment> <translation><nobr>ベンダID: %1</nobr><br><nobr>プãƒãƒ€ã‚¯ãƒˆID: %2</nobr><br><nobr>リビジョン: %3</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1420"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1454"/> <source><br><nobr>Serial No. %1</nobr></source> <comment>USB device tooltip</comment> <translation><br><nobr>シリアルNo. %1</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1427"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1461"/> <source><br><nobr>State: %1</nobr></source> <comment>USB device tooltip</comment> <translation><br><nobr>状態: %1</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1522"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1556"/> <source>Name</source> <comment>details report</comment> <translation>åå‰</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1524"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1558"/> <source>OS Type</source> <comment>details report</comment> <translation>OSタイプ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1594"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1628"/> <source>Base Memory</source> <comment>details report</comment> <translation>メインメモリ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1594"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1628"/> <source><nobr>%3 MB</nobr></source> <comment>details report</comment> <translation type="obsolete"><nobr>%3 MB</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1531"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1565"/> <source>General</source> <comment>details report</comment> <translation>一般</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1627"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1661"/> <source>Video Memory</source> <comment>details report</comment> <translation>ビデオメモリ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1627"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1661"/> <source><nobr>%4 MB</nobr></source> <comment>details report</comment> <translation type="obsolete"><nobr>%4 MB</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1600"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1634"/> <source>Boot Order</source> <comment>details report</comment> <translation>èµ·å‹•é †åº</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1636"/> <source>ACPI</source> <comment>details report</comment> <translation>ACPI</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1603"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1637"/> <source>IO APIC</source> <comment>details report</comment> <translation>IO APIC</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1603"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1637"/> <source>Not Attached</source> <comment>details report (HDDs)</comment> <translation type="obsolete">割り当ã¦ã‚‰ã‚Œã¦ã„ã¾ã›ã‚“</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1603"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1637"/> <source>Hard Disks</source> <comment>details report</comment> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1562"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1596"/> <source>Enabled</source> <comment>details report (ACPI)</comment> <translation>有効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1563"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1597"/> <source>Disabled</source> <comment>details report (ACPI)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1567"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1601"/> <source>Enabled</source> <comment>details report (IO APIC)</comment> <translation>有効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>Disabled</source> <comment>details report (IO APIC)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>Not mounted</source> <comment>details report (floppy)</comment> <translation type="obsolete">マウントã•れã¦ã„ã¾ã›ã‚“</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>Image</source> <comment>details report (floppy)</comment> <translation type="obsolete">イメージ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>Host Drive</source> <comment>details report (floppy)</comment> <translation type="obsolete">ホスト ドライブ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>Floppy</source> <comment>details report</comment> <translation type="obsolete">フãƒãƒƒãƒ”ー</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>Not mounted</source> <comment>details report (DVD)</comment> <translation type="obsolete">マウントã•れã¦ã„ã¾ã›ã‚“</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>Image</source> <comment>details report (DVD)</comment> <translation type="obsolete">イメージ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>Host Drive</source> <comment>details report (DVD)</comment> <translation type="obsolete">ホスト ドライブ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1568"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1602"/> <source>CD/DVD-ROM</source> <comment>details report</comment> <translation type="obsolete">CD/DVD-ROM</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1768"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1802"/> <source>Disabled</source> <comment>details report (audio)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1774"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1808"/> <source>Audio</source> <comment>details report</comment> <translation>オーディオ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1813"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1847"/> <source>Adapter %1</source> <comment>details report (network)</comment> <translation>アダプタ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1822"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1856"/> <source>Disabled</source> <comment>details report (network)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1830"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1864"/> <source>Network</source> <comment>details report</comment> <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1937"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1971"/> <source>Device Filters</source> <comment>details report (USB)</comment> <translation>デãƒã‚¤ã‚¹ フィルタ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1938"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1972"/> <source>%1 (%2 active)</source> <comment>details report (USB)</comment> <translation>%1 (%2 アクティブ)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1943"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1977"/> <source>Disabled</source> <comment>details report (USB)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1943"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1977"/> <source>VRDP Server Port</source> <comment>details report (VRDP)</comment> <translation type="obsolete">VRDPサーãƒãƒ¼ ãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1943"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1977"/> <source>%1</source> <comment>details report (VRDP)</comment> <translation type="obsolete">%1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1943"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1977"/> <source>Disabled</source> <comment>details report (VRDP)</comment> <translation type="obsolete">無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1943"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1977"/> <source>Remote Display</source> <comment>details report</comment> <translation type="obsolete">リモートディスプレイ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1943"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1977"/> <source>Opening URLs is not implemented yet.</source> <translation type="obsolete">"URLã‚’é–‹ã"ã¯ã¾ã 実装ã•れã¦ã„ã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2788"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2842"/> <source>Powered Off</source> <comment>MachineState</comment> <translation>é›»æºã‚ªãƒ•</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2789"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2843"/> <source>Saved</source> <comment>MachineState</comment> <translation>ä¿å˜</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2791"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2845"/> <source>Aborted</source> <comment>MachineState</comment> <translation>䏿–</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2792"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2846"/> <source>Running</source> <comment>MachineState</comment> <translation>実行ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2793"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2847"/> <source>Paused</source> <comment>MachineState</comment> <translation>ä¸€æ™‚åœæ¢</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2797"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2851"/> <source>Starting</source> <comment>MachineState</comment> <translation>èµ·å‹•ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2798"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2852"/> <source>Stopping</source> <comment>MachineState</comment> <translation>åœæ¢ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2799"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2853"/> <source>Saving</source> <comment>MachineState</comment> <translation>ä¿å˜ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2800"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2854"/> <source>Restoring</source> <comment>MachineState</comment> <translation>復元ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2800"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2854"/> <source>Discarding</source> <comment>MachineState</comment> <translation type="obsolete">ç ´æ£„ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2800"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2854"/> <source>Closed</source> <comment>SessionState</comment> <translation type="obsolete">クãƒãƒ¼ã‚ºãƒ‰</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2800"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2854"/> <source>Open</source> <comment>SessionState</comment> <translation type="obsolete">オープン</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2812"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2866"/> <source>Spawning</source> <comment>SessionState</comment> <translation>生æˆä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2812"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2866"/> <source>Closing</source> <comment>SessionState</comment> <translation type="obsolete">閉鎖ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2815"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2869"/> <source>None</source> <comment>DeviceType</comment> <translation>ãªã—</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2816"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2870"/> <source>Floppy</source> <comment>DeviceType</comment> <translation>フãƒãƒƒãƒ”ー</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2817"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2871"/> <source>CD/DVD-ROM</source> <comment>DeviceType</comment> <translation>CD/DVD-ROM</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2818"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2872"/> <source>Hard Disk</source> <comment>DeviceType</comment> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2819"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2873"/> <source>Network</source> <comment>DeviceType</comment> <translation>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2846"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2900"/> <source>Normal</source> <comment>DiskType</comment> <translation>標準</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2847"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2901"/> <source>Immutable</source> <comment>DiskType</comment> <translation>変更ä¸å¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2848"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2902"/> <source>Writethrough</source> <comment>DiskType</comment> <translation>ライトスルー</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2848"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2902"/> <source>Virtual Disk Image</source> <comment>DiskStorageType</comment> <translation type="obsolete">仮想ディスクイメージ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2848"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2902"/> <source>iSCSI</source> <comment>DiskStorageType</comment> <translation type="obsolete">iSCSI</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2848"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2902"/> <source>VMDK Image</source> <comment>DiskStorageType</comment> <translation type="obsolete">VMDKイメージ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2848"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2902"/> <source>Null</source> <comment>VRDPAuthType</comment> <translation type="obsolete">Null</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2848"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2902"/> <source>External</source> <comment>VRDPAuthType</comment> <translation type="obsolete">外部</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2848"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2902"/> <source>Guest</source> <comment>VRDPAuthType</comment> <translation type="obsolete">ゲスト</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2864"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2918"/> <source>Ignore</source> <comment>USBFilterActionType</comment> <translation>無視</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2866"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2920"/> <source>Hold</source> <comment>USBFilterActionType</comment> <translation>ä¿æŒ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2869"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2923"/> <source>Null Audio Driver</source> <comment>AudioDriverType</comment> <translation>Null Audio Driver</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2871"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2925"/> <source>Windows Multimedia</source> <comment>AudioDriverType</comment> <translation>Windows マルãƒãƒ¡ãƒ‡ã‚£ã‚¢</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2875"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2929"/> <source>OSS Audio Driver</source> <comment>AudioDriverType</comment> <translation>OSS オーディオ ドライãƒ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2877"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2931"/> <source>ALSA Audio Driver</source> <comment>AudioDriverType</comment> <translation>ALSA オーディオ ドライãƒ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2879"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2933"/> <source>Windows DirectSound</source> <comment>AudioDriverType</comment> <translation>Windows DirectSound</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2881"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2935"/> <source>CoreAudio</source> <comment>AudioDriverType</comment> <translation>CoreAudio</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2908"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2962"/> <source>Not attached</source> <comment>NetworkAttachmentType</comment> <translation>未割り当ã¦</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2910"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2964"/> <source>NAT</source> <comment>NetworkAttachmentType</comment> <translation>NAT</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2910"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2964"/> <source>Host Interface</source> <comment>NetworkAttachmentType</comment> <translation type="obsolete">ホスト インターフェース</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2914"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2968"/> <source>Internal Network</source> <comment>NetworkAttachmentType</comment> <translation>内部ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2951"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3005"/> <source>LsiLogic SAS</source> <comment>StorageControllerType</comment> <translation>LsiLogic SAS</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2954"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3008"/> <source>Not supported</source> <comment>USBDeviceState</comment> <translation>未サãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2956"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3010"/> <source>Unavailable</source> <comment>USBDeviceState</comment> <translation>利用ä¸å¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2958"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3012"/> <source>Busy</source> <comment>USBDeviceState</comment> <translation>ビジー</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2960"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3014"/> <source>Available</source> <comment>USBDeviceState</comment> <translation>利用å¯èƒ½</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2962"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3016"/> <source>Held</source> <comment>USBDeviceState</comment> <translation>ä¿æŒ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2964"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3018"/> <source>Captured</source> <comment>USBDeviceState</comment> <translation>ã‚ャプãƒãƒ£</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2964"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3018"/> <source><i>Checking...</i></source> <comment>hard disk</comment> <translation type="obsolete"><i>確èªä¸...</i></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2964"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3018"/> <source><i>Inaccessible</i></source> <comment>hard disk</comment> <translation type="obsolete"><i>アクセスä¸å¯</i></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2928"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2982"/> <source>Disabled</source> <comment>ClipboardType</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2930"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2984"/> <source>Host To Guest</source> <comment>ClipboardType</comment> <translation>ホストOSã‹ã‚‰ã‚²ã‚¹ãƒˆOSã¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2932"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2986"/> <source>Guest To Host</source> <comment>ClipboardType</comment> <translation>ゲストOSã‹ã‚‰ãƒ›ã‚¹ãƒˆOSã¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2934"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2988"/> <source>Bidirectional</source> <comment>ClipboardType</comment> <translation>åŒæ–¹å‘</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2934"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2988"/> <source>Select a directory</source> <translation type="obsolete">ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’é¸æŠž</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2934"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2988"/> <source>Select a file</source> <translation type="obsolete">ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1858"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1892"/> <source>Port %1</source> <comment>details report (serial ports)</comment> <translation>ãƒãƒ¼ãƒˆ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1867"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1901"/> <source>Disabled</source> <comment>details report (serial ports)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1875"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1909"/> <source>Serial Ports</source> <comment>details report</comment> <translation>シリアルãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1949"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1983"/> <source>USB</source> <comment>details report</comment> <translation>USB</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1962"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1996"/> <source>Shared Folders</source> <comment>details report (shared folders)</comment> <translation>共有フォルダ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1962"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1996"/> <source>%1</source> <comment>details report (shadef folders)</comment> <translation type="obsolete">%1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1967"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2001"/> <source>None</source> <comment>details report (shared folders)</comment> <translation>ãªã—</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1973"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2007"/> <source>Shared Folders</source> <comment>details report</comment> <translation>共有フォルダ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1973"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2007"/> <source>Stuck</source> <comment>MachineState</comment> <translation type="obsolete">スタック</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2858"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2912"/> <source>Disconnected</source> <comment>PortMode</comment> <translation>切æ–</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2859"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2913"/> <source>Host Pipe</source> <comment>PortMode</comment> <translation>ホストã«ãƒ‘イプ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2860"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2914"/> <source>Host Device</source> <comment>PortMode</comment> <translation>ホスト デãƒã‚¤ã‚¹</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2967"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3021"/> <source>PIIX3</source> <comment>ChipsetType</comment> <translation>PIIX3</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2969"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3023"/> <source>ICH9</source> <comment>ChipsetType</comment> <translation>ICH9</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2971"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3025"/> <source>User-defined</source> <comment>serial port</comment> <translation>ユーザー定義</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2971"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3025"/> <source>Custom Hard Disk</source> <comment>DiskStorageType</comment> <translation type="obsolete">カスタムãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> @@ -8917,7 +8947,7 @@ Version %1</source> <translation>VT-x/AMD-V</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1604"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1638"/> <source>PAE/NX</source> <comment>details report</comment> <translation>PAE/NX</translation> @@ -8935,229 +8965,229 @@ Version %1</source> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1665"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1699"/> <source>Remote Desktop Server Port</source> <comment>details report (VRDE Server)</comment> <translation>リモートデスクトップ サーãƒãƒ¼ ãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1572"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1606"/> <source>Enabled</source> <comment>details report (PAE/NX)</comment> <translation>有効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1573"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1607"/> <source>Disabled</source> <comment>details report (PAE/NX)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1761"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1795"/> <source>Host Driver</source> <comment>details report (audio)</comment> <translation>ホスト ドライãƒ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1764"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1798"/> <source>Controller</source> <comment>details report (audio)</comment> <translation>コントãƒãƒ¼ãƒ©</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1896"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1930"/> <source>Port %1</source> <comment>details report (parallel ports)</comment> <translation>ãƒãƒ¼ãƒˆ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1905"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1939"/> <source>Disabled</source> <comment>details report (parallel ports)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1914"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1948"/> <source>Parallel Ports</source> <comment>details report</comment> <translation>パラレルãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2820"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2874"/> <source>USB</source> <comment>DeviceType</comment> <translation>USB</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2821"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2875"/> <source>Shared Folder</source> <comment>DeviceType</comment> <translation>共有フォルダ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2823"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2877"/> <source>IDE</source> <comment>StorageBus</comment> <translation>IDE</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2824"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2878"/> <source>SATA</source> <comment>StorageBus</comment> <translation>SATA</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2829"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2883"/> <source>Primary</source> <comment>StorageBusChannel</comment> <translation>プライマリ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2830"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2884"/> <source>Secondary</source> <comment>StorageBusChannel</comment> <translation>セカンダリ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2833"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2887"/> <source>Master</source> <comment>StorageBusDevice</comment> <translation>マスター</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2834"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2888"/> <source>Slave</source> <comment>StorageBusDevice</comment> <translation>スレーブ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2831"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2885"/> <source>Port %1</source> <comment>StorageBusChannel</comment> <translation>ãƒãƒ¼ãƒˆ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2831"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2885"/> <source>VHD Image</source> <comment>DiskStorageType</comment> <translation type="obsolete">VHDイメージ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2873"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2927"/> <source>Solaris Audio</source> <comment>AudioDriverType</comment> <translation>Solaris オーディオ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2883"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2937"/> <source>PulseAudio</source> <comment>AudioDriverType</comment> <translation>PulseAudio</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2886"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2940"/> <source>ICH AC97</source> <comment>AudioControllerType</comment> <translation>ICH AC97</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2888"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2942"/> <source>SoundBlaster 16</source> <comment>AudioControllerType</comment> <translation>SoundBlaster 16</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2893"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2947"/> <source>PCnet-PCI II (Am79C970A)</source> <comment>NetworkAdapterType</comment> <translation>PCnet-PCI II (Am79C970A)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2895"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2949"/> <source>PCnet-FAST III (Am79C973)</source> <comment>NetworkAdapterType</comment> <translation>PCnet-FAST III (Am79C973)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2897"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2951"/> <source>Intel PRO/1000 MT Desktop (82540EM)</source> <comment>NetworkAdapterType</comment> <translation>Intel PRO/1000 MT Desktop (82540EM)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2897"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2951"/> <source>PIIX3</source> <comment>IDEControllerType</comment> <translation type="obsolete">PIIX3</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2897"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2951"/> <source>PIIX4</source> <comment>IDEControllerType</comment> <translation type="obsolete">PIIX4</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2899"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2953"/> <source>Intel PRO/1000 T Server (82543GC)</source> <comment>NetworkAdapterType</comment> <translation>Intel PRO/1000 T Server (82543GC)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1443"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1477"/> <source><nobr>Vendor ID: %1</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>ベンダID: %1</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1448"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1482"/> <source><nobr>Product ID: %2</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>プãƒãƒ€ã‚¯ãƒˆID: %2</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1453"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1487"/> <source><nobr>Revision: %3</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>リビジョン: %3</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1458"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1492"/> <source><nobr>Product: %4</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>製å“: %4</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1463"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1497"/> <source><nobr>Manufacturer: %5</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>メーカー: %5</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1468"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1502"/> <source><nobr>Serial No.: %1</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>シリアルNo.: %1</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1473"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1507"/> <source><nobr>Port: %1</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>ãƒãƒ¼ãƒˆ: %1</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1480"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1514"/> <source><nobr>State: %1</nobr></source> <comment>USB filter tooltip</comment> <translation><nobr>状態: %1</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1480"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1514"/> <source>host interface, %1</source> <comment>details report (network)</comment> <translation type="obsolete">ホスト インターフェース, %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1480"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1514"/> <source>internal network, '%1'</source> <comment>details report (network)</comment> <translation type="obsolete">内部ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯, '%1'</translation> @@ -9227,157 +9257,157 @@ Version %1</source> <translation type="obsolete">%1<hr>ã“ã®ãƒ™ãƒ¼ã‚¹ ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¯ä»¥ä¸‹ã®å·®åˆ†ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’使用ã—ã¦é–“接的ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™:<br>%2%3</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1646"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1680"/> <source>3D Acceleration</source> <comment>details report</comment> <translation>3Dアクセラレーション</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1642"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1676"/> <source>Enabled</source> <comment>details report (3D Acceleration)</comment> <translation>有効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1643"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1677"/> <source>Disabled</source> <comment>details report (3D Acceleration)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2807"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2861"/> <source>Setting Up</source> <comment>MachineState</comment> <translation>セットアップ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2852"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2906"/> <source>Differencing</source> <comment>DiskType</comment> <translation>差分</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1610"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1644"/> <source>Nested Paging</source> <comment>details report</comment> <translation>ãƒã‚¹ãƒ†ãƒƒãƒ‰ãƒšãƒ¼ã‚¸ãƒ³ã‚°</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1585"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1619"/> <source>Enabled</source> <comment>details report (Nested Paging)</comment> <translation>有効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1586"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1620"/> <source>Disabled</source> <comment>details report (Nested Paging)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1586"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1620"/> <source>Bridged network, %1</source> <comment>details report (network)</comment> <translation type="obsolete">ブリッジ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯, '%1'</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1799"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1833"/> <source>Internal network, '%1'</source> <comment>details report (network)</comment> <translation>内部ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯, '%1'</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1799"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1833"/> <source>Host-only network, '%1'</source> <comment>details report (network)</comment> <translation type="obsolete">ホストオンリー ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯, '%1'</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2825"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2879"/> <source>SCSI</source> <comment>StorageBus</comment> <translation>SCSI</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2825"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2879"/> <source>Bridged Network</source> <comment>NetworkAttachmentType</comment> <translation type="obsolete">ブリッジ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2825"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2879"/> <source>Host-only Network</source> <comment>NetworkAttachmentType</comment> <translation type="obsolete">ホストオンリー ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2937"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2991"/> <source>PIIX3</source> <comment>StorageControllerType</comment> <translation>PIIX3</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2939"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2993"/> <source>PIIX4</source> <comment>StorageControllerType</comment> <translation>PIIX4</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2941"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2995"/> <source>ICH6</source> <comment>StorageControllerType</comment> <translation>ICH6</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2943"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2997"/> <source>AHCI</source> <comment>StorageControllerType</comment> <translation>AHCI</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2945"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2999"/> <source>Lsilogic</source> <comment>StorageControllerType</comment> <translation>Lsilogic</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2947"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3001"/> <source>BusLogic</source> <comment>StorageControllerType</comment> <translation>BusLogic</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1796"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1830"/> <source>Bridged adapter, %1</source> <comment>details report (network)</comment> <translation>ブリッジ アダプタ, '%1'</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1802"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1836"/> <source>Host-only adapter, '%1'</source> <comment>details report (network)</comment> <translation>ホストオンリー アダプタ, '%1'</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2901"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2955"/> <source>Intel PRO/1000 MT Server (82545EM)</source> <comment>NetworkAdapterType</comment> <translation>Intel PRO/1000 MT Server (82545EM)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2912"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2966"/> <source>Bridged Adapter</source> <comment>NetworkAttachmentType</comment> <translation>ブリッジ アダプタ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2916"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2970"/> <source>Host-only Adapter</source> <comment>NetworkAttachmentType</comment> <translation>ホストオンリー アダプタ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1628"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1662"/> <source><nobr>%1 MB</nobr></source> <comment>details report</comment> <translation><nobr>%1 MB</nobr></translation> @@ -9389,399 +9419,399 @@ Version %1</source> <translation>プãƒã‚»ãƒƒã‚µæ•°</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1598"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1632"/> <source><nobr>%1</nobr></source> <comment>details report</comment> <translation><nobr>%1</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1616"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1650"/> <source>System</source> <comment>details report</comment> <translation>システム</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1616"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1650"/> <source>Remote Display Server Port</source> <comment>details report (VRDP Server)</comment> <translation type="obsolete">リモートディスプレイ サーãƒãƒ¼ ãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1616"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1650"/> <source>Remote Display Server</source> <comment>details report (VRDP Server)</comment> <translation type="obsolete">リモートディスプレイ サーãƒãƒ¼</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1616"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1650"/> <source>Disabled</source> <comment>details report (VRDP Server)</comment> <translation type="obsolete">無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1678"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1712"/> <source>Display</source> <comment>details report</comment> <translation>ディスプレイ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2861"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2915"/> <source>Raw File</source> <comment>PortMode</comment> <translation>Rawファイル</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1651"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1685"/> <source>Enabled</source> <comment>details report (2D Video Acceleration)</comment> <translation>有効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1377"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1411"/> <source>Unknown device</source> <comment>USB device details</comment> <translation></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1636"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1670"/> <source>Screens</source> <comment>details report</comment> <translation>スクリーン</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1652"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1686"/> <source>Disabled</source> <comment>details report (2D Video Acceleration)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1655"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1689"/> <source>2D Video Acceleration</source> <comment>details report</comment> <translation>2Dビデオ アクセラレーション</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1669"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1703"/> <source>Remote Desktop Server</source> <comment>details report (VRDE Server)</comment> <translation>リモートデスクトップ サーãƒãƒ¼</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1670"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1704"/> <source>Disabled</source> <comment>details report (VRDE Server)</comment> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1709"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1743"/> <source>(CD/DVD)</source> <translation>(CD/DVD)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1741"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1775"/> <source>Not Attached</source> <comment>details report (Storage)</comment> <translation>未割り当ã¦</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1749"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1783"/> <source>Storage</source> <comment>details report</comment> <translation>ストレージ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="1806"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="1840"/> <source>VDE network, '%1'</source> <comment>details report (network)</comment> <translation>VDE ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯, '%1'</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2615"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2648"/> <source>Choose a virtual hard disk file</source> <translation>仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãƒ•ァイルã®é¸æŠž</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2616"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2649"/> <source>hard disk</source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2622"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2660"/> <source>Choose a virtual CD/DVD disk file</source> <translation>仮想CD/DVDディスクファイルã®é¸æŠž</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2623"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2661"/> <source>CD/DVD-ROM disk</source> <translation>CD/DVD-ROMディスク</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2629"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2672"/> <source>Choose a virtual floppy disk file</source> <translation>仮想フãƒãƒƒãƒ”ーディスクファイルã®é¸æŠž</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2630"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2673"/> <source>floppy disk</source> <translation>フãƒãƒƒãƒ”ーディスク</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2648"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2698"/> <source>All %1 images (%2)</source> <translation>ã™ã¹ã¦ã®%1イメージ(%2)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2649"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2699"/> <source>All files (*)</source> <translation>ã™ã¹ã¦ã®ãƒ•ァイル(*)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2790"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2844"/> <source>Teleported</source> <comment>MachineState</comment> <translation>テレãƒãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2794"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2848"/> <source>Guru Meditation</source> <comment>MachineState</comment> <translation>瞑想ä¸(システムエラー)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2802"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2856"/> <source>Teleporting</source> <comment>MachineState</comment> <translation>テレãƒãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2796"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2850"/> <source>Taking Live Snapshot</source> <comment>MachineState</comment> <translation>スナップショットã®ä½œæˆä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2801"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2855"/> <source>Teleporting Paused VM</source> <comment>MachineState</comment> <translation>仮想マシンã®ãƒ†ãƒ¬ãƒãƒ¼ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ã‚’䏿–</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2803"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2857"/> <source>Restoring Snapshot</source> <comment>MachineState</comment> <translation>スナップショットã«å¾©å…ƒä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2806"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2860"/> <source>Deleting Snapshot</source> <comment>MachineState</comment> <translation>スナップショットを削除ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2808"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2862"/> <source>Fault Tolerant Syncing</source> <comment>MachineState</comment> <translation>フォールトトレラントã®åŒæœŸä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2810"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2864"/> <source>Unlocked</source> <comment>SessionState</comment> <translation>アンãƒãƒƒã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2811"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2865"/> <source>Locked</source> <comment>SessionState</comment> <translation>ãƒãƒƒã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2813"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2867"/> <source>Unlocking</source> <comment>SessionState</comment> <translation>アンãƒãƒƒã‚¯ä¸</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2826"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2880"/> <source>Floppy</source> <comment>StorageBus</comment> <translation>フãƒãƒƒãƒ”ー</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2827"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2881"/> <source>SAS</source> <comment>StorageBus</comment> <translation>SAS</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2835"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2889"/> <source>Device %1</source> <comment>StorageBusDevice</comment> <translation>デãƒã‚¤ã‚¹ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2837"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2891"/> <source>IDE Primary Master</source> <comment>New Storage UI : Slot Name</comment> <translation>IDE プライマリ マスター</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2838"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2892"/> <source>IDE Primary Slave</source> <comment>New Storage UI : Slot Name</comment> <translation>IDE プライマリ スレーブ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2839"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2893"/> <source>IDE Secondary Master</source> <comment>New Storage UI : Slot Name</comment> <translation>IDE セカンダリ マスター</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2840"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2894"/> <source>IDE Secondary Slave</source> <comment>New Storage UI : Slot Name</comment> <translation>IDE セカンダリ スレーブ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2841"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2895"/> <source>SATA Port %1</source> <comment>New Storage UI : Slot Name</comment> <translation>SATA ãƒãƒ¼ãƒˆ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2842"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2896"/> <source>SCSI Port %1</source> <comment>New Storage UI : Slot Name</comment> <translation>SCSI ãƒãƒ¼ãƒˆ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2843"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2897"/> <source>SAS Port %1</source> <comment>New Storage UI : Slot Name</comment> <translation>SAS ãƒãƒ¼ãƒˆ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2844"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2898"/> <source>Floppy Device %1</source> <comment>New Storage UI : Slot Name</comment> <translation>フãƒãƒƒãƒ”ー デãƒã‚¤ã‚¹ %1</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2849"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2903"/> <source>Shareable</source> <comment>DiskType</comment> <translation>共有å¯èƒ½</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2850"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2904"/> <source>Readonly</source> <comment>DiskType</comment> <translation>èªã¿è¾¼ã¿å°‚用</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2851"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2905"/> <source>Multi-attach</source> <comment>DiskType</comment> <translation>複数割り当ã¦</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2854"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2908"/> <source>Null</source> <comment>AuthType</comment> <translation>Null</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2855"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2909"/> <source>External</source> <comment>AuthType</comment> <translation>外部</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2856"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2910"/> <source>Guest</source> <comment>AuthType</comment> <translation>ゲスト</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2890"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2944"/> <source>Intel HD Audio</source> <comment>AudioControllerType</comment> <translation>Intel HD オーディオ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2904"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2958"/> <source>Paravirtualized Network (virtio-net)</source> <comment>NetworkAdapterType</comment> <translation>準仮想化ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ (virtio-net)</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2919"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2973"/> <source>VDE Adapter</source> <comment>NetworkAttachmentType</comment> <translation>VDE アダプタ</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2923"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2977"/> <source>UDP</source> <comment>NATProtocolType</comment> <translation>UDP</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2925"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="2979"/> <source>TCP</source> <comment>NATProtocolType</comment> <translation>TCP</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="2949"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3003"/> <source>I82078</source> <comment>StorageControllerType</comment> <translation>I82078</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="3572"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3625"/> <source>and</source> <translation>and</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="3572"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3625"/> <source>^(?:(?:(\d+)(?:\s?(B|KB|MB|GB|TB|PB))?)|(?:(\d*)%1(\d{1,2})(?:\s?(KB|MB|GB|TB|PB))))$</source> <comment>regexp for matching ####[.##] B|KB|MB|GB|TB|PB, %1=decimal point</comment> <translation type="obsolete">^(?:(?:(\d+)(?:\s?(B|KB|MB|GB|TB|PB))?)|(?:(\d*)%1(\d{1,2})(?:\s?(KB|MB|GB|TB|PB))))$</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="3660"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3713"/> <source>B</source> <comment>size suffix Bytes</comment> <translation>B</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="3661"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3714"/> <source>KB</source> <comment>size suffix KBytes=1024 Bytes</comment> <translation>KB</translation> </message> <message> - <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="399"/> + <location filename="../src/widgets/VBoxApplianceEditorWgt.cpp" line="427"/> <source>MB</source> <comment>size suffix MBytes=1024 KBytes</comment> <translation>MB</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="3663"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3716"/> <source>GB</source> <comment>size suffix GBytes=1024 MBytes</comment> <translation>GB</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="3664"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3717"/> <source>TB</source> <comment>size suffix TBytes=1024 GBytes</comment> <translation>TB</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="3665"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="3718"/> <source>PB</source> <comment>size suffix PBytes=1024 TBytes</comment> <translation>PB</translation> @@ -9875,42 +9905,42 @@ Version %1</source> <translation>ã“ã®ãƒ™ãƒ¼ã‚¹ ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¯ä»¥ä¸‹ã®å·®åˆ†ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’使用ã—ã¦é–“接的ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¾ã™:</translation> </message> <message numerus="yes"> - <location filename="../src/globals/VBoxGlobal.h" line="208"/> + <location filename="../src/globals/VBoxGlobal.h" line="214"/> <source>%n year(s)</source> <translation> <numerusform>%n å¹´</numerusform> </translation> </message> <message numerus="yes"> - <location filename="../src/globals/VBoxGlobal.h" line="213"/> + <location filename="../src/globals/VBoxGlobal.h" line="219"/> <source>%n month(s)</source> <translation> <numerusform>%n 月</numerusform> </translation> </message> <message numerus="yes"> - <location filename="../src/globals/VBoxGlobal.h" line="218"/> + <location filename="../src/globals/VBoxGlobal.h" line="224"/> <source>%n day(s)</source> <translation> <numerusform>%n æ—¥</numerusform> </translation> </message> <message numerus="yes"> - <location filename="../src/globals/VBoxGlobal.h" line="223"/> + <location filename="../src/globals/VBoxGlobal.h" line="229"/> <source>%n hour(s)</source> <translation> <numerusform>%n 時間</numerusform> </translation> </message> <message numerus="yes"> - <location filename="../src/globals/VBoxGlobal.h" line="228"/> + <location filename="../src/globals/VBoxGlobal.h" line="234"/> <source>%n minute(s)</source> <translation> <numerusform>%n 分</numerusform> </translation> </message> <message numerus="yes"> - <location filename="../src/globals/VBoxGlobal.h" line="233"/> + <location filename="../src/globals/VBoxGlobal.h" line="239"/> <source>%n second(s)</source> <translation> <numerusform>%n ç§’</numerusform> @@ -9934,7 +9964,7 @@ Version %1</source> <translation>ãƒã‚¹ãƒ†ãƒƒãƒ‰ãƒšãƒ¼ã‚¸ãƒ³ã‚°</translation> </message> <message> - <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="654"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="665"/> <source>MB</source> <comment>size suffix MBytes=1024KBytes</comment> <translation>MB</translation> @@ -9943,17 +9973,22 @@ Version %1</source> <context> <name>VBoxGlobalSettings</name> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="136"/> + <location filename="../src/wizards/newvm/UINewVMWzd.cpp" line="665"/> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)'ã¯ç„¡åйãªãƒ›ã‚¹ãƒˆã‚ーã®ã‚³ãƒ¼ãƒ‰ã§ã™ã€‚</translation> + <translation type="obsolete">'%1 (0x%2)'ã¯ç„¡åйãªãƒ›ã‚¹ãƒˆã‚ーã®ã‚³ãƒ¼ãƒ‰ã§ã™ã€‚</translation> + </message> + <message> + <location filename="../src/VBoxGlobalSettings.cpp" line="128"/> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>'%1'ã¯ç„¡åйãªãƒ›ã‚¹ãƒˆã‚ーã®çµ„ã¿åˆã‚ã›ã§ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="266"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="261"/> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> - <translation>The value of the key '%2'ã‚ーã®å€¤'%1'ã¯æ£è¦è¡¨ç¾ã®è¦å‰‡'%3'ã«é©åˆã—ã¾ã›ã‚“。</translation> + <translation>'%2'ã‚ーã®å€¤'%1'ã¯æ£è¦è¡¨ç¾ã®è¦å‰‡'%3'ã«é©åˆã—ã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Cannot delete the key '%1'.</source> <translation>'%1'ã‚ーを削除ã§ãã¾ã›ã‚“。</translation> </message> @@ -9961,231 +9996,231 @@ Version %1</source> <context> <name>VBoxGlobalSettingsDlg</name> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Category</source> <translation type="obsolete">カテゴリ</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>[id]</source> <translation type="obsolete">[id]</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>[link]</source> <translation type="obsolete">[link]</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>[name]</source> <translation type="obsolete">[name]</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <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> <translation type="obsolete"><i>å·¦å´ã®ãƒªã‚¹ãƒˆã‹ã‚‰è¨å®šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã€è¨å®šé …目をマウスオーãƒãƒ¼ã—ã¦è©³ç´°ãªæƒ…å ±ã‚’å‚ç…§ã—ã¦ãã ã•ã„<i>。</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> General </source> <translation type="obsolete">一般</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>0</source> <translation type="obsolete">0</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> Input </source> <translation type="obsolete">入力</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>1</source> <translation type="obsolete">1</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> USB </source> <translation type="obsolete"> USB </translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>2</source> <translation type="obsolete">2</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Default &Folders</source> <translation type="obsolete">デフォルト フォルダ(&F)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Machines</source> <translation type="obsolete">仮想マシン</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>VDI files</source> <translation type="obsolete">VDIファイル</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Select</source> <translation type="obsolete">é¸æŠž</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Keyboard</source> <translation type="obsolete">ã‚ーボード(&K)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Host Key</source> <translation type="obsolete">ホストã‚ー(&H)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Auto capture keyboard</source> <translation type="obsolete">ã‚ーボードã®è‡ªå‹•ã‚ャプãƒãƒ£(&A)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&USB Device Filters</source> <translation type="obsolete">USB デãƒã‚¤ã‚¹ フィルタ(&U)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Ins</source> <translation type="obsolete">Ins</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Alt+Ins</source> <translation type="obsolete">Alt+Ins</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Del</source> <translation type="obsolete">Del</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Ctrl+Up</source> <translation type="obsolete">Ctrl+Up</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Ctrl+Down</source> <translation type="obsolete">Ctrl+Down</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Help</source> <translation type="obsolete">ヘルプ</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>F1</source> <translation type="obsolete">F1</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Displays the dialog help.</source> <translation type="obsolete">ダイアãƒã‚°ã®ãƒ˜ãƒ«ãƒ—を表示ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Invalid settings detected</source> <translation type="obsolete">無効ãªè¨å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&OK</source> <translation type="obsolete">OK(&O)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Accepts (saves) changes and closes the dialog.</source> <translation type="obsolete">変更をä¿å˜ã—ã¦ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‰ã˜ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Cancel</source> <translation type="obsolete">ã‚ャンセル</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Cancels changes and closes the dialog.</source> <translation type="obsolete">å¤‰æ›´ã‚’ç ´æ£„ã—ã¦ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‰ã˜ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>VirtualBox Preferences</source> <translation type="obsolete">VirtualBox 環境è¨å®š</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Displays the key used as a Host Key in the VM window. Activate the entry field and press a new Host Key. Note that alphanumeric, cursor movement and editing keys cannot be used.</source> <translation type="obsolete">仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã§ãƒ›ã‚¹ãƒˆã‚ーã¨ã—ã¦ä½¿ç”¨ã™ã‚‹ã‚ーを表示ã—ã¾ã™ã€‚変更ã™ã‚‹ã«ã¯å…¥åŠ›ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚’ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ã—ã¦æ–°ã—ã„ホストã‚ーを押ã—ã¦ãã ã•ã„。注:英数å—ã€ã‚«ãƒ¼ã‚½ãƒ«ã‚ーã€ç·¨é›†ã‚ーã¯ãƒ›ã‚¹ãƒˆã‚ーã¨ã—ã¦ä½¿ç”¨ã§ãã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>New Filter %1</source> <comment>usb</comment> <translation type="obsolete">æ–°è¦ãƒ•ィルタ %1</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Language</source> <translation type="obsolete">言語</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> Language </source> <translation type="obsolete">言語</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>3</source> <translation type="obsolete">3</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Interface Language</source> <translation type="obsolete">インターフェース言語(&I)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Author(s):</source> <translation type="obsolete">作者:</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Language:</source> <translation type="obsolete">言語:</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> (built-in)</source> <comment>Language</comment> <translation type="obsolete">(内蔵)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source><unavailable></source> <comment>Language</comment> <translation type="obsolete"><利用ä¸å¯></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source><unknown></source> <comment>Author(s)</comment> <translation type="obsolete"><䏿˜Ž></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Lists all available user interface languages. The effective language is written in <b>bold</b>. Select <i>Default</i> to reset @@ -10195,83 +10230,83 @@ to the system default language.</qt> システムã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆè¨€èªžã«æˆ»ã™ã«ã¯<i>デフォルト</i>ã‚’é¸æŠžã—ã¦ãã ã•ã„。</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Default</source> <comment>Language</comment> <translation type="obsolete">デフォルト</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Displays the path to the default VDI folder. This folder is used, if not explicitly specified otherwise, when adding existing or creating new virtual hard disks.</source> <translation type="obsolete">デフォルトã®VDIフォルダã®ãƒ‘スを表示ã—ã¾ã™ã€‚æ–°è¦ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®ä½œæˆæ™‚ã«ä¿å˜å…ˆã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã—ãªã„å ´åˆã€ã“ã®ãƒ•ォルダãŒä½¿ç”¨ã•れã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <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> <translation type="obsolete">仮想マシン フォルダã®ãƒ‘ã‚¹ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã«æˆ»ã—ã¾ã™ã€‚変更後ã€å†åº¦ã“ã®ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‹ãã¨ãƒ‡ãƒ•ォルトã®ãƒ‘スãŒè¡¨ç¤ºã•れã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <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> <translation type="obsolete">VDIフォルダã®ãƒ‘ã‚¹ã‚’ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆå€¤ã«æˆ»ã—ã¾ã™ã€‚変更後ã€å†åº¦ã“ã®ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‹ãã¨ãƒ‡ãƒ•ォルト パスãŒè¡¨ç¤ºã•れã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Displays the path to the default virtual machine folder. This folder is used, if not explicitly specified otherwise, when creating new virtual machines.</source> <translation type="obsolete">デフォルトã®ä»®æƒ³ãƒžã‚·ãƒ³ フォルダã®ãƒ‘スを表示ã—ã¾ã™ã€‚æ–°è¦ä»®æƒ³ãƒžã‚·ãƒ³ã®ä½œæˆæ™‚ã«ä¿å˜å…ˆã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã—ãªã„å ´åˆã€ã“ã®ãƒ•ォルダãŒä½¿ç”¨ã•れã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Opens a dialog to select the default VDI folder.</source> <translation type="obsolete">ダイアãƒã‚°ã‚’é–‹ã„ã¦ãƒ‡ãƒ•ォルトã®VDIãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Opens a dialog to select the default virtual machine folder.</source> <translation type="obsolete">ダイアãƒã‚°ã‚’é–‹ã„ã¦ãƒ‡ãƒ•ォルトã®ä»®æƒ³ãƒžã‚·ãƒ³ ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="obsolete">仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã®ã¨ãã€ã‚ーボードを自動的ã«ã‚ャプãƒãƒ£ã—ã¾ã™ã€‚ã‚ーボードãŒã‚ャプãƒãƒ£ã•れるã¨ã€ã™ã¹ã¦ã®ã‚ーストãƒãƒ¼ã‚¯(Alt-Tabãªã©ã‚’å«ã‚€)ãŒä»®æƒ³ãƒžã‚·ãƒ³ã«é€ã‚‰ã‚Œã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>V&RDP Authentication Library</source> <translation type="obsolete">VRDPèªè¨¼ãƒ©ã‚¤ãƒ–ラリ(&R)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Displays the path to the library that provides authentication for Remote Display (VRDP) clients.</source> <translation type="obsolete">リモートディスプレイ(VRDP)クライアントã«èªè¨¼ã‚’æä¾›ã™ã‚‹ãƒ©ã‚¤ãƒ–ラリã®ãƒ‘スを表示ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Opens a dialog to select the VRDP authentication library file.</source> <translation type="obsolete">VRDPèªè¨¼ãƒ©ã‚¤ãƒ–ラリ ファイルã®é¸æŠžãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‹ãã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <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> <translation type="obsolete">èªè¨¼ãƒ©ã‚¤ãƒ–ラリ ファイルã®å€¤ã‚’デフォルト値ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã€‚変更をé©ç”¨ã—ã€å†åº¦ã“ã®ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‹ãã¨ç¾åœ¨ã®èªè¨¼ãƒ©ã‚¤ãƒ–ラリ ファイルãŒè¡¨ç¤ºã•れã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Extended Features</source> <translation type="obsolete">拡張機能(&E)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Enable &VT-x/AMD-V</source> <translation type="obsolete">VT-x/AMD-Vを有効化(&V)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Defines whether virtual machines should try to make use of the host CPU's hardware virtualization extensions such as Intel VT-x and AMD-V by default or not.</source> <translation type="obsolete">仮想マシンãŒãƒ›ã‚¹ãƒˆCPUã®Intel VT-xã‚„AMD-Vãªã©ã®ä»®æƒ³åŒ–æ”¯æ´æ©Ÿèƒ½ã‚’デフォルトã§ä½¿ç”¨ã™ã‚‹ã‹ã©ã†ã‹ã‚’指定ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Lists all global USB filters. The checkbox to the left @@ -10286,17 +10321,17 @@ to the system default language.</qt> USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニューã‹å³å´ã®ãƒœã‚¿ãƒ³ã‚’使用ã—ã¦ãã ã•ã„。</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Add Empty Filter</source> <translation type="obsolete">空ã®ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Add Empty Filter</source> <translation type="obsolete">空ã®ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ (&A)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Adds a new USB filter with all fields initially set to empty strings. Note that such a filter will match any attached USB @@ -10305,17 +10340,17 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation type="obsolete"><qt>ã™ã¹ã¦ã®ãƒ•ィールドãŒç©ºã®æ–°è¦USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã—ã¾ã™ã€‚注:ã“ã®ãƒ•ィルタã¯ã™ã¹ã¦ã®æŽ¥ç¶šã•れãŸUSB デãƒã‚¤ã‚¹ã«é©åˆã—ã¾ã™ã€‚</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Add Filter From Device</source> <translation type="obsolete">デãƒã‚¤ã‚¹ã‹ã‚‰ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>A&dd Filter From Device</source> <translation type="obsolete">デãƒã‚¤ã‚¹ã‹ã‚‰ãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã™ã‚‹(&D)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source><qt>Adds a new USB filter with all fields set to the values of the selected USB device attached to the host PC.</qt> @@ -10323,51 +10358,51 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation type="obsolete"><qt>é¸æŠžã—ãŸãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã®USB デãƒã‚¤ã‚¹ã®å€¤ã‚’ã™ã¹ã¦ã®ãƒ•ィールドã«è¨å®šã—ãŸæ–°è¦USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã—ã¾ã™ã€‚</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Remove Filter</source> <translation type="obsolete">フィルタを除去</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Remove Filter</source> <translation type="obsolete">フィルタを除去ã™ã‚‹(&R)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Removes the highlighted USB filter.</qt> </source> <translation type="obsolete"><qt>ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤ºã•れãŸãƒ•ィルタを除去ã—ã¾ã™ã€‚</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Move Filter Up</source> <translation type="obsolete">フィルタを上ã«ç§»å‹•</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Move Filter Up</source> <translation type="obsolete">フィルタを上ã«ç§»å‹•ã™ã‚‹(&M)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Moves the highlighted USB filter up.</qt> </source> <translation type="obsolete"><qt>ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤ºã•れãŸãƒ•ィルタを上ã«ç§»å‹•ã—ã¾ã™ã€‚</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Move Filter Down</source> <translation type="obsolete">フィルタを下ã«ç§»å‹•</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>M&ove Filter Down</source> <translation type="obsolete">フィルタを下ã«ç§»å‹•(&O)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Moves the highlighted USB filter down.</qt> </source> @@ -10377,32 +10412,32 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<context> <name>VBoxHardDiskSettings</name> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Slot</source> <translation type="obsolete">スãƒãƒƒãƒˆ</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Hard Disk</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>VBoxHardDiskSettings</source> <translation type="obsolete">VBoxHardDiskSettings</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Hard Disks</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯(&H)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Enable SATA Controller</source> <translation type="obsolete">SATA コントãƒãƒ¼ãƒ©ã‚’有効化(&E)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>When checked, enables the virtual SATA controller of this machine. Note that you cannot @@ -10412,12 +10447,12 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation type="obsolete"><qt>ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã®ä»®æƒ³SATA コントãƒãƒ¼ãƒ©ã‚’有効ã«ã—ã¾ã™ã€‚注:仮想コントãƒãƒ¼ãƒ©ãŒç„¡åйãªã¨ãã€ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’SATAãƒãƒ¼ãƒˆã«å–り付ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Hard Disks &Attachments</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®å‰²ã‚Šå½“ã¦(&A)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Lists all hard disks attached to this machine. Use a mouse double-click or the @@ -10434,66 +10469,66 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Add Attachment</source> <translation type="obsolete">割り当ã¦ã®è¿½åŠ </translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Add Attachment</source> <translation type="obsolete">割り当ã¦ã‚’è¿½åŠ ã™ã‚‹(&A)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Ins</source> <translation type="obsolete">Ins</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Adds a new hard disk attachment.</qt> </source> <translation type="obsolete"><qt>æ–°è¦ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®å‰²ã‚Šå½“ã¦ã‚’è¿½åŠ ã—ã¾ã™ã€‚</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Remove Attachment</source> <translation type="obsolete">割り当ã¦ã‚’除去</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Remove Attachment</source> <translation type="obsolete">割り当ã¦ã‚’除去ã™ã‚‹(&R)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Delete</source> <translation type="obsolete">削除</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Removes the highlighted hard disk attachment.</qt> </source> <translation type="obsolete"><qt>ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤ºã•れãŸãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®å‰²ã‚Šå½“ã¦ã‚’除去ã—ã¾ã™ã€‚</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Select Hard Disk</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’é¸æŠž</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Select Hard Disk</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’é¸æŠžã™ã‚‹(&S)</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Ctrl+Space</source> <translation type="obsolete">Ctrl+スペース</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source> <qt>Invokes the Virtual Disk Manager to select a hard disk to attach to the currently highlighted slot.</qt> @@ -10501,17 +10536,17 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation type="obsolete"><qt>仮想ディスクマãƒãƒ¼ã‚¸ãƒ£ã‚’èµ·å‹•ã—ã€ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’ç¾åœ¨ãƒã‚¤ãƒ©ã‚¤ãƒˆè¡¨ç¤ºã•れãŸã‚¹ãƒãƒƒãƒˆã«å‰²ã‚Šå½“ã¦ã¾ã™ã€‚</qt></translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source><i>%1</i> uses the hard disk that is already attached to <i>%2</i></source> <translation type="obsolete"><i>%1</i>ã¯ã™ã§ã«<i>%2</i>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã‚‹</translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>Double-click to add a new attachment</source> <translation type="obsolete">ãƒ€ãƒ–ãƒ«ã‚¯ãƒªãƒƒã‚¯ã§æ–°è¦ã®å‰²ã‚Šå½“ã¦ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>No hard disk is selected for <i>%1</i></source> <translation type="obsolete"> <i>%1</i>ã®ãŸã‚ã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒé¸æŠžã•れã¦ã„ãªã„</translation> </message> @@ -10519,7 +10554,7 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<context> <name>VBoxHelpButton</name> <message> - <location filename="../src/VBoxGlobalSettings.cpp" line="257"/> + <location filename="../src/VBoxGlobalSettings.cpp" line="252"/> <source>&Help</source> <translation type="obsolete">ヘルプ(&H)</translation> </message> @@ -10987,628 +11022,638 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation>次回ã‹ã‚‰ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ãªã„</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="434"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="397"/> + <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> + <translation>クラッシュを防ããŸã‚ã€Windows/x64ã§ã¯ä»®æƒ³ãƒžã‚·ãƒ³ã«å«ã¾ã‚Œã‚‹ã™ã¹ã¦ã®ãƒ•ァイルã®å‰Šé™¤ã¯ç¾åœ¨ã§ãã¾ã›ã‚“。ã“ã‚Œã¯æ¬¡å›žã®ãƒªãƒªãƒ¼ã‚¹ã§ä¿®æ£ã•れã¾ã™ã€‚</translation> + </message> + <message> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="442"/> <source>Failed to open <tt>%1</tt>. Make sure your desktop environment can properly handle URLs of this type.</source> <translation><tt>%1</tt>ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸã€‚デスクトップ環境ãŒé©åˆ‡ã«URLを扱ãˆã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="468"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="476"/> <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サーãƒãƒ¼ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚VirtualBoxサーãƒãŒèµ·å‹•ã—ã¦ã„ãªã„ã‹ã€ã¾ãŸã¯èµ·å‹•ã«å¤±æ•—ã—ã¦ã„ã¾ã™ã€‚</p><p>アプリケーションを終了ã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="478"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="486"/> <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> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="514"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="522"/> <source>Failed to set global VirtualBox properties.</source> <translation>ã‚°ãƒãƒ¼ãƒãƒ«ãªVirtualBoxã®ãƒ—ãƒãƒ‘ティã®è¨å®šã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="544"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="552"/> <source>Failed to access the USB subsystem.</source> <translation>USBサブシステムã®ã‚¢ã‚¯ã‚»ã‚¹ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="555"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="563"/> <source>Failed to create a new virtual machine.</source> <translation>æ–°è¦ä»®æƒ³ãƒžã‚·ãƒ³ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="567"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="575"/> <source>Failed to create a new virtual machine <b>%1</b>.</source> <translation>æ–°è¦ä»®æƒ³ãƒžã‚·ãƒ³<b>"%1"</b>ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="577"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="585"/> <source>Failed to open virtual machine located in %1.</source> <translation>仮想マシン<b>"%1"</b>ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="586"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="594"/> <source>Failed to add virtual machine <b>%1</b> located in <i>%2</i> because its already present.</source> <translation>仮想マシン<b>"%1"</b>(<i>"%2"</i>)ã®è¿½åŠ ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã™ã§ã«å˜åœ¨ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="596"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="604"/> <source>Failed to apply the settings to the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®è¨å®šã®é©ç”¨ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="657"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="665"/> <source>Failed to start the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="669"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="677"/> <source>Failed to pause the execution of the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®ä¸€æ™‚åœæ¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="680"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="688"/> <source>Failed to resume the execution of the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®å†é–‹ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="717"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="725"/> <source>Failed to save the state of the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®çŠ¶æ…‹ã®ä¿å˜ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="743"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="751"/> <source>Failed to create a snapshot of the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®ã‚¹ãƒŠãƒƒãƒ—ショット作æˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="767"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="775"/> <source>Failed to stop the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®åœæ¢ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="779"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="787"/> <source>Failed to remove the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®é™¤åŽ»ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="789"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="797"/> <source>Failed to discard the saved state of the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®ä¿å˜ã•れãŸçŠ¶æ…‹ã®ç ´æ£„ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="789"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="797"/> <source>Failed to discard the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source> <translation type="obsolete">仮想マシン<b>"%2"</b>ã®ã‚¹ãƒŠãƒƒãƒ—ショット <b>%1</b> ã®ç ´æ£„ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="789"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="797"/> <source>Failed to discard the current state of the virtual machine <b>%1</b>.</source> <translation type="obsolete">仮想マシン<b>"%1"</b>ã®æœ€æ–°ã®çŠ¶æ…‹ã®ç ´æ£„ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="789"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="797"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="934"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="942"/> <source>There is no virtual machine named <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ãŒã‚りã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="934"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="942"/> <source><p>Are you sure you want to permanently delete the virtual machine <b>%1</b>?</p><p>This operation cannot be undone.</p></source> <translation type="obsolete"><p>仮想マシン<b>"%1"</b>を削除ã—ã¾ã™ã‹ï¼Ÿ</p><p>ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="934"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="942"/> <source><p>Are you sure you want to unregister the inaccessible virtual machine <b>%1</b>?</p><p>You will not be able to register it again from GUI.</p></source> <translation type="obsolete"><p>アクセスã§ããªã„仮想マシン<b>"%1"</b>ã®ç™»éŒ²ã‚’解除ã—ã¾ã™ã‹ï¼Ÿ</p><p>GUIã‹ã‚‰ãれを登録ã—ç›´ã™ã“ã¨ã¯ã§ãã¾ã›ã‚“。</p> </translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source><p>Are you sure you want to discard the saved state of the virtual machine <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><p>仮想マシン<b>"%1"</b>ã®ä¿å˜ã•れãŸçŠ¶æ…‹ã‚’ç ´æ£„ã—ã¾ã™ã‹ï¼Ÿ</p><p>ã“ã®æ“作ã¯ã‚²ã‚¹ãƒˆOSã‚’é©åˆ‡ã«ã‚·ãƒ£ãƒƒãƒˆãƒ€ã‚¦ãƒ³ã›ãšã«ãƒªã‚»ãƒƒãƒˆã¾ãŸã¯é›»æºã‚’オフã«ã™ã‚‹ã“ã¨ã¨åŒç‰ã§ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source><p>Releasing this media image will detach it from the following virtual machine(s): <b>%1</b>.</p><p>Continue?</p></source> <translation type="obsolete"><p>ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’解放ã™ã‚‹ã¨ã€ä»¥ä¸‹ã®ä»®æƒ³ãƒžã‚·ãƒ³ã§ã®å‰²ã‚Šå½“ã¦ãŒè§£é™¤ã•れã¾ã™:<b>%1</b>.</p><p>続行ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source><p>The image file <b>%1</b> already exists. You cannot create a new virtual hard disk that uses this file, because it can be already used by another virtual hard disk.</p><p>Please specify a different image file name.</p></source> <translation type="obsolete"><p>イメージファイル<b>"%1"</b>ã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™ã€‚ä»–ã®ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã§ã“ã®åå‰ãŒä½¿ç”¨ã•れã¦ã„ã‚‹ãŸã‚ã€æ–°è¦ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“。</p><p>別ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ァイルåを指定ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source>Failed to delete the virtual hard disk image <b>%1</b>.</source> <translation type="obsolete">仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸<b>"%1"</b>ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source><p>Do you want to remove (unregister) the virtual hard disk <nobr><b>%1</b>?</nobr></p></source> <translation type="obsolete"><p>仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯<nobr><b>"%1"</b>を除去(登録解除)ã—ã¾ã™ã‹ï¼Ÿ</nobr></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source>Failed to create the virtual hard disk image <nobr><b>%1</b>.</nobr></source> <translation type="obsolete">仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸<nobr><b>"%1"</b>ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source>hard disk</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source>CD/DVD image</source> <translation type="obsolete">CD/DVDイメージ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source>floppy image</source> <translation type="obsolete">フãƒãƒƒãƒ”ーイメージ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source>Failed to register the %1 <nobr><b>%2</b></nobr>.</source> <translation type="obsolete">%1 <nobr><b>%2</b></nobr>ã®ç™»éŒ²ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ </translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1079"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1087"/> <source>Failed to unregister the %1 <nobr><b>%2</b></nobr>.</source> <translation type="obsolete">%1 <nobr><b>%2</b></nobr>ã®ç™»éŒ²è§£é™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1358"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1366"/> <source>Failed to create a new session.</source> <translation>æ–°è¦ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1376"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1384"/> <source>Failed to open a session for the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1376"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1384"/> <source>Failed to determine the accessibility state of the media <nobr><b>%1</b></nobr>. Some of the registered media may become inaccessible.</source> <translation type="obsolete">メディア<nobr><b>"%1"</b></nobr>ã®ã‚¢ã‚¯ã‚»ã‚¹å¯å¦çŠ¶æ…‹ã‚’å–å¾—ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚登録ã•れãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®ã„ãã¤ã‹ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ã‹ã‚‚ã—れã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1376"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1384"/> <source>Failed to create the host network interface <b>%1</b>.</source> <translation type="obsolete">ホスト ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ インターフェース<b>"%1"</b>ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2661"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2677"/> <source>Failed to remove the host network interface <b>%1</b>.</source> <translation>ホスト ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ インターフェース<b>"%1"</b>ã‚’å–り除ã‘ã¾ã›ã‚“ã§ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1428"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1436"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1454"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1462"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2727"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2743"/> <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>"%3"</b>ã®å…±æœ‰ãƒ•ォルダ<b>"%1"</b>(å‚ç…§å…ˆ <nobr><b>%2</b></nobr>)ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2714"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2730"/> <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>仮想マシン<b>"%3"</b>ã®å…±æœ‰ãƒ•ォルダ<b>"%1"</b>(å‚ç…§å…ˆ <nobr><b>%2</b></nobr>)ã®é™¤åŽ»ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2714"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2730"/> <source><p>You have <b>clicked the mouse</b> inside the Virtual Machine display or pressed the <b>host key</b>. This will cause the Virtual Machine to <b>capture</b> the host mouse pointer (only if the mouse pointer integration is not currently supported by the guest OS) and the keyboard, which will make them unavailable to other applications running on your host machine.</p><p>You can press the <b>host key</b> at any time to <b>uncapture</b> the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&nbsp;<img src=hostkey_16px.png/>&nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.</p></source> <translation type="obsolete"><p>仮想マシンã®ç”»é¢ã‚’<b>マウスクリック</b>ã™ã‚‹ã‹ã€ã¾ãŸã¯<b>ホストã‚ー</b>を押ã™ã¨ã€ä»®æƒ³ãƒžã‚·ãƒ³ã¯ãƒžã‚¦ã‚¹ãƒã‚¤ãƒ³ã‚¿(ãƒžã‚¦ã‚¹çµ±åˆæ©Ÿèƒ½ãŒã‚²ã‚¹ãƒˆOSã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã¨ãã ã‘)ã¨ã‚ーボードを<b>ã‚ャプãƒãƒ£</b>ã—ã¾ã™ã€‚仮想マシンã«ã‚ーボードã¨ãƒžã‚¦ã‚¹ãŒã‚ャプãƒãƒ£ã•れるã¨ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã§å‹•作ã™ã‚‹ä»–ã®ã‚¢ãƒ—リケーションã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。</p><p></p><p><b>ホストã‚ー</b>を押ã™ã¨ã€ã‚ーボードã¨ãƒžã‚¦ã‚¹(ã‚ャプãƒãƒ£ã•れã¦ã„ã‚‹ã¨ã)ã¯<b>ã‚ャプãƒãƒ£è§£é™¤</b>ã•れã€é€šå¸¸ã®æ“ä½œã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ç¾åœ¨å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„るホストã‚ーã¯ä»®æƒ³ãƒžã‚·ãƒ³ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ä¸‹éƒ¨ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒãƒ¼ã«&nbsp;<img src=hostkey_16px.png/>&nbsp;アイコンã§è¡¨ç¤ºã•れã¾ã™ã€‚ã“ã®ã‚¢ã‚¤ã‚³ãƒ³ã¯ãƒžã‚¦ã‚¹ã‚¢ã‚¤ã‚³ãƒ³ã¨å…±ã«ç¾åœ¨ã®ã‚ーボ−ドã¨ãƒžã‚¦ã‚¹ã®ã‚ャプãƒãƒ£çŠ¶æ…‹ã‚’è¡¨ç¤ºã—ã¾ã™ã€‚.</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2714"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2730"/> <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 to <b>uncapture</b> the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&nbsp;<img src=hostkey_16px.png/>&nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.</p></source> <translation type="obsolete"><p><b>ã‚ーボードã®è‡ªå‹•ã‚ャプãƒãƒ£</b>æ©Ÿèƒ½ãŒæœ‰åйã§ã™ã€‚仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã®ã¨ãã€ä»®æƒ³ãƒžã‚·ãƒ³ã¯ã‚ーボードを自動的ã«<b>ã‚ャプãƒãƒ£</b>ã—ã¾ã™ã€‚ã‚ーボードãŒã‚ャプãƒãƒ£ã•れるã¨ã€ã™ã¹ã¦ã®ã‚ーストãƒãƒ¼ã‚¯(Alt-Tabãªã©ã‚’å«ã‚€)ãŒä»®æƒ³ãƒžã‚·ãƒ³ã«é€ã‚‰ã‚Œã‚‹ãŸã‚ã€ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã§å‹•作ã™ã‚‹ä»–ã®ã‚¢ãƒ—リケーションã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。</p><p><b>ホストã‚ー</b>を押ã™ã¨ã€ã‚ーボードã¨ãƒžã‚¦ã‚¹(ã‚ャプãƒãƒ£ã•れã¦ã„ã‚‹ã¨ã)ã¯<b>ã‚ャプãƒãƒ£è§£é™¤</b>ã•れã€é€šå¸¸ã®æ“ä½œã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ç¾åœ¨å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„るホストã‚ーã¯ä»®æƒ³ãƒžã‚·ãƒ³ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ä¸‹éƒ¨ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒãƒ¼ã«&nbsp;<img src=hostkey_16px.png/>&nbsp;アイコンã§è¡¨ç¤ºã•れã¾ã™ã€‚ã“ã®ã‚¢ã‚¤ã‚³ãƒ³ã¯ãƒžã‚¦ã‚¹ã‚¢ã‚¤ã‚³ãƒ³ã¨å…±ã«ç¾åœ¨ã®ã‚ーボ−ドã¨ãƒžã‚¦ã‚¹ã®ã‚ャプãƒãƒ£çŠ¶æ…‹ã‚’è¡¨ç¤ºã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2714"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2730"/> <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 status bar will look like&nbsp;<img src=mouse_seamless_16px.png/>&nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.</p><p><b>Note</b>: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.</p></source> <translation type="obsolete"><p>ゲストOSã§<b>マウス統åˆ</b>機能ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚ゲストOSã§ãƒžã‚¦ã‚¹ãƒã‚¤ãƒ³ã‚¿ã‚’<i>ã‚ャプãƒãƒ£</i>ã™ã‚‹ã“ã¨ãªã使用ã§ãã¾ã™ã€‚仮想マシンã®ç”»é¢ä¸Šã«ãƒžã‚¦ã‚¹ãƒã‚¤ãƒ³ã‚¿ãŒã‚ã‚‹ã¨ãã€ã™ã¹ã¦ã®ãƒžã‚¦ã‚¹ã®å‹•作ã¯ç›´æŽ¥ã‚²ã‚¹ãƒˆOSã«é€ã‚‰ã‚Œã¾ã™ã€‚ç¾åœ¨ãƒžã‚¦ã‚¹ãŒã‚ャプãƒãƒ£ã•れã¦ã„ã‚‹ã¨ãã¯ã€è‡ªå‹•çš„ã«ã‚ャプãƒãƒ£è§£é™¤ã•れã¾ã™ã€‚ステータスãƒãƒ¼ã®ãƒžã‚¦ã‚¹ã‚¢ã‚¤ã‚³ãƒ³ã¯ã€ãƒžã‚¦ã‚¹çµ±åˆæ©Ÿèƒ½ãŒã‚²ã‚¹ãƒˆOSã§ã‚µãƒãƒ¼ãƒˆã•れã€ç¾åœ¨æœ‰åйã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚&nbsp;<img src=mouse_seamless_16px.png/>&nbsp;ã®ã‚ˆã†ã«è¡¨ç¤ºã•れã¾ã™ã€‚ </p><p><b>注</b>: ãƒžã‚¦ã‚¹çµ±åˆæ©Ÿèƒ½ãŒæœ‰åйãªã¨ãã€ã„ãã¤ã‹ã®ã‚¢ãƒ—リケーションã®å‹•作ãŒä¸æ£ã«ãªã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。メニューãƒãƒ¼ã‹ã‚‰å¯¾å¿œã™ã‚‹å‹•ä½œã‚’é¸æŠžã—ã¦ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ãƒžã‚¦ã‚¹çµ±åˆæ©Ÿèƒ½ã‚’無効化(ã¾ãŸã¯æœ‰åŠ¹åŒ–)ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1765"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1773"/> <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>ç¾åœ¨ã®ãƒ“デオモードã§ã¯ã‚²ã‚¹ãƒˆOSã§<b>マウス統åˆ</b>機能ãŒã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。ゲストOSã§ãƒžã‚¦ã‚¹ã‚’使用ã™ã‚‹ãŸã‚ã«ã¯ãƒžã‚¦ã‚¹ã‚’ã‚ャプãƒãƒ£(仮想マシンã®ç”»é¢ã‚’クリックã™ã‚‹ã‹ã€ã¾ãŸã¯ãƒ›ã‚¹ãƒˆã‚ーを押ã™)ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1785"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1793"/> <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> <translation><p>仮想マシンã¯ç¾åœ¨<b>"ä¸€æ™‚åœæ¢"</b>状態ã®ãŸã‚ã€ã‚ーボードã¨ãƒžã‚¦ã‚¹æ“作をå—ã‘付ã‘ã¾ã›ã‚“。仮想マシンã§ã®ä½œæ¥ã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã‹ã‚‰å¯¾å¿œã™ã‚‹å‹•ä½œã‚’é¸æŠžã—ã¦ã€ä»®æƒ³ãƒžã‚·ãƒ³ã‚’å†é–‹ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1997"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2014"/> <source><p>Cannot run VirtualBox in <i>VM Selector</i> mode due to local restrictions.</p><p>The application will now terminate.</p></source> <translation><p>ãƒãƒ¼ã‚«ãƒ«ã®åˆ¶é™ã®ãŸã‚〠<i>VM Selector</i>モードã§VirtualBoxを実行ã§ãã¾ã›ã‚“。</p><p>アプリケーションを終了ã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2124"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2141"/> <source>Failed to update Guest Additions. The Guest Additions installation image will be mounted to provide a manual installation.</source> <translation>Guest Additionsã®æ›´æ–°ã«å¤±æ•—ã—ã¾ã—ãŸã€‚Guest Additionsã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚¤ãƒ¡ãƒ¼ã‚¸ã¯æ‰‹å‹•インストールã®ãŸã‚マウントã•れã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2148"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2169"/> <source>Failed to install the Extension Pack <b>%1</b>.</source> <translation>機能拡張パッケージ<b>"%1"</b>ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2156"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2182"/> <source>Failed to uninstall the Extension Pack <b>%1</b>.</source> <translation>機能拡張パッケージ<b>"%1"</b>ã®ã‚¢ãƒ³ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2156"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2182"/> <source>You are about to remove the Extension Pack <b>%1</b>. Are you sure you want to do that?</source> <translation type="obsolete">機能拡張パッケージ<b>"%1"</b>を除去ã—ã¾ã™ã€‚本当ã«é™¤åŽ»ã—ã¾ã™ã‹ï¼Ÿ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2247"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2273"/> <source>&Remove</source> <translation>除去(&R)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2260"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2286"/> <source>The current port forwarding rules are not valid. None of the host or guest port values may be set to zero.</source> <translation>ç¾åœ¨ã®ãƒãƒ¼ãƒˆãƒ•ォワーディングルールã¯ç„¡åйã§ã™ã€‚ ホストã¾ãŸã¯ã‚²ã‚¹ãƒˆãƒãƒ¼ãƒˆã®å€¤ã«ã‚¼ãƒãŒè¨å®šã•れã¦ã„ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2267"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2293"/> <source><p>There are unsaved changes in the port forwarding configuration.</p><p>If you proceed your changes will be discarded.</p></source> <translation><p>ãƒãƒ¼ãƒˆãƒ•ォワーディングè¨å®šã®å¤‰æ›´ãŒä¿å˜ã•れã¦ã„ã¾ã›ã‚“。</p><p>続行ã™ã‚‹ã¨å¤‰æ›´ã¯ç ´æ£„ã•れã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2296"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2322"/> <source><nobr>Fatal Error</nobr></source> <comment>runtime error info</comment> <translation><nobr>致命的ãªã‚¨ãƒ©ãƒ¼</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2302"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2328"/> <source><nobr>Non-Fatal Error</nobr></source> <comment>runtime error info</comment> <translation><nobr>致命的ã§ãªã„エラー</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2308"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2334"/> <source><nobr>Warning</nobr></source> <comment>runtime error info</comment> <translation><nobr>è¦å‘Š</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2325"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2351"/> <source><nobr>Error ID: </nobr></source> <comment>runtime error info</comment> <translation><nobr>エラーID: </nobr></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2327"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2353"/> <source>Severity: </source> <comment>runtime error info</comment> <translation>é‡è¦åº¦:</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2338"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2364"/> <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>仮想マシンã®å®Ÿè¡Œä¸ã«è‡´å‘½çš„ãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ä»®æƒ³ãƒžã‚·ãƒ³ã®é›»æºã‚’オフã«ã—ã¾ã™ã€‚調査ã®ãŸã‚ã«ä»¥ä¸‹ã®ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’クリップボードã«ã‚³ãƒ”ーã—ã¦ä½¿ç”¨ã—ã¦ãã ã•ã„:</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2350"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2376"/> <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> <translation><p>仮想マシンã®å®Ÿè¡Œä¸ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸï¼ã‚¨ãƒ©ãƒ¼ã®è©³ç´°ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚説明ã•れãŸã‚¨ãƒ©ãƒ¼ã‚’ä¿®æ£ã—ã€ä»®æƒ³ãƒžã‚·ãƒ³ã®å†å®Ÿè¡Œã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2359"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2385"/> <source><p>The virtual machine execution may run into an error condition as described below. We suggest that you take an appropriate action to avert the error.</p></source> <translation><p>仮想マシンã®å®Ÿè¡Œä¸ã€ä»¥ä¸‹ã§èª¬æ˜Žã•れるエラーãŒç™ºç”Ÿã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ç„¡è¦–ã§ãã¾ã™ãŒã€å‹•作を確実ã«ã™ã‚‹ãŸã‚ã«ã€èª¬æ˜Žã•れãŸèª¤ã‚Šã‚’対ç–ã™ã‚‹ã“ã¨ãŒæŽ¨å¥¨ã•れã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2541"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2385"/> <source>Sorry, some generic error happens.</source> - <translation>申ã—訳ã‚りã¾ã›ã‚“ã€‚ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚</translation> + <translation type="obsolete">申ã—訳ã‚りã¾ã›ã‚“ã€‚ä¸æ˜Žãªã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2675"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2691"/> <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>)ã®ã€ä»®æƒ³ãƒžã‚·ãƒ³<b>"%3"</b>ã®ã‚¹ãƒãƒƒãƒˆ<i>"%2"</i> ã¸ã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2681"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2697"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2687"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2703"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2861"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2803"/> + <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> + <translation><p>ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã§USB 2.0を有効化ã™ã‚‹ã«ã¯<b><nobr>%1</nobr></b>ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå¿…è¦ã§ã™ã€‚VirtualBoxã®ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã‚µã‚¤ãƒˆã‹ã‚‰æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージをダウンãƒãƒ¼ãƒ‰ã—ã€ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。機能拡張パッケージをインストールã™ã‚‹ã¨ã€USB 2.0を有効化ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ç¾åœ¨ã®è¨å®šã‚’ã‚ャンセルã—ãªã„å ´åˆã€USB 2.0ã¯ç„¡åŠ¹åŒ–ã•れã¾ã™ã€‚</p></translation> + </message> + <message> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2896"/> <source>Result&nbsp;Code: </source> <comment>error info</comment> <translation>終了コード&nbsp;: </translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2867"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2902"/> <source>Component: </source> <comment>error info</comment> <translation>コンãƒãƒ¼ãƒãƒ³ãƒˆ: </translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2875"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2910"/> <source>Interface: </source> <comment>error info</comment> <translation>インターフェース: </translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2884"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2919"/> <source>Callee: </source> <comment>error info</comment> <translation>呼ã³å‡ºã—å…ˆ: </translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2892"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2927"/> <source>Callee&nbsp;RC: </source> <comment>error info</comment> <translation>呼ã³å‡ºã—å…ˆ&nbsp;RC: </translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="443"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="451"/> <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> dialog which you can open from the <b>File</b> menu of the main VirtualBox window, and select one of the existing languages on the <b>Language</b> page.</p></source> <translation><p>言語ファイル<b>"%1"</b>ãŒ<b><nobr>%2</nobr></b>ディレクトリä¸ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。</p><p>言語ã¯ä¸€æ™‚çš„ã«ã‚·ã‚¹ãƒ†ãƒ ã®ãƒ‡ãƒ•ォルト言語ã«è¨å®šã•れã¾ã™ã€‚VirtualBoxメインウィンドウã®<b>[ファイル]</b>メニューã‹ã‚‰<b>[環境è¨å®š]</b>ダイアãƒã‚°ã‚’é–‹ãã€<b>[言語]</b>ページã§è¡¨ç¤ºã•れã¦ã„ã‚‹è¨€èªžã‚’é¸æŠžã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="456"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="464"/> <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> dialog which you can open from the <b>File</b> menu of the main VirtualBox window, and select one of the existing languages on the <b>Language</b> page.</p></source> <translation><p>言語ファイル<b><nobr>"%1"</nobr></b>ãŒèªã¿è¾¼ã‚ã¾ã›ã‚“。</p><p>言語ã¯ä¸€æ™‚çš„ã«English(内蔵)ã«è¨å®šã•れã¾ã™ã€‚VirtualBoxメインウィンドウã®<b>[ファイル]</b>メニューã‹ã‚‰<b>[環境è¨å®š]</b>ダイアãƒã‚°ã‚’é–‹ãã€<b>[言語]</b>ページã§è¡¨ç¤ºã•れã¦ã„ã‚‹è¨€èªžã‚’é¸æŠžã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="456"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="464"/> <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> <translation type="obsolete"><p>ゲストOSã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れãŸVirtualBox Guest Additionsã¯å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™:インストールã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯%1ã§ã™ã€‚期待ã•れるãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯%2ã§ã™ã€‚Guest Additionsã‚’å¿…è¦ã¨ã™ã‚‹ã„ãã¤ã‹ã®æ©Ÿèƒ½(マウス統åˆã€ç”»é¢ã®ãƒªã‚µã‚¤ã‚º)ã¯å‹•作ã—ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。</p><p><b>[デãƒã‚¤ã‚¹]</b>メニューã‹ã‚‰<b>[Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«]</b>ã‚’é¸æŠžã—ã€Guest Additionsを最新版ã«ã‚¢ãƒƒãƒ—デートã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="456"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="464"/> <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> <translation type="obsolete"><p>ゲストOSã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れãŸVirtualBox Guest Additionsã¯å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™:インストールã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯%1ã§ã™ã€‚期待ã•れるãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯%2ã§ã™ã€‚Guest Additionsã‚’å¿…è¦ã¨ã™ã‚‹ã„ãã¤ã‹ã®æ©Ÿèƒ½(マウス統åˆã€ç”»é¢ã®ãƒªã‚µã‚¤ã‚º)ã¯å‹•作ã—ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。</p><p><b>[デãƒã‚¤ã‚¹]</b>メニューã‹ã‚‰<b>[Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«]</b>ã‚’é¸æŠžã—ã€Guest Additionsを最新版ã«ã‚¢ãƒƒãƒ—デートã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="456"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="464"/> <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> <translation type="obsolete"><p>ゲストOSã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れãŸVirtualBox Guest Additionsã¯ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®VirtualBoxより新ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™:インストールã•れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯%1ã§ã™ã€‚期待ã•れるãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯%2ã§ã™ã€‚</p><p>æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®Guest Additionsã®å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®VirtualBoxã§ã®ä½¿ç”¨ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。<p><b>[デãƒã‚¤ã‚¹]</b>メニューã‹ã‚‰<b>[Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«]</b>ã‚’é¸æŠžã—ã€ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®Guest Additionsをインストールã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="456"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="464"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2740"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2756"/> <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>%3</b>ã®å…±æœ‰ãƒ•ォルダ<b>%1</b>(å‚ç…§å…ˆ:<nobr><b>%2</b></nobr>)ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</p><p>ã“ã®å…±æœ‰ãƒ•ォルダを使用ã—ã¦ã„るゲストOSã®ã™ã¹ã¦ã®ãƒ—ãƒã‚°ãƒ©ãƒ を終了ã—ã€å†å®Ÿè¡Œã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1480"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1488"/> <source><p>Could not find the VirtualBox Guest Additions CD image file <nobr><b>%1</b></nobr> or <nobr><b>%2</b>.</nobr></p><p>Do you wish to download this CD image from the Internet?</p></source> <translation><p>VirtualBox Guest Additions CDイメージファイル<nobr><b>%1</b></nobr>ã¾ãŸã¯<nobr><b>%2</b>ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。</nobr></p><p>インターãƒãƒƒãƒˆã‹ã‚‰CDイメージをダウンãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1494"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1502"/> <source><p>Failed to download the VirtualBox Guest Additions CD image from <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p></source> <translation><p><nobr><a href="%1">%2</a>ã‹ã‚‰VirtualBox Guest Additions CDイメージをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。</nobr></p><p>%3</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1513"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1521"/> <source><p>Are you sure you want to download the VirtualBox Guest Additions CD image from <nobr><a href="%1">%2</a></nobr> (size %3 bytes)?</p></source> <translation><p>VirtualBox Guest Additions CDイメージを<nobr><a href="%1">%2</a></nobr> (サイズ %3ãƒã‚¤ãƒˆ)ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1525"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1533"/> <source><p>The VirtualBox Guest Additions CD image has been successfully downloaded from <nobr><a href="%1">%2</a></nobr> and saved locally as <nobr><b>%3</b>.</nobr></p><p>Do you wish to register this CD image and mount it on the virtual CD/DVD drive?</p></source> <translation><p>VirtualBox Guest Additions CDイメージを<nobr><a href="%1">%2</a></nobr>ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã€<nobr><b>%3</b>ã«ä¿å˜ã—ã¾ã—ãŸã€‚</nobr></p><p>CDイメージを登録ã—ã€ä»®æƒ³CD/DVDドライブã«ãƒžã‚¦ãƒ³ãƒˆã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1525"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1533"/> <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>%1</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 type="obsolete"><p>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’"フルスクリーン"モードã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚<b>%1</b>ã‚ーを押ã™ã¨ã„ã¤ã§ã‚‚ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ¢ãƒ¼ãƒ‰ã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚注:ホストã‚ーã¯ç¾åœ¨<b>%2</b>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p> 注:フルスクリーンモードã§ã¯ãƒ¡ã‚¤ãƒ³ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。メニューãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ <b>Host+Home</b>ã‚ーを押ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1525"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1533"/> <source><p>The virtual machine window will be now switched to <b>Seamless</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>%1</b>.</p><p>Note that the main menu bar is hidden in seamless mode. You can access it by pressing <b>Host+Home</b>.</p></source> <translation type="obsolete"><p>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’"シームレス"モードã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚<b>%1</b>ã‚ーを押ã™ã¨ã„ã¤ã§ã‚‚ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦è¡¨ç¤ºã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚注:ホストã‚ーã¯ç¾åœ¨<b>%2</b>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p>注:シームレスモードã§ã¯ãƒ¡ã‚¤ãƒ³ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。メニューãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ <b>Host+Home</b>ã‚ーを押ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2764"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2780"/> <source><p>The virtual machine window is optimized to work in <b>%1&nbsp;bit</b> color mode but the virtual display is currently set to <b>%2&nbsp;bit</b>.</p><p>Please open the display properties dialog of the guest OS and select a <b>%3&nbsp;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 OS/2, may actually work in 32&nbsp;bit mode but report it as 24&nbsp;bit (16 million colors). You may try to select a different color mode to see if this message disappears or you can simply disable the message now if you are sure the required color mode (%4&nbsp;bit) is not available in the guest OS.</p></source> <translation><p>仮想マシンウィンドウã¯<b>%1&nbsp;ビット</b>ã‚«ãƒ©ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã«æœ€é©åŒ–ã•れã¾ã™ãŒã€ç¾åœ¨ä»®æƒ³ãƒ‡ã‚£ã‚¹ãƒ—レイã¯<b>%2&nbsp;ビット</b>ã«è¨å®šã•れã¦ã„ã¾ã™ã€‚</p><p>最良ã®ä»®æƒ³ãƒ“デオサブシステム性能を得るãŸã‚ã€åˆ©ç”¨å¯èƒ½ã§ã‚ã‚‹ãªã‚‰ã°ã‚²ã‚¹ãƒˆOSã®ç”»é¢è¨å®šãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’é–‹ãã€<b>%3&nbsp;ビット</b>ã‚«ãƒ©ãƒ¼ãƒ¢ãƒ¼ãƒ‰ã‚’é¸æŠžã—ã¦ãã ã•ã„。</p><p><b>注:OS/2ãªã©ã€ã„ãã¤ã‹ã®ã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã¯32&nbsp;ビットモードã®å‹•作を24&nbsp;ビット(ç´„1600万色)ã¨ã—ã¦å ±å‘Šã—ã¾ã™ã€‚ ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ¶ˆãˆã‚‹ã‹ã€ã¾ãŸã¯ã‚²ã‚¹ãƒˆOSã§å¿…è¦ãªè‰²æ·±åº¦(%4&nbsp;ビット) ãŒåˆ©ç”¨ã§ããªã„ã“ã¨ãŒåˆ†ã‹ã£ã¦ã„ã‚‹ãªã‚‰ã°ã€å˜ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’無効ã«ã§ãã‚‹ã‹ç¢ºèªã™ã‚‹ãŸã‚ã«ç•°ãªã£ãŸè‰²æ·±åº¦ã‚’é¸æŠžã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2764"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2780"/> <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> directory, as well as a description of what you were doing when this error happened. Note that you can also access the above files by selecting <b>Show Log</b> from the <b>Machine</b> menu of the main VirualBox window.</p><p>Press <b>OK</b> if you want to power off the machine or press <b>Ignore</b> if you want to leave it as is for debugging. Please note that debugging requires special knowledge and tools, so it is recommended to press <b>OK</b> now.</p></source> <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>)ã‚’æä¾›ã—ã¦ãã ã•ã„。注:VirualBoxメインウィンドウã®<b>[仮想マシン]</b>メニューã‹ã‚‰[ãƒã‚°ã‚’å‚ç…§]ã‚’é¸æŠžã—ã¦ã€ä¸Šè¨˜ãƒ•ァイルã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p><p>仮想マシンを電æºã‚ªãƒ•ã™ã‚‹ã«ã¯<b>[OK]</b>ボタンをクリックã—ã¦ãã ã•ã„。ã“ã®ã¾ã¾ãƒ‡ãƒãƒƒã‚°ã‚’行ã†ã«ã¯<b>[無視]</b>ボタンをクリックã—ã¦ãã ã•ã„。デãƒãƒƒã‚°ã«ã¯ç‰¹åˆ¥ãªçŸ¥è˜ã¨ãƒ„ールを必è¦ã¨ã™ã‚‹ãŸã‚ã€<b>[OK]</b>ボタンをクリックã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1981"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1998"/> <source><p>You didn't attach a hard disk to the new virtual machine. The machine will not be able to boot unless you attach a hard disk with a guest operating system or some other bootable media to it later using the machine settings dialog or the First Run Wizard.</p><p>Do you wish to continue?</p></source> <translation><p>æ–°è¦ä»®æƒ³ãƒžã‚·ãƒ³ã«ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã›ã‚“。仮想マシンè¨å®šãƒ€ã‚¤ã‚¢ãƒã‚°ã‹åˆå›žèµ·å‹•ウィザードを使用ã—ã¦ã‚²ã‚¹ãƒˆOSをインストールã—ãŸãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¾ãŸã¯ä»–ã®èµ·å‹•å¯èƒ½ãªãƒ¡ãƒ‡ã‚£ã‚¢ã‚’割り当ã¦ãªã„ã¨ä»®æƒ³ãƒžã‚·ãƒ³ã¯èµ·å‹•ã—ã¾ã›ã‚“。</p><p>続行ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="414"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="422"/> <source>Failed to find license files in <nobr><b>%1</b></nobr>.</source> <translation><nobr><b>"%1"</b></nobr>ã«ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãƒ•ァイルãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="425"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="433"/> <source>Failed to open the license file <nobr><b>%1</b></nobr>. Check file permissions.</source> <translation>ライセンスファイル<nobr><b>"%1"</b></nobr>ãŒé–‹ã‘ã¾ã›ã‚“。ファイルã®ãƒ‘ーミッションを確èªã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="691"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="699"/> <source>Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>.</source> <translation>仮想マシン<b>"%1"</b>ã¸ã®é›»æºãƒœã‚¿ãƒ³ オフã®ACPIイベントé€ä¿¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="691"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="699"/> <source><p>Failed to connect to the VirtualBox online registration service.</p><p>%1</p></source> <translation type="obsolete"><p>VirtualBox オンライン登録サービスã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚</p><p>%1</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1608"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1616"/> <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><p>VirtualBox ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ç™»éŒ²ãŒå®Œäº†ã—ã¾ã—ãŸã€‚</p><p>ç™»éŒ²ãƒ•ã‚©ãƒ¼ãƒ ã«æ›¸ã込む時間を割ã„ã¦ãã ã•りã€ã‚りãŒã¨ã†ã”ã–ã„ã¾ã—ãŸï¼</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1608"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1616"/> <source><p>Failed to register the VirtualBox product</p><p>%1</p></source> <translation type="obsolete"><p>VirtualBox ã®è£½å“登録ã«å¤±æ•—ã—ã¾ã—ãŸ</p><p>%1</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1608"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1616"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="490"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="498"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="504"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="512"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="609"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="617"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="631"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="639"/> <source>Failed to load the settings of the virtual machine <b>%1</b> from <b><nobr>%2</nobr></b>.</source> <translation>仮想マシン<b>"%1"</b>ã®è¨å®šã®<b><nobr>"%2â€</nobr></b>ã‹ã‚‰ã®èªã¿è¾¼ã¿ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="631"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="639"/> <source>Delete</source> <comment>machine</comment> <translation type="obsolete">削除</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="631"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="639"/> <source>Unregister</source> <comment>machine</comment> <translation type="obsolete">登録解除</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source>Discard</source> <comment>saved state</comment> <translation>ç ´æ£„</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source>Continue</source> <comment>detach image</comment> <translation type="obsolete">ç¶šã‘ã‚‹</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source><p>Do you want to delete this hard disk's image file <nobr><b>%1</b>?</nobr></p><p>If you select <b>Delete</b> then the image file will be permanently deleted after unregistering the hard disk. This operation cannot be undone.</p><p>If you select <b>Unregister</b> then the virtual hard disk will be unregistered and removed from the collection, but the image file will be left on your physical disk.</p></source> <translation type="obsolete"><p>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ァイル<nobr><b>"%1"</b>を削除ã—ã¾ã™ã‹ï¼Ÿ</nobr></p> <p><b>[削除]</b>ã‚’é¸æŠžã™ã‚‹ã¨ã€ã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ァイルã¯ãƒªã‚¹ãƒˆã‹ã‚‰å–り除ã‹ã‚ŒãŸå¾Œã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¾ã™ã€‚ã“ã®æ“作ã¯å…ƒã«æˆ»ã›ã¾ã›ã‚“。</p> <p><b>[登録解除]</b>ã‚’é¸æŠžã™ã‚‹ã¨ã€ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¯ãƒªã‚¹ãƒˆã‹ã‚‰å–り除ã‹ã‚Œã¾ã™ãŒã€ã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ•ァイルã¯ç‰©ç†ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã«æ®‹ã•れã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source>Delete</source> <comment>hard disk</comment> <translation type="obsolete">削除</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source>Unregister</source> <comment>hard disk</comment> <translation type="obsolete">登録解除</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source><p>There are hard disks attached to SATA ports of this virtual machine. If you disable the SATA controller, all these hard disks will be automatically detached.</p><p>Are you sure that you want to disable the SATA controller?</p></source> <translation type="obsolete"><p>ã“ã®ä»®æƒ³ãƒžã‚·ãƒ³ã®SATAãƒãƒ¼ãƒˆã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒã‚りã¾ã™ã€‚SATA コントãƒãƒ¼ãƒ©ã‚’無効ã«ã™ã‚‹ã¨ã€ãれらã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¯è‡ªå‹•çš„ã«å‰²ã‚Šå½“ã¦è§£é™¤ã•れã¾ã™ã€‚</p> <p>SATA コントãƒãƒ¼ãƒ©ã‚’無効ã«ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source>Disable</source> <comment>hard disk</comment> <translation type="obsolete">無効</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source>Failed to attach a hard disk image with UUID %1 to device slot %2 on channel %3 of the %4 bus of the machine <b>%5</b>.</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸(UUID %1)ã®ã€ä»®æƒ³ãƒžã‚·ãƒ³<b>"%5"</b>ã®ãƒã‚¹ %4 ã®ãƒãƒ£ãƒ³ãƒãƒ« %3 ã®ãƒ‡ãƒã‚¤ã‚¹ã‚¹ãƒãƒƒãƒˆ %2 ã¸ã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1086"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1094"/> <source>Failed to detach a hard disk image from device slot %1 on channel %2 of the %3 bus of the machine <b>%4</b>.</source> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸ã®ã€ä»®æƒ³ãƒžã‚·ãƒ³<b>"%4"</b>ã®ãƒã‚¹ %3 ã®ãƒãƒ£ãƒ³ãƒãƒ« %2 ã®ãƒ‡ãƒã‚¤ã‚¹ã‚¹ãƒãƒƒãƒˆ %1 ã‹ã‚‰ã®å‰²ã‚Šå½“ã¦è§£é™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1555"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1563"/> <source>Download</source> <comment>additions</comment> <translation>ダウンãƒãƒ¼ãƒ‰</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1533"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1541"/> <source>Mount</source> <comment>additions</comment> <translation>マウント</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1710"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1718"/> <source><p>The host key is currently defined as <b>%1</b>.</p></source> <comment>additional message box paragraph</comment> <translation><p>ç¾åœ¨ãƒ›ã‚¹ãƒˆã‚ーã¯<b>%1</b>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1684"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1692"/> <source>Capture</source> <comment>do input capture</comment> <translation>ã‚ャプãƒãƒ£</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1684"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1692"/> <source><p>One or more of the registered virtual hard disks, CD/DVD or floppy media are not currently accessible. As a result, you will not be able to operate virtual machines that use these media until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Disk Manager window and see what media are inaccessible, or press <b>Ignore</b> to ignore this message.</p></source> <translation type="obsolete"><p>登録ã•れãŸä¸€ã¤ä»¥ä¸Šã®ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã€CD/DVDã¾ãŸã¯ãƒ•ãƒãƒƒãƒ”ーメディアã®ã«ç¾åœ¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。アクセスå¯èƒ½ã«ãªã‚‹ã¾ã§ã“れらã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’使用ã™ã‚‹ä»®æƒ³ãƒžã‚·ãƒ³ã‚’æ“作ã§ãã¾ã›ã‚“。</p> <p><b>[確èª]</b>ボタンをクリックã—ã¦ä»®æƒ³ãƒ‡ã‚£ã‚¹ã‚¯ãƒžãƒãƒ¼ã‚¸ãƒ£ã‚’èµ·å‹•ã—ã€ã©ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ã®ã‹ç¢ºèªã—ã¦ãã ã•ã„。ã¾ãŸã¯<b>[無視]</b>ボタンをクリックã—ã¦ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’無視ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1811"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1819"/> <source>Check</source> <comment>inaccessible media message box</comment> <translation>確èª</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1811"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1819"/> <source><p>The following VirtualBox settings files have been automatically converted to the new settings file format version <b>%1</b>.</p><p>However, the results of the conversion were not saved back to disk yet. Please press:</p><ul><li><b>Save</b> to save all auto-converted files now (it will not be possible to use these settings files with an older version of VirtualBox in the future);</li><li><b>Backup</b> to create backup copies of the settings files in the old format before saving them in the new format;</li><li><b>Cancel</b> to not save the auto-converted settings files now.<li></ul><p>Note that if you select <b>Cancel</b>, the auto-converted settings files will be implicitly saved in the new format anyway once you change a setting or start a virtual machine, but <b>no</b> backup copies will be created in this case.</p></source> <translation type="obsolete"><p>次ã®VirtualBoxè¨å®šãƒ•ァイルã¯è‡ªå‹•çš„ã«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ <b>%1</b> ã®æ–°ã—ã„è¨å®šãƒ•ァイル形å¼ã«å¤‰æ›ã•れã¾ã—ãŸã€‚</p> <p>ã—ã‹ã—ãªãŒã‚‰ã€å¤‰æ›å¾Œã®ãƒ•ァイルã¯ã¾ã ディスクã«ä¿å˜ã•れã¦ã„ã¾ã›ã‚“。ボタンをクリックã—ã¦ãã ã•ã„:</p> @@ -11618,403 +11663,403 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<p>注:<b>[ã‚ャンセル]</b> ã®é¸æŠžæ™‚ã€è¨å®šã‚’変更ã™ã‚‹ã‹ä»®æƒ³ãƒžã‚·ãƒ³ã‚’èµ·å‹•ã™ã‚‹ã¨è‡ªå‹•変æ›ã•れãŸè¨å®šãƒ•ã‚¡ã‚¤ãƒ«ã¯æš—黙的ã«ä¿å˜ã•れã¾ã™ãŒã€ã“ã®å ´åˆã©ã‚“ãªãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—コピーも<b>作æˆã•れã¾ã›ã‚“</b>。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1811"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1819"/> <source>&Save</source> <comment>warnAboutAutoConvertedSettings message box</comment> <translation type="obsolete">ä¿å˜(&S)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1811"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1819"/> <source>&Backup</source> <comment>warnAboutAutoConvertedSettings message box</comment> <translation type="obsolete">ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—(&B)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1811"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1819"/> <source>Cancel</source> <comment>warnAboutAutoConvertedSettings message box</comment> <translation type="obsolete">ã‚ャンセル</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1882"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1890"/> <source>Switch</source> <comment>fullscreen</comment> <translation>切り替ãˆ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1902"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1910"/> <source>Switch</source> <comment>seamless</comment> <translation>切り替ãˆ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1967"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1975"/> <source><p>Do you really want to reset the virtual machine?</p><p>This will cause any unsaved data in applications running inside it to be lost.</p></source> <translation><p>仮想マシンを本当ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™ã‹ï¼Ÿ</p><p>仮想マシンをリセットã™ã‚‹ã¨ã€ãã®ä¸ã§ç¨¼å‹•ä¸ã®ã™ã¹ã¦ã®ã‚¢ãƒ—リケーションã®ä¿å˜ã•れã¦ã„ãªã„データã¯å¤±ã‚れã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1971"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1979"/> <source>Reset</source> <comment>machine</comment> <translation>リセット</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1990"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2007"/> <source>Continue</source> <comment>no hard disk attached</comment> <translation>ç¶šã‘ã‚‹</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1991"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2008"/> <source>Go Back</source> <comment>no hard disk attached</comment> <translation>戻る</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1991"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2008"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1991"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2008"/> <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 Disk Manager</i>.</p></source> <translation type="obsolete"><p>æ–°è¦ã®å‰²ã‚Šå½“ã¦ã«åˆ©ç”¨ã§ãる未使用ã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒã‚りã¾ã›ã‚“。</p> <p><b>[作æˆ]</b>ボタンをクリックã—ã€<i>æ–°è¦ä»®æƒ³ãƒ‡ã‚£ã‚¹ã‚¯ä½œæˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰</i>ã‚’èµ·å‹•ã—ã¦æ–°è¦ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã‹ã€<b>[é¸æŠž]</b>ボタンをクリックã—ã¦ã€<i>仮想ディスクマãƒãƒ¼ã‚¸ãƒ£</i>ã‚’é–‹ãã€å‹•ä½œã‚’é¸æŠžã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1991"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2008"/> <source>&Create</source> <comment>hard disk</comment> <translation type="obsolete">作æˆ(&C)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1991"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2008"/> <source>Select</source> <comment>hard disk</comment> <translation type="obsolete">é¸æŠž</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="946"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="954"/> <source><p>Could not enter seamless mode due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p></source> <translation><p>ゲストOSã®ãƒ“デオメモリä¸è¶³ã®ãŸã‚ã€ã‚·ãƒ¼ãƒ レスモードã«åˆ‡ã‚Šæ›¿ãˆã§ãã¾ã›ã‚“。</p><p>仮想マシンã®è¨å®šã§ãƒ“デオメモリを <b>%1</b>以上ã«è¨å®šã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="959"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="967"/> <source><p>Could not switch the guest display to fullscreen mode due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p><p>Press <b>Ignore</b> to switch to fullscreen mode anyway or press <b>Cancel</b> to cancel the operation.</p></source> <translation><p>ゲストOSã®ãƒ“デオメモリä¸è¶³ã®ãŸã‚ã€ã‚²ã‚¹ãƒˆç”»é¢ã‚’フルスクリーンモードã«åˆ‡ã‚Šæ›¿ãˆã§ãã¾ã›ã‚“。</p><p>仮想マシンã®è¨å®šã§ãƒ“デオメモリを <b>%1</b>以上ã«è¨å®šã—ã¦ãã ã•ã„。</p><p><b>[無視]</b>ボタンをクリックã—ã¦ãƒ•ルスクリーンモードã«åˆ‡ã‚Šæ›ãˆã‚‹ã‹ã€<b>[ã‚ャンセル]</b>ボタンをクリックã—ã¦æ“作をå–り消ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="959"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="967"/> <source><p>Unable to obtain the new version information due to the following network error:</p><p><b>%1</b></p></source> <translation type="obsolete"><p>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ã®ãŸã‚ã€æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±ã‚’å–å¾—ã§ãã¾ã›ã‚“:</p><p><b>%1</b></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1650"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1658"/> <source>You are already running the most recent version of VirtualBox.</source> <translation>最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®VirtualBoxãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã™ã€‚ 後ã§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç¢ºèªã‚’行ã£ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1662"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1670"/> <source><p>You have <b>clicked the mouse</b> inside the Virtual Machine display or pressed the <b>host key</b>. This will cause the Virtual Machine to <b>capture</b> the host mouse pointer (only if the mouse pointer integration is not currently supported by the guest OS) and the keyboard, which will make them unavailable to other applications running on your host machine.</p><p>You can press the <b>host key</b> at any time to <b>uncapture</b> the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&nbsp;<img src=:/hostkey_16px.png/>&nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.</p></source> <translation><p>仮想マシンã®ç”»é¢ã‚’<b>マウスクリック</b>ã™ã‚‹ã‹ã€ã¾ãŸã¯<b>ホストã‚ー</b>を押ã™ã¨ã€ä»®æƒ³ãƒžã‚·ãƒ³ã¯ãƒžã‚¦ã‚¹ãƒã‚¤ãƒ³ã‚¿(ãƒžã‚¦ã‚¹çµ±åˆæ©Ÿèƒ½ãŒã‚²ã‚¹ãƒˆOSã§ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã¨ãã ã‘)ã¨ã‚ーボードを<b>ã‚ャプãƒãƒ£</b>ã—ã¾ã™ã€‚仮想マシンã«ã‚ーボードã¨ãƒžã‚¦ã‚¹ãŒã‚ャプãƒãƒ£ã•れるã¨ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã§å‹•作ã™ã‚‹ä»–ã®ã‚¢ãƒ—リケーションã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。</p><p></p><p><b>ホストã‚ー</b>を押ã™ã¨ã€ã‚ーボードã¨ãƒžã‚¦ã‚¹(ã‚ャプãƒãƒ£ã•れã¦ã„ã‚‹ã¨ã)ã¯<b>ã‚ャプãƒãƒ£è§£é™¤</b>ã•れã€é€šå¸¸ã®æ“ä½œã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ç¾åœ¨å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„るホストã‚ーã¯ä»®æƒ³ãƒžã‚·ãƒ³ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ä¸‹éƒ¨ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒãƒ¼ã«&nbsp;<img src=:/hostkey_16px.png/>&nbsp;アイコンã§è¡¨ç¤ºã•れã¾ã™ã€‚ã“ã®ã‚¢ã‚¤ã‚³ãƒ³ã¯ãƒžã‚¦ã‚¹ã‚¢ã‚¤ã‚³ãƒ³ã¨å…±ã«ç¾åœ¨ã®ã‚ーボ−ドã¨ãƒžã‚¦ã‚¹ã®ã‚ャプãƒãƒ£çŠ¶æ…‹ã‚’è¡¨ç¤ºã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1695"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1703"/> <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 to <b>uncapture</b> the keyboard and mouse (if it is captured) and return them to normal operation. The currently assigned host key is shown on the status bar at the bottom of the Virtual Machine window, next to the&nbsp;<img src=:/hostkey_16px.png/>&nbsp;icon. This icon, together with the mouse icon placed nearby, indicate the current keyboard and mouse capture state.</p></source> <translation><p><b>ã‚ーボードã®è‡ªå‹•ã‚ャプãƒãƒ£</b>æ©Ÿèƒ½ãŒæœ‰åйã§ã™ã€‚仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã®ã¨ãã€ä»®æƒ³ãƒžã‚·ãƒ³ã¯ã‚ーボードを自動的ã«<b>ã‚ャプãƒãƒ£</b>ã—ã¾ã™ã€‚ã‚ーボードãŒã‚ャプãƒãƒ£ã•れるã¨ã€ã™ã¹ã¦ã®ã‚ーストãƒãƒ¼ã‚¯(Alt-Tabãªã©ã‚’å«ã‚€)ãŒä»®æƒ³ãƒžã‚·ãƒ³ã«é€ã‚‰ã‚Œã‚‹ãŸã‚ã€ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã§å‹•作ã™ã‚‹ä»–ã®ã‚¢ãƒ—リケーションã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。</p><p><b>ホストã‚ー</b>を押ã™ã¨ã€ã‚ーボードã¨ãƒžã‚¦ã‚¹(ã‚ャプãƒãƒ£ã•れã¦ã„ã‚‹ã¨ã)ã¯<b>ã‚ャプãƒãƒ£è§£é™¤</b>ã•れã€é€šå¸¸ã®æ“ä½œã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ç¾åœ¨å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„るホストã‚ーã¯ä»®æƒ³ãƒžã‚·ãƒ³ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ä¸‹éƒ¨ã®ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ãƒãƒ¼ã«&nbsp;<img src=:/hostkey_16px.png/>&nbsp;アイコンã§è¡¨ç¤ºã•れã¾ã™ã€‚ã“ã®ã‚¢ã‚¤ã‚³ãƒ³ã¯ãƒžã‚¦ã‚¹ã‚¢ã‚¤ã‚³ãƒ³ã¨å…±ã«ç¾åœ¨ã®ã‚ーボ−ドã¨ãƒžã‚¦ã‚¹ã®ã‚ャプãƒãƒ£çŠ¶æ…‹ã‚’è¡¨ç¤ºã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1741"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1749"/> <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 status bar will look like&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;to inform you that mouse pointer integration is supported by the guest OS and is currently turned on.</p><p><b>Note</b>: Some applications may behave incorrectly in mouse pointer integration mode. You can always disable it for the current session (and enable it again) by selecting the corresponding action from the menu bar.</p></source> <translation><p>ゲストOSã§<b>マウス統åˆ</b>機能ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚ゲストOSã§ãƒžã‚¦ã‚¹ãƒã‚¤ãƒ³ã‚¿ã‚’<i>ã‚ャプãƒãƒ£</i>ã™ã‚‹ã“ã¨ãªã使用ã§ãã¾ã™ã€‚仮想マシンã®ç”»é¢ä¸Šã«ãƒžã‚¦ã‚¹ãƒã‚¤ãƒ³ã‚¿ãŒã‚ã‚‹ã¨ãã€ã™ã¹ã¦ã®ãƒžã‚¦ã‚¹ã®å‹•作ã¯ç›´æŽ¥ã‚²ã‚¹ãƒˆOSã«é€ã‚‰ã‚Œã¾ã™ã€‚ç¾åœ¨ãƒžã‚¦ã‚¹ãŒã‚ャプãƒãƒ£ã•れã¦ã„ã‚‹ã¨ãã¯ã€è‡ªå‹•çš„ã«ã‚ャプãƒãƒ£è§£é™¤ã•れã¾ã™ã€‚ステータスãƒãƒ¼ã®ãƒžã‚¦ã‚¹ã‚¢ã‚¤ã‚³ãƒ³ã¯ã€ãƒžã‚¦ã‚¹çµ±åˆæ©Ÿèƒ½ãŒã‚²ã‚¹ãƒˆOSã§ã‚µãƒãƒ¼ãƒˆã•れã€ç¾åœ¨æœ‰åйã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãŸã‚&nbsp;<img src=:/mouse_seamless_16px.png/>&nbsp;ã®ã‚ˆã†ã«è¡¨ç¤ºã•れã¾ã™ã€‚ </p><p><b>注</b>: ãƒžã‚¦ã‚¹çµ±åˆæ©Ÿèƒ½ãŒæœ‰åйãªã¨ãã€ã„ãã¤ã‹ã®ã‚¢ãƒ—リケーションã®å‹•作ãŒä¸æ£ã«ãªã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。メニューãƒãƒ¼ã‹ã‚‰å¯¾å¿œã™ã‚‹å‹•ä½œã‚’é¸æŠžã—ã¦ç¾åœ¨ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã®ãƒžã‚¦ã‚¹çµ±åˆæ©Ÿèƒ½ã‚’無効化(ã¾ãŸã¯æœ‰åŠ¹åŒ–)ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1741"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1749"/> <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> <translation type="obsolete"><p>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’"フルスクリーン"モードã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚<b>%1</b>ã‚ーを押ã™ã¨ã„ã¤ã§ã‚‚ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ¢ãƒ¼ãƒ‰ã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚注:ホストã‚ーã¯ç¾åœ¨<b>%2</b>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p>注:フルスクリーンモードã§ã¯ãƒ¡ã‚¤ãƒ³ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。メニューãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ <b>Host+Home</b>ã‚ーを押ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1741"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1749"/> <source><p>The virtual machine window will be now switched to <b>Seamless</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 seamless mode. You can access it by pressing <b>Host+Home</b>.</p></source> <translation type="obsolete"><p>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’"シームレス"モードã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚<b>%1</b>ã‚ーを押ã™ã¨ã„ã¤ã§ã‚‚ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦è¡¨ç¤ºã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚注:ホストã‚ーã¯ç¾åœ¨<b>%2</b>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p>注:シームレスモードã§ã¯ãƒ¡ã‚¤ãƒ³ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。メニューãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ <b>Host+Home</b>ã‚ーを押ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="916"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="911"/> <source>&Contents...</source> <translation>ヘルプを表示(&C)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="917"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="912"/> <source>Show the online help contents</source> <translation>オンラインヘルプを表示</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="938"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="933"/> <source>&VirtualBox Web Site...</source> <translation>VirtualBox Webサイト(&V)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="939"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="934"/> <source>Open the browser and go to the VirtualBox product web site</source> <translation>Webブラウザã§VirtualBox製å“ã®Webサイトを開ã</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="960"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="955"/> <source>&Reset All Warnings</source> <translation>ã™ã¹ã¦ã®è¦å‘Šã‚’リセット(&R)</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="961"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="956"/> <source>Go back to showing all suppressed warnings and messages</source> <translation>ã™ã¹ã¦ã®æŠ‘æ¢ã•れãŸè¦å‘Šã¨ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å†åº¦è¡¨ç¤ºã•ã›ã‚‹</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="985"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="980"/> <source>R&egister VirtualBox...</source> <translation>VirtualBox を登録(&E)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="986"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="981"/> <source>Open VirtualBox registration form</source> <translation>VirtualBox 登録フォームを開ã</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="1009"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="1004"/> <source>C&heck for Updates...</source> <translation>アップデートを確èª(&H)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="1010"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="1005"/> <source>Check for a new VirtualBox version</source> <translation>VirtualBoxã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’確èª</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="1032"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="1027"/> <source>&About VirtualBox...</source> <translation>VirtualBox ã«ã¤ã„ã¦(&A)...</translation> </message> <message> - <location filename="../src/runtime/UIActionsPool.cpp" line="1033"/> + <location filename="../src/runtime/UIActionsPool.cpp" line="1028"/> <source>Show a dialog with product information</source> <translation>è£½å“æƒ…å ±ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1632"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1640"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1096"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1104"/> <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> <translation><p>"%1 <nobr><b>%2</b></nobr>"を解放ã—ã¾ã™ã‹ï¼Ÿ</p><p>以下ã®ä»®æƒ³ãƒžã‚·ãƒ³ã‹ã‚‰è§£æ”¾ã•れã¾ã™: <b>%3</b></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1039"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1047"/> <source><p>You are about to remove the virtual machine <b>%1</b> from the machine list.</p><p>Would you like to delete the files containing the virtual machine from your hard disk as well?</p></source> <translation><p>仮想マシン<b>"%1"</b>をリストã‹ã‚‰é™¤åŽ»ã—ã¾ã™ã€‚</p><p>仮想マシンを構æˆã™ã‚‹ãƒ•ァイルをãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1042"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1050"/> <source><p>You are about to remove the virtual machine <b>%1</b> from the machine list.</p><p>Would you like to delete the files containing the virtual machine from your hard disk as well? Doing this will also remove the files containing the machine's virtual hard disks if they are not in use by another machine.</p></source> <translation><p>仮想マシン<b>"%1"</b>をリストã‹ã‚‰é™¤åŽ»ã—ã¾ã™ã€‚</p><p>仮想マシンを構æˆã™ã‚‹ãƒ•ァイルをãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿä»–ã®ä»®æƒ³ãƒžã‚·ãƒ³ã§ä½¿ç”¨ã•れã¦ã„ãªã„仮想ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¯å‰Šé™¤ã•れã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1054"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1062"/> <source>Delete all files</source> <translation>ã™ã¹ã¦ã®ãƒ•ァイルを削除</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1055"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1063"/> <source>Remove only</source> <translation>除去ã®ã¿</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1062"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1070"/> <source>You are about to remove the inaccessible virtual machine <b>%1</b> from the machine list. Do you wish to proceed?</source> <translation>アクセスã§ããªã„仮想マシン<b>"%1"</b>をリストã‹ã‚‰é™¤åŽ»ã—ã¾ã™ã€‚続行ã—ã¾ã™ã‹ï¼Ÿ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1072"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1080"/> <source>Remove</source> <translation>除去</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1104"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1112"/> <source>Release</source> <comment>detach medium</comment> <translation>解放</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1113"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1121"/> <source><p>Are you sure you want to remove the %1 <nobr><b>%2</b></nobr> from the list of known media?</p></source> <translation><p>メディアã®ãƒªã‚¹ãƒˆã‹ã‚‰"%1 <nobr><b>%2</b></nobr>"を除去ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1123"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1131"/> <source>Note that as this hard disk is inaccessible its storage unit cannot be deleted right now.</source> <translation>注:ã“ã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ããªã„ãŸã‚ã€ç¾åœ¨ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸ 装置を削除ã§ãã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1127"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1135"/> <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>次ã®ãƒ€ã‚¤ã‚¢ãƒã‚°ã§ã€ã“ã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸è£…置を削除ã™ã‚‹ã‹ã€å¾Œã§ä½¿ç”¨ã™ã‚‹ãŸã‚ä¿æŒã™ã‚‹ã‹ã‚’é¸æŠžã§ãã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1127"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1135"/> <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> <translation type="obsolete"><p>注:ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸è£…ç½®ã¯å‰Šé™¤ã•れã¾ã›ã‚“。後ã§ãƒªã‚¹ãƒˆã«å†åº¦è¿½åŠ ã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1138"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1146"/> <source>Remove</source> <comment>medium</comment> <translation>除去</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1145"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1153"/> <source><p>The hard disk storage unit at location <b>%1</b> already exists. You cannot create a new virtual hard disk that uses this location because it can be already used by another virtual hard disk.</p><p>Please specify a different location.</p></source> <translation><p>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ ストレージ装置ã®å ´æ‰€ <b>"%1"</b>ã¯ã™ã§ã«å˜åœ¨ã—ã¾ã™ã€‚別ã®ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒä½¿ç”¨ã—ã¦ã„ã‚‹ãŸã‚ã€ã“ã®å ´æ‰€ã«æ–°è¦ä»®æƒ³ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚’作æˆã§ãã¾ã›ã‚“。</p><p>別ã®å ´æ‰€ã‚’指定ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1157"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1165"/> <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 possible to add this hard disk to the list later again.</p></source> <translation><p>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯<nobr><b>"%1"</b></nobr>ã®ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸è£…置を削除ã—ã¾ã™ã‹ï¼Ÿ</p><p><b>[削除]</b>ã‚’é¸æŠžã™ã‚‹ã¨ã€æŒ‡å®šã•れãŸã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸è£…ç½®ã¯æ°¸ä¹…ã«å‰Šé™¤ã•れã¾ã™ã€‚ã“ã®æ“作ã¯<b>å…ƒã«æˆ»ã›ã¾ã›ã‚“</b>。</p><p><b>[ä¿æŒ]</b>ã‚’é¸æŠžã™ã‚‹ã¨ã€ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¯ãƒªã‚¹ãƒˆã‹ã‚‰å–り除ã‹ã‚Œã¾ã™ãŒã€ã‚¹ãƒˆãƒ¬ãƒ¼ã‚¸è£…ç½®ã¯å¾Œã§ãƒªã‚¹ãƒˆã«å†åº¦è¿½åŠ ã§ãるよã†ã«ã€ãã®ã¾ã¾ç½®ã‹ã‚Œã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1171"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1179"/> <source>Delete</source> <comment>hard disk storage</comment> <translation>削除</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1172"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1180"/> <source>Keep</source> <comment>hard disk storage</comment> <translation>ä¿æŒ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1183"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1191"/> <source>Failed to delete the storage unit of the hard disk <b>%1</b>.</source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ ストレージ装置<b>"%1"</b>ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1183"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1191"/> <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> <translation type="obsolete"><p>æ–°è¦ã®å‰²ã‚Šå½“ã¦ã«åˆ©ç”¨ã§ãる未使用ã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒã‚りã¾ã›ã‚“。</p><p><b>[作æˆ]</b>ボタンをクリックã—ã€<i>æ–°è¦ä»®æƒ³ãƒ‡ã‚£ã‚¹ã‚¯ä½œæˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰</i>ã‚’èµ·å‹•ã—ã¦æ–°è¦ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã‹ã€<b>[é¸æŠž]</b>ボタンをクリックã—ã¦ã€<i>仮想メディアマãƒãƒ¼ã‚¸ãƒ£</i>ã‚’é–‹ãã€å‹•ä½œã‚’é¸æŠžã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1252"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1260"/> <source>Failed to create the hard disk storage <nobr><b>%1</b>.</nobr></source> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ ストレージ<nobr><b>"%1"</b>ã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</nobr></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1252"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1260"/> <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>ã®ã€ä»®æƒ³ãƒžã‚·ãƒ³<b>"%3"</b>ã®ã‚¹ãƒãƒƒãƒˆ<i>"%2"</i> ã¸ã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1252"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1260"/> <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>ã®ã€ä»®æƒ³ãƒžã‚·ãƒ³<b>"%3"</b>ã®ã‚¹ãƒãƒƒãƒˆ<i>"%2"</i> ã¸ã®å‰²ã‚Šå½“ã¦è§£é™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1252"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1260"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1252"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1260"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1333"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1341"/> <source>Failed to open the %1 <nobr><b>%2</b></nobr>.</source> <translation>"%1 <nobr><b>%2</b></nobr>"ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1345"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1353"/> <source>Failed to close the %1 <nobr><b>%2</b></nobr>.</source> <translation>"%1 <nobr><b>%2</b></nobr>"ã®ã‚¯ãƒãƒ¼ã‚ºã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1386"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1394"/> <source>Failed to determine the accessibility state of the medium <nobr><b>%1</b></nobr>.</source> <translation>メディア<nobr><b>"%1"</b></nobr>ã®ã‚¢ã‚¯ã‚»ã‚¹å¯å¦çŠ¶æ…‹ã®å–å¾—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1596"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1604"/> <source><p>Failed to connect to the VirtualBox online registration service due to the following error:</p><p><b>%1</b></p></source> <translation><p>VirtualBoxã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ç™»éŒ²ã‚µãƒ¼ãƒ“ã‚¹ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。エラー:</p><p><b>%1</b></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1642"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1650"/> <source><p>Unable to obtain the new version information due to the following error:</p><p><b>%1</b></p></source> <translation><p>æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æƒ…å ±ã‚’å–å¾—ã§ãã¾ã›ã‚“。エラー:</p><p><b>%1</b></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1800"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1808"/> <source><p>One or more virtual hard disks, CD/DVD or floppy media are not currently accessible. As a result, you will not be able to operate virtual machines that use these media until they become accessible later.</p><p>Press <b>Check</b> to open the Virtual Media Manager window and see what media 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> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1800"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1808"/> <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 the conversion to disk.</p></source> <translation type="obsolete"><p>æ—¢å˜ã®VirtualBoxè¨å®šãƒ•ァイルã¯å¤ã„å½¢å¼ã‹ã‚‰VirtualBoxã®æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«å¿…è¦ãªå½¢å¼ã«è‡ªå‹•変æ›ã•れã¾ã—ãŸã€‚</p><p>ã™ãã«VirtualBoxã‚’èµ·å‹•ã™ã‚‹ã«ã¯<b>[OK]</b>ボタンをクリックã—ã¦ãã ã•ã„。変æ›ã•れãŸè¨å®šãƒ•ァイルã«ã¤ã„ã¦ã€è©³ã—ã„æƒ…å ±ã‚’å¾—ãŸã„å ´åˆã¯<b>[詳細]</b>ボタンをクリックã—ã¦ãã ã•ã„。</p><p><b>[終了]</b>ボタンをクリックã™ã‚‹ã¨ã€å¤‰æ›çµæžœã‚’ディスクã«ä¿å˜ã™ã‚‹ã“ã¨ãªãã€VirtualBoxアプリケーションを終了ã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1800"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1808"/> <source>&More</source> <comment>warnAboutAutoConvertedSettings message box</comment> <translation type="obsolete">詳細(&M)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1800"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1808"/> <source>E&xit</source> <comment>warnAboutAutoConvertedSettings message box</comment> <translation type="obsolete">終了(&X)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1800"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1808"/> <source><p>The following VirtualBox settings files have been automatically converted to the new settings file format version <b>%1</b>.</p><p>However, the results of the conversion were not saved back to disk yet. Please press:</p><ul><li><b>Backup</b> to create backup copies of the settings files in the old format before saving them in the new format;</li><li><b>Overwrite</b> to save all auto-converted files without creating backup copies (it will not be possible to use these settings files with an older version of VirtualBox afterwards);</li>%2</ul><p>It is recommended to always select <b>Backup</b> because in this case it will be possible to go back to the previous version of VirtualBox (if necessary) without losing your current settings. See the VirtualBox Manual for more information about downgrading.</p></source> <translation type="obsolete"><p>次ã®VirtualBoxè¨å®šãƒ•ァイルã¯è‡ªå‹•çš„ã«ãƒãƒ¼ã‚¸ãƒ§ãƒ³ <b>"%1"</b> ã®æ–°ã—ã„è¨å®šãƒ•ァイル形å¼ã«å¤‰æ›ã•れã¾ã—ãŸã€‚</p><p>ã—ã‹ã—ãªãŒã‚‰ã€å¤‰æ›å¾Œã®ãƒ•ァイルã¯ã¾ã ディスクã«ä¿å˜ã•れã¦ã„ã¾ã›ã‚“。ボタンをクリックã—ã¦ãã ã•ã„:</p><ul><li><b>[ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—]</b>: æ–°ã—ã„å½¢å¼ã§è¨å®šãƒ•ァイルをä¿å˜ã™ã‚‹å‰ã«ã€å¤ã„å½¢å¼ã§è¨å®šãƒ•ァイルã®ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—コピーを作æˆã—ã¾ã™ã€‚</li><li><b>[上書ã]</b>:ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—コピーを作æˆã›ãšã«ã€ã™ã¹ã¦ã®å¤‰æ›æ¸ˆã¿ãƒ•ァイルをä¿å˜ã—ã¾ã™ã€‚(æ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®VirtualBoxã§ã“れらã®è¨å®šãƒ•ァイルã¯ä½¿ç”¨ã§ãã¾ã›ã‚“)</li>%2</ul><p>(å¿…è¦ãªã‚‰ã°) æ—§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®VirtualBoxã«ç¾åœ¨ã®è¨å®šã‚’失ã†ã“ã¨ãªã戻るã“ã¨ãŒã§ãã‚‹ã®ã§ã€<b>[ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—]</b> ã‚’é¸æŠžã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚ダウングレードã«é–¢ã™ã‚‹è©³ç´°ã¯VirtualBoxマニュアルをå‚ç…§ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1800"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1808"/> <source><li><b>Exit</b> to terminate VirtualBox without saving the results of the conversion to disk.</li></source> <translation type="obsolete"><li><b>[終了]</b>:変æ›çµæžœã‚’ディスクã«ä¿å˜ã›ãšã«VirtualBoxを終了ã—ã¾ã™ã€‚</li></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1800"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1808"/> <source>O&verwrite</source> <comment>warnAboutAutoConvertedSettings message box</comment> <translation type="obsolete">上書ã(&V)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1934"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1942"/> <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> directory, as well as a description of what you were doing when this error happened. Note that you can also access the above files by selecting <b>Show Log</b> from the <b>Machine</b> menu of the main VirtualBox window.</p><p>Press <b>OK</b> if you want to power off the machine or press <b>Ignore</b> if you want to leave it as is for debugging. Please note that debugging requires special knowledge and tools, so it is recommended to press <b>OK</b> now.</p></source> <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>)ã‚’æä¾›ã—ã¦ãã ã•ã„。注:VirualBoxメインウィンドウã®<b>[仮想マシン]</b>メニューã‹ã‚‰[ãƒã‚°ã‚’å‚ç…§]ã‚’é¸æŠžã—ã¦ã€ä¸Šè¨˜ãƒ•ァイルã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p><p>仮想マシンを電æºã‚ªãƒ•ã™ã‚‹ã«ã¯<b>[OK]</b>ボタンをクリックã—ã¦ãã ã•ã„。ã“ã®ã¾ã¾ãƒ‡ãƒãƒƒã‚°ã‚’行ã†ã«ã¯<b>[無視]</b>ボタンをクリックã—ã¦ãã ã•ã„。デãƒãƒƒã‚°ã«ã¯ç‰¹åˆ¥ãªçŸ¥è˜ã¨ãƒ„ールを必è¦ã¨ã™ã‚‹ãŸã‚ã€<b>[OK]</b>ボタンをクリックã™ã‚‹ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1934"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1942"/> <source>hard disk</source> <comment>failed to close ...</comment> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1934"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1942"/> <source>CD/DVD image</source> <comment>failed to close ...</comment> <translation type="obsolete">CD/DVDイメージ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1934"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1942"/> <source>floppy image</source> <comment>failed to close ...</comment> <translation type="obsolete">フãƒãƒƒãƒ”ーイメージ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1934"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1942"/> <source>A file named <b>%1</b> already exists. Are you sure you want to replace it?<br /><br />The file already exists in "%2". Replacing it will overwrite its contents.</source> <translation type="obsolete">ファイルå<b>"%1"</b>ã¯ã™ã§ã«ä½¿ã‚れã¦ã„ã¾ã™ã€‚ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ<br /><br />ファイルã¯"%2"ã«å˜åœ¨ã—ã¾ã™ã€‚ファイルã®å†…容ã¯ä¸Šæ›¸ãã•れã¾ã™ã€‚</translation> </message> @@ -12029,189 +12074,189 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation type="obsolete"><b>"%1"</b>ã®é™¤åŽ»ã«å¤±æ•—ã—ã¾ã—ãŸã€‚<br /><br />手作æ¥ã§ãƒ•ァイルをå–り除ãã€å†å®Ÿè¡Œã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="397"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="405"/> <source>You are running a prerelease version of VirtualBox. This version is not suitable for production use.</source> <translation>ã“れã¯VirtualBoxã®ãƒ—レリリースãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã™ã€‚ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯å®Ÿå‹™ä½œæ¥ã«ã¯é©ã—ã¦ã„ã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="533"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="541"/> <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> <translation>USBファイルシステム(usbfs)ã‚‚DBusã¨halサービスも利用ã§ããªã„ãŸã‚ã€ãƒ›ã‚¹ãƒˆã‚·ã‚¹ãƒ†ãƒ ã§USBã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ゲストOSã§ãƒ›ã‚¹ãƒˆUSB デãƒã‚¤ã‚¹ã‚’使用ã™ã‚‹ã«ã¯ã€ã“れを修æ£ã—ã¦VirtualBoxã‚’å†èµ·å‹•ã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="797"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="805"/> <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> <translation>é›»æºãƒœã‚¿ãƒ³ オフã®ACPIイベントã§ã‚²ã‚¹ãƒˆOSをシャットダウンã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ゲストOSãŒACPIサブシステムを使用ã—ãªã„ãŸã‚シャットダウンã§ãã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="806"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="814"/> <source><p>VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.</p><p>Please ensure that you have enabled VT-x/AMD-V properly in the BIOS of your host computer.</p></source> <translation><p>ä»®æƒ³åŒ–æ”¯æ´æ©Ÿèƒ½(VT-x/AMD-V)を有効化ã§ãã¾ã›ã‚“。64ビット ゲストOSã¯64ビットCPUを検出ã§ããšã€èµ·å‹•ã§ãã¾ã›ã‚“。</p><p>ホストマシンã®BIOSè¨å®šã§VT-x/AMD-Vを有効化ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="839"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="847"/> <source>Close VM</source> <translation>仮想マシンを閉ã˜ã‚‹</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2069"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2086"/> <source>Continue</source> <translation>ç¶šã‘ã‚‹</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2069"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2086"/> <source><p>Are you sure you wish to delete the selected snapshot and saved state?</p></source> <translation type="obsolete"><p>é¸æŠžã•れãŸã‚¹ãƒŠãƒƒãƒ—ショットã¨ä¿å˜ã•れãŸçŠ¶æ…‹ã‚’å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2069"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2086"/> <source>Discard</source> <translation type="obsolete">ç ´æ£„</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2069"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2086"/> <source>Cancel</source> <translation>ã‚ャンセル</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2069"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2086"/> <source><p>There are hard disks attached to ports of the additional controller. If you disable the additional controller, all these hard disks will be automatically detached.</p><p>Are you sure you want to disable the additional controller?</p></source> <translation type="obsolete"><p>è¿½åŠ ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã®ãƒãƒ¼ãƒˆã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒã‚りã¾ã™ã€‚è¿½åŠ ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã‚’無効ã«ã™ã‚‹ã¨ã€ãれらã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¯è‡ªå‹•çš„ã«å‰²ã‚Šå½“ã¦è§£é™¤ã•れã¾ã™ã€‚</p><p>è¿½åŠ ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã‚’無効ã«ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2069"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2086"/> <source><p>There are hard disks attached to ports of the additional controller. If you change the additional controller, all these hard disks will be automatically detached.</p><p>Are you sure you want to change the additional controller?</p></source> <translation type="obsolete"><p>è¿½åŠ ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã®ãƒãƒ¼ãƒˆã«å‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ãŒã‚りã¾ã™ã€‚è¿½åŠ ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã‚’変更ã™ã‚‹ã¨ã€ãれらã®ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã¯è‡ªå‹•çš„ã«å‰²ã‚Šå½“ã¦è§£é™¤ã•れã¾ã™ã€‚</p><p>è¿½åŠ ã®ã‚³ãƒ³ãƒˆãƒãƒ¼ãƒ©ã‚’変更ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2069"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2086"/> <source>Change</source> <comment>hard disk</comment> <translation type="obsolete">変更</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2069"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2086"/> <source><p>Do you want to remove the selected host network interface <nobr><b>%1</b>?</nobr></p><p><b>Note:</b> This interface may be in use by one or more network adapters of this or another VM. After it is removed, these adapters will no longer work until you correct their settings by either choosing a different interface name or a different adapter attachment type.</p></source> <translation type="obsolete"><p>é¸æŠžã—ãŸãƒ›ã‚¹ãƒˆ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ インターフェース ;<nobr><b>"%1"</b>を除去ã—ã¾ã™ã‹ï¼Ÿ</nobr></p><p><b>注:</b> ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースã¯è¤‡æ•°ã®ä»®æƒ³ãƒžã‚·ãƒ³ã®1ã¤ä»¥ä¸Šã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ アタプタã§ä½¿ç”¨ä¸ã‹ã‚‚ã—れã¾ã›ã‚“。除去ã™ã‚‹ã¨ã€ä»–ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースåã‚’é¸ã¶ã‹ã€åˆ¥ã®å‰²ã‚Šå½“ã¦æ–¹æ³•ã‚’æ£ã—ãè¨å®šã™ã‚‹ã¾ã§ãれらã®ã‚¢ãƒ€ãƒ—ã‚¿ã¯å‹•作ã—ã¾ã›ã‚“。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2646"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2662"/> <source>Failed to create the host-only network interface.</source> <translation>ホストオンリー ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ インターフェースã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1832"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1840"/> <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><p>æ—¢å˜ã®VirtualBoxè¨å®šãƒ•ァイルã¯å¤ã„å½¢å¼ã‹ã‚‰VirtualBoxã®æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«å¿…è¦ãªå½¢å¼ã«è‡ªå‹•変æ›ã•れã¾ã™ã€‚</p><p>ã™ãã«VirtualBoxã‚’èµ·å‹•ã™ã‚‹ã«ã¯<b>[OK]</b>ボタンをクリックã—ã¦ãã ã•ã„。変æ›çµæžœã‚’ä¿å˜ã›ãšã«VirtualBoxアプリケーションを終了ã™ã‚‹ã«ã¯<b>[終了]</b>ボタンをクリックã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1133"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1141"/> <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> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1194"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1202"/> <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> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1201"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1209"/> <source>Create &new disk</source> <comment>add attachment routine</comment> <translation>æ–°è¦ãƒ‡ã‚£ã‚¹ã‚¯ã®ä½œæˆ(&N)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1202"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1210"/> <source>&Choose existing disk</source> <comment>add attachment routine</comment> <translation>æ—¢å˜ã®ãƒ‡ã‚£ã‚¹ã‚¯ã‚’é¸æŠž(&C)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1209"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1217"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1233"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1241"/> <source>&Choose disk</source> <comment>add attachment routine</comment> <translation>ãƒ‡ã‚£ã‚¹ã‚¯ã‚’é¸æŠž(&C)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1234"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1242"/> <source>Leave &empty</source> <comment>add attachment routine</comment> <translation>空ã®ãƒ‰ãƒ©ã‚¤ãƒ–(&E)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1225"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1233"/> <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><p>フãƒãƒƒãƒ”ードライブをコントãƒãƒ¼ãƒ©<b>"%1"</b>ã«è¿½åŠ ã—ã¾ã™ã€‚</p><p>仮想フãƒãƒƒãƒ”ーディスクをドライブã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿç©ºã®ãƒ‰ãƒ©ã‚¤ãƒ–ã ã‘割り当ã¦ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1268"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1276"/> <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>)ã®ã€ä»®æƒ³ãƒžã‚·ãƒ³<b>"%3"</b>ã®ã‚¹ãƒãƒƒãƒˆ<i>"%2"</i> ã¸ã®å‰²ã‚Šå½“ã¦è§£é™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1274"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1282"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1280"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1288"/> <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> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1280"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1288"/> <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 shared folders will be available once it is.</p></source> <translation type="obsolete"><p>VirtualBox Guest AdditionsãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ãŸã‚ã€å…±æœ‰ãƒ•ォルダã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。共有フォルダを使用ã™ã‚‹ã«ã¯<b>[デãƒã‚¤ã‚¹]</b>メニューã‹ã‚‰<b>[Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«]</b>ã‚’é¸ã³Guest Additionsをインストールã¾ãŸã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。インストール後ã€ä»®æƒ³ãƒžã‚·ãƒ³ã‚’å†èµ·å‹•ã™ã‚‹ã¨å…±æœ‰ãƒ•ォルダãŒåˆ©ç”¨ã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2008"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2025"/> <source>Failed to open appliance.</source> <translation>仮想アプライアンスã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2024"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2041"/> <source>Failed to open/interpret appliance <b>%1</b>.</source> <translation>仮想アプライアンス<b>"%1"</b>ã®ã‚ªãƒ¼ãƒ—ンã¾ãŸã¯è§£æžã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2036"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2053"/> <source>Failed to import appliance <b>%1</b>.</source> <translation>仮想アプライアンス<b>"%1"</b>ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message numerus="yes"> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2063"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2080"/> <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> <translation> <numerusform><p>仮想マシン<b>"%1"</b>ã¯çŠ¶æ…‹ã®ä¿å˜ä¸ã§ã™ã€‚</p><p>続行ã™ã‚‹ã¨ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã®ãƒ©ãƒ³ã‚¿ã‚¤ãƒ 状態ã¯ç ´æ£„ã•れã¾ã™ã€‚注:既å˜ã®ä»®æƒ³ãƒžã‚·ãƒ³ã¯å¤‰æ›´ã•れã¾ã›ã‚“。</p></numerusform> </translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2078"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2095"/> <source>Failed to create appliance.</source> <translation>仮想アプライアンスã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2103"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2120"/> <source>Failed to prepare the export of the appliance <b>%1</b>.</source> <translation>仮想アプライアンス<b>"%1"</b>ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã®å‰å‡¦ç†ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2098"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2115"/> <source>Failed to create an appliance.</source> <translation>仮想アプライアンスã®ä½œæˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2114"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2131"/> <source>Failed to export appliance <b>%1</b>.</source> <translation>仮想アプライアンス<b>"%1"</b>ã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1396"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1404"/> <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 interface name or a different adapter attachment type.</p></source> <translation><p>ã“ã®ã‚¤ãƒ³ã‚¿ãƒ•ェースを削除ã™ã‚‹ã¨ã€ã“ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ェースãŒåŸºã¥ã„ã¦ã„るホストオンリー ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ インタフェースãŒå‰Šé™¤ã•れã¾ã™ã€‚ホストオンリー ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ インタフェース<nobr><b>%1</b></nobr>を削除ã—ã¾ã™ã‹ï¼Ÿ</p><p><b>注:</b>ã“ã®ã‚¤ãƒ³ã‚¿ãƒ•ェースã¯ä»–ã®ä»®æƒ³ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ アダプタã§ä½¿ç”¨ã—ã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。削除ã—ãŸå ´åˆã€ãれらã®ã‚¢ãƒ€ãƒ—ã‚¿ã¯ã€ä»–ã®ã‚¤ãƒ³ã‚¿ãƒ•ェースåã‚’é¸ã¶ã‹ã€åˆ¥ã®ã‚¢ãƒ€ãƒ—ã‚¿ タイプをé¸ã‚“ã§è¨å®šã‚’変更ã™ã‚‹ã¾ã§ä½¿ç”¨ã§ãã¾ã›ã‚“。</p></translation> </message> @@ -12221,32 +12266,32 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation>ファイルå<b>"%1"</b>ã¯ã™ã§ã«ä½¿ã‚れã¦ã„ã¾ã™ã€‚ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ<br /><br />ファイルã®å†…容ã¯ä¸Šæ›¸ãã•れã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="826"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="834"/> <source><p>VT-x/AMD-V hardware acceleration has been enabled, but is not operational. Certain guests (e.g. OS/2 and QNX) require this feature.</p><p>Please ensure that you have enabled VT-x/AMD-V properly in the BIOS of your host computer.</p></source> <translation><p>ä»®æƒ³åŒ–æ”¯æ´æ©Ÿèƒ½(VT-x/AMD-V)ãŒæœ‰åŠ¹åŒ–ã•れã¾ã—ãŸãŒä½¿ç”¨ã§ãã¾ã›ã‚“。ã„ãã¤ã‹ã®ã‚²ã‚¹ãƒˆOS(OS/2ã‚„QNXãªã©))ã¯æœ¬æ©Ÿèƒ½ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚</p><p>ホストマシンã®BIOSè¨å®šã§VT-x/AMD-Vを有効化ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1464"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1472"/> <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 shared folders will be available once it is.</p></source> <translation><p>VirtualBox Guest AdditionsãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ãªã„ãŸã‚ã€å…±æœ‰ãƒ•ォルダã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。共有フォルダを使用ã™ã‚‹ã«ã¯<b>[デãƒã‚¤ã‚¹]</b>メニューã‹ã‚‰<b>[Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«]</b>ã‚’é¸ã³Guest Additionsをインストールã¾ãŸã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。インストール後ã€ä»®æƒ³ãƒžã‚·ãƒ³ã‚’å†èµ·å‹•ã™ã‚‹ã¨å…±æœ‰ãƒ•ォルダãŒåˆ©ç”¨ã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1619"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1627"/> <source><p>Invalid e-mail address or password specified.</p></source> <translation><p>無効ãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ãŸã¯ãƒ‘ã‚¹ãƒ¯ãƒ¼ãƒ‰ãŒæŒ‡å®šã•れã¾ã—ãŸã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1622"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1630"/> <source><p>Failed to register the VirtualBox product.</p><p>%1</p></source> <translation><p>VirtualBoxã®ç™»éŒ²ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</p><p>%1</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2046"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2063"/> <source>Failed to check files.</source> <translation>ファイルã®ç¢ºèªã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2056"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2073"/> <source>Failed to remove file.</source> <translation>ファイルã®é™¤åŽ»ä¸ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> @@ -12256,314 +12301,319 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation>USBFS ファイルシステムを/sys/bus/usb/driversã«ãƒžã‚¦ãƒ³ãƒˆã—ã¦ã„ã¾ã™ã€‚ã“れを変更ã™ã‚‹ã“ã¨ã‚’å¼·ãå‹§ã‚ã¾ã™ã€‚誤ã£ãŸã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«ã‚ˆã‚ŠUSB デãƒã‚¤ã‚¹ã®ä½¿ç”¨ã«å¤±æ•—ã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="405"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="413"/> <source>You are running an EXPERIMENTAL build of VirtualBox. This version is not suitable for production use.</source> <translation>ã“れã¯VirtualBoxã®è©¦é¨“的ビルドã§ã™ã€‚ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯å®Ÿå‹™ä½œæ¥ã«ã¯é©ã—ã¦ã„ã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="815"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="823"/> <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> <translation><p>ホストマシンã®ä»®æƒ³åŒ–æ”¯æ´æ©Ÿèƒ½(VT-x/AMD-V)ãŒä½¿ç”¨ã§ãã¾ã›ã‚“。64ビット ゲストOSã¯64ビットCPUを検出ã§ããšã€èµ·å‹•ã§ãã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="835"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="843"/> <source><p>VT-x/AMD-V hardware acceleration is not available on your system. Certain guests (e.g. OS/2 and QNX) require this feature and will fail to boot without it.</p></source> <translation><p>ホストマシンã®ä»®æƒ³åŒ–æ”¯æ´æ©Ÿèƒ½(VT-x/AMD-V)ãŒä½¿ç”¨ã§ãã¾ã›ã‚“。本機能を必è¦ã¨ã™ã‚‹ã„ãã¤ã‹ã®ã‚²ã‚¹ãƒˆOS(OS/2ã‚„QNXãªã©)ã¯èµ·å‹•ã§ãã¾ã›ã‚“。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="845"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="853"/> <source><p>Are you sure you want to restore snapshot <b>%1</b>? This will cause you to lose your current machine state, which cannot be recovered.</p></source> <translation><p>スナップショット<b>"%1"</b>ã«å¾©å…ƒã—ã¾ã™ã‹ï¼Ÿç¾åœ¨ã®ä»®æƒ³ãƒžã‚·ãƒ³ã®çŠ¶æ…‹ã¯å¤±ã‚れã€ãれを回復ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="850"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="858"/> <source>Restore</source> <translation>復元</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="856"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="864"/> <source><p>Deleting the snapshot will cause the state information saved in it to be lost, and disk data spread over several image files that VirtualBox has created together with the snapshot will be merged into one file. This can be a lengthy process, and the information in the snapshot cannot be recovered.</p></p>Are you sure you want to delete the selected snapshot <b>%1</b>?</p></source> <translation><p>スナップショットを削除ã™ã‚‹ã¨ã€ã‚¹ãƒŠãƒƒãƒ—ã‚·ãƒ§ãƒƒãƒˆã«æ ¼ç´ã•れã¦ã„ã‚‹æƒ…å ±ã¯å¤±ã‚れã€VirtualBoxãŒã‚¹ãƒŠãƒƒãƒ—ショットã¨å…±ã«ä½œæˆã—ãŸè¤‡æ•°ã®ãƒ‡ã‚£ã‚¹ã‚¯ データã¯ã²ã¨ã¤ã®ãƒ•ァイルã«ãƒžãƒ¼ã‚¸ã•れã¾ã™ã€‚ã“れã«ã¯é•·ã„時間ãŒã‹ã‹ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。ãã—ã¦ã‚¹ãƒŠãƒƒãƒ—ã‚·ãƒ§ãƒƒãƒˆã®æƒ…å ±ã‚’å›žå¾©ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。</p><p>スナップショット<b>"%1"</b>を削除ã—ã¾ã™ã‹ï¼Ÿã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="881"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="889"/> <source>Delete</source> <translation>削除</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="871"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="879"/> <source><p>Deleting the snapshot %1 will temporarily need more disk space. In the worst case the size of image %2 will grow by %3, however on this filesystem there is only %4 free.</p><p>Running out of disk space during the merge operation can result in corruption of the image and the VM configuration, i.e. loss of the VM and its data.</p><p>You may continue with deleting the snapshot at your own risk.</p></source> <translation><p>スナップショット %1ã®å‰Šé™¤ã«ã¯å¤šãã®ãƒ‡ã‚£ã‚¹ã‚¯å®¹é‡ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ディスクイメージファイル %2ã®ã‚µã‚¤ã‚ºã¯æœ€å¤§ã§%3ã¾ã§å¢—åŠ ã—ã¾ã™ã€‚ã—ã‹ã—ã€ãƒ‡ã‚£ã‚¹ã‚¯ã®ç©ºã容é‡ã¯%4ã—ã‹ã‚りã¾ã›ã‚“。</p><p>マージ作æ¥ä¸ã«ãƒ‡ã‚£ã‚¹ã‚¯å®¹é‡ãŒä¸è¶³ã™ã‚‹ã¨ã€ä»®æƒ³ãƒžã‚·ãƒ³ã®ãƒ‡ãƒ¼ã‚¿ã‚’失ã†å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚</p><p>スナップショットã®å‰Šé™¤ã‚’自己責任ã§ç¶šè¡Œã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="900"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="908"/> <source>Failed to restore the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source> <translation>仮想マシン<b>"%2"</b>ã®ã‚¹ãƒŠãƒƒãƒ—ショット<b>"%1"</b>ã¸ã®å¾©å…ƒã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="922"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="930"/> <source>Failed to delete the snapshot <b>%1</b> of the virtual machine <b>%2</b>.</source> <translation>仮想マシン<b>"%2"</b>ã®ã‚¹ãƒŠãƒƒãƒ—ショット<b>"%1"</b>ã®å‰Šé™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="974"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="982"/> <source><p>Could not change the guest screen to this host screen due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p></source> <translation><p>ビデオメモリä¸è¶³ã®ãŸã‚ã€ã‚²ã‚¹ãƒˆ スクリーンをã“ã®ãƒ›ã‚¹ãƒˆ スクリーンã«å¤‰æ›´ã§ãã¾ã›ã‚“。</p><p>ä»®æƒ³ãƒžã‚·ãƒ³ã®æ§‹æˆã§<b>%1</b>以上ã®ãƒ“デオメモリを指定ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="984"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="992"/> <source><p>Could not change the guest screen to this host screen due to insufficient guest video memory.</p><p>You should configure the virtual machine to have at least <b>%1</b> of video memory.</p><p>Press <b>Ignore</b> to switch the screen anyway or press <b>Cancel</b> to cancel the operation.</p></source> <translation><p>ビデオメモリä¸è¶³ã®ãŸã‚ã€ã‚²ã‚¹ãƒˆ スクリーンをã“ã®ãƒ›ã‚¹ãƒˆ スクリーンã«å¤‰æ›´ã§ãã¾ã›ã‚“。</p><p>ä»®æƒ³ãƒžã‚·ãƒ³ã®æ§‹æˆã§<b>%1</b>以上ã®ãƒ“デオメモリを指定ã—ã¦ãã ã•ã„。</p><p><b>[無視]</b>ボタンをクリックã—ã™ã‚‹ã¨ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚’強制的ã«åˆ‡ã‚Šæ›ãˆã¾ã™ã€‚<b>[ã‚ャンセル]</b>ボタンをクリックã™ã‚‹ã¨æ“作ã¯å–り消ã•れã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="999"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1007"/> <source><p>Can not switch the guest display to fullscreen mode. You have more virtual screens configured than physical screens are attached to your host.</p><p>Please either lower the virtual screens in your VM configuration or attach additional screens to your host.</p></source> <translation><p>ゲスト ディスプレイをフルスクリーンモードã«å¤‰æ›´ã§ãã¾ã›ã‚“ã€‚ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã«æŽ¥ç¶šã•れã¦ã„る実ディスプレイよりも多ãã®ä»®æƒ³ãƒ‡ã‚£ã‚¹ãƒ—レイãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p>ä»®æƒ³ãƒ‡ã‚£ã‚¹ãƒ—ãƒ¬ã‚¤ã®æ•°ã‚’減らã™ã‹ã€ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã«ãƒ‡ã‚£ã‚¹ãƒ—ãƒ¬ã‚¤ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1011"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1019"/> <source><p>Can not switch the guest display to seamless mode. You have more virtual screens configured than physical screens are attached to your host.</p><p>Please either lower the virtual screens in your VM configuration or attach additional screens to your host.</p></source> <translation><p>ゲスト ディスプレイをシームレスモードã«å¤‰æ›´ã§ãã¾ã›ã‚“ã€‚ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã«æŽ¥ç¶šã•れã¦ã„る実ディスプレイよりも多ãã®ä»®æƒ³ãƒ‡ã‚£ã‚¹ãƒ—レイãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p>ä»®æƒ³ãƒ‡ã‚£ã‚¹ãƒ—ãƒ¬ã‚¤ã®æ•°ã‚’減らã™ã‹ã€ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã«ãƒ‡ã‚£ã‚¹ãƒ—ãƒ¬ã‚¤ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1011"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1019"/> <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> <translation type="obsolete"><p>æ–°è¦ã®å‰²ã‚Šå½“ã¦ã«åˆ©ç”¨ã§ãる未使用ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãŒã‚りã¾ã›ã‚“。</p><p><b>[作æˆ]</b>ボタンをクリックã—ã€<i>æ–°è¦ä»®æƒ³ãƒ‡ã‚£ã‚¹ã‚¯ä½œæˆã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰</i>ã‚’èµ·å‹•ã—ã¦æ–°è¦ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã‹ã€<b>[é¸æŠž]</b>ボタンをクリックã—ã¦ã€<i>仮想メディアマãƒãƒ¼ã‚¸ãƒ£</i>ã‚’é–‹ã„ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1011"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1019"/> <source>&Create</source> <comment>medium</comment> <translation type="obsolete">作æˆ(&C)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1011"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1019"/> <source>&Select</source> <comment>medium</comment> <translation type="obsolete">é¸æŠž(&S)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1011"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1019"/> <source><p>There are no unused media available for the newly created attachment.</p><p>Press the <b>Select</b> if you wish to open the <i>Virtual Media Manager</i>.</p></source> <translation type="obsolete"><p>æ–°è¦ã®å‰²ã‚Šå½“ã¦ã«åˆ©ç”¨ã§ãる未使用ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãŒã‚りã¾ã›ã‚“。</p><p><b>[é¸æŠž]</b>ボタンをクリックã—ã¦ã€<i>仮想メディアマãƒãƒ¼ã‚¸ãƒ£</i>ã‚’é–‹ã„ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1240"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1248"/> <source><p>Are you sure you want to delete the CD/DVD-ROM device?</p><p>You will not be able to mount any CDs or ISO images or install the Guest Additions without it!</p></source> <translation><p>CD/DVD-ROM デãƒã‚¤ã‚¹ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ</p><p>デãƒã‚¤ã‚¹ãŒãªã„å ´åˆã€CD/DVDメディアやISOイメージファイルã®ãƒžã‚¦ãƒ³ãƒˆãŠã‚ˆã³Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã¯ã§ãã¾ã›ã‚“ï¼</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1244"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1252"/> <source>&Remove</source> <comment>medium</comment> <translation>除去(&R)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1244"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1252"/> <source>Failed to attach the %1 to slot <i>%2</i> of the machine <b>%3</b>.</source> <translation type="obsolete">"%1"ã®ä»®æƒ³ãƒžã‚·ãƒ³<b>"%3"</b>ã®ã‚¹ãƒãƒƒãƒˆ<i>"%2"</i>ã¸ã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1244"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1252"/> <source>Failed to detach the %1 from slot <i>%2</i> of the machine <b>%3</b>.</source> <translation type="obsolete">"%1"ã®ä»®æƒ³ãƒžã‚·ãƒ³<b>"%3"</b>ã®ã‚¹ãƒãƒƒãƒˆ<i>"%2"</i>ã¸ã®å‰²ã‚Šå½“ã¦è§£é™¤ã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1298"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1306"/> <source>Unable to mount the %1 <nobr><b>%2</b></nobr> on the machine <b>%3</b>.</source> <translation>%1 <nobr><b>%2</b></nobr>を仮想マシン<b>"%3"</b>ã«ãƒžã‚¦ãƒ³ãƒˆã§ãã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1299"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1307"/> <source> Would you like to force mounting of this medium?</source> <translation>メディアを強制マウントã—ã¾ã™ã‹ï¼Ÿ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1303"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1311"/> <source>Unable to unmount the %1 <nobr><b>%2</b></nobr> from the machine <b>%3</b>.</source> <translation>%1 <nobr><b>%2</b></nobr>を仮想マシン<b>"%3"</b>ã‹ã‚‰ãƒžã‚¦ãƒ³ãƒˆè§£é™¤ã§ãã¾ã›ã‚“。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1304"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1312"/> <source> Would you like to force unmounting of this medium?</source> <translation>メディアを強制マウント解除ã—ã¾ã™ã‹ï¼Ÿ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1314"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1322"/> <source>Force Unmount</source> <translation>強制マウント解除</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1314"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1322"/> <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">仮想ドライブã®ãƒ‡ã‚£ã‚¹ã‚¯ã®å–り出ã—ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã“ã®ãƒ‰ãƒ©ã‚¤ãƒ–ã¯ã‚²ã‚¹ãƒˆOSã«ã‚ˆã£ã¦ãƒãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚確èªå¾Œã€å†å®Ÿè¡Œã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1502"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1510"/> <source><p>Could not insert the VirtualBox Guest Additions installer CD image into the virtual machine <b>%1</b>, as the machine has no CD/DVD-ROM drives. Please add a drive using the storage page of the virtual machine settings dialog.</p></source> <translation><p>仮想マシン<b>"%1"</b>ãŒCD/DVD-ROMドライブをæŒãŸãªã„ãŸã‚ã€VirtualBox Guest Additionsã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«CDイメージを仮想マシンã«ã‚¤ãƒ³ã‚µãƒ¼ãƒˆã§ãã¾ã›ã‚“。 仮想マシンè¨å®šãƒ€ã‚¤ã‚¢ãƒã‚°ã®[ストレージ]ページã§ãƒ‰ãƒ©ã‚¤ãƒ–ã‚’è¿½åŠ ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1539"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1547"/> <source><p>Could not find the VirtualBox User Manual <nobr><b>%1</b>.</nobr></p><p>Do you wish to download this file from the Internet?</p></source> <translation><p>VirtualBox ユーザーマニュアル <nobr><b>%1</b></nobr>ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。</p><p>ユーザーマニュアルをダウンãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1550"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1558"/> <source><p>Are you sure you want to download the VirtualBox User Manual from <nobr><a href="%1">%2</a></nobr> (size %3 bytes)?</p></source> <translation><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%2</a></nobr> (サイズ %3ãƒã‚¤ãƒˆ)ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1561"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1569"/> <source><p>Failed to download the VirtualBox User Manual from <nobr><a href="%1">%2</a>.</nobr></p><p>%3</p></source> <translation><p><nobr><a href="%1">%2</a>ã‹ã‚‰VirtualBox ユーザーマニュアルをダウンãƒãƒ¼ãƒ‰ã§ãã¾ã›ã‚“。</nobr></p><p>%3</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1569"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1577"/> <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%2</a></nobr> and saved locally as <nobr><b>%3</b>.</nobr></p></source> <translation><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%2</a></nobr>ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã€<nobr><b>%3</b></nobr>ã«ä¿å˜ã—ã¾ã—ãŸã€‚</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1579"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1587"/> <source><p>The VirtualBox User Manual has been successfully downloaded from <nobr><a href="%1">%2</a></nobr> but can't be saved locally as <nobr><b>%3</b>.</nobr></p><p>Please choose another location for that file.</p></source> <translation><p>VirtualBox ユーザーマニュアルを<nobr><a href="%1">%2</a></nobr>ã‹ã‚‰ãƒ€ã‚¦ãƒ³ãƒãƒ¼ãƒ‰ã—ã¾ã—ãŸãŒã€<nobr><b>%3</b></nobr>ã«ä¿å˜ã§ãã¾ã›ã‚“。</p><p>ä»–ã®ä¿å˜å ´æ‰€ã‚’é¸æŠžã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1861"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1869"/> <source>E&xit</source> <comment>warnAboutSettingsAutoConversion message box</comment> <translation>終了(&X)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1849"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1857"/> <source><p>The following 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><p>次ã®VirtualBoxè¨å®šãƒ•ァイルã¯å¤ã„å½¢å¼ã‹ã‚‰æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®VirtualBoxBoxãŒå¿…è¦ã¨ã™ã‚‹æ–°ã—ã„å½¢å¼ã«è‡ªå‹•çš„ã«å¤‰æ›´ã•れã¾ã™ã€‚</p><p><b>[OK]</b>ボタンをクリックã—ã¦VirtualBoxã‚’èµ·å‹•ã™ã‚‹ã‹ã€è¨å®šãƒ•ァイルã®å¤‰æ›´ã‚’行ã‚ãšã«VirtualBoxアプリケーションを終了ã•ã›ãŸã„ãªã‚‰<b>[終了]</b>ボタンをクリックã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1874"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1882"/> <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>%1</b>ã‚ーを押ã™ã¨ã„ã¤ã§ã‚‚ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãƒ¢ãƒ¼ãƒ‰ã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p><p>注:<i>ホスト</i>ã‚ーã¯ç¾åœ¨<b>%2</b>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p>注:フルスクリーンモードã§ã¯ãƒ¡ã‚¤ãƒ³ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。メニューãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ <b>ホスト+Home</b>ã‚ーを押ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1894"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1902"/> <source><p>The virtual machine window will be now switched to <b>Seamless</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 seamless mode. You can access it by pressing <b>Host+Home</b>.</p></source> <translation><p>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’"シームレス"モードã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚<b>%1</b>ã‚ーを押ã™ã¨ã„ã¤ã§ã‚‚ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦è¡¨ç¤ºã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p><p>注:<i>ホスト</i>ã‚ーã¯ç¾åœ¨<b>%2</b>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p>注:シームレスモードã§ã¯ãƒ¡ã‚¤ãƒ³ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。メニューãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ <b>ホスト+Home</b>ã‚ーを押ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1914"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1922"/> <source><p>The virtual machine window will be now switched to <b>Scale</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 scale mode. You can access it by pressing <b>Host+Home</b>.</p></source> <translation><p>仮想マシンã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’"スケール"モードã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚<b>%1</b>ã‚ーを押ã™ã¨ã„ã¤ã§ã‚‚ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦è¡¨ç¤ºã«æˆ»ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚</p><p>注:<i>ホスト</i>ã‚ーã¯ç¾åœ¨<b>%2</b>ã«å‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚</p><p>注:スケールモードã§ã¯ãƒ¡ã‚¤ãƒ³ãƒ¡ãƒ‹ãƒ¥ãƒ¼ãƒãƒ¼ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。メニューãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ <b>ホスト+Home</b>ã‚ーを押ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="1922"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1930"/> <source>Switch</source> <comment>scale</comment> <translation>切り替ãˆ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2140"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="1986"/> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>仮想マシン フォルダ<b>%1</b>を親フォルダ<nobr><b>%2</b>ã«ä½œæˆã§ãã¾ã›ã‚“。</nobr></p><p>親フォルダã®å˜åœ¨ã¨ã€ãƒ•ォルダ作æˆã«å¿…è¦ãªæ¨©é™ã®æœ‰ç„¡ã‚’確èªã—ã¦ãã ã•ã„。</p></translation> + </message> + <message> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2157"/> <source>Failed to open the Extension Pack <b>%1</b>.</source> <translation>機能拡張パッケージ<b>"%1"</b>ã®ã‚ªãƒ¼ãƒ—ンã«å¤±æ•—ã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2165"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2191"/> <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:&nbsp;&nbsp;</b></td><td>%1</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%3</td></tr></table></p></source> <translation><p>VirtualBox 機能拡張パッケージをインストールã—ã¾ã™ã€‚機能拡張パッケージã¯VirtualBoxã«æ©Ÿèƒ½ã‚’è¿½åŠ ã—ã¾ã™ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã«å±å®³ã‚’与ãˆã‚‹ã‚·ã‚¹ãƒ†ãƒ レベルã®ã‚½ãƒ•トウェアをå«ã‚€ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ä¿¡é ¼ã§ãる発行元ã‹ã‚‰æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージを入手ã—ãŸå ´åˆã«é™ã‚Šã€ä»¥ä¸‹ã®å†…容を確èªã—ã¦ã€å‡¦ç†ã‚’続行ã—ã¦ãã ã•ã„。</p><p><table cellpadding=0 cellspacing=0><tr><td><b>åå‰:&nbsp;&nbsp;</b></td><td>%1</td></tr><tr><td><b>ãƒãƒ¼ã‚¸ãƒ§ãƒ³:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>説明:&nbsp;&nbsp;</b></td><td>%3</td></tr></table></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2176"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2202"/> <source>&Install</source> <translation>インストール(&I)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2186"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2212"/> <source>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.</source> <translation>機能拡張パッケージã¯VirtualBoxã«æ©Ÿèƒ½ã‚’è¿½åŠ ã—ã¾ã™ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã«å±å®³ã‚’与ãˆã‚‹ã‚·ã‚¹ãƒ†ãƒ レベルã®ã‚½ãƒ•トウェアをå«ã‚€ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ä¿¡é ¼ã§ãる発行元ã‹ã‚‰æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージを入手ã—ãŸå ´åˆã«é™ã‚Šã€ä»¥ä¸‹ã®å†…容を確èªã—ã¦ã€å‡¦ç†ã‚’続行ã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2199"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2225"/> <source><p>An older version of the extension pack is already installed, would you like to upgrade? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p></source> <translation><p>å¤ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã™ã€‚アップグレードã—ã¾ã™ã‹ï¼Ÿ<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>åå‰:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>ãƒãƒ¼ã‚¸ãƒ§ãƒ³:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>説明:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2209"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2235"/> <source>&Upgrade</source> <translation>アップグレード(&U)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2213"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2239"/> <source><p>An newer version of the extension pack is already installed, would you like to downgrade? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p></source> <translation><p>æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã™ã€‚ダウングレードã—ã¾ã™ã‹ï¼Ÿ<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>åå‰:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>ãƒãƒ¼ã‚¸ãƒ§ãƒ³:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>ç¾åœ¨ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>説明:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2223"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2249"/> <source>&Downgrade</source> <translation>ダウングレード(&D)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2227"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2253"/> <source><p>The extension pack is already installed with the same version, would you like reinstall it? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p></source> <translation><p>åŒã˜ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®æ©Ÿèƒ½æ‹¡å¼µãƒ‘ッケージãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã™ã€‚å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¾ã™ã‹ï¼Ÿ<p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>åå‰:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>ãƒãƒ¼ã‚¸ãƒ§ãƒ³:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>説明:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2236"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2262"/> <source>&Reinstall</source> <translation>å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«(&R)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2244"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2270"/> <source><p>You are about to remove the VirtualBox extension pack <b>%1</b>.</p><p>Are you sure you want to proceed?</p></source> <translation><p> VirtualBox 機能拡張パッケージ"<b>%1</b>"を除去ã—ã¾ã™ã€‚</p><p>続行ã—ã¾ã™ã‹ï¼Ÿ</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2254"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2280"/> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>機能拡張パッケージ<br><nobr><b>%1</b><nobr><br>ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«æˆåŠŸã—ã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2375"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2401"/> <source>hard disk</source> <comment>failed to mount ...</comment> <translation>ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2377"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2403"/> <source>CD/DVD</source> <comment>failed to mount ... host-drive</comment> <translation>CD/DVD</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2379"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2405"/> <source>CD/DVD image</source> <comment>failed to mount ...</comment> <translation>CD/DVD イメージ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2381"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2407"/> <source>floppy</source> <comment>failed to mount ... host-drive</comment> <translation>フãƒãƒƒãƒ”ー</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>floppy image</source> <comment>failed to mount ...</comment> <translation>フãƒãƒƒãƒ”ー イメージ</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>hard disk</source> <comment>failed to attach ...</comment> <translation type="obsolete">ãƒãƒ¼ãƒ‰ãƒ‡ã‚£ã‚¹ã‚¯</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>CD/DVD device</source> <comment>failed to attach ...</comment> <translation type="obsolete">CD/DVD デãƒã‚¤ã‚¹</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>floppy device</source> <comment>failed to close ...</comment> <translation type="obsolete">フãƒãƒƒãƒ”ー デãƒã‚¤ã‚¹</translation> @@ -12572,147 +12622,147 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<context> <name>VBoxRegistrationDlg</name> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>VirtualBox Registration Dialog</source> <translation type="obsolete">VirtualBox 登録ダイアãƒã‚°</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&Name</source> <translation type="obsolete">åå‰(&N)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Enter your full name using Latin characters.</source> <translation type="obsolete">フルãƒãƒ¼ãƒ を英å—ã§å…¥åŠ›ã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&E-mail</source> <translation type="obsolete">メールアドレス(&E)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Enter your e-mail address. Please use a valid address here.</source> <translation type="obsolete">メールアドレスを入力ã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&Please do not use this information to contact me</source> <translation type="obsolete">æƒ…å ±ãƒ¡ãƒ¼ãƒ«ä¸è¦(&P)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Welcome to the VirtualBox Registration Form!</source> <translation type="obsolete">よã†ã“ã VirtualBox 登録フォームã¸ï¼</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&Confirm</source> <translation type="obsolete">確èª(&C)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Connection timed out.</source> <translation type="obsolete">接続ãŒã‚¿ã‚¤ãƒ アウトã«ãªã‚Šã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Could not locate the registration form on the server (response: %1).</source> <translation type="obsolete">サーãƒãƒ¼ä¸Šã«ç™»éŒ²ãƒ•ォームãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ(応ç”: %1)。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Could not perform connection handshake.</source> <translation type="obsolete">接続を確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <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 information about how we use your personal data can be found in the <b>Privacy Policy</b> section of the VirtualBox Manual or on the <a href=http://www.virtualbox.org/wiki/PrivacyPolicy>Privacy Policy</a> page of the VirtualBox web-site.</p></source> <translation type="obsolete"><p>登録フォームã«å…¥åŠ›ã—ã€ã‚ãªãŸãŒ VirtualBox を使用ã—ã¦ã„ã‚‹ã“ã¨ã‚’我々ã«çŸ¥ã‚‰ã›ã¦ãã ã•ã„。VirtualBox ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã¨æ›´æ–°æƒ…å ±ã‚’ãŠçŸ¥ã‚‰ã›ã—ã¾ã™(ä»»æ„)。</p><p>フルãƒãƒ¼ãƒ (英å—)ã¨ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’下ã®ãƒ•ィールドã«å…¥åŠ›ã—ã¦ãã ã•ã„。注:Sun Microsystems ã¯ã€ã“ã®æƒ…å ±ã‚’è£½å“使用ã®çµ±è¨ˆã‚’åŽé›†ã—ã€VirtualBox ニュースレターをé€ä¿¡ã™ã‚‹ãŸã‚ã ã‘ã«ä½¿ç”¨ã—ã¾ã™ã€‚Sun Microsystems ãŒå€‹äººæƒ…å ±ã‚’ç¬¬ä¸‰è€…ã«æ¸¡ã™ã“ã¨ã¯ã‚りã¾ã›ã‚“ã€‚å€‹äººæƒ…å ±ã®æ‰±ã„ã«é–¢ã™ã‚‹è©³ç´°æƒ…å ±ã¯ã€VirtualBox マニュアルã®"<b>Privacy Policy</b>" セクションã¾ãŸã¯ VirtualBox webサイトã®"<a href=http://www.virtualbox.org/wiki/PrivacyPolicy>Privacy Policy</a>"ページをå‚ç…§ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Check this box if you do not want to receive mail from Sun Microsystems at the e-mail address specified above.</source> <translation type="obsolete">Sun Microsystems ã‹ã‚‰ã®æƒ…å ±ãƒ¡ãƒ¼ãƒ«ã‚’å—ã‘å–りãŸããªã„å ´åˆã€ãƒã‚§ãƒƒã‚¯ãƒœãƒƒã‚¯ã‚¹ã‚’オンã«ã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>C&onfirm</source> <translation type="obsolete">確èª(&O)</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Cancel</source> <translation type="obsolete">ã‚ャンセル</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Select Country/Territory</source> <translation type="obsolete">国/åœ°åŸŸã‚’é¸æŠž</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <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 use your personal data can be found in the <b>Privacy Policy</b> section of the VirtualBox Manual or on the <a href=http://www.virtualbox.org/wiki/PrivacyPolicy>Privacy Policy</a> page of the VirtualBox web-site.</p></source> <translation type="obsolete"><p>登録フォームã«å…¥åŠ›ã—ã€ã‚ãªãŸãŒ VirtualBox を使用ã—ã¦ã„ã‚‹ã“ã¨ã‚’我々ã«çŸ¥ã‚‰ã›ã¦ãã ã•ã„。VirtualBox ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã¨æ›´æ–°æƒ…å ±ã‚’ãŠçŸ¥ã‚‰ã›ã—ã¾ã™(ä»»æ„)。</p><p>フルãƒãƒ¼ãƒ (英å—)ã¨ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’下ã®ãƒ•ィールドã«å…¥åŠ›ã—ã¦ãã ã•ã„。注:Sun Microsystems ã¯ã€ã“ã®æƒ…å ±ã‚’è£½å“使用ã®çµ±è¨ˆã‚’åŽé›†ã—ã€VirtualBox ニュースレターをé€ä¿¡ã™ã‚‹ãŸã‚ã ã‘ã«ä½¿ç”¨ã—ã¾ã™ã€‚Sun Microsystems ãŒå€‹äººæƒ…å ±ã‚’ç¬¬ä¸‰è€…ã«æ¸¡ã™ã“ã¨ã¯ã‚りã¾ã›ã‚“ã€‚å€‹äººæƒ…å ±ã®æ‰±ã„ã«é–¢ã™ã‚‹è©³ç´°æƒ…å ±ã¯ã€VirtualBox マニュアルã®"<b>Privacy Policy</b>" セクションã¾ãŸã¯ VirtualBox webサイトã®"<a href=http://www.virtualbox.org/wiki/PrivacyPolicy>Privacy Policy</a>"ページをå‚ç…§ã—ã¦ãã ã•ã„。</p></translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>I &already have a Sun Online account:</source> <translation type="obsolete">Sun オンライン アカウントã«ç™»éŒ²æ¸ˆã¿ã§ã™(&H):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&E-mail:</source> <translation type="obsolete">メールアドレス:</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&Password:</source> <translation type="obsolete">パスワード:</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>I &would like to create a new Sun Online account:</source> <translation type="obsolete">Sun オンライン アカウントを作æˆã—ã¦ç™»éŒ²ã—ã¾ã™(&W):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&First Name:</source> <translation type="obsolete">åå‰(&F):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&Last Name:</source> <translation type="obsolete">å§“(&L):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&Company:</source> <translation type="obsolete">会社(&C):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Co&untry:</source> <translation type="obsolete">国/地域(&U):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>E-&mail:</source> <translation type="obsolete">メールアドレス(&M):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>P&assword:</source> <translation type="obsolete">パスワード(&A):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>Co&nfirm Password:</source> <translation type="obsolete">パスワード確èª(&N):</translation> </message> <message> - <location filename="../src/globals/VBoxProblemReporter.cpp" line="2383"/> + <location filename="../src/globals/VBoxProblemReporter.cpp" line="2409"/> <source>&Register</source> <translation type="obsolete">登録(R)</translation> </message> @@ -12743,17 +12793,17 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<context> <name>VBoxScreenshotViewer</name> <message> - <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="191"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="199"/> <source>Screenshot of %1 (%2)</source> <translation>%1(%2)ã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆ</translation> </message> <message> - <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="227"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="235"/> <source>Click to view non-scaled screenshot.</source> <translation>クリックã—ã¦å®Ÿå¯¸ã®ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’表示ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="234"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="242"/> <source>Click to view scaled screenshot.</source> <translation>クリックã—ã¦ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’表示ã—ã¾ã™ã€‚</translation> </message> @@ -12761,218 +12811,218 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<context> <name>VBoxSelectorWnd</name> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1174"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="242"/> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1174"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="242"/> <source>&Details</source> <translation type="obsolete">詳細(&D)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1174"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="242"/> <source>Virtual &Disk Manager...</source> <translation type="obsolete">仮想ディスクマãƒãƒ¼ã‚¸ãƒ£(&D)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1174"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="242"/> <source>Ctrl+D</source> <translation type="obsolete">Ctrl+D</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1174"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="242"/> <source>Display the Virtual Disk Manager dialog</source> <translation type="obsolete">仮想ディスクマãƒãƒ¼ã‚¸ãƒ£ ダイアãƒã‚°ã‚’表示</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1223"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1217"/> <source>&Preferences...</source> <comment>global settings</comment> <translation>環境è¨å®š(&P)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1223"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1217"/> <source>Ctrl+G</source> <translation type="obsolete">Ctrl+G</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1226"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1219"/> <source>Display the global settings dialog</source> <translation>環境è¨å®šãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1228"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1221"/> <source>E&xit</source> <translation>終了(&X)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1228"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1221"/> <source>Ctrl+Q</source> <translation type="obsolete">Ctrl+Q</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1230"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1223"/> <source>Close application</source> <translation>アプリケーションを閉ã˜ã‚‹</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1232"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1225"/> <source>&New...</source> <translation>æ–°è¦(&N)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1232"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1225"/> <source>New</source> <translation type="obsolete">æ–°è¦</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1232"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1225"/> <source>Ctrl+N</source> <translation type="obsolete">Ctrl+N</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1234"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1227"/> <source>Create a new virtual machine</source> <translation>æ–°è¦ä»®æƒ³ãƒžã‚·ãƒ³ã®ä½œæˆ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1244"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1235"/> <source>&Settings...</source> <translation>è¨å®š(&S)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1244"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1235"/> <source>Settings</source> <translation type="obsolete">è¨å®š</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1244"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1235"/> <source>Ctrl+S</source> <translation type="obsolete">Ctrl+S</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1246"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1237"/> <source>Configure the selected virtual machine</source> <translation>é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã‚’è¨å®š</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1246"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1237"/> <source>&Delete</source> <translation type="obsolete">削除(&D)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1246"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1237"/> <source>Delete</source> <translation type="obsolete">削除</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1246"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1237"/> <source>Delete the selected virtual machine</source> <translation type="obsolete">é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã‚’削除</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1256"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1247"/> <source>D&iscard</source> <translation>ç ´æ£„(&I)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1256"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1247"/> <source>Discard</source> <translation type="obsolete">ç ´æ£„</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1250"/> <source>Discard the saved state of the selected virtual machine</source> <translation>é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã‚’ç ´æ£„</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1250"/> <source>&Refresh</source> <translation type="obsolete">æœ€æ–°ã®æƒ…å ±ã«æ›´æ–°(&R)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1250"/> <source>Refresh</source> <translation type="obsolete">æœ€æ–°ã®æƒ…å ±ã«æ›´æ–°</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1250"/> <source>Ctrl+R</source> <translation type="obsolete">Ctrl+R</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>Refresh the accessibility state of the selected virtual machine</source> <translation>é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã®ã‚¢ã‚¯ã‚»ã‚¹å¯å¦çŠ¶æ…‹ã‚’æœ€æ–°ã®æƒ…å ±ã«æ›´æ–°ã™ã‚‹</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>&Contents...</source> <translation type="obsolete">ヘルプを表示(&C)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>F1</source> <translation type="obsolete">F1</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>Show the online help contents</source> <translation type="obsolete">オンラインヘルプを表示</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>&VirtualBox Web Site...</source> <translation type="obsolete">VirtualBox Webサイト(&V)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>Open the browser and go to the VirtualBox product web site</source> <translation type="obsolete">Webブラウザã§VirtualBox製å“ã®Webサイトを開ã</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>&About VirtualBox...</source> <translation type="obsolete">VirtualBox ã«ã¤ã„ã¦(&A)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>Show a dialog with product information</source> <translation type="obsolete">è£½å“æƒ…å ±ãƒ€ã‚¤ã‚¢ãƒã‚°ã‚’表示</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>&Reset All Warnings</source> <translation type="obsolete">ã™ã¹ã¦ã®è¦å‘Šã‚’リセット(&R)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>Go back to showing all suppressed warnings and messages</source> <translation type="obsolete">ã™ã¹ã¦ã®æŠ‘æ¢ã•れãŸè¦å‘Šã¨ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å†åº¦è¡¨ç¤ºã•ã›ã‚‹</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1266"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1261"/> <source>&File</source> <translation type="obsolete">ファイル(&F)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1299"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1296"/> <source>&Help</source> <translation>ヘルプ(&H)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1299"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1296"/> <source>&Snapshots</source> <translation type="obsolete">スナップショット(&S)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1299"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1296"/> <source>D&escription</source> <translation type="obsolete">説明(&E)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1299"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1296"/> <source>D&escription *</source> <translation type="obsolete">説明(&E) *</translation> </message> @@ -12987,255 +13037,256 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<translation type="obsolete">表示</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1390"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1393"/> <source>Switch to the window of the selected virtual machine</source> <translation>é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«åˆ‡ã‚Šæ›¿ãˆ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1474"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1482"/> <source>S&tart</source> <translation>èµ·å‹•(&T)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1474"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1482"/> <source>Start</source> <translation type="obsolete">èµ·å‹•</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1476"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1484"/> <source>Start the selected virtual machine</source> <translation>é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã‚’èµ·å‹•</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1476"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1484"/> <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 get instant help, or visit <a href=http://www.virtualbox.org>www.virtualbox.org</a> for the latest information and news.</p></source> <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> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1298"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1295"/> <source>&Machine</source> <translation>仮想マシン(&M)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1268"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1263"/> <source>Show &Log...</source> <translation>ãƒã‚°ã‚’å‚ç…§(&L)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1268"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1263"/> <source>Show Log...</source> <translation type="obsolete">ãƒã‚°ã‚’å‚ç…§...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1268"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1263"/> <source>Ctrl+L</source> <translation type="obsolete">Ctrl+L</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1272"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1267"/> <source>Show the log files of the selected virtual machine</source> <translation>é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã®ãƒã‚°ãƒ•ァイルをå‚ç…§ã™ã‚‹</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1272"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1267"/> <source>R&egister VirtualBox...</source> <translation type="obsolete">VirtualBox を登録(&E)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1272"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1267"/> <source>Open VirtualBox registration form</source> <translation type="obsolete">VirtualBox 登録フォームを開ã</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1400"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1267"/> <source>R&esume</source> - <translation>å†é–‹(&E)</translation> + <translation type="obsolete">å†é–‹(&E)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1400"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1267"/> <source>Resume</source> <translation type="obsolete">å†é–‹</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1400"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1267"/> <source>Ctrl+P</source> <translation type="obsolete">Ctrl+P</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1403"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1405"/> <source>Resume the execution of the virtual machine</source> <translation>仮想マシンã®å®Ÿè¡Œã‚’å†é–‹ã™ã‚‹</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1410"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1254"/> <source>&Pause</source> <translation>ä¸€æ™‚åœæ¢(&P)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1410"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1254"/> <source>Pause</source> <translation type="obsolete">ä¸€æ™‚åœæ¢</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1413"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1414"/> <source>Suspend the execution of the virtual machine</source> <translation>仮想マシンã®å®Ÿè¡Œã‚’ä¸€æ™‚åœæ¢ã™ã‚‹</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1275"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1270"/> <source>Show in Finder</source> <translation>Finderã«è¡¨ç¤º</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1276"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1271"/> <source>Show the VirtualBox Machine Definition file in Finder.</source> <translation>仮想マシン定義ファイルをFinderã«è¡¨ç¤ºã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1277"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1272"/> <source>Create Alias on Desktop</source> <translation>エイリアスをデスクトップã«ä½œæˆ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1278"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1273"/> <source>Creates an Alias file to the VirtualBox Machine Definition file on your Desktop.</source> <translation>仮想マシン定義ファイルã®ã‚¨ã‚¤ãƒªã‚¢ã‚¹ã‚’デスクトップã«ä½œæˆã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1280"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1275"/> <source>Show in Explorer</source> <translation>エクスプãƒãƒ¼ãƒ©ãƒ¼ã«è¡¨ç¤º</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1281"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1276"/> <source>Show the VirtualBox Machine Definition file in Explorer.</source> <translation>仮想マシン定義ファイルをエクスプãƒãƒ¼ãƒ©ãƒ¼ã«è¡¨ç¤ºã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1287"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1282"/> <source>Create Shortcut on Desktop</source> <translation>ショートカットをデスクトップã«ä½œæˆ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1288"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1283"/> <source>Creates an Shortcut file to the VirtualBox Machine Definition file on your Desktop.</source> <translation>仮想マシン定義ファイルã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚’デスクトップã«ä½œæˆã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1285"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1280"/> <source>Show in File Manager</source> <translation>ファイルマãƒãƒ¼ã‚¸ãƒ£ã«è¡¨ç¤º</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1286"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1281"/> <source>Show the VirtualBox Machine Definition file in the File Manager</source> <translation>仮想マシン定義ファイルをファイルマãƒãƒ¼ã‚¸ãƒ£ã«è¡¨ç¤ºã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1294"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1291"/> <source>&File</source> <comment>Mac OS X version</comment> <translation>ファイル(&F)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1296"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1293"/> <source>&File</source> <comment>Non Mac OS X version</comment> <translation>ファイル(&F)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1446"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1454"/> <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 get instant help, or visit <a href=http://www.virtualbox.org>www.virtualbox.org</a> for the latest information and news.</p></source> <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> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1663"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1671"/> <source>Show Toolbar</source> <translation>ツールãƒãƒ¼ã‚’表示</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1667"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1675"/> <source>Show Statusbar</source> <translation>ステータスãƒãƒ¼ã‚’表示</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1193"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1205"/> <source>&Virtual Media Manager...</source> <translation>仮想メディアマãƒãƒ¼ã‚¸ãƒ£(&V)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="644"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="652"/> <source>Select a virtual machine file</source> <translation>ä»®æƒ³ãƒžã‚·ãƒ³ãƒ•ã‚¡ã‚¤ãƒ«ã‚’é¸æŠž</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="648"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="656"/> <source>Virtual machine files (%1)</source> <translation>仮想マシンファイル(%1)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1178"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1190"/> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>マãƒãƒ¼ã‚¸ãƒ£ãƒ¼</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1195"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1207"/> <source>Display the Virtual Media Manager dialog</source> <translation>仮想メディアマãƒãƒ¼ã‚¸ãƒ£ ダイアãƒã‚°ã‚’表示</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1238"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1231"/> <source>&Add...</source> <translation>è¿½åŠ (&A)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1240"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1233"/> <source>Add an existing virtual machine</source> <translation>æ—¢å˜ã®ä»®æƒ³ãƒžã‚·ãƒ³ã‚’è¿½åŠ </translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1250"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1241"/> <source>&Remove</source> <translation>除去(&R)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1252"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1243"/> <source>Remove the selected virtual machine</source> <translation>é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã‚’除去</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1269"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> <source>Log</source> <comment>icon text</comment> <translation>ãƒã‚°</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1269"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> <source>Sun VirtualBox</source> <translation type="obsolete">Sun VirtualBox</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1197"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1209"/> <source>&Import Appliance...</source> <translation>仮想アプライアンスã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆ(&I)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1199"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1211"/> <source>Import an appliance into VirtualBox</source> <translation>仮想アプライアンスをVirtualBoxã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1201"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1213"/> <source>&Export Appliance...</source> <translation>仮想アプライアンスã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ(&E)...</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1203"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1215"/> <source>Export one or more VirtualBox virtual machines as an appliance</source> <translation>VirtualBoxã®ä»®æƒ³ãƒžã‚·ãƒ³ã‚’仮想アプライアンスã«ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Re&fresh</source> <translation>æœ€æ–°ã®æƒ…å ±ã«æ›´æ–°(&F)</translation> </message> @@ -13243,27 +13294,27 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<context> <name>VBoxSettingsDialog</name> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <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> <translation type="obsolete"><i>å·¦å´ã®ãƒªã‚¹ãƒˆã‹ã‚‰è¨å®šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã€è¨å®šé …目をマウスオーãƒãƒ¼ã—ã¦è©³ç´°ãªæƒ…å ±ã‚’å‚ç…§ã—ã¦ãã ã•ã„<i>。</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Invalid settings detected</source> <translation type="obsolete">無効ãªè¨å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Settings</source> <translation type="obsolete">è¨å®š</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Non-optimal settings detected</source> <translation type="obsolete">最é©åŒ–ã•れã¦ã„ãªã„è¨å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã—ãŸ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>On the <b>%1</b> page, %2</source> <translation type="obsolete"><b>%1</b>ページ:%2</translation> </message> @@ -13271,22 +13322,22 @@ USBãƒ•ã‚£ãƒ«ã‚¿ã‚’è¿½åŠ ã¾ãŸã¯é™¤åŽ»ã™ã‚‹ã«ã¯ã‚³ãƒ³ãƒ†ã‚ストメニュム<context> <name>VBoxSharedFoldersSettings</name> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Name</source> <translation type="obsolete">åå‰</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Path</source> <translation type="obsolete">パス</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Shared &Folders</source> <translation type="obsolete">共有フォルダ(&F)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source><qt>Lists all shared folders accessible to this machine. Use <tt>net use x: \\vboxsvr\share</tt> @@ -13299,78 +13350,78 @@ DOS系ゲストOSã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å ´åˆã¯ <tt>net use x:¥¥vboxs 本機能を使用ã™ã‚‹ã«ã¯ Guest Additions ã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒå¿…è¦ã§ã™ã€‚</qt></translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Adds a new shared folder definition.</source> <translation type="obsolete">æ–°è¦å…±æœ‰ãƒ•ã‚©ãƒ«ãƒ€ã‚’è¿½åŠ ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Removes the selected shared folder definition.</source> <translation type="obsolete">é¸æŠžã—ãŸå…±æœ‰ãƒ•ォルダã®è¨å®šã‚’削除ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source> Machine Folders</source> <translation type="obsolete">共有フォルダ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source> Transient Folders</source> <translation type="obsolete">一時的ãªå…±æœ‰ãƒ•ォルダ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Edits the selected shared folder definition.</source> <translation type="obsolete">é¸æŠžã—ãŸå…±æœ‰ãƒ•ォルダã®è¨å®šã‚’編集ã—ã¾ã™ã€‚</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>VBoxSharedFoldersSettings</source> <comment>don't translate</comment> <translation type="obsolete">VBoxSharedFoldersSettings</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Ins</source> <translation type="obsolete">Ins</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Add a new shared folder (Ins)</source> <translation type="obsolete">æ–°è¦å…±æœ‰ãƒ•ã‚©ãƒ«ãƒ€ã‚’è¿½åŠ (Ins)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Del</source> <translation type="obsolete">Del</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Remove the selected shared folder (Del)</source> <translation type="obsolete">é¸æŠžã—ãŸå…±æœ‰ãƒ•ォルダを削除(Del)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Access</source> <translation type="obsolete">アクセス権</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Ctrl+Space</source> <translation type="obsolete">Ctrl+スペース</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Edit the selected shared folder (Ctrl+Space)</source> <translation type="obsolete">é¸æŠžã—ãŸå…±æœ‰ãƒ•ォルダã®è¨å®šã‚’編集(Ctrl+スペース)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Full</source> <translation type="obsolete">完全</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Read-only</source> <translation type="obsolete">èªã¿è¾¼ã¿å°‚用</translation> </message> @@ -13378,62 +13429,62 @@ DOS系ゲストOSã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å ´åˆã¯ <tt>net use x:¥¥vboxs <context> <name>VBoxSnapshotDetailsDlg</name> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>VBoxSnapshotDetailsDlg</source> <translation type="obsolete">VBoxSnapshotDetailsDlg</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source> Snapshot Details </source> <translation type="obsolete">スナップショット詳細</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>&Name</source> <translation type="obsolete">åå‰(&N)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>&Description</source> <translation type="obsolete">説明(&D)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>&Machine Details</source> <translation type="obsolete">仮想マシン詳細(&M)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Help</source> <translation type="obsolete">ヘルプ</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>F1</source> <translation type="obsolete">F1</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>&OK</source> <translation type="obsolete">OK(&O)</translation> </message> <message> - <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1264"/> + <location filename="../src/selector/VBoxSelectorWnd.cpp" line="1258"/> <source>Cancel</source> <translation type="obsolete">ã‚ャンセル</translation> </message> <message> - <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="122"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="130"/> <source>Details of %1 (%2)</source> <translation>%1 (%2)ã®è©³ç´°</translation> </message> <message> - <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="122"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="130"/> <source>Snapshot Details</source> <translation type="obsolete">スナップショット詳細</translation> </message> <message> - <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="124"/> + <location filename="../src/VBoxSnapshotDetailsDlg.cpp" line="132"/> <source>Click to enlarge the screenshot.</source> <translation>クリックã—ã¦ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’拡大ã—ã¾ã™ã€‚</translation> </message> @@ -13705,17 +13756,17 @@ DOS系ゲストOSã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å ´åˆã¯ <tt>net use x:¥¥vboxs <context> <name>VBoxSwitchMenu</name> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="5436"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="5504"/> <source>Disable</source> <translation>無効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="5436"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="5504"/> <source>Enable</source> <translation>有効</translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="5436"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="5504"/> <source>%1 %2</source> <translation type="obsolete">%1 %2</translation> </message> @@ -13990,13 +14041,13 @@ value.</qt></source> <context> <name>VBoxUSBMenu</name> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="5366"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="5434"/> <source><no devices available></source> <comment>USB devices</comment> <translation><利用ã§ãるデãƒã‚¤ã‚¹ãŒã‚りã¾ã›ã‚“></translation> </message> <message> - <location filename="../src/globals/VBoxGlobal.cpp" line="5368"/> + <location filename="../src/globals/VBoxGlobal.cpp" line="5436"/> <source>No supported devices connected to the host PC</source> <comment>USB device tooltip</comment> <translation>ãƒ›ã‚¹ãƒˆãƒžã‚·ãƒ³ã«æŽ¥ç¶šã•れãŸãƒ‡ãƒã‚¤ã‚¹ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“</translation> @@ -14005,124 +14056,124 @@ value.</qt></source> <context> <name>VBoxUpdateDlg</name> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="192"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="79"/> <source>1 day</source> <translation>1æ—¥</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="193"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="80"/> <source>2 days</source> <translation>2æ—¥</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="194"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="81"/> <source>3 days</source> <translation>3æ—¥</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="195"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="82"/> <source>4 days</source> <translation>4æ—¥</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="196"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="83"/> <source>5 days</source> <translation>5æ—¥</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="197"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="84"/> <source>6 days</source> <translation>6æ—¥</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="200"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="87"/> <source>1 week</source> <translation>1週間</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="201"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="88"/> <source>2 weeks</source> <translation>2週間</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="202"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="89"/> <source>3 weeks</source> <translation>3週間</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="205"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="92"/> <source>1 month</source> <translation>1月</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="254"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="141"/> <source>Never</source> <translation>確èªã—ãªã„</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="254"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="141"/> <source>Connection timed out.</source> <translation type="obsolete">接続ãŒã‚¿ã‚¤ãƒ アウトã«ãªã‚Šã¾ã—ãŸã€‚</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="254"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="141"/> <source>Could not locate the latest version list on the server (response: %1).</source> <translation type="obsolete">サーãƒãƒ¼ä¸Šã«æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ(応ç”: %1)。</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="404"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="291"/> <source>Chec&k</source> <translation>確èª(&K)</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="408"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="295"/> <source>&Close</source> <translation>é–‰ã˜ã‚‹(&C)</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="401"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="288"/> <source>VirtualBox Update Wizard</source> <translation>VirtualBox アップデート ウィザード</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="403"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="290"/> <source>Check for Updates</source> <translation>アップデートを確èª</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="403"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="290"/> <source><p>This wizard will connect to the VirtualBox web-site and check if a newer version of VirtualBox is available.</p> <p>Use the <b>Check</b> button to check for a new version now or the <b>Cancel</b> button if you do not want to perform this check.</p> <p>You can run this wizard at any time by choosing <b>Check for Updates...</b> from the <b>Help</b> menu.</p></source> <translation type="obsolete"><p>ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯ã€VirtualBox Webã‚µã‚¤ãƒˆã«æŽ¥ç¶šã—ã¦ã€VirtualBoxã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã‹ã©ã†ã‹ç¢ºèªã—ã¾ã™ã€‚</p><p><b>[確èª]</b>ボタンをクリックã—ã¦æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’今ã™ã確èªã—ã¦ãã ã•ã„。確èªã—ãªã„å ´åˆã¯<b>[ã‚ャンセル]</b>ボタンをクリックã—ã¦ãã ã•ã„。</p><p>ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯<b>[ヘルプ]</b>メニューã‹ã‚‰<b>[アップデートを確èª...]</b>ã‚’é¸ã¶ã“ã¨ã§ã€ã„ã¤ã§ã‚‚実行ã§ãã¾ã™ã€‚</p></translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="405"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="292"/> <source>Cancel</source> <translation>ã‚ャンセル</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="407"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="294"/> <source>Summary</source> <translation>概è¦</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="419"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="306"/> <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> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="425"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="312"/> <source><p>Unable to obtain the new version information due to the following network error:</p><p><b>%1</b></p></source> <translation><p>ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ã®ãŸã‚ã€æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³æƒ…å ±ã‚’å–å¾—ã§ãã¾ã›ã‚“:</p><p><b>%1</b></p></translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="428"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="315"/> <source>You are already running the most recent version of VirtualBox.</source> <translation>最新ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®VirtualBoxãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã¾ã™ã€‚ 後ã§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç¢ºèªã‚’行ã£ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="410"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="297"/> <source><p>This wizard will connect to the VirtualBox web-site and check if a newer version of VirtualBox is available.</p><p>Use the <b>Check</b> button to check for a new version now or the <b>Cancel</b> button if you do not want to perform this check.</p><p>You can run this wizard at any time by choosing <b>Check for Updates...</b> from the <b>Help</b> menu.</p></source> <translation><p>ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯ã€VirtualBox Webã‚µã‚¤ãƒˆã«æŽ¥ç¶šã—ã¦ã€VirtualBoxã®æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒåˆ©ç”¨å¯èƒ½ã‹ã©ã†ã‹ç¢ºèªã—ã¾ã™ã€‚</p><p><b>[確èª]</b>ボタンをクリックã—ã¦æ–°ã—ã„ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’今ã™ã確èªã—ã¦ãã ã•ã„。確èªã—ãªã„å ´åˆã¯<b>[ã‚ャンセル]</b>ボタンをクリックã—ã¦ãã ã•ã„。</p><p>ã“ã®ã‚¦ã‚£ã‚¶ãƒ¼ãƒ‰ã¯<b>[ヘルプ]</b>メニューã‹ã‚‰<b>[アップデートを確èª...]</b>ã‚’é¸ã¶ã“ã¨ã§ã€ã„ã¤ã§ã‚‚実行ã§ãã¾ã™ã€‚</p></translation> </message> @@ -14130,22 +14181,22 @@ value.</qt></source> <context> <name>VBoxVMDescriptionPage</name> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="410"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="297"/> <source>No description. Press the Edit button below to add it.</source> <translation type="obsolete">説明ãŒã‚りã¾ã›ã‚“。[編集]ボタンをクリックã—ã¦è¿½åŠ ã—ã¦ãã ã•ã„。</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="410"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="297"/> <source>Edit</source> <translation type="obsolete">編集</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="410"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="297"/> <source>Edit (Ctrl+E)</source> <translation type="obsolete">編集(Ctrl+E)</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="410"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="297"/> <source>Ctrl+E</source> <translation type="obsolete">Ctrl+E</translation> </message> @@ -14153,7 +14204,7 @@ value.</qt></source> <context> <name>VBoxVMDetailsView</name> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="410"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="297"/> <source>The selected virtual machine is <i>inaccessible</i>. Please inspect the error message shown below and press the <b>Refresh</b> button if you want to repeat the accessibility check:</source> <translation type="obsolete">é¸æŠžã—ãŸä»®æƒ³ãƒžã‚·ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã›ã‚“。アクセスå¯å¦ã‚’å†ç¢ºèªã™ã‚‹ã«ã¯ä»¥ä¸‹ã«ç¤ºã•れãŸã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’調査ã—ã¦<b>[æœ€æ–°ã®æƒ…å ±ã«æ›´æ–°]</b>ボタンをクリックã—ã¦ãã ã•ã„:</translation> </message> @@ -14161,12 +14212,12 @@ value.</qt></source> <context> <name>VBoxVMInformationDlg</name> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="410"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="297"/> <source>Session Information Dialog</source> <translation type="obsolete">ã‚»ãƒƒã‚·ãƒ§ãƒ³æƒ…å ±ãƒ€ã‚¤ã‚¢ãƒã‚°</translation> </message> <message> - <location filename="../src/VBoxUpdateDlg.cpp" line="410"/> + <location filename="../src/VBoxUpdateDlg.cpp" line="297"/> <source>&Close</source> <translation type="obsolete">é–‰ã˜ã‚‹(&C)</translation> </message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts index 9ed835f13..a41b6691b 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_km_KH.ts @@ -111,185 +111,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>ឆ្វáŸáž„ </translation> - </message> - <message> - <source>Right </source> - <translation>ស្ដាំ </translation> - </message> - <message> - <source>Left Shift</source> - <translation>ប្ដូរ(Shift) ឆ្វáŸáž„</translation> - </message> - <message> - <source>Right Shift</source> - <translation>ប្ដូរ(Shift) ស្ដាំ</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>បញ្ជា (Ctrl) ឆ្វáŸáž„</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>បញ្ជា(Ctrl) ស្ដាំ</translation> - </message> - <message> - <source>Left Alt</source> - <translation>ជំនួស​(Alt) ឆ្វáŸáž„</translation> - </message> - <message> - <source>Right Alt</source> - <translation>ជំនួស​(Alt) ស្ដាំ</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>គ្រាប់ចុច(Win) ឆ្វáŸáž„</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>គ្រាប់ចុច(Win) ស្ដាំ</translation> - </message> - <message> - <source>Menu key</source> - <translation>គ្រាប់ចុច​ម៉ឺនុយ</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>ប្ដូរ​ជាប់(Caps Lock)</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>ផ្អាក</translation> - </message> - <message> - <source>Print Screen</source> - <translation>បោះពុម្ព​អáŸáž€áŸ’រង់</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>ប្ដូរជាប់ (Num Lock)</translation> - </message> - <message> - <source>Forward</source> - <translation>បញ្ជូន​បន្áž</translation> - </message> - <message> - <source>Back</source> - <translation>ážáž™áž€áŸ’រោយ</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -478,7 +299,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>បិទ ACPI</translation> + <translation type="obsolete">បិទ ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1533,6 +1354,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1600,14 +1425,6 @@ p, li { white-space: pre-wrap; } <translation type="unfinished">បង្ហាញគ្រាប់ចុច​ដែល​បាន​ប្រើ​ជា​គ្រាប់​ចុច​ម៉ាស៊ីន​នៅ​ក្នុង​បង្អួច VM ។ ធ្វើ​ឲ្យ​វាល​ធាážáž»â€‹ážŸáž€áž˜áŸ’ម ហើយ​ចុច​គ្រាប់ចុច​ម៉ាស៊ីន​ážáŸ’មី ។ ចំណាំážáž¶â€‹áž›áŸáž ចលនា​ទស្សនáŸáž‘្រនិច និង​គ្រាប់ចុចកែសម្រួល​មិនអាច​ážáŸ’រូវ​បាន​ប្រើ​ជា​គ្រាប់ចុច​ម៉ាស៊ីន​ទáŸÂ ។</translation> </message> <message> - <source>Reset Host Key</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished"></translation> - </message> - <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished">នៅពáŸáž›â€‹áž”ានគូស​ធីក ក្ដារចុច​ážáŸ’រូ​វបាន​ចាប់យក​ដោយ​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·â€‹ážšáž¶áž›áŸ‹áž–áŸáž›â€‹ážŠáŸ‚ល​បង្អួច VM ážáŸ’រូវ​បាន​ធ្វើ​ឲ្យ​សកម្ម ។ នៅពáŸáž›â€‹áž€áŸ’ដារចុច​ážáŸ’រូវ​បាន​ចាប់យក keystrokes (រួម​មាន​ប្រពáŸáž“្ធ​​មួយ ដូចជា ជំនួស(Alt)-ážáŸáž”(Tab)) ážáŸ’រូវ​បាន​បញ្ជូន​ទៅ​កាន់ VM ។</translation> </message> @@ -1615,6 +1432,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation type="unfinished">ចាប់យក​ក្ដារចុច​ដោយ​ស្វáŸáž™â€‹áž”្រវážáŸ’ážáž·</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1905,7 +1730,7 @@ creating/removing host-only network</comment> <translation type="obsolete">ការ​អនុវážáŸ’ážâ€‹</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -2063,6 +1888,189 @@ creating/removing host-only network</comment> </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>ឆ្វáŸáž„ </translation> + </message> + <message> + <source>Right </source> + <translation>ស្ដាំ </translation> + </message> + <message> + <source>Left Shift</source> + <translation>ប្ដូរ(Shift) ឆ្វáŸáž„</translation> + </message> + <message> + <source>Right Shift</source> + <translation>ប្ដូរ(Shift) ស្ដាំ</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>បញ្ជា (Ctrl) ឆ្វáŸáž„</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>បញ្ជា(Ctrl) ស្ដាំ</translation> + </message> + <message> + <source>Left Alt</source> + <translation>ជំនួស​(Alt) ឆ្វáŸáž„</translation> + </message> + <message> + <source>Right Alt</source> + <translation>ជំនួស​(Alt) ស្ដាំ</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>គ្រាប់ចុច(Win) ឆ្វáŸáž„</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>គ្រាប់ចុច(Win) ស្ដាំ</translation> + </message> + <message> + <source>Menu key</source> + <translation>គ្រាប់ចុច​ម៉ឺនុយ</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>ប្ដូរ​ជាប់(Caps Lock)</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">ផ្អាក</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">បោះពុម្ព​អáŸáž€áŸ’រង់</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">ប្ដូរជាប់ (Num Lock)</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">បញ្ជូន​បន្áž</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">ážáž™áž€áŸ’រោយ</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">គ្មាន</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2296,7 +2304,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3567,6 +3575,10 @@ network adapter name</comment> <comment>USB filter tooltip</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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7003,7 +7015,7 @@ medium</comment> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' គឺជា​កូដ​គ្រាប់ចុច​ម៉ាស៊ីន​មិនážáŸ’រឹមážáŸ’រូវ ។</translation> + <translation type="obsolete">'%1 (0x%2)' គឺជា​កូដ​គ្រាប់ចុច​ម៉ាស៊ីន​មិនážáŸ’រឹមážáŸ’រូវ ។</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7013,6 +7025,10 @@ medium</comment> <source>Cannot delete the key '%1'.</source> <translation>មិន​អាច​លុប​គ្រាប់ចុច '%1' បានទáŸÂ ។</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -8423,10 +8439,6 @@ medium</comment> <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -8511,6 +8523,18 @@ medium</comment> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8621,7 +8645,7 @@ medium</comment> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8730,7 +8754,7 @@ medium</comment> </message> <message> <source>R&esume</source> - <translation>បន្áž</translation> + <translation type="obsolete">បន្áž</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8805,6 +8829,7 @@ medium</comment> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts index 506a47978..a66b145ca 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ko.ts @@ -137,185 +137,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>왼쪽 </translation> - </message> - <message> - <source>Right </source> - <translation>오른쪽 </translation> - </message> - <message> - <source>Left Shift</source> - <translation>왼쪽 Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>오른쪽 Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>왼쪽 Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>오른쪽 Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>왼쪽 Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>오른쪽 Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>왼쪽 ìœˆë„ í‚¤</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>오른쪽 ìœˆë„ í‚¤</translation> - </message> - <message> - <source>Menu key</source> - <translation>메뉴 키</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><키 %1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>앞으로</translation> - </message> - <message> - <source>Back</source> - <translation>뒤로</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -515,7 +336,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI 종료(&H)</translation> + <translation type="obsolete">ACPI 종료(&H)</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1604,6 +1425,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>확장 패키지 íŒŒì¼ (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation>확장</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1672,11 +1497,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>호스트 키 초기화</translation> + <translation type="obsolete">호스트 키 초기화</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>ê°€ìƒ ë¨¸ì‹ ì°½ì— ì‚¬ìš©í•˜ëŠ” 호스트 키를 초기화합니다.</translation> + <translation type="obsolete">ê°€ìƒ ë¨¸ì‹ ì°½ì— ì‚¬ìš©í•˜ëŠ” 호스트 키를 초기화합니다.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1686,6 +1511,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>ìžë™ìœ¼ë¡œ 키보드 잡기(&A)</translation> </message> + <message> + <source>Reset host combination</source> + <translation>호스트 키 ì¡°í•© 초기화</translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>ê°€ìƒ ë¨¸ì‹ ì°½ì— ì‚¬ìš©í•˜ëŠ” 호스트 키 ì¡°í•©ì„ ì´ˆê¸°í™”í•©ë‹ˆë‹¤.</translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1888,7 +1721,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>새 호스트 ì „ìš© ì¸í„°íŽ˜ì´ìФ</translation> + <translation type="obsolete">새 호스트 ì „ìš© ì¸í„°íŽ˜ì´ìФ</translation> + </message> + <message> + <source>Networking</source> + <translation>네트워킹</translation> </message> </context> <context> @@ -2045,6 +1882,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>왼쪽 </translation> + </message> + <message> + <source>Right </source> + <translation>오른쪽 </translation> + </message> + <message> + <source>Left Shift</source> + <translation>왼쪽 Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>오른쪽 Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>왼쪽 Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>오른쪽 Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>왼쪽 Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>오른쪽 Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>왼쪽 ìœˆë„ í‚¤</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>오른쪽 ìœˆë„ í‚¤</translation> + </message> + <message> + <source>Menu key</source> + <translation>메뉴 키</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><키 %1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">앞으로</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">뒤로</translation> + </message> + <message> + <source>None</source> + <translation>ì—†ìŒ</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2278,7 +2298,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3939,6 +3959,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <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. 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.</source> + <translation>현재 ê°€ìƒ ë¨¸ì‹ ì—서 USB 2.0ì„ ì‚¬ìš©í• ìˆ˜ 있으나, <b>%1</b>ì„(를) 설치해야 합니다. VirtualBox 다운로드 사ì´íЏì—서 확장 기능 패키지를 설치하면 USB 2.0ì„ ì‚¬ìš©í• ìˆ˜ 있습니다. ì´ëŒ€ë¡œ 변경 사í•ì„ ì €ìž¥í•˜ë©´ 확장 기능 패키지를 설치하기 ì „ê¹Œì§€ USB 2.0ì„ ì‚¬ìš©í• ìˆ˜ 없습니다.</translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7111,7 +7135,7 @@ p, li { white-space: pre-wrap; } <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)'ì€(는) ìž˜ëª»ëœ í˜¸ìŠ¤íŠ¸ 키 코드입니다.</translation> + <translation type="obsolete">'%1 (0x%2)'ì€(는) ìž˜ëª»ëœ í˜¸ìŠ¤íŠ¸ 키 코드입니다.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7121,6 +7145,10 @@ p, li { white-space: pre-wrap; } <source>Cannot delete the key '%1'.</source> <translation>키 '%1'ì„(를) ì‚ì œí• ìˆ˜ 없습니다.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>'%1'ì€(는) 올바르지 ì•Šì€ í˜¸ìŠ¤íŠ¸ 키 조합입니다.</translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -8510,7 +8538,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Sorry, some generic error happens.</source> - <translation>ì¼ë°˜ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤.</translation> + <translation type="obsolete">ì¼ë°˜ 오류가 ë°œìƒí•˜ì˜€ìŠµë‹ˆë‹¤.</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> @@ -8597,6 +8625,18 @@ p, li { white-space: pre-wrap; } <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>확장 기능 패키지 <br><nobr><b>%1</b></nobr><br>ì´(ê°€) 설치ë˜ì—ˆìŠµë‹ˆë‹¤.</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> + <translation>ì¶©ëŒì„ 방지하기 위하여 64비트 윈ë„ì—서는 ê°€ìƒ ë¨¸ì‹ ì— ì†í•´ 있는 ëª¨ë“ íŒŒì¼ì„ ì‚ì œí• ìˆ˜ 없습니다. ê³§ ìˆ˜ì •í•˜ê² ìŠµë‹ˆë‹¤.</translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>부모 í´ë” <nobr><b>%2</b></nobr> ì•ˆì— ë¨¸ì‹ í´ë” <b>%1</b>ì„(를) 만들 수 없습니다.</p><p>부모 í´ë”ê°€ 존재하는지 여부 ë° ë¨¸ì‹ í´ë”를 만들 ê¶Œí•œì´ ìžˆëŠ”ì§€ 여부를 확ì¸í•˜ì‹ì‹œì˜¤.</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> + <translation><p>현재 ê°€ìƒ ë¨¸ì‹ ì—서 USB 2.0ì„ ì‚¬ìš©í• ìˆ˜ 있으나, <b><nobr>%1</nobr></b>ì„(를) 설치해야 합니다.</p><p>VirtualBox 다운로드 사ì´íЏì—서 확장 기능 패키지를 설치하면 USB 2.0ì„ ì‚¬ìš©í• ìˆ˜ 있습니다. ì´ëŒ€ë¡œ 변경 사í•ì„ ì €ìž¥í•˜ë©´ 확장 기능 패키지를 설치하기 ì „ê¹Œì§€ USB 2.0ì„ ì‚¬ìš©í• ìˆ˜ 없습니다.</p></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8731,7 +8771,7 @@ p, li { white-space: pre-wrap; } <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8840,7 +8880,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>R&esume</source> - <translation>다시 시작(&E)</translation> + <translation type="obsolete">다시 시작(&E)</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8915,6 +8955,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>관리ìž</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts index d8f623298..7a8f0f3bd 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_lt.ts @@ -111,185 +111,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>KairÄ—n </translation> - </message> - <message> - <source>Right </source> - <translation>DeÅ¡inÄ—n </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Kairysis Lyg2</translation> - </message> - <message> - <source>Right Shift</source> - <translation>DeÅ¡inysis Lyg2</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Kairysis Vald</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>DeÅ¡inysis Vald</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Kairysis Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>DeÅ¡inysis Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Kairysis Win</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>DeÅ¡inysis Win</translation> - </message> - <message> - <source>Menu key</source> - <translation>Meniu klaviÅ¡as</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Lyg3</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Didž(iosios)</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Slinkti</translation> - </message> - <message> - <source><key_%1></source> - <translation><%1_klaviÅ¡as></translation> - </message> - <message> - <source>Pause</source> - <translation>PauzÄ—</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Ekrano nuotrauka</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Skaitm(enys)</translation> - </message> - <message> - <source>Forward</source> - <translation>Toliau</translation> - </message> - <message> - <source>Back</source> - <translation>Atgal</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -470,11 +291,11 @@ </message> <message> <source>&Reset</source> - <translation>&Perkrauti</translation> + <translation>&Paleisti iÅ¡ naujo</translation> </message> <message> <source>Reset the virtual machine</source> - <translation>Perkrauti virtualiÄ… maÅ¡inÄ…</translation> + <translation>IÅ¡ naujo paleisti virtualiÄ… maÅ¡inÄ…</translation> </message> <message> <source>ACPI Sh&utdown</source> @@ -482,7 +303,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>IÅ¡junti per &ACPI</translation> + <translation type="obsolete">IÅ¡junti per &ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1321,7 +1142,7 @@ <name>UIGlobalSettingsExtension</name> <message> <source>&Extension Packages:</source> - <translation>&Papildinių paketai</translation> + <translation>&Papildinių paketai:</translation> </message> <message> <source>Lists all installed packages.</source> @@ -1355,6 +1176,10 @@ <source>Extension package files (%1)</source> <translation>Papildinių paketų rinkmennos (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation>Papildiniai</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1399,19 +1224,19 @@ <name>UIGlobalSettingsInput</name> <message> <source>Host &Key:</source> - <translation>Pagrindinis &klaviÅ¡as:</translation> + <translation>Pagr. kompiuterio &klaviÅ¡as:</translation> </message> <message> <source>Displays the key used as a Host Key in the VM window. Activate the entry field and press a new Host Key. Note that alphanumeric, cursor movement and editing keys cannot be used.</source> - <translation>Rodo klavišą, naudojamÄ… kaip pagrindinį klavišą VM lange. Aktyvuokite įvedimo laukelį ir nuspauskite bÅ«simÄ… pagrindinį klavišą. Atminkite, kad negalima priskirti raidžių, skaiÄių, žymeklio perkÄ—limo, redagavimo klavišų.</translation> + <translation>Rodo klavišą, naudojamÄ… kaip pagrindinio kompiuterio klavišą VM lange. Aktyvuokite įvedimo laukelį ir nuspauskite bÅ«simÄ… pagrindinį klavišą. Atminkite, kad negalima priskirti raidžių, skaiÄių, žymeklio perkÄ—limo, redagavimo klavišų.</translation> </message> <message> <source>Reset Host Key</source> - <translation>Atstatyti pagrindinį klavišą</translation> + <translation type="obsolete">Atstatyti pagrindinį klavišą</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Klavišą atstato į numatytÄ…jį pagrindinį klavišą VM lange.</translation> + <translation type="obsolete">Klavišą atstato į numatytÄ…jį pagrindinį klavišą VM lange.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1421,6 +1246,14 @@ <source>&Auto Capture Keyboard</source> <translation>&AutomatiÅ¡kai reaguoti į klaviatÅ«rÄ…</translation> </message> + <message> + <source>Reset host combination</source> + <translation>Atstatyti pagr. kompiuterio kombinacijÄ…</translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>Atstatyti klavišų kombinacijÄ…, kuri naudojama kaip pagrindinio kompiuterio kombinacija VM lange.</translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1612,8 +1445,8 @@ <translation>&Keisti tinklÄ… prie pagr. kompiuterio</translation> </message> <message> - <source>New Host-Only Interface</source> - <translation type="unfinished"></translation> + <source>Networking</source> + <translation>Tinklas</translation> </message> </context> <context> @@ -1770,6 +1603,189 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>KairÄ—n </translation> + </message> + <message> + <source>Right </source> + <translation>DeÅ¡inÄ—n </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Kairysis Lyg2</translation> + </message> + <message> + <source>Right Shift</source> + <translation>DeÅ¡inysis Lyg2</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Kairysis Vald</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>DeÅ¡inysis Vald</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Kairysis Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>DeÅ¡inysis Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Kairysis Win</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>DeÅ¡inysis Win</translation> + </message> + <message> + <source>Menu key</source> + <translation>Meniu klaviÅ¡as</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Lyg3</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Didž(iosios)</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Slinkti</translation> + </message> + <message> + <source><key_%1></source> + <translation><%1_klaviÅ¡as></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">PauzÄ—</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Ekrano nuotrauka</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Skaitm(enys)</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Toliau</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Atgal</translation> + </message> + <message> + <source>None</source> + <translation>NÄ—ra</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -2035,7 +2051,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -2217,7 +2233,7 @@ </message> <message> <source>You have 3D Acceleration enabled for a operation system which uses the WDDM video driver. For maximal performance set the guest VRAM to at least <b>%1</b>.</source> - <translation type="unfinished"></translation> + <translation>Ä®galinote 3D spartinimÄ… operacinei sistemai, kuri naudoja WDDM vaizdo tvarkyklÄ™. DidžiausiÄ… naÅ¡umÄ… pasieksite, jei vaizdo laisvosios prieigos atminÄiai paskirsite bent <b>%1</b>. </translation> </message> <message> <source><qt>%1&nbsp;MB</qt></source> @@ -2993,7 +3009,7 @@ </message> <message> <source>&Chipset:</source> - <translation>&Lustų rinkinys</translation> + <translation>&Lustų rinkinys:</translation> </message> <message> <source>Defines chipset type used in this VM.</source> @@ -3245,6 +3261,10 @@ <comment>USB filter tooltip</comment> <translation><nobr>BÅ«sena: %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. 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.</source> + <translation>Å 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> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -3695,7 +3715,7 @@ <message> <source>Boot Hard Disk</source> <comment>summary</comment> - <translation>Paleidžiamas standusis diskas</translation> + <translation>Standusis diskas, iÅ¡ kurio paleidžiama</translation> </message> </context> <context> @@ -6888,7 +6908,7 @@ IPv6.</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>„%1 (0x%2)“ nÄ—ra tinkamas rakto kodas.</translation> + <translation type="obsolete">„%1 (0x%2)“ nÄ—ra tinkamas rakto kodas.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -6898,6 +6918,10 @@ IPv6.</translation> <source>Cannot delete the key '%1'.</source> <translation>Nepavyksta paÅ¡alinti rakto „%1“.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>„%1“ yra netinkama pagr. kompiuterio kombinacijos kodo seka.</translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -7496,7 +7520,7 @@ IPv6.</translation> </message> <message> <source><p>You didn't attach a hard disk to the new virtual machine. The machine will not be able to boot unless you attach a hard disk with a guest operating system or some other bootable media to it later using the machine settings dialog or the First Run Wizard.</p><p>Do you wish to continue?</p></source> - <translation><p>Naujai virtualiai maÅ¡inai nepriskyrÄ—te jokio standžiojo disko. MaÅ¡ina negalÄ—s įsikrauti, jei nepriskirsite standžiojo disko su sveÄio operacine sistema arba kitos įkraunamos laikmenos, kuri bÅ«tų naudojama maÅ¡inos nuostatų lange arba pirmojo paleidimo vediklyje.</p><p>TÄ™sti?</p></translation> + <translation><p>Naujai virtualiai maÅ¡inai nepriskyrÄ—te jokio standžiojo disko. Jei nepriskirsite standžiojo disko su sveÄio operacine sistema arba kitos įkraunamos laikmenos, kuri bÅ«tų naudojama maÅ¡inos nuostatų lange arba pirmojo paleidimo vediklyje, maÅ¡inos nebus galima paleisti.</p><p>TÄ™sti?</p></translation> </message> <message> <source>Failed to find license files in <nobr><b>%1</b></nobr>.</source> @@ -7599,7 +7623,7 @@ IPv6.</translation> </message> <message> <source><p>Do you really want to reset the virtual machine?</p><p>This will cause any unsaved data in applications running inside it to be lost.</p></source> - <translation><p>Tikrai norite perkrauti virtualiÄ… maÅ¡inÄ…?</p><p>Prarasite visus neiÅ¡saugotus duomenis.</p></translation> + <translation><p>Tikrai norite iÅ¡ naujo paleisti virtualiÄ… maÅ¡inÄ…?</p><p>Prarasite visus neiÅ¡saugotus duomenis.</p></translation> </message> <message> <source>Reset</source> @@ -8278,7 +8302,7 @@ IPv6.</translation> <message> <source>Reset</source> <comment>machine</comment> - <translation>Atstatyti</translation> + <translation>Paleisti iÅ¡ naujo</translation> </message> <message> <source>Continue</source> @@ -8376,7 +8400,7 @@ IPv6.</translation> </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Atleiskite, bÅ«na daugybinių klaidų.</translation> + <translation type="obsolete">Atleiskite, bÅ«na daugybinių klaidų.</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> @@ -8478,6 +8502,18 @@ IPv6.</translation> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>Papildinių paketas <br><nobr><b>%1</b><nobr><br> įdiegtas.</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> + <translation>Visų virtuliai maÅ¡inai rinkmenų paÅ¡alinimas uždraustas Windows/x64 sistemoje tam, kad bÅ«tų iÅ¡vengta strigio. Tai bus iÅ¡taisyta sekanÄiame leidime.</translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>VirÅ¡aplankyje <nobr><b>%2</b></nobr> nepavyksta sukurti maÅ¡inos aplanko <b>%1</b>.</p><p>Patikrinkite, ar virÅ¡aplankis iÅ¡ tiesų yra ir ar turite leidimÄ… kurti maÅ¡inos aplankÄ….</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> + <translation><p>Å ioje virtualioje maÅ¡inoje įgalintas USB 2.0. TaÄiau tam turi įdiegtas <b><nobr>%1</nobr></b>. <nobr>Ä®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ų.</p></translation> + </message> </context> <context> <name>VBoxProgressDialog</name> @@ -8536,7 +8572,7 @@ IPv6.</translation> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8642,7 +8678,7 @@ IPv6.</translation> </message> <message> <source>R&esume</source> - <translation>&TÄ™sti</translation> + <translation type="obsolete">&TÄ™sti</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8716,6 +8752,7 @@ IPv6.</translation> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>TvarkytuvÄ—</translation> </message> <message> @@ -8774,7 +8811,7 @@ IPv6.</translation> </message> <message> <source>Creates an Shortcut file to the VirtualBox Machine Definition file on your Desktop.</source> - <translation>Darbalaukyje sukuriama Å¡aukinio rinkmenÄ… į VirtualBox maÅ¡inos apibrėžties rinkmenÄ….</translation> + <translation>Darbalaukyje sukuriama Å¡aukinio rinkmenÄ… į VirtualBox maÅ¡inos apibrėžties rinkmenÄ….</translation> </message> <message> <source>Show in File Manager</source> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts index a7c7424dd..cc6457a8b 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_nl.ts @@ -137,187 +137,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Links</translation> - </message> - <message> - <source>Right </source> - <translation>Rechts</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Linker Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Rechter Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Linker Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Rechter Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Linker Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Rechter Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Linker Windowstoets</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Rechter Windowstoets</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><Toets_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num</translation> - </message> - <message> - <source>Forward</source> - <translatorcomment>Is dit een toets of ...</translatorcomment> - <translation>Naar voren</translation> - </message> - <message> - <source>Back</source> - <translatorcomment>Is dit een toets of ...</translatorcomment> - <translation>Terug</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -513,7 +332,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>&Uitzetten via ACPI</translation> + <translation type="obsolete">&Uitzetten via ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1651,6 +1470,10 @@ p, li {white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Extensie pakketbestand (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">Extenties</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1720,11 +1543,11 @@ p, li {white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Zet gastheer toets terug</translation> + <translation type="obsolete">Zet gastheer toets terug</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Zet de toets terug die als gastheer toets wordt gebruikt in het VM scherm.</translation> + <translation type="obsolete">Zet de toets terug die als gastheer toets wordt gebruikt in het VM scherm.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1734,6 +1557,14 @@ p, li {white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>&Automatische toetsenbord vangen</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1936,7 +1767,11 @@ p, li {white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Nieuwe Host-Only interface</translation> + <translation type="obsolete">Nieuwe Host-Only interface</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2093,6 +1928,191 @@ p, li {white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Links</translation> + </message> + <message> + <source>Right </source> + <translation>Rechts</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Linker Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Rechter Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Linker Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Rechter Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Linker Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Rechter Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Linker Windowstoets</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Rechter Windowstoets</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><Toets_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num</translation> + </message> + <message> + <source>Forward</source> + <translatorcomment>Is dit een toets of ...</translatorcomment> + <translation type="obsolete">Naar voren</translation> + </message> + <message> + <source>Back</source> + <translatorcomment>Is dit een toets of ...</translatorcomment> + <translation type="obsolete">Terug</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Geen</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2327,7 +2347,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3722,6 +3742,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><nobr>Status: %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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -6871,7 +6895,7 @@ p, li { white-space: pre-wrap; } <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' is geen geldige code voor de gastheer toets.</translation> + <translation type="obsolete">'%1 (0x%2)' is geen geldige code voor de gastheer toets.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -6881,6 +6905,10 @@ p, li { white-space: pre-wrap; } <source>Cannot delete the key '%1'.</source> <translation>De Sleutel/toets '%1' kan niet verwijderd worden.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -8257,7 +8285,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Excusses een algemene fout is opgetreden.</translation> + <translation type="obsolete">Excusses een algemene fout is opgetreden.</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> @@ -8344,6 +8372,18 @@ p, li { white-space: pre-wrap; } <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>Het uitbreidingspakket <br><nobr><b>%1</b><nobr><br> was succesvo geïnstalleerd.</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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8457,7 +8497,7 @@ p, li { white-space: pre-wrap; } <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8566,7 +8606,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>R&esume</source> - <translation>&Hervatten</translation> + <translation type="obsolete">&Hervatten</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8641,6 +8681,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Manager</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts index 24d71debe..bc0f7ceef 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pl.ts @@ -178,185 +178,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>W lewo</translation> - </message> - <message> - <source>Right </source> - <translation>W prawo</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Lewy Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Prawy Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Lewy Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Prawy Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Lewy Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Prawy Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Lewy WinKey</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Prawy WinKey</translation> - </message> - <message> - <source>Menu key</source> - <translation>Klawisz WinMenu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><klawisz_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>Dalej</translation> - </message> - <message> - <source>Back</source> - <translation>Wstecz</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -563,7 +384,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>Wyłąc&z system (ACPI)</translation> + <translation type="obsolete">Wyłąc&z system (ACPI)</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1766,6 +1587,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1838,11 +1663,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation type="unfinished">DomyÅ›lny klawisz gospodarza</translation> + <translation type="obsolete">DomyÅ›lny klawisz gospodarza</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished">Przywraca domyÅ›lny klawisz gospodarza używany w oknie maszyny wirtualnej.</translation> + <translation type="obsolete">Przywraca domyÅ›lny klawisz gospodarza używany w oknie maszyny wirtualnej.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1852,6 +1677,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation type="unfinished">&Automatyczne przechwytywanie klawiatury</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -2053,7 +1886,7 @@ p, li { white-space: pre-wrap; } <translation>Nazwa</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -2211,6 +2044,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>W lewo</translation> + </message> + <message> + <source>Right </source> + <translation>W prawo</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Lewy Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Prawy Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Lewy Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Prawy Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Lewy Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Prawy Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Lewy WinKey</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Prawy WinKey</translation> + </message> + <message> + <source>Menu key</source> + <translation>Klawisz WinMenu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><klawisz_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Dalej</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Wstecz</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Brak</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2444,7 +2460,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox - Edycja open-source</translation> + <translation type="obsolete">VirtualBox - Edycja open-source</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -4143,6 +4159,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -8209,7 +8229,7 @@ Wersja %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' jest nieprawidÅ‚owym kodem klawisza gospodarza.</translation> + <translation type="obsolete">'%1 (0x%2)' jest nieprawidÅ‚owym kodem klawisza gospodarza.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8219,6 +8239,10 @@ Wersja %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Nie można usunąć klucza '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -10308,10 +10332,6 @@ jÄ™zyka ustawiony jako domyÅ›lny dla systemu.</qt> <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -10396,6 +10416,18 @@ jÄ™zyka ustawiony jako domyÅ›lny dla systemu.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10562,7 +10594,7 @@ jÄ™zyka ustawiony jako domyÅ›lny dla systemu.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox - Edycja open-source</translation> + <translation type="obsolete">VirtualBox - Edycja open-source</translation> </message> <message> <source>&Details</source> @@ -10759,7 +10791,7 @@ jÄ™zyka ustawiony jako domyÅ›lny dla systemu.</qt> </message> <message> <source>R&esume</source> - <translation>Wz&nów</translation> + <translation type="obsolete">Wz&nów</translation> </message> <message> <source>Resume</source> @@ -10846,6 +10878,7 @@ jÄ™zyka ustawiony jako domyÅ›lny dla systemu.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts index f908f4cf7..8a1e4d9f6 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt.ts @@ -174,185 +174,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Esquerda </translation> - </message> - <message> - <source>Right </source> - <translation>Direita </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Shift Esquerdo</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Shift Direito</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ctrl Esquerdo</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Ctrl Direito</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt Esquerdo</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt Direito</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Tecla Windows Esquerda</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Tecla Windows Direita</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tecla Menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pausa</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Imprimir Ecrã</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>Avançar</translation> - </message> - <message> - <source>Back</source> - <translation>Retroceder</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -559,7 +380,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>&Desligar por ACPI</translation> + <translation type="obsolete">&Desligar por ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1489,6 +1310,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1552,20 +1377,20 @@ <translation type="unfinished"></translation> </message> <message> - <source>Reset Host Key</source> + <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished"></translation> + <source>&Auto Capture Keyboard</source> + <translation type="unfinished">&Auto Capturar Teclado</translation> </message> <message> - <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> + <source>Reset host combination</source> <translation type="unfinished"></translation> </message> <message> - <source>&Auto Capture Keyboard</source> - <translation type="unfinished">&Auto Capturar Teclado</translation> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1758,7 +1583,7 @@ <translation type="unfinished">Nome</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -1916,6 +1741,189 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Esquerda </translation> + </message> + <message> + <source>Right </source> + <translation>Direita </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Shift Esquerdo</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Shift Direito</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ctrl Esquerdo</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Ctrl Direito</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt Esquerdo</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt Direito</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Tecla Windows Esquerda</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Tecla Windows Direita</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tecla Menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pausa</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Imprimir Ecrã</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Avançar</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Retroceder</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Nenhum</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -2109,7 +2117,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3635,6 +3643,10 @@ <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7406,7 +7418,7 @@ Versão %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' é uma chave de hospedeiro inválida.</translation> + <translation type="obsolete">'%1 (0x%2)' é uma chave de hospedeiro inválida.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7416,6 +7428,10 @@ Versão %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Não foi possÃvel apagar a chave '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -9464,10 +9480,6 @@ para ligar ao encaixe actualmente destacado.</qt> <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -9552,6 +9564,18 @@ para ligar ao encaixe actualmente destacado.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -9666,7 +9690,7 @@ para ligar ao encaixe actualmente destacado.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -9899,7 +9923,7 @@ para ligar ao encaixe actualmente destacado.</qt> </message> <message> <source>R&esume</source> - <translation>R&esumir</translation> + <translation type="obsolete">R&esumir</translation> </message> <message> <source>Resume</source> @@ -9982,6 +10006,7 @@ para ligar ao encaixe actualmente destacado.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts index 3b5930861..eb5d89ad5 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_pt_BR.ts @@ -178,185 +178,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Esquerda </translation> - </message> - <message> - <source>Right </source> - <translation>Direita </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Shift Esquerdo</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Shift Direito</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ctrl Esquerdo</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Ctrl Direito</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt Esquerdo</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt Direito</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Tecla Windows Esquerda</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Tecla Windows Direita</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tecla Menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>Avançar</translation> - </message> - <message> - <source>Back</source> - <translation>Voltar</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -563,7 +384,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>Desligamento por ACPI (&H)</translation> + <translation type="obsolete">Desligamento por ACPI (&H)</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1773,6 +1594,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Arquivos de pacote de extensão (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">Extensões</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1846,11 +1671,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Resetar Tecla de Hospedeiro</translation> + <translation type="obsolete">Resetar Tecla de Hospedeiro</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Reseta a tecla utilizada como Tecla de Hospedeiro na tela de uma VM.</translation> + <translation type="obsolete">Reseta a tecla utilizada como Tecla de Hospedeiro na tela de uma VM.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1860,6 +1685,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>Capturar teclado &automaticamente</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -2062,7 +1895,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Acrescentar Placa de Rede Exclusiva de Hospedeiro</translation> + <translation type="obsolete">Acrescentar Placa de Rede Exclusiva de Hospedeiro</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2219,6 +2056,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Esquerda </translation> + </message> + <message> + <source>Right </source> + <translation>Direita </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Shift Esquerdo</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Shift Direito</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ctrl Esquerdo</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Ctrl Direito</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt Esquerdo</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt Direito</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Tecla Windows Esquerda</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Tecla Windows Direita</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tecla Menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Avançar</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Voltar</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Nenhum</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2453,7 +2473,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -4222,6 +4242,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation><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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -8423,7 +8447,7 @@ Versão %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' é uma chave de hospedeiro inválida.</translation> + <translation type="obsolete">'%1 (0x%2)' é uma chave de hospedeiro inválida.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8433,6 +8457,10 @@ Versão %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Não foi possÃvel apagar a chave '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -10605,7 +10633,7 @@ to the system default language.</qt> </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Desculpe, aconteceu um erro genérico (sério!).</translation> + <translation type="obsolete">Desculpe, aconteceu um erro genérico (sério!).</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> @@ -10692,6 +10720,18 @@ to the system default language.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>O pacote de extensão <br><nobr><b>%1</b><nobr><br> foi instalado com sucesso.</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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10862,7 +10902,7 @@ to the system default language.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -11095,7 +11135,7 @@ to the system default language.</qt> </message> <message> <source>R&esume</source> - <translation>Continuar (&E)</translation> + <translation type="obsolete">Continuar (&E)</translation> </message> <message> <source>Resume</source> @@ -11182,6 +11222,7 @@ to the system default language.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Gerenciador</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts index f0e32f140..1c8f3a4d4 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ro.ts @@ -182,185 +182,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Stânga </translation> - </message> - <message> - <source>Right </source> - <translation>Dreapta </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Shift stânga</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Shift dreapta</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Ctrl stânga</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Ctrl dreapta</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Alt stânga</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Alt dreapta</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Win stânga</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Win dreapta</translation> - </message> - <message> - <source>Menu key</source> - <translation>Tasta meniu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>ÃŽnainte</translation> - </message> - <message> - <source>Back</source> - <translation>ÃŽnapoi</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -570,7 +391,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ÃŽnc&hidere ACPI</translation> + <translation type="obsolete">ÃŽnc&hidere ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -773,7 +594,7 @@ <message> <source>IO APIC</source> <comment>details report</comment> - <translation type="unfinished">IO ACPI</translation> + <translation type="unfinished">IO APIC</translation> </message> <message> <source>BIOS</source> @@ -1677,6 +1498,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1750,11 +1575,11 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà </message> <message> <source>Reset Host Key</source> - <translation type="unfinished">Resetează tasta gazdă</translation> + <translation type="obsolete">Resetează tasta gazdă</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished">Resetează tasta care este folosită pe post de Tastă gazdă în fereastra MV.</translation> + <translation type="obsolete">Resetează tasta care este folosită pe post de Tastă gazdă în fereastra MV.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1764,6 +1589,14 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà <source>&Auto Capture Keyboard</source> <translation type="unfinished">Capturează &automat tastatura</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1969,7 +1802,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà <translation>Nume</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -2127,6 +1960,189 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Stânga </translation> + </message> + <message> + <source>Right </source> + <translation>Dreapta </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Shift stânga</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Shift dreapta</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Ctrl stânga</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Ctrl dreapta</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Alt stânga</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Alt dreapta</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Win stânga</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Win dreapta</translation> + </message> + <message> + <source>Menu key</source> + <translation>Tasta meniu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">ÃŽnainte</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">ÃŽnapoi</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Nici unul</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Open Virtualization Format (%1)</source> @@ -2332,7 +2348,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -2621,11 +2637,11 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà </message> <message> <source>When checked, the virtual machine will support the Input Output APIC (IO APIC), which may slightly decrease performance. <b>Note:</b> don't disable this feature after having installed a Windows guest operating system!</source> - <translation type="obsolete">Când este bifat, maÈ™ina virtuală va suporta IO ACPI (Input Output Advanced Confirguration È™i Power Management Interface). <b>Notă:</b> nu dezactivaÈ›i această opÈ›iune după ce aÈ›i instalat un sistem de operare musafir Windows!</translation> + <translation type="obsolete">Când este bifat, maÈ™ina virtuală va suporta IO APIC (Input Output Advanced Peripheral Interrupt Controller). <b>Notă:</b> nu dezactivaÈ›i această opÈ›iune după ce aÈ›i instalat un sistem de operare musafir Windows!</translation> </message> <message> <source>Enable IO A&PIC</source> - <translation type="obsolete">Activează IO A&CPI</translation> + <translation type="obsolete">Activează IO A&PIC</translation> </message> <message> <source>When checked, the virtual machine will try to make use of the host CPU's hardware virtualization extensions such as Intel VT-x and AMD-V.</source> @@ -2977,7 +2993,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà </message> <message> <source>Displays the IRQ number of this parallel port. Valid values are integer numbers in range from <tt>0</tt> to <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>IO APIC</b> is enabled for this virtual machine.</source> - <translation type="obsolete">AfiÈ™ează numărul IRQ al acestui port paralel. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO ACPI</b> este activ pentru această maÈ™ină virtuală.</translation> + <translation type="obsolete">AfiÈ™ează numărul IRQ al acestui port paralel. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO APIC</b> este activ pentru această maÈ™ină virtuală.</translation> </message> <message> <source>I/O Po&rt:</source> @@ -2997,7 +3013,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà </message> <message> <source>Displays 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>IO APIC</b> setting is enabled for this virtual machine.</source> - <translation>AfiÈ™ează numărul IRQ al acestui port paralel. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO ACPI</b> este activ pentru această maÈ™ină virtuală.</translation> + <translation>AfiÈ™ează numărul IRQ al acestui port paralel. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO APIC</b> este activ pentru această maÈ™ină virtuală.</translation> </message> <message> <source>Displays 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> @@ -3217,7 +3233,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà </message> <message> <source>Displays the IRQ number of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>IO APIC</b> is enabled for this virtual machine.</source> - <translation type="obsolete">AfiÈ™ează numărul IRQ al acestui port serial. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO ACPI</b> este activ pentru această maÈ™ină virtuală.</translation> + <translation type="obsolete">AfiÈ™ează numărul IRQ al acestui port serial. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO APIC</b> este activ pentru această maÈ™ină virtuală.</translation> </message> <message> <source>I/O Po&rt:</source> @@ -3257,7 +3273,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà </message> <message> <source>Displays 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> - <translation>AfiÈ™ează numărul IRQ al acestui port paralel. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO ACPI</b> este activ pentru această maÈ™ină virtuală.</translation> + <translation>AfiÈ™ează numărul IRQ al acestui port paralel. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO APIC</b> este activ pentru această maÈ™ină virtuală.</translation> </message> <message> <source>Displays 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> @@ -3720,7 +3736,7 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà </message> <message> <source>When checked, the virtual machine will support the Input Output APIC (IO APIC), which may slightly decrease performance. <b>Note:</b> don't disable this feature after having installed a Windows guest operating system!</source> - <translation>Când este bifat, maÈ™ina virtuală va suporta IO ACPI (Input Output Advanced Confirguration È™i Power Management Interface). <b>Notă:</b> nu dezactivaÈ›i această opÈ›iune după ce aÈ›i instalat un sistem de operare musafir Windows!</translation> + <translation>Când este bifat, maÈ™ina virtuală va suporta IO APIC (Input Output Advanced Peripheral Interrupt Controller). <b>Notă:</b> nu dezactivaÈ›i această opÈ›iune după ce aÈ›i instalat un sistem de operare musafir Windows!</translation> </message> <message> <source>Enable &IO APIC</source> @@ -3935,6 +3951,10 @@ Acest director este folosit, dacă nu este explicit specificat altfel, atunci cà <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -6691,7 +6711,7 @@ Versiunea %1</translation> <message> <source>IO APIC</source> <comment>details report</comment> - <translation>IO ACPI</translation> + <translation>IO APIC</translation> </message> <message> <source>Not Attached</source> @@ -8056,7 +8076,7 @@ Versiunea %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' este un cod cheie gazdă invalid.</translation> + <translation type="obsolete">'%1 (0x%2)' este un cod cheie gazdă invalid.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8066,6 +8086,10 @@ Versiunea %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Nu pot È™terge cheia '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -10203,10 +10227,6 @@ FolosiÈ›i meniul contextual sau butaonele din dreapta pentru a adâuga sau È™ter <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -10291,6 +10311,18 @@ FolosiÈ›i meniul contextual sau butaonele din dreapta pentru a adâuga sau È™ter <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10453,7 +10485,7 @@ FolosiÈ›i meniul contextual sau butaonele din dreapta pentru a adâuga sau È™ter <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -10690,7 +10722,7 @@ FolosiÈ›i meniul contextual sau butaonele din dreapta pentru a adâuga sau È™ter </message> <message> <source>R&esume</source> - <translation>R&estabilirie</translation> + <translation type="obsolete">R&estabilirie</translation> </message> <message> <source>Resume</source> @@ -10785,6 +10817,7 @@ FolosiÈ›i meniul contextual sau butaonele din dreapta pentru a adâuga sau È™ter </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> @@ -12302,7 +12335,7 @@ value.</qt></source> </message> <message> <source>Displays the IRQ number of this parallel port. Valid values are integer numbers in range from <tt>0</tt> to <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>IO APIC</b> is enabled for this virtual machine.</source> - <translation type="obsolete">AfiÈ™ează numărul IRQ al acestui port paralel. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO ACPI</b> este activ pentru această maÈ™ină virtuală.</translation> + <translation type="obsolete">AfiÈ™ează numărul IRQ al acestui port paralel. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO APIC</b> este activ pentru această maÈ™ină virtuală.</translation> </message> <message> <source>I/O Po&rt</source> @@ -12349,7 +12382,7 @@ value.</qt></source> </message> <message> <source>Displays the IRQ number of this serial port. Valid values are integer numbers in range from <tt>0</tt> to <tt>255</tt>. Values greater than <tt>15</tt> may only be used if the <b>IO APIC</b> is enabled for this virtual machine.</source> - <translation type="obsolete">AfiÈ™ează numărul IRQ al acestui port serial. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO ACPI</b> este activ pentru această maÈ™ină virtuală.</translation> + <translation type="obsolete">AfiÈ™ează numărul IRQ al acestui port serial. Valori valide sunt întregi între <tt>0</tt> È™i <tt>255</tt>. Valorile mai mari decât <tt>15</tt> pot fi folosite numai dacă <b>IO APIC</b> este activ pentru această maÈ™ină virtuală.</translation> </message> <message> <source>I/O Po&rt</source> @@ -12656,7 +12689,7 @@ această opÈ›iune după ce aÈ›i instalat un sistem de operare musafir Microsoft! the Input Output APIC (IO APIC), which may slightly decrease performance. <b>Note:</b> don't disable this feature after having installed a Windows guest operating system!</source> <translation type="obsolete">Când este activat, maÈ™ina virtuală va suporta -IO ACPI (Input Output Advanced Confirguration È™i Power Management Interface). <b>Notă:</b> nu dezactivaÈ›i +IO APIC (Input Output Advanced Peripheral Interrupt Controller). <b>Notă:</b> nu dezactivaÈ›i această opÈ›iune după ce aÈ›i instalat un sistem de operare musafir Microsoft!</translation> </message> <message> @@ -13077,7 +13110,7 @@ această opÈ›iune după ce aÈ›i instalat un sistem de operare musafir Microsoft! the Input Output APIC (IO APIC), which may slightly decrease performance. <b>Note:</b> don't disable this feature after having installed a Windows guest operating system!</qt></source> <translation type="obsolete"><qt>Când este activat, maÈ™ina virtuală va suporta -IO ACPI (Input Output Advanced Configuration È™i Power Management Interface), care ar putea afecta performanÈ›a sistemului. <b>Notă:</b> nu dezactivaÈ›i +IO APIC (Input Output Advanced Peripheral Interrupt Controller), care ar putea afecta performanÈ›a sistemului. <b>Notă:</b> nu dezactivaÈ›i această opÈ›iune după ce aÈ›i instalat un sistem de operare musafir Microsoft!</qt></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts index 81689b195..f5cba617b 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_ru.ts @@ -137,185 +137,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Левый </translation> - </message> - <message> - <source>Right </source> - <translation>Правый </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Левый Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Правый Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Левый Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Правый Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Левый Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Правый Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Ð›ÐµÐ²Ð°Ñ Win-клавиша</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>ÐŸÑ€Ð°Ð²Ð°Ñ Win-клавиша</translation> - </message> - <message> - <source>Menu key</source> - <translation>Клавиша Menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><клавиша_%1></translation> - </message> - <message> - <source>Pause</source> - <translation></translation> - </message> - <message> - <source>Print Screen</source> - <translation></translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation></translation> - </message> - <message> - <source>Forward</source> - <translation></translation> - </message> - <message> - <source>Back</source> - <translation></translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -515,7 +336,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>Ð’&ыключить через ACPI</translation> + <translation type="obsolete">Ð’&ыключить через ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1648,6 +1469,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Файлы плагинов (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation>Плагины</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1716,11 +1541,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>СброÑить</translation> + <translation type="obsolete">СброÑить</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>СбраÑывает назначенную хоÑÑ‚-клавишу в значение 'не уÑтановлено'.</translation> + <translation type="obsolete">СбраÑывает назначенную хоÑÑ‚-клавишу в значение 'не уÑтановлено'.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1730,6 +1555,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>Ð&втозахват клавиатуры</translation> </message> + <message> + <source>Reset host combination</source> + <translation>СброÑить хоÑÑ‚-комбинацию</translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation>СбраÑывает назначенную хоÑÑ‚-комбинацию в значение 'не уÑтановлено'.</translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1932,7 +1765,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Ðовый Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ…Ð¾Ñта</translation> + <translation type="obsolete">Ðовый Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ…Ð¾Ñта</translation> + </message> + <message> + <source>Networking</source> + <translation>Сеть</translation> </message> </context> <context> @@ -2089,6 +1926,169 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Левый </translation> + </message> + <message> + <source>Right </source> + <translation>Правый </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Левый Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Правый Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Левый Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Правый Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Левый Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Правый Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Ð›ÐµÐ²Ð°Ñ Win-клавиша</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>ÐŸÑ€Ð°Ð²Ð°Ñ Win-клавиша</translation> + </message> + <message> + <source>Menu key</source> + <translation>Клавиша Menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><клавиша_%1></translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>None</source> + <translation>Ðе уÑтановлено</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2322,7 +2322,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -4074,6 +4074,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <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. 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.</source> + <translation>в наÑтоÑщий момент, поддержка USB 2.0 активна Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ виртуальной машины. Однако, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы она работала верно, необходимо уÑтановить плагин <b>%1</b>. ПожалуйÑта, уÑтановите плагин, предварительно загрузив его Ñ Ñайта поддержки VirtualBox. ПоÑле Ñтого Ð’Ñ‹ Ñможете повторно активировать поддержку USB 2.0. До уÑтановки плагина поддержка USB 2.0 будет автоматичеÑки отключатьÑÑ Ð¿Ð¾ принÑтии наÑтроек данной машины.</translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7347,7 +7351,7 @@ p, li { white-space: pre-wrap; } <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>Hеправильный код хоÑÑ‚-клавиши: '%1 (0x%2)'.</translation> + <translation type="obsolete">Hеправильный код хоÑÑ‚-клавиши: '%1 (0x%2)'.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7357,6 +7361,10 @@ p, li { white-space: pre-wrap; } <source>Cannot delete the key '%1'.</source> <translation>Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ параметр '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation>'%1' - Ð½ÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñ…Ð¾ÑÑ‚-комбинациÑ.</translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -8783,7 +8791,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Сожалеем, произошло что-то в корне невероÑтное...</translation> + <translation type="obsolete">Сожалеем, произошло что-то в корне невероÑтное...</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> @@ -8870,6 +8878,18 @@ p, li { white-space: pre-wrap; } <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>Плагин <br><nobr><b>%1</b><nobr><br> был уÑпешно уÑтановлен.</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> + <translation>Удаление файлов, принадлежащих виртуальной машине, в данный запрещено Ð´Ð»Ñ ÐžÐ¡ Windows/x64 (во избежание ÑÐ±Ð¾Ñ Ñамой ОС). Ð”Ð°Ð½Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð° будет иÑправлена в будущем релизе.</translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation><p>Ðе удалоÑÑŒ Ñоздать директорию машины <b>%1</b> в родительÑком каталоге <nobr><b>%2</b>.</nobr></p><p>ПожалуйÑта, проверьте факт ÑущеÑÑ‚Ð²Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого каталога и наличие у Ð’Ð°Ñ Ð´Ð¾Ñтупа Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð² нём папок и файлов.</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> + <translation><p>Ð’ наÑтоÑщий момент, поддержка USB 2.0 включена Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ виртуальной машины. Однако, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы она работала верно, необходимо уÑтановить плагин <b><nobr>%1</nobr></b>.</p><p>ПожалуйÑта, уÑтановите плагин, предварительно загрузив его Ñ Ñайта поддержки VirtualBox. ПоÑле Ñтого Ð’Ñ‹ Ñможете повторно активировать поддержку USB 2.0. До уÑтановки плагина поддержка USB 2.0 будет автоматичеÑки отключатьÑÑ Ð¿Ð¾ принÑтии наÑтроек данной машины.</p></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -9004,7 +9024,7 @@ p, li { white-space: pre-wrap; } <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -9117,7 +9137,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>R&esume</source> - <translation>П&родолжить</translation> + <translation type="obsolete">П&родолжить</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -9192,6 +9212,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Менеджер</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts index 9efb7cd98..f425aba3b 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sk.ts @@ -174,185 +174,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>vľavo</translation> - </message> - <message> - <source>Right </source> - <translation>vpravo</translation> - </message> - <message> - <source>Left Shift</source> - <translation>ľavý shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>pravý shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>ľavý ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>pravý ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>ľavý alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>pravý alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>ľavý kláves Win</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>pravý kláves Win</translation> - </message> - <message> - <source>Menu key</source> - <translation>kláves ponuky</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>alt gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>caps lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>scroll lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><kláves_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>PozastaviÅ¥</translation> - </message> - <message> - <source>Print Screen</source> - <translation>UrobiÅ¥ snÃmku obrazovky</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>Dopredu</translation> - </message> - <message> - <source>Back</source> - <translation>Späť</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -555,7 +376,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>&Vypnutie ACPI</translation> + <translation type="obsolete">&Vypnutie ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1614,6 +1435,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1685,20 +1510,20 @@ <translation type="unfinished"></translation> </message> <message> - <source>Reset Host Key</source> + <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished"></translation> + <source>&Auto Capture Keyboard</source> + <translation type="unfinished">&Automaticky zachytávaÅ¥ klávesnicu</translation> </message> <message> - <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> + <source>Reset host combination</source> <translation type="unfinished"></translation> </message> <message> - <source>&Auto Capture Keyboard</source> - <translation type="unfinished">&Automaticky zachytávaÅ¥ klávesnicu</translation> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1901,7 +1726,7 @@ <translation>Názov</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -2059,6 +1884,189 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>vľavo</translation> + </message> + <message> + <source>Right </source> + <translation>vpravo</translation> + </message> + <message> + <source>Left Shift</source> + <translation>ľavý shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>pravý shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>ľavý ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>pravý ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>ľavý alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>pravý alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>ľavý kláves Win</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>pravý kláves Win</translation> + </message> + <message> + <source>Menu key</source> + <translation>kláves ponuky</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>alt gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>caps lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>scroll lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><kláves_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">PozastaviÅ¥</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">UrobiÅ¥ snÃmku obrazovky</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Dopredu</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Späť</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Žiadne</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Open Virtualization Format (%1)</source> @@ -2260,7 +2268,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3654,6 +3662,10 @@ <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7502,7 +7514,7 @@ verzia %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>„%1 (0x%2)“ je neplatný kÄ¾ÃºÄ hostiteľa.</translation> + <translation type="obsolete">„%1 (0x%2)“ je neplatný kÄ¾ÃºÄ hostiteľa.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7512,6 +7524,10 @@ verzia %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Nie je možné zmazaÅ¥ kÄ¾ÃºÄ â€ž%1“.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -9321,10 +9337,6 @@ je zobrazený <b>tuÄným</b> pÃsmom. Voľbou <i>Å tandardný <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -9409,6 +9421,18 @@ je zobrazený <b>tuÄným</b> pÃsmom. Voľbou <i>Å tandardný <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -9531,7 +9555,7 @@ je zobrazený <b>tuÄným</b> pÃsmom. Voľbou <i>Å tandardný <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -9760,7 +9784,7 @@ je zobrazený <b>tuÄným</b> pÃsmom. Voľbou <i>Å tandardný </message> <message> <source>R&esume</source> - <translation>P&okraÄovaÅ¥</translation> + <translation type="obsolete">P&okraÄovaÅ¥</translation> </message> <message> <source>Resume</source> @@ -9847,6 +9871,7 @@ je zobrazený <b>tuÄným</b> pÃsmom. Voľbou <i>Å tandardný </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts index f4062cf3b..cb6d9bd56 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sr.ts @@ -137,185 +137,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Лево</translation> - </message> - <message> - <source>Right </source> - <translation>ДеÑно</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Леви шифт</translation> - </message> - <message> - <source>Right Shift</source> - <translation>ДеÑни шифт</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Леви Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>ДеÑни Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Леви Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>ДеÑни Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Леви WinKey</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>ДеÑни WinKey</translation> - </message> - <message> - <source>Menu key</source> - <translation>Мени таÑтер</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Пауза</translation> - </message> - <message> - <source>Print Screen</source> - <translation></translation> - </message> - <message> - <source>F1</source> - <translation></translation> - </message> - <message> - <source>F2</source> - <translation></translation> - </message> - <message> - <source>F3</source> - <translation></translation> - </message> - <message> - <source>F4</source> - <translation></translation> - </message> - <message> - <source>F5</source> - <translation></translation> - </message> - <message> - <source>F6</source> - <translation></translation> - </message> - <message> - <source>F7</source> - <translation></translation> - </message> - <message> - <source>F8</source> - <translation></translation> - </message> - <message> - <source>F9</source> - <translation></translation> - </message> - <message> - <source>F10</source> - <translation></translation> - </message> - <message> - <source>F11</source> - <translation></translation> - </message> - <message> - <source>F12</source> - <translation></translation> - </message> - <message> - <source>F13</source> - <translation></translation> - </message> - <message> - <source>F14</source> - <translation></translation> - </message> - <message> - <source>F15</source> - <translation></translation> - </message> - <message> - <source>F16</source> - <translation></translation> - </message> - <message> - <source>F17</source> - <translation></translation> - </message> - <message> - <source>F18</source> - <translation></translation> - </message> - <message> - <source>F19</source> - <translation></translation> - </message> - <message> - <source>F20</source> - <translation></translation> - </message> - <message> - <source>F21</source> - <translation></translation> - </message> - <message> - <source>F22</source> - <translation></translation> - </message> - <message> - <source>F23</source> - <translation></translation> - </message> - <message> - <source>F24</source> - <translation></translation> - </message> - <message> - <source>Num Lock</source> - <translation></translation> - </message> - <message> - <source>Forward</source> - <translation>Ðапред</translation> - </message> - <message> - <source>Back</source> - <translation>Ðазад</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -507,7 +328,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI &гашење</translation> + <translation type="obsolete">ACPI &гашење</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1590,6 +1411,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1657,14 +1482,6 @@ p, li { white-space: pre-wrap; } <translation type="unfinished">Показује таÑтер коришћен као ХоÑÑ‚ таÑтер у VM прозору. Ðктивирати поље и ÑтиÑнути нови хоÑÑ‚ таÑтер. Ðлфанумерично, покрете курÑора и таÑтери уређивања не могу да Ñе кориÑте.</translation> </message> <message> - <source>Reset Host Key</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished"></translation> - </message> - <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished">Ðко унето, таÑтатура је хвачена на Ñвако активирање прозора машине. Сваки ÑƒÐ½Ð¾Ñ Ð¸Ð· таÑтатуре (као и ÑиÑтемÑке Alt-Tab) Ñу преуÑмерене виртуелној машини.</translation> </message> @@ -1672,6 +1489,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation type="unfinished">Ðуто-интегриÑање таÑтатуре</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1873,7 +1698,7 @@ p, li { white-space: pre-wrap; } <translation>Име</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -2031,6 +1856,85 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Лево</translation> + </message> + <message> + <source>Right </source> + <translation>ДеÑно</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Леви шифт</translation> + </message> + <message> + <source>Right Shift</source> + <translation>ДеÑни шифт</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Леви Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>ДеÑни Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Леви Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>ДеÑни Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Леви WinKey</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>ДеÑни WinKey</translation> + </message> + <message> + <source>Menu key</source> + <translation>Мени таÑтер</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Пауза</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Ðапред</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Ðазад</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Ðишта</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2269,7 +2173,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3911,6 +3815,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7124,7 +7032,7 @@ p, li { white-space: pre-wrap; } <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' је неважан хоÑÑ‚ таÑтер.</translation> + <translation type="obsolete">'%1 (0x%2)' је неважан хоÑÑ‚ таÑтер.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7134,6 +7042,10 @@ p, li { white-space: pre-wrap; } <source>Cannot delete the key '%1'.</source> <translation>Ðе може да Ñе избрише таÑтер '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -8560,10 +8472,6 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -8648,6 +8556,18 @@ p, li { white-space: pre-wrap; } <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8782,7 +8702,7 @@ p, li { white-space: pre-wrap; } <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8895,7 +8815,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>R&esume</source> - <translation>ÐаÑтави</translation> + <translation type="obsolete">ÐаÑтави</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8970,6 +8890,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts index 40c844fb1..20d2d647c 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_sv.ts @@ -152,185 +152,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Vänster</translation> - </message> - <message> - <source>Right </source> - <translation>Höger</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Vänster skift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Höger skift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Vänster Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Höger Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Vänster Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Höger Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Vänster Win-tangent</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Höger Win-tangent</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menytangent</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>AltGr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>CapsLock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>ScrollLock</translation> - </message> - <message> - <source><key_%1></source> - <translation><tangent_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Paus</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>FramÃ¥t</translation> - </message> - <message> - <source>Back</source> - <translation>BakÃ¥t</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -530,7 +351,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI S&täng av</translation> + <translation type="obsolete">ACPI S&täng av</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1700,6 +1521,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Tilläggspaketfiler (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">Tillägg</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1772,11 +1597,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Nollställ värdtangent</translation> + <translation type="obsolete">Nollställ värdtangent</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Nollställer tangenten som används för värdtangent i fönstret för virtuella maskiner.</translation> + <translation type="obsolete">Nollställer tangenten som används för värdtangent i fönstret för virtuella maskiner.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1786,6 +1611,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>FÃ¥nga tangentbord &automatiskt</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1988,7 +1821,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Nytt endast-värd-gränssnitt</translation> + <translation type="obsolete">Nytt endast-värd-gränssnitt</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2145,6 +1982,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Vänster</translation> + </message> + <message> + <source>Right </source> + <translation>Höger</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Vänster skift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Höger skift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Vänster Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Höger Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Vänster Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Höger Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Vänster Win-tangent</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Höger Win-tangent</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menytangent</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>AltGr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>CapsLock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>ScrollLock</translation> + </message> + <message> + <source><key_%1></source> + <translation><tangent_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Paus</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">FramÃ¥t</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">BakÃ¥t</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2378,7 +2398,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -4158,6 +4178,10 @@ serial ports</comment> <comment>USB filter tooltip</comment> <translation><nobr>TillstÃ¥nd: %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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7709,7 +7733,7 @@ Version %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' är en ogiltig värdtangentkod.</translation> + <translation type="obsolete">'%1 (0x%2)' är en ogiltig värdtangentkod.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7719,6 +7743,10 @@ Version %1</translation> <source>Cannot delete the key '%1'.</source> <translation>Kan inte ta bort tangenten \"%1\".</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -9257,7 +9285,7 @@ Version %1</translation> </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Beklagar, ett allmänt fel inträffade.</translation> + <translation type="obsolete">Beklagar, ett allmänt fel inträffade.</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> @@ -9344,6 +9372,18 @@ Version %1</translation> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>Tilläggspaketet <br><nobr><b>%1</b><nobr><br> har nu installerats.</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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -9486,7 +9526,7 @@ Version %1</translation> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -9607,7 +9647,7 @@ Version %1</translation> </message> <message> <source>R&esume</source> - <translation>Ã…&teruppta</translation> + <translation type="obsolete">Ã…&teruppta</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -9682,6 +9722,7 @@ Version %1</translation> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>Hanterare</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts index 01defe3f3..1da537537 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_tr.ts @@ -174,185 +174,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Sol </translation> - </message> - <message> - <source>Right </source> - <translation>SaÄŸ </translation> - </message> - <message> - <source>Left Shift</source> - <translation>Sol Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>SaÄŸ Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Sol Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>SaÄŸ Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Sol Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>SaÄŸ Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Sol Win</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>SaÄŸ Win</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menü tuÅŸu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>İleri</translation> - </message> - <message> - <source>Back</source> - <translation>Geri</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -559,7 +380,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI ile &Kapat</translation> + <translation type="obsolete">ACPI ile &Kapat</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1478,6 +1299,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1541,20 +1366,20 @@ <translation type="unfinished"></translation> </message> <message> - <source>Reset Host Key</source> + <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished"></translation> + <source>&Auto Capture Keyboard</source> + <translation type="unfinished">&Klavyeyi Otomatik Yakala</translation> </message> <message> - <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> + <source>Reset host combination</source> <translation type="unfinished"></translation> </message> <message> - <source>&Auto Capture Keyboard</source> - <translation type="unfinished">&Klavyeyi Otomatik Yakala</translation> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1747,7 +1572,7 @@ <translation type="unfinished">İsim</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -1905,6 +1730,189 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Sol </translation> + </message> + <message> + <source>Right </source> + <translation>SaÄŸ </translation> + </message> + <message> + <source>Left Shift</source> + <translation>Sol Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>SaÄŸ Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Sol Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>SaÄŸ Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Sol Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>SaÄŸ Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Sol Win</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>SaÄŸ Win</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menü tuÅŸu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">İleri</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Geri</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">Hiçbiri</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -2094,7 +2102,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -3556,6 +3564,10 @@ <comment>USB filter tooltip</comment> <translation type="unfinished"><nobr>Durum: %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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7238,7 +7250,7 @@ Version %1</source> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' geçersiz bir sunucu anahtarı.</translation> + <translation type="obsolete">'%1 (0x%2)' geçersiz bir sunucu anahtarı.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7248,6 +7260,10 @@ Version %1</source> <source>Cannot delete the key '%1'.</source> <translation>'%1' anahtarı silinemez.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -9198,10 +9214,6 @@ Bu Sanal Makinenin fare iÅŸaretçinizi ve klavyenizi <b>yakalamasına</ <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -9286,6 +9298,18 @@ Bu Sanal Makinenin fare iÅŸaretçinizi ve klavyenizi <b>yakalamasına</ <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -9396,7 +9420,7 @@ Bu Sanal Makinenin fare iÅŸaretçinizi ve klavyenizi <b>yakalamasına</ <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -9629,7 +9653,7 @@ Bu Sanal Makinenin fare iÅŸaretçinizi ve klavyenizi <b>yakalamasına</ </message> <message> <source>R&esume</source> - <translation>D&evam Et</translation> + <translation type="obsolete">D&evam Et</translation> </message> <message> <source>Resume</source> @@ -9712,6 +9736,7 @@ Bu Sanal Makinenin fare iÅŸaretçinizi ve klavyenizi <b>yakalamasına</ </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts index 0b71d3277..448cd07d8 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_uk.ts @@ -137,185 +137,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Лівий</translation> - </message> - <message> - <source>Right </source> - <translation>Правий</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Лівий Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Правий Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Лівий Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Правий Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Лівий Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Правий Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Лівий WinKey</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Правий WinKey</translation> - </message> - <message> - <source>Menu key</source> - <translation>Клавіша Menu</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><клавіша_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F1</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F18</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>Forward</translation> - </message> - <message> - <source>Back</source> - <translation>Back</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -507,7 +328,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>Ви&мкнути ACPI</translation> + <translation type="obsolete">Ви&мкнути ACPI</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1636,6 +1457,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation>Файл пакунка Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">РозширеннÑ</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1704,11 +1529,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Reset Host Key</source> - <translation>Скинути головну клавішу</translation> + <translation type="obsolete">Скинути головну клавішу</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>Скидає комбінацію клавіш Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ машиною Ñ– ÑиÑтемою.</translation> + <translation type="obsolete">Скидає комбінацію клавіш Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð¼Ñ–Ð¶ машиною Ñ– ÑиÑтемою.</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1718,6 +1543,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation>&ÐÐ²Ñ‚Ð¾Ð·Ð°Ñ…Ð¾Ð¿Ð»ÐµÐ½Ð½Ñ ÐºÐ»Ð°Ð²Ñ–Ð°Ñ‚ÑƒÑ€Ð¸</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1920,7 +1753,11 @@ p, li { white-space: pre-wrap; } </message> <message> <source>New Host-Only Interface</source> - <translation>Ðовий лише головний інтерфейÑ</translation> + <translation type="obsolete">Ðовий лише головний інтерфейÑ</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -2077,6 +1914,189 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Лівий</translation> + </message> + <message> + <source>Right </source> + <translation>Правий</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Лівий Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Правий Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Лівий Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Правий Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Лівий Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Правий Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Лівий WinKey</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Правий WinKey</translation> + </message> + <message> + <source>Menu key</source> + <translation>Клавіша Menu</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><клавіша_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">Forward</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">Back</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2310,7 +2330,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -2326,19 +2346,19 @@ p, li { white-space: pre-wrap; } </message> <message> <source>More CD/DVD Images...</source> - <translation>Більше образів CD/DVD…</translation> + <translation type="obsolete">Більше образів CD/DVD…</translation> </message> <message> <source>Unmount CD/DVD Device</source> - <translation>Демонтувати приÑтрій CD/DVD</translation> + <translation type="obsolete">Демонтувати приÑтрій CD/DVD</translation> </message> <message> <source>More Floppy Images...</source> - <translation>Більше образів диÑкет…</translation> + <translation type="obsolete">Більше образів диÑкет…</translation> </message> <message> <source>Unmount Floppy Device</source> - <translation>Демонтувати приÑтрій диÑкет</translation> + <translation type="obsolete">Демонтувати приÑтрій диÑкет</translation> </message> <message> <source>No CD/DVD Devices Attached</source> @@ -3939,6 +3959,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -7150,12 +7174,22 @@ p, li { white-space: pre-wrap; } <comment>size suffix MBytes=1024KBytes</comment> <translation>МБ</translation> </message> + <message> + <source>Readonly</source> + <comment>DiskType</comment> + <translation type="unfinished"></translation> + </message> + <message> + <source>Multi-attach</source> + <comment>DiskType</comment> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' — недопуÑтимий код головної клавіши.</translation> + <translation type="obsolete">'%1 (0x%2)' — недопуÑтимий код головної клавіши.</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -7165,6 +7199,10 @@ p, li { white-space: pre-wrap; } <source>Cannot delete the key '%1'.</source> <translation>Ðе вдаєтьÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ код '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxHelpButton</name> @@ -7956,11 +7994,11 @@ p, li { white-space: pre-wrap; } </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> - <translation><p>Вікно віртуальної машини зараз перемкнетьÑÑ Ð² <b>повноекранний</b> режим. Ви можете повернутиÑÑŒ назад до віконного режиму в будь-Ñкий момент натиÑнувши <b>%1</b>. Майте на увазі, <i>Головна</i> клавіша зараз — <b>%2</b>.</p><p>Майте на увазі, у повноекранному режимі панель головного меню не показуєтьÑÑ. Ви можете виправити це натиÑнувши <b>Головну клавішу+Home</b>.</p></translation> + <translation type="obsolete"><p>Вікно віртуальної машини зараз перемкнетьÑÑ Ð² <b>повноекранний</b> режим. Ви можете повернутиÑÑŒ назад до віконного режиму в будь-Ñкий момент натиÑнувши <b>%1</b>. Майте на увазі, <i>Головна</i> клавіша зараз — <b>%2</b>.</p><p>Майте на увазі, у повноекранному режимі панель головного меню не показуєтьÑÑ. Ви можете виправити це натиÑнувши <b>Головну клавішу+Home</b>.</p></translation> </message> <message> <source><p>The virtual machine window will be now switched to <b>Seamless</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 seamless mode. You can access it by pressing <b>Host+Home</b>.</p></source> - <translation><p>Вікно віртуальної машини зараз перемкнетьÑÑ Ð² <b>ціловикроєний</b> режим. Ви можете повернутиÑÑŒ назад до віконного режиму в будь-Ñкий момент натиÑнувши <b>%1</b>. Майте на увазі, <i>Головна</i> клавіша зараз — <b>%2</b>.</p><p>Майте на увазі, у ціловикроєному режимі панель головного меню не показуєтьÑÑ. Ви можете виправити це натиÑнувши <b>Головну клавішу+Home</b>.</p></translation> + <translation type="obsolete"><p>Вікно віртуальної машини зараз перемкнетьÑÑ Ð² <b>ціловикроєний</b> режим. Ви можете повернутиÑÑŒ назад до віконного режиму в будь-Ñкий момент натиÑнувши <b>%1</b>. Майте на увазі, <i>Головна</i> клавіша зараз — <b>%2</b>.</p><p>Майте на увазі, у ціловикроєному режимі панель головного меню не показуєтьÑÑ. Ви можете виправити це натиÑнувши <b>Головну клавішу+Home</b>.</p></translation> </message> <message> <source>&Contents...</source> @@ -8037,7 +8075,7 @@ p, li { white-space: pre-wrap; } </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> - <translation><p>Майте на увазі, блок пам'Ñті цього ноÑÑ–Ñ Ð½Ðµ будуть вилучені, таким чином буде можливо знову додати його до ÑпиÑку пізніше.</p></translation> + <translation type="obsolete"><p>Майте на увазі, блок пам'Ñті цього ноÑÑ–Ñ Ð½Ðµ будуть вилучені, таким чином буде можливо знову додати його до ÑпиÑку пізніше.</p></translation> </message> <message> <source>Remove</source> @@ -8555,7 +8593,7 @@ p, li { white-space: pre-wrap; } </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 shared folders will be available once it is.</p></source> - <translation><p>ГоÑтьові Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ VirtualBox не з'ÑвилиÑÑŒ доÑтупними на віртуальній машині, Ñ– без них неможливо викориÑтовувати Ñпільні теки. Щоб викориÑтовувати Ñ—Ñ… уÑередині віртуальної машини, будь лаÑка, вÑтановіть гоÑтьові доповненнÑ, Ñкщо вони вÑе ще не вÑтановлені, або перевÑтановіть, Ñкщо вони працюють некоректно, вибравши <b>Ð’Ñтановити гоÑтьові доповненнÑ</b> з меню <b>Машина</b>. Якщо вони вÑтановлені, але машина поки що неповніÑтю запущена, то потрібно зачекати поки вона запуÑтитьÑÑ Ð´Ð¾ кінцÑ.</p></translation> + <translation type="obsolete"><p>ГоÑтьові Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ VirtualBox не з'ÑвилиÑÑŒ доÑтупними на віртуальній машині, Ñ– без них неможливо викориÑтовувати Ñпільні теки. Щоб викориÑтовувати Ñ—Ñ… уÑередині віртуальної машини, будь лаÑка, вÑтановіть гоÑтьові доповненнÑ, Ñкщо вони вÑе ще не вÑтановлені, або перевÑтановіть, Ñкщо вони працюють некоректно, вибравши <b>Ð’Ñтановити гоÑтьові доповненнÑ</b> з меню <b>Машина</b>. Якщо вони вÑтановлені, але машина поки що неповніÑтю запущена, то потрібно зачекати поки вона запуÑтитьÑÑ Ð´Ð¾ кінцÑ.</p></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> @@ -8579,7 +8617,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>You are about to remove the Extension Pack <b>%1</b>. Are you sure you want to do that?</source> - <translation>Ви збираєтеÑÑŒ вилучити пакунок Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ <b>%1</b>. Упевнені, що бажаєте це зробити?</translation> + <translation type="obsolete">Ви збираєтеÑÑŒ вилучити пакунок Ñ€Ð¾Ð·ÑˆÐ¸Ñ€ÐµÐ½Ð½Ñ <b>%1</b>. Упевнені, що бажаєте це зробити?</translation> </message> <message> <source>&Remove</source> @@ -8595,7 +8633,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Sorry, some generic error happens.</source> - <translation>Вибачте, трапилаÑÑŒ деÑка випадкова помилка.</translation> + <translation type="obsolete">Вибачте, трапилаÑÑŒ деÑка випадкова помилка.</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> @@ -8609,6 +8647,91 @@ p, li { white-space: pre-wrap; } <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> </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> + <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> + <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 shared folders will be available once it is.</p></source> + <translation type="unfinished"></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 type="unfinished"></translation> + </message> + <message> + <source><p>The virtual machine window will be now switched to <b>Seamless</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 seamless mode. You can access it by pressing <b>Host+Home</b>.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>The virtual machine window will be now switched to <b>Scale</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 scale mode. You can access it by pressing <b>Host+Home</b>.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Switch</source> + <comment>scale</comment> + <translation type="unfinished">Перемкнути</translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Failed to open the Extension Pack <b>%1</b>.</source> + <translation type="unfinished"></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:&nbsp;&nbsp;</b></td><td>%1</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%3</td></tr></table></p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Install</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>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.</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>An older version of the extension pack is already installed, would you like to upgrade? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Upgrade</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>An newer version of the extension pack is already installed, would you like to downgrade? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>New Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Current Version:&nbsp;&nbsp;</b></td><td>%4</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%5</td></tr></table></p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Downgrade</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>The extension pack is already installed with the same version, would you like reinstall it? <p>%1</p><p><table cellpadding=0 cellspacing=0><tr><td><b>Name:&nbsp;&nbsp;</b></td><td>%2</td></tr><tr><td><b>Version:&nbsp;&nbsp;</b></td><td>%3</td></tr><tr><td><b>Description:&nbsp;&nbsp;</b></td><td>%4</td></tr></table></p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>&Reinstall</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>You are about to remove the VirtualBox extension pack <b>%1</b>.</p><p>Are you sure you want to proceed?</p></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -8743,7 +8866,7 @@ p, li { white-space: pre-wrap; } <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>&Details</source> @@ -8860,7 +8983,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>R&esume</source> - <translation>Ð’&ідновити</translation> + <translation type="obsolete">Ð’&ідновити</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -8939,6 +9062,7 @@ p, li { white-space: pre-wrap; } </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>КеруваннÑ</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts index a2ece19e3..7bfa8847e 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_xx_YY.ts @@ -111,185 +111,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right </source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left Shift</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Shift</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left Ctrl</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Ctrl</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left Alt</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right Alt</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Left WinKey</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Right WinKey</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Menu key</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Alt Gr</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Caps Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Scroll Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source><key_%1></source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Pause</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Print Screen</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F1</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F2</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F3</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F4</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F5</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F6</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F7</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F8</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F9</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F10</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F11</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F12</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F13</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F14</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F15</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F16</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F17</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F18</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F19</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F20</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F21</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F22</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F23</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>F24</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Num Lock</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Forward</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Back</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -441,10 +262,6 @@ <translation></translation> </message> <message> - <source>ACPI S&hutdown</source> - <translation></translation> - </message> - <message> <source>Send the ACPI Power Button press event to the virtual machine</source> <translation></translation> </message> @@ -1182,6 +999,10 @@ <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1233,19 +1054,19 @@ <translation type="unfinished"></translation> </message> <message> - <source>Reset Host Key</source> + <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished"></translation> </message> <message> - <source>Resets the key used as a Host Key in the VM window.</source> + <source>&Auto Capture Keyboard</source> <translation type="unfinished"></translation> </message> <message> - <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> + <source>Reset host combination</source> <translation type="unfinished"></translation> </message> <message> - <source>&Auto Capture Keyboard</source> + <source>Resets the key combination used as the host combination in the VM window.</source> <translation type="unfinished"></translation> </message> </context> @@ -1439,7 +1260,7 @@ <translation type="unfinished"></translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -1597,6 +1418,73 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right </source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left Shift</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Shift</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left Ctrl</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Ctrl</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left Alt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right Alt</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Left WinKey</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Right WinKey</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Menu key</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Alt Gr</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Caps Lock</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Scroll Lock</source> + <translation type="unfinished"></translation> + </message> + <message> + <source><key_%1></source> + <translation type="unfinished"></translation> + </message> + <message> + <source>None</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -1769,10 +1657,6 @@ <context> <name>UIMachineLogic</name> <message> - <source>VirtualBox OSE</source> - <translation></translation> - </message> - <message> <source> EXPERIMENTAL build %1r%2 - %3</source> <translation></translation> </message> @@ -2964,6 +2848,10 @@ <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -4950,15 +4838,15 @@ <context> <name>VBoxGlobalSettings</name> <message> - <source>'%1 (0x%2)' is an invalid host key code.</source> + <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> <translation type="unfinished"></translation> </message> <message> - <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> + <source>Cannot delete the key '%1'.</source> <translation type="unfinished"></translation> </message> <message> - <source>Cannot delete the key '%1'.</source> + <source>'%1' is an invalid host-combination code-sequence.</source> <translation type="unfinished"></translation> </message> </context> @@ -6077,10 +5965,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -6165,6 +6049,18 @@ <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxSFDialog</name> @@ -6191,10 +6087,6 @@ <context> <name>VBoxSelectorWnd</name> <message> - <source>VirtualBox OSE</source> - <translation type="unfinished"></translation> - </message> - <message> <source>&Preferences...</source> <comment>global settings</comment> <translation type="unfinished"></translation> @@ -6272,10 +6164,6 @@ <translation type="unfinished"></translation> </message> <message> - <source>R&esume</source> - <translation type="unfinished"></translation> - </message> - <message> <source>Resume the execution of the virtual machine</source> <translation type="unfinished"></translation> </message> @@ -6344,6 +6232,7 @@ </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts index f622808cd..9456b4e60 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_CN.ts @@ -186,185 +186,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>Left</translation> - </message> - <message> - <source>Right </source> - <translation>Right</translation> - </message> - <message> - <source>Left Shift</source> - <translation>Left Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>Right Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>Left Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>Right Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>Left Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>Right Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>Left WinKey</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>Right WinKey</translation> - </message> - <message> - <source>Menu key</source> - <translation>Menu key</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation></translation> - </message> - <message> - <source>Forward</source> - <translation></translation> - </message> - <message> - <source>Back</source> - <translation></translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -574,7 +395,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>æ£å¸¸å…³é— (&H)</translation> + <translation type="obsolete">æ£å¸¸å…³é— (&H)</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1729,6 +1550,10 @@ p, li { white-space: pre-wrap; } <source>Extension package files (%1)</source> <translation type="unfinished"></translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1800,14 +1625,6 @@ p, li { white-space: pre-wrap; } <translation type="unfinished"></translation> </message> <message> - <source>Reset Host Key</source> - <translation type="unfinished"></translation> - </message> - <message> - <source>Resets the key used as a Host Key in the VM window.</source> - <translation type="unfinished"></translation> - </message> - <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> <translation type="unfinished">选ä¸åŽï¼Œå½“虚拟电脑窗å£å¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶å°†è‡ªåЍæ•获键盘输入。当键盘被æ•获时,所有的键盘输入(包括系统切æ¢é”®å¦‚ Alt-Tab) 都将被å‘é€åˆ°è™šæ‹Ÿç”µè„‘.</translation> </message> @@ -1815,6 +1632,14 @@ p, li { white-space: pre-wrap; } <source>&Auto Capture Keyboard</source> <translation type="unfinished">自动独å 键盘(&A)</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -2016,7 +1841,7 @@ p, li { white-space: pre-wrap; } <translation>åç§°</translation> </message> <message> - <source>New Host-Only Interface</source> + <source>Networking</source> <translation type="unfinished"></translation> </message> </context> @@ -2174,6 +1999,177 @@ p, li { white-space: pre-wrap; } </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>Left</translation> + </message> + <message> + <source>Right </source> + <translation>Right</translation> + </message> + <message> + <source>Left Shift</source> + <translation>Left Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>Right Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>Left Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>Right Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>Left Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>Right Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>Left WinKey</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>Right WinKey</translation> + </message> + <message> + <source>Menu key</source> + <translation>Menu key</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">空</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Select an appliance to import</source> @@ -2407,7 +2403,7 @@ p, li { white-space: pre-wrap; } <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -4150,6 +4146,10 @@ p, li { white-space: pre-wrap; } <comment>USB filter tooltip</comment> <translation type="unfinished"><nobr>State: %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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -8186,7 +8186,7 @@ Version %1</translation> <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>'%1 (0x%2)' 是一个ä¸å¯ç”¨çš„çƒé”®ç¼–ç .</translation> + <translation type="obsolete">'%1 (0x%2)' 是一个ä¸å¯ç”¨çš„çƒé”®ç¼–ç .</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -8196,6 +8196,10 @@ Version %1</translation> <source>Cannot delete the key '%1'.</source> <translation>ä¸èƒ½åˆ 除çƒé”® '%1'.</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxGlobalSettingsDlg</name> @@ -10376,10 +10380,6 @@ to the system default language.</qt> <translation type="unfinished"></translation> </message> <message> - <source>Sorry, some generic error happens.</source> - <translation type="unfinished"></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> <translation type="unfinished"></translation> </message> @@ -10464,6 +10464,18 @@ to the system default language.</qt> <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxRegistrationDlg</name> @@ -10626,7 +10638,7 @@ to the system default language.</qt> <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox OSE</translation> + <translation type="obsolete">VirtualBox OSE</translation> </message> <message> <source>innotek VirtualBox</source> @@ -10867,7 +10879,7 @@ to the system default language.</qt> </message> <message> <source>R&esume</source> - <translation>唤醒(&e)</translation> + <translation type="obsolete">唤醒(&e)</translation> </message> <message> <source>Resume</source> @@ -10958,6 +10970,7 @@ to the system default language.</qt> </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation type="unfinished"></translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts index aacfe1b43..aaef2a7df 100644 --- a/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts +++ b/src/VBox/Frontends/VirtualBox/nls/VirtualBox_zh_TW.ts @@ -111,185 +111,6 @@ </message> </context> <context> - <name>QIHotKeyEdit</name> - <message> - <source>Left </source> - <translation>â†</translation> - </message> - <message> - <source>Right </source> - <translation>→</translation> - </message> - <message> - <source>Left Shift</source> - <translation>å·¦å´ Shift</translation> - </message> - <message> - <source>Right Shift</source> - <translation>å³å´ Shift</translation> - </message> - <message> - <source>Left Ctrl</source> - <translation>å·¦å´ Ctrl</translation> - </message> - <message> - <source>Right Ctrl</source> - <translation>å³å´ Ctrl</translation> - </message> - <message> - <source>Left Alt</source> - <translation>å·¦å´ Alt</translation> - </message> - <message> - <source>Right Alt</source> - <translation>å³å´ Alt</translation> - </message> - <message> - <source>Left WinKey</source> - <translation>å·¦å´ WinKey</translation> - </message> - <message> - <source>Right WinKey</source> - <translation>å³å´ WinKey</translation> - </message> - <message> - <source>Menu key</source> - <translation>功能表éµ</translation> - </message> - <message> - <source>Alt Gr</source> - <translation>Alt Gr</translation> - </message> - <message> - <source>Caps Lock</source> - <translation>Caps Lock</translation> - </message> - <message> - <source>Scroll Lock</source> - <translation>Scroll Lock</translation> - </message> - <message> - <source><key_%1></source> - <translation><key_%1></translation> - </message> - <message> - <source>Pause</source> - <translation>Pause</translation> - </message> - <message> - <source>Print Screen</source> - <translation>Print Screen</translation> - </message> - <message> - <source>F1</source> - <translation>F1</translation> - </message> - <message> - <source>F2</source> - <translation>F2</translation> - </message> - <message> - <source>F3</source> - <translation>F3</translation> - </message> - <message> - <source>F4</source> - <translation>F4</translation> - </message> - <message> - <source>F5</source> - <translation>F5</translation> - </message> - <message> - <source>F6</source> - <translation>F6</translation> - </message> - <message> - <source>F7</source> - <translation>F7</translation> - </message> - <message> - <source>F8</source> - <translation>F8</translation> - </message> - <message> - <source>F9</source> - <translation>F9</translation> - </message> - <message> - <source>F10</source> - <translation>F10</translation> - </message> - <message> - <source>F11</source> - <translation>F11</translation> - </message> - <message> - <source>F12</source> - <translation>F12</translation> - </message> - <message> - <source>F13</source> - <translation>F13</translation> - </message> - <message> - <source>F14</source> - <translation>F14</translation> - </message> - <message> - <source>F15</source> - <translation>F15</translation> - </message> - <message> - <source>F16</source> - <translation>F16</translation> - </message> - <message> - <source>F17</source> - <translation>F17</translation> - </message> - <message> - <source>F18</source> - <translation>F18</translation> - </message> - <message> - <source>F19</source> - <translation>F19</translation> - </message> - <message> - <source>F20</source> - <translation>F20</translation> - </message> - <message> - <source>F21</source> - <translation>F21</translation> - </message> - <message> - <source>F22</source> - <translation>F22</translation> - </message> - <message> - <source>F23</source> - <translation>F23</translation> - </message> - <message> - <source>F24</source> - <translation>F24</translation> - </message> - <message> - <source>Num Lock</source> - <translation>Num Lock</translation> - </message> - <message> - <source>Forward</source> - <translation>下一æ¥</translation> - </message> - <message> - <source>Back</source> - <translation>上一æ¥</translation> - </message> -</context> -<context> <name>QIHttp</name> <message> <source>Connection timed out</source> @@ -442,7 +263,7 @@ </message> <message> <source>ACPI S&hutdown</source> - <translation>ACPI 關機(&H)</translation> + <translation type="obsolete">ACPI 關機(&H)</translation> </message> <message> <source>Send the ACPI Power Button press event to the virtual machine</source> @@ -1182,6 +1003,10 @@ <source>Extension package files (%1)</source> <translation>擴充包檔案 (%1)</translation> </message> + <message> + <source>Extensions</source> + <translation type="unfinished">æ“´å……</translation> + </message> </context> <context> <name>UIGlobalSettingsGeneral</name> @@ -1234,11 +1059,11 @@ </message> <message> <source>Reset Host Key</source> - <translation>é‡è¨ç†±éµ</translation> + <translation type="obsolete">é‡è¨ç†±éµ</translation> </message> <message> <source>Resets the key used as a Host Key in the VM window.</source> - <translation>é‡è¨åœ¨ VM 視窗ä¸ä½œç‚ºç†±éµçš„æŒ‰éµã€‚</translation> + <translation type="obsolete">é‡è¨åœ¨ VM 視窗ä¸ä½œç‚ºç†±éµçš„æŒ‰éµã€‚</translation> </message> <message> <source>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</source> @@ -1248,6 +1073,14 @@ <source>&Auto Capture Keyboard</source> <translation>自動擷å–éµç›¤(&A)</translation> </message> + <message> + <source>Reset host combination</source> + <translation type="unfinished"></translation> + </message> + <message> + <source>Resets the key combination used as the host combination in the VM window.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIGlobalSettingsLanguage</name> @@ -1440,7 +1273,11 @@ </message> <message> <source>New Host-Only Interface</source> - <translation>新增「僅é™ä¸»æ©Ÿã€ä»‹é¢</translation> + <translation type="obsolete">新增「僅é™ä¸»æ©Ÿã€ä»‹é¢</translation> + </message> + <message> + <source>Networking</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -1597,6 +1434,189 @@ </message> </context> <context> + <name>UIHotKeyEditor</name> + <message> + <source>Left </source> + <translation>â†</translation> + </message> + <message> + <source>Right </source> + <translation>→</translation> + </message> + <message> + <source>Left Shift</source> + <translation>å·¦å´ Shift</translation> + </message> + <message> + <source>Right Shift</source> + <translation>å³å´ Shift</translation> + </message> + <message> + <source>Left Ctrl</source> + <translation>å·¦å´ Ctrl</translation> + </message> + <message> + <source>Right Ctrl</source> + <translation>å³å´ Ctrl</translation> + </message> + <message> + <source>Left Alt</source> + <translation>å·¦å´ Alt</translation> + </message> + <message> + <source>Right Alt</source> + <translation>å³å´ Alt</translation> + </message> + <message> + <source>Left WinKey</source> + <translation>å·¦å´ WinKey</translation> + </message> + <message> + <source>Right WinKey</source> + <translation>å³å´ WinKey</translation> + </message> + <message> + <source>Menu key</source> + <translation>功能表éµ</translation> + </message> + <message> + <source>Alt Gr</source> + <translation>Alt Gr</translation> + </message> + <message> + <source>Caps Lock</source> + <translation>Caps Lock</translation> + </message> + <message> + <source>Scroll Lock</source> + <translation>Scroll Lock</translation> + </message> + <message> + <source><key_%1></source> + <translation><key_%1></translation> + </message> + <message> + <source>Pause</source> + <translation type="obsolete">Pause</translation> + </message> + <message> + <source>Print Screen</source> + <translation type="obsolete">Print Screen</translation> + </message> + <message> + <source>F1</source> + <translation type="obsolete">F1</translation> + </message> + <message> + <source>F2</source> + <translation type="obsolete">F2</translation> + </message> + <message> + <source>F3</source> + <translation type="obsolete">F3</translation> + </message> + <message> + <source>F4</source> + <translation type="obsolete">F4</translation> + </message> + <message> + <source>F5</source> + <translation type="obsolete">F5</translation> + </message> + <message> + <source>F6</source> + <translation type="obsolete">F6</translation> + </message> + <message> + <source>F7</source> + <translation type="obsolete">F7</translation> + </message> + <message> + <source>F8</source> + <translation type="obsolete">F8</translation> + </message> + <message> + <source>F9</source> + <translation type="obsolete">F9</translation> + </message> + <message> + <source>F10</source> + <translation type="obsolete">F10</translation> + </message> + <message> + <source>F11</source> + <translation type="obsolete">F11</translation> + </message> + <message> + <source>F12</source> + <translation type="obsolete">F12</translation> + </message> + <message> + <source>F13</source> + <translation type="obsolete">F13</translation> + </message> + <message> + <source>F14</source> + <translation type="obsolete">F14</translation> + </message> + <message> + <source>F15</source> + <translation type="obsolete">F15</translation> + </message> + <message> + <source>F16</source> + <translation type="obsolete">F16</translation> + </message> + <message> + <source>F17</source> + <translation type="obsolete">F17</translation> + </message> + <message> + <source>F18</source> + <translation type="obsolete">F18</translation> + </message> + <message> + <source>F19</source> + <translation type="obsolete">F19</translation> + </message> + <message> + <source>F20</source> + <translation type="obsolete">F20</translation> + </message> + <message> + <source>F21</source> + <translation type="obsolete">F21</translation> + </message> + <message> + <source>F22</source> + <translation type="obsolete">F22</translation> + </message> + <message> + <source>F23</source> + <translation type="obsolete">F23</translation> + </message> + <message> + <source>F24</source> + <translation type="obsolete">F24</translation> + </message> + <message> + <source>Num Lock</source> + <translation type="obsolete">Num Lock</translation> + </message> + <message> + <source>Forward</source> + <translation type="obsolete">下一æ¥</translation> + </message> + <message> + <source>Back</source> + <translation type="obsolete">上一æ¥</translation> + </message> + <message> + <source>None</source> + <translation type="unfinished">ç„¡</translation> + </message> +</context> +<context> <name>UIImportApplianceWzd</name> <message> <source>Appliance Import Wizard</source> @@ -1770,7 +1790,7 @@ <name>UIMachineLogic</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox 開放原始碼版本 (OSE)</translation> + <translation type="obsolete">VirtualBox 開放原始碼版本 (OSE)</translation> </message> <message> <source> EXPERIMENTAL build %1r%2 - %3</source> @@ -2964,6 +2984,10 @@ <comment>USB filter tooltip</comment> <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. 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.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>UIMachineSettingsUSBFilterDetails</name> @@ -4951,7 +4975,7 @@ <name>VBoxGlobalSettings</name> <message> <source>'%1 (0x%2)' is an invalid host key code.</source> - <translation>「%1 (0x%2)ã€æ˜¯ç„¡æ•ˆçš„主機éµç¢¼ã€‚</translation> + <translation type="obsolete">「%1 (0x%2)ã€æ˜¯ç„¡æ•ˆçš„主機éµç¢¼ã€‚</translation> </message> <message> <source>The value '%1' of the key '%2' doesn't match the regexp constraint '%3'.</source> @@ -4961,6 +4985,10 @@ <source>Cannot delete the key '%1'.</source> <translation>無法刪除按éµã€Œ%1ã€ã€‚</translation> </message> + <message> + <source>'%1' is an invalid host-combination code-sequence.</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxImportApplianceWgt</name> @@ -6078,7 +6106,7 @@ </message> <message> <source>Sorry, some generic error happens.</source> - <translation>抱æ‰ï¼Œç™¼ç”ŸæŸäº›åœ–形錯誤。</translation> + <translation type="obsolete">抱æ‰ï¼Œç™¼ç”ŸæŸäº›åœ–形錯誤。</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> @@ -6165,6 +6193,18 @@ <source>The extension pack <br><nobr><b>%1</b><nobr><br> was installed successfully.</source> <translation>擴充包 <br><nobr><b>%1</b><nobr><br> å·²å®‰è£æˆåŠŸã€‚</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> + <translation type="unfinished"></translation> + </message> + <message> + <source><p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>Please check that the parent really exists and that you have permissions to create the machine folder.</p></source> + <translation type="unfinished"></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> + <translation type="unfinished"></translation> + </message> </context> <context> <name>VBoxSFDialog</name> @@ -6192,7 +6232,7 @@ <name>VBoxSelectorWnd</name> <message> <source>VirtualBox OSE</source> - <translation>VirtualBox 開放原始碼版本 (OSE)</translation> + <translation type="obsolete">VirtualBox 開放原始碼版本 (OSE)</translation> </message> <message> <source>&Preferences...</source> @@ -6273,7 +6313,7 @@ </message> <message> <source>R&esume</source> - <translation>繼續執行(&E)</translation> + <translation type="obsolete">繼續執行(&E)</translation> </message> <message> <source>Resume the execution of the virtual machine</source> @@ -6344,6 +6384,7 @@ </message> <message> <source>Manager</source> + <comment>Note: main window title which is pretended by the product name.</comment> <translation>管ç†å“¡</translation> </message> <message> diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxGLSupportInfo.cpp b/src/VBox/Frontends/VirtualBox/src/VBoxGLSupportInfo.cpp index 9438059ac..67d603d5b 100644 --- a/src/VBox/Frontends/VirtualBox/src/VBoxGLSupportInfo.cpp +++ b/src/VBox/Frontends/VirtualBox/src/VBoxGLSupportInfo.cpp @@ -603,7 +603,7 @@ bool VBoxVHWAInfo::isVHWASupported() const /* static */ bool VBoxVHWAInfo::checkVHWASupport() { -#if defined(RT_OS_WINDOWS) || defined(RT_OS_LINUX) +#if defined(RT_OS_WINDOWS) || defined(RT_OS_LINUX) || defined(RT_OS_FREEBSD) static char pszVBoxPath[RTPATH_MAX]; const char *papszArgs[] = { NULL, "-test", "2D", NULL}; int rc; diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.cpp b/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.cpp index de305125b..0d4b29b64 100644 --- a/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.cpp +++ b/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.cpp @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2011 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,7 +26,7 @@ #include <QVariant> #include "VBoxGlobalSettings.h" -#include "QIHotKeyEdit.h" +#include "UIHotKeyEditor.h" #include "COMDefs.h" #endif /* !VBOX_WITH_PRECOMPILED_HEADERS */ @@ -39,22 +39,14 @@ VBoxGlobalSettingsData::VBoxGlobalSettingsData() { /* default settings */ -#if defined (Q_WS_WIN32) - hostkey = 0xA3; // VK_RCONTROL -// hostkey = 165; // VK_RMENU -#elif defined (Q_WS_PM) - hostkey = VK_CTRL; +#if defined (Q_WS_WIN) + hostCombo = "163"; // VK_RCONTROL #elif defined (Q_WS_X11) - hostkey = 0xffe4; // XK_Control_R -// hostkey = 65514; // XK_Alt_R + hostCombo = "65508"; // XK_Control_R #elif defined (Q_WS_MAC) -// hostkey = 0x36; // QZ_RMETA - hostkey = 0x37; // QZ_LMETA -// hostkey = 0x3e; // QZ_RCTRL -// hostkey = 0x3d; // QZ_RALT + hostCombo = "55"; // QZ_LMETA #else # warning "port me!" - hostkey = 0; #endif autoCapture = true; guiFeatures = QString::null; @@ -68,7 +60,7 @@ VBoxGlobalSettingsData::VBoxGlobalSettingsData() VBoxGlobalSettingsData::VBoxGlobalSettingsData (const VBoxGlobalSettingsData &that) { - hostkey = that.hostkey; + hostCombo = that.hostCombo; autoCapture = that.autoCapture; guiFeatures = that.guiFeatures; languageId = that.languageId; @@ -86,7 +78,7 @@ VBoxGlobalSettingsData::~VBoxGlobalSettingsData() bool VBoxGlobalSettingsData::operator== (const VBoxGlobalSettingsData &that) const { return this == &that || - (hostkey == that.hostkey && + (hostCombo == that.hostCombo && autoCapture == that.autoCapture && guiFeatures == that.guiFeatures && languageId == that.languageId && @@ -116,7 +108,7 @@ static struct } gPropertyMap[] = { - { "GUI/Input/HostKey", "hostKey", "0|\\d*[1-9]\\d*", true }, + { "GUI/Input/HostKeyCombination", "hostCombo", "0|\\d*[1-9]\\d*(,\\d*[1-9]\\d*)?(,\\d*[1-9]\\d*)?", true }, { "GUI/Input/AutoCapture", "autoCapture", "true|false", true }, { "GUI/Customizations", "guiFeatures", "\\S+", true }, { "GUI/LanguageID", "languageId", gVBoxLangIDRegExp, true }, @@ -126,19 +118,17 @@ gPropertyMap[] = #ifdef Q_WS_MAC { VBoxDefs::GUI_PresentationModeEnabled, "presentationModeEnabled", "true|false", true }, #endif /* Q_WS_MAC */ - { "GUI/HostScreenSaverDisabled", "hostScreenSaverDisabled", "true|false", true } + { "GUI/HostScreenSaverDisabled", "hostScreenSaverDisabled", "true|false", true } }; -void VBoxGlobalSettings::setHostKey (int key) +void VBoxGlobalSettings::setHostCombo (const QString &hostCombo) { - if (!QIHotKeyEdit::isValidKey (key)) + if (!UIHotKeyCombination::isValidKeyCombo (hostCombo)) { - last_err = tr ("'%1 (0x%2)' is an invalid host key code.") - .arg (key).arg (key, 0, 16); + last_err = tr ("'%1' is an invalid host-combination code-sequence.").arg (hostCombo); return; } - - mData()->hostkey = key; + mData()->hostCombo = hostCombo; resetError(); } @@ -163,16 +153,21 @@ bool VBoxGlobalSettings::isFeatureActive (const char *aFeature) const */ void VBoxGlobalSettings::load (CVirtualBox &vbox) { - for (size_t i = 0; i < SIZEOF_ARRAY (gPropertyMap); i++) + for (size_t i = 0; i < SIZEOF_ARRAY(gPropertyMap); i++) { - QString value = vbox.GetExtraData (gPropertyMap [i].publicName); + QString value = vbox.GetExtraData(gPropertyMap[i].publicName); if (!vbox.isOk()) return; - // empty value means the key is absent. it is ok, the default will apply + /* Check for the host key upgrade path. */ + if ( value.isEmpty() + && QString(gPropertyMap[i].publicName) == "GUI/Input/HostKeyCombination") + value = vbox.GetExtraData("GUI/Input/HostKey"); + /* Empty value means the key is absent. It is OK, the default will + * apply. */ if (value.isEmpty()) continue; - // try to set the property validating it against rx - setPropertyPrivate (i, value); + /* Try to set the property validating it against rx. */ + setPropertyPrivate(i, value); if (!(*this)) break; } diff --git a/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.h b/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.h index ac366270c..a6deb8e54 100644 --- a/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.h +++ b/src/VBox/Frontends/VirtualBox/src/VBoxGlobalSettings.h @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -37,7 +37,7 @@ public: private: - int hostkey; + QString hostCombo; bool autoCapture; QString guiFeatures; QString languageId; @@ -55,7 +55,7 @@ private: class VBoxGlobalSettings : public QObject, public CIShared <VBoxGlobalSettingsData> { Q_OBJECT - Q_PROPERTY (int hostKey READ hostKey WRITE setHostKey) + Q_PROPERTY (QString hostCombo READ hostCombo WRITE setHostCombo) Q_PROPERTY (bool autoCapture READ autoCapture WRITE setAutoCapture) Q_PROPERTY (QString guiFeatures READ guiFeatures WRITE setGuiFeatures) Q_PROPERTY (QString languageId READ languageId WRITE setLanguageId) @@ -78,8 +78,8 @@ public: // Properties - int hostKey() const { return data()->hostkey; } - void setHostKey (int key); + QString hostCombo() const { return data()->hostCombo; } + void setHostCombo (const QString &hostCombo); bool autoCapture() const { return data()->autoCapture; } void setAutoCapture (bool aAutoCapture) diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIFileDialog.cpp b/src/VBox/Frontends/VirtualBox/src/extensions/QIFileDialog.cpp index 5e71ed3a3..98bd738ef 100644 --- a/src/VBox/Frontends/VirtualBox/src/extensions/QIFileDialog.cpp +++ b/src/VBox/Frontends/VirtualBox/src/extensions/QIFileDialog.cpp @@ -858,6 +858,8 @@ QString QIFileDialog::getFirstExistingDir (const QString &aStartDir) while (!dir.exists() && !dir.isRoot()) { QFileInfo dirInfo (dir.absolutePath()); + if (dir == QDir(dirInfo.absolutePath())) + break; dir = dirInfo.absolutePath(); } if (dir.exists() && !dir.isRoot()) diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIHotKeyEdit.cpp b/src/VBox/Frontends/VirtualBox/src/extensions/QIHotKeyEdit.cpp deleted file mode 100644 index 4f1ccf9c4..000000000 --- a/src/VBox/Frontends/VirtualBox/src/extensions/QIHotKeyEdit.cpp +++ /dev/null @@ -1,564 +0,0 @@ -/* $Id: QIHotKeyEdit.cpp $ */ -/** @file - * - * VBox frontends: Qt GUI ("VirtualBox"): - * VirtualBox Qt extensions: QIHotKeyEdit class implementation - */ - -/* - * Copyright (C) 2006-2011 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. - */ - -/* Local includes */ -#include "QIHotKeyEdit.h" -#include "VBoxDefs.h" -#include "VBoxGlobal.h" - -/* Global includes */ -#include <QApplication> -#include <QStyleOption> -#include <QStylePainter> - -#ifdef Q_WS_WIN -/* VBox/cdefs.h defines these: */ -# undef LOWORD -# undef HIWORD -# undef LOBYTE -# undef HIBYTE -# include <windows.h> -#endif /* Q_WS_WIN */ - -#ifdef Q_WS_X11 -/* We need to capture some X11 events directly which - * requires the XEvent structure to be defined. However, - * including the Xlib header file will cause some nasty - * conflicts with Qt. Therefore we use the following hack - * to redefine those conflicting identifiers. */ -# define XK_XKB_KEYS -# define XK_MISCELLANY -# include <X11/Xlib.h> -# include <X11/Xutil.h> -# include <X11/keysymdef.h> -# ifdef KeyPress -const int XFocusOut = FocusOut; -const int XFocusIn = FocusIn; -const int XKeyPress = KeyPress; -const int XKeyRelease = KeyRelease; -# undef KeyRelease -# undef KeyPress -# undef FocusOut -# undef FocusIn -# endif /* KeyPress */ -# include "XKeyboard.h" -QMap<QString, QString> QIHotKeyEdit::s_keyNames; -# include <QX11Info> -#endif /* Q_WS_X11 */ - -#ifdef Q_WS_MAC -# include "UICocoaApplication.h" -# include "DarwinKeyboard.h" -# include "VBoxUtils.h" -# include <Carbon/Carbon.h> -#endif - - -#ifdef Q_WS_WIN -/* Returns the correct modifier vkey for the *last* keyboard message, - * distinguishing between left and right keys. If both are pressed - * the left key wins. If the pressed key not a modifier, wParam is returned - * unchanged. */ -int qi_distinguish_modifier_vkey(WPARAM wParam) -{ - int keyval = wParam; - switch (wParam) - { - case VK_SHIFT: - if (::GetKeyState(VK_LSHIFT) & 0x8000) keyval = VK_LSHIFT; - else if (::GetKeyState(VK_RSHIFT) & 0x8000) keyval = VK_RSHIFT; - break; - case VK_CONTROL: - if (::GetKeyState(VK_LCONTROL) & 0x8000) keyval = VK_LCONTROL; - else if (::GetKeyState(VK_RCONTROL) & 0x8000) keyval = VK_RCONTROL; - break; - case VK_MENU: - if (::GetKeyState(VK_LMENU) & 0x8000) keyval = VK_LMENU; - else if (::GetKeyState(VK_RMENU) & 0x8000) keyval = VK_RMENU; - break; - } - return keyval; -} -#endif /* Q_WS_WIN */ - - -const char *QIHotKeyEdit::m_spNoneSymbName = "None"; - -QIHotKeyEdit::QIHotKeyEdit(QWidget *pParent) - : QLabel(pParent) -{ -#ifdef Q_WS_X11 - /* Initialize the X keyboard subsystem: */ - initMappedX11Keyboard(QX11Info::display(), vboxGlobal().settings().publicProperty("GUI/RemapScancodes")); -#endif /* Q_WS_X11 */ - - clear(); - -#ifdef Q_WS_WIN - /* Qt documentation hasn't mentioned this is windows-only flag, - * but looks like that is so, anyway it is required for winEvent() handler only: */ - setAttribute(Qt::WA_NativeWindow); -#endif /* Q_WS_WIN */ - setFrameStyle(QFrame::StyledPanel | Sunken); - setAlignment(Qt::AlignCenter); - setFocusPolicy(Qt::StrongFocus); - setAutoFillBackground(true); - - QPalette p = palette(); - p.setColor(QPalette::Active, QPalette::Foreground, p.color(QPalette::Active, QPalette::Text)); - p.setColor(QPalette::Active, QPalette::Background, p.color(QPalette::Active, QPalette::Base)); - setPalette(p); - -#ifdef Q_WS_MAC - m_uDarwinKeyModifiers = GetCurrentEventKeyModifiers(); - UICocoaApplication::instance()->registerForNativeEvents(RT_BIT_32(10) | RT_BIT_32(11) | RT_BIT_32(12) /* NSKeyDown | NSKeyUp | | NSFlagsChanged */, QIHotKeyEdit::darwinEventHandlerProc, this); - ::DarwinGrabKeyboard(false /* just modifiers */); -#endif /* Q_WS_MAC */ -} - -QIHotKeyEdit::~QIHotKeyEdit() -{ -#ifdef Q_WS_MAC - ::DarwinReleaseKeyboard(); - UICocoaApplication::instance()->unregisterForNativeEvents(RT_BIT_32(10) | RT_BIT_32(11) | RT_BIT_32(12) /* NSKeyDown | NSKeyUp | | NSFlagsChanged */, QIHotKeyEdit::darwinEventHandlerProc, this); -#endif -} - -/** - * Set the hot key value. O means there is no hot key. - * - * @note - * The key value is platform-dependent. On Win32 it is the - * virtual key, on Linux it is the first (0) keysym corresponding - * to the keycode. - */ -void QIHotKeyEdit::setKey(int iKeyVal) -{ - m_iKeyVal = iKeyVal; - m_strSymbName = QIHotKeyEdit::keyName(iKeyVal); - updateText(); -} - -/**@@ QIHotKeyEdit::key() const - * - * Returns the value of the last recorded hot key. - * O means there is no hot key. - * - * @note - * The key value is platform-dependent. On Win32 it is the - * virtual key, on Linux it is the first (0) keysym corresponding - * to the keycode. - */ - -QSize QIHotKeyEdit::sizeHint() const -{ - ensurePolished(); - QFontMetrics fm(font()); - int h = qMax(fm.lineSpacing(), 14) + 2; - int w = fm.width('x') * 17; - int m = frameWidth() * 2; - QStyleOption option; - option.initFrom(this); - return (style()->sizeFromContents(QStyle::CT_LineEdit, &option, - QSize(w + m, h + m) - .expandedTo(QApplication::globalStrut()), - this)); -} - -QSize QIHotKeyEdit::minimumSizeHint() const -{ - ensurePolished(); - QFontMetrics fm = fontMetrics(); - int h = fm.height() + qMax(2, fm.leading()); - int w = fm.maxWidth(); - int m = frameWidth() * 2; - return QSize(w + m, h + m); -} - -/** - * Returns the string representation of a given key. - * - * @note - * The key value is platform-dependent. On Win32 it is the - * virtual key, on Linux it is the first (0) keysym corresponding - * to the keycode. - */ -/* static */ -QString QIHotKeyEdit::keyName(int iKeyVal) -{ - QString strName; - - if (!iKeyVal) - { - strName = tr(m_spNoneSymbName); - } - else - { -#if defined (Q_WS_WIN) - /* Stupid MapVirtualKey doesn't distinguish between right and left - * vkeys, even under XP, despite that it stated in msdn. Do it by - * hands. Besides that it can't recognize such virtual keys as - * VK_DIVIDE & VK_PAUSE, this is also known bug. */ - int scan; - switch (iKeyVal) - { - /* Processing special keys... */ - case VK_PAUSE: scan = 0x45 << 16; break; - case VK_RSHIFT: scan = 0x36 << 16; break; - case VK_RCONTROL: scan = (0x1D << 16) | (1 << 24); break; - case VK_RMENU: scan = (0x38 << 16) | (1 << 24); break; - /* Processing extended keys... */ - case VK_APPS: - case VK_LWIN: - case VK_RWIN: - case VK_NUMLOCK: scan = (::MapVirtualKey(iKeyVal, 0) | 256) << 16; break; - default: scan = ::MapVirtualKey(iKeyVal, 0) << 16; - } - TCHAR *str = new TCHAR[256]; - if (::GetKeyNameText(scan, str, 256)) - { - strName = QString::fromUtf16(str); - } - else - { - AssertFailed(); - strName = QString(tr("<key_%1>")).arg(iKeyVal); - } - delete[] str; -#elif defined (Q_WS_X11) - char *sn = ::XKeysymToString((KeySym)iKeyVal); - if (sn) - { - strName = s_keyNames[sn]; - if (strName.isEmpty()) - strName = sn; - } - else - { - AssertFailed(); - strName = QString(tr("<key_%1>")).arg(iKeyVal); - } -#elif defined(Q_WS_MAC) - UInt32 modMask = DarwinKeyCodeToDarwinModifierMask(iKeyVal); - switch (modMask) - { - case shiftKey: - case optionKey: - case controlKey: - case cmdKey: - strName = tr("Left "); - break; - case rightShiftKey: - case rightOptionKey: - case rightControlKey: - case kEventKeyModifierRightCmdKeyMask: - strName = tr("Right "); - break; - default: - AssertMsgFailedReturn(("modMask=%#x\n", modMask), QString()); - } - switch (modMask) - { - case shiftKey: - case rightShiftKey: - strName += QChar(kShiftUnicode); - break; - case optionKey: - case rightOptionKey: - strName += QChar(kOptionUnicode); - break; - case controlKey: - case rightControlKey: - strName += QChar(kControlUnicode); - break; - case cmdKey: - case kEventKeyModifierRightCmdKeyMask: - strName += QChar(kCommandUnicode); - break; - } -#else - AssertFailed(); - strName = QString(tr("<key_%1>")).arg(iKeyVal); -#endif - } - - return strName; -} - -/* static */ -bool QIHotKeyEdit::isValidKey(int iKeyVal) -{ - /* Empty value is correct: */ - if (iKeyVal == 0) - return true; -#if defined(Q_WS_WIN) - return ((iKeyVal >= VK_SHIFT && iKeyVal <= VK_CAPITAL) || - iKeyVal == VK_PRINT || - iKeyVal == VK_LWIN || iKeyVal == VK_RWIN || - iKeyVal == VK_APPS || - (iKeyVal >= VK_F1 && iKeyVal <= VK_F24) || - iKeyVal == VK_NUMLOCK || iKeyVal == VK_SCROLL || - (iKeyVal >= VK_LSHIFT && iKeyVal <= VK_RMENU)); -#elif defined(Q_WS_X11) - KeySym ks = (KeySym)iKeyVal; - return (ks != NoSymbol && ks != XK_Insert) && - (ks == XK_Scroll_Lock || IsModifierKey(ks) || IsFunctionKey(ks) || IsMiscFunctionKey(ks)); -#elif defined(Q_WS_MAC) - UInt32 modMask = ::DarwinKeyCodeToDarwinModifierMask(iKeyVal); - switch (modMask) - { - case shiftKey: - case optionKey: - case controlKey: - case rightShiftKey: - case rightOptionKey: - case rightControlKey: - case cmdKey: - case kEventKeyModifierRightCmdKeyMask: - return true; - default: - return false; - } -#else - Q_UNUSED(iKeyVal); - return true; -#endif -} - -#ifdef Q_WS_X11 -/* Updates the associative array containing the translations - * of X11 key strings to human readable key names. */ -void QIHotKeyEdit::retranslateUi() -{ - /* Note: strings for the same key must match strings in retranslateUi() - * versions for all platforms, to keep translators happy. */ - - s_keyNames["Shift_L"] = tr("Left Shift"); - s_keyNames["Shift_R"] = tr("Right Shift"); - s_keyNames["Control_L"] = tr("Left Ctrl"); - s_keyNames["Control_R"] = tr("Right Ctrl"); - s_keyNames["Alt_L"] = tr("Left Alt"); - s_keyNames["Alt_R"] = tr("Right Alt"); - s_keyNames["Super_L"] = tr("Left WinKey"); - s_keyNames["Super_R"] = tr("Right WinKey"); - s_keyNames["Menu"] = tr("Menu key"); - s_keyNames["ISO_Level3_Shift"] = tr("Alt Gr"); - s_keyNames["Caps_Lock"] = tr("Caps Lock"); - s_keyNames["Scroll_Lock"] = tr("Scroll Lock"); -} -#endif /* Q_WS_X11 */ - -void QIHotKeyEdit::clear() -{ - m_iKeyVal = 0; - m_strSymbName = tr(m_spNoneSymbName); - updateText(); -} - -#if defined (Q_WS_WIN) - -bool QIHotKeyEdit::winEvent(MSG *pMsg, long* /* pResult */) -{ - if (!(pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN || - pMsg->message == WM_KEYUP || pMsg->message == WM_SYSKEYUP || - pMsg->message == WM_CHAR || pMsg->message == WM_SYSCHAR || - pMsg->message == WM_DEADCHAR || pMsg->message == WM_SYSDEADCHAR || - pMsg->message == WM_CONTEXTMENU)) - return false; - - /* Ignore if not a valid hot key: */ - if (!isValidKey(pMsg->wParam)) - return false; - -#if 0 - LogFlow(("%WM_%04X: vk=%04X rep=%05d scan=%02X ext=%01d" - "rzv=%01X ctx=%01d prev=%01d tran=%01d\n", - pMsg->message, pMsg->wParam, - (pMsg->lParam & 0xFFFF), - ((pMsg->lParam >> 16) & 0xFF), - ((pMsg->lParam >> 24) & 0x1), - ((pMsg->lParam >> 25) & 0xF), - ((pMsg->lParam >> 29) & 0x1), - ((pMsg->lParam >> 30) & 0x1), - ((pMsg->lParam >> 31) & 0x1))); -#endif - - if (pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN) - { - /* Determine platform-dependent key: */ - m_iKeyVal = qi_distinguish_modifier_vkey(pMsg->wParam); - /* Determine symbolic name: */ - TCHAR *pStr = new TCHAR[256]; - if (::GetKeyNameText(pMsg->lParam, pStr, 256)) - { - m_strSymbName = QString::fromUtf16(pStr); - } - else - { - AssertFailed(); - m_strSymbName = QString(tr("<key_%1>")).arg(m_iKeyVal); - } - delete[] pStr; - /* Update the display: */ - updateText(); - } - - return true; -} - -#elif defined (Q_WS_X11) - -bool QIHotKeyEdit::x11Event(XEvent *pEvent) -{ - switch (pEvent->type) - { - case XKeyPress: - case XKeyRelease: - { - XKeyEvent *pKeyEvent = (XKeyEvent*)pEvent; - KeySym ks = ::XKeycodeToKeysym(pKeyEvent->display, pKeyEvent->keycode, 0); - /* Ignore if not a valid hot key: */ - if (!isValidKey((int)ks)) - return false; - - /* Skip key releases: */ - if (pEvent->type == XKeyRelease) - return true; - - /* Determine platform-dependent key: */ - m_iKeyVal = (int)ks; - /* Determine symbolic name: */ - m_strSymbName = QIHotKeyEdit::keyName(m_iKeyVal); - /* Update the display: */ - updateText(); -#if 0 - LogFlow(("%s: state=%08X keycode=%08X keysym=%08X symb=%s\n", - pEvent->type == XKeyPress ? "XKeyPress" : "XKeyRelease", - pKeyEvent->state, pKeyEvent->keycode, ks, - symbname.latin1())); -#endif - return true; - } - } - - return false; -} - -#elif defined (Q_WS_MAC) - -/* static */ -bool QIHotKeyEdit::darwinEventHandlerProc(const void *pvCocoaEvent, const void *pvCarbonEvent, void *pvUser) -{ - QIHotKeyEdit *edit = (QIHotKeyEdit*)pvUser; - EventRef inEvent = (EventRef)pvCarbonEvent; - UInt32 EventClass = ::GetEventClass(inEvent); - if (EventClass == kEventClassKeyboard) - return edit->darwinKeyboardEvent(pvCocoaEvent, inEvent); - return false; -} - -bool QIHotKeyEdit::darwinKeyboardEvent(const void *pvCocoaEvent, EventRef inEvent) -{ -#if 0 /* for debugging */ - ::darwinDebugPrintEvent("QIHotKeyEdit", inEvent); -#endif - - /* Ignore key changes unless we're the focus widget: */ - if (!hasFocus()) - return false; - - UInt32 eventKind = ::GetEventKind(inEvent); - switch (eventKind) - { - /*case kEventRawKeyDown: - case kEventRawKeyUp: - case kEventRawKeyRepeat:*/ - case kEventRawKeyModifiersChanged: - { - UInt32 modifierMask = 0; - ::GetEventParameter(inEvent, kEventParamKeyModifiers, typeUInt32, NULL, - sizeof(modifierMask), NULL, &modifierMask); - - modifierMask = ::DarwinAdjustModifierMask(modifierMask, pvCocoaEvent); - UInt32 changed = m_uDarwinKeyModifiers ^ modifierMask; - m_uDarwinKeyModifiers = modifierMask; - - /* Skip key releases: */ - if (changed && (changed & modifierMask)) - break; - - /* Convert to keycode and skip keycodes we don't care about. */ - unsigned keyCode = ::DarwinModifierMaskToDarwinKeycode(changed); - if (!keyCode || keyCode == ~0U || !isValidKey(keyCode)) - break; - - /* Update key current key: */ - m_iKeyVal = keyCode; - m_strSymbName = QIHotKeyEdit::keyName(keyCode); - updateText(); - break; //return true; - } - break; - } - return false; -} - -#else -# warning "Port me!" -#endif - -void QIHotKeyEdit::focusInEvent(QFocusEvent *pEvent) -{ - QLabel::focusInEvent(pEvent); - - QPalette p = palette(); - p.setColor(QPalette::Active, QPalette::Foreground, p.color(QPalette::Active, QPalette::HighlightedText)); - p.setColor(QPalette::Active, QPalette::Background, p.color(QPalette::Active, QPalette::Highlight)); - setPalette(p); -} - -void QIHotKeyEdit::focusOutEvent(QFocusEvent *pEvent) -{ - QLabel::focusOutEvent(pEvent); - - QPalette p = palette(); - p.setColor(QPalette::Active, QPalette::Foreground, p.color(QPalette::Active, QPalette::Text)); - p.setColor(QPalette::Active, QPalette::Background, p.color(QPalette::Active, QPalette::Base)); - setPalette(p); -} - -void QIHotKeyEdit::paintEvent(QPaintEvent *pEvent) -{ - if (hasFocus()) - { - QStylePainter painter(this); - QStyleOptionFocusRect option; - option.initFrom(this); - option.backgroundColor = palette().color(QPalette::Background); - option.rect = contentsRect(); - painter.drawPrimitive(QStyle::PE_FrameFocusRect, option); - } - QLabel::paintEvent(pEvent); -} - -void QIHotKeyEdit::updateText() -{ - setText(QString(" %1 ").arg(m_strSymbName)); -} - diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.cpp b/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.cpp index eef9351f8..13609c3b8 100644 --- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.cpp +++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.cpp @@ -78,6 +78,9 @@ const char* VBoxDefs::GUI_Export_Username = "GUI/Export/Username"; const char* VBoxDefs::GUI_Export_Hostname = "GUI/Export/Hostname"; const char* VBoxDefs::GUI_Export_Bucket = "GUI/Export/Bucket"; const char* VBoxDefs::GUI_PreventBetaWarning = "GUI/PreventBetaWarning"; +const char* VBoxDefs::GUI_RecentFolderHD = "GUI/RecentFolderHD"; +const char* VBoxDefs::GUI_RecentFolderCD = "GUI/RecentFolderCD"; +const char* VBoxDefs::GUI_RecentFolderFD = "GUI/RecentFolderFD"; const char* VBoxDefs::GUI_RecentListHD = "GUI/RecentListHD"; const char* VBoxDefs::GUI_RecentListCD = "GUI/RecentListCD"; const char* VBoxDefs::GUI_RecentListFD = "GUI/RecentListFD"; diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.h b/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.h index 2dc507ba7..fcb95e748 100644 --- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.h +++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxDefs.h @@ -154,6 +154,9 @@ struct VBoxDefs static const char* GUI_Export_Bucket; static const char* GUI_PreventBetaWarning; + static const char* GUI_RecentFolderHD; + static const char* GUI_RecentFolderCD; + static const char* GUI_RecentFolderFD; static const char* GUI_RecentListHD; static const char* GUI_RecentListCD; static const char* GUI_RecentListFD; diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp index 03d3530fd..201139f0d 100644 --- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp +++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.cpp @@ -24,7 +24,6 @@ #include "VBoxDefs.h" #include "VBoxSelectorWnd.h" #include "VBoxProblemReporter.h" -#include "QIHotKeyEdit.h" #include "QIMessageBox.h" #include "QIDialogButtonBox.h" #include "UIIconPool.h" @@ -72,6 +71,7 @@ #include <math.h> #ifdef Q_WS_X11 +# include "UIHotKeyEditor.h" # ifndef VBOX_OSE # include "VBoxLicenseViewer.h" # endif /* VBOX_OSE */ @@ -2633,14 +2633,13 @@ QString VBoxGlobal::openMediumWithFileOpenDialog(VBoxDefs::MediumType mediumType bool fUseLastFolder /* = false */) { /* Initialize variables: */ - QString strHomeFolder = fUseLastFolder && !m_strLastFolder.isEmpty() ? m_strLastFolder : - strDefaultFolder.isEmpty() ? vboxGlobal().virtualBox().GetHomeFolder() : strDefaultFolder; QList < QPair <QString, QString> > filters; QStringList backends; QStringList prefixes; QString strFilter; QString strTitle; QString allType; + QString strLastFolder; switch (mediumType) { case VBoxDefs::MediumType_HardDisk: @@ -2648,6 +2647,11 @@ QString VBoxGlobal::openMediumWithFileOpenDialog(VBoxDefs::MediumType mediumType filters = vboxGlobal().HDDBackends(); strTitle = tr ("Choose a virtual hard disk file"); allType = tr ("hard disk"); + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderHD); + if (strLastFolder.isEmpty()) + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderCD); + if (strLastFolder.isEmpty()) + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderFD); break; } case VBoxDefs::MediumType_DVD: @@ -2655,6 +2659,11 @@ QString VBoxGlobal::openMediumWithFileOpenDialog(VBoxDefs::MediumType mediumType filters = vboxGlobal().DVDBackends(); strTitle = tr ("Choose a virtual CD/DVD disk file"); allType = tr ("CD/DVD-ROM disk"); + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderCD); + if (strLastFolder.isEmpty()) + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderHD); + if (strLastFolder.isEmpty()) + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderFD); break; } case VBoxDefs::MediumType_Floppy: @@ -2662,11 +2671,18 @@ QString VBoxGlobal::openMediumWithFileOpenDialog(VBoxDefs::MediumType mediumType filters = vboxGlobal().FloppyBackends(); strTitle = tr ("Choose a virtual floppy disk file"); allType = tr ("floppy disk"); + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderFD); + if (strLastFolder.isEmpty()) + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderCD); + if (strLastFolder.isEmpty()) + strLastFolder = virtualBox().GetExtraData(VBoxDefs::GUI_RecentFolderHD); break; } default: break; } + QString strHomeFolder = fUseLastFolder && !strLastFolder.isEmpty() ? strLastFolder : + strDefaultFolder.isEmpty() ? vboxGlobal().virtualBox().GetHomeFolder() : strDefaultFolder; /* Prepare filters and backends: */ for (int i = 0; i < filters.count(); ++i) @@ -2702,19 +2718,23 @@ QString VBoxGlobal::openMedium(VBoxDefs::MediumType mediumType, QString strMediu CVirtualBox vbox = vboxGlobal().virtualBox(); /* Remember the path of the last chosen medium: */ - m_strLastFolder = QFileInfo(strMediumLocation).absolutePath(); + QString strRecentFolderKey = mediumType == VBoxDefs::MediumType_HardDisk ? VBoxDefs::GUI_RecentFolderHD : + mediumType == VBoxDefs::MediumType_DVD ? VBoxDefs::GUI_RecentFolderCD : + mediumType == VBoxDefs::MediumType_Floppy ? VBoxDefs::GUI_RecentFolderFD : + QString(); + vbox.SetExtraData(strRecentFolderKey, QFileInfo(strMediumLocation).absolutePath()); /* Update recently used list: */ - QString strRecentAddress = mediumType == VBoxDefs::MediumType_HardDisk ? VBoxDefs::GUI_RecentListHD : + QString strRecentListKey = mediumType == VBoxDefs::MediumType_HardDisk ? VBoxDefs::GUI_RecentListHD : mediumType == VBoxDefs::MediumType_DVD ? VBoxDefs::GUI_RecentListCD : mediumType == VBoxDefs::MediumType_Floppy ? VBoxDefs::GUI_RecentListFD : QString(); - QStringList recentMediumList = virtualBox().GetExtraData(strRecentAddress).split(';'); + QStringList recentMediumList = vbox.GetExtraData(strRecentListKey).split(';'); if (recentMediumList.contains(strMediumLocation)) recentMediumList.removeAll(strMediumLocation); recentMediumList.prepend(strMediumLocation); while(recentMediumList.size() > 5) recentMediumList.removeLast(); - virtualBox().SetExtraData(strRecentAddress, recentMediumList.join(";")); + vbox.SetExtraData(strRecentListKey, recentMediumList.join(";")); /* Open corresponding medium: */ CMedium comMedium = vbox.OpenMedium(strMediumLocation, mediumTypeToGlobal(mediumType), KAccessMode_ReadWrite); @@ -3015,12 +3035,11 @@ void VBoxGlobal::retranslateUi() it != mMediaList.end(); ++ it) it->refresh(); -#if defined (Q_WS_PM) || defined (Q_WS_X11) - /* As PM and X11 do not (to my knowledge) have functionality for providing - * human readable key names, we keep a table of them, which must be - * updated when the language is changed. */ - QIHotKeyEdit::retranslateUi(); -#endif +#ifdef Q_WS_X11 + /* As X11 do not have functionality for providing human readable key names, + * we keep a table of them, which must be updated when the language is changed. */ + UIHotKey::retranslateKeyNames(); +#endif /* Q_WS_X11 */ } // public static stuff diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h index 7c54ec2da..386d442c4 100644 --- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h +++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxGlobal.h @@ -861,8 +861,6 @@ private: QString mUserDefinedPortName; - mutable QString m_strLastFolder; - QPixmap mWarningIcon, mErrorIcon; QFileIconProvider m_globalIconProvider; diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp b/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp index 93ad4197b..0a74b544e 100644 --- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp +++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.cpp @@ -38,7 +38,7 @@ #include "UIDownloaderUserManual.h" #include "UIMachine.h" #include "VBoxAboutDlg.h" -#include "QIHotKeyEdit.h" +#include "UIHotKeyEditor.h" #ifdef Q_WS_MAC # include "VBoxUtils-darwin.h" #endif @@ -1684,7 +1684,7 @@ bool VBoxProblemReporter::confirmInputCapture (bool *aAutoConfirmed /* = NULL */ "</p>") + tr ("<p>The host key is currently defined as <b>%1</b>.</p>", "additional message box paragraph") - .arg (QIHotKeyEdit::keyName (vboxGlobal().settings().hostKey())), + .arg (UIHotKeyCombination::toReadableString (vboxGlobal().settings().hostCombo())), "confirmInputCapture", QIMessageBox::Ok | QIMessageBox::Default, QIMessageBox::Cancel | QIMessageBox::Escape, @@ -1717,7 +1717,7 @@ void VBoxProblemReporter::remindAboutAutoCapture() "</p>") + tr ("<p>The host key is currently defined as <b>%1</b>.</p>", "additional message box paragraph") - .arg (QIHotKeyEdit::keyName (vboxGlobal().settings().hostKey())), + .arg (UIHotKeyCombination::toReadableString (vboxGlobal().settings().hostCombo())), "remindAboutAutoCapture"); } @@ -1885,7 +1885,7 @@ bool VBoxProblemReporter::confirmGoingFullscreen (const QString &aHotKey) "<p>Note that the main menu bar is hidden in fullscreen mode. " "You can access it by pressing <b>Host+Home</b>.</p>") .arg (aHotKey) - .arg (QIHotKeyEdit::keyName (vboxGlobal().settings().hostKey())), + .arg (UIHotKeyCombination::toReadableString (vboxGlobal().settings().hostCombo())), "confirmGoingFullscreen", tr ("Switch", "fullscreen")); } @@ -1905,7 +1905,7 @@ bool VBoxProblemReporter::confirmGoingSeamless (const QString &aHotKey) "<p>Note that the main menu bar is hidden in seamless mode. " "You can access it by pressing <b>Host+Home</b>.</p>") .arg (aHotKey) - .arg (QIHotKeyEdit::keyName (vboxGlobal().settings().hostKey())), + .arg (UIHotKeyCombination::toReadableString (vboxGlobal().settings().hostCombo())), "confirmGoingSeamless", tr ("Switch", "seamless")); } @@ -1925,7 +1925,7 @@ bool VBoxProblemReporter::confirmGoingScale (const QString &aHotKey) "<p>Note that the main menu bar is hidden in scale mode. " "You can access it by pressing <b>Host+Home</b>.</p>") .arg (aHotKey) - .arg (QIHotKeyEdit::keyName (vboxGlobal().settings().hostKey())), + .arg (UIHotKeyCombination::toReadableString (vboxGlobal().settings().hostCombo())), "confirmGoingScale", tr ("Switch", "scale")); } @@ -1981,10 +1981,11 @@ bool VBoxProblemReporter::confirmVMReset (QWidget *aParent) void VBoxProblemReporter::warnAboutCannotCreateMachineFolder(QWidget *pParent, const QString &strFolderName) { + QFileInfo fi(strFolderName); message(pParent ? pParent : mainWindowShown(), Critical, - tr("<p>Cannot create the machine folder:</p>" - "<p><b>%1</b></p>" - "<p>Please check you have the permissions required to do so.</p>").arg(strFolderName)); + tr("<p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p>" + "<p>Please check that the parent really exists and that you have permissions to create the machine folder.</p>") + .arg(fi.fileName()).arg(fi.absolutePath())); } /** @@ -2555,6 +2556,11 @@ void VBoxProblemReporter::remindAboutWrongColorDepth(ulong uRealBPP, ulong uWant emit sigRemindAboutWrongColorDepth(uRealBPP, uWantedBPP); } +void VBoxProblemReporter::remindAboutUnsupportedUSB2(const QString &strExtPackName, QWidget *pParent) +{ + emit sigRemindAboutUnsupportedUSB2(strExtPackName, pParent); +} + void VBoxProblemReporter::showHelpWebDialog() { vboxGlobal().openURL ("http://www.virtualbox.org"); @@ -2787,6 +2793,23 @@ void VBoxProblemReporter::sltRemindAboutWrongColorDepth(ulong uRealBPP, ulong uW kName); } +void VBoxProblemReporter::sltRemindAboutUnsupportedUSB2(const QString &strExtPackName, QWidget *pParent) +{ + if (isAlreadyShown("sltRemindAboutUnsupportedUSB2")) + return; + setShownStatus("sltRemindAboutUnsupportedUSB2"); + + message(pParent ? pParent : mainMachineWindowShown(), Warning, + tr("<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>") + .arg(strExtPackName)); + + clearShownStatus("sltRemindAboutUnsupportedUSB2"); +} + VBoxProblemReporter::VBoxProblemReporter() { /* Register required objects as meta-types: */ @@ -2828,6 +2851,8 @@ VBoxProblemReporter::VBoxProblemReporter() Qt::BlockingQueuedConnection); connect(this, SIGNAL(sigRemindAboutWrongColorDepth(ulong, ulong)), this, SLOT(sltRemindAboutWrongColorDepth(ulong, ulong)), Qt::QueuedConnection); + connect(this, SIGNAL(sigRemindAboutUnsupportedUSB2(const QString&, QWidget*)), + this, SLOT(sltRemindAboutUnsupportedUSB2(const QString&, QWidget*)), Qt::QueuedConnection); } /* Returns a reference to the global VirtualBox problem reporter instance: */ diff --git a/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.h b/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.h index a321d5917..2fafd7364 100644 --- a/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.h +++ b/src/VBox/Frontends/VirtualBox/src/globals/VBoxProblemReporter.h @@ -398,6 +398,7 @@ public: void cannotRemoveSharedFolder(const CConsole &console, const QString &strName, const QString &strPath, QWidget *pParent = 0); void remindAboutWrongColorDepth(ulong uRealBPP, ulong uWantedBPP); + void remindAboutUnsupportedUSB2(const QString &strExtPackName, QWidget *pParent = 0); signals: @@ -420,6 +421,7 @@ signals: void sigCannotRemoveSharedFolder(const CConsole &console, const QString &strName, const QString &strPath, QWidget *pParent); void sigRemindAboutWrongColorDepth(ulong uRealBPP, ulong uWantedBPP); + void sigRemindAboutUnsupportedUSB2(const QString &strExtPackName, QWidget *pParent); public slots: @@ -447,6 +449,7 @@ private slots: void sltCannotRemoveSharedFolder(const CConsole &console, const QString &strName, const QString &strPath, QWidget *pParent); void sltRemindAboutWrongColorDepth(ulong uRealBPP, ulong uWantedBPP); + void sltRemindAboutUnsupportedUSB2(const QString &strExtPackName, QWidget *pParent); private: diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp b/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp index b4aa656c4..b802d1c85 100644 --- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp +++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/DarwinKeyboard.cpp @@ -55,6 +55,7 @@ typedef enum { kCGSGlobalHotKeyEnable = 0, kCGSGlobalHotKeyDisable, + kCGSGlobalHotKeyDisableExceptUniversalAccess, kCGSGlobalHotKeyInvalid = -1 /* bird */ } CGSGlobalHotKeyOperatingMode; extern CGSConnection _CGSDefaultConnection(void); @@ -435,7 +436,8 @@ void DarwinDisableGlobalHotKeys(bool fDisable) CGSGlobalHotKeyOperatingMode enmMode = kCGSGlobalHotKeyInvalid; CGSGetGlobalHotKeyOperatingMode(g_CGSConnection, &enmMode); if ( enmMode != kCGSGlobalHotKeyEnable - && enmMode != kCGSGlobalHotKeyDisable) + && enmMode != kCGSGlobalHotKeyDisable + && enmMode != kCGSGlobalHotKeyDisableExceptUniversalAccess) { AssertMsgFailed(("%d\n", enmMode)); if (s_cComplaints++ < 32) diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.mm b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.mm index 12d245347..165a46967 100644 --- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.mm +++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/UICocoaSpecialControls.mm @@ -37,8 +37,8 @@ #include <QKeyEvent> #include <QMacCocoaViewContainer> -/* - * Private interfaces +/* + * Private interfaces */ @interface UIButtonTargetPrivate: NSObject { @@ -70,7 +70,7 @@ -(id)initWithObject2:(UICocoaSearchField*)object; @end -#if MAC_OS_X_VERSION_MIN_ALLOWED >= MAC_OS_X_VERSION_10_6 +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 @interface UISearchFieldDelegatePrivate: NSObject<NSTextFieldDelegate> #else @interface UISearchFieldDelegatePrivate: NSObject @@ -78,7 +78,7 @@ {} @end -/* +/* * Implementation of the private interfaces */ @implementation UIButtonTargetPrivate @@ -121,7 +121,7 @@ return self; } -- (void)dealloc +- (void)dealloc { [mBGColor release]; [super dealloc]; @@ -221,7 +221,7 @@ @end -/* +/* * Helper functions */ NSRect darwinCenterRectVerticalTo(NSRect aRect, const NSRect& aToRect) @@ -230,8 +230,8 @@ NSRect darwinCenterRectVerticalTo(NSRect aRect, const NSRect& aToRect) return aRect; } -/* - * Public classes +/* + * Public classes */ UICocoaWrapper::UICocoaWrapper(QWidget *pParent /* = 0 */) : QWidget(pParent) diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin-cocoa.mm b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin-cocoa.mm index 50f336eb8..cf4195177 100644 --- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin-cocoa.mm +++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin-cocoa.mm @@ -29,6 +29,8 @@ #import <AppKit/NSColor.h> #import <AppKit/NSFont.h> +#import <objc/objc-class.h> + /* For the keyboard stuff */ #include <Carbon/Carbon.h> #include "DarwinKeyboard.h" @@ -333,6 +335,56 @@ float darwinSmallFontSize() return size; } +bool darwinMouseGrabEvents(const void *pvCocoaEvent, const void *pvCarbonEvent, void *pvUser) +{ + NSEvent *pEvent = (NSEvent*)pvCocoaEvent; + NSEventType EvtType = [pEvent type]; + NSWindow *pWin = ::darwinToNativeWindow((QWidget*)pvUser); + if ( pWin == [pEvent window] + && ( EvtType == NSLeftMouseDown + || EvtType == NSLeftMouseUp + || EvtType == NSRightMouseDown + || EvtType == NSRightMouseUp + || EvtType == NSOtherMouseDown + || EvtType == NSOtherMouseUp + || EvtType == NSLeftMouseDragged + || EvtType == NSRightMouseDragged + || EvtType == NSOtherMouseDragged + || EvtType == NSMouseMoved + || EvtType == NSScrollWheel)) + { + /* When the mouse position is not associated to the mouse cursor, the x + and y values are reported as delta values. */ + float x = [pEvent deltaX]; + float y = [pEvent deltaY]; + if (EvtType == NSScrollWheel) + { + /* In the scroll wheel case we have to do some magic, cause a + normal scroll wheel on a mouse behaves different to a trackpad. + The following is used within Qt. We use the same to get a + similar behavior. */ + if ([pEvent respondsToSelector:@selector(deviceDeltaX:)]) + x = (float)(intptr_t)[pEvent performSelector:@selector(deviceDeltaX)] * 2; + else + x = qBound(-120, (int)(x * 10000), 120); + if ([pEvent respondsToSelector:@selector(deviceDeltaY:)]) + y = (float)(intptr_t)[pEvent performSelector:@selector(deviceDeltaY)] * 2; + else + y = qBound(-120, (int)(y * 10000), 120); + } + /* Get the buttons which where pressed when this event occurs. We have + to use Carbon here, cause the Cocoa method [NSEvent pressedMouseButtons] + is >= 10.6. */ + uint32 buttonMask = 0; + GetEventParameter((EventRef)pvCarbonEvent, kEventParamMouseChord, typeUInt32, 0, + sizeof(buttonMask), 0, &buttonMask); + /* Produce a Qt event out of our info. */ + ::darwinSendMouseGrabEvents((QWidget*)pvUser, EvtType, [pEvent buttonNumber], buttonMask, x, y); + return true; + } + return false; +} + /* Cocoa event handler which checks if the user right clicked at the unified toolbar or the title area. */ bool darwinUnifiedToolbarEvents(const void *pvCocoaEvent, const void *pvCarbonEvent, void *pvUser) @@ -419,3 +471,128 @@ void darwinRetranslateAppMenu() } } +/* Our resize proxy singleton. This class has two major tasks. First it is used + to proxy the windowWillResize selector of the Qt delegate. As this is class + global and therewith done for all Qt window instances, we have to track the + windows we are interested in. This is the second task. */ +@interface UIResizeProxy: NSObject +{ + NSMutableArray *m_pArray; + bool m_fInit; +} ++(UIResizeProxy*)sharedResizeProxy; +-(void)addWindow:(NSWindow*)pWindow; +-(void)removeWindow:(NSWindow*)pWindow; +-(BOOL)containsWindow:(NSWindow*)pWindow; +@end + +static UIResizeProxy *gSharedResizeProxy = nil; + +@implementation UIResizeProxy ++(UIResizeProxy*)sharedResizeProxy +{ + if (gSharedResizeProxy == nil) + gSharedResizeProxy = [[super allocWithZone:NULL] init]; + return gSharedResizeProxy; +} +-(id)init +{ + self = [super init]; + + m_fInit = false; + + return self; +} +- (void)addWindow:(NSWindow*)pWindow +{ + if (!m_fInit) + { + /* Create an array which contains the registered windows. */ + m_pArray = [[NSMutableArray alloc] init]; + /* Swizzle the windowWillResize method. This means replacing the + original method with our own one and reroute the original one to + another name. */ + Class oriClass = [[pWindow delegate] class]; + Class myClass = [UIResizeProxy class]; + SEL oriSel = @selector(windowWillResize:toSize:); + SEL qtSel = @selector(qtWindowWillResize:toSize:); + Method m1 = class_getInstanceMethod(oriClass, oriSel); + Method m2 = class_getInstanceMethod(myClass, oriSel); + Method m3 = class_getInstanceMethod(myClass, qtSel); + /* Overwrite the original implementation with our own one. old contains + the old implementation. */ + IMP old = method_setImplementation(m1, method_getImplementation(m2)); + /* Add a new method to our class with the old implementation. */ + class_addMethod(oriClass, qtSel, old, method_getTypeEncoding(m3)); + m_fInit = true; + } + [m_pArray addObject:pWindow]; +} +- (void)removeWindow:(NSWindow*)pWindow +{ + [m_pArray removeObject:pWindow]; +} +- (BOOL)containsWindow:(NSWindow*)pWindow +{ + return [m_pArray containsObject:pWindow]; +} +- (NSSize)qtWindowWillResize:(NSWindow *)pWindow toSize:(NSSize)newFrameSize +{ + /* This is a fake implementation. It will be replaced by the original Qt + method. */ + return newFrameSize; +} +- (NSSize)windowWillResize:(NSWindow *)pWindow toSize:(NSSize)newFrameSize +{ + /* Call the original implementation for newFrameSize. */ + NSSize qtSize = [self qtWindowWillResize:pWindow toSize:newFrameSize]; + /* Check if we are responsible for this window. */ + if (![[UIResizeProxy sharedResizeProxy] containsWindow:pWindow]) + return qtSize; + /* The static modifier method in NSEvent is >= 10.6. It allows us to check + the shift modifier state during the resize. If it is not available the + user have to press shift before he start to resize. */ + if ([NSEvent respondsToSelector:@selector(modifierFlags)]) + if (((int)(intptr_t)[NSEvent performSelector:@selector(modifierFlags)] & NSShiftKeyMask) == NSShiftKeyMask) + return qtSize; + else + /* Shift key pressed when this resize event was initiated? */ + if (([pWindow resizeFlags] & NSShiftKeyMask) == NSShiftKeyMask) + return qtSize; + /* The default case is to calculate the aspect radio of the old size and + used it for the new size. */ + NSSize s = [pWindow frame].size; + double a = (double)s.width / s.height; + NSSize newSize = NSMakeSize(newFrameSize.width, newFrameSize.width / a); + /* We have to make sure the new rectangle meets the minimum requirements. */ + NSSize testSize = [self qtWindowWillResize:pWindow toSize:newSize]; + if ( testSize.width > newSize.width + || testSize.height > newSize.height) + { + double w1 = testSize.width / newSize.width; + double h1 = testSize.height / newSize.height; + if ( w1 > 1 + && w1 > h1) + { + newSize.width = testSize.width; + newSize.height = testSize.width * a; + }else if (h1 > 1) + { + newSize.width = testSize.height * a; + newSize.height = testSize.height; + } + } + return newSize; +} +@end + +void darwinInstallResizeDelegate(NativeNSWindowRef pWindow) +{ + [[UIResizeProxy sharedResizeProxy] addWindow:pWindow]; +} + +void darwinUninstallResizeDelegate(NativeNSWindowRef pWindow) +{ + [[UIResizeProxy sharedResizeProxy] removeWindow:pWindow]; +} + diff --git a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.cpp b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.cpp index 8a9026642..4bec56f38 100644 --- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.cpp +++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.cpp @@ -141,6 +141,16 @@ void darwinMinaturizeWindow(QWidget *pWidget) return ::darwinMinaturizeWindow(::darwinToNativeWindow(pWidget)); } +void darwinInstallResizeDelegate(QWidget *pWidget) +{ + ::darwinInstallResizeDelegate(::darwinToNativeWindow(pWidget)); +} + +void darwinUninstallResizeDelegate(QWidget *pWidget) +{ + ::darwinUninstallResizeDelegate(::darwinToNativeWindow(pWidget)); +} + bool darwinOpenFile(const QString& strFile) { return ::darwinOpenFile(darwinToNativeString(strFile.toUtf8().constData())); @@ -341,6 +351,155 @@ void darwinUnregisterForUnifiedToolbarContextMenuEvents(QMainWindow *pWindow) UICocoaApplication::instance()->unregisterForNativeEvents(RT_BIT_32(3) /* NSRightMouseDown */, ::darwinUnifiedToolbarEvents, pWindow); } +void darwinMouseGrab(QWidget *pWidget) +{ + CGAssociateMouseAndMouseCursorPosition(false); + UICocoaApplication::instance()->registerForNativeEvents(RT_BIT_32(1) | /* NSLeftMouseDown */ + RT_BIT_32(2) | /* NSLeftMouseUp */ + RT_BIT_32(3) | /* NSRightMouseDown */ + RT_BIT_32(4) | /* NSRightMouseUp */ + RT_BIT_32(5) | /* NSMouseMoved */ + RT_BIT_32(6) | /* NSLeftMouseDragged */ + RT_BIT_32(7) | /* NSRightMouseDragged */ + RT_BIT_32(25) | /* NSOtherMouseDown */ + RT_BIT_32(26) | /* NSOtherMouseUp */ + RT_BIT_32(27) | /* NSOtherMouseDragged */ + RT_BIT_32(22), /* NSScrollWheel */ + ::darwinMouseGrabEvents, pWidget); +} + +void darwinMouseRelease(QWidget *pWidget) +{ + UICocoaApplication::instance()->unregisterForNativeEvents(RT_BIT_32(1) | /* NSLeftMouseDown */ + RT_BIT_32(2) | /* NSLeftMouseUp */ + RT_BIT_32(3) | /* NSRightMouseDown */ + RT_BIT_32(4) | /* NSRightMouseUp */ + RT_BIT_32(5) | /* NSMouseMoved */ + RT_BIT_32(6) | /* NSLeftMouseDragged */ + RT_BIT_32(7) | /* NSRightMouseDragged */ + RT_BIT_32(25) | /* NSOtherMouseDown */ + RT_BIT_32(26) | /* NSOtherMouseUp */ + RT_BIT_32(27) | /* NSOtherMouseDragged */ + RT_BIT_32(22), /* NSScrollWheel */ + ::darwinMouseGrabEvents, pWidget); + CGAssociateMouseAndMouseCursorPosition(true); +} + +void darwinSendMouseGrabEvents(QWidget *pWidget, int type, int button, int buttons, int x, int y) +{ + QEvent::Type qtType = QEvent::None; + Qt::MouseButtons qtButtons = Qt::NoButton; + Qt::MouseButton qtButton = Qt::NoButton; + Qt::MouseButton qtExtraButton = Qt::NoButton; + Qt::Orientation qtOrientation = Qt::Horizontal; + int wheelDelta = 0; + /* Which button is used in the NSOtherMouse... cases? */ + if (button == 0) + qtExtraButton = Qt::LeftButton; + else if (button == 1) + qtExtraButton = Qt::RightButton; + else if (button == 2) + qtExtraButton = Qt::MidButton; + else if (button == 3) + qtExtraButton = Qt::XButton1; + else if (button == 4) + qtExtraButton = Qt::XButton2; + /* Map the NSEvent to a QEvent and define the Qt::Buttons when necessary. */ + switch(type) + { + case 1: /* NSLeftMouseDown */ + { + qtType = QEvent::MouseButtonPress; + qtButton = Qt::LeftButton; + break; + } + case 2: /* NSLeftMouseUp */ + { + qtType = QEvent::MouseButtonRelease; + qtButton = Qt::LeftButton; + break; + } + case 3: /* NSRightMouseDown */ + { + qtType = QEvent::MouseButtonPress; + qtButton = Qt::RightButton; + break; + } + case 4: /* NSRightMouseUp */ + { + qtType = QEvent::MouseButtonRelease; + qtButton = Qt::RightButton; + break; + } + case 5: /* NSMouseMoved */ + { + qtType = QEvent::MouseMove; + break; + } + case 6: /* NSLeftMouseDragged */ + { + qtType = QEvent::MouseMove; + qtButton = Qt::LeftButton; + break; + } + case 7: /* NSRightMouseDragged */ + { + qtType = QEvent::MouseMove; + qtButton = Qt::RightButton; + break; + } + case 22: /* NSScrollWheel */ + { + qtType = QEvent::Wheel; + if (y != 0) + { + wheelDelta = y; + qtOrientation = Qt::Vertical; + } + else if (x != 0) + { + wheelDelta = x; + qtOrientation = Qt::Horizontal; + } + x = y = 0; + break; + } + case 25: /* NSOtherMouseDown */ + { + qtType = QEvent::MouseButtonPress; + qtButton = qtExtraButton; + break; + } + case 26: /* NSOtherMouseUp */ + { + qtType = QEvent::MouseButtonRelease; + qtButton = qtExtraButton; + break; + } + case 27: /* NSOtherMouseDragged */ + { + qtType = QEvent::MouseMove; + qtButton = qtExtraButton; + break; + } + default: return; + } + /* Create a Qt::MouseButtons Mask. */ + if ((buttons & RT_BIT_32(0)) == RT_BIT_32(0)) + qtButtons |= Qt::LeftButton; + if ((buttons & RT_BIT_32(1)) == RT_BIT_32(1)) + qtButtons |= Qt::RightButton; + if ((buttons & RT_BIT_32(2)) == RT_BIT_32(2)) + qtButtons |= Qt::MidButton; + if ((buttons & RT_BIT_32(3)) == RT_BIT_32(3)) + qtButtons |= Qt::XButton1; + if ((buttons & RT_BIT_32(4)) == RT_BIT_32(4)) + qtButtons |= Qt::XButton2; + /* Create a new mouse delta event and send it to the widget. */ + UIGrabMouseEvent *pEvent = new UIGrabMouseEvent(qtType, qtButton, qtButtons, x, y, wheelDelta, qtOrientation); + qApp->sendEvent(pWidget, pEvent); +} + void darwinCreateContextMenuEvent(void *pvUser, int x, int y) { QWidget *pWin = static_cast<QWidget*>(pvUser); 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 85d069aa9..528c8cbef 100644 --- a/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h +++ b/src/VBox/Frontends/VirtualBox/src/platform/darwin/VBoxUtils-darwin.h @@ -84,13 +84,19 @@ float darwinSmallFontSize(); bool darwinSetFrontMostProcess(); uint64_t darwinGetCurrentProcessId(); +void darwinInstallResizeDelegate(NativeNSWindowRef pWindow); +void darwinUninstallResizeDelegate(NativeNSWindowRef pWindow); + bool darwinUnifiedToolbarEvents(const void *pvCocoaEvent, const void *pvCarbonEvent, void *pvUser); +bool darwinMouseGrabEvents(const void *pvCocoaEvent, const void *pvCarbonEvent, void *pvUser); void darwinCreateContextMenuEvent(void *pvWin, int x, int y); bool darwinIsApplicationCommand(ConstNativeNSEventRef pEvent); void darwinRetranslateAppMenu(); +void darwinSendMouseGrabEvents(QWidget *pWidget, int type, int button, int buttons, int x, int y); + QString darwinResolveAlias(const QString &strFile); RT_C_DECLS_END @@ -168,6 +174,42 @@ NativeNSImageRef darwinToNSImageRef(const QPixmap *pPixmap); NativeNSImageRef darwinToNSImageRef(const char *pczSource); #ifndef __OBJC__ + +#include <QEvent> +class UIGrabMouseEvent: public QEvent +{ +public: + enum { GrabMouseEvent = QEvent::User + 200 }; + + UIGrabMouseEvent(QEvent::Type type, Qt::MouseButton button, Qt::MouseButtons buttons, int x, int y, int wheelDelta, Qt::Orientation o) + : QEvent((QEvent::Type)GrabMouseEvent) + , m_type(type) + , m_button(button) + , m_buttons(buttons) + , m_x(x) + , m_y(y) + , m_wheelDelta(wheelDelta) + , m_orientation(o) + {} + QEvent::Type mouseEventType() const { return m_type; } + Qt::MouseButton button() const { return m_button; } + Qt::MouseButtons buttons() const { return m_buttons; } + int xDelta() const { return m_x; } + int yDelta() const { return m_y; } + int wheelDelta() const { return m_wheelDelta; } + Qt::Orientation orientation() const { return m_orientation; } + +private: + /* Private members */ + QEvent::Type m_type; + Qt::MouseButton m_button; + Qt::MouseButtons m_buttons; + int m_x; + int m_y; + int m_wheelDelta; + Qt::Orientation m_orientation; +}; + /******************************************************************************** * * Simple setter methods (Qt Wrapper) @@ -196,14 +238,19 @@ int darwinWindowToolBarHeight(QWidget *pWidget); bool darwinIsToolbarVisible(QToolBar *pToolBar); bool darwinIsWindowMaximized(QWidget *pWidget); void darwinMinaturizeWindow(QWidget *pWidget); - bool darwinOpenFile(const QString &strFile); QString darwinSystemLanguage(void); QPixmap darwinCreateDragPixmap(const QPixmap& aPixmap, const QString &aText); +void darwinInstallResizeDelegate(QWidget *pWidget); +void darwinUninstallResizeDelegate(QWidget *pWidget); + void darwinRegisterForUnifiedToolbarContextMenuEvents(QMainWindow *pWindow); void darwinUnregisterForUnifiedToolbarContextMenuEvents(QMainWindow *pWindow); + +void darwinMouseGrab(QWidget *pWidget); +void darwinMouseRelease(QWidget *pWidget); #endif /* !__OBJC__ */ #endif /* !___VBoxUtils_darwin_h */ diff --git a/src/VBox/Frontends/VirtualBox/src/platform/x11/XKeyboard-new.cpp b/src/VBox/Frontends/VirtualBox/src/platform/x11/XKeyboard-new.cpp index c42c1a4c8..cb9728efb 100644 --- a/src/VBox/Frontends/VirtualBox/src/platform/x11/XKeyboard-new.cpp +++ b/src/VBox/Frontends/VirtualBox/src/platform/x11/XKeyboard-new.cpp @@ -219,6 +219,10 @@ void doXKeyboardLogging(Display *dpy) LogRel((",%d=%d",i,keyc2scan[i])); LogRel(("\n")); } + LogRel(("Using %s for keycode to scan code conversion\n", + gfByXkbOK ? "XKB" + : gfByTypeOK ? "known keycode mapping" + : "host keyboard layout detection")); } /* @@ -227,7 +231,10 @@ void doXKeyboardLogging(Display *dpy) unsigned handleXKeyEvent(XEvent *event) { // call the WINE event handler - return X11DRV_KeyEvent(event->xkey.display, event->xkey.keycode); + unsigned key = X11DRV_KeyEvent(event->xkey.display, event->xkey.keycode); + LogRel3(("VBoxKeyboard: converting keycode %d to scancode %s0x%x\n", + event->xkey.keycode, key > 0x100 ? "0xe0 " : "", key & 0xff)); + return key; } /** diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp index c30351027..0ff8dd21d 100644 --- a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp +++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.cpp @@ -33,6 +33,7 @@ #include "UIMachineLogic.h" #include "UIMachineWindow.h" #include "UIMachineView.h" +#include "UIHotKeyEditor.h" #ifdef Q_WS_X11 # include <QX11Info> @@ -63,7 +64,7 @@ enum { KeyExtended = 0x01, KeyPressed = 0x02, KeyPause = 0x04, KeyPrint = 0x08 } enum { IsKeyPressed = 0x01, IsExtKeyPressed = 0x02, IsKbdCaptured = 0x80 }; #ifdef Q_WS_WIN -UIKeyboardHandler* UIKeyboardHandler::m_pKeyboardHandler = 0; +UIKeyboardHandler* UIKeyboardHandler::m_spKeyboardHandler = 0; #endif /* Q_WS_WIN */ /* Factory function to create keyboard-handler: */ @@ -93,7 +94,7 @@ UIKeyboardHandler* UIKeyboardHandler::create(UIMachineLogic *pMachineLogic, #ifdef Q_WS_WIN /* Its required to have static pointer to created handler * because windows keyboard-hook works only with static members: */ - m_pKeyboardHandler = pKeyboardHandler; + m_spKeyboardHandler = pKeyboardHandler; #endif /* Q_WS_WIN */ /* Return prepared keyboard-handler: */ return pKeyboardHandler; @@ -104,7 +105,7 @@ void UIKeyboardHandler::destroy(UIKeyboardHandler *pKeyboardHandler) { /* Delete keyboard-handler: */ #ifdef Q_WS_WIN - m_pKeyboardHandler = 0; + m_spKeyboardHandler = 0; #endif /* Q_WS_WIN */ delete pKeyboardHandler; } @@ -306,13 +307,20 @@ void UIKeyboardHandler::releaseAllPressedKeys(bool aReleaseHostKey /* = true */) } if (aReleaseHostKey) - m_bIsHostkeyPressed = false; + { + m_bIsHostComboPressed = false; + m_pressedHostComboKeys.clear(); + } #ifdef Q_WS_MAC + unsigned int hostComboModifierMask = 0; + QList<int> hostCombo = UIHotKeyCombination::toKeyCodeList(m_globalSettings.hostCombo()); + for (int i = 0; i < hostCombo.size(); ++i) + hostComboModifierMask |= ::DarwinKeyCodeToDarwinModifierMask(hostCombo.at(i)); /* Clear most of the modifiers: */ m_darwinKeyModifiers &= alphaLock | kEventKeyModifierNumLockMask | - (aReleaseHostKey ? 0 : ::DarwinKeyCodeToDarwinModifierMask(m_globalSettings.hostKey())); + (aReleaseHostKey ? 0 : hostComboModifierMask); #endif emit keyboardStateChanged(keyboardState()); @@ -322,7 +330,7 @@ void UIKeyboardHandler::releaseAllPressedKeys(bool aReleaseHostKey /* = true */) int UIKeyboardHandler::keyboardState() const { return (m_fIsKeyboardCaptured ? UIViewStateType_KeyboardCaptured : 0) | - (m_bIsHostkeyPressed ? UIViewStateType_HostKeyPressed : 0); + (m_bIsHostComboPressed ? UIViewStateType_HostKeyPressed : 0); } #if defined(Q_WS_WIN) @@ -367,8 +375,7 @@ bool UIKeyboardHandler::winEventFilter(MSG *pMsg, ulong uScreenId) /* Check for special Korean keys. Based on the keyboard layout selected * on the host, the scancode in lParam might be 0x71/0x72 or 0xF1/0xF2. * In either case, we must deliver 0xF1/0xF2 scancode to the guest when - * the key is pressed and nothing when it's released. - */ + * the key is pressed and nothing when it's released. */ if (scan == 0x71 || scan == 0x72) { scan |= 0x80; @@ -392,7 +399,7 @@ bool UIKeyboardHandler::winEventFilter(MSG *pMsg, ulong uScreenId) case VK_CONTROL: case VK_MENU: { - /* Overcome stupid Win32 modifier key generalization: */ + /* Overcome Win32 modifier key generalization: */ int keyscan = scan; if (flags & KeyExtended) keyscan |= 0xE000; @@ -630,11 +637,12 @@ UIKeyboardHandler::UIKeyboardHandler(UIMachineLogic *pMachineLogic) , m_iKeyboardCaptureViewIndex(-1) , m_globalSettings(vboxGlobal().settings()) , m_fIsKeyboardCaptured(false) - , m_bIsHostkeyPressed(false) - , m_bIsHostkeyAlone (false) - , m_bIsHostkeyInCapture(false) + , m_bIsHostComboPressed(false) + , m_bIsHostComboAlone(false) + , m_bIsHostComboProcessed(false) , m_fPassCAD(false) #if defined(Q_WS_WIN) + , m_bIsHostkeyInCapture(false) , m_iKeyboardHookViewIndex(-1) #elif defined(Q_WS_MAC) , m_darwinKeyModifiers(0) @@ -845,7 +853,7 @@ bool UIKeyboardHandler::eventFilter(QObject *pWatchedObject, QEvent *pEvent) { QKeyEvent *pKeyEvent = static_cast<QKeyEvent*>(pEvent); - if (m_bIsHostkeyPressed && pEvent->type() == QEvent::KeyPress) + if (m_bIsHostComboPressed && pEvent->type() == QEvent::KeyPress) { /* Passing F1-F12 keys to the guest: */ if (pKeyEvent->key() >= Qt::Key_F1 && pKeyEvent->key() <= Qt::Key_F12) @@ -872,7 +880,7 @@ bool UIKeyboardHandler::eventFilter(QObject *pWatchedObject, QEvent *pEvent) /* Process hot keys not processed in keyEvent() (as in case of non-alphanumeric keys): */ machineLogic()->actionsPool()->processHotKey(QKeySequence(pKeyEvent->key())); } - else if (!m_bIsHostkeyPressed && pEvent->type() == QEvent::KeyRelease) + else if (!m_bIsHostComboPressed && pEvent->type() == QEvent::KeyRelease) { /* Show a possible warning on key release which seems to be more expected by the end user: */ if (uisession()->isPaused()) @@ -898,7 +906,7 @@ bool UIKeyboardHandler::eventFilter(QObject *pWatchedObject, QEvent *pEvent) LRESULT CALLBACK UIKeyboardHandler::lowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { - if (nCode == HC_ACTION && m_pKeyboardHandler && m_pKeyboardHandler->winLowKeyboardEvent(wParam, *(KBDLLHOOKSTRUCT*)lParam)) + if (nCode == HC_ACTION && m_spKeyboardHandler && m_spKeyboardHandler->winLowKeyboardEvent(wParam, *(KBDLLHOOKSTRUCT*)lParam)) return 1; return CallNextHookEx(NULL, nCode, wParam, lParam); @@ -910,6 +918,9 @@ bool UIKeyboardHandler::winLowKeyboardEvent(UINT msg, const KBDLLHOOKSTRUCT &eve if (!m_views.contains(m_iKeyboardHookViewIndex)) return false; + if (!m_fIsKeyboardCaptured) + return false; + /* Sometimes it happens that Win inserts additional events on some key * press/release. For example, it prepends ALT_GR in German layout with * the VK_LCONTROL vkey with curious 0x21D scan code (seems to be necessary @@ -928,16 +939,13 @@ bool UIKeyboardHandler::winLowKeyboardEvent(UINT msg, const KBDLLHOOKSTRUCT &eve return true; } - if (!m_fIsKeyboardCaptured) - return false; - /* It's possible that a key has been pressed while the keyboard was not * captured, but is being released under the capture. Detect this situation * and return false to let Windows process the message normally and update * its key state table (to avoid the stuck key effect). */ uint8_t what_pressed = (event.flags & 0x01) && (event.vkCode != VK_RSHIFT) ? IsExtKeyPressed : IsKeyPressed; if ((event.flags & 0x80) /* released */ && - ((event.vkCode == m_globalSettings.hostKey() && !m_bIsHostkeyInCapture) || + ((UIHotKeyCombination::toKeyCodeList(m_globalSettings.hostCombo()).contains(event.vkCode) && !m_bIsHostkeyInCapture) || (m_pressedKeys[event.scanCode] & (IsKbdCaptured | what_pressed)) == what_pressed)) return false; @@ -966,7 +974,7 @@ void UIKeyboardHandler::darwinGrabKeyboardEvents(bool fGrab) { /* Disable mouse and keyboard event compression/delaying to make sure we *really* get all of the events. */ ::CGSetLocalEventsSuppressionInterval(0.0); - machineLogic()->mouseHandler()->setMouseCoalescingEnabled(false); + ::darwinSetMouseCoalescingEnabled(false); /* Register the event callback/hook and grab the keyboard. */ UICocoaApplication::instance()->registerForNativeEvents(RT_BIT_32(10) | RT_BIT_32(11) | RT_BIT_32(12) /* NSKeyDown | NSKeyUp | | NSFlagsChanged */, @@ -1101,177 +1109,209 @@ bool UIKeyboardHandler::darwinKeyboardEvent(const void *pvCocoaEvent, EventRef i #endif -bool UIKeyboardHandler::keyEvent(int iKey, uint8_t uScan, int fFlags, ulong uScreenId, wchar_t *pUniKey /* = NULL */) +bool UIKeyboardHandler::keyEvent(int iKey, uint8_t uScan, int fFlags, ulong uScreenId, wchar_t *pUniKey /* = 0 */) { - const bool isHostKey = iKey == m_globalSettings.hostKey(); + /* Get host-combo key list: */ + QSet<int> allHostComboKeys = UIHotKeyCombination::toKeyCodeList(m_globalSettings.hostCombo()).toSet(); - LONG buf[16]; - LONG *codes = buf; - uint count = 0; - uint8_t whatPressed = 0; + /* Update the map of pressed host-combo keys: */ + if (allHostComboKeys.contains(iKey)) + { + if (fFlags & KeyPressed) + { + if (!m_pressedHostComboKeys.contains(iKey)) + m_pressedHostComboKeys.insert(iKey, uScan); + else if (m_bIsHostComboPressed) + return true; + } + else + { + if (m_pressedHostComboKeys.contains(iKey)) + m_pressedHostComboKeys.remove(iKey); + } + } + /* Check if we are currently holding FULL host-combo: */ + bool fIsFullHostComboPresent = allHostComboKeys == m_pressedHostComboKeys.keys().toSet(); + /* Check if currently pressed/released key had changed host-combo state: */ + const bool isHostComboStateChanged = (!m_bIsHostComboPressed && fIsFullHostComboPresent) || + ( m_bIsHostComboPressed && !fIsFullHostComboPresent); - if (!isHostKey && !m_bIsHostkeyPressed) +#ifdef Q_WS_WIN + if (m_bIsHostComboPressed || isHostComboStateChanged) { + /* Currently this is used in winLowKeyboardEvent() only: */ + m_bIsHostkeyInCapture = m_fIsKeyboardCaptured; + } +#endif /* Q_WS_WIN */ + + /* Check if it's C-A-D and GUI/PassCAD is not true: */ + if (!m_fPassCAD && + uScan == 0x53 /* Del */ && + ((m_pressedKeys[0x38] & IsKeyPressed) /* Alt */ || + (m_pressedKeys[0x38] & IsExtKeyPressed)) && + ((m_pressedKeys[0x1d] & IsKeyPressed) /* Ctrl */ || + (m_pressedKeys[0x1d] & IsExtKeyPressed))) + { + /* Use the C-A-D combination as a last resort to get the keyboard and mouse back + * to the host when the user forgets the Host Key. Note that it's always possible + * to send C-A-D to the guest using the Host+Del combination: */ + if (uisession()->isRunning() && m_fIsKeyboardCaptured) + { + releaseKeyboard(); + if (!uisession()->isMouseSupportsAbsolute() || !uisession()->isMouseIntegrated()) + machineLogic()->mouseHandler()->releaseMouse(); + } + return true; + } + + /* Preparing the press/release scan-codes array for sending to the guest: + * 1. if host-combo is NOT pressed, taking into account currently pressed key too, + * 2. if currently released key releases host-combo too. + * Using that rule, we are NOT sending to the guest: + * 1. the last key-press of host-combo, + * 2. all keys pressed while the host-combo being held. */ + LONG aCodesBuffer[16]; + LONG *pCodes = aCodesBuffer; + uint uCodesCount = 0; + if ((!m_bIsHostComboPressed && !isHostComboStateChanged) || + ( m_bIsHostComboPressed && isHostComboStateChanged)) + { + /* Special flags handling (KeyPrint): */ if (fFlags & KeyPrint) { - static LONG PrintMake[] = { 0xE0, 0x2A, 0xE0, 0x37 }; - static LONG PrintBreak[] = { 0xE0, 0xB7, 0xE0, 0xAA }; if (fFlags & KeyPressed) { - codes = PrintMake; - count = SIZEOF_ARRAY(PrintMake); + static LONG PrintMake[] = { 0xE0, 0x2A, 0xE0, 0x37 }; + pCodes = PrintMake; + uCodesCount = SIZEOF_ARRAY(PrintMake); } else { - codes = PrintBreak; - count = SIZEOF_ARRAY(PrintBreak); + static LONG PrintBreak[] = { 0xE0, 0xB7, 0xE0, 0xAA }; + pCodes = PrintBreak; + uCodesCount = SIZEOF_ARRAY(PrintBreak); } } + /* Special flags handling (KeyPause): */ else if (fFlags & KeyPause) { if (fFlags & KeyPressed) { static LONG Pause[] = { 0xE1, 0x1D, 0x45, 0xE1, 0x9D, 0xC5 }; - codes = Pause; - count = SIZEOF_ARRAY(Pause); + pCodes = Pause; + uCodesCount = SIZEOF_ARRAY(Pause); } else { - /* Pause shall not produce a break code */ + /* Pause shall not produce a break code: */ return true; } } + /* Common flags handling: */ else { - if (fFlags & KeyPressed) - { - /* Check if the guest has the same view on the modifier keys (NumLock, - * CapsLock, ScrollLock) as the X server. If not, send KeyPress events - * to synchronize the state. */ - fixModifierState(codes, &count); - } + /* Get the type of key - simple or extended: */ + uint8_t uWhatPressed = fFlags & KeyExtended ? IsExtKeyPressed : IsKeyPressed; - /* Check if it's C-A-D and GUI/PassCAD is not true */ - if (!m_fPassCAD && - uScan == 0x53 /* Del */ && - ((m_pressedKeys[0x38] & IsKeyPressed) /* Alt */ || - (m_pressedKeys[0x38] & IsExtKeyPressed)) && - ((m_pressedKeys[0x1d] & IsKeyPressed) /* Ctrl */ || - (m_pressedKeys[0x1d] & IsExtKeyPressed))) + /* If some key was pressed or some previously pressed key was released => + * we are updating the list of pressed keys and preparing scancodes: */ + if ((fFlags & KeyPressed) || (m_pressedKeys[uScan] & uWhatPressed)) { - /* Use the C-A-D combination as a last resort to get the - * keyboard and mouse back to the host when the user forgets - * the Host Key. Note that it's always possible to send C-A-D - * to the guest using the Host+Del combination. BTW, it would - * be preferable to completely ignore C-A-D in guests, but - * that's not possible because we cannot predict what other - * keys will be pressed next when one of C, A, D is held. */ - if (uisession()->isRunning() && m_fIsKeyboardCaptured) + /* Check if the guest has the same view on the modifier keys + * (NumLock, CapsLock, ScrollLock) as the X server. + * If not, send KeyPress events to synchronize the state: */ + if (fFlags & KeyPressed) + fixModifierState(pCodes, &uCodesCount); + + /* Prepend 'extended' scancode if needed: */ + if (fFlags & KeyExtended) + pCodes[uCodesCount++] = 0xE0; + + /* Process key-press: */ + if (fFlags & KeyPressed) { - releaseKeyboard(); - if (!uisession()->isMouseSupportsAbsolute() || !uisession()->isMouseIntegrated()) - machineLogic()->mouseHandler()->releaseMouse(); + /* Append scancode: */ + pCodes[uCodesCount++] = uScan; + m_pressedKeys[uScan] |= uWhatPressed; + } + /* Process key-release if that key was pressed before: */ + else if (m_pressedKeys[uScan] & uWhatPressed) + { + /* Append scancode: */ + pCodes[uCodesCount++] = uScan | 0x80; + m_pressedKeys[uScan] &= ~uWhatPressed; } - return true; - } - - /* Process the scancode and update the table of pressed keys: */ - whatPressed = IsKeyPressed; - - if (fFlags & KeyExtended) - { - codes[count++] = 0xE0; - whatPressed = IsExtKeyPressed; - } - if (fFlags & KeyPressed) - { - codes[count++] = uScan; - m_pressedKeys[uScan] |= whatPressed; - } - else - { - /* If we haven't got this key's press message, we ignore its release: */ - if (!(m_pressedKeys[uScan] & whatPressed)) - return true; - codes[count++] = uScan | 0x80; - m_pressedKeys[uScan] &= ~whatPressed; + /* Update keyboard-captured flag: */ + if (m_fIsKeyboardCaptured) + m_pressedKeys[uScan] |= IsKbdCaptured; + else + m_pressedKeys[uScan] &= ~IsKbdCaptured; } - - if (m_fIsKeyboardCaptured) - m_pressedKeys[uScan] |= IsKbdCaptured; - else - m_pressedKeys[uScan] &= ~IsKbdCaptured; + /* Ignore key-release if that key was NOT pressed before, + * but only if thats not one of the host-combination keys: */ + else if (!allHostComboKeys.contains(iKey)) + return true; } } - else - { - /* Currently this is used in winLowKeyboardEvent() only: */ - m_bIsHostkeyInCapture = m_fIsKeyboardCaptured; - } - - bool emitSignal = false; - int hotkey = 0; - /* Process the host key: */ + /* Process the host-combo funtionality: */ if (fFlags & KeyPressed) { - if (isHostKey) + if (isHostComboStateChanged) { - if (!m_bIsHostkeyPressed) + if (!m_bIsHostComboPressed) { - m_bIsHostkeyPressed = m_bIsHostkeyAlone = true; + m_bIsHostComboPressed = true; + m_bIsHostComboAlone = true; + m_bIsHostComboProcessed = false; if (uisession()->isRunning()) saveKeyStates(); - emitSignal = true; } } else { - if (m_bIsHostkeyPressed) + if (m_bIsHostComboPressed) { - if (m_bIsHostkeyAlone) + if (m_bIsHostComboAlone) { - hotkey = iKey; - m_bIsHostkeyAlone = false; + m_bIsHostComboAlone = false; + m_bIsHostComboProcessed = true; + /* Process Host+<key> shortcuts. + * Currently, <key> is limited to alphanumeric chars. + * Other Host+<key> combinations are handled in Qt event(): */ + return processHotKey(iKey, pUniKey); } } } } else { - if (isHostKey) + if (isHostComboStateChanged) { - if (m_bIsHostkeyPressed) + if (m_bIsHostComboPressed) { - m_bIsHostkeyPressed = false; - - if (m_bIsHostkeyAlone) + m_bIsHostComboPressed = false; + /* Capturing/releasing keyboard/mouse if necessary: */ + if (m_bIsHostComboAlone && !m_bIsHostComboProcessed) { - if (uisession()->isPaused()) - { - vboxProblem().remindAboutPausedVMInput(); - } - else if (uisession()->isRunning()) + if (uisession()->isRunning()) { bool ok = true; if (!m_fIsKeyboardCaptured) { - /* Temporarily disable auto capture that will take - * place after this dialog is dismissed because - * the capture state is to be defined by the - * dialog result itself */ + /* Temporarily disable auto-capture that will take place after + * this dialog is dismissed because the capture state is to be + * defined by the dialog result itself: */ uisession()->setAutoCaptureDisabled(true); - bool autoConfirmed = false; - ok = vboxProblem().confirmInputCapture(&autoConfirmed); - if (autoConfirmed) + bool fIsAutoConfirmed = false; + ok = vboxProblem().confirmInputCapture(&fIsAutoConfirmed); + if (fIsAutoConfirmed) uisession()->setAutoCaptureDisabled(false); - /* Otherwise, the disable flag will be reset in - * the next console view's focus in event (since - * may happen asynchronously on some platforms, - * after we return from this code) */ + /* Otherwise, the disable flag will be reset in the next + * machine-view's focus-in event (since may happen asynchronously + * on some platforms, after we return from this code): */ } - if (ok) { if (m_fIsKeyboardCaptured) @@ -1283,9 +1323,9 @@ bool UIKeyboardHandler::keyEvent(int iKey, uint8_t uScan, int fFlags, ulong uScr #ifdef Q_WS_X11 /* Make sure that pending FocusOut events from the * previous message box are handled, otherwise the - * mouse is immediately ungrabbed. */ + * mouse is immediately ungrabbed: */ qApp->processEvents(); -#endif +#endif /* Q_WS_X11 */ if (m_fIsKeyboardCaptured) machineLogic()->mouseHandler()->captureMouse(uScreenId); else @@ -1294,97 +1334,114 @@ bool UIKeyboardHandler::keyEvent(int iKey, uint8_t uScan, int fFlags, ulong uScr } } } - if (uisession()->isRunning()) sendChangedKeyStates(); - - emitSignal = true; } } else { - if (m_bIsHostkeyPressed) - m_bIsHostkeyAlone = false; + if (m_bIsHostComboPressed) + m_bIsHostComboAlone = true; } } /* Notify all listeners: */ emit keyboardStateChanged(keyboardState()); - /* Process Host+<key> shortcuts. currently, <key> is limited to - * alphanumeric chars. Other Host+<key> combinations are handled in - * event(). */ - if (hotkey) + /* If the VM is NOT paused: */ + if (!uisession()->isPaused()) { - bool processed = false; -#if defined (Q_WS_WIN) - NOREF(pUniKey); - int n = GetKeyboardLayoutList(0, NULL); - Assert(n); - HKL *list = new HKL[n]; - GetKeyboardLayoutList(n, list); - for (int i = 0; i < n && !processed; i++) + /* Get the VM keyboard: */ + CKeyboard keyboard = session().GetConsole().GetKeyboard(); + Assert(!keyboard.isNull()); + + /* If there are scan-codes to send: */ + if (uCodesCount) { - wchar_t ch; - static BYTE keys[256] = {0}; - if (!ToUnicodeEx(hotkey, 0, keys, &ch, 1, 0, list[i]) == 1) - ch = 0; - if (ch) - processed = machineLogic()->actionsPool()->processHotKey(QKeySequence((Qt::UNICODE_ACCEL + QChar(ch).toUpper().unicode()))); + /* Send prepared scan-codes to the guest: */ + std::vector<LONG> scancodes(pCodes, &pCodes[uCodesCount]); + keyboard.PutScancodes(QVector<LONG>::fromStdVector(scancodes)); } - delete[] list; -#elif defined (Q_WS_X11) - NOREF(pUniKey); - Display *display = QX11Info::display(); - int keysyms_per_keycode = getKeysymsPerKeycode(); - KeyCode kc = XKeysymToKeycode (display, iKey); - for (int i = 0; i < keysyms_per_keycode && !processed; i += 2) + + /* If full host-key sequence was just finalized: */ + if (isHostComboStateChanged && m_bIsHostComboPressed) { - KeySym ks = XKeycodeToKeysym(display, kc, i); - char ch = 0; - if (!XkbTranslateKeySym(display, &ks, 0, &ch, 1, NULL) == 1) - ch = 0; - if (ch) + /* We have to make guest to release pressed keys from the host-combination: */ + QList<uint8_t> hostComboScans = m_pressedHostComboKeys.values(); + for (int i = 0 ; i < hostComboScans.size(); ++i) { - QChar c = QString::fromLocal8Bit(&ch, 1)[0]; - processed = machineLogic()->actionsPool()->processHotKey(QKeySequence((Qt::UNICODE_ACCEL + QChar(c).toUpper().unicode()))); + uint8_t uScan = hostComboScans[i]; + if (m_pressedKeys[uScan] & IsKeyPressed) + { + keyboard.PutScancode(uScan | 0x80); + } + else if (m_pressedKeys[uScan] & IsExtKeyPressed) + { + QVector<LONG> scancodes(2); + scancodes[0] = 0xE0; + scancodes[1] = uScan | 0x80; + keyboard.PutScancodes(scancodes); + } + m_pressedKeys[uScan] = 0; } } -#elif defined (Q_WS_MAC) - if (pUniKey && pUniKey[0] && !pUniKey[1]) - processed = machineLogic()->actionsPool()->processHotKey(QKeySequence(Qt::UNICODE_ACCEL + QChar(pUniKey[0]).toUpper().unicode())); - - /* Don't consider the hot key as pressed since the guest never saw - * it. (probably a generic thing) */ - m_pressedKeys[uScan] &= ~whatPressed; -#endif - /* Grab the key from Qt if processed, or pass it to Qt otherwise - * in order to process non-alphanumeric keys in event(), after they are - * converted to Qt virtual keys. */ - return processed; } - /* No more to do, if the host key is in action or the VM is paused: */ - if (m_bIsHostkeyPressed || isHostKey || uisession()->isPaused()) - { - /* Grab the key from Qt and from VM if it's a host key, - * otherwise just pass it to Qt */ - return isHostKey; - } + /* Prevent the key from going to Qt: */ + return true; +} - CKeyboard keyboard = session().GetConsole().GetKeyboard(); - Assert(!keyboard.isNull()); +bool UIKeyboardHandler::processHotKey(int iHotKey, wchar_t *pHotKey) +{ + /* Prepare processing result: */ + bool fWasProcessed = false; #ifdef Q_WS_WIN - /* Send pending WM_PAINT events: */ - ::UpdateWindow(m_views[uScreenId]->viewport()->winId()); + Q_UNUSED(pHotKey); + int iKeyboardLayout = GetKeyboardLayoutList(0, NULL); + Assert(iKeyboardLayout); + HKL *pList = new HKL[iKeyboardLayout]; + GetKeyboardLayoutList(iKeyboardLayout, pList); + for (int i = 0; i < iKeyboardLayout && !fWasProcessed; ++i) + { + wchar_t symbol; + static BYTE keys[256] = {0}; + if (!ToUnicodeEx(iHotKey, 0, keys, &symbol, 1, 0, pList[i]) == 1) + symbol = 0; + if (symbol) + fWasProcessed = machineLogic()->actionsPool()->processHotKey(QKeySequence((Qt::UNICODE_ACCEL + QChar(symbol).toUpper().unicode()))); + } + delete[] pList; #endif /* Q_WS_WIN */ - std::vector <LONG> scancodes(codes, &codes[count]); - keyboard.PutScancodes(QVector<LONG>::fromStdVector(scancodes)); +#ifdef Q_WS_X11 + Q_UNUSED(pHotKey); + Display *pDisplay = QX11Info::display(); + int iKeysymsPerKeycode = getKeysymsPerKeycode(); + KeyCode keyCode = XKeysymToKeycode(pDisplay, iHotKey); + for (int i = 0; i < iKeysymsPerKeycode && !fWasProcessed; i += 2) + { + KeySym ks = XKeycodeToKeysym(pDisplay, keyCode, i); + char symbol = 0; + if (!XkbTranslateKeySym(pDisplay, &ks, 0, &symbol, 1, NULL) == 1) + symbol = 0; + if (symbol) + { + QChar qtSymbol = QString::fromLocal8Bit(&symbol, 1)[0]; + fWasProcessed = machineLogic()->actionsPool()->processHotKey(QKeySequence((Qt::UNICODE_ACCEL + qtSymbol.toUpper().unicode()))); + } + } +#endif /* Q_WS_X11 */ - /* Grab the key from Qt: */ - return true; +#ifdef Q_WS_MAC + Q_UNUSED(iHotKey); + if (pHotKey && pHotKey[0] && !pHotKey[1]) + fWasProcessed = machineLogic()->actionsPool()->processHotKey(QKeySequence(Qt::UNICODE_ACCEL + QChar(pHotKey[0]).toUpper().unicode())); +#endif /* Q_WS_MAC */ + + /* Grab the key from the Qt if it was processed, or pass it to the Qt otherwise + * in order to process non-alphanumeric keys in event(), after they are converted to Qt virtual keys: */ + return fWasProcessed; } void UIKeyboardHandler::fixModifierState(LONG *piCodes, uint *puCount) diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h index f711f8279..53fddf542 100644 --- a/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h +++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIKeyboardHandler.h @@ -70,9 +70,9 @@ public: int keyboardState() const; /* Some getters required by side-code: */ - bool isHostKeyPressed() const { return m_bIsHostkeyPressed; } + bool isHostKeyPressed() const { return m_bIsHostComboPressed; } #ifdef Q_WS_MAC - bool isHostKeyAlone() const { return m_bIsHostkeyAlone; } + bool isHostKeyAlone() const { return m_bIsHostComboAlone; } bool isKeyboardGrabbed() const { return m_fKeyboardGrabbed; } #endif /* Q_WS_MAC */ @@ -125,6 +125,7 @@ protected: /* Separate function to handle most of existing keyboard-events: */ bool keyEvent(int iKey, uint8_t uScan, int fFlags, ulong uScreenId, wchar_t *pUniKey = 0); + bool processHotKey(int iHotKey, wchar_t *pUniKey); /* Private helpers: */ void fixModifierState(LONG *piCodes, uint *puCount); @@ -149,15 +150,19 @@ protected: uint8_t m_pressedKeys[128]; uint8_t m_pressedKeysCopy[128]; + QMap<int, uint8_t> m_pressedHostComboKeys; + bool m_fIsKeyboardCaptured : 1; - bool m_bIsHostkeyPressed : 1; - bool m_bIsHostkeyAlone : 1; - bool m_bIsHostkeyInCapture : 1; + bool m_bIsHostComboPressed : 1; + bool m_bIsHostComboAlone : 1; + bool m_bIsHostComboProcessed : 1; bool m_fPassCAD : 1; #if defined(Q_WS_WIN) + /* Currently this is used in winLowKeyboardEvent() only: */ + bool m_bIsHostkeyInCapture; /* Keyboard hook required to capture keyboard event under windows. */ - static UIKeyboardHandler *m_pKeyboardHandler; + static UIKeyboardHandler *m_spKeyboardHandler; HHOOK m_keyboardHook; int m_iKeyboardHookViewIndex; #elif defined(Q_WS_MAC) diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineShortcuts.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineShortcuts.cpp index 199f6db60..459d0be81 100644 --- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineShortcuts.cpp +++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineShortcuts.cpp @@ -52,7 +52,7 @@ UIMachineShortcuts::UIMachineShortcuts() m_Shortcuts[CommandLineWindowShortcut] = UIKeySequence("CommandLineWindow"); m_Shortcuts[LoggingShortcut] = UIKeySequence("Logging"); #endif /* VBOX_WITH_DEBUGGER_GUI */ - m_Shortcuts[HelpShortcut] = UIKeySequence("Help", QKeySequence::HelpContents); + m_Shortcuts[HelpShortcut] = UIKeySequence("Help"); m_Shortcuts[WebShortcut] = UIKeySequence("Web"); m_Shortcuts[ResetWarningsShortcut] = UIKeySequence("ResetWarnings"); #ifdef VBOX_WITH_REGISTRATION diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp index b158c21e6..e72c70f99 100644 --- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp +++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMachineWindow.cpp @@ -145,11 +145,7 @@ void UIMachineWindow::setMask(const QRegion ®ion) void UIMachineWindow::retranslateUi() { -#ifdef VBOX_OSE - m_strWindowTitlePrefix = UIMachineLogic::tr("VirtualBox OSE"); -#else m_strWindowTitlePrefix = VBOX_PRODUCT; -#endif #ifdef VBOX_BLEEDING_EDGE m_strWindowTitlePrefix += UIMachineLogic::tr(" EXPERIMENTAL build %1r%2 - %3") .arg(RTBldCfgVersion()) diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp index 7283ce4fc..c0ea8aa4f 100644 --- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp +++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.cpp @@ -173,11 +173,8 @@ void UIMouseHandler::captureMouse(ulong uScreenId) /* Update mouse clipping: */ updateMouseCursorClipping(); #elif defined (Q_WS_MAC) - /* Move the mouse to the center of the visible area: */ - m_lastMousePos = visibleRectangle.center(); - QCursor::setPos(m_lastMousePos); /* Grab all mouse events: */ - m_viewports[m_iMouseCaptureViewIndex]->grabMouse(); + ::darwinMouseGrab(m_viewports[m_iMouseCaptureViewIndex]); #else /* Q_WS_MAC */ /* Remember current mouse position: */ m_lastMousePos = QCursor::pos(); @@ -211,10 +208,13 @@ void UIMouseHandler::releaseMouse() #ifdef Q_WS_WIN /* Update mouse clipping: */ updateMouseCursorClipping(); -#else /* Q_WS_WIN */ +#elif defined(Q_WS_MAC) + /* Releasing grabbed mouse from that view: */ + ::darwinMouseRelease(m_viewports[m_iMouseCaptureViewIndex]); +#else /* Q_WS_MAC */ /* Releasing grabbed mouse from that view: */ m_viewports[m_iMouseCaptureViewIndex]->releaseMouse(); -#endif /* !Q_WS_WIN */ +#endif /* !Q_WS_MAC */ /* Reset mouse-capture index: */ m_iMouseCaptureViewIndex = -1; @@ -245,17 +245,6 @@ int UIMouseHandler::mouseState() const (uisession()->isMouseIntegrated() ? 0 : UIMouseStateType_MouseAbsoluteDisabled); } -#ifdef Q_WS_MAC -void UIMouseHandler::setMouseCoalescingEnabled(bool fOn) -{ - /* Enable mouse event compression if we leave the VM view. - * This is necessary for having smooth resizing of the VM/other windows. - * Disable mouse event compression if we enter the VM view. - * So all mouse events are registered in the VM. */ - ::darwinSetMouseCoalescingEnabled(fOn); -} -#endif /* Q_WS_MAC */ - #ifdef Q_WS_X11 bool UIMouseHandler::x11EventFilter(XEvent *pEvent, ulong /* uScreenId */) { @@ -368,9 +357,10 @@ void UIMouseHandler::sltMousePointerShapeChanged() /* First of all, we should check if the host pointer should be visible. * We should hide host pointer in case of: * 1. mouse is 'captured' or - * 2. mouse is 'not captured', 'integrated', 'absolute', host pointer is hidden by the guest. */ + * 2. machine is NOT 'paused' and mouse is NOT 'captured' and 'integrated' and 'absolute' but host pointer is 'hidden' by the guest. */ if (uisession()->isMouseCaptured() || - (uisession()->isMouseIntegrated() && + (!uisession()->isPaused() && + uisession()->isMouseIntegrated() && uisession()->isMouseSupportsAbsolute() && uisession()->isHidingHostPointer())) { @@ -382,7 +372,7 @@ void UIMouseHandler::sltMousePointerShapeChanged() else /* Otherwise we should show host pointer with guest shape assigned to it if: - * machine is NOT 'paused', mouse is 'integrated', 'absolute', valid pointer shape is present. */ + * machine is NOT 'paused', mouse is 'integrated' and 'absolute' and valid pointer shape is present. */ if (!uisession()->isPaused() && uisession()->isMouseIntegrated() && uisession()->isMouseSupportsAbsolute() && @@ -397,8 +387,8 @@ void UIMouseHandler::sltMousePointerShapeChanged() /* There could be other states covering such situations as: * 1. machine is 'paused' or - * 2. mouse is 'not captured', 'integrated', 'not absolute' or - * 3. mouse is 'not captured', 'not integrated', 'absolute'. + * 2. mouse is NOT 'captured' and 'integrated' but NOT 'absolute' or + * 3. mouse is NOT 'captured' and 'absolute' but NOT 'integrated'. * We have nothing to do with that except just unset the cursor. */ { QList<ulong> screenIds = m_viewports.keys(); @@ -512,6 +502,20 @@ bool UIMouseHandler::eventFilter(QObject *pWatched, QEvent *pEvent) /* Handle viewport events: */ switch (pEvent->type()) { +#ifdef Q_WS_MAC + case UIGrabMouseEvent::GrabMouseEvent: + { + UIGrabMouseEvent *pDeltaEvent = static_cast<UIGrabMouseEvent*>(pEvent); + QPoint p = QPoint(pDeltaEvent->xDelta() + m_lastMousePos.x(), + pDeltaEvent->yDelta() + m_lastMousePos.y()); + if (mouseEvent(pDeltaEvent->mouseEventType(), uScreenId, + m_viewports[uScreenId]->mapFromGlobal(p), p, + pDeltaEvent->buttons(), + pDeltaEvent->wheelDelta(), pDeltaEvent->orientation())) + return true; + break; + } +#endif /* Q_WS_MAC */ case QEvent::MouseMove: case QEvent::MouseButtonRelease: { @@ -537,6 +541,14 @@ bool UIMouseHandler::eventFilter(QObject *pWatched, QEvent *pEvent) return true; } +#ifdef Q_WS_X11 + /* Make sure that we are focused after a click. Rather + * ugly, but works around a problem with GNOME + * screensaver, which sometimes removes our input focus + * and gives us no way to get it back. */ + if (pEvent->type() == QEvent::MouseButtonRelease) + pWatchedWidget->window()->activateWindow(); +#endif /* Q_WS_X11 */ /* Check if we should activate window under cursor: */ if (!uisession()->isMouseCaptured() && QApplication::activeWindow() && @@ -598,7 +610,7 @@ bool UIMouseHandler::eventFilter(QObject *pWatched, QEvent *pEvent) { /* Enable mouse event compression if we leave the VM view. * This is necessary for having smooth resizing of the VM/other windows: */ - setMouseCoalescingEnabled(true); + ::darwinSetMouseCoalescingEnabled(true); break; } case QEvent::Enter: @@ -608,7 +620,7 @@ bool UIMouseHandler::eventFilter(QObject *pWatched, QEvent *pEvent) * Only do this if the keyboard/mouse is grabbed * (this is when we have a valid event handler): */ if (machineLogic()->keyboardHandler()->isKeyboardGrabbed()) - setMouseCoalescingEnabled(false); + darwinSetMouseCoalescingEnabled(false); break; } #endif /* Q_WS_MAC */ @@ -680,48 +692,14 @@ bool UIMouseHandler::mouseEvent(int iEventType, ulong uScreenId, /* Send pending WM_PAINT events: */ ::UpdateWindow(m_viewports[uScreenId]->winId()); #endif - CMouse mouse = session().GetConsole().GetMouse(); mouse.PutMouseEvent(globalPos.x() - m_lastMousePos.x(), globalPos.y() - m_lastMousePos.y(), iWheelVertical, iWheelHorizontal, iMouseButtonsState); -#ifdef Q_WS_MAC - /* Keep the mouse from leaving the widget. - * This is a bit tricky to get right because if it escapes we won't necessarily - * get mouse events any longer and can warp it back. So, we keep safety zone - * of up to 300 pixels around the borders of the widget to prevent this from - * happening. Also, the mouse is warped back to the center of the widget. - * (Note, relativePos seems to be unreliable, it caused endless recursion here at one points...) - * (Note, synergy and other remote clients might not like this cursor warping.) */ - QRect rect = m_viewports[uScreenId]->visibleRegion().boundingRect(); - QPoint pw = m_viewports[uScreenId]->mapToGlobal(m_viewports[uScreenId]->pos()); - rect.translate(pw.x(), pw.y()); - - QRect dpRect = QApplication::desktop()->screenGeometry(m_viewports[uScreenId]); - if (rect.intersects(dpRect)) - rect = rect.intersect(dpRect); - - int iWsafe = rect.width() / 6; - rect.setWidth(rect.width() - iWsafe * 2); - rect.setLeft(rect.left() + iWsafe); - - int iHsafe = rect.height() / 6; - rect.setWidth(rect.height() - iHsafe * 2); - rect.setTop(rect.top() + iHsafe); - - if (rect.contains(globalPos, true)) - m_lastMousePos = globalPos; - else - { - m_lastMousePos = rect.center(); - QCursor::setPos(m_lastMousePos); - } -#else /* Q_WS_MAC */ - +#ifdef Q_WS_WIN /* Bringing mouse to the opposite side to simulate the endless moving: */ -# ifdef Q_WS_WIN /* Acquiring visible viewport rectangle in local coordinates: */ QRect viewportRectangle = m_viewports[uScreenId]->visibleRegion().boundingRect(); QPoint viewportRectangleGlobalPos = m_views[uScreenId]->mapToGlobal(m_viewports[uScreenId]->pos()); @@ -754,10 +732,8 @@ bool UIMouseHandler::mouseEvent(int iEventType, ulong uScreenId, QCursor::setPos(m_lastMousePos); } else - { m_lastMousePos = globalPos; - } -# else /* Q_WS_WIN */ +#else /* Q_WS_WIN */ int iWe = QApplication::desktop()->width() - 1; int iHe = QApplication::desktop()->height() - 1; QPoint p = globalPos; @@ -773,14 +749,14 @@ bool UIMouseHandler::mouseEvent(int iEventType, ulong uScreenId, if (p != globalPos) { m_lastMousePos = p; + /* No need for cursor updating on the Mac, there is no one. */ +# ifndef Q_WS_MAC QCursor::setPos(m_lastMousePos); +# endif /* Q_WS_MAC */ } else - { m_lastMousePos = globalPos; - } -# endif /* !Q_WS_WIN */ -#endif /* !Q_WS_MAC */ +#endif /* !Q_WS_WIN */ return true; /* stop further event handling */ } else /* !uisession()->isMouseCaptured() */ diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h b/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h index d637ab36b..e1da9bde0 100644 --- a/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h +++ b/src/VBox/Frontends/VirtualBox/src/runtime/UIMouseHandler.h @@ -65,14 +65,6 @@ public: /* Current mouse state: */ int mouseState() const; -#ifdef Q_WS_MAC - /* Enable mouse event compression if we leave the VM view. - * This is necessary for having smooth resizing of the VM/other windows. - * Disable mouse event compression if we enter the VM view. - * So all mouse events are registered in the VM. */ - void setMouseCoalescingEnabled(bool fOn); -#endif /* Q_WS_MAC */ - #ifdef Q_WS_X11 bool x11EventFilter(XEvent *pEvent, ulong uScreenId); #endif /* Q_WS_X11 */ diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp index 4c7a432ba..37ab0d960 100644 --- a/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp +++ b/src/VBox/Frontends/VirtualBox/src/runtime/normal/UIMachineWindowNormal.cpp @@ -44,7 +44,7 @@ #include "QIStatusBar.h" #include "QIStateIndicator.h" -#include "QIHotKeyEdit.h" +#include "UIHotKeyEditor.h" UIMachineWindowNormal::UIMachineWindowNormal(UIMachineLogic *pMachineLogic, ulong uScreenId) : QIWithRetranslateUI2<QMainWindow>(0, Qt::Window) @@ -261,7 +261,7 @@ void UIMachineWindowNormal::sltShowIndicatorsContextMenu(QIStateIndicator *pIndi void UIMachineWindowNormal::sltProcessGlobalSettingChange(const char * /* aPublicName */, const char * /* aName */) { - m_pNameHostkey->setText(QIHotKeyEdit::keyName(vboxGlobal().settings().hostKey())); + m_pNameHostkey->setText(UIHotKeyCombination::toReadableString(vboxGlobal().settings().hostCombo())); } void UIMachineWindowNormal::retranslateUi() @@ -274,7 +274,7 @@ void UIMachineWindowNormal::retranslateUi() "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.")); - m_pNameHostkey->setText(QIHotKeyEdit::keyName(vboxGlobal().settings().hostKey())); + m_pNameHostkey->setText(UIHotKeyCombination::toReadableString(vboxGlobal().settings().hostCombo())); } void UIMachineWindowNormal::updateAppearanceOf(int iElement) @@ -442,7 +442,7 @@ void UIMachineWindowNormal::prepareStatusBar() pHostkeyLedContainerLayout->setSpacing(3); pIndicatorBoxHLayout->addWidget(m_pCntHostkey); pHostkeyLedContainerLayout->addWidget(indicatorsPool()->indicator(UIIndicatorIndex_Hostkey)); - m_pNameHostkey = new QLabel(QIHotKeyEdit::keyName(vboxGlobal().settings().hostKey())); + m_pNameHostkey = new QLabel(UIHotKeyCombination::toReadableString(vboxGlobal().settings().hostCombo())); pHostkeyLedContainerLayout->addWidget(m_pNameHostkey); /* Add to statusbar: */ diff --git a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp index 535688dbf..700bc9e98 100644 --- a/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp +++ b/src/VBox/Frontends/VirtualBox/src/runtime/scale/UIMachineWindowScale.cpp @@ -77,6 +77,8 @@ UIMachineWindowScale::UIMachineWindowScale(UIMachineLogic *pMachineLogic, ulong updateAppearanceOf(UIVisualElement_AllStuff); #ifdef Q_WS_MAC + /* Install the resize delegate for keeping the aspect ratio. */ + ::darwinInstallResizeDelegate(this); /* Beta label? */ if (vboxGlobal().isBeta()) { @@ -85,13 +87,17 @@ UIMachineWindowScale::UIMachineWindowScale(UIMachineLogic *pMachineLogic, ulong } #endif /* Q_WS_MAC */ - /* Show window: */ showSimple(); } UIMachineWindowScale::~UIMachineWindowScale() { +#ifdef Q_WS_MAC + /* Uninstall the resize delegate for keeping the aspect ratio. */ + ::darwinUninstallResizeDelegate(this); +#endif /* Q_WS_MAC */ + /* Save normal window settings: */ saveWindowSettings(); diff --git a/src/VBox/Frontends/VirtualBox/src/selector/UIVMListView.cpp b/src/VBox/Frontends/VirtualBox/src/selector/UIVMListView.cpp index e8bd4415f..2cdb60c67 100644 --- a/src/VBox/Frontends/VirtualBox/src/selector/UIVMListView.cpp +++ b/src/VBox/Frontends/VirtualBox/src/selector/UIVMListView.cpp @@ -519,6 +519,11 @@ void UIVMListView::checkDragEvent(QDragMoveEvent *pEvent) { pEvent->setDropAction(Qt::CopyAction); pEvent->accept(); + }else if ( VBoxGlobal::hasAllowedExtension(file, VBoxDefs::VBoxExtPackFileExts) + && pEvent->possibleActions().testFlag(Qt::CopyAction)) + { + pEvent->setDropAction(Qt::CopyAction); + pEvent->accept(); } } } @@ -593,10 +598,11 @@ QPixmap UIVMListView::dragPixmap(const QModelIndex &index) const p.setPen(Qt::white); p.setFont(font()); p.drawText(QRect(margin, margin + osTypeSize.height() + space, s.width() - 2 * margin, nameSize.height()), Qt::AlignCenter, name); -#ifdef Q_WS_MAC + /* Transparent icons are not supported on all platforms. */ +#if defined(Q_WS_MAC) || defined(Q_WS_WIN) p.setCompositionMode(QPainter::CompositionMode_DestinationIn); p.fillRect(image.rect(), QColor(0, 0, 0, 177)); -#endif /* Q_WS_MAC */ +#endif /* defined(Q_WS_MAC) || defined(Q_WS_WIN) */ p.end(); /* Some Qt versions seems buggy in creating QPixmap from QImage. Seems they * don't clear the background. */ @@ -943,9 +949,9 @@ void UIVMItemPainter::calcLayout(const QModelIndex &aIndex, /* Really basic layout management. * First layout as usual */ aOSType->moveTo(m_Margin, m_Margin); - aVMName->moveTo(m_Margin + aOSType->width() + m_Spacing, m_Margin); + aVMName->moveTo(aOSType->right() + m_Spacing, m_Margin); aShot->moveTo(aVMName->right() + nameSpaceWidth, aVMName->top()); - aStateIcon->moveTo(aVMName->left(), aVMName->bottom()); + aStateIcon->moveTo(aVMName->left(), aOSType->bottom() - aStateIcon->height()); aState->moveTo(aStateIcon->right() + stateSpaceWidth, aStateIcon->top()); /* Do grouping for the automatic center routine. * First the states group: */ diff --git a/src/VBox/Frontends/VirtualBox/src/selector/VBoxSelectorWnd.cpp b/src/VBox/Frontends/VirtualBox/src/selector/VBoxSelectorWnd.cpp index 00836b139..008f16b75 100644 --- a/src/VBox/Frontends/VirtualBox/src/selector/VBoxSelectorWnd.cpp +++ b/src/VBox/Frontends/VirtualBox/src/selector/VBoxSelectorWnd.cpp @@ -1186,11 +1186,7 @@ bool VBoxSelectorWnd::eventFilter(QObject *pObject, QEvent *pEvent) */ void VBoxSelectorWnd::retranslateUi() { -#ifdef VBOX_OSE - QString title(tr("VirtualBox OSE")); -#else QString title(VBOX_PRODUCT); -#endif title += " " + tr("Manager", "Note: main window title which is pretended by the product name."); #ifdef VBOX_BLEEDING_EDGE @@ -1404,7 +1400,6 @@ void VBoxSelectorWnd::vmListViewCurrentChanged(bool aRefreshDetails, || state == KMachineState_TeleportingPausedVM /*?*/ ) { - mVmPauseAction->setText(tr("R&esume")); mVmPauseAction->setShortcut(gSS->keySequence(UISelectorShortcuts::PauseVMShortcut)); mVmPauseAction->setStatusTip( tr("Resume the execution of the virtual machine")); @@ -1414,7 +1409,6 @@ void VBoxSelectorWnd::vmListViewCurrentChanged(bool aRefreshDetails, } else { - mVmPauseAction->setText(tr("&Pause")); mVmPauseAction->setShortcut(gSS->keySequence(UISelectorShortcuts::PauseVMShortcut)); mVmPauseAction->setStatusTip( tr("Suspend the execution of the virtual machine")); diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.cpp b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.cpp index 83e6a4694..280628dea 100644 --- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.cpp +++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.cpp @@ -17,6 +17,9 @@ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. */ +/* Global includes */ +#include <QShortcut> + /* Local includes */ #include "UIGlobalSettingsInput.h" #include "VBoxGlobalSettings.h" @@ -27,6 +30,11 @@ UIGlobalSettingsInput::UIGlobalSettingsInput() /* Apply UI decorations: */ Ui::UIGlobalSettingsInput::setupUi(this); + /* Set the new shortcut for the eraze-host-combo button: */ + m_pResetHostCombinationButton->setShortcut(QKeySequence()); + new QShortcut(QKeySequence(Qt::Key_Delete), m_pResetHostCombinationButton, SLOT(animateClick())); + new QShortcut(QKeySequence(Qt::Key_Backspace), m_pResetHostCombinationButton, SLOT(animateClick())); + /* Apply language settings: */ retranslateUi(); } @@ -39,7 +47,7 @@ void UIGlobalSettingsInput::loadToCacheFrom(QVariant &data) UISettingsPageGlobal::fetchData(data); /* Load to cache: */ - m_cache.m_iHostKey = m_settings.hostKey(); + m_cache.m_strHostCombo = m_settings.hostCombo(); m_cache.m_fAutoCapture = m_settings.autoCapture(); /* Upload properties & settings to data: */ @@ -51,7 +59,7 @@ void UIGlobalSettingsInput::loadToCacheFrom(QVariant &data) void UIGlobalSettingsInput::getFromCache() { /* Fetch from cache: */ - m_pHostKeyEditor->setKey(m_cache.m_iHostKey); + m_pHostKeyEditor->setCombo(m_cache.m_strHostCombo); m_pEnableAutoGrabCheckbox->setChecked(m_cache.m_fAutoCapture); } @@ -60,7 +68,7 @@ void UIGlobalSettingsInput::getFromCache() void UIGlobalSettingsInput::putToCache() { /* Upload to cache: */ - m_cache.m_iHostKey = m_pHostKeyEditor->key(); + m_cache.m_strHostCombo = m_pHostKeyEditor->combo(); m_cache.m_fAutoCapture = m_pEnableAutoGrabCheckbox->isChecked(); } @@ -72,7 +80,7 @@ void UIGlobalSettingsInput::saveFromCacheTo(QVariant &data) UISettingsPageGlobal::fetchData(data); /* Save from cache: */ - m_settings.setHostKey(m_cache.m_iHostKey); + m_settings.setHostCombo(m_cache.m_strHostCombo); m_settings.setAutoCapture(m_cache.m_fAutoCapture); /* Upload properties & settings to data: */ @@ -83,8 +91,8 @@ void UIGlobalSettingsInput::saveFromCacheTo(QVariant &data) void UIGlobalSettingsInput::setOrderAfter(QWidget *pWidget) { setTabOrder(pWidget, m_pHostKeyEditor); - setTabOrder(m_pHostKeyEditor, m_pResetHostKeyButton); - setTabOrder(m_pResetHostKeyButton, m_pEnableAutoGrabCheckbox); + setTabOrder(m_pHostKeyEditor, m_pResetHostCombinationButton); + setTabOrder(m_pResetHostCombinationButton, m_pEnableAutoGrabCheckbox); } /* Translation stuff: */ diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.h b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.h index 7c4a254ff..9a091379a 100644 --- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.h +++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.h @@ -26,7 +26,7 @@ /* Global settings / Input page / Cache: */ struct UISettingsCacheGlobalInput { - int m_iHostKey; + QString m_strHostCombo; bool m_fAutoCapture; }; diff --git a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.ui b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.ui index 45b756105..718ea4016 100644 --- a/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.ui +++ b/src/VBox/Frontends/VirtualBox/src/settings/global/UIGlobalSettingsInput.ui @@ -53,7 +53,7 @@ </widget> </item> <item row="0" column="2"> - <widget class="QIHotKeyEdit" name="m_pHostKeyEditor"> + <widget class="UIHotKeyEditor" name="m_pHostKeyEditor"> <property name="whatsThis"> <string>Displays the key used as a Host Key in the VM window. Activate the entry field and press a new Host Key. Note that alphanumeric, cursor movement and editing keys cannot be used.</string> </property> @@ -66,38 +66,19 @@ </widget> </item> <item row="0" column="3"> - <widget class="UIResetButton" name="m_pResetHostKeyButton"> + <widget class="UIResetButton" name="m_pResetHostCombinationButton"> <property name="focusPolicy"> <enum>Qt::StrongFocus</enum> </property> <property name="toolTip"> - <string>Reset Host Key</string> + <string>Reset host combination</string> </property> <property name="whatsThis"> - <string>Resets the key used as a Host Key in the VM window.</string> - </property> - <property name="icon"> - <iconset><normaloff>:/delete_16px.png</normaloff>:/delete_16px.png</iconset> + <string>Resets the key combination used as the host combination in the VM window.</string> </property> </widget> </item> - <item row="0" column="4"> - <spacer> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Fixed</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item row="1" column="2" colspan="3"> + <item row="1" column="2" colspan="2"> <widget class="QCheckBox" name="m_pEnableAutoGrabCheckbox"> <property name="whatsThis"> <string>When checked, the keyboard is automatically captured every time the VM window is activated. When the keyboard is captured, all keystrokes (including system ones like Alt-Tab) are directed to the VM.</string> @@ -107,7 +88,7 @@ </property> </widget> </item> - <item row="2" column="0" colspan="5"> + <item row="2" column="0" colspan="4"> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -124,9 +105,9 @@ </widget> <customwidgets> <customwidget> - <class>QIHotKeyEdit</class> + <class>UIHotKeyEditor</class> <extends>QLabel</extends> - <header>QIHotKeyEdit.h</header> + <header>UIHotKeyEditor.h</header> </customwidget> <customwidget> <class>UIResetButton</class> @@ -134,15 +115,13 @@ <header>UISpecialControls.h</header> </customwidget> </customwidgets> - <resources> - <include location="../VirtualBox1.qrc"/> - </resources> + <resources/> <connections> <connection> - <sender>m_pResetHostKeyButton</sender> + <sender>m_pResetHostCombinationButton</sender> <signal>clicked(bool)</signal> <receiver>m_pHostKeyEditor</receiver> - <slot>clear()</slot> + <slot>sltClear()</slot> <hints> <hint type="sourcelabel"> <x>111</x> diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp index ee1860aa0..681111464 100644 --- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp +++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsGeneral.cpp @@ -136,7 +136,6 @@ void UIMachineSettingsGeneral::saveFromCacheTo(QVariant &data) UISettingsPageMachine::fetchData(data); /* Gather corresponding values from internal variables: */ - m_machine.SetName(m_cache.m_strName); m_machine.SetOSTypeId(m_cache.m_strGuestOsTypeId); m_machine.SetExtraData(VBoxDefs::GUI_SaveMountedAtRuntime, m_cache.m_fSaveMountedAtRuntime ? "yes" : "no"); m_machine.SetExtraData(VBoxDefs::GUI_ShowMiniToolBar, m_cache.m_fShowMiniToolBar ? "yes" : "no"); @@ -144,6 +143,9 @@ void UIMachineSettingsGeneral::saveFromCacheTo(QVariant &data) m_machine.SetSnapshotFolder(m_cache.m_strSnapshotsFolder); m_machine.SetClipboardMode(m_cache.m_clipboardMode); m_machine.SetDescription(m_cache.m_strDescription); + /* Must be last as otherwise its VM rename magic can collide with other + * settings in the config, especially with the snapshot folder. */ + m_machine.SetName(m_cache.m_strName); /* Upload machine to data: */ UISettingsPageMachine::uploadData(data); diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp index e3d1ec574..d7dd36dc2 100644 --- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp +++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.cpp @@ -21,6 +21,7 @@ #include "QIWidgetValidator.h" #include "UIIconPool.h" #include "VBoxGlobal.h" +#include "VBoxProblemReporter.h" #include "UIToolBar.h" #include "UIMachineSettingsUSB.h" #include "UIMachineSettingsUSBFilterDetails.h" @@ -279,8 +280,12 @@ void UIMachineSettingsUSB::putToCache() case UISettingsPageType_Machine: { /* Gather internal variables data from QWidget(s): */ + /* USB 1.0 (OHCI): */ m_cache.m_fUSBEnabled = mGbUSB->isChecked(); - m_cache.m_fEHCIEnabled = mCbUSB2->isChecked(); + /* USB 2.0 (EHCI): */ + QString strExtPackName = "Oracle VM VirtualBox Extension Pack"; + CExtPack extPack = vboxGlobal().virtualBox().GetExtensionPackManager().Find(strExtPackName); + m_cache.m_fEHCIEnabled = extPack.isNull() || !extPack.GetUsable() ? false : mCbUSB2->isChecked(); break; } default: @@ -376,6 +381,26 @@ void UIMachineSettingsUSB::setValidator (QIWidgetValidator *aVal) { mValidator = aVal; connect (mGbUSB, SIGNAL (stateChanged (int)), mValidator, SLOT (revalidate())); + connect(mCbUSB2, SIGNAL(stateChanged(int)), mValidator, SLOT(revalidate())); +} + +bool UIMachineSettingsUSB::revalidate(QString &strWarningText, QString& /* strTitle */) +{ + /* USB 2.0 Extension Pack presence test: */ + QString strExtPackName = "Oracle VM VirtualBox Extension Pack"; + CExtPack extPack = vboxGlobal().virtualBox().GetExtensionPackManager().Find(strExtPackName); + if (mCbUSB2->isChecked() && (extPack.isNull() || !extPack.GetUsable())) + { + strWarningText = tr("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. " + "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.") + .arg(strExtPackName); + vboxProblem().remindAboutUnsupportedUSB2(strExtPackName, this); + return true; + } + return true; } void UIMachineSettingsUSB::setOrderAfter (QWidget *aWidget) diff --git a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.h b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.h index b72148eef..8e9665fbe 100644 --- a/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.h +++ b/src/VBox/Frontends/VirtualBox/src/settings/machine/UIMachineSettingsUSB.h @@ -90,6 +90,7 @@ protected: void saveFromCacheTo(QVariant &data); void setValidator (QIWidgetValidator *aVal); + bool revalidate(QString &strWarningText, QString &strTitle); void setOrderAfter (QWidget *aWidget); diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp new file mode 100644 index 000000000..7c0317549 --- /dev/null +++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.cpp @@ -0,0 +1,619 @@ +/* $Id: UIHotKeyEditor.cpp $ */ +/** @file + * + * VBox frontends: Qt GUI ("VirtualBox"): + * VirtualBox Qt extensions: UIHotKeyEditor class implementation + */ + +/* + * Copyright (C) 2006-2011 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. + */ + +/* Local includes */ +#include "UIHotKeyEditor.h" +#include "VBoxDefs.h" +#include "VBoxGlobal.h" + +/* Global includes */ +#include <QApplication> +#include <QStyleOption> +#include <QStylePainter> +#include <QKeyEvent> +#include <QTimer> + +#ifdef Q_WS_WIN +# undef LOWORD +# undef HIWORD +# undef LOBYTE +# undef HIBYTE +# include <windows.h> +#endif /* Q_WS_WIN */ + +#ifdef Q_WS_X11 +# include <X11/Xlib.h> +# include <X11/Xutil.h> +# include <X11/keysym.h> +# ifdef KeyPress + const int XKeyPress = KeyPress; + const int XKeyRelease = KeyRelease; +# undef KeyPress +# undef KeyRelease +# endif /* KeyPress */ +# include "XKeyboard.h" +# include <QX11Info> +#endif /* Q_WS_X11 */ + +#ifdef Q_WS_MAC +# include "UICocoaApplication.h" +# include "DarwinKeyboard.h" +# include "VBoxUtils.h" +# include <Carbon/Carbon.h> +#endif /* Q_WS_MAC */ + + +#ifdef Q_WS_X11 +namespace UIHotKey +{ + QMap<QString, QString> m_keyNames; +} +#endif /* Q_WS_X11 */ + +QString UIHotKey::toString(int iKeyCode) +{ + QString strKeyName; + +#ifdef Q_WS_WIN + /* MapVirtualKey doesn't distinguish between right and left vkeys, + * even under XP, despite that it stated in MSDN. Do it by hands. + * Besides that it can't recognize such virtual keys as + * VK_DIVIDE & VK_PAUSE, this is also known bug. */ + int iScan; + switch (iKeyCode) + { + /* Processing special keys... */ + case VK_PAUSE: iScan = 0x45 << 16; break; + case VK_RSHIFT: iScan = 0x36 << 16; break; + case VK_RCONTROL: iScan = (0x1D << 16) | (1 << 24); break; + case VK_RMENU: iScan = (0x38 << 16) | (1 << 24); break; + /* Processing extended keys... */ + case VK_APPS: + case VK_LWIN: + case VK_RWIN: + case VK_NUMLOCK: iScan = (::MapVirtualKey(iKeyCode, 0) | 256) << 16; break; + default: iScan = ::MapVirtualKey(iKeyCode, 0) << 16; + } + TCHAR *pKeyName = new TCHAR[256]; + if (::GetKeyNameText(iScan, pKeyName, 256)) + { + strKeyName = QString::fromUtf16(pKeyName); + } + else + { + AssertMsgFailed(("That key have no name!\n")); + strKeyName = UIHotKeyEditor::tr("<key_%1>").arg(iKeyCode); + } + delete[] pKeyName; +#endif /* Q_WS_WIN */ + +#ifdef Q_WS_X11 + if (char *pNativeKeyName = ::XKeysymToString((KeySym)iKeyCode)) + { + strKeyName = m_keyNames[pNativeKeyName].isEmpty() ? + QString(pNativeKeyName) : m_keyNames[pNativeKeyName]; + } + else + { + AssertMsgFailed(("That key have no name!\n")); + strKeyName = UIHotKeyEditor::tr("<key_%1>").arg(iKeyCode); + } +#endif /* Q_WS_X11 */ + +#ifdef Q_WS_MAC + UInt32 modMask = DarwinKeyCodeToDarwinModifierMask(iKeyCode); + switch (modMask) + { + case shiftKey: + case optionKey: + case controlKey: + case cmdKey: + strKeyName = UIHotKeyEditor::tr("Left "); + break; + case rightShiftKey: + case rightOptionKey: + case rightControlKey: + case kEventKeyModifierRightCmdKeyMask: + strKeyName = UIHotKeyEditor::tr("Right "); + break; + default: + AssertMsgFailedReturn(("modMask=%#x\n", modMask), QString()); + } + switch (modMask) + { + case shiftKey: + case rightShiftKey: + strKeyName += QChar(kShiftUnicode); + break; + case optionKey: + case rightOptionKey: + strKeyName += QChar(kOptionUnicode); + break; + case controlKey: + case rightControlKey: + strKeyName += QChar(kControlUnicode); + break; + case cmdKey: + case kEventKeyModifierRightCmdKeyMask: + strKeyName += QChar(kCommandUnicode); + break; + } +#endif /* Q_WS_MAC */ + + return strKeyName; +} + +bool UIHotKey::isValidKey(int iKeyCode) +{ +#ifdef Q_WS_WIN + return ((iKeyCode >= VK_SHIFT && iKeyCode <= VK_CAPITAL) || + (iKeyCode >= VK_LSHIFT && iKeyCode <= VK_RMENU) || + (iKeyCode >= VK_F1 && iKeyCode <= VK_F24) || + iKeyCode == VK_NUMLOCK || iKeyCode == VK_SCROLL || + iKeyCode == VK_LWIN || iKeyCode == VK_RWIN || + iKeyCode == VK_APPS || + iKeyCode == VK_PRINT); +#endif /* Q_WS_WIN */ + +#ifdef Q_WS_X11 + return (IsModifierKey(iKeyCode) /* allow modifiers */ || + IsFunctionKey(iKeyCode) /* allow function keys */ || + IsMiscFunctionKey(iKeyCode) /* allow miscellaneous function keys */ || + iKeyCode == XK_Scroll_Lock /* allow 'Scroll Lock' missed in IsModifierKey() */) && + (iKeyCode != NoSymbol /* ignore some special symbol */ && + iKeyCode != XK_Insert /* ignore 'insert' included into IsMiscFunctionKey */); +#endif /* Q_WS_X11 */ + +#ifdef Q_WS_MAC + UInt32 modMask = ::DarwinKeyCodeToDarwinModifierMask(iKeyCode); + switch (modMask) + { + case shiftKey: + case optionKey: + case controlKey: + case rightShiftKey: + case rightOptionKey: + case rightControlKey: + case cmdKey: + case kEventKeyModifierRightCmdKeyMask: + return true; + default: + return false; + } +#endif /* Q_WS_MAC */ + + return false; +} + +#ifdef Q_WS_WIN +int UIHotKey::distinguishModifierVKey(int wParam, int lParam) +{ + int iKeyCode = wParam; + switch (iKeyCode) + { + case VK_SHIFT: + { + UINT uCurrentScanCode = (lParam & 0x01FF0000) >> 16; + UINT uLeftScanCode = ::MapVirtualKey(iKeyCode, 0); + if (uCurrentScanCode == uLeftScanCode) + iKeyCode = VK_LSHIFT; + else + iKeyCode = VK_RSHIFT; + break; + } + case VK_CONTROL: + { + UINT uCurrentScanCode = (lParam & 0x01FF0000) >> 16; + UINT uLeftScanCode = ::MapVirtualKey(iKeyCode, 0); + if (uCurrentScanCode == uLeftScanCode) + iKeyCode = VK_LCONTROL; + else + iKeyCode = VK_RCONTROL; + break; + } + case VK_MENU: + { + UINT uCurrentScanCode = (lParam & 0x01FF0000) >> 16; + UINT uLeftScanCode = ::MapVirtualKey(iKeyCode, 0); + if (uCurrentScanCode == uLeftScanCode) + iKeyCode = VK_LMENU; + else + iKeyCode = VK_RMENU; + break; + } + } + return iKeyCode; +} +#endif /* Q_WS_WIN */ + +#ifdef Q_WS_X11 +void UIHotKey::retranslateKeyNames() +{ + m_keyNames["Shift_L"] = UIHotKeyEditor::tr("Left Shift"); + m_keyNames["Shift_R"] = UIHotKeyEditor::tr("Right Shift"); + m_keyNames["Control_L"] = UIHotKeyEditor::tr("Left Ctrl"); + m_keyNames["Control_R"] = UIHotKeyEditor::tr("Right Ctrl"); + m_keyNames["Alt_L"] = UIHotKeyEditor::tr("Left Alt"); + m_keyNames["Alt_R"] = UIHotKeyEditor::tr("Right Alt"); + m_keyNames["Super_L"] = UIHotKeyEditor::tr("Left WinKey"); + m_keyNames["Super_R"] = UIHotKeyEditor::tr("Right WinKey"); + m_keyNames["Menu"] = UIHotKeyEditor::tr("Menu key"); + m_keyNames["ISO_Level3_Shift"] = UIHotKeyEditor::tr("Alt Gr"); + m_keyNames["Caps_Lock"] = UIHotKeyEditor::tr("Caps Lock"); + m_keyNames["Scroll_Lock"] = UIHotKeyEditor::tr("Scroll Lock"); +} +#endif /* Q_WS_X11 */ + + +namespace UIHotKeyCombination +{ + int m_iMaxComboSize = 3; +} + +QString UIHotKeyCombination::toReadableString(const QString &strKeyCombo) +{ + QStringList encodedKeyList = strKeyCombo.split(','); + QStringList readableKeyList; + for (int i = 0; i < encodedKeyList.size(); ++i) + if (int iKeyCode = encodedKeyList[i].toInt()) + readableKeyList << UIHotKey::toString(iKeyCode); + return readableKeyList.isEmpty() ? UIHotKeyEditor::tr("None") : readableKeyList.join(" + "); +} + +QList<int> UIHotKeyCombination::toKeyCodeList(const QString &strKeyCombo) +{ + QStringList encodedKeyList = strKeyCombo.split(','); + QList<int> keyCodeList; + for (int i = 0; i < encodedKeyList.size(); ++i) + if (int iKeyCode = encodedKeyList[i].toInt()) + keyCodeList << iKeyCode; + return keyCodeList; +} + +bool UIHotKeyCombination::isValidKeyCombo(const QString &strKeyCombo) +{ + QList<int> keyCodeList = toKeyCodeList(strKeyCombo); + if (keyCodeList.size() > m_iMaxComboSize) + return false; + for (int i = 0; i < keyCodeList.size(); ++i) + if (!UIHotKey::isValidKey(keyCodeList[i])) + return false; + return true; +} + + +UIHotKeyEditor::UIHotKeyEditor(QWidget *pParent) + : QLabel(pParent) + , m_pReleaseTimer(0) + , m_fStartNewSequence(true) +{ + /* Configure widget: */ + setAttribute(Qt::WA_NativeWindow); + setFrameStyle(QFrame::StyledPanel | Sunken); + setAlignment(Qt::AlignCenter); + setFocusPolicy(Qt::StrongFocus); + setAutoFillBackground(true); + + /* Setup palette: */ + QPalette p = palette(); + p.setColor(QPalette::Active, QPalette::Foreground, p.color(QPalette::Active, QPalette::Text)); + p.setColor(QPalette::Active, QPalette::Background, p.color(QPalette::Active, QPalette::Base)); + setPalette(p); + + /* Setup release-pending-keys timer: */ + m_pReleaseTimer = new QTimer(this); + m_pReleaseTimer->setInterval(200); + connect(m_pReleaseTimer, SIGNAL(timeout()), this, SLOT(sltReleasePendingKeys())); + +#ifdef Q_WS_X11 + /* Initialize the X keyboard subsystem: */ + initMappedX11Keyboard(QX11Info::display(), vboxGlobal().settings().publicProperty("GUI/RemapScancodes")); +#endif /* Q_WS_X11 */ + +#ifdef Q_WS_MAC + m_uDarwinKeyModifiers = 0; + UICocoaApplication::instance()->registerForNativeEvents(RT_BIT_32(10) | RT_BIT_32(11) | RT_BIT_32(12) /* NSKeyDown | NSKeyUp | | NSFlagsChanged */, UIHotKeyEditor::darwinEventHandlerProc, this); + ::DarwinGrabKeyboard(false /* just modifiers */); +#endif /* Q_WS_MAC */ +} + +UIHotKeyEditor::~UIHotKeyEditor() +{ +#ifdef Q_WS_MAC + ::DarwinReleaseKeyboard(); + UICocoaApplication::instance()->unregisterForNativeEvents(RT_BIT_32(10) | RT_BIT_32(11) | RT_BIT_32(12) /* NSKeyDown | NSKeyUp | | NSFlagsChanged */, UIHotKeyEditor::darwinEventHandlerProc, this); +#endif /* Q_WS_MAC */ +} + +void UIHotKeyEditor::setCombo(const QString &strKeyCombo) +{ + /* Cleanup old combo: */ + m_shownKeys.clear(); + /* Parse newly passed combo: */ + QList<int> keyCodeList = UIHotKeyCombination::toKeyCodeList(strKeyCombo); + for (int i = 0; i < keyCodeList.size(); ++i) + if (int iKeyCode = keyCodeList[i]) + m_shownKeys.insert(iKeyCode, UIHotKey::toString(iKeyCode)); + /* Update text: */ + updateText(); +} + +QString UIHotKeyEditor::combo() const +{ + /* Compose current combination: */ + QStringList keyCodeStringList; + QList<int> keyCodeList = m_shownKeys.keys(); + for (int i = 0; i < keyCodeList.size(); ++i) + keyCodeStringList << QString::number(keyCodeList[i]); + /* Return current combination or "0" for "None": */ + return keyCodeStringList.isEmpty() ? "0" : keyCodeStringList.join(","); +} + +QSize UIHotKeyEditor::sizeHint() const +{ + ensurePolished(); + QFontMetrics fm(font()); + int h = qMax(fm.lineSpacing(), 14) + 2; + int w = fm.width('x') * 17; + int m = frameWidth() * 2; + QStyleOption option; + option.initFrom(this); + return (style()->sizeFromContents(QStyle::CT_LineEdit, &option, + QSize(w + m, h + m).expandedTo(QApplication::globalStrut()), + this)); +} + +QSize UIHotKeyEditor::minimumSizeHint() const +{ + ensurePolished(); + QFontMetrics fm = fontMetrics(); + int h = fm.height() + qMax(2, fm.leading()); + int w = fm.maxWidth(); + int m = frameWidth() * 2; + return QSize(w + m, h + m); +} + +void UIHotKeyEditor::sltClear() +{ + m_shownKeys.clear(); + updateText(); +} + +#ifdef Q_WS_WIN +bool UIHotKeyEditor::winEvent(MSG *pMsg, long* /* pResult */) +{ + switch (pMsg->message) + { + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + case WM_KEYUP: + case WM_SYSKEYUP: + { + /* Get key-code: */ + int iKeyCode = UIHotKey::distinguishModifierVKey((int)pMsg->wParam, (int)pMsg->lParam); + + /* Process the key event: */ + return processKeyEvent(iKeyCode, pMsg->message == WM_KEYDOWN || pMsg->message == WM_SYSKEYDOWN); + } + default: + break; + } + + return false; +} +#endif /* Q_WS_WIN */ + +#ifdef Q_WS_X11 +bool UIHotKeyEditor::x11Event(XEvent *pEvent) +{ + switch (pEvent->type) + { + case XKeyPress: + case XKeyRelease: + { + /* Get key-code: */ + XKeyEvent *pKeyEvent = (XKeyEvent*)pEvent; + KeySym ks = ::XKeycodeToKeysym(pKeyEvent->display, pKeyEvent->keycode, 0); + int iKeySym = (int)ks; + + /* Process the key event: */ + return processKeyEvent(iKeySym, pEvent->type == XKeyPress); + } + default: + break; + } + + return false; +} +#endif /* Q_WS_X11 */ + +#ifdef Q_WS_MAC +/* static */ +bool UIHotKeyEditor::darwinEventHandlerProc(const void *pvCocoaEvent, const void *pvCarbonEvent, void *pvUser) +{ + UIHotKeyEditor *pEditor = static_cast<UIHotKeyEditor*>(pvUser); + EventRef inEvent = (EventRef)pvCarbonEvent; + UInt32 EventClass = ::GetEventClass(inEvent); + if (EventClass == kEventClassKeyboard) + return pEditor->darwinKeyboardEvent(pvCocoaEvent, inEvent); + return false; +} + +bool UIHotKeyEditor::darwinKeyboardEvent(const void *pvCocoaEvent, EventRef inEvent) +{ + /* Ignore key changes unless we're the focus widget: */ + if (!hasFocus()) + return false; + + UInt32 eventKind = ::GetEventKind(inEvent); + switch (eventKind) + { + //case kEventRawKeyDown: + //case kEventRawKeyUp: + //case kEventRawKeyRepeat: + case kEventRawKeyModifiersChanged: + { + /* Get modifier mask: */ + UInt32 modifierMask = 0; + ::GetEventParameter(inEvent, kEventParamKeyModifiers, typeUInt32, NULL, + sizeof(modifierMask), NULL, &modifierMask); + modifierMask = ::DarwinAdjustModifierMask(modifierMask, pvCocoaEvent); + UInt32 changed = m_uDarwinKeyModifiers ^ modifierMask; + + if (!changed) + break; + + /* Convert to keycode: */ + unsigned uKeyCode = ::DarwinModifierMaskToDarwinKeycode(changed); + + if (!uKeyCode || uKeyCode == ~0U) + return false; + + /* Process the key event: */ + if (processKeyEvent(uKeyCode, changed & modifierMask)) + { + /* Save the new modifier mask state. */ + m_uDarwinKeyModifiers = modifierMask; + return true; + } + break; + } + default: + break; + } + return false; +} +#endif /* Q_WS_MAC */ + +void UIHotKeyEditor::focusInEvent(QFocusEvent *pEvent) +{ + QLabel::focusInEvent(pEvent); + + QPalette p = palette(); + p.setColor(QPalette::Active, QPalette::Foreground, p.color(QPalette::Active, QPalette::HighlightedText)); + p.setColor(QPalette::Active, QPalette::Background, p.color(QPalette::Active, QPalette::Highlight)); + setPalette(p); +} + +void UIHotKeyEditor::focusOutEvent(QFocusEvent *pEvent) +{ + QLabel::focusOutEvent(pEvent); + + QPalette p = palette(); + p.setColor(QPalette::Active, QPalette::Foreground, p.color(QPalette::Active, QPalette::Text)); + p.setColor(QPalette::Active, QPalette::Background, p.color(QPalette::Active, QPalette::Base)); + setPalette(p); +} + +void UIHotKeyEditor::paintEvent(QPaintEvent *pEvent) +{ + if (hasFocus()) + { + QStylePainter painter(this); + QStyleOptionFocusRect option; + option.initFrom(this); + option.backgroundColor = palette().color(QPalette::Background); + option.rect = contentsRect(); + painter.drawPrimitive(QStyle::PE_FrameFocusRect, option); + } + QLabel::paintEvent(pEvent); +} + +void UIHotKeyEditor::sltReleasePendingKeys() +{ + /* Stop the timer, we process all pending keys at once: */ + m_pReleaseTimer->stop(); + /* Something to do? */ + if (!m_releasedKeys.isEmpty()) + { + /* Remove every key: */ + QSetIterator<int> iterator(m_releasedKeys); + while (iterator.hasNext()) + { + int iKeyCode = iterator.next(); + m_pressedKeys.remove(iKeyCode); + m_shownKeys.remove(iKeyCode); + } + m_releasedKeys.clear(); + if (m_pressedKeys.isEmpty()) + m_fStartNewSequence = true; + } + /* Make sure the user see what happens: */ + updateText(); +} + +bool UIHotKeyEditor::processKeyEvent(int iKeyCode, bool fKeyPress) +{ + /* Check if symbol is valid else pass it to Qt: */ + if (!UIHotKey::isValidKey(iKeyCode)) + return false; + + /* Stop the release-pending-keys timer: */ + m_pReleaseTimer->stop(); + + /* Key press: */ + if (fKeyPress) + { + /* Clear reflected symbols if new sequence started: */ + if (m_fStartNewSequence) + m_shownKeys.clear(); + /* Make sure any keys pending for releasing are processed: */ + sltReleasePendingKeys(); + /* Check maximum combo size: */ + if (m_shownKeys.size() < UIHotKeyCombination::m_iMaxComboSize) + { + /* Remember pressed symbol: */ + m_pressedKeys << iKeyCode; + m_shownKeys.insert(iKeyCode, UIHotKey::toString(iKeyCode)); + + /* Remember what we already started a sequence: */ + m_fStartNewSequence = false; + } + } + /* Key release: */ + else + { + /* Queue released symbol for processing: */ + m_releasedKeys << iKeyCode; + + /* If all pressed keys are now pending for releasing we should stop further handling. + * Now we have the status the user want: */ + if (m_pressedKeys == m_releasedKeys) + { + m_pressedKeys.clear(); + m_releasedKeys.clear(); + m_fStartNewSequence = true; + } + else + m_pReleaseTimer->start(); + } + + /* Update text: */ + updateText(); + + /* Prevent passing to Qt: */ + return true; +} + +void UIHotKeyEditor::updateText() +{ + QStringList shownKeyNames(m_shownKeys.values()); + setText(shownKeyNames.isEmpty() ? tr("None") : shownKeyNames.join(" + ")); +} + diff --git a/src/VBox/Frontends/VirtualBox/src/extensions/QIHotKeyEdit.h b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h index 4bae24814..2c8737b5d 100644 --- a/src/VBox/Frontends/VirtualBox/src/extensions/QIHotKeyEdit.h +++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIHotKeyEditor.h @@ -1,7 +1,7 @@ /** @file * * VBox frontends: Qt GUI ("VirtualBox"): - * VirtualBox Qt extensions: QIHotKeyEdit class declaration + * VirtualBox Qt extensions: UIHotKeyEditor class declaration */ /* @@ -16,77 +16,95 @@ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. */ -#ifndef ___QIHotKeyEdit_h___ -#define ___QIHotKeyEdit_h___ +#ifndef ___UIHotKeyEditor_h___ +#define ___UIHotKeyEditor_h___ /* Global includes */ #include <QLabel> +#include <QMap> +#include <QSet> +/* Hot-key namespace to unify + * all the related hot-key processing stuff: */ +namespace UIHotKey +{ + QString toString(int iKeyCode); + bool isValidKey(int iKeyCode); +#ifdef Q_WS_WIN + int distinguishModifierVKey(int wParam, int lParam); +#endif /* Q_WS_WIN */ #ifdef Q_WS_X11 -# include <QMap> + void retranslateKeyNames(); #endif /* Q_WS_X11 */ +} -class QIHotKeyEdit : public QLabel +/* Hot-combo namespace to unify + * all the related hot-combo processing stuff: */ +namespace UIHotKeyCombination { - Q_OBJECT + QString toReadableString(const QString &strKeyCombo); + QList<int> toKeyCodeList(const QString &strKeyCombo); + bool isValidKeyCombo(const QString &strKeyCombo); +} -public: +class UIHotKeyEditor : public QLabel +{ + Q_OBJECT; - QIHotKeyEdit(QWidget *pParent); - virtual ~QIHotKeyEdit(); +public: - void setKey(int iKeyVal); - int key() const { return m_iKeyVal; } + UIHotKeyEditor(QWidget *pParent); + virtual ~UIHotKeyEditor(); - QString symbolicName() const { return m_strSymbName; } + void setCombo(const QString &strKeyCombo); + QString combo() const; QSize sizeHint() const; QSize minimumSizeHint() const; - static QString keyName(int iKeyVal); - static bool isValidKey(int iKeyVal); -#ifdef Q_WS_X11 - static void retranslateUi(); -#endif /* Q_WS_X11 */ - public slots: - void clear(); + void sltClear(); protected: -#if defined (Q_WS_WIN32) +#ifdef Q_WS_WIN bool winEvent(MSG *pMsg, long *pResult); -#elif defined (Q_WS_X11) +#endif /* Q_WS_WIN */ +#ifdef Q_WS_X11 bool x11Event(XEvent *pEvent); -#elif defined (Q_WS_MAC) +#endif /* Q_WS_X11 */ +#ifdef Q_WS_MAC static bool darwinEventHandlerProc(const void *pvCocoaEvent, const void *pvCarbonEvent, void *pvUser); bool darwinKeyboardEvent(const void *pvCocoaEvent, EventRef inEvent); -#endif +#endif /* Q_WS_MAC */ void focusInEvent(QFocusEvent *pEvent); void focusOutEvent(QFocusEvent *pEvent); void paintEvent(QPaintEvent *pEvent); +private slots: + + void sltReleasePendingKeys(); + private: + bool processKeyEvent(int iKeyCode, bool fKeyPress); void updateText(); - int m_iKeyVal; - QString m_strSymbName; + QSet<int> m_pressedKeys; + QSet<int> m_releasedKeys; + QMap<int, QString> m_shownKeys; -#ifdef Q_WS_X11 - static QMap<QString, QString> s_keyNames; -#endif /* Q_WS_X11 */ + QTimer* m_pReleaseTimer; + bool m_fStartNewSequence; -#ifdef Q_WS_MAC +#ifdef RT_OS_DARWIN /* The current modifier key mask. Used to figure out which modifier * key was pressed when we get a kEventRawKeyModifiersChanged event. */ uint32_t m_uDarwinKeyModifiers; -#endif /* Q_WS_MAC */ - - static const char *m_spNoneSymbName; +#endif /* RT_OS_DARWIN */ }; -#endif // !___QIHotKeyEdit_h___ +#endif // !___UIHotKeyEditor_h___ diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp index 0bcf4f66b..a0ad930cf 100644 --- a/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp +++ b/src/VBox/Frontends/VirtualBox/src/widgets/UIProgressDialog.cpp @@ -37,11 +37,6 @@ #include <QTimer> #include <QVBoxLayout> -#define VBOX_SECOND 1 -#define VBOX_MINUTE VBOX_SECOND * 60 -#define VBOX_HOUR VBOX_MINUTE * 60 -#define VBOX_DAY VBOX_HOUR * 24 - const char *UIProgressDialog::m_spcszOpDescTpl = "%1 ... (%2/%3)"; UIProgressDialog::UIProgressDialog(CProgress &progress, @@ -220,15 +215,18 @@ void UIProgressDialog::timerEvent(QTimerEvent * /* pEvent */) /* Update the progress dialog */ /* First ETA */ long newTime = m_progress.GetTimeRemaining(); - QDateTime time; - time.setTime_t(newTime); - QDateTime refTime; - refTime.setTime_t(0); - - int days = refTime.daysTo(time); - int hours = time.addDays(-days).time().hour(); - int minutes = time.addDays(-days).time().minute(); - int seconds = time.addDays(-days).time().second(); + long seconds; + long minutes; + long hours; + long days; + + seconds = newTime < 0 ? 0 : newTime; + minutes = seconds / 60; + seconds -= minutes * 60; + hours = minutes / 60; + minutes -= hours * 60; + days = hours / 24; + hours -= days * 24; QString strDays = VBoxGlobal::daysToString(days); QString strHours = VBoxGlobal::hoursToString(hours); @@ -238,33 +236,31 @@ void UIProgressDialog::timerEvent(QTimerEvent * /* pEvent */) QString strTwoComp = tr("%1, %2 remaining", "You may wish to translate this more like \"Time remaining: %1, %2\""); QString strOneComp = tr("%1 remaining", "You may wish to translate this more like \"Time remaining: %1\""); - if (newTime > VBOX_DAY * 2 + VBOX_HOUR) + if (days > 1 && hours > 0) m_pEtaLbl->setText(strTwoComp.arg(strDays).arg(strHours)); - else if (newTime > VBOX_DAY * 2 + VBOX_MINUTE * 5) - m_pEtaLbl->setText(strTwoComp.arg(strDays).arg(strMinutes)); - else if (newTime > VBOX_DAY * 2) + else if (days > 1) m_pEtaLbl->setText(strOneComp.arg(strDays)); - else if (newTime > VBOX_DAY + VBOX_HOUR) + else if (days > 0 && hours > 0) m_pEtaLbl->setText(strTwoComp.arg(strDays).arg(strHours)); - else if (newTime > VBOX_DAY + VBOX_MINUTE * 5) + else if (days > 0 && minutes > 5) m_pEtaLbl->setText(strTwoComp.arg(strDays).arg(strMinutes)); - else if (newTime > VBOX_HOUR * 23 + VBOX_MINUTE * 55) + else if (days > 0) m_pEtaLbl->setText(strOneComp.arg(strDays)); - else if (newTime >= VBOX_HOUR * 2) - m_pEtaLbl->setText(strTwoComp.arg(strHours).arg(strMinutes)); - else if (newTime > VBOX_HOUR + VBOX_MINUTE * 5) + else if (hours > 2) + m_pEtaLbl->setText(strTwoComp.arg(strHours)); + else if (hours > 0 && minutes > 0) m_pEtaLbl->setText(strTwoComp.arg(strHours).arg(strMinutes)); - else if (newTime > VBOX_MINUTE * 55) + else if (hours > 0) m_pEtaLbl->setText(strOneComp.arg(strHours)); - else if (newTime > VBOX_MINUTE * 2) + else if (minutes > 2) m_pEtaLbl->setText(strOneComp.arg(strMinutes)); - else if (newTime > VBOX_MINUTE + VBOX_SECOND * 5) + else if (minutes > 0 && seconds > 5) m_pEtaLbl->setText(strTwoComp.arg(strMinutes).arg(strSeconds)); - else if (newTime > VBOX_SECOND * 55) + else if (minutes > 0) m_pEtaLbl->setText(strOneComp.arg(strMinutes)); - else if (newTime > VBOX_SECOND * 5) + else if (seconds > 5) m_pEtaLbl->setText(strOneComp.arg(strSeconds)); - else if (newTime >= 0) + else if (seconds > 0) m_pEtaLbl->setText(tr("A few seconds remaining")); else m_pEtaLbl->clear(); diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxApplianceEditorWgt.cpp b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxApplianceEditorWgt.cpp index 83d493c57..1e19b273c 100644 --- a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxApplianceEditorWgt.cpp +++ b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxApplianceEditorWgt.cpp @@ -129,6 +129,7 @@ HardwareItem::HardwareItem (int aNumber, , mConfigDefaultValue (aConfigValue) , mExtraConfigValue (aExtraConfigValue) , mCheckState (Qt::Checked) + , m_fModified(false) {} void HardwareItem::putBack (QVector<BOOL>& aFinalStates, QVector<QString>& aFinalValues, QVector<QString>& aFinalExtraValues) @@ -158,6 +159,14 @@ bool HardwareItem::setData (int aColumn, const QVariant &aValue, int aRole) } break; } + case Qt::EditRole: + { + if (aColumn == OriginalValueSection) + mOrigValue = aValue.toString(); + else if (aColumn == ConfigValueSection) + mConfigValue = aValue.toString(); + break; + } default: break; } return fDone; @@ -168,6 +177,14 @@ QVariant HardwareItem::data (int aColumn, int aRole) const QVariant v; switch (aRole) { + case Qt::EditRole: + { + if (aColumn == OriginalValueSection) + v = mOrigValue; + else if (aColumn == ConfigValueSection) + v = mConfigValue; + break; + } case Qt::DisplayRole: { if (aColumn == DescriptionSection) @@ -304,6 +321,17 @@ QVariant HardwareItem::data (int aColumn, int aRole) const v = mCheckState; break; } + case HardwareItem::TypeRole: + { + v = mType; + break; + } + case HardwareItem::ModifiedRole: + { + if (aColumn == ConfigValueSection) + v = m_fModified; + break; + } } return v; } @@ -542,7 +570,7 @@ bool HardwareItem::setEditorData (QWidget *aEditor, const QModelIndex & /* aInde return fDone; } -bool HardwareItem::setModelData (QWidget *aEditor, QAbstractItemModel * /* aModel */, const QModelIndex & /* aIndex */) +bool HardwareItem::setModelData (QWidget *aEditor, QAbstractItemModel *aModel, const QModelIndex & aIndex) { bool fDone = false; switch (mType) @@ -576,6 +604,34 @@ bool HardwareItem::setModelData (QWidget *aEditor, QAbstractItemModel * /* aMode break; } case KVirtualSystemDescriptionType_Name: + { + if (QLineEdit *e = qobject_cast<QLineEdit*> (aEditor)) + { + /* When the VM name is changed the path of the disk images + * should be also changed. So first of all find all disk + * images corresponding to this appliance. Next check if + * they are modified by the user already. If not change the + * path to the new path. */ + /* Create an index of this position, but in column 0. */ + QModelIndex c0Index = aModel->index(aIndex.row(), 0, aIndex.parent()); + /* Query all items with the type HardDiskImage and which + * are child's of this item. */ + QModelIndexList list = aModel->match(c0Index, HardwareItem::TypeRole, KVirtualSystemDescriptionType_HardDiskImage, -1, Qt::MatchExactly | Qt::MatchWrap | Qt::MatchRecursive); + for (int i = 0; i < list.count(); ++i) + { + /* Get the index for the config value column. */ + QModelIndex hdIndex = aModel->index(list.at(i).row(), ConfigValueSection, list.at(i).parent()); + /* Ignore it if was already modified by the user. */ + if (!hdIndex.data(ModifiedRole).toBool()) + /* Replace any occurrence of the old VM name with + * the new VM name. */ + aModel->setData(hdIndex, hdIndex.data(Qt::EditRole).toString().replace(mConfigValue, e->text()), Qt::EditRole); + } + mConfigValue = e->text(); + fDone = true; + } + break; + } case KVirtualSystemDescriptionType_Product: case KVirtualSystemDescriptionType_ProductUrl: case KVirtualSystemDescriptionType_Vendor: @@ -626,6 +682,9 @@ bool HardwareItem::setModelData (QWidget *aEditor, QAbstractItemModel * /* aMode } default: break; } + if (fDone) + m_fModified = true; + return fDone; } @@ -888,7 +947,7 @@ void VirtualSystemDelegate::setModelData (QWidget *aEditor, QAbstractItemModel * index = mProxy->mapToSource (aIndex); ModelItem *item = static_cast<ModelItem*> (index.internalPointer()); - if (!item->setModelData (aEditor, aModel, index)) + if (!item->setModelData (aEditor, aModel, aIndex)) QItemDelegate::setModelData (aEditor, aModel, aIndex); } diff --git a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxApplianceEditorWgt.h b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxApplianceEditorWgt.h index b6d025e51..b76846354 100644 --- a/src/VBox/Frontends/VirtualBox/src/widgets/VBoxApplianceEditorWgt.h +++ b/src/VBox/Frontends/VirtualBox/src/widgets/VBoxApplianceEditorWgt.h @@ -110,6 +110,12 @@ class HardwareItem: public ModelItem friend class VirtualSystemSortProxyModel; public: + enum + { + TypeRole = Qt::UserRole, + ModifiedRole + }; + HardwareItem (int aNumber, KVirtualSystemDescriptionType aType, const QString &aRef, @@ -146,6 +152,7 @@ private: QString mConfigDefaultValue; QString mExtraConfigValue; Qt::CheckState mCheckState; + bool m_fModified; }; //////////////////////////////////////////////////////////////////////////////// diff --git a/src/VBox/HostDrivers/Support/SUPDrv.c b/src/VBox/HostDrivers/Support/SUPDrv.c index cb223c7ff..f33858faa 100644 --- a/src/VBox/HostDrivers/Support/SUPDrv.c +++ b/src/VBox/HostDrivers/Support/SUPDrv.c @@ -1,10 +1,10 @@ -/* $Revision: 69206 $ */ +/* $Revision: 70883 $ */ /** @file * VBoxDrv - The VirtualBox Support Driver - Common code. */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -130,10 +130,13 @@ static void supdrvGipDestroy(PSUPDRVDEVEXT pDevExt); static DECLCALLBACK(void) supdrvGipSyncTimer(PRTTIMER pTimer, void *pvUser, uint64_t iTick); static DECLCALLBACK(void) supdrvGipAsyncTimer(PRTTIMER pTimer, void *pvUser, uint64_t iTick); static DECLCALLBACK(void) supdrvGipMpEvent(RTMPEVENT enmEvent, RTCPUID idCpu, void *pvUser); -static void supdrvGipInit(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, RTHCPHYS HCPhys, uint64_t u64NanoTS, unsigned uUpdateHz); +static void supdrvGipInit(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, RTHCPHYS HCPhys, + uint64_t u64NanoTS, unsigned uUpdateHz, unsigned cCpus); +static DECLCALLBACK(void) supdrvGipInitOnCpu(RTCPUID idCpu, void *pvUser1, void *pvUser2); static void supdrvGipTerm(PSUPGLOBALINFOPAGE pGip); -static void supdrvGipUpdate(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, uint64_t iTick); -static void supdrvGipUpdatePerCpu(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, unsigned iCpu, uint64_t iTick); +static void supdrvGipUpdate(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, RTCPUID idCpu, uint64_t iTick); +static void supdrvGipUpdatePerCpu(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, + RTCPUID idCpu, uint8_t idApic, uint64_t iTick); /******************************************************************************* @@ -423,8 +426,7 @@ int VBOXCALL supdrvInitDevExt(PSUPDRVDEVEXT pDevExt, size_t cbSession) static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES; PRTLOGGER pRelLogger; rc = RTLogCreate(&pRelLogger, 0 /* fFlags */, "all", - "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, - RTLOGDEST_STDOUT | RTLOGDEST_DEBUGGER, NULL); + "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, RTLOGDEST_STDOUT | RTLOGDEST_DEBUGGER, NULL); if (RT_SUCCESS(rc)) RTLogRelSetDefaultInstance(pRelLogger); /** @todo Add native hook for getting logger config parameters and setting @@ -1392,6 +1394,38 @@ int VBOXCALL supdrvIOCtl(uintptr_t uIOCtl, PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION return 0; } + case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_CALL_VMMR0_BIG): + { + /* validate */ + PSUPVMMR0REQHDR pVMMReq; + PSUPCALLVMMR0 pReq = (PSUPCALLVMMR0)pReqHdr; + Log4(("SUP_IOCTL_CALL_VMMR0_BIG: op=%u in=%u arg=%RX64 p/t=%RTproc/%RTthrd\n", + pReq->u.In.uOperation, pReq->Hdr.cbIn, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf())); + + pVMMReq = (PSUPVMMR0REQHDR)&pReq->abReqPkt[0]; + REQ_CHECK_EXPR_FMT(pReq->Hdr.cbIn >= SUP_IOCTL_CALL_VMMR0_BIG_SIZE(sizeof(SUPVMMR0REQHDR)), + ("SUP_IOCTL_CALL_VMMR0_BIG: cbIn=%#x < %#lx\n", pReq->Hdr.cbIn, SUP_IOCTL_CALL_VMMR0_BIG_SIZE(sizeof(SUPVMMR0REQHDR)))); + REQ_CHECK_EXPR(SUP_IOCTL_CALL_VMMR0_BIG, pVMMReq->u32Magic == SUPVMMR0REQHDR_MAGIC); + REQ_CHECK_SIZES_EX(SUP_IOCTL_CALL_VMMR0_BIG, SUP_IOCTL_CALL_VMMR0_BIG_SIZE_IN(pVMMReq->cbReq), SUP_IOCTL_CALL_VMMR0_BIG_SIZE_OUT(pVMMReq->cbReq)); + + /* execute */ + if (RT_LIKELY(pDevExt->pfnVMMR0EntryEx)) + pReq->Hdr.rc = pDevExt->pfnVMMR0EntryEx(pReq->u.In.pVMR0, pReq->u.In.idCpu, pReq->u.In.uOperation, pVMMReq, pReq->u.In.u64Arg, pSession); + else + pReq->Hdr.rc = VERR_WRONG_ORDER; + + if ( RT_FAILURE(pReq->Hdr.rc) + && pReq->Hdr.rc != VERR_INTERRUPTED + && pReq->Hdr.rc != VERR_TIMEOUT) + Log(("SUP_IOCTL_CALL_VMMR0_BIG: rc=%Rrc op=%u out=%u arg=%RX64 p/t=%RTproc/%RTthrd\n", + pReq->Hdr.rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf())); + else + Log4(("SUP_IOCTL_CALL_VMMR0_BIG: rc=%Rrc op=%u out=%u arg=%RX64 p/t=%RTproc/%RTthrd\n", + pReq->Hdr.rc, pReq->u.In.uOperation, pReq->Hdr.cbOut, pReq->u.In.u64Arg, RTProcSelf(), RTThreadNativeSelf())); + VBOXDRV_SUPDRV_IOCTL_RETURN(pSession, uIOCtl, pReqHdr, VINF_SUCCESS, pReq->Hdr.rc); + return 0; + } + case SUP_CTL_CODE_NO_SIZE(SUP_IOCTL_GET_PAGING_MODE): { /* validate */ @@ -3173,9 +3207,9 @@ static void supdrvGipReInitCpu(PSUPGIPCPU pGipCpu, uint64_t u64NanoTS) static DECLCALLBACK(void) supdrvGipReInitCpuCallback(RTCPUID idCpu, void *pvUser1, void *pvUser2) { PSUPGLOBALINFOPAGE pGip = (PSUPGLOBALINFOPAGE)pvUser1; - unsigned iCpu = ASMGetApicId(); + unsigned iCpu = pGip->aiCpuFromApicId[ASMGetApicId()]; - if (RT_LIKELY(iCpu < RT_ELEMENTS(pGip->aCPUs))) + if (RT_LIKELY(iCpu < pGip->cCpus && pGip->aCPUs[iCpu].idCpu == idCpu)) supdrvGipReInitCpu(&pGip->aCPUs[iCpu], *(uint64_t *)pvUser2); NOREF(pvUser2); @@ -4767,11 +4801,13 @@ static int supdrvIOCtl_LoggerSettings(PSUPDRVDEVEXT pDevExt, PSUPDRVSESSION pSes */ static int supdrvGipCreate(PSUPDRVDEVEXT pDevExt) { - PSUPGLOBALINFOPAGE pGip; - RTHCPHYS HCPhysGip; - uint32_t u32SystemResolution; - uint32_t u32Interval; - int rc; + PSUPGLOBALINFOPAGE pGip; + RTHCPHYS HCPhysGip; + uint32_t u32SystemResolution; + uint32_t u32Interval; + unsigned cCpus; + int rc; + LogFlow(("supdrvGipCreate:\n")); @@ -4781,9 +4817,20 @@ static int supdrvGipCreate(PSUPDRVDEVEXT pDevExt) Assert(!pDevExt->pGipTimer); /* - * Allocate a suitable page with a default kernel mapping. + * Check the CPU count. + */ + cCpus = RTMpGetArraySize(); + if ( cCpus > RTCPUSET_MAX_CPUS + || cCpus > 256 /*ApicId is used for the mappings*/) + { + SUPR0Printf("VBoxDrv: Too many CPUs (%u) for the GIP (max %u)\n", cCpus, RT_MIN(RTCPUSET_MAX_CPUS, 256)); + return VERR_TOO_MANY_CPUS; + } + + /* + * Allocate a contiguous set of pages with a default kernel mapping. */ - rc = RTR0MemObjAllocLow(&pDevExt->GipMemObj, PAGE_SIZE, false); + rc = RTR0MemObjAllocCont(&pDevExt->GipMemObj, RT_UOFFSETOF(SUPGLOBALINFOPAGE, aCPUs[cCpus]), false /*fExecutable*/); if (RT_FAILURE(rc)) { OSDBGPRINT(("supdrvGipCreate: failed to allocate the GIP page. rc=%d\n", rc)); @@ -4799,7 +4846,7 @@ static int supdrvGipCreate(PSUPDRVDEVEXT pDevExt) while (u32Interval < 10000000 /* 10 ms */) u32Interval += u32SystemResolution; - supdrvGipInit(pDevExt, pGip, HCPhysGip, RTTimeSystemNanoTS(), 1000000000 / u32Interval /*=Hz*/); + supdrvGipInit(pDevExt, pGip, HCPhysGip, RTTimeSystemNanoTS(), 1000000000 / u32Interval /*=Hz*/, cCpus); /* * Create the timer. @@ -4818,23 +4865,30 @@ static int supdrvGipCreate(PSUPDRVDEVEXT pDevExt) rc = RTTimerCreateEx(&pDevExt->pGipTimer, u32Interval, 0, supdrvGipSyncTimer, pDevExt); if (RT_SUCCESS(rc)) { - if (pGip->u32Mode == SUPGIPMODE_ASYNC_TSC) - rc = RTMpNotificationRegister(supdrvGipMpEvent, pDevExt); + rc = RTMpNotificationRegister(supdrvGipMpEvent, pDevExt); if (RT_SUCCESS(rc)) { - /* - * We're good. - */ - Log(("supdrvGipCreate: %ld ns interval.\n", (long)u32Interval)); - g_pSUPGlobalInfoPage = pGip; - return VINF_SUCCESS; - } + rc = RTMpOnAll(supdrvGipInitOnCpu, pDevExt, pGip); + if (RT_SUCCESS(rc)) + { + /* + * We're good. + */ + Log(("supdrvGipCreate: %u ns interval.\n", u32Interval)); + g_pSUPGlobalInfoPage = pGip; + return VINF_SUCCESS; + } - OSDBGPRINT(("supdrvGipCreate: failed register MP event notfication. rc=%d\n", rc)); + OSDBGPRINT(("supdrvGipCreate: RTMpOnAll failed with rc=%Rrc\n", rc)); + RTMpNotificationDeregister(supdrvGipMpEvent, pDevExt); + + } + else + OSDBGPRINT(("supdrvGipCreate: failed to register MP event notfication. rc=%Rrc\n", rc)); } else { - OSDBGPRINT(("supdrvGipCreate: failed create GIP timer at %ld ns interval. rc=%d\n", (long)u32Interval, rc)); + OSDBGPRINT(("supdrvGipCreate: failed create GIP timer at %u ns interval. rc=%Rrc\n", u32Interval, rc)); Assert(!pDevExt->pGipTimer); } supdrvGipDestroy(pDevExt); @@ -4905,7 +4959,7 @@ static DECLCALLBACK(void) supdrvGipSyncTimer(PRTTIMER pTimer, void *pvUser, uint uint64_t u64TSC = ASMReadTSC(); uint64_t NanoTS = RTTimeSystemNanoTS(); - supdrvGipUpdate(pDevExt->pGip, NanoTS, u64TSC, iTick); + supdrvGipUpdate(pDevExt->pGip, NanoTS, u64TSC, NIL_RTCPUID, iTick); ASMSetFlags(fOldFlags); } @@ -4926,19 +4980,111 @@ static DECLCALLBACK(void) supdrvGipAsyncTimer(PRTTIMER pTimer, void *pvUser, uin /** @todo reset the transaction number and whatnot when iTick == 1. */ if (pDevExt->idGipMaster == idCpu) - supdrvGipUpdate(pDevExt->pGip, NanoTS, u64TSC, iTick); + supdrvGipUpdate(pDevExt->pGip, NanoTS, u64TSC, idCpu, iTick); else - supdrvGipUpdatePerCpu(pDevExt->pGip, NanoTS, u64TSC, ASMGetApicId(), iTick); + supdrvGipUpdatePerCpu(pDevExt->pGip, NanoTS, u64TSC, idCpu, ASMGetApicId(), iTick); ASMSetFlags(fOldFlags); } /** + * The calling CPU should be accounted as online, update GIP accordingly. + * + * This is used by supdrvGipMpEvent as well as the supdrvGipCreate. + * + * @param pGip The GIP. + * @param idCpu The CPU ID. + */ +static void supdrvGipMpEventOnline(PSUPGLOBALINFOPAGE pGip, RTCPUID idCpu) +{ + int iCpuSet; + uint8_t idApic; + uint32_t i; + + Assert(idCpu == RTMpCpuId()); + Assert(pGip->cPossibleCpus == RTMpGetCount()); + + /* + * Update the globals. + */ + ASMAtomicWriteU16(&pGip->cPresentCpus, RTMpGetPresentCount()); + ASMAtomicWriteU16(&pGip->cOnlineCpus, RTMpGetOnlineCount()); + iCpuSet = RTMpCpuIdToSetIndex(idCpu); + if (iCpuSet >= 0) + { + Assert(RTCpuSetIsMemberByIndex(&pGip->PossibleCpuSet, iCpuSet)); + RTCpuSetAddByIndex(&pGip->OnlineCpuSet, iCpuSet); + RTCpuSetAddByIndex(&pGip->PresentCpuSet, iCpuSet); + } + + /* + * Find our entry, or allocate one if not found. + * ASSUMES that CPU IDs are constant. + */ + for (i = 0; i < pGip->cCpus; i++) + if (pGip->aCPUs[i].idCpu == idCpu) + break; + + if (i >= pGip->cCpus) + for (i = 0; i < pGip->cCpus; i++) + { + bool fRc; + ASMAtomicCmpXchgSize(&pGip->aCPUs[i].idCpu, idCpu, NIL_RTCPUID, fRc); + if (fRc) + break; + } + + AssertReturnVoid(i < pGip->cCpus); + + /* + * Update the entry. + */ + idApic = ASMGetApicId(); + ASMAtomicUoWriteU16(&pGip->aCPUs[i].idApic, idApic); + ASMAtomicUoWriteS16(&pGip->aCPUs[i].iCpuSet, (int16_t)iCpuSet); + ASMAtomicUoWriteSize(&pGip->aCPUs[i].idCpu, idCpu); + ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_ONLINE); + + /* + * Update the APIC ID and CPU set index mappings. + */ + ASMAtomicWriteU16(&pGip->aiCpuFromApicId[idApic], i); + ASMAtomicWriteU16(&pGip->aiCpuFromCpuSetIdx[iCpuSet], i); +} + + +/** + * The CPU should be accounted as offline, update the GIP accordingly. + * + * This is used by supdrvGipMpEvent. + * + * @param pGip The GIP. + * @param idCpu The CPU ID. + */ +static void supdrvGipMpEventOffline(PSUPGLOBALINFOPAGE pGip, RTCPUID idCpu) +{ + int iCpuSet; + unsigned i; + + iCpuSet = RTMpCpuIdToSetIndex(idCpu); + AssertReturnVoid(iCpuSet >= 0); + + i = pGip->aiCpuFromCpuSetIdx[iCpuSet]; + AssertReturnVoid(i < pGip->cCpus); + AssertReturnVoid(pGip->aCPUs[i].idCpu == idCpu); + + Assert(RTCpuSetIsMemberByIndex(&pGip->PossibleCpuSet, iCpuSet)); + ASMAtomicWriteSize(&pGip->aCPUs[i].enmState, SUPGIPCPUSTATE_OFFLINE); + RTCpuSetDelByIndex(&pGip->OnlineCpuSet, iCpuSet); +} + + +/** * Multiprocessor event notification callback. * - * This is used to make sue that the GIP master gets passed on to - * another CPU. + * This is used to make sure that the GIP master gets passed on to + * another CPU. It also updates the associated CPU data. * * @param enmEvent The event. * @param idCpu The cpu it applies to. @@ -4946,7 +5092,29 @@ static DECLCALLBACK(void) supdrvGipAsyncTimer(PRTTIMER pTimer, void *pvUser, uin */ static DECLCALLBACK(void) supdrvGipMpEvent(RTMPEVENT enmEvent, RTCPUID idCpu, void *pvUser) { - PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser; + PSUPDRVDEVEXT pDevExt = (PSUPDRVDEVEXT)pvUser; + PSUPGLOBALINFOPAGE pGip = pDevExt->pGip; + + /* + * Update the GIP CPU data. + */ + if (pGip) + { + switch (enmEvent) + { + case RTMPEVENT_ONLINE: + supdrvGipMpEventOnline(pGip, idCpu); + break; + case RTMPEVENT_OFFLINE: + supdrvGipMpEventOffline(pGip, idCpu); + break; + + } + } + + /* + * Make sure there is a master GIP. + */ if (enmEvent == RTMPEVENT_OFFLINE) { RTCPUID idGipMaster; @@ -5144,33 +5312,54 @@ static SUPGIPMODE supdrvGipDeterminTscMode(PSUPDRVDEVEXT pDevExt) * @param HCPhys The physical address of the GIP. * @param u64NanoTS The current nanosecond timestamp. * @param uUpdateHz The update frequency. + * @param cCpus The CPU count. */ -static void supdrvGipInit(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, RTHCPHYS HCPhys, uint64_t u64NanoTS, unsigned uUpdateHz) +static void supdrvGipInit(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, RTHCPHYS HCPhys, + uint64_t u64NanoTS, unsigned uUpdateHz, unsigned cCpus) { - unsigned i; + size_t const cbGip = RT_ALIGN_Z(RT_OFFSETOF(SUPGLOBALINFOPAGE, aCPUs[cCpus]), PAGE_SIZE); + unsigned i; #ifdef DEBUG_DARWIN_GIP - OSDBGPRINT(("supdrvGipInit: pGip=%p HCPhys=%lx u64NanoTS=%llu uUpdateHz=%d\n", pGip, (long)HCPhys, u64NanoTS, uUpdateHz)); + OSDBGPRINT(("supdrvGipInit: pGip=%p HCPhys=%lx u64NanoTS=%llu uUpdateHz=%d cCpus=%u\n", pGip, (long)HCPhys, u64NanoTS, uUpdateHz, cCpus)); #else - LogFlow(("supdrvGipInit: pGip=%p HCPhys=%lx u64NanoTS=%llu uUpdateHz=%d\n", pGip, (long)HCPhys, u64NanoTS, uUpdateHz)); + LogFlow(("supdrvGipInit: pGip=%p HCPhys=%lx u64NanoTS=%llu uUpdateHz=%d cCpus=%u\n", pGip, (long)HCPhys, u64NanoTS, uUpdateHz, cCpus)); #endif /* * Initialize the structure. */ - memset(pGip, 0, PAGE_SIZE); - pGip->u32Magic = SUPGLOBALINFOPAGE_MAGIC; - pGip->u32Version = SUPGLOBALINFOPAGE_VERSION; - pGip->u32Mode = supdrvGipDeterminTscMode(pDevExt); - pGip->u32UpdateHz = uUpdateHz; - pGip->u32UpdateIntervalNS = 1000000000 / uUpdateHz; + memset(pGip, 0, cbGip); + pGip->u32Magic = SUPGLOBALINFOPAGE_MAGIC; + pGip->u32Version = SUPGLOBALINFOPAGE_VERSION; + pGip->u32Mode = supdrvGipDeterminTscMode(pDevExt); + pGip->cCpus = (uint16_t)cCpus; + pGip->cPages = (uint16_t)(cbGip / PAGE_SIZE); + pGip->u32UpdateHz = uUpdateHz; + pGip->u32UpdateIntervalNS = 1000000000 / uUpdateHz; pGip->u64NanoTSLastUpdateHz = u64NanoTS; - - for (i = 0; i < RT_ELEMENTS(pGip->aCPUs); i++) + RTCpuSetEmpty(&pGip->OnlineCpuSet); + RTCpuSetEmpty(&pGip->PresentCpuSet); + RTMpGetSet(&pGip->PossibleCpuSet); + pGip->cOnlineCpus = RTMpGetOnlineCount(); + pGip->cPresentCpus = RTMpGetPresentCount(); + pGip->cPossibleCpus = RTMpGetCount(); + pGip->idCpuMax = RTMpGetMaxCpuId(); + for (i = 0; i < RT_ELEMENTS(pGip->aiCpuFromApicId); i++) + pGip->aiCpuFromApicId[i] = 0; + for (i = 0; i < RT_ELEMENTS(pGip->aiCpuFromCpuSetIdx); i++) + pGip->aiCpuFromCpuSetIdx[i] = UINT16_MAX; + + for (i = 0; i < cCpus; i++) { pGip->aCPUs[i].u32TransactionId = 2; pGip->aCPUs[i].u64NanoTS = u64NanoTS; pGip->aCPUs[i].u64TSC = ASMReadTSC(); + pGip->aCPUs[i].enmState = SUPGIPCPUSTATE_INVALID; + pGip->aCPUs[i].idCpu = NIL_RTCPUID; + pGip->aCPUs[i].iCpuSet = -1; + pGip->aCPUs[i].idApic = UINT8_MAX; + /* * We don't know the following values until we've executed updates. * So, we'll just pretend it's a 4 GHz CPU and adjust the history it on @@ -5192,13 +5381,28 @@ static void supdrvGipInit(PSUPDRVDEVEXT pDevExt, PSUPGLOBALINFOPAGE pGip, RTHCPH /* * Link it to the device extension. */ - pDevExt->pGip = pGip; + pDevExt->pGip = pGip; pDevExt->HCPhysGip = HCPhys; pDevExt->cGipUsers = 0; } /** + * On CPU initialization callback for RTMpOnAll. + * + * @param idCpu The CPU ID. + * @param pvUser1 The device extension. + * @param pvUser2 The GIP. + */ +static DECLCALLBACK(void) supdrvGipInitOnCpu(RTCPUID idCpu, void *pvUser1, void *pvUser2) +{ + /* This is good enough, even though it will update some of the globals a + bit to much. */ + supdrvGipMpEventOnline((PSUPGLOBALINFOPAGE)pvUser2, idCpu); +} + + +/** * Invalidates the GIP data upon termination. * * @param pGip Pointer to the read-write kernel mapping of the GIP. @@ -5241,14 +5445,14 @@ static void supdrvGipDoUpdateCpu(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pGipCpu, ui /* * Update the NanoTS. */ - ASMAtomicXchgU64(&pGipCpu->u64NanoTS, u64NanoTS); + ASMAtomicWriteU64(&pGipCpu->u64NanoTS, u64NanoTS); /* * Calc TSC delta. */ /** @todo validate the NanoTS delta, don't trust the OS to call us when it should... */ u64TSCDelta = u64TSC - pGipCpu->u64TSC; - ASMAtomicXchgU64(&pGipCpu->u64TSC, u64TSC); + ASMAtomicWriteU64(&pGipCpu->u64TSC, u64TSC); if (u64TSCDelta >> 32) { @@ -5278,8 +5482,8 @@ static void supdrvGipDoUpdateCpu(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pGipCpu, ui */ Assert(RT_ELEMENTS(pGipCpu->au32TSCHistory) == 8); iTSCHistoryHead = (pGipCpu->iTSCHistoryHead + 1) & 7; - ASMAtomicXchgU32(&pGipCpu->iTSCHistoryHead, iTSCHistoryHead); - ASMAtomicXchgU32(&pGipCpu->au32TSCHistory[iTSCHistoryHead], (uint32_t)u64TSCDelta); + ASMAtomicWriteU32(&pGipCpu->iTSCHistoryHead, iTSCHistoryHead); + ASMAtomicWriteU32(&pGipCpu->au32TSCHistory[iTSCHistoryHead], (uint32_t)u64TSCDelta); /* * UpdateIntervalTSC = average of last 8,2,1 intervals depending on update HZ. @@ -5319,13 +5523,13 @@ static void supdrvGipDoUpdateCpu(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pGipCpu, ui /* This value hasn't be checked yet.. waiting for OS/2 and 33Hz timers.. :-) */ u32UpdateIntervalTSCSlack = u32UpdateIntervalTSC >> 6; } - ASMAtomicXchgU32(&pGipCpu->u32UpdateIntervalTSC, u32UpdateIntervalTSC + u32UpdateIntervalTSCSlack); + ASMAtomicWriteU32(&pGipCpu->u32UpdateIntervalTSC, u32UpdateIntervalTSC + u32UpdateIntervalTSCSlack); /* * CpuHz. */ u64CpuHz = ASMMult2xU32RetU64(u32UpdateIntervalTSC, pGip->u32UpdateHz); - ASMAtomicXchgU64(&pGipCpu->u64CpuHz, u64CpuHz); + ASMAtomicWriteU64(&pGipCpu->u64CpuHz, u64CpuHz); } @@ -5335,9 +5539,10 @@ static void supdrvGipDoUpdateCpu(PSUPGLOBALINFOPAGE pGip, PSUPGIPCPU pGipCpu, ui * @param pGip Pointer to the GIP. * @param u64NanoTS The current nanosecond timesamp. * @param u64TSC The current TSC timesamp. + * @param idCpu The CPU ID. * @param iTick The current timer tick. */ -static void supdrvGipUpdate(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, uint64_t iTick) +static void supdrvGipUpdate(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, RTCPUID idCpu, uint64_t iTick) { /* * Determine the relevant CPU data. @@ -5347,10 +5552,12 @@ static void supdrvGipUpdate(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_ pGipCpu = &pGip->aCPUs[0]; else { - unsigned iCpu = ASMGetApicId(); - if (RT_UNLIKELY(iCpu >= RT_ELEMENTS(pGip->aCPUs))) + unsigned iCpu = pGip->aiCpuFromApicId[ASMGetApicId()]; + if (RT_UNLIKELY(iCpu >= pGip->cCpus)) return; pGipCpu = &pGip->aCPUs[iCpu]; + if (RT_UNLIKELY(pGipCpu->idCpu != idCpu)) + return; } /* @@ -5377,12 +5584,12 @@ static void supdrvGipUpdate(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_ uint32_t u32UpdateHz = (uint32_t)((UINT64_C(1000000000) * GIP_UPDATEHZ_RECALC_FREQ) / u64Delta); if (u32UpdateHz <= 2000 && u32UpdateHz >= 30) { - ASMAtomicXchgU32(&pGip->u32UpdateHz, u32UpdateHz); - ASMAtomicXchgU32(&pGip->u32UpdateIntervalNS, 1000000000 / u32UpdateHz); + ASMAtomicWriteU32(&pGip->u32UpdateHz, u32UpdateHz); + ASMAtomicWriteU32(&pGip->u32UpdateIntervalNS, 1000000000 / u32UpdateHz); } #endif } - ASMAtomicXchgU64(&pGip->u64NanoTSLastUpdateHz, u64NanoTS); + ASMAtomicWriteU64(&pGip->u64NanoTSLastUpdateHz, u64NanoTS); } /* @@ -5403,37 +5610,42 @@ static void supdrvGipUpdate(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_ * @param pGip Pointer to the GIP. * @param u64NanoTS The current nanosecond timesamp. * @param u64TSC The current TSC timesamp. - * @param iCpu The CPU index. + * @param idCpu The CPU ID. + * @param idApic The APIC id for the CPU index. * @param iTick The current timer tick. */ -static void supdrvGipUpdatePerCpu(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, unsigned iCpu, uint64_t iTick) +static void supdrvGipUpdatePerCpu(PSUPGLOBALINFOPAGE pGip, uint64_t u64NanoTS, uint64_t u64TSC, + RTCPUID idCpu, uint8_t idApic, uint64_t iTick) { - PSUPGIPCPU pGipCpu; + unsigned iCpu = pGip->aiCpuFromApicId[idApic]; - if (RT_LIKELY(iCpu < RT_ELEMENTS(pGip->aCPUs))) + if (RT_LIKELY(iCpu < pGip->cCpus)) { - pGipCpu = &pGip->aCPUs[iCpu]; - - /* - * Start update transaction. - */ - if (!(ASMAtomicIncU32(&pGipCpu->u32TransactionId) & 1)) + PSUPGIPCPU pGipCpu = &pGip->aCPUs[iCpu]; + if (pGipCpu->idCpu == idCpu) { - AssertMsgFailed(("Invalid transaction id, %#x, not odd!\n", pGipCpu->u32TransactionId)); - ASMAtomicIncU32(&pGipCpu->u32TransactionId); - pGipCpu->cErrors++; - return; - } - /* - * Update the data. - */ - supdrvGipDoUpdateCpu(pGip, pGipCpu, u64NanoTS, u64TSC, iTick); + /* + * Start update transaction. + */ + if (!(ASMAtomicIncU32(&pGipCpu->u32TransactionId) & 1)) + { + AssertMsgFailed(("Invalid transaction id, %#x, not odd!\n", pGipCpu->u32TransactionId)); + ASMAtomicIncU32(&pGipCpu->u32TransactionId); + pGipCpu->cErrors++; + return; + } - /* - * Complete transaction. - */ - ASMAtomicIncU32(&pGipCpu->u32TransactionId); + /* + * Update the data. + */ + supdrvGipDoUpdateCpu(pGip, pGipCpu, u64NanoTS, u64TSC, iTick); + + /* + * Complete transaction. + */ + ASMAtomicIncU32(&pGipCpu->u32TransactionId); + } } } diff --git a/src/VBox/HostDrivers/Support/SUPDrvIOC.h b/src/VBox/HostDrivers/Support/SUPDrvIOC.h index c2d293839..b4d0f54b7 100644 --- a/src/VBox/HostDrivers/Support/SUPDrvIOC.h +++ b/src/VBox/HostDrivers/Support/SUPDrvIOC.h @@ -1,4 +1,4 @@ -/* $Revision: 68795 $ */ +/* $Revision: 70529 $ */ /** @file * VirtualBox Support Driver - IOCtl definitions. */ @@ -192,7 +192,7 @@ typedef SUPREQHDR *PSUPREQHDR; * @todo Pending work on next major version change: * - None. */ -#define SUPDRV_IOC_VERSION 0x00160000 +#define SUPDRV_IOC_VERSION 0x00180000 /** SUP_IOCTL_COOKIE. */ typedef struct SUPCOOKIE @@ -483,8 +483,6 @@ typedef struct SUPLDRGETSYMBOL /** @name SUP_IOCTL_CALL_VMMR0 * Call the R0 VMM Entry point. - * - * @todo Might have to convert this to a big request... * @{ */ #define SUP_IOCTL_CALL_VMMR0(cbReq) SUP_CTL_CODE_SIZE(7, SUP_IOCTL_CALL_VMMR0_SIZE(cbReq)) @@ -515,6 +513,17 @@ typedef struct SUPCALLVMMR0 /** @} */ +/** @name SUP_IOCTL_CALL_VMMR0_BIG + * Version of SUP_IOCTL_CALL_VMMR0 for dealing with large requests. + * @{ + */ +#define SUP_IOCTL_CALL_VMMR0_BIG SUP_CTL_CODE_BIG(27) +#define SUP_IOCTL_CALL_VMMR0_BIG_SIZE(cbReq) RT_UOFFSETOF(SUPCALLVMMR0, abReqPkt[cbReq]) +#define SUP_IOCTL_CALL_VMMR0_BIG_SIZE_IN(cbReq) SUP_IOCTL_CALL_VMMR0_SIZE(cbReq) +#define SUP_IOCTL_CALL_VMMR0_BIG_SIZE_OUT(cbReq) SUP_IOCTL_CALL_VMMR0_SIZE(cbReq) +/** @} */ + + /** @name SUP_IOCTL_LOW_ALLOC * Allocate memory below 4GB (physically). * @{ diff --git a/src/VBox/HostDrivers/Support/SUPLib.cpp b/src/VBox/HostDrivers/Support/SUPLib.cpp index 7914872e0..17ba3a353 100644 --- a/src/VBox/HostDrivers/Support/SUPLib.cpp +++ b/src/VBox/HostDrivers/Support/SUPLib.cpp @@ -267,8 +267,8 @@ SUPR3DECL(int) SUPR3Init(PSUPDRVSESSION *ppSession) strcpy(CookieReq.u.In.szMagic, SUPCOOKIE_MAGIC); CookieReq.u.In.u32ReqVersion = SUPDRV_IOC_VERSION; const uint32_t uMinVersion = /*(SUPDRV_IOC_VERSION & 0xffff0000) == 0x00160000 - ? 0x00160000 - :*/ SUPDRV_IOC_VERSION & 0xffff0000; + ? 0x00160001 + : */ SUPDRV_IOC_VERSION & 0xffff0000; CookieReq.u.In.u32MinVersion = uMinVersion; rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_COOKIE, &CookieReq, SUP_IOCTL_COOKIE_SIZE); if ( RT_SUCCESS(rc) @@ -655,8 +655,32 @@ SUPR3DECL(int) SUPR3CallVMMR0Ex(PVMR0 pVMR0, VMCPUID idCpu, unsigned uOperation, rc = pReq->Hdr.rc; memcpy(pReqHdr, &pReq->abReqPkt[0], cbReq); } - else /** @todo may have to remove the size limits one this request... */ - AssertMsgFailedReturn(("cbReq=%#x\n", pReqHdr->cbReq), VERR_INTERNAL_ERROR); + else if (pReqHdr->cbReq <= _512K) + { + AssertPtrReturn(pReqHdr, VERR_INVALID_POINTER); + AssertReturn(pReqHdr->u32Magic == SUPVMMR0REQHDR_MAGIC, VERR_INVALID_MAGIC); + const size_t cbReq = pReqHdr->cbReq; + + PSUPCALLVMMR0 pReq = (PSUPCALLVMMR0)RTMemTmpAlloc(SUP_IOCTL_CALL_VMMR0_BIG_SIZE(cbReq)); + pReq->Hdr.u32Cookie = g_u32Cookie; + pReq->Hdr.u32SessionCookie = g_u32SessionCookie; + pReq->Hdr.cbIn = SUP_IOCTL_CALL_VMMR0_BIG_SIZE_IN(cbReq); + pReq->Hdr.cbOut = SUP_IOCTL_CALL_VMMR0_BIG_SIZE_OUT(cbReq); + pReq->Hdr.fFlags = SUPREQHDR_FLAGS_DEFAULT; + pReq->Hdr.rc = VERR_INTERNAL_ERROR; + pReq->u.In.pVMR0 = pVMR0; + pReq->u.In.idCpu = idCpu; + pReq->u.In.uOperation = uOperation; + pReq->u.In.u64Arg = u64Arg; + memcpy(&pReq->abReqPkt[0], pReqHdr, cbReq); + rc = suplibOsIOCtl(&g_supLibData, SUP_IOCTL_CALL_VMMR0_BIG, pReq, SUP_IOCTL_CALL_VMMR0_BIG_SIZE(cbReq)); + if (RT_SUCCESS(rc)) + rc = pReq->Hdr.rc; + memcpy(pReqHdr, &pReq->abReqPkt[0], cbReq); + RTMemTmpFree(pReq); + } + else + AssertMsgFailedReturn(("cbReq=%#x\n", pReqHdr->cbReq), VERR_OUT_OF_RANGE); return rc; } diff --git a/src/VBox/HostDrivers/Support/freebsd/Makefile b/src/VBox/HostDrivers/Support/freebsd/Makefile index 9493aa17d..4fda0f866 100644 --- a/src/VBox/HostDrivers/Support/freebsd/Makefile +++ b/src/VBox/HostDrivers/Support/freebsd/Makefile @@ -84,6 +84,7 @@ SRCS += \ .PATH: ${.CURDIR}/common/string SRCS += \ + RTStrCopyP.c \ strformat.c \ strformatrt.c \ strformattype.c \ @@ -132,8 +133,8 @@ SRCS += \ RTSemEventMultiWait-2-ex-generic.c \ RTSemEventMultiWaitNoResume-2-ex-generic.c \ RTTimerCreate-generic.c \ - timer-generic.c \ - mppresent-generic.c + mppresent-generic.c \ + timer-generic.c .PATH: ${.CURDIR}/r0drv SRCS += \ diff --git a/src/VBox/HostDrivers/Support/freebsd/files_vboxdrv b/src/VBox/HostDrivers/Support/freebsd/files_vboxdrv index 9a7daec38..ae2c1dd82 100755 --- a/src/VBox/HostDrivers/Support/freebsd/files_vboxdrv +++ b/src/VBox/HostDrivers/Support/freebsd/files_vboxdrv @@ -42,6 +42,7 @@ FILES_VBOXDRV_NOBIN=" \ ${PATH_ROOT}/include/iprt/handletable.h=>include/iprt/handletable.h \ ${PATH_ROOT}/include/iprt/initterm.h=>include/iprt/initterm.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/memobj.h=>include/iprt/memobj.h \ ${PATH_ROOT}/include/iprt/mp.h=>include/iprt/mp.h \ @@ -75,6 +76,7 @@ FILES_VBOXDRV_NOBIN=" \ ${PATH_ROOT}/include/VBox/sup.h=>include/VBox/sup.h \ ${PATH_ROOT}/include/VBox/types.h=>include/VBox/types.h \ ${PATH_ROOT}/include/VBox/version.h=>include/VBox/version.h \ + ${PATH_ROOT}/include/VBox/SUPDrvMangling.h=>include/VBox/SUPDrvMangling.h \ ${PATH_ROOT}/include/VBox/vmm/hwacc_vmx.h=>include/VBox/vmm/hwacc_vmx.h \ ${PATH_ROOT}/include/VBox/vmm/hwacc_svm.h=>include/VBox/vmm/hwacc_svm.h \ ${PATH_ROOT}/include/VBox/x86.h=>include/VBox/x86.h \ @@ -107,6 +109,7 @@ FILES_VBOXDRV_NOBIN=" \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/handletablectx.cpp=>common/misc/handletablectx.c \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/once.cpp=>common/misc/once.c \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/thread.cpp=>common/misc/thread.c \ + ${PATH_ROOT}/src/VBox/Runtime/common/string/RTStrCopyP.cpp=>common/string/RTStrCopyP.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformat.cpp=>common/string/strformat.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformatrt.cpp=>common/string/strformatrt.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformattype.cpp=>common/string/strformattype.c \ @@ -155,8 +158,8 @@ FILES_VBOXDRV_NOBIN=" \ ${PATH_ROOT}/src/VBox/Runtime/generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp=>generic/RTSemEventMultiWaitNoResume-2-ex-generic.c \ ${PATH_ROOT}/src/VBox/Runtime/generic/RTTimerCreate-generic.cpp=>generic/RTTimerCreate-generic.c \ ${PATH_ROOT}/src/VBox/Runtime/generic/RTMpGetArraySize-generic.cpp=>generic/RTMpGetArraySize-generic.c \ - ${PATH_ROOT}/src/VBox/Runtime/generic/timer-generic.cpp=>generic/timer-generic.c \ ${PATH_ROOT}/src/VBox/Runtime/generic/mppresent-generic.cpp=>generic/mppresent-generic.c \ + ${PATH_ROOT}/src/VBox/Runtime/generic/timer-generic.cpp=>generic/timer-generic.c \ ${PATH_ROOT}/src/VBox/Runtime/r0drv/alloc-r0drv.cpp=>r0drv/alloc-r0drv.c \ ${PATH_ROOT}/src/VBox/Runtime/r0drv/alloc-r0drv.h=>r0drv/alloc-r0drv.h \ ${PATH_ROOT}/src/VBox/Runtime/r0drv/initterm-r0drv.cpp=>r0drv/initterm-r0drv.c \ diff --git a/src/VBox/HostDrivers/Support/linux/Makefile b/src/VBox/HostDrivers/Support/linux/Makefile index e5ff2a061..32faa0a8f 100644 --- a/src/VBox/HostDrivers/Support/linux/Makefile +++ b/src/VBox/HostDrivers/Support/linux/Makefile @@ -1,4 +1,4 @@ -# $Revision: 66549 $ +# $Revision: 70883 $ ## @file # Makefile for the VirtualBox Linux Host Driver. # @@ -118,6 +118,7 @@ OBJS = \ common/misc/assert.o \ common/misc/handletable.o \ common/misc/handletablectx.o \ + common/string/RTStrCopyP.o \ common/string/strformat.o \ common/string/strformatrt.o \ common/string/strformattype.o \ @@ -135,6 +136,7 @@ OBJS = \ generic/RTSemEventMultiWait-2-ex-generic.o \ generic/RTSemEventMultiWaitNoResume-2-ex-generic.o \ generic/RTTimerCreate-generic.o \ + generic/mppresent-generic.o \ generic/uuid-generic.o \ VBox/log-vbox.o ifeq ($(BUILD_TARGET_ARCH),x86) @@ -171,16 +173,7 @@ ifeq ($(KERNELRELEASE),) Linux kernel. If this is not correct, specify \ KERN_DIR=<directory> and run Make again.) endif - # check if versions match -- works only for later 2.6 kernels - VBOX_KERN_VER := $(shell $(MAKE) -sC $(KERN_DIR) --no-print-directory kernelrelease 2> /dev/null || true) - ifneq ($(VBOX_KERN_VER),) - ifneq ($(VBOX_KERN_VER),$(shell uname -r)) - $(error Error: /usr/src/linux (version $(VBOX_KERN_VER)) does not match \ - the current kernel (version $(shell uname -r))) - endif - endif else - # build for a dedicated kernel, no version check ifneq ($(shell if test -d $(KERN_DIR); then echo yes; fi),yes) $(error Error: KERN_DIR does not point to a directory) endif @@ -236,6 +229,11 @@ ifndef INCL INCL += $(addprefix -I$(KBUILD_EXTMOD)/vboxdrv,/ /include /r0drv/linux) export INCL endif +ifneq ($(wildcard $(KBUILD_EXTMOD)/vboxdrv),) + MANGLING := $(KBUILD_EXTMOD)/vboxdrv/include/VBox/SUPDrvMangling.h +else + MANGLING := $(KBUILD_EXTMOD)/include/VBox/SUPDrvMangling.h +endif KFLAGS := -D__KERNEL__ -DMODULE -DRT_OS_LINUX -DIN_RING0 -DIN_RT_R0 \ -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -DVBOX_WITH_HARDENING ifdef VBOX_REDHAT_KABI @@ -262,7 +260,7 @@ MODULE_EXT := ko $(MODULE)-y := $(OBJS) # build defs -EXTRA_CFLAGS += $(INCL) $(KFLAGS) $(KDEBUG) +EXTRA_CFLAGS += -include $(MANGLING) $(INCL) $(KFLAGS) $(KDEBUG) all: $(MODULE) @@ -303,3 +301,12 @@ clean: endif endif # eq($(MAKECMDGOALS),clean) + +check: $(MODULE) + @if ! readelf -p __ksymtab_strings vboxdrv.ko | grep -E "\[.*\] *(RT|g_..*RT.*)"; then \ + echo "All exported IPRT symbols are properly renamed!"; \ + else \ + echo "error: Some exported IPRT symbols was not properly renamed! See above." >&2; \ + false; \ + fi + diff --git a/src/VBox/HostDrivers/Support/linux/files_vboxdrv b/src/VBox/HostDrivers/Support/linux/files_vboxdrv index e4dafc23f..e805b1dce 100755 --- a/src/VBox/HostDrivers/Support/linux/files_vboxdrv +++ b/src/VBox/HostDrivers/Support/linux/files_vboxdrv @@ -43,6 +43,7 @@ FILES_VBOXDRV_NOBIN=" \ ${PATH_ROOT}/include/iprt/list.h=>include/iprt/list.h \ ${PATH_ROOT}/include/iprt/lockvalidator.h=>include/iprt/lockvalidator.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/memobj.h=>include/iprt/memobj.h \ ${PATH_ROOT}/include/iprt/mp.h=>include/iprt/mp.h \ @@ -69,6 +70,7 @@ FILES_VBOXDRV_NOBIN=" \ ${PATH_ROOT}/include/VBox/param.h=>include/VBox/param.h \ ${PATH_ROOT}/include/VBox/sup.h=>include/VBox/sup.h \ ${PATH_ROOT}/include/VBox/types.h=>include/VBox/types.h \ + ${PATH_ROOT}/include/VBox/SUPDrvMangling.h=>include/VBox/SUPDrvMangling.h \ ${PATH_ROOT}/include/VBox/vmm/hwacc_vmx.h=>include/VBox/vmm/hwacc_vmx.h \ ${PATH_ROOT}/include/VBox/vmm/hwacc_svm.h=>include/VBox/vmm/hwacc_svm.h \ ${PATH_ROOT}/include/VBox/x86.h=>include/VBox/x86.h \ @@ -108,6 +110,7 @@ FILES_VBOXDRV_NOBIN=" \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/handletable.cpp=>common/misc/handletable.c \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/handletable.h=>common/misc/handletable.h \ ${PATH_ROOT}/src/VBox/Runtime/common/misc/handletablectx.cpp=>common/misc/handletablectx.c \ + ${PATH_ROOT}/src/VBox/Runtime/common/string/RTStrCopyP.cpp=>common/string/RTStrCopyP.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformat.cpp=>common/string/strformat.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformatrt.cpp=>common/string/strformatrt.c \ ${PATH_ROOT}/src/VBox/Runtime/common/string/strformattype.cpp=>common/string/strformattype.c \ @@ -133,6 +136,7 @@ FILES_VBOXDRV_NOBIN=" \ ${PATH_ROOT}/src/VBox/Runtime/generic/RTSemEventMultiWait-2-ex-generic.cpp=>generic/RTSemEventMultiWait-2-ex-generic.c \ ${PATH_ROOT}/src/VBox/Runtime/generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp=>generic/RTSemEventMultiWaitNoResume-2-ex-generic.c \ ${PATH_ROOT}/src/VBox/Runtime/generic/RTTimerCreate-generic.cpp=>generic/RTTimerCreate-generic.c \ + ${PATH_ROOT}/src/VBox/Runtime/generic/mppresent-generic.cpp=>generic/mppresent-generic.c \ ${PATH_ROOT}/src/VBox/Runtime/generic/uuid-generic.cpp=>generic/uuid-generic.c \ ${PATH_ROOT}/src/VBox/Runtime/r0drv/alloc-r0drv.cpp=>r0drv/alloc-r0drv.c \ ${PATH_ROOT}/src/VBox/Runtime/r0drv/alloc-r0drv.h=>r0drv/alloc-r0drv.h \ diff --git a/src/VBox/HostDrivers/VBoxNetAdp/freebsd/files_vboxnetadp b/src/VBox/HostDrivers/VBoxNetAdp/freebsd/files_vboxnetadp index ac002d4e4..6f4bc31d2 100755 --- a/src/VBox/HostDrivers/VBoxNetAdp/freebsd/files_vboxnetadp +++ b/src/VBox/HostDrivers/VBoxNetAdp/freebsd/files_vboxnetadp @@ -41,6 +41,7 @@ VBOX_VBOXNETADP_SOURCES=" \ ${PATH_ROOT}/include/iprt/heap.h=>include/iprt/heap.h \ ${PATH_ROOT}/include/iprt/initterm.h=>include/iprt/initterm.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/memobj.h=>include/iprt/memobj.h \ ${PATH_ROOT}/include/iprt/mp.h=>include/iprt/mp.h \ @@ -67,6 +68,7 @@ VBOX_VBOXNETADP_SOURCES=" \ ${PATH_ROOT}/include/VBox/sup.h=>include/VBox/sup.h \ ${PATH_ROOT}/include/VBox/types.h=>include/VBox/types.h \ ${PATH_ROOT}/include/VBox/version.h=>include/VBox/version.h \ + ${PATH_ROOT}/include/VBox/SUPDrvMangling.h=>include/VBox/SUPDrvMangling.h \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetAdp/freebsd/VBoxNetAdp-freebsd.c=>VBoxNetAdp-freebsd.c \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c=>VBoxNetAdp.c \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdpInternal.h=>VBoxNetAdpInternal.h \ diff --git a/src/VBox/HostDrivers/VBoxNetAdp/linux/Makefile b/src/VBox/HostDrivers/VBoxNetAdp/linux/Makefile index 6b0e68cf5..48a26546e 100644 --- a/src/VBox/HostDrivers/VBoxNetAdp/linux/Makefile +++ b/src/VBox/HostDrivers/VBoxNetAdp/linux/Makefile @@ -94,16 +94,7 @@ ifeq ($(KERNELRELEASE),) Linux kernel. If this is not correct, specify \ KERN_DIR=<directory> and run Make again.) endif - # check if versions match -- works only for later 2.6 kernels - VBOX_KERN_VER := $(shell $(MAKE) -sC $(KERN_DIR) --no-print-directory kernelrelease 2> /dev/null || true) - ifneq ($(VBOX_KERN_VER),) - ifneq ($(VBOX_KERN_VER),$(shell uname -r)) - $(error Error: /usr/src/linux (version $(VBOX_KERN_VER)) does not match \ - the current kernel (version $(shell uname -r))) - endif - endif else - # build for a dedicated kernel, no version check ifneq ($(shell if test -d $(KERN_DIR); then echo yes; fi),yes) $(error Error: KERN_DIR does not point to a directory) endif @@ -159,6 +150,11 @@ ifndef INCL INCL += $(addprefix -I$(KBUILD_EXTMOD)/vboxnetadp,/ /include /r0drv/linux) export INCL endif +ifneq ($(wildcard $(KBUILD_EXTMOD)/vboxnetadp),) + MANGLING := $(KBUILD_EXTMOD)/vboxnetadp/include/VBox/SUPDrvMangling.h +else + MANGLING := $(KBUILD_EXTMOD)/include/VBox/SUPDrvMangling.h +endif KFLAGS := -D__KERNEL__ -DMODULE -DRT_OS_LINUX -DIN_RING0 -DIN_RT_R0 \ -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -DVBOX_WITH_HARDENING ifdef VBOX_REDHAT_KABI @@ -193,7 +189,7 @@ MODULE_EXT := ko $(MODULE)-y := $(OBJS) # build defs -EXTRA_CFLAGS += $(INCL) $(KFLAGS) $(KDEBUG) +EXTRA_CFLAGS += -include $(MANGLING) $(INCL) $(KFLAGS) $(KDEBUG) all: $(MODULE) diff --git a/src/VBox/HostDrivers/VBoxNetAdp/linux/files_vboxnetadp b/src/VBox/HostDrivers/VBoxNetAdp/linux/files_vboxnetadp index 3d5b1cbe1..ab7c5c5d4 100755 --- a/src/VBox/HostDrivers/VBoxNetAdp/linux/files_vboxnetadp +++ b/src/VBox/HostDrivers/VBoxNetAdp/linux/files_vboxnetadp @@ -1,5 +1,5 @@ #!/bin/sh -# $Revision: 69206 $ +# $Revision: 70408 $ ## @files # Shared file between Makefile.kmk and export_modules # @@ -31,6 +31,7 @@ VBOX_VBOXNETADP_SOURCES=" \ ${PATH_ROOT}/include/iprt/heap.h=>include/iprt/heap.h \ ${PATH_ROOT}/include/iprt/initterm.h=>include/iprt/initterm.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/memobj.h=>include/iprt/memobj.h \ ${PATH_ROOT}/include/iprt/mp.h=>include/iprt/mp.h \ @@ -57,6 +58,7 @@ VBOX_VBOXNETADP_SOURCES=" \ ${PATH_ROOT}/include/VBox/vmm/stam.h=>include/VBox/vmm/stam.h \ ${PATH_ROOT}/include/VBox/sup.h=>include/VBox/sup.h \ ${PATH_ROOT}/include/VBox/types.h=>include/VBox/types.h \ + ${PATH_ROOT}/include/VBox/SUPDrvMangling.h=>include/VBox/SUPDrvMangling.h \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetAdp/linux/VBoxNetAdp-linux.c=>linux/VBoxNetAdp-linux.c \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdp.c=>VBoxNetAdp.c \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetAdp/VBoxNetAdpInternal.h=>VBoxNetAdpInternal.h \ diff --git a/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk b/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk index 0ead4b1eb..3f85bc6e1 100644 --- a/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk +++ b/src/VBox/HostDrivers/VBoxNetFlt/Makefile.kmk @@ -424,10 +424,14 @@ $(PATH_OUT)/opt_netgraph.h: $(PATH_SUB_CURRENT)/freebsd/Makefile \ $$(if $$(eq $$(VBoxNetFlt/freebsd/Makefile_VBOX_HARDENED),$$(VBOX_WITH_HARDENING)),,FORCE) \ | $$(dir $$@) - ifndef VBOX_WITH_HARDENING - $(QUIET)$(SED) -e "s;-DVBOX_WITH_HARDENING;;g" --output $@ $< - else $(QUIET)$(CP) -f $< $@ + ifndef VBOX_WITH_HARDENING + $(QUIET)$(SED) -e "s;-DVBOX_WITH_HARDENING;;g" --output $@.tmp $@ + ${QUIET}$(MV) -f $@.tmp $@ + endif + ifndef VBOX_WITH_NETFLT_VIMAGE + $(QUIET)$(SED) -e "s;-DVIMAGE;;g" --output $@.tmp $@ + ${QUIET}$(MV) -f $@.tmp $@ endif endif # freebsd diff --git a/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile b/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile index e21e63c5b..a6792b019 100644 --- a/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile +++ b/src/VBox/HostDrivers/VBoxNetFlt/freebsd/Makefile @@ -18,7 +18,7 @@ KMOD = vboxnetflt -CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -Iinclude -I. -Ir0drv -w -DVBOX_WITH_HARDENING +CFLAGS += -DRT_OS_FREEBSD -DIN_RING0 -DIN_RT_R0 -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -Iinclude -I. -Ir0drv -w -DVBOX_WITH_HARDENING -DVIMAGE .if (${MACHINE_ARCH} == "i386") CFLAGS += -DRT_ARCH_X86 diff --git a/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c b/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c index 12d2f3781..eadb7007d 100644 --- a/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c +++ b/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c @@ -97,6 +97,22 @@ static int ng_vboxnetflt_mod_event(module_t mod, int event, void *data); /** mbuf packet tag */ #define PACKET_TAG_VBOX 128 +#if defined(__FreeBSD_version) && __FreeBSD_version >= 800500 +# include <sys/jail.h> +# include <net/vnet.h> + +# define VBOXCURVNET_SET(arg) CURVNET_SET_QUIET(arg) +# define VBOXCURVNET_SET_FROM_UCRED() VBOXCURVNET_SET(CRED_TO_VNET(curthread->td_ucred)) +# define VBOXCURVNET_RESTORE() CURVNET_RESTORE() + +#else /* !defined(__FreeBSD_version) || __FreeBSD_version < 800500 */ + +# define VBOXCURVNET_SET(arg) +# define VBOXCURVNET_SET_FROM_UCRED() +# define VBOXCURVNET_RESTORE() + +#endif /* !defined(__FreeBSD_version) || __FreeBSD_version < 800500 */ + /* * Netgraph command list, we don't support any * additional commands. @@ -322,6 +338,7 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p item) struct m_tag *mtag; bool fActive; + VBOXCURVNET_SET(ifp->if_vnet); fActive = vboxNetFltTryRetainBusyActive(pThis); NGI_GET_M(item, m); @@ -346,6 +363,7 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p item) ether_demux(ifp, m); if (fActive) vboxNetFltRelease(pThis, true /*fBusy*/); + VBOXCURVNET_RESTORE(); return (0); } mtx_lock_spin(&pThis->u.s.inq.ifq_mtx); @@ -363,6 +381,7 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p item) int rc = ether_output_frame(ifp, m); if (fActive) vboxNetFltRelease(pThis, true /*fBusy*/); + VBOXCURVNET_RESTORE(); return rc; } mtx_lock_spin(&pThis->u.s.outq.ifq_mtx); @@ -377,6 +396,7 @@ static int ng_vboxnetflt_rcvdata(hook_p hook, item_p item) if (fActive) vboxNetFltRelease(pThis, true /*fBusy*/); + VBOXCURVNET_RESTORE(); return (0); } @@ -409,6 +429,7 @@ static void vboxNetFltFreeBSDinput(void *arg, int pending) bool fDropIt = false, fActive; PINTNETSG pSG; + VBOXCURVNET_SET(ifp->if_vnet); vboxNetFltRetain(pThis, true /* fBusy */); for (;;) { @@ -438,6 +459,7 @@ static void vboxNetFltFreeBSDinput(void *arg, int pending) ether_demux(ifp, m); } vboxNetFltRelease(pThis, true /* fBusy */); + VBOXCURVNET_RESTORE(); } /** @@ -452,6 +474,7 @@ static void vboxNetFltFreeBSDoutput(void *arg, int pending) bool fDropIt = false, fActive; PINTNETSG pSG; + VBOXCURVNET_SET(ifp->if_vnet); vboxNetFltRetain(pThis, true /* fBusy */); for (;;) { @@ -481,6 +504,7 @@ static void vboxNetFltFreeBSDoutput(void *arg, int pending) ether_output_frame(ifp, m); } vboxNetFltRelease(pThis, true /* fBusy */); + VBOXCURVNET_RESTORE(); } /** @@ -498,6 +522,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, ui int error; ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *); + VBOXCURVNET_SET(ifp->if_vnet); if (fDst & INTNETTRUNKDIR_WIRE) { @@ -539,6 +564,7 @@ int vboxNetFltPortOsXmit(PVBOXNETFLTINS pThis, void *pvIfData, PINTNETSG pSG, ui m->m_pkthdr.rcvif = ifp; ifp->if_input(ifp, m); } + VBOXCURVNET_RESTORE(); return VINF_SUCCESS; } @@ -556,6 +582,7 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext) node_p node; RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; + VBOXCURVNET_SET_FROM_UCRED(); NOREF(pvContext); ifp = ifunit(pThis->szName); if (ifp == NULL) @@ -602,6 +629,7 @@ int vboxNetFltOsInitInstance(PVBOXNETFLTINS pThis, void *pvContext) pThis->pSwitchPort->pfnReportNoPreemptDsts(pThis->pSwitchPort, 0 /* none */); vboxNetFltRelease(pThis, true /*fBusy*/); } + VBOXCURVNET_RESTORE(); return VINF_SUCCESS; } @@ -611,6 +639,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis) struct ifnet *ifp, *ifp0; ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *); + VBOXCURVNET_SET(ifp->if_vnet); /* * Attempt to check if the interface is still there and re-initialize if * something has changed. @@ -628,6 +657,7 @@ bool vboxNetFltOsMaybeRediscovered(PVBOXNETFLTINS pThis) vboxNetFltOsDeleteInstance(pThis); vboxNetFltOsInitInstance(pThis, NULL); } + VBOXCURVNET_RESTORE(); return !ASMAtomicUoReadBool(&pThis->fDisconnectedFromHost); } @@ -669,6 +699,7 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive) Log(("%s: fActive:%d\n", __func__, fActive)); ifp = ASMAtomicUoReadPtrT(&pThis->u.s.ifp, struct ifnet *); + VBOXCURVNET_SET(ifp->if_vnet); node = ASMAtomicUoReadPtrT(&pThis->u.s.node, node_p); memset(&ifreq, 0, sizeof(struct ifreq)); @@ -742,6 +773,7 @@ void vboxNetFltPortOsSetActive(PVBOXNETFLTINS pThis, bool fActive) strlcpy(rm->ourhook, "output", NG_HOOKSIZ); NG_SEND_MSG_PATH(error, node, msg, path, 0); } + VBOXCURVNET_RESTORE(); } int vboxNetFltOsDisconnectIt(PVBOXNETFLTINS pThis) diff --git a/src/VBox/HostDrivers/VBoxNetFlt/freebsd/files_vboxnetflt b/src/VBox/HostDrivers/VBoxNetFlt/freebsd/files_vboxnetflt index c49c018d5..691e18fe7 100755 --- a/src/VBox/HostDrivers/VBoxNetFlt/freebsd/files_vboxnetflt +++ b/src/VBox/HostDrivers/VBoxNetFlt/freebsd/files_vboxnetflt @@ -40,6 +40,7 @@ VBOX_VBOXNETFLT_SOURCES=" \ ${PATH_ROOT}/include/iprt/heap.h=>include/iprt/heap.h \ ${PATH_ROOT}/include/iprt/initterm.h=>include/iprt/initterm.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/memobj.h=>include/iprt/memobj.h \ ${PATH_ROOT}/include/iprt/mp.h=>include/iprt/mp.h \ @@ -67,6 +68,7 @@ VBOX_VBOXNETFLT_SOURCES=" \ ${PATH_ROOT}/include/VBox/sup.h=>include/VBox/sup.h \ ${PATH_ROOT}/include/VBox/types.h=>include/VBox/types.h \ ${PATH_ROOT}/include/VBox/version.h=>include/VBox/version.h \ + ${PATH_ROOT}/include/VBox/SUPDrvMangling.h=>include/VBox/SUPDrvMangling.h \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetFlt/freebsd/VBoxNetFlt-freebsd.c=>VBoxNetFlt-freebsd.c \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c=>VBoxNetFlt.c \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h=>VBoxNetFltInternal.h \ diff --git a/src/VBox/HostDrivers/VBoxNetFlt/linux/Makefile b/src/VBox/HostDrivers/VBoxNetFlt/linux/Makefile index 240b6c041..1a42c5e9d 100644 --- a/src/VBox/HostDrivers/VBoxNetFlt/linux/Makefile +++ b/src/VBox/HostDrivers/VBoxNetFlt/linux/Makefile @@ -98,16 +98,7 @@ ifeq ($(KERNELRELEASE),) Linux kernel. If this is not correct, specify \ KERN_DIR=<directory> and run Make again.) endif - # check if versions match -- works only for later 2.6 kernels - VBOX_KERN_VER := $(shell $(MAKE) -sC $(KERN_DIR) --no-print-directory kernelrelease 2> /dev/null || true) - ifneq ($(VBOX_KERN_VER),) - ifneq ($(VBOX_KERN_VER),$(shell uname -r)) - $(error Error: /usr/src/linux (version $(VBOX_KERN_VER)) does not match \ - the current kernel (version $(shell uname -r))) - endif - endif else - # build for a dedicated kernel, no version check ifneq ($(shell if test -d $(KERN_DIR); then echo yes; fi),yes) $(error Error: KERN_DIR does not point to a directory) endif @@ -163,6 +154,11 @@ ifndef INCL INCL += $(addprefix -I$(KBUILD_EXTMOD)/vboxnetflt,/ /include /r0drv/linux) export INCL endif +ifneq ($(wildcard $(KBUILD_EXTMOD)/vboxnetflt),) + MANGLING := $(KBUILD_EXTMOD)/vboxnetflt/include/VBox/SUPDrvMangling.h +else + MANGLING := $(KBUILD_EXTMOD)/include/VBox/SUPDrvMangling.h +endif KFLAGS := -D__KERNEL__ -DMODULE -DRT_OS_LINUX -DIN_RING0 -DIN_RT_R0 \ -DIN_SUP_R0 -DVBOX -DRT_WITH_VBOX -DVBOX_WITH_HARDENING ifdef VBOX_REDHAT_KABI @@ -197,7 +193,7 @@ MODULE_EXT := ko $(MODULE)-y := $(OBJS) # build defs -EXTRA_CFLAGS += $(INCL) $(KFLAGS) $(KDEBUG) +EXTRA_CFLAGS += -include $(MANGLING) $(INCL) $(KFLAGS) $(KDEBUG) all: $(MODULE) diff --git a/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c b/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c index 3b4caac3b..dcbe6829f 100644 --- a/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c +++ b/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c @@ -1335,7 +1335,9 @@ static int vboxNetFltLinuxPacketHandler(struct sk_buff *pBuf, #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18) Log3(("vboxNetFltLinuxPacketHandler: skb len=%u data_len=%u truesize=%u next=%p nr_frags=%u gso_size=%u gso_seqs=%u gso_type=%x frag_list=%p pkt_type=%x\n", pBuf->len, pBuf->data_len, pBuf->truesize, pBuf->next, skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->gso_size, skb_shinfo(pBuf)->gso_segs, skb_shinfo(pBuf)->gso_type, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type)); +# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) Log4(("vboxNetFltLinuxPacketHandler: packet dump follows:\n%.*Rhxd\n", pBuf->len-pBuf->data_len, skb_mac_header(pBuf))); +# endif #else Log3(("vboxNetFltLinuxPacketHandler: skb len=%u data_len=%u truesize=%u next=%p nr_frags=%u tso_size=%u tso_seqs=%u frag_list=%p pkt_type=%x\n", pBuf->len, pBuf->data_len, pBuf->truesize, pBuf->next, skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->tso_size, skb_shinfo(pBuf)->tso_segs, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type)); @@ -1378,7 +1380,9 @@ static int vboxNetFltLinuxPacketHandler(struct sk_buff *pBuf, # if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18) Log3(("vboxNetFltLinuxPacketHandler: skb copy len=%u data_len=%u truesize=%u next=%p nr_frags=%u gso_size=%u gso_seqs=%u gso_type=%x frag_list=%p pkt_type=%x\n", pBuf->len, pBuf->data_len, pBuf->truesize, pBuf->next, skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->gso_size, skb_shinfo(pBuf)->gso_segs, skb_shinfo(pBuf)->gso_type, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type)); +# if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 22) Log4(("vboxNetFltLinuxPacketHandler: packet dump follows:\n%.*Rhxd\n", pBuf->len-pBuf->data_len, skb_mac_header(pBuf))); +# endif # else Log3(("vboxNetFltLinuxPacketHandler: skb copy len=%u data_len=%u truesize=%u next=%p nr_frags=%u tso_size=%u tso_seqs=%u frag_list=%p pkt_type=%x\n", pBuf->len, pBuf->data_len, pBuf->truesize, pBuf->next, skb_shinfo(pBuf)->nr_frags, skb_shinfo(pBuf)->tso_size, skb_shinfo(pBuf)->tso_segs, skb_shinfo(pBuf)->frag_list, pBuf->pkt_type)); diff --git a/src/VBox/HostDrivers/VBoxNetFlt/linux/files_vboxnetflt b/src/VBox/HostDrivers/VBoxNetFlt/linux/files_vboxnetflt index db676b8d3..8e22c249a 100755 --- a/src/VBox/HostDrivers/VBoxNetFlt/linux/files_vboxnetflt +++ b/src/VBox/HostDrivers/VBoxNetFlt/linux/files_vboxnetflt @@ -31,6 +31,7 @@ VBOX_VBOXNETFLT_SOURCES=" \ ${PATH_ROOT}/include/iprt/heap.h=>include/iprt/heap.h \ ${PATH_ROOT}/include/iprt/initterm.h=>include/iprt/initterm.h \ ${PATH_ROOT}/include/iprt/log.h=>include/iprt/log.h \ + ${PATH_ROOT}/include/iprt/mangling.h=>include/iprt/mangling.h \ ${PATH_ROOT}/include/iprt/mem.h=>include/iprt/mem.h \ ${PATH_ROOT}/include/iprt/memobj.h=>include/iprt/memobj.h \ ${PATH_ROOT}/include/iprt/mp.h=>include/iprt/mp.h \ @@ -60,6 +61,7 @@ VBOX_VBOXNETFLT_SOURCES=" \ ${PATH_ROOT}/include/VBox/vmm/stam.h=>include/VBox/vmm/stam.h \ ${PATH_ROOT}/include/VBox/sup.h=>include/VBox/sup.h \ ${PATH_ROOT}/include/VBox/types.h=>include/VBox/types.h \ + ${PATH_ROOT}/include/VBox/SUPDrvMangling.h=>include/VBox/SUPDrvMangling.h \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetFlt/linux/VBoxNetFlt-linux.c=>linux/VBoxNetFlt-linux.c \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFlt.c=>VBoxNetFlt.c \ ${PATH_ROOT}/src/VBox/HostDrivers/VBoxNetFlt/VBoxNetFltInternal.h=>VBoxNetFltInternal.h \ diff --git a/src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBMon-solaris.c b/src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBMon-solaris.c index f5dcdbddc..4ce34cee7 100644 --- a/src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBMon-solaris.c +++ b/src/VBox/HostDrivers/VBoxUSB/solaris/VBoxUSBMon-solaris.c @@ -221,18 +221,24 @@ int _init(void) * Initialize global mutex. */ mutex_init(&g_VBoxUSBMonSolarisMtx, NULL, MUTEX_DRIVER, NULL); - rc = ddi_soft_state_init(&g_pVBoxUSBMonSolarisState, sizeof(vboxusbmon_state_t), 1); - if (!rc) + rc = VBoxUSBFilterInit(); + if (RT_SUCCESS(rc)) { - rc = mod_install(&g_VBoxUSBMonSolarisModLinkage); + rc = ddi_soft_state_init(&g_pVBoxUSBMonSolarisState, sizeof(vboxusbmon_state_t), 1); if (!rc) - return rc; + { + rc = mod_install(&g_VBoxUSBMonSolarisModLinkage); + if (!rc) + return rc; - LogRel((DEVICE_NAME ":mod_install failed! rc=%d\n", rc)); - ddi_soft_state_fini(&g_pVBoxUSBMonSolarisState); + LogRel((DEVICE_NAME ":mod_install failed! rc=%d\n", rc)); + ddi_soft_state_fini(&g_pVBoxUSBMonSolarisState); + } + else + LogRel((DEVICE_NAME ":ddi_soft_state_init failed! rc=%d\n", rc)); } else - LogRel((DEVICE_NAME ":ddi_soft_state_init failed! rc=%d\n", rc)); + LogRel((DEVICE_NAME ":VBoxUSBFilterInit failed! rc=%d\n", rc)); mutex_destroy(&g_VBoxUSBMonSolarisMtx); RTR0Term(); @@ -254,6 +260,7 @@ int _fini(void) if (!rc) { ddi_soft_state_fini(&g_pVBoxUSBMonSolarisState); + VBoxUSBFilterTerm(); mutex_destroy(&g_VBoxUSBMonSolarisMtx); RTR0Term(); diff --git a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp index ac35fc1df..f768aeb6c 100644 --- a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp +++ b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.cpp @@ -312,22 +312,25 @@ NTSTATUS _stdcall VBoxUSBMonCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp) RtlFreeUnicodeString(&UnicodeName); } - // - // Let us use remove lock to keep count of IRPs so that we don't - // detach and delete our deviceobject until all pending I/Os in our - // devstack are completed. Remlock is required to protect us from - // various race conditions where our driver can get unloaded while we - // are still running dispatch or completion code. - // - - IoInitializeRemoveLock (&pDevExt->RemoveLock , POOL_TAG, - 1, // MaxLockedMinutes - 100); // HighWatermark, this parameter is - // used only on checked build. Specifies - // the maximum number of outstanding - // acquisitions allowed on the lock - - DebugPrint(("VBoxUSBMon: remove lock = %x\n", pDevExt->RemoveLock.Common.RemoveEvent)); + if (InterlockedCompareExchange(&pDevExt->fRemoveLockInitialized, 1, 0) == 0) + { + // + // Let us use remove lock to keep count of IRPs so that we don't + // detach and delete our deviceobject until all pending I/Os in our + // devstack are completed. Remlock is required to protect us from + // various race conditions where our driver can get unloaded while we + // are still running dispatch or completion code. + // + + IoInitializeRemoveLock (&pDevExt->RemoveLock , POOL_TAG, + 1, // MaxLockedMinutes + 100); // HighWatermark, this parameter is + // used only on checked build. Specifies + // the maximum number of outstanding + // acquisitions allowed on the lock + + DebugPrint(("VBoxUSBMon: remove lock = %x\n", pDevExt->RemoveLock.Common.RemoveEvent)); + } } status = IoAcquireRemoveLock(&pDevExt->RemoveLock, ControlDeviceObject); diff --git a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h index 619a46d6e..2136dda5c 100644 --- a/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h +++ b/src/VBox/HostDrivers/VBoxUSB/win/Monitor/USBMon.h @@ -82,6 +82,8 @@ typedef struct _DEVICE_EXTENSION // IO_REMOVE_LOCK RemoveLock; + /* Whether the lock has been initialized. */ + LONG fRemoveLockInitialized; /* Number of times the device was opened. */ LONG cOpened; diff --git a/src/VBox/HostDrivers/linux/Makefile b/src/VBox/HostDrivers/linux/Makefile index 5a5effad4..a95109bd5 100644 --- a/src/VBox/HostDrivers/linux/Makefile +++ b/src/VBox/HostDrivers/linux/Makefile @@ -57,7 +57,6 @@ all: echo; \ fi - install: @$(MAKE) KBUILD_VERBOSE=$(KBUILD_VERBOSE) -C vboxdrv install @if [ -d vboxnetflt ]; then \ @@ -77,6 +76,9 @@ clean: fi rm -f vboxdrv.ko vboxnetflt.ko vboxnetadp.ko +check: + @$(MAKE) KBUILD_VERBOSE=$(KBUILD_VERBOSE) -C vboxdrv check + unload: @for module in vboxpci vboxnetadp vboxnetflt vboxdrv; do \ if grep "^$$module " /proc/modules >/dev/null; then \ diff --git a/src/VBox/HostServices/GuestControl/service.cpp b/src/VBox/HostServices/GuestControl/service.cpp index 8deaf117d..905c6b961 100644 --- a/src/VBox/HostServices/GuestControl/service.cpp +++ b/src/VBox/HostServices/GuestControl/service.cpp @@ -359,6 +359,11 @@ int Service::paramBufferAllocate(PVBOXGUESTCTRPARAMBUFFER pBuf, uint32_t uMsg, u paParms[i].u.pointer.addr, pBuf->pParms[i].u.pointer.size); } + else + { + /* Size is 0 -- make sure we don't have any pointer. */ + pBuf->pParms[i].u.pointer.addr = NULL; + } break; default: @@ -412,7 +417,7 @@ int Service::paramBufferAssign(PVBOXGUESTCTRPARAMBUFFER pBuf, uint32_t cParms, V int rc = VINF_SUCCESS; if (cParms != pBuf->uParmCount) { - LogFlowFunc(("Parameter count does not match (%u (buffer), %u (guest))\n", + LogFlowFunc(("Parameter count does not match: %u (host) vs. %u (guest)\n", pBuf->uParmCount, cParms)); rc = VERR_INVALID_PARAMETER; } @@ -435,9 +440,14 @@ int Service::paramBufferAssign(PVBOXGUESTCTRPARAMBUFFER pBuf, uint32_t cParms, V case VBOX_HGCM_SVC_PARM_PTR: if (paParms[i].u.pointer.size >= pBuf->pParms[i].u.pointer.size) { - memcpy(paParms[i].u.pointer.addr, - pBuf->pParms[i].u.pointer.addr, - pBuf->pParms[i].u.pointer.size); + /* Only copy buffer if there actually is something to copy. */ + if (pBuf->pParms[i].u.pointer.size) + { + AssertPtr(pBuf->pParms[i].u.pointer.addr); + memcpy(paParms[i].u.pointer.addr, + pBuf->pParms[i].u.pointer.addr, + pBuf->pParms[i].u.pointer.size); + } } else rc = VERR_BUFFER_OVERFLOW; @@ -643,6 +653,16 @@ int Service::retrieveNextHostCmd(uint32_t u32ClientID, VBOXHGCMCALLHANDLE callHa mHostCmds.pop_front(); } } + else + { + /* Client did not understand the message or something else weird happened. Try again one + * more time and drop it if it didn't get handled then. */ + if (++curCmd.mTries > 1) + { + paramBufferFree(&curCmd.mParmBuf); + mHostCmds.pop_front(); + } + } } return rc; } diff --git a/src/VBox/HostServices/GuestProperties/testcase/tstGuestPropSvc.cpp b/src/VBox/HostServices/GuestProperties/testcase/tstGuestPropSvc.cpp index 76102b568..76c563e3f 100644 --- a/src/VBox/HostServices/GuestProperties/testcase/tstGuestPropSvc.cpp +++ b/src/VBox/HostServices/GuestProperties/testcase/tstGuestPropSvc.cpp @@ -22,6 +22,12 @@ #include <VBox/HostServices/GuestPropertySvc.h> #include <iprt/initterm.h> #include <iprt/stream.h> +#include <iprt/test.h> + +/******************************************************************************* +* Global Variables * +*******************************************************************************/ +static RTTEST g_hTest = NIL_RTTEST; using namespace guestProp; @@ -65,20 +71,26 @@ struct flagStrings /** How the functions should output the string again */ const char *pcszOut; } -validFlagStrings[] = +g_validFlagStrings[] = { - { " ", "" }, - { "transient, ", "TRANSIENT" }, - { " rdOnLyHOST, transIENT , READONLY ", "TRANSIENT, READONLY" }, - { " rdonlyguest", "RDONLYGUEST" }, - { "rdonlyhost ", "RDONLYHOST" } + /* pcszIn, pcszOut */ + { " ", "" }, + { "transient, ", "TRANSIENT" }, + { " rdOnLyHOST, transIENT , READONLY ", "TRANSIENT, READONLY" }, + { " rdonlyguest", "RDONLYGUEST" }, + { "rdonlyhost ", "RDONLYHOST" }, + { "transient, transreset, rdonlyhost", "TRANSIENT, RDONLYHOST, TRANSRESET" }, + { "transient, transreset, rdonlyguest", "TRANSIENT, RDONLYGUEST, TRANSRESET" }, /* max length */ + { "rdonlyguest, rdonlyhost", "READONLY" }, + { "transient, transreset, ", "TRANSIENT, TRANSRESET" }, /* Don't combine them ... */ + { "transreset, ", "TRANSIENT, TRANSRESET" }, /* ... instead expand transreset for old adds. */ }; /** * A list of invalid flag strings for testConvertFlags. The flag conversion * functions should reject these. */ -const char *invalidFlagStrings[] = +const char *g_invalidFlagStrings[] = { "RDONLYHOST,,", " TRANSIENT READONLY" @@ -92,63 +104,65 @@ const char *invalidFlagStrings[] = int testConvertFlags() { int rc = VINF_SUCCESS; + char *pszFlagBuffer = (char *)RTTestGuardedAllocTail(g_hTest, MAX_FLAGS_LEN); + RTPrintf("tstGuestPropSvc: Testing conversion of valid flags strings.\n"); - for (unsigned i = 0; i < RT_ELEMENTS(validFlagStrings) && RT_SUCCESS(rc); ++i) + for (unsigned i = 0; i < RT_ELEMENTS(g_validFlagStrings) && RT_SUCCESS(rc); ++i) { - char szFlagBuffer[MAX_FLAGS_LEN * 2]; uint32_t fFlags; - rc = validateFlags(validFlagStrings[i].pcszIn, &fFlags); + rc = validateFlags(g_validFlagStrings[i].pcszIn, &fFlags); if (RT_FAILURE(rc)) - RTPrintf("tstGuestPropSvc: FAILURE - Failed to validate flag string '%s'.\n", validFlagStrings[i].pcszIn); + RTPrintf("tstGuestPropSvc: FAILURE - Failed to validate flag string '%s'.\n", g_validFlagStrings[i].pcszIn); if (RT_SUCCESS(rc)) { - rc = writeFlags(fFlags, szFlagBuffer); + rc = writeFlags(fFlags, pszFlagBuffer); if (RT_FAILURE(rc)) RTPrintf("tstGuestPropSvc: FAILURE - Failed to convert flag string '%s' back to a string.\n", - validFlagStrings[i].pcszIn); + g_validFlagStrings[i].pcszIn); } - if (RT_SUCCESS(rc) && (strlen(szFlagBuffer) > MAX_FLAGS_LEN - 1)) + if (RT_SUCCESS(rc) && (strlen(pszFlagBuffer) > MAX_FLAGS_LEN - 1)) { RTPrintf("tstGuestPropSvc: FAILURE - String '%s' converts back to a flag string which is too long.\n", - validFlagStrings[i].pcszIn); + g_validFlagStrings[i].pcszIn); rc = VERR_TOO_MUCH_DATA; } - if (RT_SUCCESS(rc) && (strcmp(szFlagBuffer, validFlagStrings[i].pcszOut) != 0)) + if (RT_SUCCESS(rc) && (strcmp(pszFlagBuffer, g_validFlagStrings[i].pcszOut) != 0)) { RTPrintf("tstGuestPropSvc: FAILURE - String '%s' converts back to '%s' instead of to '%s'\n", - validFlagStrings[i].pcszIn, szFlagBuffer, - validFlagStrings[i].pcszOut); + g_validFlagStrings[i].pcszIn, pszFlagBuffer, + g_validFlagStrings[i].pcszOut); rc = VERR_PARSE_ERROR; } } if (RT_SUCCESS(rc)) { RTPrintf("Testing rejection of invalid flags strings.\n"); - for (unsigned i = 0; i < RT_ELEMENTS(invalidFlagStrings) && RT_SUCCESS(rc); ++i) + for (unsigned i = 0; i < RT_ELEMENTS(g_invalidFlagStrings) && RT_SUCCESS(rc); ++i) { uint32_t fFlags; /* This is required to fail. */ - if (RT_SUCCESS(validateFlags(invalidFlagStrings[i], &fFlags))) + if (RT_SUCCESS(validateFlags(g_invalidFlagStrings[i], &fFlags))) { RTPrintf("String '%s' was incorrectly accepted as a valid flag string.\n", - invalidFlagStrings[i]); + g_invalidFlagStrings[i]); rc = VERR_PARSE_ERROR; } } } if (RT_SUCCESS(rc)) { - char szFlagBuffer[MAX_FLAGS_LEN * 2]; uint32_t u32BadFlags = ALLFLAGS << 1; RTPrintf("Testing rejection of an invalid flags field.\n"); /* This is required to fail. */ - if (RT_SUCCESS(writeFlags(u32BadFlags, szFlagBuffer))) + if (RT_SUCCESS(writeFlags(u32BadFlags, pszFlagBuffer))) { RTPrintf("Flags 0x%x were incorrectly written out as '%.*s'\n", - u32BadFlags, MAX_FLAGS_LEN, szFlagBuffer); + u32BadFlags, MAX_FLAGS_LEN, pszFlagBuffer); rc = VERR_PARSE_ERROR; } } + + RTTestGuardedFree(g_hTest, pszFlagBuffer); return rc; } @@ -1037,11 +1051,18 @@ int testDelPropROGuest(VBOXHGCMSVCFNTABLE *pTable) int main(int argc, char **argv) { - VBOXHGCMSVCFNTABLE svcTable; - VBOXHGCMSVCHELPERS svcHelpers; + VBOXHGCMSVCFNTABLE svcTable; + VBOXHGCMSVCHELPERS svcHelpers; + RTEXITCODE rcExit; + + rcExit = RTTestInitAndCreate("tstGuestPropSvc", &g_hTest); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + RTTestBanner(g_hTest); +/** @todo convert the rest of this testcase. */ initTable(&svcTable, &svcHelpers); - RTR3Init(); + if (RT_FAILURE(testConvertFlags())) return 1; /* The function is inside the service, not HGCM. */ @@ -1078,6 +1099,6 @@ int main(int argc, char **argv) return 1; if (RT_FAILURE(testDelPropROGuest(&svcTable))) return 1; - RTPrintf("tstGuestPropSvc: SUCCEEDED.\n"); - return 0; + + return RTTestSummaryAndDestroy(g_hTest); } diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m index 49063aee1..1943d1355 100644 --- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m +++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_cocoa_helper.m @@ -1457,7 +1457,7 @@ void cocoaViewDestroy(NativeNSViewRef pView) int b = [win retainCount]; // for (; b > 1; --b) // [win performSelector:@selector(release)] - [win performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO]; + [win performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:YES]; // [win release]; /* There seems to be a bug in the performSelector method which is called in @@ -1466,7 +1466,7 @@ void cocoaViewDestroy(NativeNSViewRef pView) * decremented. */ int a = [pView retainCount]; // for (; a > 1; --a) - [pView performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO]; + [pView performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:YES]; // [pView release]; [pPool release]; diff --git a/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c b/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c index bb49876ae..33d59bb99 100644 --- a/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c +++ b/src/VBox/HostServices/SharedOpenGL/render/renderspu_init.c @@ -406,8 +406,34 @@ static int renderSPUCleanup(void) #ifdef RT_OS_WINDOWS if (render_spu.dwWinThreadId) { - PostThreadMessage(render_spu.dwWinThreadId, WM_QUIT, 0, 0); - WaitForSingleObject(render_spu.hWinThreadReadyEvent, INFINITE); + HANDLE hNative; + + hNative = OpenThread(SYNCHRONIZE|THREAD_QUERY_INFORMATION|THREAD_TERMINATE, + false, render_spu.dwWinThreadId); + if (!hNative) + { + crWarning("Failed to get handle for window thread(%#x)", GetLastError()); + } + + if (PostThreadMessage(render_spu.dwWinThreadId, WM_QUIT, 0, 0)) + { + WaitForSingleObject(render_spu.hWinThreadReadyEvent, INFINITE); + + /*wait for os thread to actually finish*/ + if (hNative && WaitForSingleObject(hNative, 3000)==WAIT_TIMEOUT) + { + crDebug("Wait failed, terminating"); + if (!TerminateThread(hNative, 1)) + { + crWarning("TerminateThread failed"); + } + } + } + + if (hNative) + { + CloseHandle(hNative); + } } CloseHandle(render_spu.hWinThreadReadyEvent); render_spu.hWinThreadReadyEvent = NULL; diff --git a/src/VBox/Installer/common/virtualbox.desktop.in b/src/VBox/Installer/common/virtualbox.desktop.in index 570de42b5..e87bb7fe4 100644 --- a/src/VBox/Installer/common/virtualbox.desktop.in +++ b/src/VBox/Installer/common/virtualbox.desktop.in @@ -6,9 +6,9 @@ GenericName=Virtual Machine Type=Application Exec=VirtualBox %U TryExec=VirtualBox -MimeType=application/x-virtualbox-vbox;application/x-virtualbox-vbox-extpack;application/x-virtualbox-ovf;application/x-virtualbox-ova +MimeType=application/x-virtualbox-vbox;application/x-virtualbox-vbox-extpack;application/x-virtualbox-ovf;application/x-virtualbox-ova; DocPath=file://@VBOX_DOC_PATH@/UserManual.pdf -Icon=VBox +Icon=virtualbox Categories=Emulator;System;X-MandrivaLinux-System;Application; Comment=Run several virtual systems on a single host computer Comment[de]=Mehrere virtuelle Maschinen auf einem einzigen Rechner ausführen diff --git a/src/VBox/Installer/darwin/Makefile.kmk b/src/VBox/Installer/darwin/Makefile.kmk index 363601e9a..34c67ccf8 100644 --- a/src/VBox/Installer/darwin/Makefile.kmk +++ b/src/VBox/Installer/darwin/Makefile.kmk @@ -629,7 +629,8 @@ VBOX_DI_VBAPP_PROGS = \ MacOS/VirtualBoxVM \ MacOS/VBoxNetAdpCtl \ MacOS/VBoxNetDHCP \ - MacOS/VBoxExtPackHelperApp + MacOS/VBoxExtPackHelperApp \ + MacOS/VBoxBalloonCtrl ifdef VBOX_WITH_WEBSERVICES VBOX_DI_VBAPP_PROGS += \ MacOS/vboxwebsrv @@ -745,6 +746,7 @@ $(VBOX_PATH_PACK_TMP)/Packages/VirtualBox.pkg: \ $(if-expr defined(VBOX_WITH_PYTHON), $(addprefix $(VBOX_PATH_DIST)/, $(VBOX_DI_VBAPP_PYTHON_FILES)),) \ $(if-expr defined(VBOX_WITH_JXPCOM), $(addprefix $(VBOX_PATH_DIST)/, sdk/bindings/xpcom/java/vboxjxpcom.jar),) \ $(if $(VBOX_WITH_WEBSERVICES),$(VBOX_PATH_DI_SRC)/VirtualBox/org.virtualbox.vboxwebsrv.plist,) \ + $(VBOX_PATH_DI_SRC)/VirtualBox/org.virtualbox.vboxballoonctrl.plist \ $(VBOX_DARWIN_INST_DEP_ON_MAKEFILE) $(call MSG_TOOL,PackageMaker,,,$@) @# Cleanup any previously failed attempts. @@ -799,6 +801,7 @@ $(VBOX_PATH_PACK_TMP)/Packages/VirtualBox.pkg: \ ifdef VBOX_WITH_WEBSERVICES $(INSTALL) -m 0644 $(VBOX_PATH_DI_SRC)/VirtualBox/org.virtualbox.vboxwebsrv.plist $(VBOX_PATH_PACK_TMP)/VirtualBox.pkg.root/Applications/VirtualBox.app/Contents/MacOS/ endif + $(INSTALL) -m 0644 $(VBOX_PATH_DI_SRC)/VirtualBox/org.virtualbox.vboxballoonctrl.plist $(VBOX_PATH_PACK_TMP)/VirtualBox.pkg.root/Applications/VirtualBox.app/Contents/MacOS/ @# Install the python stuff ifdef VBOX_WITH_PYTHON $(foreach f,$(VBOX_DI_VBAPP_PYTHON_FILES) \ @@ -1024,6 +1027,8 @@ ifdef VBOX_WITH_WEBSERVICES $(APPEND) $(VBOX_PATH_PACK_TMP)/VirtualBoxCLI.pkg.root/usr/bin/vboxwebsrv '#!/bin/bash' $(APPEND) $(VBOX_PATH_PACK_TMP)/VirtualBoxCLI.pkg.root/usr/bin/vboxwebsrv 'exec /Applications/VirtualBox.app/Contents/MacOS/vboxwebsrv "$$@"' endif + $(APPEND) $(VBOX_PATH_PACK_TMP)/VirtualBoxCLI.pkg.root/usr/bin/VBoxBalloonCtrl '#!/bin/bash' + $(APPEND) $(VBOX_PATH_PACK_TMP)/VirtualBoxCLI.pkg.root/usr/bin/VBoxBalloonCtrl 'exec /Applications/VirtualBox.app/Contents/MacOS/VBoxBalloonCtrl "$$@"' @# Set the correct owners and file permissions. sudo chmod 0755 $(VBOX_PATH_PACK_TMP)/VirtualBoxCLI.pkg.root/usr/bin/* sudo chown root:admin $(VBOX_PATH_PACK_TMP)/VirtualBoxCLI.pkg.root diff --git a/src/VBox/Installer/darwin/VirtualBox/org.virtualbox.vboxballoonctrl.plist b/src/VBox/Installer/darwin/VirtualBox/org.virtualbox.vboxballoonctrl.plist new file mode 100644 index 000000000..f70805f02 --- /dev/null +++ b/src/VBox/Installer/darwin/VirtualBox/org.virtualbox.vboxballoonctrl.plist @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Disabled</key> + <true/> + <key>KeepAlive</key> + <false/> + <key>Label</key> + <string>org.virtualbox.vboxballoonctrl</string> + <key>Program</key> + <string>/Applications/VirtualBox.app/Contents/MacOS/VBoxBalloonCtrl</string> +</dict> +</plist> diff --git a/src/VBox/Installer/linux/Makefile.kmk b/src/VBox/Installer/linux/Makefile.kmk index 6163ca28f..9a45f8887 100644 --- a/src/VBox/Installer/linux/Makefile.kmk +++ b/src/VBox/Installer/linux/Makefile.kmk @@ -4,7 +4,7 @@ # # -# Copyright (C) 2006-2010 Oracle Corporation +# Copyright (C) 2006-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -47,12 +47,14 @@ OTHER_CLEAN += \ uninstall.sh \ deffiles \ routines.sh \ + vboxballoonctrl-service.sh \ vboxdrv.sh \ vboxweb-service.sh \ VirtualBox.tar.bz2 \ LICENSE) \ $(wildcard $(VBOX_LNX_INST_OUT_DIR)/VirtualBox-*) \ $(addprefix $(VBOX_LNX_INST_OUT_DIR)/,\ + vboxballoonctrl-service.sh \ vboxdrv.sh \ vboxweb-service.sh \ install.sh) @@ -94,7 +96,7 @@ endif INSTALLS += linux-icons linux-icons_INST = bin/icons linux-icons_MODE = a+r,u+w -linux-icons_SOURCES = $(VBOX_MIME_ICONS) +linux-icons_SOURCES = $(VBOX_MIME_ICONS) $(VBOX_DESKTOP_ICONS) # @@ -117,6 +119,7 @@ VBOX_LNX_STRIP_BIN = \ $(if $(VBOX_WITH_GUEST_PROPS),VBoxGuestPropSvc.so,) \ $(if $(VBOX_WITH_GUEST_CONTROL),VBoxGuestControlSvc.so,) \ $(if $(VBOX_WITH_MAIN), \ + VBoxBalloonCtrl \ VBoxManage \ VBoxNetDHCP $(if $(VBOX_WITH_HARDENING),VBoxNetDHCP.so,) \ VBoxNetAdpCtl \ @@ -278,6 +281,11 @@ VBOX_MIME_ICONS = \ $(foreach s,16 20 24 32 48 64 72 96 128 256,\ virtualbox-$(f)-$(s)px.png=>$(s)x$(s)/virtualbox-$(f).png))) +VBOX_DESKTOP_ICONS = \ + $(addprefix $(PATH_ROOT)/src/VBox/Resources/$(if $(VBOX_OSE),OSE,NonOSE)/,\ + $(foreach s,16 20 32 40 48 64 128,\ + virtualbox-$(s)px.png=>$(s)x$(s)/virtualbox.png)) + # # All the bin files that goes into the archives. # @@ -297,6 +305,7 @@ $(PATH_BIN)/$(VBOX_LNX_PACKAGE_NAME): \ $(VBOX_PATH_LNX_INST_SRC)/routines.sh \ $(VBOX_PATH_LNX_INST_SRC)/deffiles \ $(if $(VBOX_OSE),,$(VBOX_BRAND_LICENSE_TXT)) \ + $(VBOX_LNX_INST_OUT_DIR)/vboxballoonctrl-service.sh \ $(VBOX_LNX_INST_OUT_DIR)/vboxdrv.sh \ $(VBOX_LNX_INST_OUT_DIR)/vboxweb-service.sh \ $(VBOX_LNX_INST_OUT_DIR)/install.sh \ @@ -311,6 +320,7 @@ $(PATH_BIN)/$(VBOX_LNX_PACKAGE_NAME): \ $(QUIET)$(INSTALL) -m 0755 $(VBOX_PATH_LNX_INST_SRC)/routines.sh $(VBOX_LNX_INST_STAGE_DIR)/ $(QUIET)$(INSTALL) -m 0755 $(VBOX_PATH_LNX_INST_SRC)/deffiles $(VBOX_LNX_INST_STAGE_DIR)/ $(QUIET)$(if $(VBOX_OSE),,$(INSTALL) -m 0644 $(VBOX_BRAND_LICENSE_TXT) $(VBOX_LNX_INST_STAGE_DIR)/LICENSE) + $(QUIET)$(INSTALL) -m 0755 $(VBOX_LNX_INST_OUT_DIR)/vboxballoonctrl-service.sh $(VBOX_LNX_INST_STAGE_DIR)/ $(QUIET)$(INSTALL) -m 0755 $(VBOX_LNX_INST_OUT_DIR)/vboxdrv.sh $(VBOX_LNX_INST_STAGE_DIR)/ $(QUIET)$(INSTALL) -m 0755 $(VBOX_LNX_INST_OUT_DIR)/vboxweb-service.sh $(VBOX_LNX_INST_STAGE_DIR)/ $(QUIET)$(INSTALL) -m 0755 $(VBOX_PATH_LNX_INST_SRC)/vboxdrv-pardus.py $(VBOX_LNX_INST_STAGE_DIR)/ @@ -321,6 +331,14 @@ $(PATH_BIN)/$(VBOX_LNX_PACKAGE_NAME): \ "VirtualBox for Linux installation" ./install.sh "\$$0 1> /dev/null" # files that needs editing before they can be included in the generic installer. +$(VBOX_LNX_INST_OUT_DIR)/vboxballoonctrl-service.sh: $(VBOX_PATH_LNX_INST_SRC)/vboxballoonctrl-service.sh.in | $$(dir $$@) + $(QUIET)$(SED_EXT) \ + -e "s|%NOLSB%|yes|g" \ + -e "s|%DEBIAN%||g" \ + -e "s|%PACKAGE%|virtualbox|g" \ + --output $@ \ + $< + $(VBOX_LNX_INST_OUT_DIR)/vboxdrv.sh: $(VBOX_PATH_LNX_INST_SRC)/vboxdrv.sh.in | $$(dir $$@) $(QUIET)$(SED_EXT) \ -e "s|%NOLSB%|yes|g" \ diff --git a/src/VBox/Installer/linux/VBox.sh b/src/VBox/Installer/linux/VBox.sh index 931969674..3de227978 100755 --- a/src/VBox/Installer/linux/VBox.sh +++ b/src/VBox/Installer/linux/VBox.sh @@ -93,6 +93,9 @@ case "$APP" in VBoxVRDP|VBoxHeadless|vboxheadless) exec "$INSTALL_DIR/VBoxHeadless" "$@" ;; + VBoxBalloonCtrl|vboxballoonctrl) + exec "$INSTALL_DIR/VBoxBalloonCtrl" "$@" + ;; vboxwebsrv) exec "$INSTALL_DIR/vboxwebsrv" "$@" ;; diff --git a/src/VBox/Installer/linux/distributions_deb b/src/VBox/Installer/linux/distributions_deb index 2589f4279..55c2dfdaf 100644 --- a/src/VBox/Installer/linux/distributions_deb +++ b/src/VBox/Installer/linux/distributions_deb @@ -3,6 +3,7 @@ _Debian_squeeze = DEBIAN_6_0 _Debian_lenny = DEBIAN_5_0 _Debian_etch = DEBIAN_4_0 _Debian_sarge = DEBIAN_3_1 +_Ubuntu_natty = UBUNTU_11_04 _Ubuntu_maverick = UBUNTU_10_10 _Ubuntu_lucid = UBUNTU_10_04 _Ubuntu_karmic = UBUNTU_9_10 diff --git a/src/VBox/Installer/linux/distributions_rpm b/src/VBox/Installer/linux/distributions_rpm index c066d23f4..6bed9908a 100644 --- a/src/VBox/Installer/linux/distributions_rpm +++ b/src/VBox/Installer/linux/distributions_rpm @@ -1,3 +1,4 @@ +openSUSE114 = OPENSUSE_11_4 openSUSE113 = OPENSUSE_11_3 openSUSE112 = OPENSUSE_11_2 openSUSE111 = OPENSUSE_11_1 @@ -10,6 +11,7 @@ mdv2010.0 = MANDRIVA_2010_0 mdv2009.1 = MANDRIVA_2009_1 mdv2008.0 = MANDRIVA_2008_0 mdv2007.1 = MANDRIVA_2007_1 +fedora15 = FEDORA_15 fedora14 = FEDORA_14 fedora13 = FEDORA_13 fedora12 = FEDORA_12 diff --git a/src/VBox/Installer/linux/install.sh b/src/VBox/Installer/linux/install.sh index ccbbf9eeb..cb9c5c139 100755 --- a/src/VBox/Installer/linux/install.sh +++ b/src/VBox/Installer/linux/install.sh @@ -4,7 +4,7 @@ # VirtualBox linux installation script # -# Copyright (C) 2007-2010 Oracle Corporation +# Copyright (C) 2007-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -103,6 +103,7 @@ check_previous() { check_binary "/usr/bin/VBoxSDL" "$install_dir" && check_binary "/usr/bin/VBoxVRDP" "$install_dir" && check_binary "/usr/bin/VBoxHeadless" "$install_dir" && + check_binary "/usr/bin/VBoxBalloonCtrl" "$install_dir" && check_binary "/usr/bin/vboxwebsrv" "$install_dir" } @@ -119,6 +120,9 @@ check_root # Set up logging before anything else create_log $LOG +# Now stop the ballon control service otherwise it will keep VBoxSVC running +stop_init_script vboxballoonctrl-service + # Now stop the web service otherwise it will keep VBoxSVC running stop_init_script vboxweb-service @@ -368,9 +372,12 @@ if [ "$ACTION" = "install" ]; then # Install runlevel scripts install_init_script vboxdrv.sh vboxdrv + install_init_script vboxballoonctrl-service.sh vboxballoonctrl-service install_init_script vboxweb-service.sh vboxweb-service delrunlevel vboxdrv > /dev/null 2>&1 addrunlevel vboxdrv 20 80 # This may produce useful output + delrunlevel vboxballoonctrl-service > /dev/null 2>&1 + addrunlevel vboxballoonctrl-service 25 75 # This may produce useful output delrunlevel vboxweb-service > /dev/null 2>&1 addrunlevel vboxweb-service 25 75 # This may produce useful output @@ -383,8 +390,11 @@ if [ "$ACTION" = "install" ]; then ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxSDL ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxVRDP ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxHeadless + ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/VBoxBalloonCtrl ln -sf $INSTALLATION_DIR/VBox.sh /usr/bin/vboxwebsrv ln -sf $INSTALLATION_DIR/VBox.png /usr/share/pixmaps/VBox.png + # Unity and Nautilus seem to look here for their icons + ln -sf $INSTALLATION_DIR/icons/128x128/virtualbox.png /usr/share/pixmaps/virtualbox.png ln -sf $INSTALLATION_DIR/virtualbox.desktop /usr/share/applications/virtualbox.desktop ln -sf $INSTALLATION_DIR/virtualbox.xml /usr/share/mime/packages/virtualbox.xml ln -sf $INSTALLATION_DIR/rdesktop-vrdp /usr/bin/rdesktop-vrdp @@ -403,9 +413,14 @@ if [ "$ACTION" = "install" ]; then cd $i if [ -d /usr/share/icons/hicolor/$i ]; then for j in *; do - if [ -d /usr/share/icons/hicolor/$i/mimetypes ]; then - ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/mimetypes/$j - echo /usr/share/icons/hicolor/$i/mimetypes/$j >> $CONFIG_DIR/$CONFIG_FILES + if [ "$j" = "virtualbox.png" ]; then + dst=apps + else + dst=mimetypes + fi + if [ -d /usr/share/icons/hicolor/$i/$dst ]; then + ln -s $INSTALLATION_DIR/icons/$i/$j /usr/share/icons/hicolor/$i/$dst/$j + echo /usr/share/icons/hicolor/$i/$dst/$j >> $CONFIG_DIR/$CONFIG_FILES fi done fi @@ -494,6 +509,7 @@ if [ "$ACTION" = "install" ]; then MODULE_FAILED="true" RC_SCRIPT=1 fi + start_init_script vboxballoonctrl-service start_init_script vboxweb-service log "" log "End of the output from the Linux kernel build system." diff --git a/src/VBox/Installer/linux/routines.sh b/src/VBox/Installer/linux/routines.sh index 27d693e3d..d6d9220e9 100644 --- a/src/VBox/Installer/linux/routines.sh +++ b/src/VBox/Installer/linux/routines.sh @@ -2,7 +2,7 @@ # VirtualBox installer shell routines # -# Copyright (C) 2007-2010 Oracle Corporation +# Copyright (C) 2007-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -330,7 +330,7 @@ start_init_script() { # Stop the init script "name" # -# syntax: start_init_script name +# syntax: stop_init_script name stop_init_script() { self=stop_init_script @@ -542,8 +542,8 @@ setup_init_script() # Redhat chkconfig information. if test "$ro_INIT_TYPE" = "sysv" -a -r "$scriptname"; then orders=`grep '^#['"$spaces"']*chkconfig:' "$scriptname" | - sed -e 's/^#['"$spaces"']*chkconfig:\s*[0-9]*['"$spaces"']*//'` - expr "$orders" : '[0-9]*['"$spaces"']*[0-9]*$' > /dev/null || + sed -e 's/^#['"$spaces"']*chkconfig:['"$spaces"']*[0-9]*['"$spaces"']*//'` + expr "$orders" : '.*[0-9][0-9]*['"$spaces"']['"$spaces"']*[0-9][0-9]*$' > /dev/null || { log "$self: bad or missing chkconfig line in init script $scriptname" return 1 diff --git a/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec b/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec index 85013b26a..8062eec5f 100644 --- a/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec +++ b/src/VBox/Installer/linux/rpm/VirtualBox.tmpl.spec @@ -3,7 +3,7 @@ # # -# Copyright (C) 2006-2010 Oracle Corporation +# Copyright (C) 2006-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -95,16 +95,21 @@ cp -a src $RPM_BUILD_ROOT/usr/share/virtualbox mv VBox.sh $RPM_BUILD_ROOT/usr/bin/VBox mv VBoxSysInfo.sh $RPM_BUILD_ROOT/usr/share/virtualbox mv VBoxCreateUSBNode.sh $RPM_BUILD_ROOT/usr/share/virtualbox +cp icons/128x128/virtualbox.png $RPM_BUILD_ROOT/usr/share/pixmaps/virtualbox.png cd icons for i in *; do + if [ -f $i/virtualbox.png ]; then + install -d $RPM_BUILD_ROOT/usr/share/icons/hicolor/$i/apps + mv $i/virtualbox.png $RPM_BUILD_ROOT/usr/share/icons/hicolor/$i/apps + fi install -d $RPM_BUILD_ROOT/usr/share/icons/hicolor/$i/mimetypes - mv $i/* $RPM_BUILD_ROOT/usr/share/icons/hicolor/$i/mimetypes + mv $i/* $RPM_BUILD_ROOT/usr/share/icons/hicolor/$i/mimetypes || true rmdir $i done cd - rmdir icons mv virtualbox.xml $RPM_BUILD_ROOT/usr/share/mime/packages -for i in VBoxManage VBoxSVC VBoxSDL VirtualBox VBoxHeadless VBoxExtPackHelperApp vboxwebsrv webtest; do +for i in VBoxManage VBoxSVC VBoxSDL VirtualBox VBoxHeadless VBoxExtPackHelperApp VBoxBalloonCtrl vboxwebsrv webtest; do mv $i $RPM_BUILD_ROOT/usr/lib/virtualbox; done for i in VBoxSDL VirtualBox VBoxHeadless VBoxNetDHCP VBoxNetAdpCtl; do chmod 4511 $RPM_BUILD_ROOT/usr/lib/virtualbox/$i; done @@ -137,8 +142,10 @@ install -D -m 755 vboxdrv.init $RPM_BUILD_ROOT%{_initrddir}/vboxdrv %if %{?rpm_suse:1}%{!?rpm_suse:0} ln -sf ../etc/init.d/vboxdrv $RPM_BUILD_ROOT/sbin/rcvboxdrv %endif +install -D -m 755 vboxballoonctrl-service.init $RPM_BUILD_ROOT%{_initrddir}/vboxballoonctrl-service install -D -m 755 vboxweb-service.init $RPM_BUILD_ROOT%{_initrddir}/vboxweb-service %if %{?rpm_suse:1}%{!?rpm_suse:0} +ln -sf ../etc/init.d/vboxballoonctrl-service $RPM_BUILD_ROOT/sbin/rcvboxballoonctrl-service ln -sf ../etc/init.d/vboxweb-service $RPM_BUILD_ROOT/sbin/rcvboxweb-service %endif ln -s VBox $RPM_BUILD_ROOT/usr/bin/VirtualBox @@ -150,6 +157,8 @@ ln -s VBox $RPM_BUILD_ROOT/usr/bin/vboxsdl ln -s VBox $RPM_BUILD_ROOT/usr/bin/VBoxVRDP ln -s VBox $RPM_BUILD_ROOT/usr/bin/VBoxHeadless ln -s VBox $RPM_BUILD_ROOT/usr/bin/vboxheadless +ln -s VBox $RPM_BUILD_ROOT/usr/bin/VBoxBalloonCtrl +ln -s VBox $RPM_BUILD_ROOT/usr/bin/vboxballoonctrl ln -s VBox $RPM_BUILD_ROOT/usr/bin/vboxwebsrv ln -s /usr/share/virtualbox/src/vboxhost $RPM_BUILD_ROOT/usr/src/vboxhost-%VER% mv virtualbox.desktop $RPM_BUILD_ROOT/usr/share/applications/virtualbox.desktop @@ -164,12 +173,16 @@ mv VBox.png $RPM_BUILD_ROOT/usr/share/pixmaps/VBox.png VBOXSVC_PID=`pidof VBoxSVC 2>/dev/null || true` if [ -n "$VBOXSVC_PID" ]; then # executed before the new package is installed! + if [ -f /etc/init.d/vboxballoonctrl-service ]; then + # try graceful termination; terminate the balloon control service first + /etc/init.d/vboxballoonctrl-service stop 2>/dev/null || true + fi if [ -f /etc/init.d/vboxweb-service ]; then # try graceful termination; terminate the webservice first /etc/init.d/vboxweb-service stop 2>/dev/null || true - # ask the daemon to terminate immediately - kill -USR1 $VBOXSVC_PID fi + # ask the daemon to terminate immediately + kill -USR1 $VBOXSVC_PID sleep 1 if pidof VBoxSVC > /dev/null 2>&1; then echo "A copy of VirtualBox is currently running. Please close it and try again." @@ -274,6 +287,7 @@ if [ -x /usr/bin/chcon ]; then chcon -t java_exec_t /usr/lib/virtualbox/VBoxSDL > /dev/null 2>&1 chcon -t java_exec_t /usr/lib/virtualbox/VBoxHeadless > /dev/null 2>&1 chcon -t java_exec_t /usr/lib/virtualbox/VBoxExtPackHelperApp > /dev/null 2>&1 + chcon -t java_exec_t /usr/lib/virtualbox/VBoxBalloonCtrl > /dev/null 2>&1 chcon -t java_exec_t /usr/lib/virtualbox/vboxwebsrv > /dev/null 2>&1 fi %endif @@ -287,14 +301,16 @@ if [ "$INSTALL_NO_GROUP" != "1" ]; then fi %if %{?rpm_redhat:1}%{!?rpm_redhat:0} /sbin/chkconfig --add vboxdrv +/sbin/chkconfig --add vboxballoonctrl-service /sbin/chkconfig --add vboxweb-service %endif %if %{?rpm_suse:1}%{!?rpm_suse:0} -%{fillup_and_insserv -f -y -Y vboxdrv vboxweb-service} +%{fillup_and_insserv -f -y -Y vboxdrv vboxballoonctrl-service vboxweb-service} %endif %if %{?rpm_mdv:1}%{!?rpm_mdv:0} /sbin/ldconfig %_post_service vboxdrv +%_post_service vboxballoonctrl-service %_post_service vboxweb-service %update_menus %endif @@ -338,6 +354,7 @@ else fi /etc/init.d/vboxdrv start > /dev/null fi +/etc/init.d/vboxballoonctrl-service start > /dev/null /etc/init.d/vboxweb-service start > /dev/null @@ -346,13 +363,17 @@ fi # $1==1: install the first time # $1>=2: upgrade %if %{?rpm_suse:1}%{!?rpm_suse:0} +%stop_on_removal vboxballoonctrl-service %stop_on_removal vboxweb-service %endif %if %{?rpm_mdv:1}%{!?rpm_mdv:0} +%_preun_service vboxballoonctrl-service %_preun_service vboxweb-service %endif %if %{?rpm_redhat:1}%{!?rpm_redhat:0} if [ "$1" = 0 ]; then + /sbin/service vboxballoonctrl-service stop > /dev/null + /sbin/chkconfig --del vboxballoonctrl-service /sbin/service vboxweb-service stop > /dev/null /sbin/chkconfig --del vboxweb-service fi @@ -399,11 +420,12 @@ fi %if %{?rpm_redhat:1}%{!?rpm_redhat:0} if [ "$1" -ge 1 ]; then /sbin/service vboxdrv restart > /dev/null 2>&1 + /sbin/service vboxballoonctrl-service restart > /dev/null 2>&1 /sbin/service vboxweb-service restart > /dev/null 2>&1 fi %endif %if %{?rpm_suse:1}%{!?rpm_suse:0} -%restart_on_update vboxdrv vboxweb-service +%restart_on_update vboxdrv vboxballoonctrl-service vboxweb-service %insserv_cleanup %endif %if %{?rpm_mdv:1}%{!?rpm_mdv:0} @@ -427,10 +449,12 @@ rm -rf $RPM_BUILD_ROOT %doc UserManual*.pdf %doc VirtualBox*.chm %{_initrddir}/vboxdrv +%{_initrddir}/vboxballoonctrl-service %{_initrddir}/vboxweb-service %{?rpm_suse: %{py_sitedir}/*} %{!?rpm_suse: %{python_sitelib}/*} %{?rpm_suse: /sbin/rcvboxdrv} +%{?rpm_suse: /sbin/rcvboxballoonctrl-service} %{?rpm_suse: /sbin/rcvboxweb-service} /lib/modules /etc/vbox diff --git a/src/VBox/Installer/linux/rpm/rules b/src/VBox/Installer/linux/rpm/rules index 9b83e7f4c..baf026d32 100755 --- a/src/VBox/Installer/linux/rpm/rules +++ b/src/VBox/Installer/linux/rpm/rules @@ -1,7 +1,7 @@ #!/usr/bin/make -f # -# Copyright (C) 2006-2010 Oracle Corporation +# Copyright (C) 2006-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -55,10 +55,10 @@ ifneq ($(MAKECMDGOALS),clean) $(error Cannot detect package distribution (rpmrel=$(rpmrel))) endif - ifeq ($(filter-out rhel4 rhel5 rhel6 ol4 ol5 ol6 centos4 centos5 centos6 fedora9 fedora11 fedora12 fedora13 fedora14 pclinuxos2007 turbolinux11,$(rpmrel)),) + ifeq ($(filter-out rhel4 rhel5 rhel6 ol4 ol5 ol6 centos4 centos5 centos6 fedora9 fedora11 fedora12 fedora13 fedora14 fedora15 turbolinux11,$(rpmrel)),) rpmspec := rpm_redhat endif - ifeq ($(filter-out openSUSE110 openSUSE111 openSUSE112 openSUSE113 sles10.1 sles11.0,$(rpmrel)),) + ifeq ($(filter-out openSUSE110 openSUSE111 openSUSE112 openSUSE113 openSUSE114 sles10.1 sles11.0,$(rpmrel)),) rpmspec := rpm_suse endif ifeq ($(filter-out mdv2009.1 mdv2010.0,$(rpmrel)),) @@ -79,7 +79,7 @@ archdir := $(current)/rpm/VirtualBox-$(ver) rpmname := $(verpkg)-$(rpmver)_$(rpmrel) # Fedora13/14 is bleeding edge, the other jails have outdated kernel headers -instmod := $(if $(filter rhel4 rhel5 rhel6 ol4 ol5 ol6 centos4 centos5 centos6 sles10.1 sles11.0 pclinuxos2007 fedora13 fedora14,$(rpmrel)),,install_rpm) +instmod := $(if $(filter rhel4 rhel5 rhel6 ol4 ol5 ol6 centos4 centos5 centos6 sles10.1 sles11.0 fedora13 fedora14 fedora15,$(rpmrel)),,install_rpm) ifneq ($(STAGEDISO),) ifeq ($(wildcard $(STAGEDISO)/VBoxGuestAdditions.iso),) @@ -180,6 +180,11 @@ binary: rpm/build-stamp -e 's|%NOLSB%|yes|g' \ -e 's|%DEBIAN%||g' \ -e 's|%PACKAGE%|virtualbox|g' \ + vboxballoonctrl-service.sh.in > $(archdir)/vboxballoonctrl-service.init + sed \ + -e 's|%NOLSB%|yes|g' \ + -e 's|%DEBIAN%||g' \ + -e 's|%PACKAGE%|virtualbox|g' \ vboxweb-service.sh.in > $(archdir)/vboxweb-service.init cp debian/VBox.sh $(archdir) mv rpm/VirtualBox-$(ver) rpm/$(rpmname) diff --git a/src/VBox/Installer/linux/runasroot.sh b/src/VBox/Installer/linux/runasroot.sh new file mode 100755 index 000000000..41125ced1 --- /dev/null +++ b/src/VBox/Installer/linux/runasroot.sh @@ -0,0 +1,148 @@ +#!/bin/sh +# $Id: runasroot.sh $ +## @file +# VirtualBox privileged execution helper script for Linux and Solaris +# + +# +# Copyright (C) 2009-2011 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 sh-utils.sh + +ostype=`uname -s` +if test "$ostype" != "Linux" && test "$ostype" != "SunOS" ; then + echo "Linux/Solaris not detected." + exit 1 +fi + +HAS_TERMINAL="" +case "$1" in "--has-terminal") + shift + HAS_TERMINAL="yes" + ;; +esac + +case "$#" in "2"|"3") + ;; + *) + echo "Usage: `basename $0` DESCRIPTION COMMAND [ADVICE]" >&2 + echo >&2 + echo "Attempt to execute COMMAND with root privileges, displaying DESCRIPTION if" >&2 + echo "possible and displaying ADVICE if possible if no su(1)-like tool is available." >&2 + exit 1 + ;; +esac + +DESCRIPTION=$1 +COMMAND=$2 +ADVICE=$3 +PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/X11/bin + +case "$ostype" in SunOS) + PATH=$PATH:/usr/sfw/bin:/usr/gnu/bin:/usr/xpg4/bin:/usr/xpg6/bin:/usr/openwin/bin:/usr/ucb + GKSU_SWITCHES="-au root" + ;; + *) + GKSU_SWITCHES="" + ;; +esac + +case "$HAS_TERMINAL" in "") + case "$DISPLAY" in ?*) + KDESUDO="`mywhich kdesudo`" + case "$KDESUDO" in ?*) + eval "`quotify "$KDESUDO"` --comment `quotify "$DESCRIPTION"` -- $COMMAND" + exit + ;; + esac + + KDESU="`mywhich kdesu`" + case "$KDESU" in ?*) + "$KDESU" -c "$COMMAND" + exit + ;; + esac + + GKSU="`mywhich gksu`" + case "$GKSU" in ?*) + # Older gksu does not grok --description nor '--' and multiple args. + # @todo which versions do? + # "$GKSU" --description "$DESCRIPTION" -- "$@" + # Note that $GKSU_SWITCHES is NOT quoted in the following + "$GKSU" $GKSU_SWITCHES "$COMMAND" + exit + ;; + esac + ;; + esac # $DISPLAY + ;; +esac # ! $HAS_TERMINAL + +# pkexec may work for ssh console sessions as well if the right agents +# are installed. However it is very generic and does not allow for any +# custom messages. Thus it comes after gksu. +## @todo should we insist on either a display or a terminal? +# case "$DISPLAY$HAS_TERMINAL" in ?*) +PKEXEC="`mywhich pkexec`" +case "$PKEXEC" in ?*) + eval "\"$PKEXEC\" $COMMAND" + exit + ;; +esac +# ;;S +#esac + +case "$HAS_TERMINAL" in ?*) + USE_SUDO= + grep -q Ubuntu /etc/lsb-release 2>/dev/null && USE_SUDO=true + # On Ubuntu we need sudo instead of su. Assume this works, and is only + # needed for Ubuntu until proven wrong. + case $USE_SUDO in true) + SUDO_COMMAND="`quotify "$SUDO"` -- $COMMAND" + eval "$SUDO_COMMAND" + exit + ;; + esac + + SU="`mywhich su`" + case "$SU" in ?*) + "$SU" - root -c "$COMMAND" + exit + ;; + esac + ;; +esac + +# The ultimate fallback is running 'su -' within an xterm. We use the +# title of the xterm to tell what is going on. +case "$DISPLAY" in ?*) + SU="`mywhich su`" + case "$SU" in ?*) + getxterm + case "$gxtpath" in ?*) + "$gxtpath" "$gxttitle" "$DESCRIPTION - su" "$gxtexec" su - root -c "$COMMAND" + exit + ;; + esac + esac +esac # $DISPLAY + +# Failure... +case "$DISPLAY" in ?*) + echo "Unable to locate 'pkexec', 'gksu' or 'su+xterm'. $ADVICE" >&2 + ;; + *) + echo "Unable to locate 'pkexec'. $ADVICE" >&2 + ;; +esac + +exit 1 diff --git a/src/VBox/Installer/linux/sh-utils.sh b/src/VBox/Installer/linux/sh-utils.sh new file mode 100644 index 000000000..dc9e0e823 --- /dev/null +++ b/src/VBox/Installer/linux/sh-utils.sh @@ -0,0 +1,49 @@ +# $Id: sh-utils.sh $ +# Shell script include file +## @file +# Shell script routines which are likely to be useful for different scripts +# + +# +# Copyright (C) 2009-2011 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. +# + +# Deal with differing "which" semantics +mywhich() { + which "$1" 2>/dev/null | grep -v "no $1" +} + +# Get the name and execute switch for a useful terminal emulator +# +# Sets $gxtpath to the emulator path or empty +# Sets $gxttitle to the "title" switch for that emulator +# Sets $gxtexec to the "execute" switch for that emulator +# May clobber $gtx* +# Calls mywhich +getxterm() { + # gnome-terminal uses -e differently to other emulators + for gxti in "konsole --title -e" "gnome-terminal --title -x" "xterm -T -e"; do + set $gxti + gxtpath="`mywhich $1`" + case "$gxtpath" in ?*) + gxttitle=$2 + gxtexec=$3 + return + ;; + esac + done +} + +# Quotes its argument by inserting '\' in front of every character save +# for 'A-Za-z0-9/'. Prints the result to stdout. +quotify() { + echo "$1" | sed -e 's/\([^a-zA-Z0-9/]\)/\\\1/g' +} diff --git a/src/VBox/Installer/linux/uninstall.sh b/src/VBox/Installer/linux/uninstall.sh index 0b870d37d..4ec1241af 100755 --- a/src/VBox/Installer/linux/uninstall.sh +++ b/src/VBox/Installer/linux/uninstall.sh @@ -47,12 +47,16 @@ if [ "$PREV_INSTALLATION" = "" ]; then abort "Couldn't find a VirtualBox installation to uninstall." fi +# Stop the ballon control service +stop_init_script vboxballoonctrl-service # Stop the web service stop_init_script vboxweb-service # Do this check here after we terminated the web service check_running # Terminate VBoxNetDHCP if running terminate_proc VBoxNetDHCP +delrunlevel vboxballoonctrl-service > /dev/null 2>&1 +remove_init_script vboxballoonctrl-service delrunlevel vboxweb-service > /dev/null 2>&1 remove_init_script vboxweb-service # Stop kernel module and uninstall runlevel script @@ -94,6 +98,7 @@ rm -f \ /usr/bin/VBoxTunctl \ /usr/bin/virtualbox \ /usr/share/pixmaps/VBox.png \ + /usr/share/pixmaps/virtualbox.png \ /usr/share/applications/virtualbox.desktop \ /usr/share/mime/packages/virtualbox.xml \ /usr/bin/rdesktop-vrdp \ diff --git a/src/VBox/Installer/linux/vboxballoonctrl-service.sh.in b/src/VBox/Installer/linux/vboxballoonctrl-service.sh.in new file mode 100755 index 000000000..488fd238f --- /dev/null +++ b/src/VBox/Installer/linux/vboxballoonctrl-service.sh.in @@ -0,0 +1,371 @@ +#!/bin/sh +# +# VirtualBox balloon control daemon init script. +# +# Copyright (C) 2006-2011 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. +# + +# chkconfig: 35 35 65 +# description: VirtualBox balloon control daemon +# +### BEGIN INIT INFO +# Provides: vboxballoonctrl-service +# Required-Start: vboxdrv +# Required-Stop: vboxdrv +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Description: VirtualBox balloon control daemon +### END INIT INFO + +PATH=$PATH:/bin:/sbin:/usr/sbin +DEBIAN=%DEBIAN% +NOLSB=%NOLSB% + +[ -f /lib/lsb/init-functions ] || NOLSB=yes +[ -f /etc/vbox/vbox.cfg ] && . /etc/vbox/vbox.cfg + +if [ -n "$INSTALL_DIR" ]; then + binary="$INSTALL_DIR/VBoxBalloonCtrl" +else + binary="/usr/lib/%PACKAGE%/VBoxBalloonCtrl" +fi + +# silently exit if the package was uninstalled but not purged, +# applies to Debian packages only +[ -z "$DEBIAN" -o -x $binary ] || exit 0 + +[ -r /etc/default/%PACKAGE% ] && . /etc/default/%PACKAGE% + +system=unknown +if [ -f /etc/redhat-release ]; then + system=redhat + PIDFILE="/var/lock/subsys/vboxballoonctrl-service" +elif [ -f /etc/SuSE-release ]; then + system=suse + PIDFILE="/var/lock/subsys/vboxballoonctrl-service" +elif [ -f /etc/debian_version ]; then + system=debian + PIDFILE="/var/run/vboxballoonctrl-service" +elif [ -f /etc/gentoo-release ]; then + system=gentoo + PIDFILE="/var/run/vboxballoonctrl-service" +elif [ -f /etc/arch-release ]; then + system=arch + PIDFILE="/var/run/vboxballoonctrl-service" +elif [ -f /etc/slackware-version ]; then + system=slackware + PIDFILE="/var/run/vboxballoonctrl-service" +elif [ -f /etc/lfs-release ]; then + system=lfs + PIDFILE="/var/run/vboxballoonctrl-service.pid" +else + system=other + if [ -d /var/run -a -w /var/run ]; then + PIDFILE="/var/run/vboxballoonctrl-service" + fi +fi + +if [ -z "$NOLSB" ]; then + . /lib/lsb/init-functions + fail_msg() { + echo "" + log_failure_msg "$1" + } + succ_msg() { + log_success_msg " done." + } + begin_msg() { + log_daemon_msg "$@" + } +fi + +if [ "$system" = "redhat" ]; then + . /etc/init.d/functions + if [ -n "$NOLSB" ]; then + start_daemon() { + usr="$1" + shift + daemon --user $usr $@ + } + fail_msg() { + echo_failure + echo + } + succ_msg() { + echo_success + echo + } + begin_msg() { + echo -n "$1" + } + fi +fi + +if [ "$system" = "suse" ]; then + . /etc/rc.status + start_daemon() { + usr="$1" + shift + su - $usr -c "$*" + } + if [ -n "$NOLSB" ]; then + fail_msg() { + rc_failed 1 + rc_status -v + } + succ_msg() { + rc_reset + rc_status -v + } + begin_msg() { + echo -n "$1" + } + fi +fi + +if [ "$system" = "debian" ]; then + start_daemon() { + usr="$1" + shift + bin="$1" + shift + start-stop-daemon --background --chuid $usr --start --exec $bin -- $@ + } + killproc() { + start-stop-daemon --stop --exec $@ + } + if [ -n "$NOLSB" ]; then + fail_msg() { + echo " ...fail!" + } + succ_msg() { + echo " ...done." + } + begin_msg() { + echo -n "$1" + } + fi +fi + +if [ "$system" = "gentoo" ]; then + . /sbin/functions.sh + start_daemon() { + usr="$1" + shift + bin="$1" + shift + start-stop-daemon --background --chuid $usr --start --exec $bin -- $@ + } + killproc() { + start-stop-daemon --stop --exec $@ + } + if [ -n "$NOLSB" ]; then + fail_msg() { + echo " ...fail!" + } + succ_msg() { + echo " ...done." + } + begin_msg() { + echo -n "$1" + } + if [ "`which $0`" = "/sbin/rc" ]; then + shift + fi + fi +fi + +if [ "$system" = "arch" ]; then + USECOLOR=yes + . /etc/rc.d/functions + start_daemon() { + usr="$1" + shift + su - $usr -c "$*" + test $? -eq 0 && add_daemon rc.`basename $2` + } + killproc() { + killall $@ + rm_daemon `basename $@` + } + if [ -n "$NOLSB" ]; then + fail_msg() { + stat_fail + } + succ_msg() { + stat_done + } + begin_msg() { + stat_busy "$1" + } + fi +fi + +if [ "$system" = "slackware" ]; then + killproc() { + killall $1 + rm -f $PIDFILE + } + if [ -n "$NOLSB" ]; then + fail_msg() { + echo " ...fail!" + } + succ_msg() { + echo " ...done." + } + begin_msg() { + echo -n "$1" + } + fi + start_daemon() { + usr="$1" + shift + su - $usr -c "$*" + } +fi + +if [ "$system" = "lfs" ]; then + . /etc/rc.d/init.d/functions + if [ -n "$NOLSB" ]; then + fail_msg() { + echo_failure + } + succ_msg() { + echo_ok + } + begin_msg() { + echo $1 + } + fi + start_daemon() { + usr="$1" + shift + su - $usr -c "$*" + } + status() { + statusproc $1 + } +fi + +if [ "$system" = "other" ]; then + if [ -n "$NOLSB" ]; then + fail_msg() { + echo " ...fail!" + } + succ_msg() { + echo " ...done." + } + begin_msg() { + echo -n "$1" + } + fi +fi + +vboxdrvrunning() { + lsmod | grep -q "vboxdrv[^_-]" +} + +check_single_user() { + if [ -n "$2" ]; then + fail_msg "VBOXBALLOONCTRL_USER must not contain multiple users!" + exit 1 + fi +} + +start() { + if ! test -f $PIDFILE; then + [ -z "$VBOXBALLOONCTRL_USER" ] && exit 0 + begin_msg "Starting VirtualBox balloon control service"; + check_single_user $VBOXBALLOONCTRL_USER + vboxdrvrunning || { + fail_msg "VirtualBox kernel module not loaded!" + exit 0 + } + PARAMS="--background" + [ -n "$VBOXBALLOONCTRL_INTERVAL" ] && PARAMS="$PARAMS --interval $VBOXBALLOONCTRL_INTERVAL" + [ -n "$VBOXBALLOONCTRL_INCREMENT" ] && PARAMS="$PARAMS --balloon-inc $VBOXBALLOONCTRL_INCREMENT" + [ -n "$VBOXBALLOONCTRL_DECREMENT" ] && PARAMS="$PARAMS --balloon-dec $VBOXBALLOONCTRL_DECREMENT" + [ -n "$VBOXBALLOONCTRL_LOWERLIMIT" ] && PARAMS="$PARAMS --balloon-lower-limit $VBOXBALLOONCTRL_LOWERLIMIT" + [ -n "$VBOXBALLOONCTRL_ROTATE" ] && PARAMS="$PARAMS - $VBOXBALLOONCTRL_ROTATE" + [ -n "$VBOXBALLOONCTRL_LOGSIZE" ] && PARAMS="$PARAMS -S $VBOXBALLOONCTRL_LOGSIZE" + [ -n "$VBOXBALLOONCTRL_LOGINTERVAL" ] && PARAMS="$PARAMS -I $VBOXBALLOONCTRL_LOGINTERVAL" + # prevent inheriting this setting to VBoxSVC + unset VBOX_RELEASE_LOG_DEST + start_daemon $VBOXBALLOONCTRL_USER $binary $PARAMS > /dev/null 2>&1 + # ugly: wait until the final process has forked + sleep .1 + PID=`pidof $binary 2>/dev/null` + if [ -n "$PID" ]; then + echo "$PID" > $PIDFILE + RETVAL=0 + succ_msg + else + RETVAL=1 + fail_msg + fi + fi + return $RETVAL +} + +stop() { + if test -f $PIDFILE; then + begin_msg "Stopping VirtualBox balloon control service"; + killproc $binary + RETVAL=$? + if ! pidof $binary > /dev/null 2>&1; then + rm -f $PIDFILE + succ_msg + else + fail_msg + fi + fi + return $RETVAL +} + +restart() { + stop && start +} + +status() { + echo -n "Checking for VBox balloon control service" + if [ -f $PIDFILE ]; then + echo " ...running" + else + echo " ...not running" + fi +} + +case "$1" in +start) + start + ;; +stop) + stop + ;; +restart) + restart + ;; +force-reload) + restart + ;; +status) + status + ;; +setup) + ;; +cleanup) + ;; +*) + echo "Usage: $0 {start|stop|restart|status}" + exit 1 +esac + +exit $RETVAL diff --git a/src/VBox/Installer/linux/vboxdrv.sh.in b/src/VBox/Installer/linux/vboxdrv.sh.in index b0ad93a53..dc29eedae 100755 --- a/src/VBox/Installer/linux/vboxdrv.sh.in +++ b/src/VBox/Installer/linux/vboxdrv.sh.in @@ -205,6 +205,12 @@ start() if ! $MODPROBE vboxnetadp > /dev/null 2>&1; then failure "modprobe vboxnetadp failed. Please use 'dmesg' to find out why" fi + # Create the /dev/vboxusb directory if the host supports that method + # of USB access. The USB code checks for the existance of that path. + if grep -q usb_device /proc/devices; then + mkdir -p -m 0640 /dev/vboxusb 2>/dev/null + chown root:vboxusers /dev/vboxusb 2>/dev/null + fi succ_msg } @@ -317,7 +323,7 @@ setup() fi if ! $BUILDVBOXNETADP \ --use-module-symvers /tmp/vboxdrv-Module.symvers \ - --no-print-directory install >> $LOG 2>&1; then + --no-print-directory install >> $LOG 2>&1; then failure "Look at $LOG to find out what went wrong" fi fi diff --git a/src/VBox/Installer/linux/vboxweb-service.sh.in b/src/VBox/Installer/linux/vboxweb-service.sh.in index 3a30c4841..dfd9605eb 100755 --- a/src/VBox/Installer/linux/vboxweb-service.sh.in +++ b/src/VBox/Installer/linux/vboxweb-service.sh.in @@ -1,8 +1,8 @@ #!/bin/sh # -# Linux Additions Guest Additions service daemon init script. +# VirtualBox web service API daemon init script. # -# Copyright (C) 2006-2010 Oracle Corporation +# Copyright (C) 2006-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -14,7 +14,7 @@ # # chkconfig: 35 35 65 -# description: VirtualBox Additions service +# description: VirtualBox web service API # ### BEGIN INIT INFO # Provides: vboxweb-service @@ -22,7 +22,7 @@ # Required-Stop: vboxdrv # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 -# Description: VirtualBox Additions Service +# Description: VirtualBox web service API ### END INIT INFO PATH=$PATH:/bin:/sbin:/usr/sbin @@ -297,6 +297,9 @@ start() { [ -n "$VBOXWEB_THREADS" ] && PARAMS="$PARAMS -T $VBOXWEB_THREADS" [ -n "$VBOXWEB_KEEPALIVE" ] && PARAMS="$PARAMS -k $VBOXWEB_KEEPALIVE" [ -n "$VBOXWEB_LOGFILE" ] && PARAMS="$PARAMS -F $VBOXWEB_LOGFILE" + [ -n "$VBOXWEB_ROTATE" ] && PARAMS="$PARAMS -R $VBOXWEB_ROTATE" + [ -n "$VBOXWEB_LOGSIZE" ] && PARAMS="$PARAMS -S $VBOXWEB_LOGSIZE" + [ -n "$VBOXWEB_LOGINTERVAL" ] && PARAMS="$PARAMS -I $VBOXWEB_LOGINTERVAL" # prevent inheriting this setting to VBoxSVC unset VBOX_RELEASE_LOG_DEST start_daemon $VBOXWEB_USER $binary $PARAMS > /dev/null 2>&1 diff --git a/src/VBox/Installer/solaris/Makefile.kmk b/src/VBox/Installer/solaris/Makefile.kmk index 47615c6bc..5dc319e91 100644 --- a/src/VBox/Installer/solaris/Makefile.kmk +++ b/src/VBox/Installer/solaris/Makefile.kmk @@ -4,7 +4,7 @@ # # -# Copyright (C) 2007-2010 Oracle Corporation +# Copyright (C) 2007-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -157,6 +157,7 @@ solaris-bin_SOURCES = \ $(VBOX_PATH_SOL_INST_SRC)/vboxconfig.sh \ $(VBOX_PATH_SOL_INST_SRC)/VBox.sh \ $(VBOX_PATH_SOL_INST_SRC)/pkginstall.sh \ + $(VBOX_PATH_SOL_INST_SRC)/smf-vboxballoonctrl.sh \ $(if $(VBOX_WITH_WEBSERVICES),$(VBOX_PATH_SOL_INST_SRC)/smf-vboxwebsrv.sh,) solaris-drv-confs_INST = bin/ @@ -300,7 +301,8 @@ SOLARIS_COMMON_EXES = \ VBox.sh \ pkginstall.sh \ $(if $(VBOX_WITH_PYTHON),vboxshell.py,) \ - $(if $(VBOX_WITH_WEBSERVICES),smf-vboxwebsrv.sh,) \ + smf-vboxballoonctrl.sh \ + $(if $(VBOX_WITH_WEBSERVICES),smf-vboxwebsrv.sh,) # Things packed explicitly, not from $(PATH_BIN), track these to clean-up properly SOLARIS_EXTRAS = \ @@ -312,6 +314,7 @@ SOLARIS_EXTRAS = \ $(if $(not $(VBOX_WITH_NETFLT))vnic_term.sh,) \ $(if $(VBOX_WITH_QTGUI),virtualbox.desktop,) \ virtualbox.xml \ + virtualbox-balloonctrl.xml \ virtualbox-webservice.xml \ virtualbox-zoneaccess.xml \ VBoxQtconfig \ @@ -388,6 +391,7 @@ SOLARIS_STRIP_BINS += \ SOLARIS_STRIP_EXES += \ $(if $(VBOX_WITH_HEADLESS),VBoxHeadless) \ + VBoxBalloonCtrl \ $(if $(VBOX_WITH_WEBSERVICES),vboxwebsrv) \ $(if $(VBOX_WITH_WEBSERVICES),webtest) @@ -616,6 +620,7 @@ endif $(QUIET)$(if $(VBOX_WITH_QTGUI),$(LN_SYMLINK) -f ../../$(SOLARIS_VBOXINST_SUBDIR)/VBox.sh $(SOLARIS_USRBIN_DIR)/VBoxQtconfig,) $(QUIET)$(INSTALL) -m 0644 $(VBOX_PATH_SOL_INST_SRC)/virtualbox-zoneaccess.xml $(SOLARIS_VBOXSMF_DIR)/virtualbox-zoneaccess.xml $(QUIET)$(if $(VBOX_WITH_WEBSERVICES),$(INSTALL) -m 0644 $(VBOX_PATH_SOL_INST_SRC)/virtualbox-webservice.xml $(SOLARIS_VBOXSMF_DIR)/virtualbox-webservice.xml,) + $(QUIET)$(INSTALL) -m 0644 $(VBOX_PATH_SOL_INST_SRC)/virtualbox-balloonctrl.xml $(SOLARIS_VBOXSMF_DIR)/virtualbox-balloonctrl.xml $(QUIET)$(if $(not $(VBOX_WITH_NETFLT))$(INSTALL) -m 0755 $(PATH_ROOT)/src/VBox/Devices/Network/solaris/vnicinit_solaris.sh $(SOLARIS_VBOXINST_DIR)/vnic_setup.sh,) $(QUIET)$(if $(not $(VBOX_WITH_NETFLT))$(INSTALL) -m 0755 $(PATH_ROOT)/src/VBox/Devices/Network/solaris/vnicterm_solaris.sh $(SOLARIS_VBOXINST_DIR)/vnic_term.sh,) $(QUIET)$(SED) \ diff --git a/src/VBox/Installer/solaris/makepackage.sh b/src/VBox/Installer/solaris/makepackage.sh index a4f9efe58..0cf7ca3e1 100755 --- a/src/VBox/Installer/solaris/makepackage.sh +++ b/src/VBox/Installer/solaris/makepackage.sh @@ -5,7 +5,7 @@ # # -# Copyright (C) 2007-2010 Oracle Corporation +# Copyright (C) 2007-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -115,6 +115,7 @@ fi cd "$VBOX_INSTALLED_DIR" ln -f ./VBoxISAExec $VBOX_INSTALLED_DIR/VBoxManage ln -f ./VBoxISAExec $VBOX_INSTALLED_DIR/VBoxSDL +ln -f ./VBoxISAExec $VBOX_INSTALLED_DIR/VBoxBalloonCtrl ln -f ./VBoxISAExec $VBOX_INSTALLED_DIR/vboxwebsrv ln -f ./VBoxISAExec $VBOX_INSTALLED_DIR/webtest ln -f ./VBoxISAExec $VBOX_INSTALLED_DIR/VBoxZoneAccess @@ -175,6 +176,7 @@ filelist_fixup prototype '$3 == "platform/i86pc/kernel/drv/amd64/vboxusb"' # Manifest class action scripts filelist_fixup prototype '$3 == "var/svc/manifest/application/virtualbox/virtualbox-webservice.xml"' '$2 = "manifest";$6 = "sys"' +filelist_fixup prototype '$3 == "var/svc/manifest/application/virtualbox/virtualbox-balloonctrl.xml"' '$2 = "manifest";$6 = "sys"' filelist_fixup prototype '$3 == "var/svc/manifest/application/virtualbox/virtualbox-zoneaccess.xml"' '$2 = "manifest";$6 = "sys"' # Use 'root' as group so as to match attributes with the previous installation and prevent a conflict. Otherwise pkgadd bails out thinking diff --git a/src/VBox/Installer/solaris/smf-vboxballoonctrl.sh b/src/VBox/Installer/solaris/smf-vboxballoonctrl.sh new file mode 100755 index 000000000..9b4ee5b05 --- /dev/null +++ b/src/VBox/Installer/solaris/smf-vboxballoonctrl.sh @@ -0,0 +1,81 @@ +#!/sbin/sh +# $Id: smf-vboxballoonctrl.sh $ + +# Copyright (C) 2008-2011 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. +# + +# +# smf-vboxballoonctrl method +# +# Argument is the method name (start, stop, ...) + +. /lib/svc/share/smf_include.sh + +VW_OPT="$1" +VW_EXIT=0 + +case $VW_OPT in + start) + if [ ! -x /opt/VirtualBox/VBoxBalloonCtrl ]; then + echo "ERROR: /opt/VirtualBox/VBoxBalloonCtrl does not exist." + return $SMF_EXIT_ERR_CONFIG + fi + + if [ ! -f /opt/VirtualBox/VBoxBalloonCtrl ]; then + echo "ERROR: /opt/VirtualBox/VBoxBalloonCtrl does not exist." + return $SMF_EXIT_ERR_CONFIG + fi + + # Get svc configuration + VW_USER=`/usr/bin/svcprop -p config/user $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_USER= + VW_INTERVAL=`/usr/bin/svcprop -p config/interval $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_INTERVAL= + VW_INCREMENT=`/usr/bin/svcprop -p config/increment $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_INCREMENT= + VW_DECREMENT=`/usr/bin/svcprop -p config/decrement $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_DECREMENT= + VW_LOWERLIMIT=`/usr/bin/svcprop -p config/lowerlimit $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_LOWERLIMIT= + VW_ROTATE=`/usr/bin/svcprop -p config/logrotate $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_ROTATE= + VW_LOGSIZE=`/usr/bin/svcprop -p config/logsize $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_LOGSIZE= + VW_LOGINTERVAL=`/usr/bin/svcprop -p config/loginterval $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_LOGINTERVAL= + + # Provide sensible defaults + [ -z "$VW_USER" ] && VW_USER=root + [ -z "$VW_INTERVAL" ] && VW_INTERVAL=10000 + [ -z "$VW_INCREMENT" ] && VW_INCREMENT=256 + [ -z "$VW_DECREMENT" ] && VW_DECREMENT=128 + [ -z "$VW_LOWERLIMIT" ] && VW_LOWERLIMIT=64 + [ -z "$VW_ROTATE" ] && VW_ROTATE=10 + [ -z "$VW_LOGSIZE" ] && VW_LOGSIZE=104857600 + [ -z "$VW_LOGINTERVAL" ] && VW_LOGINTERVAL=86400 + exec su - "$VW_USER" -c "/opt/VirtualBox/VBoxBalloonCtrl --background --interval \"$VW_INTERVAL\" --balloon-inc \"$VW_INCREMENT\" --balloon-dec \"$VW_DECREMENT\" --balloon-lower-limit \"$VW_LOWERLIMIT\" --logrotate \"$VW_ROTATE\" --logsize \"$VW_LOGSIZE\" --loginterval \"$VW_LOGINTERVAL\"" + + VW_EXIT=$? + if [ $VW_EXIT != 0 ]; then + echo "VBoxBalloonCtrl failed with $VW_EXIT." + VW_EXIT=1 + fi + ;; + stop) + # Kill service contract + smf_kill_contract $2 TERM 1 + ;; + *) + VW_EXIT=$SMF_EXIT_ERR_CONFIG + ;; +esac + +exit $VW_EXIT diff --git a/src/VBox/Installer/solaris/smf-vboxwebsrv.sh b/src/VBox/Installer/solaris/smf-vboxwebsrv.sh index 604059bc2..9a5b57d8f 100755 --- a/src/VBox/Installer/solaris/smf-vboxwebsrv.sh +++ b/src/VBox/Installer/solaris/smf-vboxwebsrv.sh @@ -1,7 +1,7 @@ #!/sbin/sh # $Id: smf-vboxwebsrv.sh $ -# Copyright (C) 2008-2010 Oracle Corporation +# Copyright (C) 2008-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -47,6 +47,12 @@ case $VW_OPT in [ $? != 0 ] && VW_CHECK_INTERVAL= VW_KEEPALIVE=`/usr/bin/svcprop -p config/keepalive $SMF_FMRI 2>/dev/null` [ $? != 0 ] && VW_KEEPALIVE= + VW_ROTATE=`/usr/bin/svcprop -p config/logrotate $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_ROTATE= + VW_LOGSIZE=`/usr/bin/svcprop -p config/logsize $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_LOGSIZE= + VW_LOGINTERVAL=`/usr/bin/svcprop -p config/loginterval $SMF_FMRI 2>/dev/null` + [ $? != 0 ] && VW_LOGINTERVAL= # Provide sensible defaults [ -z "$VW_USER" ] && VW_USER=root @@ -54,8 +60,11 @@ case $VW_OPT in [ -z "$VW_PORT" -o "$VW_PORT" -eq 0 ] && VW_PORT=18083 [ -z "$VW_TIMEOUT" ] && VW_TIMEOUT=20 [ -z "$VW_CHECK_INTERVAL" ] && VW_CHECK_INTERVAL=5 - [ -z "$VW_KEEPALIVE" ] && VW_KEEPALIVE=1000 - exec su - "$VW_USER" -c "/opt/VirtualBox/vboxwebsrv --host \"$VW_HOST\" --port \"$VW_PORT\" --timeout \"$VW_TIMEOUT\" --check-interval \"$VW_CHECK_INTERVAL\" --keepalive \"$VW_KEEPALIVE\"" + [ -z "$VW_KEEPALIVE" ] && VW_KEEPALIVE=100 + [ -z "$VW_ROTATE" ] && VW_ROTATE=10 + [ -z "$VW_LOGSIZE" ] && VW_LOGSIZE=104857600 + [ -z "$VW_LOGINTERVAL" ] && VW_LOGINTERVAL=86400 + exec su - "$VW_USER" -c "/opt/VirtualBox/vboxwebsrv --background --host \"$VW_HOST\" --port \"$VW_PORT\" --timeout \"$VW_TIMEOUT\" --check-interval \"$VW_CHECK_INTERVAL\" --keepalive \"$VW_KEEPALIVE\" --logrotate \"$VW_ROTATE\" --logsize \"$VW_LOGSIZE\" --loginterval \"$VW_LOGINTERVAL\"" VW_EXIT=$? if [ $VW_EXIT != 0 ]; then diff --git a/src/VBox/Installer/solaris/vboxconfig.sh b/src/VBox/Installer/solaris/vboxconfig.sh index d305b4f02..1fd366606 100755 --- a/src/VBox/Installer/solaris/vboxconfig.sh +++ b/src/VBox/Installer/solaris/vboxconfig.sh @@ -685,10 +685,24 @@ cleanup_install() fi fi + # stop balloonctrl + servicefound=`$BIN_SVCS -a | grep "virtualbox/balloonctrl" 2>/dev/null` + if test ! -z "$servicefound"; then + $BIN_SVCADM disable -s svc:/application/virtualbox/balloonctrl:default + # Don't delete the manifest, this is handled by the manifest class action + # $BIN_SVCCFG delete svc:/application/virtualbox/balloonctrl:default + if test "$?" -eq 0; then + subprint "Unloaded: Balloon control service" + else + subprint "Unloading: Balloon control service ...ERROR(S)." + fi + fi + + # stop zoneaccess service servicefound=`$BIN_SVCS -a | grep "virtualbox/zoneaccess" 2>/dev/null` if test ! -z "$servicefound"; then - $BIN_SVCADM disable -s svc:/application/virtualbox/zoneaccess + $BIN_SVCADM disable -s svc:/application/virtualbox/zoneaccess:default # Don't delete the manifest, this is handled by the manifest class action # $BIN_SVCCFG delete svc:/application/virtualbox/zoneaccess if test "$?" -eq 0; then diff --git a/src/VBox/Installer/solaris/virtualbox-balloonctrl.xml b/src/VBox/Installer/solaris/virtualbox-balloonctrl.xml new file mode 100644 index 000000000..610d59d6b --- /dev/null +++ b/src/VBox/Installer/solaris/virtualbox-balloonctrl.xml @@ -0,0 +1,105 @@ +<?xml version="1.0"?> +<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1"> +<!-- +# Solaris SMF service manifest for VirtualBox balloon control service. +# $Id$ + + Copyright (C) 2008-2011 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. +--> + +<service_bundle type='manifest' name='SUNWvbox:balloonctrl'> + +<service + name='application/virtualbox/balloonctrl' + type='service' + version='1'> + + <single_instance /> + + <dependency + name='fs-local' + grouping='require_all' + restart_on='none' + type='service'> + <service_fmri value='svc:/system/filesystem/local' /> + </dependency> + + <dependency + name='network-service' + grouping='require_all' + restart_on='none' + type='service'> + <service_fmri value='svc:/network/service' /> + </dependency> + + <dependency + name='name-services' + grouping='require_all' + restart_on='refresh' + type='service'> + <service_fmri value='svc:/milestone/name-services' /> + </dependency> + + <instance name='default' enabled='false'> + + <dependent + name='virtualbox-balloonctrl_multi-user' + grouping='optional_all' + restart_on='none'> + <service_fmri value='svc:/milestone/multi-user' /> + </dependent> + + <exec_method + type='method' + name='start' + exec='/opt/VirtualBox/smf-vboxballoonctrl.sh %m' + timeout_seconds='15'> + <method_context> + <method_credential user='root' group='root' /> + </method_context> + </exec_method> + + <exec_method + type='method' + name='stop' + exec=':kill' + timeout_seconds='15'> + <method_context> + <method_credential user='root' group='root' /> + </method_context> + </exec_method> + + <property_group name='startd' type='framework'> + <!-- sub-process core dumps/signals shouldn't restart session --> + <propval name='ignore_error' type='astring' value='core,signal' /> + </property_group> + + <property_group name='config' type='application'> + <propval name='user' type='astring' value='root' /> + <propval name='host' type='astring' value='localhost' /> + <propval name='port' type='integer' value='18083' /> + </property_group> + + <template> + <common_name> + <loctext xml:lang='C'> + VirtualBox Webservice + </loctext> + </common_name> + </template> + + </instance> + + <stability value='External' /> + +</service> + +</service_bundle> diff --git a/src/VBox/Installer/solaris/virtualbox-webservice.xml b/src/VBox/Installer/solaris/virtualbox-webservice.xml index 7dd95cedc..3c217c2f7 100644 --- a/src/VBox/Installer/solaris/virtualbox-webservice.xml +++ b/src/VBox/Installer/solaris/virtualbox-webservice.xml @@ -4,7 +4,7 @@ # Solaris SMF service manifest for VirtualBox webservice server. # $Id$ - Copyright (C) 2008-2010 Oracle Corporation + Copyright (C) 2008-2011 Oracle Corporation This file is part of VirtualBox Open Source Edition (OSE), as available from http://www.virtualbox.org. This file is free software; @@ -78,9 +78,6 @@ </exec_method> <property_group name='startd' type='framework'> - <!-- The default contract restarter behavior is not appropriate, - it will kill VMs if the service is restarted. --> - <propval name='duration' type='astring' value='child' /> <!-- sub-process core dumps/signals shouldn't restart session --> <propval name='ignore_error' type='astring' value='core,signal' /> </property_group> diff --git a/src/VBox/Installer/win/VirtualBox.wxs b/src/VBox/Installer/win/VirtualBox.wxs index 53914cde1..93d4cde34 100644 --- a/src/VBox/Installer/win/VirtualBox.wxs +++ b/src/VBox/Installer/win/VirtualBox.wxs @@ -423,6 +423,8 @@ <File Id="vboxepha" Name="VBoxEPHA.exe" LongName="VBoxExtPackHelperApp.exe" DiskId="1" Vital="yes" Source="$(env.PATH_OUT)\bin\VBoxExtPackHelperApp.exe"/> <?endif ?> + <File Id="vboxballoonctrl" Name="VBoxBCtl.exe" LongName="VBoxBalloonCtrl.exe" DiskId="1" Vital="yes" + Source="$(env.PATH_OUT)\bin\VBoxBalloonCtrl.exe"/> <!-- VBox DLL files --> <File Id="vboxdddll" Name="VBoxDD.dll" DiskId="1" Vital="yes" diff --git a/src/VBox/Main/Makefile.kmk b/src/VBox/Main/Makefile.kmk index 659fd380f..6a21eccc4 100644 --- a/src/VBox/Main/Makefile.kmk +++ b/src/VBox/Main/Makefile.kmk @@ -243,10 +243,6 @@ VBoxSVC_DEFS.solaris += VBOX_USE_LIBHAL VBoxSVC_DEFS.freebsd += VBOX_USE_LIBHAL VBoxSVC_CXXFLAGS = $(filter-out -Wno-unused,$(TEMPLATE_VBOXMAINEXE_CXXFLAGS)) -## @todo We're disabling optimizations on FreeBSD to work around strange linker -# errors in release builds. Figure out why and how to work around it in a -# more optimal fashion. -VBoxSVC_CXXFLAGS.freebsd = -O0 VBoxSVC_INCS = \ include \ diff --git a/src/VBox/Main/idl/VirtualBox.xidl b/src/VBox/Main/idl/VirtualBox.xidl index 0d39befe5..16ed12321 100644 --- a/src/VBox/Main/idl/VirtualBox.xidl +++ b/src/VBox/Main/idl/VirtualBox.xidl @@ -4300,6 +4300,11 @@ <li><tt>"gui"</tt>: VirtualBox Qt GUI front-end</li> <li><tt>"headless"</tt>: VBoxHeadless (VRDE Server) front-end</li> <li><tt>"sdl"</tt>: VirtualBox SDL front-end</li> + <li><tt>"emergencystop"</tt>: reserved value, used for aborting + the currently running VM or session owner. In this case the + @a session parameter may be @c NULL (if it is non-null it isn't + used in any way), and the @a progress return value will be always + NULL. The operation completes immediately.</li> </ul> </desc> </param> @@ -4555,11 +4560,9 @@ <method name="setBandwidthGroupForDevice"> <desc> - Sets the passthrough mode of an existing DVD device. Changing the - setting while the VM is running is forbidden. The setting is only used - if at VM start the device is configured as a host DVD drive, in all - other cases it is ignored. The device must already exist; see - <link to="IMachine::attachDevice"/> for how to attach a new device. + Sets the bandwidth group of an existing storage device. + The device must already exist; see <link to="IMachine::attachDevice"/> + for how to attach a new device. The @a controllerPort and @a device parameters specify the device slot and have have the same meaning as with <link to="IMachine::attachDevice" />. diff --git a/src/VBox/Main/include/ConsoleImpl.h b/src/VBox/Main/include/ConsoleImpl.h index 202459151..3688794f6 100644 --- a/src/VBox/Main/include/ConsoleImpl.h +++ b/src/VBox/Main/include/ConsoleImpl.h @@ -407,21 +407,31 @@ public: class SharedFolderData { public: - SharedFolderData() {} - SharedFolderData(Bstr aHostPath, BOOL aWritable, BOOL aAutoMount) - : mHostPath(aHostPath) - , mWritable(aWritable) - , mAutoMount(aAutoMount) {} + SharedFolderData() + { } + + SharedFolderData(const Utf8Str &aHostPath, + bool aWritable, + bool aAutoMount) + : m_strHostPath(aHostPath), + m_fWritable(aWritable), + m_fAutoMount(aAutoMount) + { } + + // copy constructor SharedFolderData(const SharedFolderData& aThat) - : mHostPath(aThat.mHostPath) - , mWritable(aThat.mWritable) - , mAutoMount(aThat.mAutoMount) {} - Bstr mHostPath; - BOOL mWritable; - BOOL mAutoMount; + : m_strHostPath(aThat.m_strHostPath), + m_fWritable(aThat.m_fWritable), + m_fAutoMount(aThat.m_fAutoMount) + { } + + Utf8Str m_strHostPath; + bool m_fWritable; + bool m_fAutoMount; }; - typedef std::map <Bstr, ComObjPtr<SharedFolder> > SharedFolderMap; - typedef std::map <Bstr, SharedFolderData> SharedFolderDataMap; + + typedef std::map<Utf8Str, ComObjPtr<SharedFolder> > SharedFolderMap; + typedef std::map<Utf8Str, SharedFolderData> SharedFolderDataMap; private: @@ -449,16 +459,16 @@ private: return setMachineState(aMachineState, false /* aUpdateServer */); } - HRESULT findSharedFolder(CBSTR aName, + HRESULT findSharedFolder(const Utf8Str &strName, ComObjPtr<SharedFolder> &aSharedFolder, bool aSetError = false); HRESULT fetchSharedFolders(BOOL aGlobal); - bool findOtherSharedFolder(IN_BSTR aName, + bool findOtherSharedFolder(const Utf8Str &straName, SharedFolderDataMap::const_iterator &aIt); - HRESULT createSharedFolder(CBSTR aName, SharedFolderData aData); - HRESULT removeSharedFolder(CBSTR aName); + HRESULT createSharedFolder(const Utf8Str &strName, const SharedFolderData &aData); + HRESULT removeSharedFolder(const Utf8Str &strName); static DECLCALLBACK(int) configConstructor(PVM pVM, void *pvConsole); int configConstructorInner(PVM pVM, AutoWriteLock *pAlock); @@ -564,7 +574,11 @@ private: static DECLCALLBACK(int) saveStateThread(RTTHREAD Thread, void *pvUser); static DECLCALLBACK(int) powerDownThread(RTTHREAD Thread, void *pvUser); - static DECLCALLBACK(int) vmm2User_SaveState(PCVMM2USERMETHODS pThis, PVM pVM); + static DECLCALLBACK(int) vmm2User_SaveState(PCVMM2USERMETHODS pThis, PUVM pUVM); + static DECLCALLBACK(void) vmm2User_NotifyEmtInit(PCVMM2USERMETHODS pThis, PUVM pUVM, PUVMCPU pUVCpu); + static DECLCALLBACK(void) vmm2User_NotifyEmtTerm(PCVMM2USERMETHODS pThis, PUVM pUVM, PUVMCPU pUVCpu); + static DECLCALLBACK(void) vmm2User_NotifyPdmtInit(PCVMM2USERMETHODS pThis, PUVM pUVM); + static DECLCALLBACK(void) vmm2User_NotifyPdmtTerm(PCVMM2USERMETHODS pThis, PUVM pUVM); static DECLCALLBACK(void *) drvStatus_QueryInterface(PPDMIBASE pInterface, const char *pszIID); static DECLCALLBACK(void) drvStatus_UnitChanged(PPDMILEDCONNECTORS pInterface, unsigned iLUN); @@ -593,9 +607,10 @@ private: ComSafeArrayOut(LONG64, aTimestamps), ComSafeArrayOut(BSTR, aFlags)); - bool enabledGuestPropertiesVRDP(void); - void updateGuestPropertiesVRDPLogon(uint32_t u32ClientId, const char *pszUser, const char *pszDomain); - void updateGuestPropertiesVRDPDisconnect(uint32_t u32ClientId); + void guestPropertiesHandleVMReset(void); + bool guestPropertiesVRDPEnabled(void); + void guestPropertiesVRDPUpdateLogon(uint32_t u32ClientId, const char *pszUser, const char *pszDomain); + void guestPropertiesVRDPUpdateDisconnect(uint32_t u32ClientId); #endif /** @name Teleporter support @@ -632,9 +647,9 @@ private: USBDeviceList mUSBDevices; RemoteUSBDeviceList mRemoteUSBDevices; - SharedFolderMap mSharedFolders; - SharedFolderDataMap mMachineSharedFolders; - SharedFolderDataMap mGlobalSharedFolders; + SharedFolderDataMap m_mapGlobalSharedFolders; + SharedFolderDataMap m_mapMachineSharedFolders; + SharedFolderMap m_mapSharedFolders; // the console instances /** The VM instance handle. */ PVM mpVM; @@ -655,9 +670,11 @@ private: /** true if we already listed the disk type of the snapshot folder. */ bool mfSnapshotFolderDiskTypeShown : 1; - /** Pointer to the VMM -> User (that's us) callbacks. - * This structure is followed by a pointer to the Console object. */ - PCVMM2USERMETHODS mpVmm2UserMethods; + /** Pointer to the VMM -> User (that's us) callbacks. */ + struct MYVMM2USERMETHODS : public VMM2USERMETHODS + { + Console *pConsole; + } *mpVmm2UserMethods; /** The current network attachment type in the VM. * This doesn't have to match the network attachment type maintained in the diff --git a/src/VBox/Main/include/MachineImpl.h b/src/VBox/Main/include/MachineImpl.h index b201d4daf..288caac0b 100644 --- a/src/VBox/Main/include/MachineImpl.h +++ b/src/VBox/Main/include/MachineImpl.h @@ -32,6 +32,7 @@ #include "BIOSSettingsImpl.h" #include "StorageControllerImpl.h" // required for MachineImpl.h to compile on Windows #include "BandwidthControlImpl.h" +#include "BandwidthGroupImpl.h" #include "VBox/settings.h" #ifdef VBOX_WITH_RESOURCE_USAGE_API #include "Performance.h" @@ -125,13 +126,13 @@ public: /** list of controls of all opened remote sessions */ RemoteControlList mRemoteControls; - /** openRemoteSession() and OnSessionEnd() progress indicator */ + /** launchVMProcess() and OnSessionEnd() progress indicator */ ComObjPtr<ProgressProxy> mProgress; /** - * PID of the session object that must be passed to openSession() to - * finalize the openRemoteSession() request (i.e., PID of the - * process created by openRemoteSession()) + * PID of the session object that must be passed to openSession() + * to finalize the launchVMProcess() request (i.e., PID of the + * process created by launchVMProcess()) */ RTPROCESS mPid; @@ -642,9 +643,10 @@ public: void getLogFolder(Utf8Str &aLogFolder); Utf8Str queryLogFilename(ULONG idx); - HRESULT openRemoteSession(IInternalSessionControl *aControl, - IN_BSTR aType, IN_BSTR aEnvironment, - ProgressProxy *aProgress); + HRESULT launchVMProcess(IInternalSessionControl *aControl, + const Utf8Str &strType, + const Utf8Str &strEnvironment, + ProgressProxy *aProgress); HRESULT getDirectControl(ComPtr<IInternalSessionControl> *directControl) { @@ -714,6 +716,15 @@ public: BOOL *aRegistered = NULL); void releaseStateDependency(); + HRESULT getBandwidthGroup(const Utf8Str &strBandwidthGroup, + ComObjPtr<BandwidthGroup> &pBandwidthGroup, + bool fSetError = false) + { + return mBandwidthControl->getBandwidthGroupByName(strBandwidthGroup, + pBandwidthGroup, + fSetError); + } + protected: HRESULT checkStateDependency(StateDependency aDepType); @@ -724,7 +735,7 @@ protected: virtual HRESULT setMachineState(MachineState_T aMachineState); - HRESULT findSharedFolder(CBSTR aName, + HRESULT findSharedFolder(const Utf8Str &aName, ComObjPtr<SharedFolder> &aSharedFolder, bool aSetError = false); diff --git a/src/VBox/Main/include/MediumAttachmentImpl.h b/src/VBox/Main/include/MediumAttachmentImpl.h index e6994ef46..98727b50d 100644 --- a/src/VBox/Main/include/MediumAttachmentImpl.h +++ b/src/VBox/Main/include/MediumAttachmentImpl.h @@ -49,7 +49,7 @@ public: LONG aDevice, DeviceType_T aType, bool fPassthrough, - BandwidthGroup *aBandwidthGroup); + const Utf8Str &strBandwidthGroup); void uninit(); HRESULT FinalConstruct(); @@ -79,7 +79,7 @@ public: LONG getDevice() const; DeviceType_T getType() const; bool getPassthrough() const; - const ComObjPtr<BandwidthGroup>& getBandwidthGroup() const; + const Utf8Str& getBandwidthGroup() const; bool matches(CBSTR aControllerName, LONG aPort, LONG aDevice); @@ -90,7 +90,9 @@ public: void updatePassthrough(bool aPassthrough); /** Must be called from under this object's write lock. */ - void updateBandwidthGroup(const ComObjPtr<BandwidthGroup> &aBandwidthGroup); + void updateBandwidthGroup(const Utf8Str &aBandwidthGroup); + + void updateParentMachine(Machine * const pMachine); /** Get a unique and somewhat descriptive name for logging. */ const char* getLogName(void) const { return mLogName.c_str(); } diff --git a/src/VBox/Main/include/SharedFolderImpl.h b/src/VBox/Main/include/SharedFolderImpl.h index c5b51b477..43ebfaf97 100644 --- a/src/VBox/Main/include/SharedFolderImpl.h +++ b/src/VBox/Main/include/SharedFolderImpl.h @@ -29,17 +29,6 @@ class ATL_NO_VTABLE SharedFolder : { public: - struct Data - { - Data() {} - - const Bstr name; - const Bstr hostPath; - BOOL writable; - BOOL autoMount; - Bstr lastAccessError; - }; - VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(SharedFolder, ISharedFolder) DECLARE_NOT_AGGREGATABLE(SharedFolder) @@ -58,10 +47,10 @@ public: void FinalRelease(); // public initializer/uninitializer for internal purposes only - HRESULT init(Machine *aMachine, CBSTR aName, CBSTR aHostPath, BOOL aWritable, BOOL aAutoMount); + HRESULT init(Machine *aMachine, const Utf8Str &aName, const Utf8Str &aHostPath, bool aWritable, bool aAutoMount, bool fFailOnError); HRESULT initCopy(Machine *aMachine, SharedFolder *aThat); - HRESULT init(Console *aConsole, CBSTR aName, CBSTR aHostPath, BOOL aWritable, BOOL aAutoMount); - HRESULT init(VirtualBox *aVirtualBox, CBSTR aName, CBSTR aHostPath, BOOL aWritable, BOOL aAutoMount); + HRESULT init(Console *aConsole, const Utf8Str &aName, const Utf8Str &aHostPath, bool aWritable, bool aAutoMount, bool fFailOnError); +// HRESULT init(VirtualBox *aVirtualBox, const Utf8Str &aName, const Utf8Str &aHostPath, bool aWritable, bool aAutoMount, bool fFailOnError); void uninit(); // ISharedFolder properties @@ -75,19 +64,38 @@ public: // public methods for internal purposes only // (ensure there is a caller and a read lock before calling them!) - // public methods that don't need a lock (because access constant data) - // (ensure there is a caller added before calling them!) - - const Bstr& getName() const { return m.name; } - const Bstr& getHostPath() const { return m.hostPath; } - BOOL isWritable() const { return m.writable; } - BOOL isAutoMounted() const { return m.autoMount; } + /** + * Public internal method. Returns the shared folder's name. Needs caller! Locking not necessary. + * @return + */ + const Utf8Str& getName() const; + + /** + * Public internal method. Returns the shared folder's host path. Needs caller! Locking not necessary. + * @return + */ + const Utf8Str& getHostPath() const; + + /** + * Public internal method. Returns true if the shared folder is writable. Needs caller and locking! + * @return + */ + bool isWritable() const; + + /** + * Public internal method. Returns true if the shared folder is auto-mounted. Needs caller and locking! + * @return + */ + bool isAutoMounted() const; protected: HRESULT protectedInit(VirtualBoxBase *aParent, - CBSTR aName, CBSTR aHostPath, - BOOL aWritable, BOOL aAutoMount); + const Utf8Str &aName, + const Utf8Str &aHostPath, + bool aWritable, + bool aAutoMount, + bool fFailOnError); private: VirtualBoxBase * const mParent; @@ -97,7 +105,8 @@ private: Console * const mConsole; VirtualBox * const mVirtualBox; - Data m; + struct Data; // opaque data struct, defined in SharedFolderImpl.cpp + Data *m; }; #endif // ____H_SHAREDFOLDERIMPL diff --git a/src/VBox/Main/include/USBProxyService.h b/src/VBox/Main/include/USBProxyService.h index f9720ab9b..b8c8d4d05 100644 --- a/src/VBox/Main/include/USBProxyService.h +++ b/src/VBox/Main/include/USBProxyService.h @@ -211,7 +211,13 @@ public: virtual int releaseDevice(HostUSBDevice *aDevice); protected: +#ifdef TESTCASE + virtual +#endif int initUsbfs(void); +#ifdef TESTCASE + virtual +#endif int initSysfs(void); void doUsbfsCleanupAsNeeded(void); virtual int wait(RTMSINTERVAL aMillies); diff --git a/src/VBox/Main/include/VirtualBoxBase.h b/src/VBox/Main/include/VirtualBoxBase.h index 92c60d17c..98ed8ce58 100644 --- a/src/VBox/Main/include/VirtualBoxBase.h +++ b/src/VBox/Main/include/VirtualBoxBase.h @@ -714,11 +714,32 @@ public: const Utf8Str &aText, bool aWarning, bool aLogIt); + static void clearError(void); HRESULT setError(HRESULT aResultCode, const char *pcsz, ...); HRESULT setWarning(HRESULT aResultCode, const char *pcsz, ...); HRESULT setErrorNoLog(HRESULT aResultCode, const char *pcsz, ...); + + /** Initialize COM for a new thread. */ + static HRESULT initializeComForThread(void) + { +#ifndef VBOX_WITH_XPCOM + HRESULT hrc = CoInitializeEx(NULL, COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE | COINIT_SPEED_OVER_MEMORY); + AssertComRCReturn(hrc, hrc); +#endif + return S_OK; + } + + /** Uninitializes COM for a dying thread. */ + static void uninitializeComForThread(void) + { +#ifndef VBOX_WITH_XPCOM + CoUninitialize(); +#endif + } + + private: void setState(State aState) diff --git a/src/VBox/Main/include/netif.h b/src/VBox/Main/include/netif.h index f98bf74ef..3942926c5 100644 --- a/src/VBox/Main/include/netif.h +++ b/src/VBox/Main/include/netif.h @@ -146,9 +146,11 @@ DECLINLINE(Bstr) composeHardwareAddress(PRTMAC aMacPtr) DECLINLINE(Bstr) getDefaultIPv4Address(Bstr bstrIfName) { /* Get the index from the name */ - int iInstance; - if (sscanf(Utf8Str(bstrIfName).c_str(), "vboxnet%d", &iInstance) != 1) - return Bstr("0.0.0.0"); + Utf8Str strTmp = bstrIfName; + const char *pszIfName = strTmp.c_str(); + int iInstance = 0, iPos = strcspn(pszIfName, "0123456789"); + if (pszIfName[iPos]) + iInstance = RTStrToUInt32(pszIfName + iPos); in_addr tmp; #if defined(RT_OS_WINDOWS) diff --git a/src/VBox/Main/src-all/DisplayPNGUtil.cpp b/src/VBox/Main/src-all/DisplayPNGUtil.cpp index 9434dbd47..345becfcc 100644 --- a/src/VBox/Main/src-all/DisplayPNGUtil.cpp +++ b/src/VBox/Main/src-all/DisplayPNGUtil.cpp @@ -152,7 +152,7 @@ int DisplayMakePNG(uint8_t *pu8Data, uint32_t cx, uint32_t cy, ctx.rc = VINF_SUCCESS; png_set_write_fn(png_ptr, - (voidp)&ctx, + (png_voidp)&ctx, png_write_data_fn, png_output_flush_fn); @@ -173,8 +173,8 @@ int DisplayMakePNG(uint8_t *pu8Data, uint32_t cx, uint32_t cy, png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); png_set_bgr(png_ptr); - if (info_ptr->valid & PNG_INFO_IDAT) - png_write_image(png_ptr, info_ptr->row_pointers); + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_IDAT)) + png_write_image(png_ptr, png_get_rows(png_ptr, info_ptr)); png_write_end(png_ptr, info_ptr); diff --git a/src/VBox/Main/src-all/SharedFolderImpl.cpp b/src/VBox/Main/src-all/SharedFolderImpl.cpp index fa5cf21d9..36511132d 100644 --- a/src/VBox/Main/src-all/SharedFolderImpl.cpp +++ b/src/VBox/Main/src-all/SharedFolderImpl.cpp @@ -27,6 +27,24 @@ #include <iprt/cpp/utils.h> #include <iprt/path.h> +///////////////////////////////////////////////////////////////////////////// +// SharedFolder::Data structure +///////////////////////////////////////////////////////////////////////////// + +struct SharedFolder::Data +{ + Data() + : fWritable(false), + fAutoMount(false) + { } + + const Utf8Str strName; + const Utf8Str strHostPath; + bool fWritable; + bool fAutoMount; + Utf8Str strLastAccessError; +}; + // constructor / destructor ///////////////////////////////////////////////////////////////////////////// @@ -36,10 +54,13 @@ SharedFolder::SharedFolder() mConsole(NULL), mVirtualBox(NULL) { + m = new Data; } SharedFolder::~SharedFolder() { + delete m; + m = NULL; } HRESULT SharedFolder::FinalConstruct() @@ -58,16 +79,23 @@ void SharedFolder::FinalRelease() /** * Initializes the shared folder object. * + * This variant initializes a machine instance that lives in the server address space. + * * @param aMachine parent Machine object * @param aName logical name of the shared folder * @param aHostPath full path to the shared folder on the host * @param aWritable writable if true, readonly otherwise * @param aAutoMount if auto mounted by guest true, false otherwise + * @param fFailOnError Whether to fail with an error if the shared folder path is bad. * * @return COM result indicator */ -HRESULT SharedFolder::init (Machine *aMachine, - CBSTR aName, CBSTR aHostPath, BOOL aWritable, BOOL aAutoMount) +HRESULT SharedFolder::init(Machine *aMachine, + const Utf8Str &aName, + const Utf8Str &aHostPath, + bool aWritable, + bool aAutoMount, + bool fFailOnError) { /* Enclose the state transition NotReady->InInit->Ready */ AutoInitSpan autoInitSpan(this); @@ -75,7 +103,7 @@ HRESULT SharedFolder::init (Machine *aMachine, unconst(mMachine) = aMachine; - HRESULT rc = protectedInit(aMachine, aName, aHostPath, aWritable, aAutoMount); + HRESULT rc = protectedInit(aMachine, aName, aHostPath, aWritable, aAutoMount, fFailOnError); /* Confirm a successful initialization when it's the case */ if (SUCCEEDED(rc)) @@ -94,7 +122,7 @@ HRESULT SharedFolder::init (Machine *aMachine, * * @return COM result indicator */ -HRESULT SharedFolder::initCopy (Machine *aMachine, SharedFolder *aThat) +HRESULT SharedFolder::initCopy(Machine *aMachine, SharedFolder *aThat) { ComAssertRet(aThat, E_INVALIDARG); @@ -104,9 +132,12 @@ HRESULT SharedFolder::initCopy (Machine *aMachine, SharedFolder *aThat) unconst(mMachine) = aMachine; - HRESULT rc = protectedInit(aMachine, aThat->m.name.raw(), - aThat->m.hostPath.raw(), aThat->m.writable, - aThat->m.autoMount); + HRESULT rc = protectedInit(aMachine, + aThat->m->strName, + aThat->m->strHostPath, + aThat->m->fWritable, + aThat->m->fAutoMount, + false /* fFailOnError */ ); /* Confirm a successful initialization when it's the case */ if (SUCCEEDED(rc)) @@ -118,15 +149,22 @@ HRESULT SharedFolder::initCopy (Machine *aMachine, SharedFolder *aThat) /** * Initializes the shared folder object. * + * This variant initializes an instance that lives in the console address space. + * * @param aConsole Console parent object * @param aName logical name of the shared folder * @param aHostPath full path to the shared folder on the host * @param aWritable writable if true, readonly otherwise + * @param fFailOnError Whether to fail with an error if the shared folder path is bad. * * @return COM result indicator */ HRESULT SharedFolder::init(Console *aConsole, - CBSTR aName, CBSTR aHostPath, BOOL aWritable, BOOL aAutoMount) + const Utf8Str &aName, + const Utf8Str &aHostPath, + bool aWritable, + bool aAutoMount, + bool fFailOnError) { /* Enclose the state transition NotReady->InInit->Ready */ AutoInitSpan autoInitSpan(this); @@ -134,7 +172,7 @@ HRESULT SharedFolder::init(Console *aConsole, unconst(mConsole) = aConsole; - HRESULT rc = protectedInit(aConsole, aName, aHostPath, aWritable, aAutoMount); + HRESULT rc = protectedInit(aConsole, aName, aHostPath, aWritable, aAutoMount, fFailOnError); /* Confirm a successful initialization when it's the case */ if (SUCCEEDED(rc)) @@ -143,18 +181,27 @@ HRESULT SharedFolder::init(Console *aConsole, return rc; } +#if 0 + /** * Initializes the shared folder object. * + * This variant initializes a global instance that lives in the server address space. It is not presently used. + * * @param aVirtualBox VirtualBox parent object * @param aName logical name of the shared folder * @param aHostPath full path to the shared folder on the host * @param aWritable writable if true, readonly otherwise + * @param fFailOnError Whether to fail with an error if the shared folder path is bad. * * @return COM result indicator */ -HRESULT SharedFolder::init (VirtualBox *aVirtualBox, - CBSTR aName, CBSTR aHostPath, BOOL aWritable, BOOL aAutoMount) +HRESULT SharedFolder::init(VirtualBox *aVirtualBox, + const Utf8Str &aName, + const Utf8Str &aHostPath, + bool aWritable, + bool aAutoMount, + bool fFailOnError) { /* Enclose the state transition NotReady->InInit->Ready */ AutoInitSpan autoInitSpan(this); @@ -171,24 +218,27 @@ HRESULT SharedFolder::init (VirtualBox *aVirtualBox, return rc; } +#endif + /** - * Helper for init() methods. + * Shared initialization code. Called from the other constructors. * * @note * Must be called from under the object's lock! */ HRESULT SharedFolder::protectedInit(VirtualBoxBase *aParent, - CBSTR aName, - CBSTR aHostPath, - BOOL aWritable, - BOOL aAutoMount) + const Utf8Str &aName, + const Utf8Str &aHostPath, + bool aWritable, + bool aAutoMount, + bool fFailOnError) { - LogFlowThisFunc(("aName={%ls}, aHostPath={%ls}, aWritable={%d}, aAutoMount={%d}\n", - aName, aHostPath, aWritable, aAutoMount)); + LogFlowThisFunc(("aName={%s}, aHostPath={%s}, aWritable={%d}, aAutoMount={%d}\n", + aName.c_str(), aHostPath.c_str(), aWritable, aAutoMount)); - ComAssertRet(aParent && aName && aHostPath, E_INVALIDARG); + ComAssertRet(aParent && aName.isNotEmpty() && aHostPath.isNotEmpty(), E_INVALIDARG); - Utf8Str hostPath = Utf8Str (aHostPath); + Utf8Str hostPath = aHostPath; size_t hostPathLen = hostPath.length(); /* Remove the trailing slash unless it's a root directory @@ -209,28 +259,31 @@ HRESULT SharedFolder::protectedInit(VirtualBoxBase *aParent, else hostPath.stripTrailingSlash(); - /* Check whether the path is full (absolute) */ - char hostPathFull[RTPATH_MAX]; - int vrc = RTPathAbsEx(NULL, - hostPath.c_str(), - hostPathFull, - sizeof (hostPathFull)); - if (RT_FAILURE(vrc)) - return setError(E_INVALIDARG, - tr("Invalid shared folder path: '%s' (%Rrc)"), - hostPath.c_str(), vrc); - - if (RTPathCompare(hostPath.c_str(), hostPathFull) != 0) - return setError(E_INVALIDARG, - tr("Shared folder path '%s' is not absolute"), - hostPath.c_str()); + if (fFailOnError) + { + /* Check whether the path is full (absolute) */ + char hostPathFull[RTPATH_MAX]; + int vrc = RTPathAbsEx(NULL, + hostPath.c_str(), + hostPathFull, + sizeof (hostPathFull)); + if (RT_FAILURE(vrc)) + return setError(E_INVALIDARG, + tr("Invalid shared folder path: '%s' (%Rrc)"), + hostPath.c_str(), vrc); + + if (RTPathCompare(hostPath.c_str(), hostPathFull) != 0) + return setError(E_INVALIDARG, + tr("Shared folder path '%s' is not absolute"), + hostPath.c_str()); + } unconst(mParent) = aParent; - unconst(m.name) = aName; - unconst(m.hostPath) = hostPath; - m.writable = aWritable; - m.autoMount = aAutoMount; + unconst(m->strName) = aName; + unconst(m->strHostPath) = hostPath; + m->fWritable = aWritable; + m->fAutoMount = aAutoMount; return S_OK; } @@ -266,7 +319,7 @@ STDMETHODIMP SharedFolder::COMGETTER(Name) (BSTR *aName) if (FAILED(autoCaller.rc())) return autoCaller.rc(); /* mName is constant during life time, no need to lock */ - m.name.cloneTo(aName); + m->strName.cloneTo(aName); return S_OK; } @@ -279,7 +332,7 @@ STDMETHODIMP SharedFolder::COMGETTER(HostPath) (BSTR *aHostPath) if (FAILED(autoCaller.rc())) return autoCaller.rc(); /* mHostPath is constant during life time, no need to lock */ - m.hostPath.cloneTo(aHostPath); + m->strHostPath.cloneTo(aHostPath); return S_OK; } @@ -294,7 +347,7 @@ STDMETHODIMP SharedFolder::COMGETTER(Accessible) (BOOL *aAccessible) /* mName and mHostPath are constant during life time, no need to lock */ /* check whether the host path exists */ - Utf8Str hostPath = Utf8Str(m.hostPath); + Utf8Str hostPath = m->strHostPath; char hostPathFull[RTPATH_MAX]; int vrc = RTPathExists(hostPath.c_str()) ? RTPathReal(hostPath.c_str(), hostPathFull, @@ -308,10 +361,11 @@ STDMETHODIMP SharedFolder::COMGETTER(Accessible) (BOOL *aAccessible) AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - m.lastAccessError = BstrFmt ( - tr ("'%s' is not accessible (%Rrc)"), hostPath.c_str(), vrc); + m->strLastAccessError = Utf8StrFmt(tr("'%s' is not accessible (%Rrc)"), + m->strHostPath.c_str(), + vrc); - LogWarningThisFunc(("m.lastAccessError=\"%ls\"\n", m.lastAccessError.raw())); + LogWarningThisFunc(("m.lastAccessError=\"%s\"\n", m->strLastAccessError.c_str())); *aAccessible = FALSE; return S_OK; @@ -326,7 +380,7 @@ STDMETHODIMP SharedFolder::COMGETTER(Writable) (BOOL *aWritable) AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); - *aWritable = m.writable; + *aWritable = !!m->fWritable; return S_OK; } @@ -340,7 +394,7 @@ STDMETHODIMP SharedFolder::COMGETTER(AutoMount) (BOOL *aAutoMount) AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); - *aAutoMount = m.autoMount; + *aAutoMount = !!m->fAutoMount; return S_OK; } @@ -354,9 +408,29 @@ STDMETHODIMP SharedFolder::COMGETTER(LastAccessError) (BSTR *aLastAccessError) AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); - m.lastAccessError.cloneTo(aLastAccessError); + m->strLastAccessError.cloneTo(aLastAccessError); return S_OK; } +const Utf8Str& SharedFolder::getName() const +{ + return m->strName; +} + +const Utf8Str& SharedFolder::getHostPath() const +{ + return m->strHostPath; +} + +bool SharedFolder::isWritable() const +{ + return m->fWritable; +} + +bool SharedFolder::isAutoMounted() const +{ + return m->fAutoMount; +} + /* vi: set tabstop=4 shiftwidth=4 expandtab: */ diff --git a/src/VBox/Main/src-all/VirtualBoxBase.cpp b/src/VBox/Main/src-all/VirtualBoxBase.cpp index 07835c838..808c83c1e 100644 --- a/src/VBox/Main/src-all/VirtualBoxBase.cpp +++ b/src/VBox/Main/src-all/VirtualBoxBase.cpp @@ -509,6 +509,29 @@ HRESULT VirtualBoxBase::setErrorNoLog(HRESULT aResultCode, const char *pcsz, ... return rc; } +/** + * Clear the current error information. + */ +/*static*/ +void VirtualBoxBase::clearError(void) +{ +#if !defined(VBOX_WITH_XPCOM) + ::SetErrorInfo (0, NULL); +#else + HRESULT rc = S_OK; + nsCOMPtr <nsIExceptionService> es; + es = do_GetService(NS_EXCEPTIONSERVICE_CONTRACTID, &rc); + if (NS_SUCCEEDED(rc)) + { + nsCOMPtr <nsIExceptionManager> em; + rc = es->GetCurrentExceptionManager (getter_AddRefs (em)); + if (SUCCEEDED(rc)) + em->SetCurrentException(NULL); + } +#endif +} + + //////////////////////////////////////////////////////////////////////////////// // // AutoInitSpan methods diff --git a/src/VBox/Main/src-client/ConsoleImpl.cpp b/src/VBox/Main/src-client/ConsoleImpl.cpp index 61765a742..6516567ef 100644 --- a/src/VBox/Main/src-client/ConsoleImpl.cpp +++ b/src/VBox/Main/src-client/ConsoleImpl.cpp @@ -324,6 +324,7 @@ private: typedef ListenerImpl<VmEventListener, Console*> VmEventListenerImpl; + VBOX_LISTENER_DECLARE(VmEventListenerImpl) @@ -368,14 +369,18 @@ HRESULT Console::FinalConstruct() for (unsigned i = 0; i < RT_ELEMENTS(maStorageDevType); ++ i) maStorageDevType[i] = DeviceType_Null; - VMM2USERMETHODS *pVmm2UserMethods = (VMM2USERMETHODS *)RTMemAlloc(sizeof(*mpVmm2UserMethods) + sizeof(Console *)); + MYVMM2USERMETHODS *pVmm2UserMethods = (MYVMM2USERMETHODS *)RTMemAllocZ(sizeof(*mpVmm2UserMethods) + sizeof(Console *)); if (!pVmm2UserMethods) return E_OUTOFMEMORY; - pVmm2UserMethods->u32Magic = VMM2USERMETHODS_MAGIC; - pVmm2UserMethods->u32Version = VMM2USERMETHODS_VERSION; - pVmm2UserMethods->pfnSaveState = Console::vmm2User_SaveState; - pVmm2UserMethods->u32EndMagic = VMM2USERMETHODS_MAGIC; - *(Console **)(pVmm2UserMethods + 1) = this; /* lazy bird. */ + pVmm2UserMethods->u32Magic = VMM2USERMETHODS_MAGIC; + pVmm2UserMethods->u32Version = VMM2USERMETHODS_VERSION; + pVmm2UserMethods->pfnSaveState = Console::vmm2User_SaveState; + pVmm2UserMethods->pfnNotifyEmtInit = Console::vmm2User_NotifyEmtInit; + pVmm2UserMethods->pfnNotifyEmtTerm = Console::vmm2User_NotifyEmtTerm; + pVmm2UserMethods->pfnNotifyPdmtInit = Console::vmm2User_NotifyPdmtInit; + pVmm2UserMethods->pfnNotifyPdmtTerm = Console::vmm2User_NotifyPdmtTerm; + pVmm2UserMethods->u32EndMagic = VMM2USERMETHODS_MAGIC; + pVmm2UserMethods->pConsole = this; mpVmm2UserMethods = pVmm2UserMethods; return S_OK; @@ -581,10 +586,10 @@ void Console::uninit() mBusMgr = NULL; } - mGlobalSharedFolders.clear(); - mMachineSharedFolders.clear(); + m_mapGlobalSharedFolders.clear(); + m_mapMachineSharedFolders.clear(); + m_mapSharedFolders.clear(); // console instances - mSharedFolders.clear(); mRemoteUSBDevices.clear(); mUSBDevices.clear(); @@ -645,27 +650,56 @@ void Console::uninit() #ifdef VBOX_WITH_GUEST_PROPS -bool Console::enabledGuestPropertiesVRDP(void) -{ - Bstr value; - HRESULT hrc = mMachine->GetExtraData(Bstr("VBoxInternal2/EnableGuestPropertiesVRDP").raw(), - value.asOutParam()); - if (hrc == S_OK) +/** + * Handles guest properties on a VM reset. + * At the moment we only delete properties which have the flag + * "TRANSRESET". + */ +void Console::guestPropertiesHandleVMReset(void) +{ + com::SafeArray<BSTR> arrNames; + com::SafeArray<BSTR> arrValues; + com::SafeArray<LONG64> arrTimestamps; + com::SafeArray<BSTR> arrFlags; + HRESULT hrc = enumerateGuestProperties(Bstr("*").raw(), + ComSafeArrayAsOutParam(arrNames), + ComSafeArrayAsOutParam(arrValues), + ComSafeArrayAsOutParam(arrTimestamps), + ComSafeArrayAsOutParam(arrFlags)); + if (SUCCEEDED(hrc)) { - if (value == "1") + for (size_t i = 0; i < arrFlags.size(); i++) { - return true; + /* Delete all properties which have the flag "TRANSRESET". */ + if (Utf8Str(arrFlags[i]).contains("TRANSRESET", Utf8Str::CaseInsensitive)) + { + hrc = mMachine->SetGuestProperty(arrNames[i], Bstr("").raw() /* Value */, + Bstr("").raw() /* Flags */); + if (FAILED(hrc)) + LogRel(("RESET: Could not delete transient property \"%ls\", rc=%Rhrc\n", + arrNames[i], hrc)); + } } } + else + LogRel(("RESET: Unable to enumerate guest properties, rc=%Rhrc\n", hrc)); +} + +bool Console::guestPropertiesVRDPEnabled(void) +{ + Bstr value; + HRESULT hrc = mMachine->GetExtraData(Bstr("VBoxInternal2/EnableGuestPropertiesVRDP").raw(), + value.asOutParam()); + if ( hrc == S_OK + && value == "1") + return true; return false; } -void Console::updateGuestPropertiesVRDPLogon(uint32_t u32ClientId, const char *pszUser, const char *pszDomain) +void Console::guestPropertiesVRDPUpdateLogon(uint32_t u32ClientId, const char *pszUser, const char *pszDomain) { - if (!enabledGuestPropertiesVRDP()) - { + if (!guestPropertiesVRDPEnabled()) return; - } char szPropNm[256]; Bstr bstrReadOnlyGuest(L"RDONLYGUEST"); @@ -697,9 +731,9 @@ void Console::updateGuestPropertiesVRDPLogon(uint32_t u32ClientId, const char *p return; } -void Console::updateGuestPropertiesVRDPDisconnect(uint32_t u32ClientId) +void Console::guestPropertiesVRDPUpdateDisconnect(uint32_t u32ClientId) { - if (!enabledGuestPropertiesVRDP()) + if (!guestPropertiesVRDPEnabled()) return; Bstr bstrReadOnlyGuest(L"RDONLYGUEST"); @@ -933,7 +967,7 @@ int Console::VRDPClientLogon(uint32_t u32ClientId, const char *pszUser, const ch } #ifdef VBOX_WITH_GUEST_PROPS - updateGuestPropertiesVRDPLogon(u32ClientId, pszUser, pszDomain); + guestPropertiesVRDPUpdateLogon(u32ClientId, pszUser, pszDomain); #endif /* VBOX_WITH_GUEST_PROPS */ /* Check if the successfully verified credentials are to be sent to the guest. */ @@ -1068,7 +1102,7 @@ void Console::VRDPClientDisconnect(uint32_t u32ClientId, mConsoleVRDPServer->AuthDisconnect(uuid, u32ClientId); #ifdef VBOX_WITH_GUEST_PROPS - updateGuestPropertiesVRDPDisconnect(u32ClientId); + guestPropertiesVRDPUpdateDisconnect(u32ClientId); #endif /* VBOX_WITH_GUEST_PROPS */ if (u32Clients == 0) @@ -1238,32 +1272,33 @@ Console::saveStateFileExec(PSSMHANDLE pSSM, void *pvUser) AutoReadLock alock(that COMMA_LOCKVAL_SRC_POS); - int vrc = SSMR3PutU32(pSSM, (uint32_t)that->mSharedFolders.size()); + int vrc = SSMR3PutU32(pSSM, (uint32_t)that->m_mapSharedFolders.size()); AssertRC(vrc); - for (SharedFolderMap::const_iterator it = that->mSharedFolders.begin(); - it != that->mSharedFolders.end(); + for (SharedFolderMap::const_iterator it = that->m_mapSharedFolders.begin(); + it != that->m_mapSharedFolders.end(); ++ it) { - ComObjPtr<SharedFolder> pSharedFolder = (*it).second; - // don't lock the folder because methods we access are const + SharedFolder *pSF = (*it).second; + AutoCaller sfCaller(pSF); + AutoReadLock sfLock(pSF COMMA_LOCKVAL_SRC_POS); - Utf8Str name = pSharedFolder->getName(); + Utf8Str name = pSF->getName(); vrc = SSMR3PutU32(pSSM, (uint32_t)name.length() + 1 /* term. 0 */); AssertRC(vrc); vrc = SSMR3PutStrZ(pSSM, name.c_str()); AssertRC(vrc); - Utf8Str hostPath = pSharedFolder->getHostPath(); + Utf8Str hostPath = pSF->getHostPath(); vrc = SSMR3PutU32(pSSM, (uint32_t)hostPath.length() + 1 /* term. 0 */); AssertRC(vrc); vrc = SSMR3PutStrZ(pSSM, hostPath.c_str()); AssertRC(vrc); - vrc = SSMR3PutBool(pSSM, !!pSharedFolder->isWritable()); + vrc = SSMR3PutBool(pSSM, !!pSF->isWritable()); AssertRC(vrc); - vrc = SSMR3PutBool(pSSM, !!pSharedFolder->isAutoMounted()); + vrc = SSMR3PutBool(pSSM, !!pSF->isAutoMounted()); AssertRC(vrc); } @@ -1316,7 +1351,7 @@ Console::loadStateFileExecInternal(PSSMHANDLE pSSM, uint32_t u32Version) AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - AssertReturn(mSharedFolders.size() == 0, VERR_INTERNAL_ERROR); + AssertReturn(m_mapSharedFolders.size() == 0, VERR_INTERNAL_ERROR); uint32_t size = 0; int vrc = SSMR3GetU32(pSSM, &size); @@ -1324,8 +1359,8 @@ Console::loadStateFileExecInternal(PSSMHANDLE pSSM, uint32_t u32Version) for (uint32_t i = 0; i < size; ++ i) { - Bstr name; - Bstr hostPath; + Utf8Str strName; + Utf8Str strHostPath; bool writable = true; bool autoMount = false; @@ -1337,7 +1372,7 @@ Console::loadStateFileExecInternal(PSSMHANDLE pSSM, uint32_t u32Version) buf = new char[szBuf]; vrc = SSMR3GetStrZ(pSSM, buf, szBuf); AssertRC(vrc); - name = buf; + strName = buf; delete[] buf; vrc = SSMR3GetU32(pSSM, &szBuf); @@ -1345,7 +1380,7 @@ Console::loadStateFileExecInternal(PSSMHANDLE pSSM, uint32_t u32Version) buf = new char[szBuf]; vrc = SSMR3GetStrZ(pSSM, buf, szBuf); AssertRC(vrc); - hostPath = buf; + strHostPath = buf; delete[] buf; if (u32Version > 0x00010000) @@ -1356,11 +1391,15 @@ Console::loadStateFileExecInternal(PSSMHANDLE pSSM, uint32_t u32Version) ComObjPtr<SharedFolder> pSharedFolder; pSharedFolder.createObject(); - HRESULT rc = pSharedFolder->init(this, name.raw(), hostPath.raw(), - writable, autoMount); + HRESULT rc = pSharedFolder->init(this, + strName, + strHostPath, + writable, + autoMount, + false /* fFailOnError */); AssertComRCReturn(rc, VERR_INTERNAL_ERROR); - mSharedFolders.insert(std::make_pair(name, pSharedFolder)); + m_mapSharedFolders.insert(std::make_pair(strName, pSharedFolder)); } return VINF_SUCCESS; @@ -1677,7 +1716,7 @@ Console::COMGETTER(SharedFolders)(ComSafeArrayOut(ISharedFolder *, aSharedFolder HRESULT rc = loadDataFromSavedState(); if (FAILED(rc)) return rc; - SafeIfaceArray<ISharedFolder> sf(mSharedFolders); + SafeIfaceArray<ISharedFolder> sf(m_mapSharedFolders); sf.detachTo(ComSafeArrayOutArg(aSharedFolders)); return S_OK; @@ -2824,9 +2863,14 @@ Console::CreateSharedFolder(IN_BSTR aName, IN_BSTR aHostPath, BOOL aWritable, BO CheckComArgStrNotEmptyOrNull(aName); CheckComArgStrNotEmptyOrNull(aHostPath); + LogFlowThisFunc(("Entering for '%ls' -> '%ls'\n", aName, aHostPath)); + AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); + Utf8Str strName(aName); + Utf8Str strHostPath(aHostPath); + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); /// @todo see @todo in AttachUSBDevice() about the Paused state @@ -2844,14 +2888,19 @@ Console::CreateSharedFolder(IN_BSTR aName, IN_BSTR aHostPath, BOOL aWritable, BO Global::stringifyMachineState(mMachineState)); ComObjPtr<SharedFolder> pSharedFolder; - HRESULT rc = findSharedFolder(aName, pSharedFolder, false /* aSetError */); + HRESULT rc = findSharedFolder(strName, pSharedFolder, false /* aSetError */); if (SUCCEEDED(rc)) return setError(VBOX_E_FILE_ERROR, - tr("Shared folder named '%ls' already exists"), - aName); + tr("Shared folder named '%s' already exists"), + strName.c_str()); pSharedFolder.createObject(); - rc = pSharedFolder->init(this, aName, aHostPath, aWritable, aAutoMount); + rc = pSharedFolder->init(this, + strName, + strHostPath, + aWritable, + aAutoMount, + true /* fFailOnError */); if (FAILED(rc)) return rc; /* protect mpVM (if not NULL) */ @@ -2879,11 +2928,13 @@ Console::CreateSharedFolder(IN_BSTR aName, IN_BSTR aHostPath, BOOL aWritable, BO if (FAILED(rc)) return rc; } - mSharedFolders.insert(std::make_pair(aName, pSharedFolder)); + m_mapSharedFolders.insert(std::make_pair(aName, pSharedFolder)); /* notify console callbacks after the folder is added to the list */ fireSharedFolderChangedEvent(mEventSource, Scope_Session); + LogFlowThisFunc(("Leaving for '%ls' -> '%ls'\n", aName, aHostPath)); + return rc; } @@ -2894,6 +2945,10 @@ STDMETHODIMP Console::RemoveSharedFolder(IN_BSTR aName) AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); + LogFlowThisFunc(("Entering for '%ls'\n", aName)); + + Utf8Str strName(aName); + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); /// @todo see @todo in AttachUSBDevice() about the Paused state @@ -2927,24 +2982,26 @@ STDMETHODIMP Console::RemoveSharedFolder(IN_BSTR aName) * folder. */ /* first, remove the given folder */ - rc = removeSharedFolder(aName); + rc = removeSharedFolder(strName); if (FAILED(rc)) return rc; /* first, remove the machine or the global folder if there is any */ SharedFolderDataMap::const_iterator it; - if (findOtherSharedFolder(aName, it)) + if (findOtherSharedFolder(strName, it)) { - rc = createSharedFolder(aName, it->second); + rc = createSharedFolder(strName, it->second); /* don't check rc here because we need to remove the console * folder from the collection even on failure */ } } - mSharedFolders.erase(aName); + m_mapSharedFolders.erase(strName); /* notify console callbacks after the folder is removed to the list */ fireSharedFolderChangedEvent(mEventSource, Scope_Session); + LogFlowThisFunc(("Leaving for '%ls'\n", aName)); + return rc; } @@ -5253,8 +5310,9 @@ HRESULT Console::consoleInitReleaseLog(const ComPtr<IMachine> aMachine) #endif char szError[RTPATH_MAX + 128] = ""; int vrc = RTLogCreateEx(&loggerRelease, fFlags, "all", - "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, - RTLOGDEST_FILE, szError, sizeof(szError), logFile.c_str()); + "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, RTLOGDEST_FILE, + NULL /* pfnBeginEnd */, 0 /* cHistory */, 0 /* cbHistoryFileMax */, 0 /* uHistoryTimeMax */, + szError, sizeof(szError), logFile.c_str()); if (RT_SUCCESS(vrc)) { /* some introductory information */ @@ -5504,22 +5562,38 @@ HRESULT Console::powerUp(IProgress **aProgress, bool aPaused) /* Check all types of shared folders and compose a single list */ SharedFolderDataMap sharedFolders; { + // @todo umoeller + /* first, insert global folders */ - for (SharedFolderDataMap::const_iterator it = mGlobalSharedFolders.begin(); - it != mGlobalSharedFolders.end(); ++ it) - sharedFolders[it->first] = it->second; + for (SharedFolderDataMap::const_iterator it = m_mapGlobalSharedFolders.begin(); + it != m_mapGlobalSharedFolders.end(); + ++it) + { + const SharedFolderData &d = it->second; + sharedFolders[it->first] = d; + } /* second, insert machine folders */ - for (SharedFolderDataMap::const_iterator it = mMachineSharedFolders.begin(); - it != mMachineSharedFolders.end(); ++ it) - sharedFolders[it->first] = it->second; + for (SharedFolderDataMap::const_iterator it = m_mapMachineSharedFolders.begin(); + it != m_mapMachineSharedFolders.end(); + ++it) + { + const SharedFolderData &d = it->second; + sharedFolders[it->first] = d; + } /* third, insert console folders */ - for (SharedFolderMap::const_iterator it = mSharedFolders.begin(); - it != mSharedFolders.end(); ++ it) - sharedFolders[it->first] = SharedFolderData(it->second->getHostPath(), - it->second->isWritable(), - it->second->isAutoMounted()); + for (SharedFolderMap::const_iterator it = m_mapSharedFolders.begin(); + it != m_mapSharedFolders.end(); + ++it) + { + SharedFolder *pSF = it->second; + AutoCaller sfCaller(pSF); + AutoReadLock sfLock(pSF COMMA_LOCKVAL_SRC_POS); + sharedFolders[it->first] = SharedFolderData(pSF->getHostPath(), + pSF->isWritable(), + pSF->isAutoMounted()); + } } Bstr savedStateFile; @@ -6112,15 +6186,15 @@ HRESULT Console::setMachineState(MachineState_T aMachineState, * * @note The caller must lock this object for writing. */ -HRESULT Console::findSharedFolder(CBSTR aName, +HRESULT Console::findSharedFolder(const Utf8Str &strName, ComObjPtr<SharedFolder> &aSharedFolder, bool aSetError /* = false */) { /* sanity check */ AssertReturn(isWriteLockOnCurrentThread(), E_FAIL); - SharedFolderMap::const_iterator it = mSharedFolders.find(aName); - if (it != mSharedFolders.end()) + SharedFolderMap::const_iterator it = m_mapSharedFolders.find(strName); + if (it != m_mapSharedFolders.end()) { aSharedFolder = it->second; return S_OK; @@ -6128,8 +6202,8 @@ HRESULT Console::findSharedFolder(CBSTR aName, if (aSetError) setError(VBOX_E_FILE_ERROR, - tr("Could not find a shared folder named '%ls'."), - aName); + tr("Could not find a shared folder named '%s'."), + strName.c_str()); return VBOX_E_FILE_ERROR; } @@ -6147,6 +6221,8 @@ HRESULT Console::fetchSharedFolders(BOOL aGlobal) AssertReturn(AutoCaller(this).state() == InInit || isWriteLockOnCurrentThread(), E_FAIL); + LogFlowThisFunc(("Entering\n")); + /* protect mpVM (if not NULL) */ AutoVMCallerQuietWeak autoVMCaller(this); @@ -6157,102 +6233,123 @@ HRESULT Console::fetchSharedFolders(BOOL aGlobal) && m_pVMMDev && m_pVMMDev->isShFlActive(); - if (aGlobal) - { - /// @todo grab & process global folders when they are done - } - else + try { - SharedFolderDataMap oldFolders; - if (online) - oldFolders = mMachineSharedFolders; + if (aGlobal) + { + /// @todo grab & process global folders when they are done + } + else + { + SharedFolderDataMap oldFolders; + if (online) + oldFolders = m_mapMachineSharedFolders; - mMachineSharedFolders.clear(); + m_mapMachineSharedFolders.clear(); - SafeIfaceArray<ISharedFolder> folders; - rc = mMachine->COMGETTER(SharedFolders)(ComSafeArrayAsOutParam(folders)); - AssertComRCReturnRC(rc); + SafeIfaceArray<ISharedFolder> folders; + rc = mMachine->COMGETTER(SharedFolders)(ComSafeArrayAsOutParam(folders)); + if (FAILED(rc)) throw rc; - for (size_t i = 0; i < folders.size(); ++i) - { - ComPtr<ISharedFolder> pSharedFolder = folders[i]; - - Bstr name; - Bstr hostPath; - BOOL writable; - BOOL autoMount; - - rc = pSharedFolder->COMGETTER(Name)(name.asOutParam()); - if (FAILED(rc)) break; - rc = pSharedFolder->COMGETTER(HostPath)(hostPath.asOutParam()); - if (FAILED(rc)) break; - rc = pSharedFolder->COMGETTER(Writable)(&writable); - if (FAILED(rc)) break; - rc = pSharedFolder->COMGETTER(AutoMount)(&autoMount); - if (FAILED(rc)) break; - - mMachineSharedFolders.insert(std::make_pair(name, SharedFolderData(hostPath, writable, autoMount))); - - /* send changes to HGCM if the VM is running */ - /// @todo report errors as runtime warnings through VMSetError - if (online) + for (size_t i = 0; i < folders.size(); ++i) { - SharedFolderDataMap::iterator it = oldFolders.find(name); - if (it == oldFolders.end() || it->second.mHostPath != hostPath) + ComPtr<ISharedFolder> pSharedFolder = folders[i]; + + Bstr bstrName; + Bstr bstrHostPath; + BOOL writable; + BOOL autoMount; + + rc = pSharedFolder->COMGETTER(Name)(bstrName.asOutParam()); + if (FAILED(rc)) throw rc; + Utf8Str strName(bstrName); + + rc = pSharedFolder->COMGETTER(HostPath)(bstrHostPath.asOutParam()); + if (FAILED(rc)) throw rc; + Utf8Str strHostPath(bstrHostPath); + + rc = pSharedFolder->COMGETTER(Writable)(&writable); + if (FAILED(rc)) throw rc; + + rc = pSharedFolder->COMGETTER(AutoMount)(&autoMount); + if (FAILED(rc)) throw rc; + + m_mapMachineSharedFolders.insert(std::make_pair(strName, + SharedFolderData(strHostPath, writable, autoMount))); + + /* send changes to HGCM if the VM is running */ + /// @todo umoeller report errors as runtime warnings through VMSetError + if (online) { - /* a new machine folder is added or - * the existing machine folder is changed */ - if (mSharedFolders.find(name) != mSharedFolders.end()) - ; /* the console folder exists, nothing to do */ - else + SharedFolderDataMap::iterator it = oldFolders.find(strName); + if ( it == oldFolders.end() + || it->second.m_strHostPath != strHostPath) { - /* remove the old machine folder (when changed) - * or the global folder if any (when new) */ - if (it != oldFolders.end() || - mGlobalSharedFolders.find(name) != - mGlobalSharedFolders.end()) - rc = removeSharedFolder(name.raw()); - /* create the new machine folder */ - rc = createSharedFolder(name.raw(), - SharedFolderData(hostPath, - writable, - autoMount)); + /* a new machine folder is added or + * the existing machine folder is changed */ + if (m_mapSharedFolders.find(strName) != m_mapSharedFolders.end()) + ; /* the console folder exists, nothing to do */ + else + { + /* remove the old machine folder (when changed) + * or the global folder if any (when new) */ + if ( it != oldFolders.end() + || m_mapGlobalSharedFolders.find(strName) != m_mapGlobalSharedFolders.end() + ) + { + rc = removeSharedFolder(strName); + if (FAILED(rc)) throw rc; + } + + /* create the new machine folder */ + rc = createSharedFolder(strName, + SharedFolderData(strHostPath, + writable, + autoMount)); + if (FAILED(rc)) throw rc; + } } + /* forget the processed (or identical) folder */ + if (it != oldFolders.end()) + oldFolders.erase(it); } - /* forget the processed (or identical) folder */ - if (it != oldFolders.end()) - oldFolders.erase(it); - - rc = S_OK; } - } - - AssertComRCReturnRC(rc); - /* process outdated (removed) folders */ - /// @todo report errors as runtime warnings through VMSetError - if (online) - { - for (SharedFolderDataMap::const_iterator it = oldFolders.begin(); - it != oldFolders.end(); ++ it) + /* process outdated (removed) folders */ + if (online) { - if (mSharedFolders.find(it->first) != mSharedFolders.end()) - ; /* the console folder exists, nothing to do */ - else + for (SharedFolderDataMap::const_iterator it = oldFolders.begin(); + it != oldFolders.end(); ++ it) { - /* remove the outdated machine folder */ - rc = removeSharedFolder(it->first.raw()); - /* create the global folder if there is any */ - SharedFolderDataMap::const_iterator git = - mGlobalSharedFolders.find(it->first); - if (git != mGlobalSharedFolders.end()) - rc = createSharedFolder(git->first.raw(), git->second); + if (m_mapSharedFolders.find(it->first) != m_mapSharedFolders.end()) + ; /* the console folder exists, nothing to do */ + else + { + /* remove the outdated machine folder */ + rc = removeSharedFolder(it->first); + if (FAILED(rc)) throw rc; + + /* create the global folder if there is any */ + SharedFolderDataMap::const_iterator git = + m_mapGlobalSharedFolders.find(it->first); + if (git != m_mapGlobalSharedFolders.end()) + { + rc = createSharedFolder(git->first, git->second); + if (FAILED(rc)) throw rc; + } + } } } - - rc = S_OK; } } + catch (HRESULT rc2) + { + if (online) + setVMRuntimeErrorCallbackF(mpVM, this, 0, "BrokenSharedFolder", + N_("Broken shared folder!")); + } + + LogFlowThisFunc(("Leaving\n")); return rc; } @@ -6267,20 +6364,20 @@ HRESULT Console::fetchSharedFolders(BOOL aGlobal) * * @note The caller must lock this object for reading. */ -bool Console::findOtherSharedFolder(IN_BSTR aName, +bool Console::findOtherSharedFolder(const Utf8Str &strName, SharedFolderDataMap::const_iterator &aIt) { /* sanity check */ AssertReturn(isWriteLockOnCurrentThread(), false); /* first, search machine folders */ - aIt = mMachineSharedFolders.find(aName); - if (aIt != mMachineSharedFolders.end()) + aIt = m_mapMachineSharedFolders.find(strName); + if (aIt != m_mapMachineSharedFolders.end()) return true; /* second, search machine folders */ - aIt = mGlobalSharedFolders.find(aName); - if (aIt != mGlobalSharedFolders.end()) + aIt = m_mapGlobalSharedFolders.find(strName); + if (aIt != m_mapGlobalSharedFolders.end()) return true; return false; @@ -6295,10 +6392,10 @@ bool Console::findOtherSharedFolder(IN_BSTR aName, * @note Must be called from under AutoVMCaller and when mpVM != NULL! * @note Doesn't lock anything. */ -HRESULT Console::createSharedFolder(CBSTR aName, SharedFolderData aData) +HRESULT Console::createSharedFolder(const Utf8Str &strName, const SharedFolderData &aData) { - ComAssertRet(aName && *aName, E_FAIL); - ComAssertRet(!aData.mHostPath.isEmpty(), E_FAIL); + ComAssertRet(strName.isNotEmpty(), E_FAIL); + ComAssertRet(aData.m_strHostPath.isNotEmpty(), E_FAIL); /* sanity checks */ AssertReturn(mpVM, E_FAIL); @@ -6308,14 +6405,40 @@ HRESULT Console::createSharedFolder(CBSTR aName, SharedFolderData aData) SHFLSTRING *pFolderName, *pMapName; size_t cbString; - Log(("Adding shared folder '%ls' -> '%ls'\n", aName, aData.mHostPath.raw())); + Log(("Adding shared folder '%s' -> '%s'\n", strName.c_str(), aData.m_strHostPath.c_str())); - cbString = (RTUtf16Len(aData.mHostPath.raw()) + 1) * sizeof(RTUTF16); + // check whether the path is valid and exists + /* Check whether the path is full (absolute) */ + char hostPathFull[RTPATH_MAX]; + int vrc = RTPathAbsEx(NULL, + aData.m_strHostPath.c_str(), + hostPathFull, + sizeof(hostPathFull)); + if (RT_FAILURE(vrc)) + return setError(E_INVALIDARG, + tr("Invalid shared folder path: '%s' (%Rrc)"), + aData.m_strHostPath.c_str(), vrc); + + if (RTPathCompare(aData.m_strHostPath.c_str(), hostPathFull) != 0) + return setError(E_INVALIDARG, + tr("Shared folder path '%s' is not absolute"), + aData.m_strHostPath.c_str()); + if (!RTPathExists(hostPathFull)) + return setError(E_INVALIDARG, + tr("Shared folder path '%s' does not exist on the host"), + aData.m_strHostPath.c_str()); + + // now that we know the path is good, give it to HGCM + + Bstr bstrName(strName); + Bstr bstrHostPath(aData.m_strHostPath); + + cbString = (bstrHostPath.length() + 1) * sizeof(RTUTF16); if (cbString >= UINT16_MAX) return setError(E_INVALIDARG, tr("The name is too long")); - pFolderName = (SHFLSTRING *) RTMemAllocZ(sizeof(SHFLSTRING) + cbString); + pFolderName = (SHFLSTRING*)RTMemAllocZ(sizeof(SHFLSTRING) + cbString); Assert(pFolderName); - memcpy(pFolderName->String.ucs2, aData.mHostPath.raw(), cbString); + memcpy(pFolderName->String.ucs2, bstrHostPath.raw(), cbString); pFolderName->u16Size = (uint16_t)cbString; pFolderName->u16Length = (uint16_t)cbString - sizeof(RTUTF16); @@ -6324,15 +6447,15 @@ HRESULT Console::createSharedFolder(CBSTR aName, SharedFolderData aData) parms[0].u.pointer.addr = pFolderName; parms[0].u.pointer.size = sizeof(SHFLSTRING) + (uint16_t)cbString; - cbString = (RTUtf16Len(aName) + 1) * sizeof(RTUTF16); + cbString = (bstrName.length() + 1) * sizeof(RTUTF16); if (cbString >= UINT16_MAX) { RTMemFree(pFolderName); return setError(E_INVALIDARG, tr("The host path is too long")); } - pMapName = (SHFLSTRING *) RTMemAllocZ(sizeof(SHFLSTRING) + cbString); + pMapName = (SHFLSTRING*)RTMemAllocZ(sizeof(SHFLSTRING) + cbString); Assert(pMapName); - memcpy(pMapName->String.ucs2, aName, cbString); + memcpy(pMapName->String.ucs2, bstrName.raw(), cbString); pMapName->u16Size = (uint16_t)cbString; pMapName->u16Length = (uint16_t)cbString - sizeof(RTUTF16); @@ -6342,7 +6465,7 @@ HRESULT Console::createSharedFolder(CBSTR aName, SharedFolderData aData) parms[1].u.pointer.size = sizeof(SHFLSTRING) + (uint16_t)cbString; parms[2].type = VBOX_HGCM_SVC_PARM_32BIT; - parms[2].u.uint32 = aData.mWritable; + parms[2].u.uint32 = aData.m_fWritable; /* * Auto-mount flag; is indicated by using the SHFL_CPARMS_ADD_MAPPING2 @@ -6351,18 +6474,18 @@ HRESULT Console::createSharedFolder(CBSTR aName, SharedFolderData aData) * backwards compatible. */ parms[3].type = VBOX_HGCM_SVC_PARM_32BIT; - parms[3].u.uint32 = aData.mAutoMount; + parms[3].u.uint32 = aData.m_fAutoMount; - int vrc = m_pVMMDev->hgcmHostCall("VBoxSharedFolders", - SHFL_FN_ADD_MAPPING, - SHFL_CPARMS_ADD_MAPPING2, &parms[0]); + vrc = m_pVMMDev->hgcmHostCall("VBoxSharedFolders", + SHFL_FN_ADD_MAPPING, + SHFL_CPARMS_ADD_MAPPING2, &parms[0]); RTMemFree(pFolderName); RTMemFree(pMapName); if (RT_FAILURE(vrc)) return setError(E_FAIL, - tr("Could not create a shared folder '%ls' mapped to '%ls' (%Rrc)"), - aName, aData.mHostPath.raw(), vrc); + tr("Could not create a shared folder '%s' mapped to '%s' (%Rrc)"), + strName.c_str(), aData.m_strHostPath.c_str(), vrc); return S_OK; } @@ -6375,9 +6498,9 @@ HRESULT Console::createSharedFolder(CBSTR aName, SharedFolderData aData) * @note Must be called from under AutoVMCaller and when mpVM != NULL! * @note Doesn't lock anything. */ -HRESULT Console::removeSharedFolder(CBSTR aName) +HRESULT Console::removeSharedFolder(const Utf8Str &strName) { - ComAssertRet(aName && *aName, E_FAIL); + ComAssertRet(strName.isNotEmpty(), E_FAIL); /* sanity checks */ AssertReturn(mpVM, E_FAIL); @@ -6387,14 +6510,15 @@ HRESULT Console::removeSharedFolder(CBSTR aName) SHFLSTRING *pMapName; size_t cbString; - Log(("Removing shared folder '%ls'\n", aName)); + Log(("Removing shared folder '%s'\n", strName.c_str())); - cbString = (RTUtf16Len(aName) + 1) * sizeof(RTUTF16); + Bstr bstrName(strName); + cbString = (bstrName.length() + 1) * sizeof(RTUTF16); if (cbString >= UINT16_MAX) return setError(E_INVALIDARG, tr("The name is too long")); pMapName = (SHFLSTRING *) RTMemAllocZ(sizeof(SHFLSTRING) + cbString); Assert(pMapName); - memcpy(pMapName->String.ucs2, aName, cbString); + memcpy(pMapName->String.ucs2, bstrName.raw(), cbString); pMapName->u16Size = (uint16_t)cbString; pMapName->u16Length = (uint16_t)cbString - sizeof(RTUTF16); @@ -6409,8 +6533,8 @@ HRESULT Console::removeSharedFolder(CBSTR aName) RTMemFree(pMapName); if (RT_FAILURE(vrc)) return setError(E_FAIL, - tr("Could not remove the shared folder '%ls' (%Rrc)"), - aName, vrc); + tr("Could not remove the shared folder '%s' (%Rrc)"), + strName.c_str(), vrc); return S_OK; } @@ -6589,6 +6713,15 @@ DECLCALLBACK(void) Console::vmstateChangeCallback(PVM aVM, break; } + case VMSTATE_RESETTING: + { + #ifdef VBOX_WITH_GUEST_PROPS + /* Do not take any read/write locks here! */ + that->guestPropertiesHandleVMReset(); + #endif + break; + } + case VMSTATE_SUSPENDED: { AutoWriteLock alock(that COMMA_LOCKVAL_SRC_POS); @@ -7437,6 +7570,14 @@ void Console::processRemoteUSBDevices(uint32_t u32ClientId, VRDEUSBDEVICEDESC *p */ while (cbDevList >= 2 && e->oNext) { + /* Sanitize incoming strings in case they aren't valid UTF-8. */ + if (e->oManufacturer) + RTStrPurgeEncoding((char *)e + e->oManufacturer); + if (e->oProduct) + RTStrPurgeEncoding((char *)e + e->oProduct); + if (e->oSerialNumber) + RTStrPurgeEncoding((char *)e + e->oSerialNumber); + LogFlowThisFunc(("vendor %04X, product %04X, name = %s\n", e->idVendor, e->idProduct, e->oProduct? (char *)e + e->oProduct: "")); @@ -7588,15 +7729,7 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser) AssertReturn(!task->mConsole.isNull(), VERR_INVALID_PARAMETER); AssertReturn(!task->mProgress.isNull(), VERR_INVALID_PARAMETER); -#if defined(RT_OS_WINDOWS) - { - /* initialize COM */ - HRESULT hrc = CoInitializeEx(NULL, - COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE | - COINIT_SPEED_OVER_MEMORY); - LogFlowFunc(("CoInitializeEx()=%Rhrc\n", hrc)); - } -#endif + VirtualBoxBase::initializeComForThread(); HRESULT rc = S_OK; int vrc = VINF_SUCCESS; @@ -7771,11 +7904,21 @@ DECLCALLBACK(int) Console::powerUpThread(RTTHREAD Thread, void *pvUser) it != task->mSharedFolders.end(); ++it) { - rc = pConsole->createSharedFolder((*it).first.raw(), - (*it).second); - if (FAILED(rc)) break; + const SharedFolderData &d = it->second; + rc = pConsole->createSharedFolder(it->first, d); + if (FAILED(rc)) + { + ErrorInfoKeeper eik; + setVMRuntimeErrorCallbackF(pVM, pConsole, 0, "BrokenSharedFolder", + N_("The shared folder '%s' could not be set up: %ls.\n" + "The shared folder setup will not be complete. It is recommended to power down the virtual machine and " + "fix the shared folder settings while the machine is not running."), + it->first.c_str(), eik.getText().raw()); + break; + } } - if (FAILED(rc)) break; + if (FAILED(rc)) + rc = S_OK; // do not fail with broken shared folders /* enter the lock again */ alock.enter(); @@ -8543,10 +8686,11 @@ DECLCALLBACK(int) Console::powerDownThread(RTTHREAD Thread, void *pvUser) /** * @interface_method_impl{VMM2USERMETHODS,pfnSaveState} */ -/*static*/ -DECLCALLBACK(int) Console::vmm2User_SaveState(PCVMM2USERMETHODS pThis, PVM pVM) +/*static*/ DECLCALLBACK(int) +Console::vmm2User_SaveState(PCVMM2USERMETHODS pThis, PUVM pUVM) { - Console *pConsole = *(Console **)(pThis + 1); /* lazy bird */ + Console *pConsole = ((MYVMM2USERMETHODS *)pThis)->pConsole; + NOREF(pUVM); /* * For now, just call SaveState. We should probably try notify the GUI so @@ -8556,6 +8700,47 @@ DECLCALLBACK(int) Console::vmm2User_SaveState(PCVMM2USERMETHODS pThis, PVM pVM) return SUCCEEDED(hrc) ? VINF_SUCCESS : Global::vboxStatusCodeFromCOM(hrc); } +/** + * @interface_method_impl{VMM2USERMETHODS,pfnNotifyEmtInit} + */ +/*static*/ DECLCALLBACK(void) +Console::vmm2User_NotifyEmtInit(PCVMM2USERMETHODS pThis, PUVM pUVM, PUVMCPU pUVCpu) +{ + NOREF(pThis); NOREF(pUVM); NOREF(pUVCpu); + VirtualBoxBase::initializeComForThread(); +} + +/** + * @interface_method_impl{VMM2USERMETHODS,pfnNotifyEmtTerm} + */ +/*static*/ DECLCALLBACK(void) +Console::vmm2User_NotifyEmtTerm(PCVMM2USERMETHODS pThis, PUVM pUVM, PUVMCPU pUVCpu) +{ + NOREF(pThis); NOREF(pUVM); NOREF(pUVCpu); + VirtualBoxBase::uninitializeComForThread(); +} + +/** + * @interface_method_impl{VMM2USERMETHODS,pfnNotifyPdmtInit} + */ +/*static*/ DECLCALLBACK(void) +Console::vmm2User_NotifyPdmtInit(PCVMM2USERMETHODS pThis, PUVM pUVM) +{ + NOREF(pThis); NOREF(pUVM); + VirtualBoxBase::initializeComForThread(); +} + +/** + * @interface_method_impl{VMM2USERMETHODS,pfnNotifyPdmtTerm} + */ +/*static*/ DECLCALLBACK(void) +Console::vmm2User_NotifyPdmtTerm(PCVMM2USERMETHODS pThis, PUVM pUVM) +{ + NOREF(pThis); NOREF(pUVM); + VirtualBoxBase::uninitializeComForThread(); +} + + /** diff --git a/src/VBox/Main/src-client/ConsoleImpl2.cpp b/src/VBox/Main/src-client/ConsoleImpl2.cpp index 1bde20b6c..06f8763bf 100644 --- a/src/VBox/Main/src-client/ConsoleImpl2.cpp +++ b/src/VBox/Main/src-client/ConsoleImpl2.cpp @@ -470,17 +470,6 @@ DECLCALLBACK(int) Console::configConstructor(PVM pVM, void *pvConsole) { LogFlowFuncEnter(); -#if !defined(VBOX_WITH_XPCOM) - { - /* initialize COM */ - HRESULT hrc = CoInitializeEx(NULL, - COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE | - COINIT_SPEED_OVER_MEMORY); - LogFlow(("Console::configConstructor(): CoInitializeEx()=%08X\n", hrc)); - AssertComRCReturn(hrc, VERR_GENERAL_FAILURE); - } -#endif - AssertReturn(pvConsole, VERR_GENERAL_FAILURE); ComObjPtr<Console> pConsole = static_cast<Console *>(pvConsole); @@ -2105,20 +2094,13 @@ int Console::configConstructorInner(PVM pVM, AutoWriteLock *pAlock) # ifdef VBOX_WITH_EXTPACK else { - /* Fatal if a saved state is being restored, otherwise ignorable. */ - if (mMachineState == MachineState_Restoring) - return VMSetError(pVM, VERR_NOT_FOUND, RT_SRC_POS, - N_("Implementation of the USB 2.0 controller not found!\n" - "Because the USB 2.0 controller state is part of the saved " - "VM state, the VM cannot be started. To fix " - "this problem, either install the '%s' or disable USB 2.0 " - "support in the VM settings"), - s_pszUsbExtPackName); - setVMRuntimeErrorCallbackF(pVM, this, 0, "ExtPackNoEhci", + /* Always fatal! Up to VBox 4.0.4 we allowed to start the VM anyway + * but this induced problems when the user saved + restored the VM! */ + return VMSetError(pVM, VERR_NOT_FOUND, RT_SRC_POS, N_("Implementation of the USB 2.0 controller not found!\n" - "The device will be disabled. You can ignore this warning " - "but there will be no USB 2.0 support in your VM. To fix " - "this issue, either install the '%s' or disable USB 2.0 " + "Because the USB 2.0 controller state is part of the saved " + "VM state, the VM cannot be started. To fix " + "this problem, either install the '%s' or disable USB 2.0 " "support in the VM settings"), s_pszUsbExtPackName); } @@ -3269,15 +3251,15 @@ int Console::configMedium(PCFGMNODE pLunL0, } } - /* Custom code: put marker to not use host IP stack to driver - * configuration node. Simplifies life of DrvVD a bit. */ - if (!fHostIP) - InsertConfigInteger(pCfg, "HostIPStack", 0); - /* next */ pParent = pCur; pParentMedium = pMedium; } + + /* Custom code: put marker to not use host IP stack to driver + * configuration node. Simplifies life of DrvVD a bit. */ + if (!fHostIP) + InsertConfigInteger(pCfg, "HostIPStack", 0); } } #undef H @@ -3357,6 +3339,12 @@ int Console::configNetwork(const char *pszDevice, hrc = aNetworkAdapter->COMGETTER(TraceEnabled)(&fSniffer); H(); + hrc = pMachine->GetExtraData(Bstr("VBoxInternal2/AllowPromiscousGuests").raw(), bstr.asOutParam()); + if (SUCCEEDED(hrc) && bstr.isEmpty()) + hrc = virtualBox->GetExtraData(Bstr("VBoxInternal2/AllowPromiscousGuests").raw(), bstr.asOutParam()); + H(); + const char * const pszPromiscuousGuestPolicy = bstr.isNotEmpty() ? "allow-all" : "deny"; + if (fAttachDetach && fSniffer) { const char *pszNetDriver = "IntNet"; @@ -3520,12 +3508,12 @@ int Console::configNetwork(const char *pszDevice, Log2((#res " %s pos:%d, ppos:%d\n", res.c_str(), pos, ppos)); \ ppos = pos + 1; \ } while (0) - ITERATE_TO_NEXT_TERM(strName, utf, pos, ppos); - ITERATE_TO_NEXT_TERM(strProto, utf, pos, ppos); - ITERATE_TO_NEXT_TERM(strHostIP, utf, pos, ppos); - ITERATE_TO_NEXT_TERM(strHostPort, utf, pos, ppos); - ITERATE_TO_NEXT_TERM(strGuestIP, utf, pos, ppos); - strGuestPort = utf.substr(ppos, utf.length() - ppos); + ITERATE_TO_NEXT_TERM(strName, utf, pos, ppos); + ITERATE_TO_NEXT_TERM(strProto, utf, pos, ppos); + ITERATE_TO_NEXT_TERM(strHostIP, utf, pos, ppos); + ITERATE_TO_NEXT_TERM(strHostPort, utf, pos, ppos); + ITERATE_TO_NEXT_TERM(strGuestIP, utf, pos, ppos); + strGuestPort = utf.substr(ppos, utf.length() - ppos); #undef ITERATE_TO_NEXT_TERM uint32_t proto = strProto.toUInt32(); @@ -3632,20 +3620,22 @@ int Console::configNetwork(const char *pszDevice, char szTrunk[8]; strncpy(szTrunk, pszHifName, sizeof(szTrunk)); char *pszColon = (char *)memchr(szTrunk, ':', sizeof(szTrunk)); - if (!pszColon) - { - /* - * Dynamic changing of attachment causes an attempt to configure - * network with invalid host adapter (as it is must be changed before - * the attachment), calling Detach here will cause a deadlock. - * See #4750. - * hrc = aNetworkAdapter->Detach(); H(); - */ - return VMSetError(pVM, VERR_INTERNAL_ERROR, RT_SRC_POS, - N_("Malformed host interface networking name '%ls'"), - HifName.raw()); - } - *pszColon = '\0'; +// Quick fix for #5633 +// if (!pszColon) +// { +// /* +// * Dynamic changing of attachment causes an attempt to configure +// * network with invalid host adapter (as it is must be changed before +// * the attachment), calling Detach here will cause a deadlock. +// * See #4750. +// * hrc = aNetworkAdapter->Detach(); H(); +// */ +// return VMSetError(pVM, VERR_INTERNAL_ERROR, RT_SRC_POS, +// N_("Malformed host interface networking name '%ls'"), +// HifName.raw()); +// } + if (pszColon) + *pszColon = '\0'; const char *pszTrunk = szTrunk; # elif defined(RT_OS_SOLARIS) @@ -3845,6 +3835,7 @@ int Console::configNetwork(const char *pszDevice, InsertConfigString(pCfg, "Trunk", pszTrunk); InsertConfigInteger(pCfg, "TrunkType", kIntNetTrunkType_NetFlt); InsertConfigInteger(pCfg, "IgnoreConnectFailure", (uint64_t)fIgnoreConnectFailure); + InsertConfigString(pCfg, "IfPolicyPromisc", pszPromiscuousGuestPolicy); char szNetwork[INTNET_MAX_NETWORK_NAME]; RTStrPrintf(szNetwork, sizeof(szNetwork), "HostInterfaceNetworking-%s", pszHifName); InsertConfigString(pCfg, "Network", szNetwork); @@ -3982,12 +3973,12 @@ int Console::configNetwork(const char *pszDevice, # if defined(RT_OS_SOLARIS) # if 0 /* bird: this is a bit questionable and might cause more trouble than its worth. */ - /* Zone access restriction, don't allow snooping the global zone. */ - zoneid_t ZoneId = getzoneid(); - if (ZoneId != GLOBAL_ZONEID) - { - InsertConfigInteger(pCfg, "IgnoreAllPromisc", true); - } + /* Zone access restriction, don't allow snooping the global zone. */ + zoneid_t ZoneId = getzoneid(); + if (ZoneId != GLOBAL_ZONEID) + { + InsertConfigInteger(pCfg, "IgnoreAllPromisc", true); + } # endif # endif @@ -4016,6 +4007,7 @@ int Console::configNetwork(const char *pszDevice, InsertConfigNode(pLunL0, "Config", &pCfg); InsertConfigString(pCfg, "Network", bstr); InsertConfigInteger(pCfg, "TrunkType", kIntNetTrunkType_WhateverNone); + InsertConfigString(pCfg, "IfPolicyPromisc", pszPromiscuousGuestPolicy); networkName = bstr; trunkType = Bstr(TRUNKTYPE_WHATEVER); } @@ -4108,7 +4100,7 @@ int Console::configNetwork(const char *pszDevice, LogRel(("NetworkAttachmentType_HostOnly: VBoxNetCfgWinGetComponentByGuid failed, hrc=%Rhrc (0x%x)\n", hrc, hrc)); H(); } -#define VBOX_WIN_BINDNAME_PREFIX "\\DEVICE\\" +# define VBOX_WIN_BINDNAME_PREFIX "\\DEVICE\\" char szTrunkName[INTNET_MAX_TRUNK_NAME]; char *pszTrunkName = szTrunkName; wchar_t * pswzBindName; @@ -4164,7 +4156,7 @@ int Console::configNetwork(const char *pszDevice, InsertConfigInteger(pCfg, "TrunkType", kIntNetTrunkType_NetAdp); InsertConfigString(pCfg, "Trunk", pszTrunk); InsertConfigString(pCfg, "Network", szNetwork); - InsertConfigInteger(pCfg, "IgnoreConnectFailure", (uint64_t)fIgnoreConnectFailure); + InsertConfigInteger(pCfg, "IgnoreConnectFailure", (uint64_t)fIgnoreConnectFailure); /** @todo why is this windows only?? */ networkName = Bstr(szNetwork); trunkName = Bstr(pszTrunk); trunkType = TRUNKTYPE_NETADP; @@ -4184,6 +4176,8 @@ int Console::configNetwork(const char *pszDevice, trunkName = Bstr(pszHifName); trunkType = TRUNKTYPE_NETFLT; #endif + InsertConfigString(pCfg, "IfPolicyPromisc", pszPromiscuousGuestPolicy); + #if !defined(RT_OS_WINDOWS) && defined(VBOX_WITH_NETFLT) Bstr tmpAddr, tmpMask; diff --git a/src/VBox/Main/src-client/ConsoleVRDPServer.cpp b/src/VBox/Main/src-client/ConsoleVRDPServer.cpp index 97a0d6cef..19c845f1c 100644 --- a/src/VBox/Main/src-client/ConsoleVRDPServer.cpp +++ b/src/VBox/Main/src-client/ConsoleVRDPServer.cpp @@ -1668,7 +1668,20 @@ AuthResult ConsoleVRDPServer::Authenticate(const Guid &uuid, AuthGuestJudgement if (RTPathHavePath(filename.c_str())) rc = RTLdrLoad(filename.c_str(), &mAuthLibrary); else + { rc = RTLdrLoadAppPriv(filename.c_str(), &mAuthLibrary); + if (RT_FAILURE(rc)) + { + /* Backward compatibility with old default 'VRDPAuth' name. + * Try to load new default 'VBoxAuth' instead. + */ + if (filename == "VRDPAuth") + { + LogRel(("AUTH: ConsoleVRDPServer::Authenticate: loading external authentication library VBoxAuth\n")); + rc = RTLdrLoadAppPriv("VBoxAuth", &mAuthLibrary); + } + } + } if (RT_FAILURE(rc)) LogRel(("AUTH: Failed to load external authentication library. Error code: %Rrc\n", rc)); diff --git a/src/VBox/Main/src-client/GuestCtrlImpl.cpp b/src/VBox/Main/src-client/GuestCtrlImpl.cpp index a88e030ad..f98b52acc 100644 --- a/src/VBox/Main/src-client/GuestCtrlImpl.cpp +++ b/src/VBox/Main/src-client/GuestCtrlImpl.cpp @@ -255,7 +255,6 @@ HRESULT Guest::taskCopyFile(TaskGuest *aTask) RTPathChangeToUnixSlashes(szOutput, true /* Force conversion. */); } - args.push_back(Bstr(VBOXSERVICE_TOOL_CAT).raw()); /* The actual (internal) tool to use (as argv[0]). */ args.push_back(Bstr(szOutput).raw()); /* We want to write a file ... */ } else @@ -326,6 +325,8 @@ HRESULT Guest::taskCopyFile(TaskGuest *aTask) ULONG uFlags = ProcessInputFlag_None; /* Did we reach the end of the content we want to transfer (last chunk)? */ if ( (cbRead < _64K) + /* Did we reach the last block which is exactly _64K? */ + || (cbToRead - cbRead == 0) /* ... or does the user want to cancel? */ || ( SUCCEEDED(aTask->progress->COMGETTER(Canceled(&fCanceled))) && fCanceled) @@ -564,7 +565,6 @@ HRESULT Guest::taskUpdateGuestAdditions(TaskGuest *aTask) com::SafeArray<IN_BSTR> args; com::SafeArray<IN_BSTR> env; - args.push_back(Bstr(VBOXSERVICE_TOOL_CAT).raw()); /* The actual (internal) tool to use (as argv[0]). */ args.push_back(Bstr("--output").raw()); /* We want to write a file ... */ args.push_back(Bstr(strInstallerPath.c_str()).raw()); /* ... with this path. */ @@ -628,14 +628,14 @@ HRESULT Guest::taskUpdateGuestAdditions(TaskGuest *aTask) aTask->progress->SetCurrentOperationProgress(20); /* Wait for process to exit ... */ - SafeArray<BYTE> aInputData(_1M); + SafeArray<BYTE> aInputData(_64K); while ( SUCCEEDED(progressCat->COMGETTER(Completed(&fCompleted))) && !fCompleted) { size_t cbRead; /* cbLength contains remaining bytes of our installer file * opened above to read. */ - size_t cbToRead = RT_MIN(cbLength, _1M); + size_t cbToRead = RT_MIN(cbLength, _64K); if (cbToRead) { vrc = RTFileRead(iso.file, (uint8_t*)aInputData.raw(), cbToRead, &cbRead); @@ -648,7 +648,9 @@ HRESULT Guest::taskUpdateGuestAdditions(TaskGuest *aTask) /* Did we reach the end of the content we want to transfer (last chunk)? */ ULONG uFlags = ProcessInputFlag_None; - if ( (cbRead < _1M) + if ( (cbRead < _64K) + /* Did we reach the last block which is exactly _64K? */ + || (cbToRead - cbRead == 0) /* ... or does the user want to cancel? */ || ( SUCCEEDED(aTask->progress->COMGETTER(Canceled(&fCanceled))) && fCanceled) @@ -1234,7 +1236,7 @@ int Guest::notifyCtrlExecOut(uint32_t u32Function, if ( SUCCEEDED(it->second.pProgress->COMGETTER(Completed)(&fCompleted)) && !fCompleted) { - /* If we previously got completed notification, don't trigger again. */ + /* If we previously got completed notification, don't trigger again. */ it->second.pProgress->notifyComplete(S_OK); } } @@ -1261,6 +1263,9 @@ int Guest::notifyCtrlExecInStatus(uint32_t u32Function, /* Save bytes processed. */ pCBData->cbProcessed = pData->cbProcessed; + pCBData->u32Status = pData->u32Status; + pCBData->u32Flags = pData->u32Flags; + pCBData->u32PID = pData->u32PID; /* Only trigger completion once. */ BOOL fCompleted; @@ -1941,27 +1946,41 @@ STDMETHODIMP Guest::SetProcessInput(ULONG aPID, ULONG aFlags, ULONG aTimeoutMS, rc = it->second.pProgress->WaitForCompletion(aTimeoutMS); if (FAILED(rc)) throw rc; - /* Was the call completed within time? */ - LONG uResult; - if ( SUCCEEDED(it->second.pProgress->COMGETTER(ResultCode)(&uResult)) - && uResult == S_OK) - { - PCALLBACKDATAEXECINSTATUS pStatusData = (PCALLBACKDATAEXECINSTATUS)it->second.pvData; - AssertPtr(pStatusData); - Assert(it->second.cbData == sizeof(CALLBACKDATAEXECINSTATUS)); + /* Was the operation canceled by one of the parties? */ + rc = it->second.pProgress->COMGETTER(Canceled)(&fCanceled); + if (FAILED(rc)) throw rc; - *aBytesWritten = pStatusData->cbProcessed; - } - else if ( SUCCEEDED(it->second.pProgress->COMGETTER(Canceled)(&fCanceled)) - && fCanceled) + if (!fCanceled) { - rc = setError(VBOX_E_IPRT_ERROR, - tr("The input operation was canceled by the guest")); + BOOL fCompleted; + if ( SUCCEEDED(it->second.pProgress->COMGETTER(Completed)(&fCompleted)) + && fCompleted) + { + AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); + + PCALLBACKDATAEXECINSTATUS pStatusData = (PCALLBACKDATAEXECINSTATUS)it->second.pvData; + AssertPtr(pStatusData); + Assert(it->second.cbData == sizeof(CALLBACKDATAEXECINSTATUS)); + + switch (pStatusData->u32Status) + { + case INPUT_STS_WRITTEN: + *aBytesWritten = pStatusData->cbProcessed; + break; + + default: + rc = setError(VBOX_E_IPRT_ERROR, + tr("Client error %u while processing input data"), pStatusData->u32Status); + break; + } + } + else + rc = setError(VBOX_E_IPRT_ERROR, + tr("The input operation was not acknowledged from guest within time (%ums)"), aTimeoutMS); } else rc = setError(VBOX_E_IPRT_ERROR, - tr("The input operation was not acknowledged from guest within time (%ums)"), aTimeoutMS); - + tr("The input operation was canceled by the guest")); { AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); /* Destroy locally used progress object. */ @@ -2372,7 +2391,6 @@ HRESULT Guest::createDirectoryInternal(IN_BSTR aDirectory, /* * Prepare tool command line. */ - args.push_back(Bstr(VBOXSERVICE_TOOL_MKDIR).raw()); /* The actual (internal) tool to use (as argv[0]). */ if (aFlags & CreateDirectoryFlag_Parents) args.push_back(Bstr("--parents").raw()); /* We also want to create the parent directories. */ if (aMode > 0) @@ -2438,7 +2456,7 @@ HRESULT Guest::createDirectoryInternal(IN_BSTR aDirectory, if (SUCCEEDED(rc) && uRetExitCode != 0) { rc = setError(VBOX_E_IPRT_ERROR, - tr("Error while creating directory")); + tr("Error %u while creating directory"), uRetExitCode); } } } diff --git a/src/VBox/Main/src-server/ApplianceImplIO.cpp b/src/VBox/Main/src-server/ApplianceImplIO.cpp index 3b9b9813e..2a5765fec 100644 --- a/src/VBox/Main/src-server/ApplianceImplIO.cpp +++ b/src/VBox/Main/src-server/ApplianceImplIO.cpp @@ -92,10 +92,12 @@ typedef struct SHA1STORAGEINTERNAL * Defined Constants And Macros * ******************************************************************************/ -#define STATUS_WAIT UINT32_C(0) -#define STATUS_WRITE UINT32_C(1) -#define STATUS_READ UINT32_C(2) -#define STATUS_END UINT32_C(3) +#define STATUS_WAIT UINT32_C(0) +#define STATUS_WRITE UINT32_C(1) +#define STATUS_WRITING UINT32_C(2) +#define STATUS_READ UINT32_C(3) +#define STATUS_READING UINT32_C(4) +#define STATUS_END UINT32_C(5) /* Enable for getting some flow history. */ #if 0 @@ -490,6 +492,7 @@ DECLCALLBACK(int) sha1CalcWorkerThread(RTTHREAD /* aThread */, void *pvUser) } case STATUS_WRITE: { + ASMAtomicCmpXchgU32(&pInt->u32Status, STATUS_WRITING, STATUS_WRITE); size_t cbAvail = RTCircBufUsed(pInt->pCircBuf); size_t cbMemAllRead = 0; /* First loop over all the free memory in the circular @@ -535,12 +538,13 @@ DECLCALLBACK(int) sha1CalcWorkerThread(RTTHREAD /* aThread */, void *pvUser) /* Reset the thread status and signal the main thread that we * are finished. Use CmpXchg, so we not overwrite other states * which could be signaled in the meantime. */ - ASMAtomicCmpXchgU32(&pInt->u32Status, STATUS_WAIT, STATUS_WRITE); - rc = RTSemEventSignal(pInt->workFinishedEvent); + if (ASMAtomicCmpXchgU32(&pInt->u32Status, STATUS_WAIT, STATUS_WRITING)) + rc = RTSemEventSignal(pInt->workFinishedEvent); break; } case STATUS_READ: { + ASMAtomicCmpXchgU32(&pInt->u32Status, STATUS_READING, STATUS_READ); size_t cbAvail = RTCircBufFree(pInt->pCircBuf); size_t cbMemAllWrite = 0; /* First loop over all the available memory in the circular @@ -593,8 +597,8 @@ DECLCALLBACK(int) sha1CalcWorkerThread(RTTHREAD /* aThread */, void *pvUser) /* Reset the thread status and signal the main thread that we * are finished. Use CmpXchg, so we not overwrite other states * which could be signaled in the meantime. */ - ASMAtomicCmpXchgU32(&pInt->u32Status, STATUS_WAIT, STATUS_READ); - rc = RTSemEventSignal(pInt->workFinishedEvent); + if (ASMAtomicCmpXchgU32(&pInt->u32Status, STATUS_WAIT, STATUS_READING)) + rc = RTSemEventSignal(pInt->workFinishedEvent); break; } case STATUS_END: @@ -605,6 +609,9 @@ DECLCALLBACK(int) sha1CalcWorkerThread(RTTHREAD /* aThread */, void *pvUser) } } } + /* Cleanup any status changes to indicate we are finished. */ + ASMAtomicWriteU32(&pInt->u32Status, STATUS_END); + rc = RTSemEventSignal(pInt->workFinishedEvent); return rc; } @@ -621,8 +628,11 @@ DECLINLINE(int) sha1WaitForManifestThreadFinished(PSHA1STORAGEINTERNAL pInt) for(;;) { // RTPrintf(" wait\n"); - if (!( ASMAtomicReadU32(&pInt->u32Status) == STATUS_WRITE - || ASMAtomicReadU32(&pInt->u32Status) == STATUS_READ)) + uint32_t u32Status = ASMAtomicReadU32(&pInt->u32Status); + if (!( u32Status == STATUS_WRITE + || u32Status == STATUS_WRITING + || u32Status == STATUS_READ + || u32Status == STATUS_READING)) break; rc = RTSemEventWait(pInt->workFinishedEvent, 100); } @@ -677,6 +687,7 @@ static int sha1OpenCallback(void *pvUser, const char *pszLocation, uint32_t fOpe pInt->pSha1Storage = pSha1Storage; pInt->fEOF = false; pInt->fOpenMode = fOpen; + pInt->u32Status = STATUS_WAIT; /* Circular buffer in the read case. */ rc = RTCircBufCreate(&pInt->pCircBuf, _1M * 2); diff --git a/src/VBox/Main/src-server/ApplianceImplImport.cpp b/src/VBox/Main/src-server/ApplianceImplImport.cpp index 6890554c0..4533acc1f 100644 --- a/src/VBox/Main/src-server/ApplianceImplImport.cpp +++ b/src/VBox/Main/src-server/ApplianceImplImport.cpp @@ -5,7 +5,7 @@ */ /* - * Copyright (C) 2008-2010 Oracle Corporation + * Copyright (C) 2008-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -2567,8 +2567,15 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi /* DVD controller */ bool fDVD = vsdescThis->findByType(VirtualSystemDescriptionType_CDROM).size() > 0; /* Iterate over all storage controller check the attachments and remove - * them when necessary. */ + * them when necessary. Also detect broken configs with more than one + * attachment. Old VirtualBox versions (prior to 3.2.10) had all disk + * attachments pointing to the last hard disk image, which causes import + * failures. A long fixed bug, however the OVF files are long lived. */ settings::StorageControllersList &llControllers = config.storageMachine.llStorageControllers; + Guid hdUuid; + uint32_t cHardDisks = 0; + bool fInconsistent = false; + bool fRepairDuplicate = false; settings::StorageControllersList::iterator it3; for (it3 = llControllers.begin(); it3 != llControllers.end(); @@ -2586,9 +2593,30 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi ( !fFloppy && it4->deviceType == DeviceType_Floppy)) llAttachments.erase(it4++); + else if (it4->deviceType == DeviceType_HardDisk) + { + const Guid &thisUuid = it4->uuid; + cHardDisks++; + if (cHardDisks == 1) + { + if (hdUuid.isEmpty()) + hdUuid = thisUuid; + else + fInconsistent = true; + } + else + { + if (thisUuid.isEmpty()) + fInconsistent = true; + else if (thisUuid == hdUuid) + fRepairDuplicate = true; + } + } } } - + /* paranoia... */ + if (fInconsistent || cHardDisks == 1) + fRepairDuplicate = false; /* * @@ -2596,6 +2624,13 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi * */ + /* Get all hard disk descriptions. */ + std::list<VirtualSystemDescriptionEntry*> avsdeHDs = vsdescThis->findByType(VirtualSystemDescriptionType_HardDiskImage); + std::list<VirtualSystemDescriptionEntry*>::iterator avsdeHDsIt = avsdeHDs.begin(); + /* paranoia - if there is no 1:1 match do not try to repair. */ + if (cHardDisks != avsdeHDs.size()) + fRepairDuplicate = false; + // for each storage controller... for (settings::StorageControllersList::iterator sit = config.storageMachine.llStorageControllers.begin(); sit != config.storageMachine.llStorageControllers.end(); @@ -2616,9 +2651,6 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi break; } - /* Get all hard disk descriptions. */ - std::list<VirtualSystemDescriptionEntry*> avsdeHDs = vsdescThis->findByType(VirtualSystemDescriptionType_HardDiskImage); - // for each medium attachment to this controller... for (settings::AttachedDevicesList::iterator dit = sc.llAttachedDevices.begin(); dit != sc.llAttachedDevices.end(); @@ -2630,10 +2662,24 @@ void Appliance::importVBoxMachine(ComObjPtr<VirtualSystemDescription> &vsdescThi // empty DVD and floppy media continue; + // When repairing a broken VirtualBox xml config section (written + // by VirtualBox versions earlier than 3.2.10) assume the disks + // show up in the same order as in the OVF description. + if (fRepairDuplicate) + { + VirtualSystemDescriptionEntry *vsdeHD = *avsdeHDsIt; + ovf::DiskImagesMap::const_iterator itDiskImage = stack.mapDisks.find(vsdeHD->strRef); + if (itDiskImage != stack.mapDisks.end()) + { + const ovf::DiskImage &di = itDiskImage->second; + d.uuid = Guid(di.uuidVbox); + } + ++avsdeHDsIt; + } + // convert the Guid to string Utf8Str strUuid = d.uuid.toString(); - // there must be an image in the OVF disk structs with the same UUID bool fFound = false; for (ovf::DiskImagesMap::const_iterator oit = stack.mapDisks.begin(); diff --git a/src/VBox/Main/src-server/HostImpl.cpp b/src/VBox/Main/src-server/HostImpl.cpp index ec057b267..f0793b095 100644 --- a/src/VBox/Main/src-server/HostImpl.cpp +++ b/src/VBox/Main/src-server/HostImpl.cpp @@ -752,7 +752,7 @@ STDMETHODIMP Host::COMGETTER(USBDevices)(ComSafeArrayOut(IHostUSBDevice*, aUSBDe AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); - MultiResult rc = checkUSBProxyService(); + HRESULT rc = checkUSBProxyService(); if (FAILED(rc)) return rc; return m->pUSBProxyService->getDeviceCollection(ComSafeArrayOutArg(aUSBDevices)); @@ -779,7 +779,7 @@ STDMETHODIMP Host::COMGETTER(USBDeviceFilters)(ComSafeArrayOut(IHostUSBDeviceFil AutoMultiWriteLock2 alock(this->lockHandle(), &m->usbListsLock COMMA_LOCKVAL_SRC_POS); - MultiResult rc = checkUSBProxyService(); + HRESULT rc = checkUSBProxyService(); if (FAILED(rc)) return rc; SafeIfaceArray<IHostUSBDeviceFilter> collection(m->llUSBDeviceFilters); @@ -1099,26 +1099,7 @@ STDMETHODIMP Host::CreateHostOnlyNetworkInterface(IHostNetworkInterface **aHostN int r = NetIfCreateHostOnlyNetworkInterface(m->pParent, aHostNetworkInterface, aProgress); if (RT_SUCCESS(r)) - { - Bstr name; - - HRESULT hrc = (*aHostNetworkInterface)->COMGETTER(Name)(name.asOutParam()); - ComAssertComRCRet(hrc, hrc); - /* - * We need to write the default IP address and mask to extra data now, - * so the interface gets re-created after vboxnetadp.ko reload. - * Note that we avoid calling EnableStaticIpConfig since it would - * change the address on host's interface as well and we want to - * postpone the change until VM actually starts. - */ - hrc = m->pParent->SetExtraData(BstrFmt("HostOnly/%ls/IPAddress", name.raw()).raw(), - getDefaultIPv4Address(name).raw()); - ComAssertComRCRet(hrc, hrc); - hrc = m->pParent->SetExtraData(BstrFmt("HostOnly/%ls/IPNetMask", name.raw()).raw(), - Bstr(VBOXNET_IPV4MASK_DEFAULT).raw()); - - return hrc; - } + return S_OK; return r == VERR_NOT_IMPLEMENTED ? E_NOTIMPL : E_FAIL; #else @@ -1213,6 +1194,7 @@ STDMETHODIMP Host::InsertUSBDeviceFilter(ULONG aPosition, AutoMultiWriteLock2 alock(this->lockHandle(), &m->usbListsLock COMMA_LOCKVAL_SRC_POS); + clearError(); MultiResult rc = checkUSBProxyService(); if (FAILED(rc)) return rc; @@ -1274,6 +1256,7 @@ STDMETHODIMP Host::RemoveUSBDeviceFilter(ULONG aPosition) AutoMultiWriteLock2 alock(this->lockHandle(), &m->usbListsLock COMMA_LOCKVAL_SRC_POS); + clearError(); MultiResult rc = checkUSBProxyService(); if (FAILED(rc)) return rc; diff --git a/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp b/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp index f8338d8f9..7e2de25af 100644 --- a/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp +++ b/src/VBox/Main/src-server/HostNetworkInterfaceImpl.cpp @@ -555,16 +555,37 @@ HRESULT HostNetworkInterface::setVirtualBox(VirtualBox *pVBox) if (FAILED(autoCaller.rc())) return autoCaller.rc(); unconst(mVBox) = pVBox; +#if !defined(RT_OS_WINDOWS) /* If IPv4 address hasn't been initialized */ - if (m.IPAddress == 0) + if (m.IPAddress == 0 && mIfType == HostNetworkInterfaceType_HostOnly) { Bstr tmpAddr, tmpMask; hrc = mVBox->GetExtraData(BstrFmt("HostOnly/%ls/IPAddress", mInterfaceName.raw()).raw(), tmpAddr.asOutParam()); hrc = mVBox->GetExtraData(BstrFmt("HostOnly/%ls/IPNetMask", mInterfaceName.raw()).raw(), tmpMask.asOutParam()); if (tmpAddr.isEmpty()) + { tmpAddr = getDefaultIPv4Address(mInterfaceName); + /* + * We need to write the default IP address and mask to extra data now, + * so the interface gets re-created after vboxnetadp.ko reload. + * Note that we avoid calling EnableStaticIpConfig since it would + * change the address on host's interface as well and we want to + * postpone the change until VM actually starts. + */ + hrc = mVBox->SetExtraData(BstrFmt("HostOnly/%ls/IPAddress", + mInterfaceName.raw()).raw(), + tmpAddr.raw()); + ComAssertComRCRet(hrc, hrc); + } + if (tmpMask.isEmpty()) + { tmpMask = Bstr(VBOXNET_IPV4MASK_DEFAULT); + hrc = mVBox->SetExtraData(BstrFmt("HostOnly/%ls/IPNetMask", + mInterfaceName.raw()).raw(), + Bstr(VBOXNET_IPV4MASK_DEFAULT).raw()); + ComAssertComRCRet(hrc, hrc); + } m.IPAddress = inet_addr(Utf8Str(tmpAddr).c_str()); m.networkMask = inet_addr(Utf8Str(tmpMask).c_str()); } @@ -582,6 +603,7 @@ HRESULT HostNetworkInterface::setVirtualBox(VirtualBox *pVBox) m.IPV6NetworkMaskPrefixLength = 64; } } +#endif return S_OK; } diff --git a/src/VBox/Main/src-server/MachineImpl.cpp b/src/VBox/Main/src-server/MachineImpl.cpp index 30ffdbc32..ed86b9c2e 100644 --- a/src/VBox/Main/src-server/MachineImpl.cpp +++ b/src/VBox/Main/src-server/MachineImpl.cpp @@ -153,7 +153,7 @@ Machine::HWData::HWData() mMonitorCount = 1; mHWVirtExEnabled = true; mHWVirtExNestedPagingEnabled = true; -#if HC_ARCH_BITS == 64 && !defined(RT_OS_LINUX) +#if HC_ARCH_BITS == 64 && !defined(RT_OS_LINUX) && !defined(RT_OS_SOLARIS) mHWVirtExLargePagesEnabled = true; #else /* Not supported on 32 bits hosts. */ @@ -2188,6 +2188,8 @@ STDMETHODIMP Machine::COMGETTER(USBController)(IUSBController **aUSBController) AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); + + clearError(); MultiResult rc(S_OK); # ifdef VBOX_WITH_USB @@ -3027,7 +3029,7 @@ STDMETHODIMP Machine::LockMachine(ISession *aSession, { // this machine is awaiting for a spawning session to be opened: // then the calling process must be the one that got started by - // launchVMProcess() + // LaunchVMProcess() LogFlowThisFunc(("mSession.mPid=%d(0x%x)\n", mData->mSession.mPid, mData->mSession.mPid)); LogFlowThisFunc(("session.pid=%d(0x%x)\n", pid, pid)); @@ -3035,7 +3037,7 @@ STDMETHODIMP Machine::LockMachine(ISession *aSession, if (mData->mSession.mPid != pid) return setError(E_ACCESSDENIED, tr("An unexpected process (PID=0x%08X) has tried to lock the " - "machine '%s', while only the process started by launchVMProcess (PID=0x%08X) is allowed"), + "machine '%s', while only the process started by LaunchVMProcess (PID=0x%08X) is allowed"), pid, mUserData->s.strName.c_str(), mData->mSession.mPid); } @@ -3064,8 +3066,8 @@ STDMETHODIMP Machine::LockMachine(ISession *aSession, /* * Leave the lock before calling the client process -- it will call * Machine/SessionMachine methods. Leaving the lock here is quite safe - * because the state is Spawning, so that openRemotesession() and - * openExistingSession() calls will fail. This method, called before we + * because the state is Spawning, so that LaunchVMProcess() and + * LockMachine() calls will fail. This method, called before we * enter the lock again, will fail because of the wrong PID. * * Note that mData->mSession.mRemoteControls accessed outside @@ -3103,7 +3105,7 @@ STDMETHODIMP Machine::LockMachine(ISession *aSession, if (SUCCEEDED(rc)) { /* - * after openRemoteSession(), the first and the only + * after LaunchVMProcess(), the first and the only * entry in remoteControls is that remote session */ LogFlowThisFunc(("Calling AssignRemoteMachine()...\n")); @@ -3210,26 +3212,41 @@ STDMETHODIMP Machine::LaunchVMProcess(ISession *aSession, IN_BSTR aEnvironment, IProgress **aProgress) { - CheckComArgNotNull(aSession); CheckComArgStrNotEmptyOrNull(aType); + Utf8Str strType(aType); + Utf8Str strEnvironment(aEnvironment); + /* "emergencystop" doesn't need the session, so skip the checks/interface + * retrieval. This code doesn't quite fit in here, but introducing a + * special API method would be even more effort, and would require explicit + * support by every API client. It's better to hide the feature a bit. */ + if (strType != "emergencystop") + CheckComArgNotNull(aSession); CheckComArgOutPointerValid(aProgress); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); - /* check the session state */ - SessionState_T state; - HRESULT rc = aSession->COMGETTER(State)(&state); - if (FAILED(rc)) return rc; + ComPtr<IInternalSessionControl> control; + HRESULT rc = S_OK; - if (state != SessionState_Unlocked) - return setError(VBOX_E_INVALID_OBJECT_STATE, - tr("The given session is busy")); + if (strType != "emergencystop") + { + /* check the session state */ + SessionState_T state; + rc = aSession->COMGETTER(State)(&state); + if (FAILED(rc)) + return rc; - /* get the IInternalSessionControl interface */ - ComPtr<IInternalSessionControl> control = aSession; - ComAssertMsgRet(!!control, ("No IInternalSessionControl interface"), - E_INVALIDARG); + if (state != SessionState_Unlocked) + return setError(VBOX_E_INVALID_OBJECT_STATE, + tr("The given session is busy")); + + /* get the IInternalSessionControl interface */ + control = aSession; + ComAssertMsgRet(!control.isNull(), + ("No IInternalSessionControl interface"), + E_INVALIDARG); + } /* get the teleporter enable state for the progress object init. */ BOOL fTeleporterEnabled; @@ -3238,30 +3255,61 @@ STDMETHODIMP Machine::LaunchVMProcess(ISession *aSession, return rc; /* create a progress object */ - ComObjPtr<ProgressProxy> progress; - progress.createObject(); - rc = progress->init(mParent, - static_cast<IMachine*>(this), - Bstr(tr("Spawning session")).raw(), - TRUE /* aCancelable */, - fTeleporterEnabled ? 20 : 10 /* uTotalOperationsWeight */, - Bstr(tr("Spawning session")).raw(), - 2 /* uFirstOperationWeight */, - fTeleporterEnabled ? 3 : 1 /* cOtherProgressObjectOperations */); - if (SUCCEEDED(rc)) + if (strType != "emergencystop") { - rc = openRemoteSession(control, aType, aEnvironment, progress); + ComObjPtr<ProgressProxy> progress; + progress.createObject(); + rc = progress->init(mParent, + static_cast<IMachine*>(this), + Bstr(tr("Starting VM")).raw(), + TRUE /* aCancelable */, + fTeleporterEnabled ? 20 : 10 /* uTotalOperationsWeight */, + BstrFmt(tr("Creating process for virtual machine \"%s\" (%s)"), mUserData->s.strName.c_str(), strType.c_str()).raw(), + 2 /* uFirstOperationWeight */, + fTeleporterEnabled ? 3 : 1 /* cOtherProgressObjectOperations */); + if (SUCCEEDED(rc)) { - progress.queryInterfaceTo(aProgress); + rc = launchVMProcess(control, strType, strEnvironment, progress); + if (SUCCEEDED(rc)) + { + progress.queryInterfaceTo(aProgress); - /* signal the client watcher thread */ - mParent->updateClientWatcher(); + /* signal the client watcher thread */ + mParent->updateClientWatcher(); - /* fire an event */ - mParent->onSessionStateChange(getId(), SessionState_Spawning); + /* fire an event */ + mParent->onSessionStateChange(getId(), SessionState_Spawning); + } } } + else + { + /* no progress object - either instant success or failure */ + *aProgress = NULL; + + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); + + if (mData->mSession.mState != SessionState_Locked) + return setError(VBOX_E_INVALID_OBJECT_STATE, + tr("The machine '%s' is not locked by a session"), + mUserData->s.strName.c_str()); + + /* must have a VM process associated - do not kill normal API clients + * with an open session */ + if (!Global::IsOnline(mData->mMachineState)) + return setError(VBOX_E_INVALID_OBJECT_STATE, + tr("The machine '%s' does not have a VM process"), + mUserData->s.strName.c_str()); + + /* forcibly terminate the VM process */ + if (mData->mSession.mPid != NIL_RTPROCESS) + RTProcTerminate(mData->mSession.mPid); + + /* signal the client watcher thread, as most likely the client has + * been terminated */ + mParent->updateClientWatcher(); + } return rc; } @@ -3315,7 +3363,7 @@ STDMETHODIMP Machine::AttachDevice(IN_BSTR aControllerName, DeviceType_T aType, IMedium *aMedium) { - LogFlowThisFunc(("aControllerName=\"%ls\" aControllerPort=%d aDevice=%d aType=%d aId=\"%ls\"\n", + LogFlowThisFunc(("aControllerName=\"%ls\" aControllerPort=%d aDevice=%d aType=%d aMedium=%p\n", aControllerName, aControllerPort, aDevice, aType, aMedium)); CheckComArgStrNotEmptyOrNull(aControllerName); @@ -3697,7 +3745,7 @@ STDMETHODIMP Machine::AttachDevice(IN_BSTR aControllerName, aDevice, aType, fIndirect, - NULL); + Utf8Str::Empty); if (FAILED(rc)) return rc; if (associate && !medium.isNull()) @@ -3859,7 +3907,23 @@ STDMETHODIMP Machine::SetBandwidthGroupForDevice(IN_BSTR aControllerName, LONG a AutoWriteLock attLock(pAttach COMMA_LOCKVAL_SRC_POS); - pAttach->updateBandwidthGroup(group); + const Utf8Str strBandwidthGroupOld = pAttach->getBandwidthGroup(); + if (strBandwidthGroupOld.isNotEmpty()) + { + /* Get the bandwidth group object and release it - this must not fail. */ + ComObjPtr<BandwidthGroup> pBandwidthGroupOld; + rc = getBandwidthGroup(strBandwidthGroupOld, pBandwidthGroupOld, false); + Assert(SUCCEEDED(rc)); + + pBandwidthGroupOld->release(); + pAttach->updateBandwidthGroup(Utf8Str::Empty); + } + + if (!group.isNull()) + { + group->reference(); + pAttach->updateBandwidthGroup(group->getName()); + } return S_OK; } @@ -4638,15 +4702,22 @@ STDMETHODIMP Machine::CreateSharedFolder(IN_BSTR aName, IN_BSTR aHostPath, BOOL HRESULT rc = checkStateDependency(MutableStateDep); if (FAILED(rc)) return rc; + Utf8Str strName(aName); + ComObjPtr<SharedFolder> sharedFolder; - rc = findSharedFolder(aName, sharedFolder, false /* aSetError */); + rc = findSharedFolder(strName, sharedFolder, false /* aSetError */); if (SUCCEEDED(rc)) return setError(VBOX_E_OBJECT_IN_USE, - tr("Shared folder named '%ls' already exists"), - aName); + tr("Shared folder named '%s' already exists"), + strName.c_str()); sharedFolder.createObject(); - rc = sharedFolder->init(getMachine(), aName, aHostPath, aWritable, aAutoMount); + rc = sharedFolder->init(getMachine(), + strName, + aHostPath, + !!aWritable, + !!aAutoMount, + true /* fFailOnError */); if (FAILED(rc)) return rc; setModified(IsModified_SharedFolders); @@ -4954,6 +5025,12 @@ HRESULT Machine::setGuestPropertyToService(IN_BSTR aName, IN_BSTR aValue, HRESULT Machine::setGuestPropertyToVM(IN_BSTR aName, IN_BSTR aValue, IN_BSTR aFlags) { + CheckComArgStrNotEmptyOrNull(aName); + if ((aValue != NULL) && !VALID_PTR(aValue)) + return E_INVALIDARG; + if ((aFlags != NULL) && !VALID_PTR(aFlags)) + return E_INVALIDARG; + HRESULT rc; try { @@ -4969,7 +5046,8 @@ HRESULT Machine::setGuestPropertyToVM(IN_BSTR aName, IN_BSTR aValue, (aName, /** @todo Fix when adding DeleteGuestProperty(), see defect. */ - *aValue ? aValue : NULL, aFlags, true /* isSetter */, + aValue, aFlags, + true /* isSetter */, &dummy, &dummy64, &dummy); } catch (std::bad_alloc &) @@ -5942,8 +6020,14 @@ void Machine::copyPathRelativeToMachine(const Utf8Str &strSource, strTarget = mData->m_strConfigFileFull; strTarget.stripFilename(); if (RTPathStartsWith(strSource.c_str(), strTarget.c_str())) + { // is relative: then append what's left strTarget = strSource.substr(strTarget.length() + 1); // skip '/' + // for empty paths (only possible for subdirs) use "." to avoid + // triggering default settings for not present config attributes. + if (strTarget.isEmpty()) + strTarget = "."; + } else // is not relative: then overwrite strTarget = strSource; @@ -5988,10 +6072,10 @@ Utf8Str Machine::queryLogFilename(ULONG idx) * @note Locks this object for writing, calls the client process * (inside the lock). */ -HRESULT Machine::openRemoteSession(IInternalSessionControl *aControl, - IN_BSTR aType, - IN_BSTR aEnvironment, - ProgressProxy *aProgress) +HRESULT Machine::launchVMProcess(IInternalSessionControl *aControl, + const Utf8Str &strType, + const Utf8Str &strEnvironment, + ProgressProxy *aProgress) { LogFlowThisFuncEnter(); @@ -6034,7 +6118,7 @@ HRESULT Machine::openRemoteSession(IInternalSessionControl *aControl, RTENV env = RTENV_DEFAULT; - if (aEnvironment != NULL && *aEnvironment) + if (!strEnvironment.isEmpty()) { char *newEnvStr = NULL; @@ -6044,7 +6128,7 @@ HRESULT Machine::openRemoteSession(IInternalSessionControl *aControl, int vrc2 = RTEnvClone(&env, RTENV_DEFAULT); AssertRCBreakStmt(vrc2, vrc = vrc2); - newEnvStr = RTStrDup(Utf8Str(aEnvironment).c_str()); + newEnvStr = RTStrDup(strEnvironment.c_str()); AssertPtrBreakStmt(newEnvStr, vrc = vrc2); /* put new variables to the environment @@ -6083,8 +6167,6 @@ HRESULT Machine::openRemoteSession(IInternalSessionControl *aControl, RTStrFree(newEnvStr); } - Utf8Str strType(aType); - /* Qt is default */ #ifdef VBOX_WITH_QTGUI if (strType == "gui" || strType == "GUI/Qt") @@ -6145,7 +6227,11 @@ HRESULT Machine::openRemoteSession(IInternalSessionControl *aControl, Utf8Str idStr = mData->mUuid.toString(); /* Leave space for "--capture" arg. */ - const char * args[] = {szPath, "--comment", mUserData->s.strName.c_str(), "--startvm", idStr.c_str(), 0, 0 }; + const char * args[] = {szPath, "--comment", mUserData->s.strName.c_str(), + "--startvm", idStr.c_str(), + "--vrde", "config", + 0, /* For "--capture". */ + 0 }; if (strType == "capture") { unsigned pos = RT_ELEMENTS(args) - 2; @@ -6950,25 +7036,27 @@ HRESULT Machine::setMachineState(MachineState_T aMachineState) * @note * must be called from under the object's lock! */ -HRESULT Machine::findSharedFolder(CBSTR aName, +HRESULT Machine::findSharedFolder(const Utf8Str &aName, ComObjPtr<SharedFolder> &aSharedFolder, bool aSetError /* = false */) { - bool found = false; + HRESULT rc = VBOX_E_OBJECT_NOT_FOUND; for (HWData::SharedFolderList::const_iterator it = mHWData->mSharedFolders.begin(); - !found && it != mHWData->mSharedFolders.end(); + it != mHWData->mSharedFolders.end(); ++it) { - AutoWriteLock alock(*it COMMA_LOCKVAL_SRC_POS); - found = (*it)->getName() == aName; - if (found) - aSharedFolder = *it; + SharedFolder *pSF = *it; + AutoCaller autoCaller(pSF); + if (pSF->getName() == aName) + { + aSharedFolder = pSF; + rc = S_OK; + break; + } } - HRESULT rc = found ? S_OK : VBOX_E_OBJECT_NOT_FOUND; - - if (aSetError && !found) - setError(rc, tr("Could not find a shared folder named '%ls'"), aName); + if (aSetError && FAILED(rc)) + setError(rc, tr("Could not find a shared folder named '%s'"), aName.c_str()); return rc; } @@ -7642,6 +7730,7 @@ HRESULT Machine::loadStorageDevices(StorageController *aStorageController, dev.strBwGroup.c_str(), mUserData->s.strName.c_str(), mData->m_strConfigFileFull.c_str()); + pBwGroup->reference(); } const Bstr controllerName = aStorageController->getName(); @@ -7654,7 +7743,7 @@ HRESULT Machine::loadStorageDevices(StorageController *aStorageController, dev.lDevice, dev.deviceType, dev.fPassThrough, - pBwGroup); + pBwGroup.isNull() ? Utf8Str::Empty : pBwGroup->getName()); if (FAILED(rc)) break; /* associate the medium with this machine and snapshot */ @@ -7849,6 +7938,7 @@ HRESULT Machine::prepareSaveSettings(bool *pfNeedsGlobalSaveSettings) bool fileRenamed = false; Utf8Str configFile, newConfigFile; + Utf8Str configFilePrev, newConfigFilePrev; Utf8Str configDir, newConfigDir; do @@ -7914,6 +8004,11 @@ HRESULT Machine::prepareSaveSettings(bool *pfNeedsGlobalSaveSettings) break; } fileRenamed = true; + configFilePrev = configFile; + configFilePrev += "-prev"; + newConfigFilePrev = newConfigFile; + newConfigFilePrev += "-prev"; + RTFileRename(configFilePrev.c_str(), newConfigFilePrev.c_str(), 0); } } @@ -7953,7 +8048,10 @@ HRESULT Machine::prepareSaveSettings(bool *pfNeedsGlobalSaveSettings) { /* silently try to rename everything back */ if (fileRenamed) + { + RTFileRename(newConfigFilePrev.c_str(), configFilePrev.c_str(), 0); RTFileRename(newConfigFile.c_str(), configFile.c_str(), 0); + } if (dirRenamed) RTPathRename(newConfigDir.c_str(), configDir.c_str(), 0); } @@ -8424,12 +8522,14 @@ HRESULT Machine::saveHardware(settings::Hardware &data) it != mHWData->mSharedFolders.end(); ++it) { - ComObjPtr<SharedFolder> pFolder = *it; + SharedFolder *pSF = *it; + AutoCaller sfCaller(pSF); + AutoReadLock sfLock(pSF COMMA_LOCKVAL_SRC_POS); settings::SharedFolder sf; - sf.strName = pFolder->getName(); - sf.strHostPath = pFolder->getHostPath(); - sf.fWritable = !!pFolder->isWritable(); - sf.fAutoMount = !!pFolder->isAutoMounted(); + sf.strName = pSF->getName(); + sf.strHostPath = pSF->getHostPath(); + sf.fWritable = !!pSF->isWritable(); + sf.fAutoMount = !!pSF->isAutoMounted(); data.llSharedFolders.push_back(sf); } @@ -8462,7 +8562,8 @@ HRESULT Machine::saveHardware(settings::Hardware &data) if ( ( mData->mMachineState == MachineState_PoweredOff || mData->mMachineState == MachineState_Aborted || mData->mMachineState == MachineState_Teleported) - && property.mFlags & guestProp::TRANSIENT) + && ( property.mFlags & guestProp::TRANSIENT + || property.mFlags & guestProp::TRANSRESET)) continue; settings::GuestProperty prop; prop.strName = property.strName; @@ -8565,7 +8666,6 @@ HRESULT Machine::saveStorageDevices(ComObjPtr<StorageController> aStorageControl MediumAttachment *pAttach = *it; Medium *pMedium = pAttach->getMedium(); - BandwidthGroup *pBwGroup = pAttach->getBandwidthGroup(); dev.deviceType = pAttach->getType(); dev.lPort = pAttach->getPort(); @@ -8579,10 +8679,7 @@ HRESULT Machine::saveStorageDevices(ComObjPtr<StorageController> aStorageControl dev.fPassThrough = pAttach->getPassthrough(); } - if (pBwGroup) - { - dev.strBwGroup = pBwGroup->getName(); - } + dev.strBwGroup = pAttach->getBandwidthGroup(); data.llAttachedDevices.push_back(dev); } @@ -9403,6 +9500,23 @@ void Machine::commitMedia(bool aOnline /*= false*/) if (isSessionMachine()) { + /* + * Update the parent machine to point to the new owner. + * This is necessary because the stored parent will point to the + * session machine otherwise and cause crashes or errors later + * when the session machine gets invalid. + * + * @todo: Change the MediumAttachment class to behave like any other class + * in this regard by creating peer MediumAttachment objects for + * session machines and share the data with the peer machine. + */ + for (MediaData::AttachmentList::const_iterator it = mMediaData->mAttachments.begin(); + it != mMediaData->mAttachments.end(); + ++it) + { + (*it)->updateParentMachine(mPeer); + } + /* attach new data to the primary machine and reshare it */ mPeer->mMediaData.attach(mMediaData); } @@ -10316,7 +10430,7 @@ void SessionMachine::uninit(Uninit::Reason aReason) if (!mData->mSession.mType.isEmpty()) { /* mType is not null when this machine's process has been started by - * Machine::launchVMProcess(), therefore it is our child. We + * Machine::LaunchVMProcess(), therefore it is our child. We * need to queue the PID to reap the process (and avoid zombies on * Linux). */ Assert(mData->mSession.mPid != NIL_RTPROCESS); @@ -10540,7 +10654,7 @@ STDMETHODIMP SessionMachine::EndPowerUp(LONG iResult) if (mData->mSession.mState != SessionState_Locked) return VBOX_E_INVALID_OBJECT_STATE; - /* Finalize the openRemoteSession progress object. */ + /* Finalize the LaunchVMProcess progress object. */ if (mData->mSession.mProgress) { mData->mSession.mProgress->notifyComplete((HRESULT)iResult); @@ -10690,6 +10804,7 @@ STDMETHODIMP SessionMachine::CaptureUSBDevice(IN_BSTR aId) #ifdef VBOX_WITH_USB /* if captureDeviceForVM() fails, it must have set extended error info */ + clearError(); MultiResult rc = mParent->host()->checkUSBProxyService(); if (FAILED(rc)) return rc; @@ -10842,7 +10957,7 @@ STDMETHODIMP SessionMachine::OnSessionEnd(ISession *aSession, * #checkForDeath() is called to uninitialize this session object after * it releases the IPC semaphore. * Note! Because we're "reusing" mProgress here, this must be a proxy - * object just like for openRemoteSession. */ + * object just like for LaunchVMProcess. */ Assert(mData->mSession.mProgress.isNull()); ComObjPtr<ProgressProxy> progress; progress.createObject(); @@ -11725,6 +11840,7 @@ HRESULT SessionMachine::lockMedia() /* bail out if trying to lock things with already set up locking */ AssertReturn(mData->mSession.mLockedMedia.IsEmpty(), E_FAIL); + clearError(); MultiResult mrc(S_OK); /* Collect locking information for all medium objects attached to the VM. */ @@ -11987,7 +12103,8 @@ HRESULT SessionMachine::setMachineState(MachineState_T aMachineState) if (!fNeedsSaving) for (it = mHWData->mGuestProperties.begin(); it != mHWData->mGuestProperties.end(); ++it) - if (it->mFlags & guestProp::TRANSIENT) + if ( (it->mFlags & guestProp::TRANSIENT) + || (it->mFlags & guestProp::TRANSRESET)) { fNeedsSaving = true; break; diff --git a/src/VBox/Main/src-server/MediumAttachmentImpl.cpp b/src/VBox/Main/src-server/MediumAttachmentImpl.cpp index 0ecad3284..f9b073963 100644 --- a/src/VBox/Main/src-server/MediumAttachmentImpl.cpp +++ b/src/VBox/Main/src-server/MediumAttachmentImpl.cpp @@ -18,7 +18,6 @@ #include "MediumAttachmentImpl.h" #include "MachineImpl.h" #include "MediumImpl.h" -#include "BandwidthGroupImpl.h" #include "Global.h" #include "AutoStateDep.h" @@ -44,13 +43,14 @@ struct BackupableMediumAttachmentData { } ComObjPtr<Medium> pMedium; - ComObjPtr<BandwidthGroup> pBwGroup; /* Since MediumAttachment is not a first class citizen when it * comes to managing settings, having a reference to the storage * controller will not work - when settings are changed it will point * to the old, uninitialized instance. Changing this requires * substantial changes to MediumImpl.cpp. */ const Bstr bstrControllerName; + /* Same counts for the assigned bandwidth group */ + Utf8Str strBandwidthGroup; const LONG lPort; const LONG lDevice; const DeviceType_T type; @@ -108,7 +108,7 @@ HRESULT MediumAttachment::init(Machine *aParent, LONG aDevice, DeviceType_T aType, bool aPassthrough, - BandwidthGroup *aBandwidthGroup) + const Utf8Str &strBandwidthGroup) { LogFlowThisFuncEnter(); LogFlowThisFunc(("aParent=%p aMedium=%p aControllerName=%ls aPort=%d aDevice=%d aType=%d aPassthrough=%d\n", aParent, aMedium, aControllerName.raw(), aPort, aDevice, aType, aPassthrough)); @@ -126,9 +126,7 @@ HRESULT MediumAttachment::init(Machine *aParent, m->bd.allocate(); m->bd->pMedium = aMedium; - if (aBandwidthGroup) - aBandwidthGroup->reference(); - m->bd->pBwGroup = aBandwidthGroup; + unconst(m->bd->strBandwidthGroup) = strBandwidthGroup; unconst(m->bd->bstrControllerName) = aControllerName; unconst(m->bd->lPort) = aPort; unconst(m->bd->lDevice) = aDevice; @@ -281,6 +279,7 @@ STDMETHODIMP MediumAttachment::COMGETTER(Passthrough)(BOOL *aPassthrough) STDMETHODIMP MediumAttachment::COMGETTER(BandwidthGroup) (IBandwidthGroup **aBwGroup) { + LogFlowThisFuncEnter(); CheckComArgOutPointerValid(aBwGroup); AutoCaller autoCaller(this); @@ -288,9 +287,20 @@ STDMETHODIMP MediumAttachment::COMGETTER(BandwidthGroup) (IBandwidthGroup **aBwG AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS); - m->bd->pBwGroup.queryInterfaceTo(aBwGroup); + HRESULT hrc = S_OK; + if (m->bd->strBandwidthGroup.isNotEmpty()) + { + ComObjPtr<BandwidthGroup> pBwGroup; + hrc = m->pMachine->getBandwidthGroup(m->bd->strBandwidthGroup, pBwGroup, true /* fSetError */); + + Assert(SUCCEEDED(hrc)); /* This is not allowed to fail because the existence of the group was checked when it was attached. */ - return S_OK; + if (SUCCEEDED(hrc)) + pBwGroup.queryInterfaceTo(aBwGroup); + } + + LogFlowThisFuncLeave(); + return hrc; } /** @@ -316,7 +326,7 @@ void MediumAttachment::rollback() */ void MediumAttachment::commit() { - LogFlowThisFuncEnter(); + LogFlowThisFunc(("ENTER - %s\n", getLogName())); /* sanity */ AutoCaller autoCaller(this); @@ -327,7 +337,7 @@ void MediumAttachment::commit() if (m->bd.isBackedUp()) m->bd.commit(); - LogFlowThisFuncLeave(); + LogFlowThisFunc(("LEAVE - %s\n", getLogName())); } bool MediumAttachment::isImplicit() const @@ -371,9 +381,9 @@ bool MediumAttachment::getPassthrough() const return m->bd->fPassthrough; } -const ComObjPtr<BandwidthGroup>& MediumAttachment::getBandwidthGroup() const +const Utf8Str& MediumAttachment::getBandwidthGroup() const { - return m->bd->pBwGroup; + return m->bd->strBandwidthGroup; } bool MediumAttachment::matches(CBSTR aControllerName, LONG aPort, LONG aDevice) @@ -405,18 +415,29 @@ void MediumAttachment::updatePassthrough(bool aPassthrough) m->bd->fPassthrough = aPassthrough; } -void MediumAttachment::updateBandwidthGroup(const ComObjPtr<BandwidthGroup> &aBandwidthGroup) +void MediumAttachment::updateBandwidthGroup(const Utf8Str &aBandwidthGroup) { + LogFlowThisFuncEnter(); Assert(isWriteLockOnCurrentThread()); m->bd.backup(); - if (!aBandwidthGroup.isNull()) - aBandwidthGroup->reference(); + m->bd->strBandwidthGroup = aBandwidthGroup; - if (!m->bd->pBwGroup.isNull()) - { - m->bd->pBwGroup->release(); - } - m->bd->pBwGroup = aBandwidthGroup; + LogFlowThisFuncLeave(); +} + +void MediumAttachment::updateParentMachine(Machine * const pMachine) +{ + LogFlowThisFunc(("ENTER - %s\n", getLogName())); + + /* sanity */ + AutoCaller autoCaller(this); + AssertComRCReturnVoid (autoCaller.rc()); + + AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); + + unconst(m->pMachine) = pMachine; + + LogFlowThisFunc(("LEAVE - %s\n", getLogName())); } diff --git a/src/VBox/Main/src-server/MediumImpl.cpp b/src/VBox/Main/src-server/MediumImpl.cpp index e5aa57fa3..6e8322b4d 100644 --- a/src/VBox/Main/src-server/MediumImpl.cpp +++ b/src/VBox/Main/src-server/MediumImpl.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2008-2010 Oracle Corporation + * Copyright (C) 2008-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -3577,6 +3577,9 @@ bool Medium::isReadOnly() if (it->llSnapshotIds.size() != 0) return true; + if (m->variant & MediumVariant_VmdkStreamOptimized) + return true; + return false; } case MediumType_Immutable: @@ -6180,9 +6183,12 @@ HRESULT Medium::taskCreateBaseHandler(Medium::CreateBaseTask &task) try { /* ensure the directory exists */ - rc = VirtualBox::ensureFilePathExists(location); - if (FAILED(rc)) - throw rc; + if (capabilities & VD_CAP_FILE) + { + rc = VirtualBox::ensureFilePathExists(location); + if (FAILED(rc)) + throw rc; + } VDGEOMETRY geo = { 0, 0, 0 }; /* auto-detect */ @@ -6344,9 +6350,12 @@ HRESULT Medium::taskCreateDiffHandler(Medium::CreateDiffTask &task) } /* ensure the target directory exists */ - rc = VirtualBox::ensureFilePathExists(targetLocation); - if (FAILED(rc)) - throw rc; + if (capabilities & VD_CAP_FILE) + { + rc = VirtualBox::ensureFilePathExists(targetLocation); + if (FAILED(rc)) + throw rc; + } vrc = VDCreateDiff(hdd, targetFormat.c_str(), @@ -6825,6 +6834,7 @@ HRESULT Medium::taskCloneHandler(Medium::CloneTask &task) Utf8Str targetFormat(pTarget->m->strFormat); Utf8Str targetLocation(pTarget->m->strLocationFull); + uint64_t capabilities = pTarget->m->formatObj->getCapabilities(); Assert( pTarget->m->state == MediumState_Creating || pTarget->m->state == MediumState_LockedWrite); @@ -6836,9 +6846,12 @@ HRESULT Medium::taskCloneHandler(Medium::CloneTask &task) thisLock.release(); /* ensure the target directory exists */ - rc = VirtualBox::ensureFilePathExists(targetLocation); - if (FAILED(rc)) - throw rc; + if (capabilities & VD_CAP_FILE) + { + rc = VirtualBox::ensureFilePathExists(targetLocation); + if (FAILED(rc)) + throw rc; + } PVBOXHDD targetHdd; vrc = VDCreate(m->vdDiskIfaces, convertDeviceType(), &targetHdd); @@ -7464,6 +7477,7 @@ HRESULT Medium::taskExportHandler(Medium::ExportTask &task) Utf8Str targetFormat(task.mFormat->getId()); Utf8Str targetLocation(task.mFilename); + uint64_t capabilities = task.mFormat->getCapabilities(); Assert(m->state == MediumState_LockedRead); @@ -7471,9 +7485,12 @@ HRESULT Medium::taskExportHandler(Medium::ExportTask &task) thisLock.release(); /* ensure the target directory exists */ - rc = VirtualBox::ensureFilePathExists(targetLocation); - if (FAILED(rc)) - throw rc; + if (capabilities & VD_CAP_FILE) + { + rc = VirtualBox::ensureFilePathExists(targetLocation); + if (FAILED(rc)) + throw rc; + } PVBOXHDD targetHdd; vrc = VDCreate(m->vdDiskIfaces, convertDeviceType(), &targetHdd); @@ -7582,6 +7599,7 @@ HRESULT Medium::taskImportHandler(Medium::ImportTask &task) Utf8Str targetFormat(m->strFormat); Utf8Str targetLocation(m->strLocationFull); + uint64_t capabilities = task.mFormat->getCapabilities(); Assert( m->state == MediumState_Creating || m->state == MediumState_LockedWrite); @@ -7592,9 +7610,12 @@ HRESULT Medium::taskImportHandler(Medium::ImportTask &task) thisLock.release(); /* ensure the target directory exists */ - rc = VirtualBox::ensureFilePathExists(targetLocation); - if (FAILED(rc)) - throw rc; + if (capabilities & VD_CAP_FILE) + { + rc = VirtualBox::ensureFilePathExists(targetLocation); + if (FAILED(rc)) + throw rc; + } PVBOXHDD targetHdd; vrc = VDCreate(m->vdDiskIfaces, convertDeviceType(), &targetHdd); diff --git a/src/VBox/Main/src-server/Performance.cpp b/src/VBox/Main/src-server/Performance.cpp index 0b36aa804..2c6beef7b 100644 --- a/src/VBox/Main/src-server/Performance.cpp +++ b/src/VBox/Main/src-server/Performance.cpp @@ -346,7 +346,14 @@ void HostRamVmm::init(ULONG period, ULONG length) void HostRamVmm::preCollect(CollectorHints& hints, uint64_t /* iTick */) { - /* Guest RAM metrics do not use hints */ + /* + * This is an ugly ugly hack to force VMM metrics to 0s if no VM is + * running. The reason it should work is that the VMM stats are + * stored in CollectorHAL in preCollect methods of guest base metrics + * which are always added after HostRamVmm. So each pass of collector + * first clears the metrics then gets new values. + */ + mHAL->setMemHypervisorStats(0 /* ulMemAllocTotal */, 0 /* ulMemFreeTotal */, 0 /* ulMemBalloonTotal */, 0 /* ulMemSharedTotal */); } void HostRamVmm::collect() diff --git a/src/VBox/Main/src-server/SnapshotImpl.cpp b/src/VBox/Main/src-server/SnapshotImpl.cpp index f90b369bd..747641aa6 100644 --- a/src/VBox/Main/src-server/SnapshotImpl.cpp +++ b/src/VBox/Main/src-server/SnapshotImpl.cpp @@ -1990,8 +1990,9 @@ void SessionMachine::restoreSnapshotHandler(RestoreSnapshotTask &aTask) SaveS_ResetCurStateModified | saveFlags); if (FAILED(rc)) throw rc; - if (fNeedsGlobalSaveSettings) - mParent->addGuidToListUniquely(llRegistriesThatNeedSaving, mParent->getGlobalRegistryId()); + // unconditionally add the parent registry. We do similar in SessionMachine::EndTakingSnapshot + // (mParent->saveSettings()) + mParent->addGuidToListUniquely(llRegistriesThatNeedSaving, mParent->getGlobalRegistryId()); // let go of the locks while we're deleting image files below alock.leave(); diff --git a/src/VBox/Main/src-server/VirtualBoxImpl.cpp b/src/VBox/Main/src-server/VirtualBoxImpl.cpp index a58f6e97a..94376c27a 100644 --- a/src/VBox/Main/src-server/VirtualBoxImpl.cpp +++ b/src/VBox/Main/src-server/VirtualBoxImpl.cpp @@ -3948,12 +3948,11 @@ DECLCALLBACK(int) VirtualBox::ClientWatcher(RTTHREAD /* thread */, void *pvUser) size_t cnt = 0; size_t cntSpawned = 0; + VirtualBoxBase::initializeComForThread(); + #if defined(RT_OS_WINDOWS) - HRESULT hrc = CoInitializeEx(NULL, - COINIT_MULTITHREADED | COINIT_DISABLE_OLE1DDE | - COINIT_SPEED_OVER_MEMORY); - AssertComRC(hrc); + HRESULT hrc; /// @todo (dmik) processes reaping! @@ -4406,6 +4405,7 @@ DECLCALLBACK(int) VirtualBox::ClientWatcher(RTTHREAD /* thread */, void *pvUser) # error "Port me!" #endif + VirtualBoxBase::uninitializeComForThread(); LogFlowFuncLeave(); return 0; } @@ -4521,7 +4521,7 @@ STDMETHODIMP VirtualBox::FindDHCPServerByNetworkName(IN_BSTR aName, IDHCPServer ++it) { rc = (*it)->COMGETTER(NetworkName)(bstr.asOutParam()); - if (FAILED(rc)) throw rc; + if (FAILED(rc)) return rc; if (bstr == aName) { diff --git a/src/VBox/Main/src-server/generic/OpenGLTestApp.cpp b/src/VBox/Main/src-server/generic/OpenGLTestApp.cpp index 65b9d27aa..1ca0d7994 100644 --- a/src/VBox/Main/src-server/generic/OpenGLTestApp.cpp +++ b/src/VBox/Main/src-server/generic/OpenGLTestApp.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2009-2010 Oracle Corporation + * Copyright (C) 2009-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -132,8 +132,9 @@ static int vboxInitLogging(const char *pszFilename, bool bGenNameSuffix) } int vrc = RTLogCreateEx(&loggerRelease, fFlags, "all", - "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, - enmLogDest, szError, sizeof(szError), pszFilenameFmt, pszFilename, RTTimeMilliTS()); + "VBOX_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, enmLogDest, + NULL /* pfnBeginEnd */, 0 /* cHistory */, 0 /* cbHistoryFileMax */, 0 /* uHistoryTimeMax */, + szError, sizeof(szError), pszFilenameFmt, pszFilename, RTTimeMilliTS()); if (RT_SUCCESS(vrc)) { /* some introductory information */ diff --git a/src/VBox/Main/src-server/linux/USBGetDevices.cpp b/src/VBox/Main/src-server/linux/USBGetDevices.cpp index 70bb7cd9a..b2e2b70b3 100644 --- a/src/VBox/Main/src-server/linux/USBGetDevices.cpp +++ b/src/VBox/Main/src-server/linux/USBGetDevices.cpp @@ -99,10 +99,8 @@ static const USBSUFF s_aIntervalSuff[] = */ static const USBDEVTREELOCATION s_aTreeLocations[] = { - { "/proc/bus/usb", false }, - { "/dev/bus/usb", false }, { "/dev/vboxusb", true }, - { "/dev/bus/usb", true }, + { "/proc/bus/usb", false }, }; @@ -1444,17 +1442,7 @@ PCUSBDEVTREELOCATION USBProxyLinuxGetDeviceRoot(bool fPreferSysfs) if ( fHaveInotify && !pcBestSysfs && RTPathExists(s_aTreeLocations[i].szDevicesRoot)) - { - PUSBDEVICE pDevices; - - pDevices = getDevicesFromSysfs(s_aTreeLocations[i].szDevicesRoot, - true); - if (pDevices) - { - pcBestSysfs = &s_aTreeLocations[i]; - deviceListFree(&pDevices); - } - } + pcBestSysfs = &s_aTreeLocations[i]; } if (pcBestUsbfs && !fPreferSysfs) return pcBestUsbfs; diff --git a/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp b/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp index 3cc36bd77..eab255187 100644 --- a/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp +++ b/src/VBox/Main/src-server/linux/USBProxyServiceLinux.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -62,7 +62,7 @@ USBProxyServiceLinux::USBProxyServiceLinux(Host *aHost) mWakeupPipeW(NIL_RTFILE), mUsingUsbfsDevices(true /* see init */), mUdevPolls(0), mpWaiter(NULL) { - LogFlowThisFunc(("aHost=%p:{%s}\n", aHost)); + LogFlowThisFunc(("aHost=%p\n", aHost)); } @@ -92,33 +92,51 @@ HRESULT USBProxyServiceLinux::init(void) #else bool fUseSysfs = false; #endif - const char *pszUsbFromEnv = RTEnvGet("VBOX_USB"); - if (pszUsbFromEnv) + const char *pcszUsbFromEnv = RTEnvGet("VBOX_USB"); + const char *pcszUsbRoot = NULL; + if (pcszUsbFromEnv) { - if (!RTStrICmp(pszUsbFromEnv, "USBFS")) + bool fValidVBoxUSB = true; + + pcszUsbRoot = RTEnvGet("VBOX_USB_ROOT"); + if (!RTStrICmp(pcszUsbFromEnv, "USBFS")) { LogRel(("Default USB access method set to \"usbfs\" from environment\n")); fUseSysfs = false; } - else if (!RTStrICmp(pszUsbFromEnv, "SYSFS")) + else if (!RTStrICmp(pcszUsbFromEnv, "SYSFS")) { LogRel(("Default USB method set to \"sysfs\" from environment\n")); fUseSysfs = true; } else + { LogRel(("Invalid VBOX_USB environment variable setting \"%s\"\n", - pszUsbFromEnv)); + pcszUsbFromEnv)); + fValidVBoxUSB = false; + } + if (!fValidVBoxUSB && pcszUsbRoot) + pcszUsbRoot = NULL; + } + if (!pcszUsbRoot) + { + PCUSBDEVTREELOCATION pcLocation; + pcLocation = USBProxyLinuxGetDeviceRoot(fUseSysfs); + if (pcLocation) + { + pcszUsbRoot = pcLocation->szDevicesRoot; + fUseSysfs = pcLocation->fUseSysfs; + } } - PCUSBDEVTREELOCATION pcLocation = USBProxyLinuxGetDeviceRoot(fUseSysfs); - if (pcLocation) + if (pcszUsbRoot) { - mUsingUsbfsDevices = !pcLocation->fUseSysfs; - mDevicesRoot = pcLocation->szDevicesRoot; + mUsingUsbfsDevices = !fUseSysfs; + mDevicesRoot = pcszUsbRoot; int rc = mUsingUsbfsDevices ? initUsbfs() : initSysfs(); /* For the day when we have VBoxSVC release logging... */ LogRel((RT_SUCCESS(rc) ? "Successfully initialised host USB using %s\n" : "Failed to initialise host USB using %s\n", - mUsingUsbfsDevices ? "USBFS" : "sysfs/hal")); + mUsingUsbfsDevices ? "USBFS" : "sysfs")); mLastError = rc; } else diff --git a/src/VBox/Main/src-server/solaris/PerformanceSolaris.cpp b/src/VBox/Main/src-server/solaris/PerformanceSolaris.cpp index fc87fb416..37d3a9163 100644 --- a/src/VBox/Main/src-server/solaris/PerformanceSolaris.cpp +++ b/src/VBox/Main/src-server/solaris/PerformanceSolaris.cpp @@ -84,7 +84,8 @@ CollectorSolaris::CollectorSolaris() CollectorSolaris::~CollectorSolaris() { - kstat_close(mKC); + if (mKC) + kstat_close(mKC); } int CollectorSolaris::getRawHostCpuLoad(uint64_t *user, uint64_t *kernel, uint64_t *idle) @@ -190,7 +191,22 @@ int CollectorSolaris::getHostMemoryUsage(ULONG *total, ULONG *used, ULONG *avail if (mZFSCache) { if ((kn = (kstat_named_t *)kstat_data_lookup(mZFSCache, "size"))) - *available += (kn->value.ul / 1024); + { + ulong_t ulSize = kn->value.ul; + + if ((kn = (kstat_named_t *)kstat_data_lookup(mZFSCache, "c_min"))) + { + /* + * Account for ZFS minimum arc cache size limit. + * "c_min" is the target minimum size of the ZFS cache, and not the hard limit. It's possible + * for "size" to shrink below "c_min" (e.g: during boot & high memory consumption). + */ + ulong_t ulMin = kn->value.ul; + *available += ulSize > ulMin ? (ulSize - ulMin) / 1024 : 0; + } + else + Log(("kstat_data_lookup(c_min) ->%d\n", errno)); + } else Log(("kstat_data_lookup(size) -> %d\n", errno)); } @@ -208,6 +224,7 @@ int CollectorSolaris::getHostMemoryUsage(ULONG *total, ULONG *used, ULONG *avail return rc; } + int CollectorSolaris::getProcessMemoryUsage(RTPROCESS process, ULONG *used) { int rc = VINF_SUCCESS; diff --git a/src/VBox/Main/src-server/xpcom/server.cpp b/src/VBox/Main/src-server/xpcom/server.cpp index 8391ccfd8..2cc798a43 100644 --- a/src/VBox/Main/src-server/xpcom/server.cpp +++ b/src/VBox/Main/src-server/xpcom/server.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -614,96 +614,23 @@ NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR_WITH_RC(VirtualBox, VirtualBoxClassFact //////////////////////////////////////////////////////////////////////////////// -typedef NSFactoryDestructorProcPtr NSFactoryConsructorProcPtr; +typedef NSFactoryDestructorProcPtr NSFactoryConstructorProcPtr; /** * Enhanced module component information structure. * * nsModuleComponentInfo lacks the factory construction callback, here we add - * it. This callback is called by NS_NewGenericFactoryEx() after a - * nsGenericFactory instance is successfully created. + * it. This callback is called straight after a nsGenericFactory instance is + * successfully created in RegisterSelfComponents. */ -struct nsModuleComponentInfoEx : nsModuleComponentInfo +struct nsModuleComponentInfoPlusFactoryConstructor { - nsModuleComponentInfoEx() {} - nsModuleComponentInfoEx(int) {} - - nsModuleComponentInfoEx( - const char* aDescription, - const nsCID& aCID, - const char* aContractID, - NSConstructorProcPtr aConstructor, - NSRegisterSelfProcPtr aRegisterSelfProc, - NSUnregisterSelfProcPtr aUnregisterSelfProc, - NSFactoryDestructorProcPtr aFactoryDestructor, - NSGetInterfacesProcPtr aGetInterfacesProc, - NSGetLanguageHelperProcPtr aGetLanguageHelperProc, - nsIClassInfo ** aClassInfoGlobal, - PRUint32 aFlags, - NSFactoryConsructorProcPtr aFactoryConstructor) - { - mDescription = aDescription; - mCID = aCID; - mContractID = aContractID; - mConstructor = aConstructor; - mRegisterSelfProc = aRegisterSelfProc; - mUnregisterSelfProc = aUnregisterSelfProc; - mFactoryDestructor = aFactoryDestructor; - mGetInterfacesProc = aGetInterfacesProc; - mGetLanguageHelperProc = aGetLanguageHelperProc; - mClassInfoGlobal = aClassInfoGlobal; - mFlags = aFlags; - mFactoryConstructor = aFactoryConstructor; - } - + /** standard module component information */ + const nsModuleComponentInfo *mpModuleComponentInfo; /** (optional) Factory Construction Callback */ - NSFactoryConsructorProcPtr mFactoryConstructor; + NSFactoryConstructorProcPtr mFactoryConstructor; }; -//////////////////////////////////////////////////////////////////////////////// - -static const nsModuleComponentInfoEx components[] = -{ - nsModuleComponentInfoEx( - "VirtualBox component", - CLSID_VirtualBox, - NS_VIRTUALBOX_CONTRACTID, - VirtualBoxConstructor, // constructor function - NULL, // registration function - NULL, // deregistration function - VirtualBoxClassFactory::FactoryDestructor, // factory destructor function - NS_CI_INTERFACE_GETTER_NAME(VirtualBox), - NULL, // language helper - &NS_CLASSINFO_NAME(VirtualBox), - 0, // flags - VirtualBoxClassFactory::FactoryConstructor // factory constructor function - ) -}; - -///////////////////////////////////////////////////////////////////////////// - -/** - * Extends NS_NewGenericFactory() by immediately calling - * nsModuleComponentInfoEx::mFactoryConstructor before returning to the - * caller. - */ -nsresult -NS_NewGenericFactoryEx(nsIGenericFactory **result, - const nsModuleComponentInfoEx *info) -{ - AssertReturn(result, NS_ERROR_INVALID_POINTER); - - nsresult rv = NS_NewGenericFactory(result, info); - if (NS_SUCCEEDED(rv) && info && info->mFactoryConstructor) - { - rv = info->mFactoryConstructor(); - if (NS_FAILED(rv)) - NS_RELEASE(*result); - } - - return rv; -} - ///////////////////////////////////////////////////////////////////////////// /** @@ -712,26 +639,32 @@ NS_NewGenericFactoryEx(nsIGenericFactory **result, */ static nsresult RegisterSelfComponents(nsIComponentRegistrar *registrar, - const nsModuleComponentInfoEx *aComponents, + const nsModuleComponentInfoPlusFactoryConstructor *aComponents, PRUint32 count) { nsresult rc = NS_OK; - const nsModuleComponentInfoEx *info = aComponents; + const nsModuleComponentInfoPlusFactoryConstructor *info = aComponents; for (PRUint32 i = 0; i < count && NS_SUCCEEDED(rc); i++, info++) { /* skip components w/o a constructor */ - if (!info->mConstructor) + if (!info->mpModuleComponentInfo->mConstructor) continue; /* create a new generic factory for a component and register it */ nsIGenericFactory *factory; - rc = NS_NewGenericFactoryEx(&factory, info); + rc = NS_NewGenericFactory(&factory, info->mpModuleComponentInfo); + if (NS_SUCCEEDED(rc) && info->mFactoryConstructor) + { + rc = info->mFactoryConstructor(); + if (NS_FAILED(rc)) + NS_RELEASE(factory); + } if (NS_SUCCEEDED(rc)) { - rc = registrar->RegisterFactory(info->mCID, - info->mDescription, - info->mContractID, + rc = registrar->RegisterFactory(info->mpModuleComponentInfo->mCID, + info->mpModuleComponentInfo->mDescription, + info->mpModuleComponentInfo->mContractID, factory); - factory->Release(); + NS_RELEASE(factory); } } return rc; @@ -923,6 +856,27 @@ int main(int argc, char **argv) daemon_pipe_wr = PR_GetInheritedFD(VBOXSVC_STARTUP_PIPE_NAME); RTEnvUnset("NSPR_INHERIT_FDS"); + const nsModuleComponentInfo VirtualBoxInfo = { + "VirtualBox component", + NS_VIRTUALBOX_CID, + NS_VIRTUALBOX_CONTRACTID, + VirtualBoxConstructor, // constructor function + NULL, // registration function + NULL, // deregistration function + VirtualBoxClassFactory::FactoryDestructor, // factory destructor function + NS_CI_INTERFACE_GETTER_NAME(VirtualBox), + NULL, // language helper + &NS_CLASSINFO_NAME(VirtualBox), + 0 // flags + }; + + const nsModuleComponentInfoPlusFactoryConstructor components[] = { + { + &VirtualBoxInfo, + VirtualBoxClassFactory::FactoryConstructor // factory constructor function + } + }; + do { rc = com::Initialize(); @@ -942,7 +896,7 @@ int main(int argc, char **argv) registrar->AutoRegister(nsnull); rc = RegisterSelfComponents(registrar, components, - NS_ARRAY_LENGTH (components)); + NS_ARRAY_LENGTH(components)); if (NS_FAILED(rc)) { RTMsgError("Failed to register server components! (rc=%Rhrc)", rc); diff --git a/src/VBox/Main/testcase/Makefile.kmk b/src/VBox/Main/testcase/Makefile.kmk index e8d8fb801..69fd10337 100644 --- a/src/VBox/Main/testcase/Makefile.kmk +++ b/src/VBox/Main/testcase/Makefile.kmk @@ -29,7 +29,8 @@ ifndef VBOX_ONLY_SDK $(if $(VBOX_WITH_XPCOM),tstVBoxAPILinux,tstVBoxAPIWin) \ $(if $(VBOX_WITH_RESOURCE_USAGE_API),tstCollector,) PROGRAMS.linux += \ - $(if $(VBOX_WITH_USB),tstHostHardwareLinux,) + $(if $(VBOX_WITH_USB),tstHostHardwareLinux,) \ + $(if $(VBOX_WITH_USB),tstUSBProxyLinux,) endif # !VBOX_WITH_TESTCASES endif # !VBOX_ONLY_SDK if defined(VBOX_ONLY_SDK) || !defined(VBOX_WITH_XPCOM) @@ -164,6 +165,28 @@ tstHostHardwareLinux_LIBS += \ $(PATH_OUT)/lib/USBLib.a +# +# tstUSBProxyLinux +# +tstUSBProxyLinux_TEMPLATE = VBOXR3TSTNPEXE +tstUSBProxyLinux_SOURCES = \ + tstUSBProxyLinux.cpp \ + ../src-server/linux/USBProxyServiceLinux.cpp +tstUSBProxyLinux_INCS = \ + . \ + ../include \ + $(VBOX_PATH_SDK)/bindings/xpcom/include \ + $(VBOX_PATH_SDK)/bindings/xpcom/include/nsprpub \ + $(VBOX_PATH_SDK)/bindings/xpcom/include/xpcom +tstUSBProxyLinux_DEFS = \ + TESTCASE \ + VBOX_USB_WITH_SYSFS \ + VBOX_WITH_SYSFS_BY_DEFAULT \ + VBOX_WITH_XPCOM +tstUSBProxyLinux_DEPS = \ + $(VBOX_PATH_SDK)/bindings/xpcom/include/VirtualBox_XPCOM.h + + # generate rules. include $(KBUILD_PATH)/subfooter.kmk diff --git a/src/VBox/Main/testcase/tstUSBProxyLinux.cpp b/src/VBox/Main/testcase/tstUSBProxyLinux.cpp new file mode 100644 index 000000000..d674eb836 --- /dev/null +++ b/src/VBox/Main/testcase/tstUSBProxyLinux.cpp @@ -0,0 +1,192 @@ +/* $Id: tstUSBProxyLinux.cpp $ */ +/** @file + * USBProxyServiceLinux test case. + */ + +/* + * Copyright (C) 2011 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 "USBProxyService.h" +#include "USBGetDevices.h" + +#include <iprt/assert.h> +#include <iprt/err.h> +#include <iprt/env.h> +#include <iprt/test.h> + +/*** BEGIN STUBS ***/ + +USBProxyService::USBProxyService(Host*) {} +USBProxyService::~USBProxyService() {} +HRESULT USBProxyService::init() { return S_OK; } +int USBProxyService::start() { return VINF_SUCCESS; } +int USBProxyService::stop() { return VINF_SUCCESS; } +RWLockHandle *USBProxyService::lockHandle() const { return NULL; } +void *USBProxyService::insertFilter(USBFILTER const*) { return NULL; } +void USBProxyService::removeFilter(void*) {} +int USBProxyService::captureDevice(HostUSBDevice*) { return VINF_SUCCESS; } +void USBProxyService::captureDeviceCompleted(HostUSBDevice*, bool) {} +void USBProxyService::detachingDevice(HostUSBDevice*) {} +int USBProxyService::releaseDevice(HostUSBDevice*) { return VINF_SUCCESS; } +void USBProxyService::releaseDeviceCompleted(HostUSBDevice*, bool) {} +void USBProxyService::serviceThreadInit() {} +void USBProxyService::serviceThreadTerm() {} +int USBProxyService::wait(unsigned int) { return VINF_SUCCESS; } +int USBProxyService::interruptWait() { return VINF_SUCCESS; } +PUSBDEVICE USBProxyService::getDevices() { return NULL; } +void USBProxyService::deviceAdded(ComObjPtr<HostUSBDevice> &aDevice, SessionMachinesList &llOpenedMachines, PUSBDEVICE aUSBDevice) {} +void USBProxyService::deviceRemoved(ComObjPtr<HostUSBDevice> &aDevice) {} +void USBProxyService::deviceChanged(ComObjPtr<HostUSBDevice> &aDevice, SessionMachinesList*, SessionMachine*) {} +bool USBProxyService::updateDeviceState(HostUSBDevice*, USBDEVICE*, bool*, SessionMachine**) { return true; } +bool USBProxyService::updateDeviceStateFake(HostUSBDevice*, USBDEVICE*, bool*, SessionMachine**) { return true; } +bool USBProxyService::isActive() { return true; } + +VBoxMainHotplugWaiter::VBoxMainHotplugWaiter(char const*) {} + +com::Utf8Str HostUSBDevice::getName() +{ + return Utf8Str(); +} + +static USBDEVTREELOCATION s_deviceRoot = { "", false }; +static bool s_fGetDeviceRootPreferSysfs = false; + +PCUSBDEVTREELOCATION USBProxyLinuxGetDeviceRoot(bool fPreferSysfs) +{ + s_fGetDeviceRootPreferSysfs = fPreferSysfs; + return &s_deviceRoot; +} + +static struct +{ + const char *pcszDevicesRoot; + bool fUseSysfs; +} s_getDevices; + +PUSBDEVICE USBProxyLinuxGetDevices(const char *pcszDevicesRoot, + bool fUseSysfs) +{ + s_getDevices.pcszDevicesRoot = pcszDevicesRoot; + s_getDevices.fUseSysfs = fUseSysfs; + return NULL; +} + +void SysFreeString(BSTR bstr) +{ + Assert(0); +} + +/*** END STUBS ***/ + +class tstUSBProxyLinux : public USBProxyServiceLinux +{ +protected: + virtual int initUsbfs(void) { return VINF_SUCCESS; } + virtual int initSysfs(void) { return VINF_SUCCESS; } +public: + tstUSBProxyLinux(void) : USBProxyServiceLinux(NULL) {} + PUSBDEVICE getDevices(void) + { + return USBProxyServiceLinux::getDevices(); + } +}; + +static struct +{ + const char *pcszVBOX_USB; + const char *pcszVBOX_USB_ROOT; + const char *pcszReturnedRoot; + bool fReturnedUseSysfs; + bool fRequestedUseSysfs; + const char *pcszFinalRoot; + bool fFinalUseSysfs; +} s_testEnvironment[] = +{ + { "sysfs", "/dev/bus/usb", "/proc/bus/usb", false, true, "/dev/bus/usb", true }, + { "sysfs", "/dev/bus/usb", "/dev/vboxusb", true, true, "/dev/bus/usb", true }, + { "sysfs", NULL, "/proc/bus/usb", false, true, "/proc/bus/usb", false }, + { "sysfs", NULL, "/dev/vboxusb", true, true, "/dev/vboxusb", true }, + { "usbfs", "/dev/bus/usb", "/proc/bus/usb", false, false, "/dev/bus/usb", false }, + { "usbfs", "/dev/bus/usb", "/dev/vboxusb", true, false, "/dev/bus/usb", false }, + { "usbfs", NULL, "/proc/bus/usb", false, false, "/proc/bus/usb", false }, + { "usbfs", NULL, "/dev/vboxusb", true, false, "/dev/vboxusb", true }, + { "nofs", "/dev/bus/usb", "/proc/bus/usb", false, true, "/proc/bus/usb", false }, + { "nofs", "/dev/bus/usb", "/dev/vboxusb", true, true, "/dev/vboxusb", true }, + { "nofs", NULL, "/proc/bus/usb", false, true, "/proc/bus/usb", false }, + { "nofs", NULL, "/dev/vboxusb", true, true, "/dev/vboxusb", true }, + { "", "/dev/bus/usb", "/proc/bus/usb", false, true, "/proc/bus/usb", false }, + { "", "/dev/bus/usb", "/dev/vboxusb", true, true, "/dev/vboxusb", true }, + { "", NULL, "/proc/bus/usb", false, true, "/proc/bus/usb", false }, + { "", NULL, "/dev/vboxusb", true, true, "/dev/vboxusb", true }, + { NULL, "/dev/bus/usb", "/proc/bus/usb", false, true, "/proc/bus/usb", false }, + { NULL, "/dev/bus/usb", "/dev/vboxusb", true, true, "/dev/vboxusb", true } +}; + +/** @note Fiddling with the real environment for this is not nice, in my + * opinion at least. */ +static void testEnvironment(RTTEST hTest) +{ + RTTestSub(hTest, "Testing environment variable handling"); + for (unsigned i = 0; i < RT_ELEMENTS(s_testEnvironment); ++i) + { + tstUSBProxyLinux test; + if (s_testEnvironment[i].pcszVBOX_USB) + RTEnvSet("VBOX_USB", s_testEnvironment[i].pcszVBOX_USB); + else + RTEnvUnset("VBOX_USB"); + if (s_testEnvironment[i].pcszVBOX_USB_ROOT) + RTEnvSet("VBOX_USB_ROOT", + s_testEnvironment[i].pcszVBOX_USB_ROOT); + else + RTEnvUnset("VBOX_USB_ROOT"); + strcpy(s_deviceRoot.szDevicesRoot, + s_testEnvironment[i].pcszReturnedRoot); + s_deviceRoot.fUseSysfs = s_testEnvironment[i].fReturnedUseSysfs; + RTTESTI_CHECK(test.init() == S_OK); + test.getDevices(); + RTTESTI_CHECK_MSG(!strcmp(s_getDevices.pcszDevicesRoot, + s_testEnvironment[i].pcszFinalRoot), + ("i=%u: %s, %s\n", i, s_getDevices.pcszDevicesRoot, + s_testEnvironment[i].pcszFinalRoot)); + RTTESTI_CHECK_MSG( s_getDevices.fUseSysfs + == s_testEnvironment[i].fFinalUseSysfs, + ("i=%u, %d, %d\n", i, s_getDevices.fUseSysfs, + s_testEnvironment[i].fFinalUseSysfs)); + } +} + +int main(void) +{ + /* + * Init the runtime, test and say hello. + */ + RTTEST hTest; + RTEXITCODE rcExit = RTTestInitAndCreate("tstUSBProxyLinux", &hTest); + if (rcExit != RTEXITCODE_SUCCESS) + return rcExit; + RTTestBanner(hTest); + + /* + * Run the tests. + */ + testEnvironment(hTest); + + /* + * Summary + */ + return RTTestSummaryAndDestroy(hTest); +} + diff --git a/src/VBox/Main/webservice/Makefile.kmk b/src/VBox/Main/webservice/Makefile.kmk index ecb58d237..edebed2ab 100644 --- a/src/VBox/Main/webservice/Makefile.kmk +++ b/src/VBox/Main/webservice/Makefile.kmk @@ -297,7 +297,7 @@ endif vboxwebsrv_ORDERDEPS = $(VBOXWEB_OUT_DIR)/gsoap_copy_all_ts endif # !VBOX_ONLY_SDK -ifdef VBOX_WITH_JWS + ifdef VBOX_WITH_JWS INSTALLS += VBoxJWs-inst-jar # @@ -357,7 +357,7 @@ $$(VBOX_JWS_JAR): $(VBOX_JWS_GEN)/jwsglue.list $(VBOXWEB_WSDL) $(VBOXWEBSERVICE_ $(call MSG_LINK,$(notdir $@),$@) $(VBOX_JAR) cf $@ -C $(VBOX_JWS_JDEST) . -endif # VBOX_WITH_JWS + endif # VBOX_WITH_JWS ifndef VBOX_ONLY_SDK # @@ -421,7 +421,6 @@ ifdef VBOX_ONLY_SDK VBOXWEB_WS_PYTHON = $(VBOX_PATH_SDK)/bindings/webservice/python/lib/VirtualBox_services.py VBOXWEB_WS_PERL = $(VBOX_PATH_SDK)/bindings/webservice/perl/lib/vboxService.pm VBOXWEB_WS_PHP = $(VBOX_PATH_SDK)/bindings/webservice/php/lib/vboxServiceWrappers.php - VBOXWEB_SAMPLES_AXIS_DIR = $(VBOX_PATH_SDK)/bindings/webservice/java/axis/samples VBOXWEB_SAMPLES_JAXWS_DIR = $(VBOX_PATH_SDK)/bindings/webservice/java/jax-ws/samples VBOXWEB_JAXWSSAMPLE = $(VBOXWEB_SAMPLES_JAXWS_DIR)/clienttest.java VBOXWEB_METRICSAMPLE = $(VBOXWEB_SAMPLES_JAXWS_DIR)/metrictest.java @@ -432,10 +431,11 @@ ifdef VBOX_ONLY_SDK VBOXWEB_JAVA15_JAR = $(VBOXWEB_JAVALIB)/vboxws_java15.jar VBOXWEB_JAVA16_JAR = $(VBOXWEB_JAVALIB)/vboxws_java16.jar -define find_java_files - $(shell find $(1) -name \*.java) -endef + define find_java_files + $(shell find $(1) -name \*.java) + endef + ifdef VBOX_WITH_OLD_JWS VBOX_JAXWS_LIBDIR = $(VBOX_PATH_WEBSERVICE)/jaxlibs # well, not really good VBOX_JAVA15 = $(firstword $(wildcard \ @@ -443,9 +443,9 @@ endef /usr/jdk/jdk1.5*/bin/java \ /opt/sun-jdk-1.5*/bin/java \ /System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Commands/java)) - ifeq ($(strip $(VBOX_JAVA15)),) - $(error Failed to autodetect VBOX_JAVA15, please set it manually) - endif + ifeq ($(strip $(VBOX_JAVA15)),) + $(error Failed to autodetect VBOX_JAVA15, please set it manually) + endif VBOX_JAVA16 = java VBOX_JAVAC15 = javac -target 1.5 VBOX_JAVAC16 = javac -target 1.6 @@ -454,25 +454,27 @@ endef /usr/jdk/jdk1.6*/bin/wsimport \ /usr/bin/wsimport \ /opt/sun-jdk-1.6*/bin/wsimport)) - ifeq ($(strip $(VBOX_WSIMPORT16)),) - $(error Failed to autodetect VBOX_WSIMPORT16, please set it manually) - endif - - VBOXWEB_OTHERS += \ - $(VBOXWEB_GLUE_PYTHON) \ - $(VBOXWEB_WS_PYTHON) \ - $(VBOXWEB_WS_PERL) \ - $(VBOXWEB_WS_PHP) \ - $(VBOXWEB_PYTHONWSSAMPLE) - -ifdef VBOX_WITH_OLD_JWS + ifeq ($(strip $(VBOX_WSIMPORT16)),) + $(error Failed to autodetect VBOX_WSIMPORT16, please set it manually) + endif + endif # VBOX_WITH_OLD_JWS + + VBOXWEB_OTHERS += \ + $(VBOXWEB_GLUE_PYTHON) \ + $(VBOXWEB_WS_PYTHON) \ + $(VBOXWEB_WS_PERL) \ + $(VBOXWEB_WS_PHP) \ + $(VBOXWEB_PYTHONWSSAMPLE) \ + $(PATH_ROOT) + + ifdef VBOX_WITH_OLD_JWS VBOXWEB_OTHERS += \ $(VBOXWEB_GLUE_JAVA_TMP) \ $(VBOXWEB_JAXWSSAMPLE) \ $(VBOXWEB_METRICSAMPLE) \ $(VBOXWEB_JAVA15_JAR) \ $(VBOXWEB_JAVA16_JAR) -endif + endif # # Install sample code. @@ -481,13 +483,23 @@ endif vboxwebinst_INST = $(INST_SDK)bindings/webservice/ vboxwebinst_MODE = a+rx,u+w vboxwebinst_SOURCES = \ - samples/java/axis/clienttest.java=>java/axis/samples/clienttest.java \ - samples/java/jax-ws/Makefile.glue=>java/jax-ws/src/Makefile \ - samples/java/jax-ws/Makefile=>java/jax-ws/samples/Makefile \ samples/perl/clienttest.pl=>perl/samples/clienttest.pl \ - samples/php/clienttest.php=>php/samples/clienttest.php \ + samples/php/clienttest.php=>php/samples/clienttest.php + + INSTALLS += vboxwebinst_nox + vboxwebinst_nox_INST = $(INST_SDK)bindings/webservice/ + vboxwebinst_nox_MODE = a+r,u+w + vboxwebinst_nox_SOURCES = \ samples/python/Makefile=>python/samples/Makefile \ - samples/python/Makefile.glue=>python/lib/Makefile + samples/python/Makefile.glue=>python/lib/Makefile \ + $(PATH_ROOT)/COPYING.LIB=>java/jax-ws/COPYING.LIB + + ifdef VBOX_WITH_OLD_JWS + vboxwebinst_nox_SOURCES += \ + samples/java/axis/clienttest.java=>java/axis/samples/clienttest.java \ + samples/java/jax-ws/Makefile.glue=>java/jax-ws/src/Makefile \ + samples/java/jax-ws/Makefile=>java/jax-ws/samples/Makefile + endif endif # VBOX_ONLY_SDK diff --git a/src/VBox/Main/webservice/vboxweb.cpp b/src/VBox/Main/webservice/vboxweb.cpp index 1d001cc83..6302a5ed1 100644 --- a/src/VBox/Main/webservice/vboxweb.cpp +++ b/src/VBox/Main/webservice/vboxweb.cpp @@ -110,9 +110,10 @@ unsigned int g_uBacklog = 100; // backlog = max queue s unsigned int g_cMaxWorkerThreads = 100; // max. no. of worker threads unsigned int g_cMaxKeepAlive = 100; // maximum number of soap requests in one connection +uint32_t g_cHistory = 10; // enable log rotation, 10 files +uint32_t g_uHistoryFileTime = RT_SEC_1DAY; // max 1 day per file +uint64_t g_uHistoryFileSize = 100 * _1M; // max 100MB per file bool g_fVerbose = false; // be verbose -bool g_fStdOutLogging = true; // log to stdout -PRTSTREAM g_pStrmLog = NULL; #if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) || defined (RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) bool g_fDaemonize = false; // run in background. @@ -176,6 +177,9 @@ static const RTGETOPTDEF g_aOptions[] { "--verbose", 'v', RTGETOPT_REQ_NOTHING }, { "--pidfile", 'P', RTGETOPT_REQ_STRING }, { "--logfile", 'F', RTGETOPT_REQ_STRING }, + { "--logrotate", 'R', RTGETOPT_REQ_UINT32 }, + { "--logsize", 'S', RTGETOPT_REQ_UINT64 }, + { "--loginterval", 'I', RTGETOPT_REQ_UINT32 } }; void DisplayHelp() @@ -239,6 +243,18 @@ void DisplayHelp() case 'F': pcszDescr = "Name of file to write log to (no file)."; break; + + case 'R': + pcszDescr = "Number of log files (0 disables log rotation)."; + break; + + case 'S': + pcszDescr = "Maximum size of a log file to trigger rotation (bytes)."; + break; + + case 'I': + pcszDescr = "Maximum time interval to trigger log rotation (seconds)."; + break; } RTStrmPrintf(g_pStdErr, "%-23s%s\n", str.c_str(), pcszDescr); @@ -473,6 +489,10 @@ void SoapThread::process() cIdleThreads, cThreads); + // Ensure that we don't get stuck indefinitely for connections using + // keepalive, otherwise stale connections tie up worker threads. + m_soap->send_timeout = 60; + m_soap->recv_timeout = 60; // process the request; this goes into the COM code in methodmaps.cpp soap_serve(m_soap); @@ -571,47 +591,6 @@ void WebLog(const char *pszFormat, ...) RTStrAPrintfV(&psz, pszFormat, args); va_end(args); - if (g_fStdOutLogging || g_pStrmLog) - { - const char *pcszPrefix = "[ ]"; - util::AutoReadLock thrLock(g_pThreadsLockHandle COMMA_LOCKVAL_SRC_POS); - ThreadsMap::iterator it = g_mapThreads.find(RTThreadSelf()); - if (it != g_mapThreads.end()) - pcszPrefix = it->second.c_str(); - thrLock.release(); - - // make a timestamp - RTTIMESPEC ts; - RTTimeLocalNow(&ts); - RTTIME t; - RTTimeExplode(&t, &ts); - - com::Utf8StrFmt strPrefix("%04d-%02d-%02d %02d:%02d:%02d %s", - t.i32Year, t.u8Month, t.u8MonthDay, - t.u8Hour, t.u8Minute, t.u8Second, - pcszPrefix); - - // synchronize the actual output - util::AutoWriteLock logLock(g_pWebLogLockHandle COMMA_LOCKVAL_SRC_POS); - // terminal - if (g_fStdOutLogging) - RTPrintf("%s %s", strPrefix.c_str(), psz); - - // log file - if (g_pStrmLog) - { - RTStrmPrintf(g_pStrmLog, "%s %s", strPrefix.c_str(), psz); - RTStrmFlush(g_pStrmLog); - } - -#ifdef DEBUG - // debug logger instance - RTLogLoggerEx(LOG_INSTANCE, RTLOGGRPFLAGS_DJ, LOG_GROUP, "%s %s", pcszPrefix, psz); -#endif - - logLock.release(); - } - LogRel(("%s", psz)); RTStrFree(psz); @@ -636,6 +615,74 @@ void WebLogSoapError(struct soap *soap) (ppcszDetail && *ppcszDetail) ? *ppcszDetail : "no details available"); } +static void WebLogHeaderFooter(PRTLOGGER pLoggerRelease, RTLOGPHASE enmPhase, PFNRTLOGPHASEMSG pfnLog) +{ + /* some introductory information */ + static RTTIMESPEC timeSpec = {0}; + char szTmp[256]; + if (enmPhase == RTLOGPHASE_BEGIN) + RTTimeNow(&timeSpec); + RTTimeSpecToString(&timeSpec, szTmp, sizeof(szTmp)); + + switch (enmPhase) + { + case RTLOGPHASE_BEGIN: + { + pfnLog(pLoggerRelease, + "VirtualBox web service %s r%u %s (%s %s) release log\n" +#ifdef VBOX_BLEEDING_EDGE + "EXPERIMENTAL build " VBOX_BLEEDING_EDGE "\n" +#endif + "Log opened %s\n", + VBOX_VERSION_STRING, RTBldCfgRevision(), VBOX_BUILD_TARGET, + __DATE__, __TIME__, szTmp); + + int vrc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, sizeof(szTmp)); + if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) + pfnLog(pLoggerRelease, "OS Product: %s\n", szTmp); + vrc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szTmp, sizeof(szTmp)); + if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) + pfnLog(pLoggerRelease, "OS Release: %s\n", szTmp); + vrc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szTmp, sizeof(szTmp)); + if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) + pfnLog(pLoggerRelease, "OS Version: %s\n", szTmp); + if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) + pfnLog(pLoggerRelease, "OS Service Pack: %s\n", szTmp); + + /* the package type is interesting for Linux distributions */ + char szExecName[RTPATH_MAX]; + char *pszExecName = RTProcGetExecutablePath(szExecName, sizeof(szExecName)); + pfnLog(pLoggerRelease, + "Executable: %s\n" + "Process ID: %u\n" + "Package type: %s" +#ifdef VBOX_OSE + " (OSE)" +#endif + "\n", + pszExecName ? pszExecName : "unknown", + RTProcSelf(), + VBOX_PACKAGE_STRING); + break; + } + + case RTLOGPHASE_PREROTATE: + pfnLog(pLoggerRelease, "Log rotated - Log started %s\n", szTmp); + break; + + case RTLOGPHASE_POSTROTATE: + pfnLog(pLoggerRelease, "Log continuation - Log started %s\n", szTmp); + break; + + case RTLOGPHASE_END: + pfnLog(pLoggerRelease, "End of log file - Log started %s\n", szTmp); + break; + + default: + /* nothing */; + } +} + /**************************************************************************** * * SOAP queue pumper thread @@ -681,7 +728,7 @@ void doQueuesLoop() } // add the socket to the queue and tell worker threads to - // pick up the jobn + // pick up the job size_t cItemsOnQ = g_pSoapQ->add(s); WebLog("Request %llu on socket %d queued for processing (%d items on Q)\n", i, s, cItemsOnQ); } @@ -731,6 +778,7 @@ int main(int argc, char *argv[]) "All rights reserved.\n"); int c; + const char *pszLogFile = NULL; const char *pszPidFile = NULL; RTGETOPTUNION ValueUnion; RTGETOPTSTATE GetState; @@ -763,15 +811,20 @@ int main(int argc, char *argv[]) break; case 'F': - { - int rc2 = RTStrmOpen(ValueUnion.psz, "a", &g_pStrmLog); - if (rc2) - return RTMsgErrorExit(RTEXITCODE_FAILURE, "Cannot open log file \"%s\" for writing: %Rrc", ValueUnion.psz, rc2); + pszLogFile = ValueUnion.psz; + break; - WebLog(VBOX_PRODUCT " Webservice Version %s\n" - "Opened log file \"%s\"\n", VBOX_VERSION_STRING, ValueUnion.psz); + case 'R': + g_cHistory = ValueUnion.u32; + break; + + case 'S': + g_uHistoryFileSize = ValueUnion.u64; + break; + + case 'I': + g_uHistoryFileTime = ValueUnion.u32; break; - } case 'P': pszPidFile = ValueUnion.psz; @@ -808,6 +861,29 @@ int main(int argc, char *argv[]) } } + /* create release logger */ + PRTLOGGER pLoggerRelease; + static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES; + RTUINT fFlags = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG; +#if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2) + fFlags |= RTLOGFLAGS_USECRLF; +#endif + char szError[RTPATH_MAX + 128] = ""; + int vrc = RTLogCreateEx(&pLoggerRelease, fFlags, "all", + "VBOXWEBSRV_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, RTLOGDEST_STDOUT, + WebLogHeaderFooter, g_cHistory, g_uHistoryFileSize, g_uHistoryFileTime, + szError, sizeof(szError), pszLogFile); + if (RT_SUCCESS(vrc)) + { + /* register this logger as the release logger */ + RTLogRelSetDefaultInstance(pLoggerRelease); + + /* Explicitly flush the log in case of VBOXWEBSRV_RELEASE_LOG=buffered. */ + RTLogFlush(pLoggerRelease); + } + else + return RTMsgErrorExit(RTEXITCODE_FAILURE, "failed to open release log (%s, %Rrc)", szError, vrc); + #if defined(RT_OS_DARWIN) || defined(RT_OS_LINUX) || defined (RT_OS_SOLARIS) || defined(RT_OS_FREEBSD) if (g_fDaemonize) { @@ -825,70 +901,28 @@ int main(int argc, char *argv[]) if (RT_FAILURE(rc)) return RTMsgErrorExit(RTEXITCODE_FAILURE, "failed to daemonize, rc=%Rrc. exiting.", rc); - /* From now on it's a waste of CPU cycles to send logging to stdout. */ - g_fStdOutLogging = false; - /* create release logger */ - PRTLOGGER loggerRelease; - static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES; - RTUINT fFlags = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG; + PRTLOGGER pLoggerReleaseFile; + static const char * const s_apszGroupsFile[] = VBOX_LOGGROUP_NAMES; + RTUINT fFlagsFile = RTLOGFLAGS_PREFIX_THREAD | RTLOGFLAGS_PREFIX_TIME_PROG; #if defined(RT_OS_WINDOWS) || defined(RT_OS_OS2) - fFlags |= RTLOGFLAGS_USECRLF; + fFlagsFile |= RTLOGFLAGS_USECRLF; #endif - char szError[RTPATH_MAX + 128] = ""; - int vrc = RTLogCreateEx(&loggerRelease, fFlags, "all", - "VBOXWEBSRV_RELEASE_LOG", RT_ELEMENTS(s_apszGroups), s_apszGroups, - RTLOGDEST_FILE, szError, sizeof(szError), szLogFile); + char szErrorFile[RTPATH_MAX + 128] = ""; + int vrc = RTLogCreateEx(&pLoggerReleaseFile, fFlagsFile, "all", + "VBOXWEBSRV_RELEASE_LOG", RT_ELEMENTS(s_apszGroupsFile), s_apszGroupsFile, RTLOGDEST_FILE, + WebLogHeaderFooter, g_cHistory, g_uHistoryFileSize, g_uHistoryFileTime, + szErrorFile, sizeof(szErrorFile), szLogFile); if (RT_SUCCESS(vrc)) { - /* some introductory information */ - RTTIMESPEC timeSpec; - char szTmp[256]; - RTTimeSpecToString(RTTimeNow(&timeSpec), szTmp, sizeof(szTmp)); - RTLogRelLogger(loggerRelease, 0, ~0U, - "VirtualBox web service %s r%u %s (%s %s) release log\n" -#ifdef VBOX_BLEEDING_EDGE - "EXPERIMENTAL build " VBOX_BLEEDING_EDGE "\n" -#endif - "Log opened %s\n", - VBOX_VERSION_STRING, RTBldCfgRevision(), VBOX_BUILD_TARGET, - __DATE__, __TIME__, szTmp); - - vrc = RTSystemQueryOSInfo(RTSYSOSINFO_PRODUCT, szTmp, sizeof(szTmp)); - if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) - RTLogRelLogger(loggerRelease, 0, ~0U, "OS Product: %s\n", szTmp); - vrc = RTSystemQueryOSInfo(RTSYSOSINFO_RELEASE, szTmp, sizeof(szTmp)); - if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) - RTLogRelLogger(loggerRelease, 0, ~0U, "OS Release: %s\n", szTmp); - vrc = RTSystemQueryOSInfo(RTSYSOSINFO_VERSION, szTmp, sizeof(szTmp)); - if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) - RTLogRelLogger(loggerRelease, 0, ~0U, "OS Version: %s\n", szTmp); - if (RT_SUCCESS(vrc) || vrc == VERR_BUFFER_OVERFLOW) - RTLogRelLogger(loggerRelease, 0, ~0U, "OS Service Pack: %s\n", szTmp); - - /* the package type is interesting for Linux distributions */ - char szExecName[RTPATH_MAX]; - char *pszExecName = RTProcGetExecutablePath(szExecName, sizeof(szExecName)); - RTLogRelLogger(loggerRelease, 0, ~0U, - "Executable: %s\n" - "Process ID: %u\n" - "Package type: %s" -#ifdef VBOX_OSE - " (OSE)" -#endif - "\n", - pszExecName ? pszExecName : "unknown", - RTProcSelf(), - VBOX_PACKAGE_STRING); - /* register this logger as the release logger */ - RTLogRelSetDefaultInstance(loggerRelease); + RTLogRelSetDefaultInstance(pLoggerReleaseFile); /* Explicitly flush the log in case of VBOXWEBSRV_RELEASE_LOG=buffered. */ - RTLogFlush(loggerRelease); + RTLogFlush(pLoggerReleaseFile); } else - return RTMsgErrorExit(RTEXITCODE_FAILURE, "failed to open release log (%s, %Rrc)", szError, vrc); + return RTMsgErrorExit(RTEXITCODE_FAILURE, "failed to open release log (%s, %Rrc)", szErrorFile, vrc); } #endif diff --git a/src/VBox/Main/webservice/websrv-php.xsl b/src/VBox/Main/webservice/websrv-php.xsl index a595444ba..5338a1eca 100644 --- a/src/VBox/Main/webservice/websrv-php.xsl +++ b/src/VBox/Main/webservice/websrv-php.xsl @@ -141,7 +141,7 @@ public function <xsl:value-of select="$fname"/>($value) { $request = new stdClass(); $request->_this = $this->handle; - if (is_int($value) || is_string($value) || is_bool($value)) { + if (is_null($value) || is_scalar($value)) { $request-><xsl:value-of select="$attrname"/> = $value; } else @@ -344,6 +344,10 @@ class <xsl:value-of select="$ifname"/>Collection extends VBox_EnumCollection { } </xsl:template> +<xsl:template name="comResultCodes"> + const <xsl:value-of select="@name"/> = <xsl:value-of select="@value"/>; +</xsl:template> + <xsl:template match="/"> <xsl:text><?php @@ -566,6 +570,19 @@ abstract class VBox_EnumCollection extends VBox_Collection { } </xsl:text> + +<xsl:text> +/** +* VirtualBox COM result codes +*/ +class VirtualBox_COM_result_codes { +</xsl:text> + <xsl:for-each select="/idl/library/result"> + <xsl:call-template name="comResultCodes"/> + </xsl:for-each> +<xsl:text> +} +</xsl:text> <xsl:for-each select="//interface[@wsmap='managed' or @wsmap='global']"> <xsl:call-template name="interface"/> <xsl:call-template name="collection"/> diff --git a/src/VBox/Main/xml/Settings.cpp b/src/VBox/Main/xml/Settings.cpp index 715c2908e..5fab71d07 100644 --- a/src/VBox/Main/xml/Settings.cpp +++ b/src/VBox/Main/xml/Settings.cpp @@ -51,7 +51,7 @@ */ /* - * Copyright (C) 2007-2010 Oracle Corporation + * Copyright (C) 2007-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -449,13 +449,9 @@ com::Utf8Str ConfigFileBase::makeString(const RTTIMESPEC &stamp) if (!RTTimeExplode(&time, &stamp)) throw ConfigFileError(this, NULL, N_("Timespec %lld ms is invalid"), RTTimeSpecGetMilli(&stamp)); - return Utf8StrFmt("%04ld-%02hd-%02hdT%02hd:%02hd:%02hdZ", - time.i32Year, - (uint16_t)time.u8Month, - (uint16_t)time.u8MonthDay, - (uint16_t)time.u8Hour, - (uint16_t)time.u8Minute, - (uint16_t)time.u8Second); + return Utf8StrFmt("%04u-%02u-%02uT%02u:%02u:%02uZ", + time.i32Year, time.u8Month, time.u8MonthDay, + time.u8Hour, time.u8Minute, time.u8Second); } /** @@ -695,6 +691,11 @@ void ConfigFileBase::readMedium(MediaType t, // DVD and floppy images before 1.11 had no format attribute. assign the default. med.strFormat = "RAW"; } + + if (t == DVDImage) + med.hdType = MediumType_Readonly; + else if (t == FloppyImage) + med.hdType = MediumType_Writethrough; } if (fNeedsLocation) @@ -821,7 +822,7 @@ void ConfigFileBase::setVersionAttribute(xml::ElementNode &elm) // can be set if this code runs on XML files that were created by a future version of VBox; // in that case, downgrade to current version when writing since we can't write future versions... pcszVersion = "1.11"; - m->sv = SettingsVersion_v1_10; + m->sv = SettingsVersion_v1_11; break; default: @@ -856,7 +857,13 @@ void ConfigFileBase::createStubDocument() Assert(m->pDoc == NULL); m->pDoc = new xml::Document; - m->pelmRoot = m->pDoc->createRootElement("VirtualBox"); + m->pelmRoot = m->pDoc->createRootElement("VirtualBox", + "\n" + "** DO NOT EDIT THIS FILE.\n" + "** If you make changes to this file while any VirtualBox related application\n" + "** is running, your changes will be overwritten later, without taking effect.\n" + "** Use VBoxManage or the VirtualBox Manager GUI to make changes.\n" +); m->pelmRoot->setAttribute("xmlns", VBOX_XML_NAMESPACE); // add settings version attribute to root element @@ -1010,7 +1017,8 @@ void ConfigFileBase::buildMedium(xml::ElementNode &elmMedium, if (devType == DeviceType_HardDisk || RTStrICmp(mdm.strFormat.c_str(), "RAW")) pelmMedium->setAttribute("format", mdm.strFormat); - if (mdm.fAutoReset) + if ( devType == DeviceType_HardDisk + && mdm.fAutoReset) pelmMedium->setAttribute("autoReset", mdm.fAutoReset); if (mdm.strDescription.length()) pelmMedium->setAttribute("Description", mdm.strDescription); @@ -1027,21 +1035,23 @@ void ConfigFileBase::buildMedium(xml::ElementNode &elmMedium, // only for base hard disks, save the type if (level == 0) { - const char *pcszType = - mdm.hdType == MediumType_Normal ? "Normal" : - mdm.hdType == MediumType_Immutable ? "Immutable" : - mdm.hdType == MediumType_Writethrough ? "Writethrough" : - mdm.hdType == MediumType_Shareable ? "Shareable" : - mdm.hdType == MediumType_Readonly ? "Readonly" : - mdm.hdType == MediumType_MultiAttach ? "MultiAttach" : - "INVALID"; // no need to save the usual DVD/floppy medium types if ( ( devType != DeviceType_DVD || ( mdm.hdType != MediumType_Writethrough // shouldn't happen && mdm.hdType != MediumType_Readonly)) && ( devType != DeviceType_Floppy || mdm.hdType != MediumType_Writethrough)) + { + const char *pcszType = + mdm.hdType == MediumType_Normal ? "Normal" : + mdm.hdType == MediumType_Immutable ? "Immutable" : + mdm.hdType == MediumType_Writethrough ? "Writethrough" : + mdm.hdType == MediumType_Shareable ? "Shareable" : + mdm.hdType == MediumType_Readonly ? "Readonly" : + mdm.hdType == MediumType_MultiAttach ? "MultiAttach" : + "INVALID"; pelmMedium->setAttribute("type", pcszType); + } } for (MediaList::const_iterator it = mdm.llChildren.begin(); @@ -4626,7 +4636,8 @@ void MachineConfigFile::bumpSettingsVersionIfNeeded() } // VirtualBox 3.2 adds NAT and boot priority to the NIC config in Main - if (m->sv < SettingsVersion_v1_10) + // VirtualBox 4.0 adds network bandwitdth + if (m->sv < SettingsVersion_v1_11) { NetworkAdaptersList::const_iterator netit; for (netit = hardwareMachine.llNetworkAdapters.begin(); diff --git a/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp b/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp index d234e0204..6a7c24dea 100644 --- a/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp +++ b/src/VBox/NetworkServices/DHCP/VBoxNetDHCP.cpp @@ -974,7 +974,7 @@ int VBoxNetDhcp::run(void) int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_WAIT, 0, &WaitReq.Hdr); if (RT_FAILURE(rc)) { - if (rc == VERR_TIMEOUT) + if (rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED) continue; RTStrmPrintf(g_pStdErr, "VBoxNetDHCP: VMMR0_DO_INTNET_IF_WAIT returned %Rrc\n", rc); return 1; diff --git a/src/VBox/NetworkServices/NAT/VBoxNetNAT.cpp b/src/VBox/NetworkServices/NAT/VBoxNetNAT.cpp index 55cde8da3..b35a40a85 100644 --- a/src/VBox/NetworkServices/NAT/VBoxNetNAT.cpp +++ b/src/VBox/NetworkServices/NAT/VBoxNetNAT.cpp @@ -227,7 +227,7 @@ void VBoxNetNAT::run() int rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_INTNET_IF_WAIT, 0, &WaitReq.Hdr); if (RT_FAILURE(rc)) { - if (rc == VERR_TIMEOUT) + if (rc == VERR_TIMEOUT || rc == VERR_INTERRUPTED) continue; LogRel(("VBoxNetNAT: VMMR0_DO_INTNET_IF_WAIT returned %Rrc\n", rc)); return; diff --git a/src/VBox/RDP/client/vrdp/rdpusb.c b/src/VBox/RDP/client/vrdp/rdpusb.c index 09bcded14..cf7b47c3f 100644 --- a/src/VBox/RDP/client/vrdp/rdpusb.c +++ b/src/VBox/RDP/client/vrdp/rdpusb.c @@ -17,7 +17,15 @@ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. */ +/* DEBUG is defined in ../rdesktop.h */ +#ifdef DEBUG +# define VBOX_DEBUG DEBUG +#endif #include "../rdesktop.h" +#undef DEBUG +#ifdef VBOX_DEBUG +# define DEBUG VBOX_DEBUG +#endif #include "vrdpusb.h" #include "USBProxyDevice.h" @@ -220,7 +228,8 @@ static void fillWireListEntry(char *pBuf, PUSBDEVICE pDevice, /** Allocate (and return) a buffer for a device list in VRDP wire format, * and populate from a PUSBDEVICE linked list. @a pLen takes the length of - * the new list. */ + * the new list. + * See @a Console::processRemoteUSBDevices for the receiving end. */ static void *buildWireListFromDevices(PUSBDEVICE pDevices, int *pLen) { char *pBuf; @@ -237,8 +246,8 @@ static void *buildWireListFromDevices(PUSBDEVICE pDevices, int *pLen) { unsigned i, cZeros; - AssertReturnVoidStmt(iCurrent + DEV_ENTRY_SIZE + 2 <= cbBuf, - free(pBuf)); + AssertReturnStmt(iCurrent + DEV_ENTRY_SIZE + 2 <= cbBuf, + free(pBuf), NULL); fillWireListEntry(pBuf + iCurrent, pCurrent, &iNext); DevListEntry *pEntry = (DevListEntry *)(pBuf + iCurrent); /* Sanity tests */ @@ -246,21 +255,12 @@ static void *buildWireListFromDevices(PUSBDEVICE pDevices, int *pLen) i < iCurrent + iNext; ++i) if (pBuf[i] == 0) ++cZeros; - AssertReturnVoidStmt(cZeros == RT_BOOL(pEntry->oManufacturer) - + RT_BOOL(pEntry->oProduct) - + RT_BOOL(pEntry->oSerialNumber), - free(pBuf)); - AssertReturnVoidStmt( pEntry->oManufacturer == 0 - || pBuf[pEntry->oManufacturer] != '\0', - free(pBuf)); - AssertReturnVoidStmt( pEntry->oProduct == 0 - || pBuf[pEntry->oProduct] != '\0', - free(pBuf)); - AssertReturnVoidStmt( pEntry->oSerialNumber == 0 - || pBuf[pEntry->oSerialNumber] != '\0', - free(pBuf)); - AssertReturnVoidStmt(cZeros == 0 || pBuf[iCurrent + iNext - 1] == '\0', - free(pBuf)); + AssertReturnStmt(cZeros == RT_BOOL(pEntry->oManufacturer) + + RT_BOOL(pEntry->oProduct) + + RT_BOOL(pEntry->oSerialNumber), + free(pBuf), NULL); + AssertReturnStmt(cZeros == 0 || pBuf[iCurrent + iNext - 1] == '\0', + free(pBuf), NULL); } *pLen = iCurrent + iNext + 2; Assert(cDevs == 0); diff --git a/src/VBox/Resources/OSE/virtualbox-128px.png b/src/VBox/Resources/OSE/virtualbox-128px.png Binary files differnew file mode 100644 index 000000000..079e145dd --- /dev/null +++ b/src/VBox/Resources/OSE/virtualbox-128px.png diff --git a/src/VBox/Resources/OSE/virtualbox-16px.png b/src/VBox/Resources/OSE/virtualbox-16px.png Binary files differnew file mode 100644 index 000000000..51c3aa57c --- /dev/null +++ b/src/VBox/Resources/OSE/virtualbox-16px.png diff --git a/src/VBox/Resources/OSE/virtualbox-20px.png b/src/VBox/Resources/OSE/virtualbox-20px.png Binary files differnew file mode 100644 index 000000000..5136dc9b3 --- /dev/null +++ b/src/VBox/Resources/OSE/virtualbox-20px.png diff --git a/src/VBox/Resources/OSE/virtualbox-32px.png b/src/VBox/Resources/OSE/virtualbox-32px.png Binary files differnew file mode 100644 index 000000000..978eeb625 --- /dev/null +++ b/src/VBox/Resources/OSE/virtualbox-32px.png diff --git a/src/VBox/Resources/OSE/virtualbox-40px.png b/src/VBox/Resources/OSE/virtualbox-40px.png Binary files differnew file mode 100644 index 000000000..e678c64ee --- /dev/null +++ b/src/VBox/Resources/OSE/virtualbox-40px.png diff --git a/src/VBox/Resources/OSE/virtualbox-48px.png b/src/VBox/Resources/OSE/virtualbox-48px.png Binary files differnew file mode 100644 index 000000000..26ac8218e --- /dev/null +++ b/src/VBox/Resources/OSE/virtualbox-48px.png diff --git a/src/VBox/Resources/OSE/virtualbox-64px.png b/src/VBox/Resources/OSE/virtualbox-64px.png Binary files differnew file mode 100644 index 000000000..59c45a6bd --- /dev/null +++ b/src/VBox/Resources/OSE/virtualbox-64px.png diff --git a/src/VBox/Runtime/Makefile.kmk b/src/VBox/Runtime/Makefile.kmk index be457966a..33a535ff6 100644 --- a/src/VBox/Runtime/Makefile.kmk +++ b/src/VBox/Runtime/Makefile.kmk @@ -4,7 +4,7 @@ # # -# Copyright (C) 2006-2010 Oracle Corporation +# Copyright (C) 2006-2011 Oracle Corporation # # This file is part of VirtualBox Open Source Edition (OSE), as # available from http://www.virtualbox.org. This file is free software; @@ -351,10 +351,14 @@ RuntimeR3_SOURCES = \ common/sort/shellsort.cpp \ common/string/RTStrCat.cpp \ common/string/RTStrCatEx.cpp \ + common/string/RTStrCatP.cpp \ + common/string/RTStrCatPEx.cpp \ common/string/RTStrCmp.cpp \ common/string/RTStrConvertHexBytes.cpp \ common/string/RTStrCopy.cpp \ common/string/RTStrCopyEx.cpp \ + common/string/RTStrCopyP.cpp \ + common/string/RTStrCopyPEx.cpp \ common/string/RTStrNCmp.cpp \ common/string/RTStrNLen.cpp \ common/string/RTStrNLenEx.cpp \ @@ -1071,9 +1075,13 @@ RuntimeGuestR3Mini_SOURCES = \ common/path/RTPathStripTrailingSlash.cpp \ common/string/RTStrCat.cpp \ common/string/RTStrCatEx.cpp \ + common/string/RTStrCatP.cpp \ + common/string/RTStrCatPEx.cpp \ common/string/RTStrCmp.cpp \ common/string/RTStrCopy.cpp \ common/string/RTStrCopyEx.cpp \ + common/string/RTStrCopyP.cpp \ + common/string/RTStrCopyPEx.cpp \ common/string/RTStrNCmp.cpp \ common/string/RTStrNLen.cpp \ common/string/RTStrNLenEx.cpp \ @@ -1412,8 +1420,12 @@ RuntimeR0_SOURCES = \ common/string/strpbrk.cpp \ common/string/RTStrCat.cpp \ common/string/RTStrCatEx.cpp \ + common/string/RTStrCatP.cpp \ + common/string/RTStrCatPEx.cpp \ common/string/RTStrCopy.cpp \ common/string/RTStrCopyEx.cpp \ + common/string/RTStrCopyP.cpp \ + common/string/RTStrCopyPEx.cpp \ common/string/RTStrNLen.cpp \ common/string/RTStrNLenEx.cpp \ common/table/avlgcptr.cpp \ @@ -1550,9 +1562,13 @@ RuntimeR0Drv_SOURCES = \ common/rand/randparkmiller.cpp \ common/string/RTStrCat.cpp \ common/string/RTStrCatEx.cpp \ + common/string/RTStrCatP.cpp \ + common/string/RTStrCatPEx.cpp \ common/string/RTStrCmp.cpp \ common/string/RTStrCopy.cpp \ common/string/RTStrCopyEx.cpp \ + common/string/RTStrCopyP.cpp \ + common/string/RTStrCopyPEx.cpp \ common/string/RTStrNCmp.cpp \ common/string/RTStrNLen.cpp \ common/string/RTStrNLenEx.cpp \ diff --git a/src/VBox/Runtime/VBox/log-vbox.cpp b/src/VBox/Runtime/VBox/log-vbox.cpp index ddb4a2e12..ab9007023 100644 --- a/src/VBox/Runtime/VBox/log-vbox.cpp +++ b/src/VBox/Runtime/VBox/log-vbox.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2009 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -411,9 +411,7 @@ RTDECL(PRTLOGGER) RTLogDefaultInit(void) # else /* IN_GUEST */ /* The user destination is backdoor logging. */ - rc = RTLogCreate(&pLogger, 0, NULL, "VBOX_LOG", - RT_ELEMENTS(g_apszGroups), &g_apszGroups[0], - RTLOGDEST_USER, "VBox.log"); + rc = RTLogCreate(&pLogger, 0, NULL, "VBOX_LOG", RT_ELEMENTS(g_apszGroups), &g_apszGroups[0], RTLOGDEST_USER, "VBox.log"); # endif /* IN_GUEST */ #else /* IN_RING0 */ diff --git a/src/VBox/Runtime/VBox/logbackdoor-redirect.cpp b/src/VBox/Runtime/VBox/logbackdoor-redirect.cpp index 9f1eed063..637c4005d 100644 --- a/src/VBox/Runtime/VBox/logbackdoor-redirect.cpp +++ b/src/VBox/Runtime/VBox/logbackdoor-redirect.cpp @@ -6,7 +6,7 @@ */ /* - * Copyright (C) 2007 Oracle Corporation + * Copyright (C) 2007-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/Runtime/common/alloc/alloc.cpp b/src/VBox/Runtime/common/alloc/alloc.cpp index 657f5c737..e4e52c311 100644 --- a/src/VBox/Runtime/common/alloc/alloc.cpp +++ b/src/VBox/Runtime/common/alloc/alloc.cpp @@ -28,17 +28,13 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTMEM_NO_WRAP_TO_EF_APIS #include <iprt/mem.h> #include "internal/iprt.h" #include <iprt/assert.h> #include <iprt/string.h> -#undef RTMemDup -#undef RTMemDupTag -#undef RTMemDupEx -#undef RTMemDupExTag - RTDECL(void *) RTMemDupTag(const void *pvSrc, size_t cb, const char *pszTag) RT_NO_THROW diff --git a/src/VBox/Runtime/common/log/log.cpp b/src/VBox/Runtime/common/log/log.cpp index d53f11728..fe2ffa4b0 100644 --- a/src/VBox/Runtime/common/log/log.cpp +++ b/src/VBox/Runtime/common/log/log.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -78,6 +78,35 @@ typedef struct RTLOGOUTPUTPREFIXEDARGS unsigned iGroup; } RTLOGOUTPUTPREFIXEDARGS, *PRTLOGOUTPUTPREFIXEDARGS; +#ifdef IN_RING3 +/** + * File logging bits for the logger. + */ +typedef struct RTLOGGERFILE +{ + /** Pointer to the function called when starting logging, and when + * ending or starting a new log file as part of history rotation. + * This can be NULL. */ + PFNRTLOGPHASE pfnPhase; + /** Handle to log file (if open). */ + RTFILE File; + /** Pointer to filename. + * (The memory is allocated in the same block as RTLOGGER.) */ + char *pszFilename; + /** Log file history settings: number of older files to keep. + * 0 means no history. */ + uint32_t cHistory; + /** Log file history settings: maximum amount of data to put in a file. */ + uint64_t cbHistoryFileMax; + /** Log file history settings: current amount of data in a file. */ + uint64_t cbHistoryFileWritten; + /** Log file history settings: maximum time to use a file (in seconds). */ + uint32_t cSecsHistoryTimeSlot; + /** Log file history settings: in what time slot was the file created. */ + uint32_t uHistoryTimeSlotStart; +} RTLOGGERFILE; +#endif /* IN_RING3 */ + /******************************************************************************* * Internal Functions * @@ -88,9 +117,14 @@ static unsigned rtlogGroupFlags(const char *psz); #ifdef IN_RING0 static void rtR0LogLoggerExFallback(uint32_t fDestFlags, uint32_t fFlags, const char *pszFormat, va_list va); #endif +#ifdef IN_RING3 +static int rtlogFileOpen(PRTLOGGER pLogger, char *pszErrorMsg, size_t cchErrorMsg); +static void rtlogRotate(PRTLOGGER pLogger, uint32_t uTimeSlot, bool fFirst); +#endif static void rtlogFlush(PRTLOGGER pLogger); static DECLCALLBACK(size_t) rtLogOutput(void *pv, const char *pachChars, size_t cbChars); static DECLCALLBACK(size_t) rtLogOutputPrefixed(void *pv, const char *pachChars, size_t cbChars); +static void rtlogLoggerExVLocked(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args); /******************************************************************************* @@ -122,7 +156,8 @@ static struct RTLOGGERPERTHREAD /** The logger instance.*/ PRTLOGGER volatile pLogger; } g_aPerThreadLoggers[8] = -{ { NIL_RTNATIVETHREAD, 0, 0}, +{ + { NIL_RTNATIVETHREAD, 0, 0}, { NIL_RTNATIVETHREAD, 0, 0}, { NIL_RTNATIVETHREAD, 0, 0}, { NIL_RTNATIVETHREAD, 0, 0}, @@ -142,8 +177,7 @@ static struct size_t cchInstr; /**< The size of the name. */ uint32_t fFlag; /**< The flag value. */ bool fInverted; /**< Inverse meaning? */ -} -const s_aLogFlags[] = +} const s_aLogFlags[] = { { "disabled", sizeof("disabled" ) - 1, RTLOGFLAGS_DISABLED, false }, { "enabled", sizeof("enabled" ) - 1, RTLOGFLAGS_DISABLED, true }, @@ -189,6 +223,9 @@ static struct { { "file", sizeof("file" ) - 1, RTLOGDEST_FILE }, /* Must be 1st! */ { "dir", sizeof("dir" ) - 1, RTLOGDEST_FILE }, /* Must be 2nd! */ + { "history", sizeof("history" ) - 1, 0 }, /* Must be 3rd! */ + { "histsize", sizeof("histsize") - 1, 0 }, /* Must be 4th! */ + { "histtime", sizeof("histtime") - 1, 0 }, /* Must be 5th! */ { "stdout", sizeof("stdout" ) - 1, RTLOGDEST_STDOUT }, { "stderr", sizeof("stderr" ) - 1, RTLOGDEST_STDERR }, { "debugger", sizeof("debugger") - 1, RTLOGDEST_DEBUGGER }, @@ -224,35 +261,104 @@ DECLINLINE(int) rtlogLock(PRTLOGGER pLogger) DECLINLINE(void) rtlogUnlock(PRTLOGGER pLogger) { #ifndef IN_RC - if (pLogger->hSpinMtx != NIL_RTSEMFASTMUTEX) + if (pLogger->hSpinMtx != NIL_RTSEMSPINMUTEX) RTSemSpinMutexRelease(pLogger->hSpinMtx); #endif return; } - #ifndef IN_RC +# ifdef IN_RING3 + /** - * Create a logger instance, comprehensive version. + * Logging to file, output callback. * - * @returns iprt status code. + * @param pvArg User argument. + * @param pachChars Pointer to an array of utf-8 characters. + * @param cbChars Number of bytes in the character array pointed to by pachChars. + */ +static DECLCALLBACK(size_t) rtlogPhaseWrite(void *pvArg, const char *pachChars, size_t cbChars) +{ + PRTLOGGER pLogger = (PRTLOGGER)pvArg; + RTFileWrite(pLogger->pFile->File, pachChars, cbChars, NULL); + return cbChars; +} + + +/** + * Callback to format VBox formatting extentions. + * See @ref pg_rt_str_format for a reference on the format types. * - * @param ppLogger Where to store the logger instance. - * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values. - * @param pszGroupSettings The initial group settings. - * @param pszEnvVarBase Base name for the environment variables for this instance. - * @param cGroups Number of groups in the array. - * @param papszGroups Pointer to array of groups. This must stick around for the life of the - * logger instance. - * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed if pszFilenameFmt specified. - * @param pszErrorMsg A buffer which is filled with an error message if something fails. May be NULL. - * @param cchErrorMsg The size of the error message buffer. - * @param pszFilenameFmt Log filename format string. Standard RTStrFormat(). - * @param ... Format arguments. + * @returns The number of bytes formatted. + * @param pvArg Formatter argument. + * @param pfnOutput Pointer to output function. + * @param pvArgOutput Argument for the output function. + * @param ppszFormat Pointer to the format string pointer. Advance this till the char + * after the format specifier. + * @param pArgs Pointer to the argument list. Use this to fetch the arguments. + * @param cchWidth Format Width. -1 if not specified. + * @param cchPrecision Format Precision. -1 if not specified. + * @param fFlags Flags (RTSTR_NTFS_*). + * @param chArgSize The argument size specifier, 'l' or 'L'. */ +static DECLCALLBACK(size_t) rtlogPhaseFormatStr(void *pvArg, PFNRTSTROUTPUT pfnOutput, void *pvArgOutput, + const char **ppszFormat, va_list *pArgs, int cchWidth, + int cchPrecision, unsigned fFlags, char chArgSize) +{ + char ch = *(*ppszFormat)++; + + AssertMsgFailed(("Invalid logger phase format type '%%%c%.10s'!\n", ch, *ppszFormat)); NOREF(ch); + + return 0; +} + + +/** + * Log phase callback function, assumes the lock is already held + * + * @param pLogger The logger instance. + * @param pszFormat Format string. + * @param ... Optional arguments as specified in the format string. + */ +static DECLCALLBACK(void) rtlogPhaseMsgLocked(PRTLOGGER pLogger, const char *pszFormat, ...) +{ + va_list args; + AssertPtrReturnVoid(pLogger); + AssertPtrReturnVoid(pLogger->pFile); + Assert(pLogger->hSpinMtx != NIL_RTSEMSPINMUTEX); + + va_start(args, pszFormat); + rtlogLoggerExVLocked(pLogger, 0, ~0, pszFormat, args); + va_end(args); +} + + +/** + * Log phase callback function, assumes the lock is not held. + * + * @param pLogger The logger instance. + * @param pszFormat Format string. + * @param ... Optional arguments as specified in the format string. + */ +static DECLCALLBACK(void) rtlogPhaseMsgNormal(PRTLOGGER pLogger, const char *pszFormat, ...) +{ + va_list args; + AssertPtrReturnVoid(pLogger); + AssertPtrReturnVoid(pLogger->pFile); + Assert(pLogger->hSpinMtx != NIL_RTSEMSPINMUTEX); + + va_start(args, pszFormat); + RTLogLoggerExV(pLogger, 0, ~0, pszFormat, args); + va_end(args); +} + +# endif /* IN_RING3 */ + RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings, const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups, - uint32_t fDestFlags, char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, va_list args) + uint32_t fDestFlags, PFNRTLOGPHASE pfnPhase, uint32_t cHistory, + uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot, + char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, va_list args) { int rc; size_t cb; @@ -262,8 +368,7 @@ RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *psz * Validate input. */ if ( (cGroups && !papszGroups) - || !VALID_PTR(ppLogger) - ) + || !VALID_PTR(ppLogger) ) { AssertMsgFailed(("Invalid parameters!\n")); return VERR_INVALID_PARAMETER; @@ -273,10 +378,15 @@ RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *psz if (pszErrorMsg) RTStrPrintf(pszErrorMsg, cchErrorMsg, N_("unknown error")); + AssertMsgReturn(cHistory < _1M, ("%#x", cHistory), VERR_OUT_OF_RANGE); + /* * Allocate a logger instance. */ cb = RT_OFFSETOF(RTLOGGER, afGroups[cGroups + 1]) + RTPATH_MAX; +#ifdef IN_RING3 + cb += sizeof(RTLOGGERFILE); +#endif pLogger = (PRTLOGGER)RTMemAllocZVar(cb); if (pLogger) { @@ -288,8 +398,23 @@ RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *psz pLogger->papszGroups = papszGroups; pLogger->cMaxGroups = cGroups; pLogger->cGroups = cGroups; - pLogger->pszFilename = (char *)&pLogger->afGroups[cGroups + 1]; - pLogger->File = NIL_RTFILE; +#ifdef IN_RING3 + pLogger->pFile = (PRTLOGGERFILE)((char *)&pLogger->afGroups[cGroups + 1] + RTPATH_MAX); + pLogger->pFile->File = NIL_RTFILE; + pLogger->pFile->pszFilename = (char *)&pLogger->afGroups[cGroups + 1]; + pLogger->pFile->pfnPhase = pfnPhase; + pLogger->pFile->cHistory = cHistory; + if (cbHistoryFileMax == 0) + pLogger->pFile->cbHistoryFileMax = UINT64_MAX; + else + pLogger->pFile->cbHistoryFileMax = cbHistoryFileMax; + if (cSecsHistoryTimeSlot == 0) + pLogger->pFile->cSecsHistoryTimeSlot = UINT32_MAX; + else + pLogger->pFile->cSecsHistoryTimeSlot = cSecsHistoryTimeSlot; +#else /* !IN_RING3 */ + pLogger->pFile = NULL; +#endif /* !IN_RING3 */ pLogger->fFlags = fFlags; pLogger->fDestFlags = fDestFlags; pLogger->fPendingPrefix = true; @@ -336,7 +461,8 @@ RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *psz */ if (pszFilenameFmt) { - RTStrPrintfV(pLogger->pszFilename, RTPATH_MAX, pszFilenameFmt, args); + /** @todo validate the length, fail on overflow. */ + RTStrPrintfV(pLogger->pFile->pszFilename, RTPATH_MAX, pszFilenameFmt, args); pLogger->fDestFlags |= RTLOGDEST_FILE; } @@ -383,16 +509,27 @@ RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *psz #ifdef IN_RING3 if (pLogger->fDestFlags & RTLOGDEST_FILE) { - uint32_t fOpen = RTFILE_O_WRITE | RTFILE_O_DENY_WRITE; if (pLogger->fFlags & RTLOGFLAGS_APPEND) - fOpen |= RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND; + { + rc = rtlogFileOpen(pLogger, pszErrorMsg, cchErrorMsg); + + /* Rotate in case of appending to a too big log file, + otherwise this simply doesn't do anything. */ + rtlogRotate(pLogger, 0, true /* fFirst */); + } else - fOpen |= RTFILE_O_CREATE_REPLACE; - if (pLogger->fFlags & RTLOGFLAGS_WRITE_THROUGH) - fOpen |= RTFILE_O_WRITE_THROUGH; - rc = RTFileOpen(&pLogger->File, pLogger->pszFilename, fOpen); - if (RT_FAILURE(rc) && pszErrorMsg) - RTStrPrintf(pszErrorMsg, cchErrorMsg, N_("could not open file '%s' (fOpen=%#x)"), pLogger->pszFilename, fOpen); + { + /* Force rotation if it is configured. */ + pLogger->pFile->cbHistoryFileWritten = UINT64_MAX; + rtlogRotate(pLogger, 0, true /* fFirst */); + + /* If the file is not open then rotation is not set up. */ + if (pLogger->pFile->File == NIL_RTFILE) + { + pLogger->pFile->cbHistoryFileWritten = 0; + rc = rtlogFileOpen(pLogger, pszErrorMsg, cchErrorMsg); + } + } } #endif /* IN_RING3 */ @@ -415,6 +552,11 @@ RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *psz RTSemSpinMutexRelease(pLogger->hSpinMtx); ASMAtomicWriteU32(&g_cLoggerLockCount, c); } + + /* Use the callback to generate some initial log contents. */ + Assert(VALID_PTR(pLogger->pFile->pfnPhase) || pLogger->pFile->pfnPhase == NULL); + if (pLogger->pFile->pfnPhase) + pLogger->pFile->pfnPhase(pLogger, RTLOGPHASE_BEGIN, rtlogPhaseMsgNormal); #endif *ppLogger = pLogger; return VINF_SUCCESS; @@ -424,7 +566,7 @@ RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *psz RTStrPrintf(pszErrorMsg, cchErrorMsg, N_("failed to create semaphore")); } #ifdef IN_RING3 - RTFileClose(pLogger->File); + RTFileClose(pLogger->pFile->File); #endif #if defined(LOG_USE_C99) && defined(RT_WITHOUT_EXEC_ALLOC) RTMemFree(*(void **)&pLogger->pfnLogger); @@ -442,22 +584,6 @@ RTDECL(int) RTLogCreateExV(PRTLOGGER *ppLogger, uint32_t fFlags, const char *psz RT_EXPORT_SYMBOL(RTLogCreateExV); -/** - * Create a logger instance. - * - * @returns iprt status code. - * - * @param ppLogger Where to store the logger instance. - * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values. - * @param pszGroupSettings The initial group settings. - * @param pszEnvVarBase Base name for the environment variables for this instance. - * @param cGroups Number of groups in the array. - * @param papszGroups Pointer to array of groups. This must stick around for the life of the - * logger instance. - * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed if pszFilenameFmt specified. - * @param pszFilenameFmt Log filename format string. Standard RTStrFormat(). - * @param ... Format arguments. - */ RTDECL(int) RTLogCreate(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings, const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups, uint32_t fDestFlags, const char *pszFilenameFmt, ...) @@ -466,40 +592,28 @@ RTDECL(int) RTLogCreate(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGro int rc; va_start(args, pszFilenameFmt); - rc = RTLogCreateExV(ppLogger, fFlags, pszGroupSettings, pszEnvVarBase, cGroups, papszGroups, fDestFlags, NULL, 0, pszFilenameFmt, args); + rc = RTLogCreateExV(ppLogger, fFlags, pszGroupSettings, pszEnvVarBase, cGroups, papszGroups, + fDestFlags, NULL /*pfnPhase*/, 0 /*cHistory*/, 0 /*cbHistoryFileMax*/, 0 /*cSecsHistoryTimeSlot*/, + NULL /*pszErrorMsg*/, 0 /*cchErrorMsg*/, pszFilenameFmt, args); va_end(args); return rc; } RT_EXPORT_SYMBOL(RTLogCreate); -/** - * Create a logger instance. - * - * @returns iprt status code. - * - * @param ppLogger Where to store the logger instance. - * @param fFlags Logger instance flags, a combination of the RTLOGFLAGS_* values. - * @param pszGroupSettings The initial group settings. - * @param pszEnvVarBase Base name for the environment variables for this instance. - * @param cGroups Number of groups in the array. - * @param papszGroups Pointer to array of groups. This must stick around for the life of the - * logger instance. - * @param fDestFlags The destination flags. RTLOGDEST_FILE is ORed if pszFilenameFmt specified. - * @param pszErrorMsg A buffer which is filled with an error message if something fails. May be NULL. - * @param cchErrorMsg The size of the error message buffer. - * @param pszFilenameFmt Log filename format string. Standard RTStrFormat(). - * @param ... Format arguments. - */ RTDECL(int) RTLogCreateEx(PRTLOGGER *ppLogger, uint32_t fFlags, const char *pszGroupSettings, const char *pszEnvVarBase, unsigned cGroups, const char * const * papszGroups, - uint32_t fDestFlags, char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, ...) + uint32_t fDestFlags, PFNRTLOGPHASE pfnPhase, uint32_t cHistory, + uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot, + char *pszErrorMsg, size_t cchErrorMsg, const char *pszFilenameFmt, ...) { va_list args; int rc; va_start(args, pszFilenameFmt); - rc = RTLogCreateExV(ppLogger, fFlags, pszGroupSettings, pszEnvVarBase, cGroups, papszGroups, fDestFlags, pszErrorMsg, cchErrorMsg, pszFilenameFmt, args); + rc = RTLogCreateExV(ppLogger, fFlags, pszGroupSettings, pszEnvVarBase, cGroups, papszGroups, + fDestFlags, pfnPhase, cHistory, cbHistoryFileMax, cSecsHistoryTimeSlot, + pszErrorMsg, cchErrorMsg, pszFilenameFmt, args); va_end(args); return rc; } @@ -544,17 +658,24 @@ RTDECL(int) RTLogDestroy(PRTLOGGER pLogger) */ rtlogFlush(pLogger); +#ifdef IN_RING3 + /* + * Add end of logging message. + */ + if ( (pLogger->fDestFlags & RTLOGDEST_FILE) + && pLogger->pFile->File != NIL_RTFILE) + pLogger->pFile->pfnPhase(pLogger, RTLOGPHASE_END, rtlogPhaseMsgLocked); + /* * Close output stuffs. */ -#ifdef IN_RING3 - if (pLogger->File != NIL_RTFILE) + if (pLogger->pFile->File != NIL_RTFILE) { - int rc2 = RTFileClose(pLogger->File); + int rc2 = RTFileClose(pLogger->pFile->File); AssertRC(rc2); if (RT_FAILURE(rc2) && RT_SUCCESS(rc)) rc = rc2; - pLogger->File = NIL_RTFILE; + pLogger->pFile->File = NIL_RTFILE; } #endif @@ -765,8 +886,7 @@ RTDECL(int) RTLogCreateForR0(PRTLOGGER pLogger, size_t cbLogger, PFNRTLOGGER pfn pLogger->u32Magic = RTLOGGER_MAGIC; pLogger->fFlags = fFlags; pLogger->fDestFlags = fDestFlags & ~RTLOGDEST_FILE; - pLogger->File = NIL_RTFILE; - pLogger->pszFilename = NULL; + pLogger->pFile = NULL; pLogger->papszGroups = NULL; pLogger->cMaxGroups = (uint32_t)((cbLogger - RT_OFFSETOF(RTLOGGER, afGroups[0])) / sizeof(pLogger->afGroups[0])); pLogger->cGroups = 1; @@ -1467,9 +1587,8 @@ RTDECL(bool) RTLogSetBuffering(PRTLOGGER pLogger, bool fBuffered) } RT_EXPORT_SYMBOL(RTLogSetBuffering); - - #ifndef IN_RC + /** * Get the current log flags as a string. * @@ -1596,39 +1715,84 @@ RTDECL(int) RTLogDestinations(PRTLOGGER pLogger, char const *pszVar) pszEnd = strchr(pszVar, ';'); if (!pszEnd) pszEnd = strchr(pszVar, '\0'); -#ifndef IN_RING0 +# ifdef IN_RING3 size_t cch = pszEnd - pszVar; /* log file name */ if (i == 0 /* file */ && !fNo) { AssertReturn(cch < RTPATH_MAX, VERR_OUT_OF_RANGE); - memcpy(pLogger->pszFilename, pszVar, cch); - pLogger->pszFilename[cch] = '\0'; + memcpy(pLogger->pFile->pszFilename, pszVar, cch); + pLogger->pFile->pszFilename[cch] = '\0'; } /* log directory */ else if (i == 1 /* dir */ && !fNo) { char szTmp[RTPATH_MAX]; - const char *pszFile = RTPathFilename(pLogger->pszFilename); + const char *pszFile = RTPathFilename(pLogger->pFile->pszFilename); size_t cchFile = pszFile ? strlen(pszFile) : 0; AssertReturn(cchFile + cch + 1 < RTPATH_MAX, VERR_OUT_OF_RANGE); memcpy(szTmp, cchFile ? pszFile : "", cchFile + 1); - memcpy(pLogger->pszFilename, pszVar, cch); - pLogger->pszFilename[cch] = '\0'; - RTPathStripTrailingSlash(pLogger->pszFilename); + memcpy(pLogger->pFile->pszFilename, pszVar, cch); + pLogger->pFile->pszFilename[cch] = '\0'; + RTPathStripTrailingSlash(pLogger->pFile->pszFilename); - cch = strlen(pLogger->pszFilename); - pLogger->pszFilename[cch++] = '/'; - memcpy(&pLogger->pszFilename[cch], szTmp, cchFile); - pLogger->pszFilename[cch+cchFile] = '\0'; + cch = strlen(pLogger->pFile->pszFilename); + pLogger->pFile->pszFilename[cch++] = '/'; + memcpy(&pLogger->pFile->pszFilename[cch], szTmp, cchFile); + pLogger->pFile->pszFilename[cch+cchFile] = '\0'; + } + else if (i == 2 /* history */) + { + if (!fNo) + { + uint32_t cHistory = 0; + char szTmp[32]; + int rc = RTStrCopyEx(szTmp, sizeof(szTmp), pszVar, cch); + if (RT_SUCCESS(rc)) + rc = RTStrToUInt32Full(szTmp, 0, &cHistory); + AssertMsgReturn(RT_SUCCESS(rc) && cHistory < _1M, ("Invalid history value %s (%Rrc)!\n", szTmp, rc), rc); + pLogger->pFile->cHistory = cHistory; + } + else + pLogger->pFile->cHistory = 0; + } + else if (i == 3 /* histsize */) + { + if (!fNo) + { + char szTmp[32]; + int rc = RTStrCopyEx(szTmp, sizeof(szTmp), pszVar, cch); + if (RT_SUCCESS(rc)) + rc = RTStrToUInt64Full(szTmp, 0, &pLogger->pFile->cbHistoryFileMax); + AssertMsgRCReturn(rc, ("Invalid history file size value %s (%Rrc)!\n", szTmp, rc), rc); + if (pLogger->pFile->cbHistoryFileMax == 0) + pLogger->pFile->cbHistoryFileMax = UINT64_MAX; + } + else + pLogger->pFile->cbHistoryFileMax = UINT64_MAX; + } + else if (i == 4 /* histtime */) + { + if (!fNo) + { + char szTmp[32]; + int rc = RTStrCopyEx(szTmp, sizeof(szTmp), pszVar, cch); + if (RT_SUCCESS(rc)) + rc = RTStrToUInt32Full(szTmp, 0, &pLogger->pFile->cSecsHistoryTimeSlot); + AssertMsgRCReturn(rc, ("Invalid history time slot value %s (%Rrc)!\n", szTmp, rc), rc); + if (pLogger->pFile->cSecsHistoryTimeSlot == 0) + pLogger->pFile->cSecsHistoryTimeSlot = UINT32_MAX; + } + else + pLogger->pFile->cSecsHistoryTimeSlot = UINT32_MAX; } else AssertMsgFailedReturn(("Invalid destination value! %s%s doesn't take a value!\n", fNo ? "no" : "", s_aLogDst[i].pszInstr), VERR_INVALID_PARAMETER); -#endif +# endif /* IN_RING3 */ pszVar = pszEnd + (*pszEnd != '\0'); } break; @@ -1666,7 +1830,8 @@ RTDECL(int) RTLogGetDestinations(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf) uint32_t fDestFlags; unsigned i; - Assert(cchBuf); + AssertReturn(cchBuf, VERR_INVALID_PARAMETER); + *pszBuf = '\0'; /* * Resolve defaults. @@ -1675,14 +1840,8 @@ RTDECL(int) RTLogGetDestinations(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf) { pLogger = RTLogDefaultInstance(); if (!pLogger) - { - *pszBuf = '\0'; return VINF_SUCCESS; - } } -#define APPEND_PSZ(psz,cch) do { memcpy(pszBuf, (psz), (cch)); pszBuf += (cch); cchBuf -= (cch); } while (0) -#define APPEND_SZ(sz) APPEND_PSZ(sz, sizeof(sz) - 1) -#define APPEND_CH(ch) do { *pszBuf++ = (ch); cchBuf--; } while (0) /* * Add the flags in the list. @@ -1691,48 +1850,66 @@ RTDECL(int) RTLogGetDestinations(PRTLOGGER pLogger, char *pszBuf, size_t cchBuf) for (i = 2; i < RT_ELEMENTS(s_aLogDst); i++) if (s_aLogDst[i].fFlag & fDestFlags) { - size_t cchInstr = s_aLogDst[i].cchInstr; - if (cchInstr + fNotFirst + 1 > cchBuf) + if (fNotFirst) { - rc = VERR_BUFFER_OVERFLOW; - break; + rc = RTStrCopyP(&pszBuf, &cchBuf, " "); + if (RT_FAILURE(rc)) + return rc; } - if (fNotFirst) - APPEND_CH(' '); + rc = RTStrCopyP(&pszBuf, &cchBuf, s_aLogDst[i].pszInstr); + if (RT_FAILURE(rc)) + return rc; fNotFirst = true; - APPEND_PSZ(s_aLogDst[i].pszInstr, cchInstr); } +#ifdef IN_RING3 /* * Add the filename. */ if ( (fDestFlags & RTLOGDEST_FILE) - && VALID_PTR(pLogger->pszFilename) - && RT_SUCCESS(rc)) + && VALID_PTR(pLogger->pFile->pszFilename)) { - size_t cchFilename = strlen(pLogger->pszFilename); - if (cchFilename + sizeof("file=") - 1 + fNotFirst + 1 <= cchBuf) + rc = RTStrCopyP(&pszBuf, &cchBuf, fNotFirst ? " file=" : "file="); + if (RT_FAILURE(rc)) + return rc; + rc = RTStrCopyP(&pszBuf, &cchBuf, pLogger->pFile->pszFilename); + if (RT_FAILURE(rc)) + return rc; + fNotFirst = true; + } + + if (fDestFlags & RTLOGDEST_FILE) + { + char szNum[32]; + if (pLogger->pFile->cHistory) { - if (fNotFirst) - APPEND_SZ(" file="); - else - APPEND_SZ("file="); - APPEND_PSZ(pLogger->pszFilename, cchFilename); + RTStrPrintf(szNum, sizeof(szNum), fNotFirst ? "history=%u" : " history=%u", pLogger->pFile->cHistory); + rc = RTStrCopyP(&pszBuf, &cchBuf, szNum); + if (RT_FAILURE(rc)) + return rc; + } + if (pLogger->pFile->cbHistoryFileMax != UINT64_MAX) + { + RTStrPrintf(szNum, sizeof(szNum), fNotFirst ? "histsize=%llu" : " histsize=%llu", pLogger->pFile->cbHistoryFileMax); + rc = RTStrCopyP(&pszBuf, &cchBuf, szNum); + if (RT_FAILURE(rc)) + return rc; + } + if (pLogger->pFile->cSecsHistoryTimeSlot != UINT32_MAX) + { + RTStrPrintf(szNum, sizeof(szNum), fNotFirst ? "histtime=%llu" : " histtime=%llu", pLogger->pFile->cSecsHistoryTimeSlot); + rc = RTStrCopyP(&pszBuf, &cchBuf, szNum); + if (RT_FAILURE(rc)) + return rc; } - else - rc = VERR_BUFFER_OVERFLOW; } +#endif /* IN_RING3 */ -#undef APPEND_PSZ -#undef APPEND_SZ -#undef APPEND_CH - - *pszBuf = '\0'; - return rc; + return VINF_SUCCESS; } RT_EXPORT_SYMBOL(RTLogGetDestinations); -#endif /* !IN_RC */ +#endif /* !IN_RC */ /** * Flushes the specified logger. @@ -2031,21 +2208,9 @@ RTDECL(void) RTLogLoggerExV(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, } /* - * Format the message and perhaps flush it. + * Call worker. */ - if (pLogger->fFlags & (RTLOGFLAGS_PREFIX_MASK | RTLOGFLAGS_USECRLF)) - { - RTLOGOUTPUTPREFIXEDARGS OutputArgs; - OutputArgs.pLogger = pLogger; - OutputArgs.iGroup = iGroup; - OutputArgs.fFlags = fFlags; - RTLogFormatV(rtLogOutputPrefixed, &OutputArgs, pszFormat, args); - } - else - RTLogFormatV(rtLogOutput, pLogger, pszFormat, args); - if ( !(pLogger->fFlags & RTLOGFLAGS_BUFFERED) - && pLogger->offScratch) - rtlogFlush(pLogger); + rtlogLoggerExVLocked(pLogger, fFlags, iGroup, pszFormat, args); /* * Release the semaphore. @@ -2215,6 +2380,161 @@ RTDECL(void) RTLogPrintfV(const char *pszFormat, va_list args) } RT_EXPORT_SYMBOL(RTLogPrintfV); +#ifdef IN_RING3 + +/** + * Opens/creates the log file. + * + * @param pLogger The logger instance to update. NULL is not allowed! + * @param pszErrorMsg A buffer which is filled with an error message if + * something fails. May be NULL. + * @param cchErrorMsg The size of the error message buffer. + */ +static int rtlogFileOpen(PRTLOGGER pLogger, char *pszErrorMsg, size_t cchErrorMsg) +{ + uint32_t fOpen = RTFILE_O_WRITE | RTFILE_O_DENY_WRITE; + if (pLogger->fFlags & RTLOGFLAGS_APPEND) + fOpen |= RTFILE_O_OPEN_CREATE | RTFILE_O_APPEND; + else + fOpen |= RTFILE_O_CREATE_REPLACE; + if (pLogger->fFlags & RTLOGFLAGS_WRITE_THROUGH) + fOpen |= RTFILE_O_WRITE_THROUGH; + + int rc = RTFileOpen(&pLogger->pFile->File, pLogger->pFile->pszFilename, fOpen); + if (RT_FAILURE(rc)) + { + pLogger->pFile->File = NIL_RTFILE; + if (pszErrorMsg) + RTStrPrintf(pszErrorMsg, cchErrorMsg, N_("could not open file '%s' (fOpen=%#x)"), pLogger->pFile->pszFilename, fOpen); + } + else + { + rc = RTFileGetSize(pLogger->pFile->File, &pLogger->pFile->cbHistoryFileWritten); + if (RT_FAILURE(rc)) + { + /* Don't complain if this fails, assume the file is empty. */ + pLogger->pFile->cbHistoryFileWritten = 0; + rc = VINF_SUCCESS; + } + } + return rc; +} + + +/** + * Closes, rotates and opens the log files if necessary. + * + * Used by the rtlogFlush() function as well as RTLogCreateExV. + * + * @param pLogger The logger instance to update. NULL is not allowed! + * @param uTimeSlit Current time slot (for tikme based rotation). + * @param fFirst Flag whether this is the beginning of logging, i.e. + * called from RTLogCreateExV. Prevents pfnPhase from + * being called. + */ +static void rtlogRotate(PRTLOGGER pLogger, uint32_t uTimeSlot, bool fFirst) +{ + /* Suppress rotating empty log files simply because the time elapsed. */ + if (RT_UNLIKELY(!pLogger->pFile->cbHistoryFileWritten)) + pLogger->pFile->uHistoryTimeSlotStart = uTimeSlot; + + /* Check rotation condition: file still small enough and not too old? */ + if (RT_LIKELY( pLogger->pFile->cbHistoryFileWritten < pLogger->pFile->cbHistoryFileMax + && uTimeSlot == pLogger->pFile->uHistoryTimeSlotStart)) + return; + + /* + * Save "disabled" log flag and make sure logging is disabled. + * The logging in the functions called during log file history + * rotation would cause severe trouble otherwise. + */ + uint32_t const fSavedFlags = pLogger->fFlags; + pLogger->fFlags |= RTLOGFLAGS_DISABLED; + + /* + * Disable log rotation temporarily, otherwise with extreme settings and + * chatty phase logging we could run into endless rotation. + */ + uint32_t const cSavedHistory = pLogger->pFile->cHistory; + pLogger->pFile->cHistory = 0; + + /* + * Close the old log file. + */ + if (pLogger->pFile->File != NIL_RTFILE) + { + /* Use the callback to generate some final log contents, but only if + * this is a rotation with a fully set up logger. Leave the other case + * to the RTLogCreateExV function. */ + if (pLogger->pFile->pfnPhase && !fFirst) + { + uint32_t fODestFlags = pLogger->fDestFlags; + pLogger->fDestFlags &= RTLOGDEST_FILE; + pLogger->pFile->pfnPhase(pLogger, RTLOGPHASE_PREROTATE, rtlogPhaseMsgLocked); + pLogger->fDestFlags = fODestFlags; + } + RTFileClose(pLogger->pFile->File); + pLogger->pFile->File = NIL_RTFILE; + } + + if (cSavedHistory) + { + /* + * Rotate the log files. + */ + for (uint32_t i = cSavedHistory - 1; i + 1 > 0; i--) + { + char szOldName[RTPATH_MAX]; + if (i > 0) + RTStrPrintf(szOldName, sizeof(szOldName), "%s.%u", pLogger->pFile->pszFilename, i); + else + RTStrCopy(szOldName, sizeof(szOldName), pLogger->pFile->pszFilename); + char szNewName[RTPATH_MAX]; + RTStrPrintf(szNewName, sizeof(szNewName), "%s.%u", pLogger->pFile->pszFilename, i + 1); + if (RTFileRename(szOldName, szNewName, + RTFILEMOVE_FLAGS_REPLACE) == VERR_FILE_NOT_FOUND) + RTFileDelete(szNewName); + } + + /* + * Delete excess log files. + */ + for (uint32_t i = cSavedHistory + 1; ; i++) + { + char szExcessName[RTPATH_MAX]; + RTStrPrintf(szExcessName, sizeof(szExcessName), "%s.%u", pLogger->pFile->pszFilename, i); + int rc = RTFileDelete(szExcessName); + if (RT_FAILURE(rc)) + break; + } + } + + /* + * Update logger state and create new log file. + */ + pLogger->pFile->cbHistoryFileWritten = 0; + pLogger->pFile->uHistoryTimeSlotStart = uTimeSlot; + rtlogFileOpen(pLogger, NULL, 0); + + /* + * Use the callback to generate some initial log contents, but only if this + * is a rotation with a fully set up logger. Leave the other case to the + * RTLogCreateExV function. + */ + if (pLogger->pFile->pfnPhase && !fFirst) + { + uint32_t const fSavedDestFlags = pLogger->fDestFlags; + pLogger->fDestFlags &= RTLOGDEST_FILE; + pLogger->pFile->pfnPhase(pLogger, RTLOGPHASE_POSTROTATE, rtlogPhaseMsgLocked); + pLogger->fDestFlags = fSavedDestFlags; + } + + /* Restore saved values. */ + pLogger->pFile->cHistory = cSavedHistory; + pLogger->fFlags = fSavedFlags; +} + +#endif /* IN_RING3 */ /** * Writes the buffer to the given log device without checking for buffered @@ -2238,9 +2558,14 @@ static void rtlogFlush(PRTLOGGER pLogger) # ifdef IN_RING3 if (pLogger->fDestFlags & RTLOGDEST_FILE) { - RTFileWrite(pLogger->File, pLogger->achScratch, pLogger->offScratch, NULL); - if (pLogger->fFlags & RTLOGFLAGS_FLUSH) - RTFileFlush(pLogger->File); + if (pLogger->pFile->File != NIL_RTFILE) + { + RTFileWrite(pLogger->pFile->File, pLogger->achScratch, pLogger->offScratch, NULL); + if (pLogger->fFlags & RTLOGFLAGS_FLUSH) + RTFileFlush(pLogger->pFile->File); + } + if (pLogger->pFile->cHistory) + pLogger->pFile->cbHistoryFileWritten += pLogger->offScratch; } # endif @@ -2261,6 +2586,19 @@ static void rtlogFlush(PRTLOGGER pLogger) /* empty the buffer. */ pLogger->offScratch = 0; + +#ifdef IN_RING3 + /* + * Rotate the log file if configured. Must be done after everything is + * flushed, since this will also use logging/flushing to write the header + * and footer messages. + */ + if ( (pLogger->fDestFlags & RTLOGDEST_FILE) + && pLogger->pFile->cHistory) + rtlogRotate(pLogger, + RTTimeProgramSecTS() / pLogger->pFile->cSecsHistoryTimeSlot, + false /* fFirst */); +#endif } @@ -2728,3 +3066,38 @@ static DECLCALLBACK(size_t) rtLogOutputPrefixed(void *pv, const char *pachChars, } } + +/** + * Write to a logger instance (worker function). + * + * This function will check whether the instance, group and flags makes up a + * logging kind which is currently enabled before writing anything to the log. + * + * @param pLogger Pointer to logger instance. Must be non-NULL. + * @param fFlags The logging flags. + * @param iGroup The group. + * The value ~0U is reserved for compatibility with RTLogLogger[V] and is + * only for internal usage! + * @param pszFormat Format string. + * @param args Format arguments. + */ +static void rtlogLoggerExVLocked(PRTLOGGER pLogger, unsigned fFlags, unsigned iGroup, const char *pszFormat, va_list args) +{ + /* + * Format the message and perhaps flush it. + */ + if (pLogger->fFlags & (RTLOGFLAGS_PREFIX_MASK | RTLOGFLAGS_USECRLF)) + { + RTLOGOUTPUTPREFIXEDARGS OutputArgs; + OutputArgs.pLogger = pLogger; + OutputArgs.iGroup = iGroup; + OutputArgs.fFlags = fFlags; + RTLogFormatV(rtLogOutputPrefixed, &OutputArgs, pszFormat, args); + } + else + RTLogFormatV(rtLogOutput, pLogger, pszFormat, args); + if ( !(pLogger->fFlags & RTLOGFLAGS_BUFFERED) + && pLogger->offScratch) + rtlogFlush(pLogger); +} + diff --git a/src/VBox/Runtime/common/string/RTStrCatP.cpp b/src/VBox/Runtime/common/string/RTStrCatP.cpp new file mode 100644 index 000000000..145fb9c2e --- /dev/null +++ b/src/VBox/Runtime/common/string/RTStrCatP.cpp @@ -0,0 +1,50 @@ +/* $Id: RTStrCatP.cpp $ */ +/** @file + * IPRT - RTStrCat. + */ + +/* + * Copyright (C) 2010 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 * +*******************************************************************************/ +#include <iprt/string.h> +#include "internal/iprt.h" + + +RTDECL(int) RTStrCatP(char **ppszDst, size_t *pcbDst, const char *pszSrc) +{ + /* + * Advance past the current string in the output buffer and turn this into + * a copy operation. + */ + size_t cbDst = *pcbDst; + char *pszDst = RTStrEnd(*ppszDst, *pcbDst); + AssertReturn(pszDst, VERR_INVALID_PARAMETER); + *pcbDst -= pszDst - *ppszDst; + *ppszDst = pszDst; + + return RTStrCopyP(ppszDst, pcbDst, pszSrc); +} +RT_EXPORT_SYMBOL(RTStrCatP); + diff --git a/src/VBox/Runtime/common/string/RTStrCatPEx.cpp b/src/VBox/Runtime/common/string/RTStrCatPEx.cpp new file mode 100644 index 000000000..808773ffa --- /dev/null +++ b/src/VBox/Runtime/common/string/RTStrCatPEx.cpp @@ -0,0 +1,50 @@ +/* $Id: RTStrCatPEx.cpp $ */ +/** @file + * IPRT - RTStrCatPEx + */ + +/* + * Copyright (C) 2011 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 * +*******************************************************************************/ +#include <iprt/string.h> +#include "internal/iprt.h" + + +RTDECL(int) RTStrCatPEx(char **ppszDst, size_t *pcbDst, const char *pszSrc, size_t cchMaxSrc) +{ + /* + * Advance past the current string in the output buffer and turn this into + * a copy operation. + */ + size_t cbDst = *pcbDst; + char *pszDst = RTStrEnd(*ppszDst, cbDst); + AssertReturn(pszDst, VERR_INVALID_PARAMETER); + *pcbDst -= pszDst - *ppszDst; + *ppszDst = pszDst; + + return RTStrCopyPEx(ppszDst, pcbDst, pszSrc, cchMaxSrc); +} +RT_EXPORT_SYMBOL(RTStrCatPEx); + diff --git a/src/VBox/Runtime/common/string/RTStrCopyP.cpp b/src/VBox/Runtime/common/string/RTStrCopyP.cpp new file mode 100644 index 000000000..0e6c166a9 --- /dev/null +++ b/src/VBox/Runtime/common/string/RTStrCopyP.cpp @@ -0,0 +1,58 @@ +/* $Id: RTStrCopyP.cpp $ */ +/** @file + * IPRT - RTStrCopyP. + */ + +/* + * Copyright (C) 2010-2011 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 * +*******************************************************************************/ +#include <iprt/string.h> +#include "internal/iprt.h" + + +RTDECL(int) RTStrCopyP(char **ppszDst, size_t *pcbDst, const char *pszSrc) +{ + size_t const cchSrc = strlen(pszSrc); + size_t const cbDst = *pcbDst; + char *pszDst = *ppszDst; + if (RT_LIKELY(cchSrc < cbDst)) + { + memcpy(pszDst, pszSrc, cchSrc + 1); + *ppszDst = pszDst += cchSrc; + *pcbDst -= cchSrc; + return VINF_SUCCESS; + } + + if (cbDst != 0) + { + memcpy(*ppszDst, pszSrc, cbDst - 1); + *ppszDst = pszDst += cbDst - 1; + *pszDst = '\0'; + *pcbDst = 1; + } + return VERR_BUFFER_OVERFLOW; +} +RT_EXPORT_SYMBOL(RTStrCopyP); + diff --git a/src/VBox/Runtime/common/string/RTStrCopyPEx.cpp b/src/VBox/Runtime/common/string/RTStrCopyPEx.cpp new file mode 100644 index 000000000..84919a043 --- /dev/null +++ b/src/VBox/Runtime/common/string/RTStrCopyPEx.cpp @@ -0,0 +1,60 @@ +/* $Id: RTStrCopyPEx.cpp $ */ +/** @file + * IPRT - RTStrCopyPEx. + */ + +/* + * Copyright (C) 2010-2011 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 * +*******************************************************************************/ +#include <iprt/string.h> +#include "internal/iprt.h" + + +RTDECL(int) RTStrCopyPEx(char **ppszDst, size_t *pcbDst, const char *pszSrc, size_t cchMaxSrc) +{ + const char *pszSrcEol = RTStrEnd(pszSrc, cchMaxSrc); + size_t cchSrc = pszSrcEol ? (size_t)(pszSrcEol - pszSrc) : cchMaxSrc; + size_t const cbDst = *pcbDst; + char *pszDst = *ppszDst; + if (RT_LIKELY(cchSrc < cbDst)) + { + memcpy(pszDst, pszSrc, cchSrc); + *ppszDst = pszDst += cchSrc; + *pszDst = '\0'; + *pcbDst -= cchSrc; + return VINF_SUCCESS; + } + + if (cbDst != 0) + { + memcpy(*ppszDst, pszSrc, cbDst - 1); + *ppszDst = pszDst += cbDst - 1; + *pszDst = '\0'; + *pcbDst = 1; + } + return VERR_BUFFER_OVERFLOW; +} +RT_EXPORT_SYMBOL(RTStrCopyPEx); + diff --git a/src/VBox/Runtime/common/time/timesupA.mac b/src/VBox/Runtime/common/time/timesupA.mac index bb69ffacb..b146c5a6e 100644 --- a/src/VBox/Runtime/common/time/timesupA.mac +++ b/src/VBox/Runtime/common/time/timesupA.mac @@ -94,8 +94,9 @@ BEGINPROC rtTimeNanoTSInternalAsm %ifdef NEED_TRANSACTION_ID mov u32ApicIdPlus, ebx %endif - ; pGipCpu = &pGip->aCPU[u8ApicId]; + ; pGipCpu = &pGip->aCPU[pGip->aiCpuFromApicId[u8ApicId]]; shr ebx, 24 + movzx ebx, word [esi + ebx * 2 + SUPGLOBALINFOPAGE.aiCpuFromApicId] mov eax, SUPGIPCPU_size mul ebx lea edi, [esi + eax + SUPGLOBALINFOPAGE.aCPUs] ; edi == &pGip->aCPU[u8ApicId]; @@ -515,10 +516,10 @@ BEGINPROC rtTimeNanoTSInternalAsm %ifdef NEED_TRANSACTION_ID mov u32ApicIdPlus, ebx %endif - ; pGipCpu = &pGip->aCPU[u8ApicId]; + ; pGipCpu = &pGip->aCPU[pGip->aiCpuFromApicId[u8ApicId]]; shr ebx, 24 - mov eax, SUPGIPCPU_size - mul ebx + movzx eax, word [pGip + rbx * 2 + SUPGLOBALINFOPAGE.aiCpuFromApicId] + imul eax, SUPGIPCPU_size lea pGipCPU, [pGip + rax + SUPGLOBALINFOPAGE.aCPUs] %else lea pGipCPU, [pGip + SUPGLOBALINFOPAGE.aCPUs] diff --git a/src/VBox/Runtime/common/time/timesupref.h b/src/VBox/Runtime/common/time/timesupref.h index 244d26f66..e7b345132 100644 --- a/src/VBox/Runtime/common/time/timesupref.h +++ b/src/VBox/Runtime/common/time/timesupref.h @@ -62,8 +62,8 @@ RTDECL(uint64_t) rtTimeNanoTSInternalRef(PRTTIMENANOTSDATA pData) #endif #ifdef ASYNC_GIP - uint8_t u8ApicId = ASMGetApicId(); - PSUPGIPCPU pGipCpu = &pGip->aCPUs[u8ApicId]; + uint8_t u8ApicId = ASMGetApicId(); + PSUPGIPCPU pGipCpu = &pGip->aCPUs[pGip->aiCpuFromApicId[u8ApicId]]; #else PSUPGIPCPU pGipCpu = &pGip->aCPUs[0]; #endif diff --git a/src/VBox/Runtime/generic/RTMpCpuIdToSetIndex-generic.cpp b/src/VBox/Runtime/generic/RTMpCpuIdToSetIndex-generic.cpp index 88df98053..894f8f4f7 100644 --- a/src/VBox/Runtime/generic/RTMpCpuIdToSetIndex-generic.cpp +++ b/src/VBox/Runtime/generic/RTMpCpuIdToSetIndex-generic.cpp @@ -31,10 +31,12 @@ #include <iprt/mp.h> #include "internal/iprt.h" +#include <iprt/cpuset.h> + RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) { - return idCpu != NIL_RTCPUID ? (int) idCpu : -1; + return idCpu < RTCPUSET_MAX_CPUS && idCpu != NIL_RTCPUID ? (int) idCpu : -1; } RT_EXPORT_SYMBOL(RTMpCpuIdToSetIndex); diff --git a/src/VBox/Runtime/generic/RTMpGetArraySize-generic.cpp b/src/VBox/Runtime/generic/RTMpGetArraySize-generic.cpp index 1eb84da8a..eafac57ff 100644 --- a/src/VBox/Runtime/generic/RTMpGetArraySize-generic.cpp +++ b/src/VBox/Runtime/generic/RTMpGetArraySize-generic.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2010 Oracle Corporation + * Copyright (C) 2010-2011 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,14 +29,34 @@ * Header Files * *******************************************************************************/ #include <iprt/mp.h> -#include <iprt/cpuset.h> #include "internal/iprt.h" +#include <iprt/asm.h> +#include <iprt/cpuset.h> + RTDECL(uint32_t) RTMpGetArraySize(void) { - RTCPUSET CpuSet; - return RTCpuLastIndex(RTMpGetSet(&CpuSet)) + 1; + /* + * Cache the result here. This whole point of this function is that it + * will always return the same value, so that should be safe. + * + * Note! Because RTCPUSET may be to small to represent all the CPUs, we + * check with RTMpGetCount() as well. + */ + static uint32_t s_cMaxCpus = 0; + uint32_t cCpus = s_cMaxCpus; + if (RT_UNLIKELY(cCpus == 0)) + { + RTCPUSET CpuSet; + uint32_t cCpus1 = RTCpuLastIndex(RTMpGetSet(&CpuSet)) + 1; + uint32_t cCpus2 = RTMpGetCount(); + uint32_t cCpus = RT_MAX(cCpus1, cCpus2); + ASMAtomicCmpXchgU32(&s_cMaxCpus, cCpus, 0); + return cCpus; + } + return s_cMaxCpus; + } RT_EXPORT_SYMBOL(RTMpGetArraySize); diff --git a/src/VBox/Runtime/generic/RTSemEventMultiWait-2-ex-generic.cpp b/src/VBox/Runtime/generic/RTSemEventMultiWait-2-ex-generic.cpp index 1e0755f23..437be6be1 100644 --- a/src/VBox/Runtime/generic/RTSemEventMultiWait-2-ex-generic.cpp +++ b/src/VBox/Runtime/generic/RTSemEventMultiWait-2-ex-generic.cpp @@ -29,6 +29,7 @@ * Header Files * *******************************************************************************/ #define LOG_GROUP RTLOGGROUP_SEM +#define RTSEMEVENTMULTI_WITHOUT_REMAPPING #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -36,7 +37,6 @@ #include <iprt/assert.h> -#undef RTSemEventMultiWait /* undo debug mapping */ RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI hEventMultiSem, RTMSINTERVAL cMillies) { int rc; diff --git a/src/VBox/Runtime/generic/RTSemEventMultiWait-generic.cpp b/src/VBox/Runtime/generic/RTSemEventMultiWait-generic.cpp index a92fd2716..16a9580bf 100644 --- a/src/VBox/Runtime/generic/RTSemEventMultiWait-generic.cpp +++ b/src/VBox/Runtime/generic/RTSemEventMultiWait-generic.cpp @@ -29,6 +29,7 @@ * Header Files * *******************************************************************************/ #define LOG_GROUP RTLOGGROUP_SEM +#define RTSEMEVENTMULTI_WITHOUT_REMAPPING #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -37,7 +38,6 @@ #include <iprt/assert.h> -#undef RTSemEventMultiWait /* undo debug mapping */ RTDECL(int) RTSemEventMultiWait(RTSEMEVENTMULTI EventSem, RTMSINTERVAL cMillies) { int rc; diff --git a/src/VBox/Runtime/generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp b/src/VBox/Runtime/generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp index 425a5004a..c3eb88db0 100644 --- a/src/VBox/Runtime/generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp +++ b/src/VBox/Runtime/generic/RTSemEventMultiWaitNoResume-2-ex-generic.cpp @@ -30,6 +30,7 @@ * Header Files * *******************************************************************************/ #define LOG_GROUP RTLOGGROUP_SEM +#define RTSEMEVENTMULTI_WITHOUT_REMAPPING #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -37,7 +38,6 @@ #include <iprt/assert.h> -#undef RTSemEventMultiWaitNoResume /* undo debug mapping */ RTDECL(int) RTSemEventMultiWaitNoResume(RTSEMEVENTMULTI hEventMultiSem, RTMSINTERVAL cMillies) { int rc; diff --git a/src/VBox/Runtime/generic/RTSemEventWait-2-ex-generic.cpp b/src/VBox/Runtime/generic/RTSemEventWait-2-ex-generic.cpp index ed6b2f269..b2e78807d 100644 --- a/src/VBox/Runtime/generic/RTSemEventWait-2-ex-generic.cpp +++ b/src/VBox/Runtime/generic/RTSemEventWait-2-ex-generic.cpp @@ -29,6 +29,7 @@ * Header Files * *******************************************************************************/ #define LOG_GROUP RTLOGGROUP_SEM +#define RTSEMEVENT_WITHOUT_REMAPPING #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -36,7 +37,6 @@ #include <iprt/assert.h> -#undef RTSemEventWait /* undo debug mapping */ RTDECL(int) RTSemEventWait(RTSEMEVENT hEventSem, RTMSINTERVAL cMillies) { int rc; diff --git a/src/VBox/Runtime/generic/RTSemEventWait-generic.cpp b/src/VBox/Runtime/generic/RTSemEventWait-generic.cpp index 0c01c8644..ade778085 100644 --- a/src/VBox/Runtime/generic/RTSemEventWait-generic.cpp +++ b/src/VBox/Runtime/generic/RTSemEventWait-generic.cpp @@ -29,6 +29,7 @@ * Header Files * *******************************************************************************/ #define LOG_GROUP RTLOGGROUP_SEM +#define RTSEMEVENT_WITHOUT_REMAPPING #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -37,7 +38,6 @@ #include <iprt/assert.h> -#undef RTSemEventWait /* undo debug mapping */ RTDECL(int) RTSemEventWait(RTSEMEVENT EventSem, RTMSINTERVAL cMillies) { int rc; diff --git a/src/VBox/Runtime/generic/RTSemEventWaitNoResume-2-ex-generic.cpp b/src/VBox/Runtime/generic/RTSemEventWaitNoResume-2-ex-generic.cpp index 7cc73f274..3dbe66cdc 100644 --- a/src/VBox/Runtime/generic/RTSemEventWaitNoResume-2-ex-generic.cpp +++ b/src/VBox/Runtime/generic/RTSemEventWaitNoResume-2-ex-generic.cpp @@ -30,6 +30,7 @@ * Header Files * *******************************************************************************/ #define LOG_GROUP RTLOGGROUP_SEM +#define RTSEMEVENT_WITHOUT_REMAPPING #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -37,7 +38,6 @@ #include <iprt/assert.h> -#undef RTSemEventWaitNoResume /* undo debug mapping */ RTDECL(int) RTSemEventWaitNoResume(RTSEMEVENT hEventSem, RTMSINTERVAL cMillies) { int rc; diff --git a/src/VBox/Runtime/generic/RTSemMutexRequest-generic.cpp b/src/VBox/Runtime/generic/RTSemMutexRequest-generic.cpp index 02838bab0..32c3f8760 100644 --- a/src/VBox/Runtime/generic/RTSemMutexRequest-generic.cpp +++ b/src/VBox/Runtime/generic/RTSemMutexRequest-generic.cpp @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMMUTEX_WITHOUT_REMAPPING #define LOG_GROUP RTLOGGROUP_SEM #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -37,7 +38,6 @@ #include <iprt/assert.h> -#undef RTSemMutexRequest /* undo debug mapping */ RTDECL(int) RTSemMutexRequest(RTSEMMUTEX Mutex, RTMSINTERVAL cMillies) { int rc; diff --git a/src/VBox/Runtime/generic/env-generic.cpp b/src/VBox/Runtime/generic/env-generic.cpp index 213191ba1..f07abc997 100644 --- a/src/VBox/Runtime/generic/env-generic.cpp +++ b/src/VBox/Runtime/generic/env-generic.cpp @@ -508,6 +508,7 @@ RTDECL(int) RTEnvGetEx(RTENV Env, const char *pszVar, char *pszValue, size_t cbV else rc = VERR_BUFFER_OVERFLOW; } + RTStrFree(pszValueUtf8); } } else diff --git a/src/VBox/Runtime/generic/semrw-generic.cpp b/src/VBox/Runtime/generic/semrw-generic.cpp index a0bcdef24..f565119e8 100644 --- a/src/VBox/Runtime/generic/semrw-generic.cpp +++ b/src/VBox/Runtime/generic/semrw-generic.cpp @@ -31,6 +31,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMRW_WITHOUT_REMAPPING #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -87,7 +88,6 @@ struct RTSEMRWINTERNAL -#undef RTSemRWCreate RTDECL(int) RTSemRWCreate(PRTSEMRW phRWSem) { return RTSemRWCreateEx(phRWSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_NONE, "RTSemRW"); @@ -436,7 +436,6 @@ DECL_FORCE_INLINE(int) rtSemRWRequestRead(RTSEMRW hRWSem, RTMSINTERVAL cMillies, } -#undef RTSemRWRequestRead RTDECL(int) RTSemRWRequestRead(RTSEMRW hRWSem, RTMSINTERVAL cMillies) { #ifndef RTSEMRW_STRICT @@ -457,7 +456,6 @@ RTDECL(int) RTSemRWRequestReadDebug(RTSEMRW hRWSem, RTMSINTERVAL cMillies, RTHCU RT_EXPORT_SYMBOL(RTSemRWRequestReadDebug); -#undef RTSemRWRequestReadNoResume RTDECL(int) RTSemRWRequestReadNoResume(RTSEMRW hRWSem, RTMSINTERVAL cMillies) { #ifndef RTSEMRW_STRICT @@ -742,7 +740,6 @@ DECL_FORCE_INLINE(int) rtSemRWRequestWrite(RTSEMRW hRWSem, RTMSINTERVAL cMillies } -#undef RTSemRWRequestWrite RTDECL(int) RTSemRWRequestWrite(RTSEMRW hRWSem, RTMSINTERVAL cMillies) { #ifndef RTSEMRW_STRICT @@ -763,7 +760,6 @@ RTDECL(int) RTSemRWRequestWriteDebug(RTSEMRW hRWSem, RTMSINTERVAL cMillies, RTHC RT_EXPORT_SYMBOL(RTSemRWRequestWriteDebug); -#undef RTSemRWRequestWriteNoResume RTDECL(int) RTSemRWRequestWriteNoResume(RTSEMRW hRWSem, RTMSINTERVAL cMillies) { #ifndef RTSEMRW_STRICT diff --git a/src/VBox/Runtime/generic/semrw-lockless-generic.cpp b/src/VBox/Runtime/generic/semrw-lockless-generic.cpp index 82d11fbc9..3da9d6fe1 100644 --- a/src/VBox/Runtime/generic/semrw-lockless-generic.cpp +++ b/src/VBox/Runtime/generic/semrw-lockless-generic.cpp @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMRW_WITHOUT_REMAPPING #define RTASSERT_QUIET #include <iprt/semaphore.h> #include "internal/iprt.h" @@ -108,7 +109,6 @@ typedef struct RTSEMRWINTERNAL //#define RTSEMRW_WAIT_CNT_WR_MASK (RTSEMRW_CNT_MASK << RTSEMRW_WAIT_CNT_WR_SHIFT) -#undef RTSemRWCreate RTDECL(int) RTSemRWCreate(PRTSEMRW phRWSem) { return RTSemRWCreateEx(phRWSem, 0 /*fFlags*/, NIL_RTLOCKVALCLASS, RTLOCKVAL_SUB_CLASS_NONE, "RTSemRW"); @@ -425,7 +425,6 @@ static int rtSemRWRequestRead(RTSEMRW hRWSem, RTMSINTERVAL cMillies, bool fInter } -#undef RTSemRWRequestRead RTDECL(int) RTSemRWRequestRead(RTSEMRW hRWSem, RTMSINTERVAL cMillies) { #ifndef RTSEMRW_STRICT @@ -446,7 +445,6 @@ RTDECL(int) RTSemRWRequestReadDebug(RTSEMRW hRWSem, RTMSINTERVAL cMillies, RTHCU RT_EXPORT_SYMBOL(RTSemRWRequestReadDebug); -#undef RTSemRWRequestReadNoResume RTDECL(int) RTSemRWRequestReadNoResume(RTSEMRW hRWSem, RTMSINTERVAL cMillies) { #ifndef RTSEMRW_STRICT @@ -716,7 +714,6 @@ DECL_FORCE_INLINE(int) rtSemRWRequestWrite(RTSEMRW hRWSem, RTMSINTERVAL cMillies } -#undef RTSemRWRequestWrite RTDECL(int) RTSemRWRequestWrite(RTSEMRW hRWSem, RTMSINTERVAL cMillies) { #ifndef RTSEMRW_STRICT @@ -737,7 +734,6 @@ RTDECL(int) RTSemRWRequestWriteDebug(RTSEMRW hRWSem, RTMSINTERVAL cMillies, RTHC RT_EXPORT_SYMBOL(RTSemRWRequestWriteDebug); -#undef RTSemRWRequestWriteNoResume RTDECL(int) RTSemRWRequestWriteNoResume(RTSEMRW hRWSem, RTMSINTERVAL cMillies) { #ifndef RTSEMRW_STRICT diff --git a/src/VBox/Runtime/r0drv/alloc-r0drv.cpp b/src/VBox/Runtime/r0drv/alloc-r0drv.cpp index a2003f9c3..17b9e8bcf 100644 --- a/src/VBox/Runtime/r0drv/alloc-r0drv.cpp +++ b/src/VBox/Runtime/r0drv/alloc-r0drv.cpp @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTMEM_NO_WRAP_TO_EF_APIS #include <iprt/mem.h> #include "internal/iprt.h" @@ -58,31 +59,6 @@ #endif -#undef RTMemTmpAlloc -#undef RTMemTmpAllocTag -#undef RTMemTmpAllocZ -#undef RTMemTmpAllocZTag -#undef RTMemTmpFree -#undef RTMemAlloc -#undef RTMemAllocTag -#undef RTMemAllocZ -#undef RTMemAllocZTag -#undef RTMemAllocVar -#undef RTMemAllocVarTag -#undef RTMemAllocZVar -#undef RTMemAllocZVarTag -#undef RTMemRealloc -#undef RTMemReallocTag -#undef RTMemFree -#undef RTMemDup -#undef RTMemDupTag -#undef RTMemDupEx -#undef RTMemDupExTag -#undef rtR0MemAllocEx -#undef rtR0MemAllocExTag -#undef rtR0MemFreeEx - - /******************************************************************************* * Global Variables * *******************************************************************************/ diff --git a/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp b/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp index eb31f7919..e3a89e093 100644 --- a/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp +++ b/src/VBox/Runtime/r0drv/darwin/mp-r0drv-darwin.cpp @@ -85,7 +85,7 @@ RTDECL(RTCPUID) RTMpCpuId(void) RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) { - return idCpu < MY_DARWIN_MAX_CPUS ? (int)idCpu : -1; + return idCpu < RTCPUSET_MAX_CPUS && idCpu < MY_DARWIN_MAX_CPUS ? (int)idCpu : -1; } @@ -150,24 +150,6 @@ RTDECL(bool) RTMpIsCpuOnline(RTCPUID idCpu) } -RTDECL(PRTCPUSET) RTMpGetPresentSet(PRTCPUSET pSet) -{ - return RTMpGetSet(pSet); -} - - -RTDECL(RTCPUID) RTMpGetPresentCount(void) -{ - return RTMpGetCount(); -} - - -RTDECL(bool) RTMpIsCpuPresent(RTCPUID idCpu) -{ - return RTMpIsCpuPossible(idCpu); -} - - RTDECL(uint32_t) RTMpGetCurFrequency(RTCPUID idCpu) { /** @todo darwin R0 MP (rainy day) */ diff --git a/src/VBox/Runtime/r0drv/darwin/semevent-r0drv-darwin.cpp b/src/VBox/Runtime/r0drv/darwin/semevent-r0drv-darwin.cpp index c7863e85d..a2098bfd2 100644 --- a/src/VBox/Runtime/r0drv/darwin/semevent-r0drv-darwin.cpp +++ b/src/VBox/Runtime/r0drv/darwin/semevent-r0drv-darwin.cpp @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENT_WITHOUT_REMAPPING #include "the-darwin-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -370,7 +371,6 @@ static int rtR0SemEventDarwinWait(PRTSEMEVENTINTERNAL pThis, uint32_t fFlags, ui } -#undef RTSemEventWaitEx RTDECL(int) RTSemEventWaitEx(RTSEMEVENT hEventSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/darwin/semeventmulti-r0drv-darwin.cpp b/src/VBox/Runtime/r0drv/darwin/semeventmulti-r0drv-darwin.cpp index c8f27a5d3..a77d41d0d 100644 --- a/src/VBox/Runtime/r0drv/darwin/semeventmulti-r0drv-darwin.cpp +++ b/src/VBox/Runtime/r0drv/darwin/semeventmulti-r0drv-darwin.cpp @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENTMULTI_WITHOUT_REMAPPING #include "the-darwin-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -383,7 +384,6 @@ static int rtR0SemEventMultiDarwinWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t return rc; } -#undef RTSemEventMultiWaitEx RTDECL(int) RTSemEventMultiWaitEx(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/darwin/semmutex-r0drv-darwin.cpp b/src/VBox/Runtime/r0drv/darwin/semmutex-r0drv-darwin.cpp index d6488c39e..2b01e760a 100644 --- a/src/VBox/Runtime/r0drv/darwin/semmutex-r0drv-darwin.cpp +++ b/src/VBox/Runtime/r0drv/darwin/semmutex-r0drv-darwin.cpp @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMMUTEX_WITHOUT_REMAPPING #include "the-darwin-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -300,7 +301,6 @@ DECLINLINE(int) rtR0SemMutexDarwinRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMi } -#undef RTSemMutexRequest RTDECL(int) RTSemMutexRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { return rtR0SemMutexDarwinRequest(hMutexSem, cMillies, THREAD_UNINT); @@ -313,7 +313,6 @@ RTDECL(int) RTSemMutexRequestDebug(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies, } -#undef RTSemMutexRequestNoResume RTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { return rtR0SemMutexDarwinRequest(hMutexSem, cMillies, THREAD_ABORTSAFE); diff --git a/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c index cb8cea970..a2cffad86 100644 --- a/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c +++ b/src/VBox/Runtime/r0drv/freebsd/mp-r0drv-freebsd.c @@ -45,7 +45,7 @@ RTDECL(RTCPUID) RTMpCpuId(void) RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) { - return idCpu <= mp_maxid ? (int)idCpu : -1; + return idCpu < RTCPUSET_MAX_CPUS && idCpu <= mp_maxid ? (int)idCpu : -1; } diff --git a/src/VBox/Runtime/r0drv/freebsd/semevent-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/semevent-r0drv-freebsd.c index 21a256999..b2a9a5c91 100644 --- a/src/VBox/Runtime/r0drv/freebsd/semevent-r0drv-freebsd.c +++ b/src/VBox/Runtime/r0drv/freebsd/semevent-r0drv-freebsd.c @@ -31,6 +31,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENT_WITHOUT_REMAPPING #include "the-freebsd-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -226,7 +227,6 @@ static int rtR0SemEventWait(PRTSEMEVENTINTERNAL pThis, uint32_t fFlags, uint64_t } -#undef RTSemEventWaitEx RTDECL(int) RTSemEventWaitEx(RTSEMEVENT hEventSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/freebsd/semeventmulti-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/semeventmulti-r0drv-freebsd.c index 775fc1eb9..253a5b01d 100644 --- a/src/VBox/Runtime/r0drv/freebsd/semeventmulti-r0drv-freebsd.c +++ b/src/VBox/Runtime/r0drv/freebsd/semeventmulti-r0drv-freebsd.c @@ -31,6 +31,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENTMULTI_WITHOUT_REMAPPING #include "the-freebsd-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -288,7 +289,6 @@ static int rtR0SemEventMultiBsdWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t fFl } -#undef RTSemEventMultiWaitEx RTDECL(int) RTSemEventMultiWaitEx(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/freebsd/semmutex-r0drv-freebsd.c b/src/VBox/Runtime/r0drv/freebsd/semmutex-r0drv-freebsd.c index 0f36490b9..b20b9603f 100644 --- a/src/VBox/Runtime/r0drv/freebsd/semmutex-r0drv-freebsd.c +++ b/src/VBox/Runtime/r0drv/freebsd/semmutex-r0drv-freebsd.c @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMMUTEX_WITHOUT_REMAPPING #include "the-freebsd-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -92,7 +93,6 @@ RTDECL(int) RTSemMutexDestroy(RTSEMMUTEX hMutexSem) } -#undef RTSemMutexRequest RTDECL(int) RTSemMutexRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { PRTSEMMUTEXINTERNAL pThis = hMutexSem; @@ -143,7 +143,6 @@ RTDECL(int) RTSemMutexRequestDebug(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies, } -#undef RTSemMutexRequestNoResume RTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { PRTSEMMUTEXINTERNAL pThis = hMutexSem; diff --git a/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c index 53b8c1a8b..19aaffc18 100644 --- a/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c +++ b/src/VBox/Runtime/r0drv/linux/mp-r0drv-linux.c @@ -47,7 +47,7 @@ RT_EXPORT_SYMBOL(RTMpCpuId); RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) { - return idCpu < NR_CPUS ? (int)idCpu : -1; + return idCpu < RTCPUSET_MAX_CPUS && idCpu < NR_CPUS ? (int)idCpu : -1; } RT_EXPORT_SYMBOL(RTMpCpuIdToSetIndex); diff --git a/src/VBox/Runtime/r0drv/linux/semevent-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/semevent-r0drv-linux.c index 38eb314d8..2506adc87 100644 --- a/src/VBox/Runtime/r0drv/linux/semevent-r0drv-linux.c +++ b/src/VBox/Runtime/r0drv/linux/semevent-r0drv-linux.c @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENT_WITHOUT_REMAPPING #include "the-linux-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -236,7 +237,6 @@ static int rtR0SemEventLnxWait(PRTSEMEVENTINTERNAL pThis, uint32_t fFlags, uint6 } -#undef RTSemEventWaitEx RTDECL(int) RTSemEventWaitEx(RTSEMEVENT hEventSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/linux/semeventmulti-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/semeventmulti-r0drv-linux.c index 67c09a7ae..74cc39002 100644 --- a/src/VBox/Runtime/r0drv/linux/semeventmulti-r0drv-linux.c +++ b/src/VBox/Runtime/r0drv/linux/semeventmulti-r0drv-linux.c @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENTMULTI_WITHOUT_REMAPPING #include "the-linux-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -301,7 +302,6 @@ static int rtR0SemEventMultiLnxWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t fFl } -#undef RTSemEventMultiWaitEx RTDECL(int) RTSemEventMultiWaitEx(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/linux/semmutex-r0drv-linux.c b/src/VBox/Runtime/r0drv/linux/semmutex-r0drv-linux.c index eddc5adee..de257acc4 100644 --- a/src/VBox/Runtime/r0drv/linux/semmutex-r0drv-linux.c +++ b/src/VBox/Runtime/r0drv/linux/semmutex-r0drv-linux.c @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMMUTEX_WITHOUT_REMAPPING #include "the-linux-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -296,7 +297,6 @@ DECLINLINE(int) rtSemMutexLinuxRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMilli } -#undef RTSemMutexRequest RTDECL(int) RTSemMutexRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { return rtSemMutexLinuxRequest(hMutexSem, cMillies, false /*fInterruptible*/); @@ -311,7 +311,6 @@ RTDECL(int) RTSemMutexRequestDebug(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies, RT_EXPORT_SYMBOL(RTSemMutexRequestDebug); -#undef RTSemMutexRequestNoResume RTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { return rtSemMutexLinuxRequest(hMutexSem, cMillies, true /*fInterruptible*/); diff --git a/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp b/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp index 875780ed3..fc885b288 100644 --- a/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp +++ b/src/VBox/Runtime/r0drv/nt/initterm-r0drv-nt.cpp @@ -83,6 +83,7 @@ int rtR0InitNative(void) #endif RTCpuSetEmpty(&g_rtMpNtCpuSet); RTCpuSetFromU64(&g_rtMpNtCpuSet, ActiveProcessors); +/** @todo Port to W2K8 with > 64 cpus/threads. */ #ifdef IPRT_TARGET_NT4 g_pfnrtNtExSetTimerResolution = NULL; diff --git a/src/VBox/Runtime/r0drv/nt/semevent-r0drv-nt.cpp b/src/VBox/Runtime/r0drv/nt/semevent-r0drv-nt.cpp index d738959f6..8cda329eb 100644 --- a/src/VBox/Runtime/r0drv/nt/semevent-r0drv-nt.cpp +++ b/src/VBox/Runtime/r0drv/nt/semevent-r0drv-nt.cpp @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENT_WITHOUT_REMAPPING #include "the-nt-kernel.h" #include <iprt/semaphore.h> @@ -248,7 +249,6 @@ DECLINLINE(int) rtR0SemEventNtWait(PRTSEMEVENTINTERNAL pThis, uint32_t fFlags, u } -#undef RTSemEventWaitEx RTDECL(int) RTSemEventWaitEx(RTSEMEVENT hEventSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/nt/semeventmulti-r0drv-nt.cpp b/src/VBox/Runtime/r0drv/nt/semeventmulti-r0drv-nt.cpp index e16a6bffa..50830f754 100644 --- a/src/VBox/Runtime/r0drv/nt/semeventmulti-r0drv-nt.cpp +++ b/src/VBox/Runtime/r0drv/nt/semeventmulti-r0drv-nt.cpp @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENTMULTI_WITHOUT_REMAPPING #include "the-nt-kernel.h" #include <iprt/semaphore.h> @@ -271,7 +272,6 @@ DECLINLINE(int) rtR0SemEventMultiNtWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t } -#undef RTSemEventMultiWaitEx RTDECL(int) RTSemEventMultiWaitEx(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/nt/semmutex-r0drv-nt.cpp b/src/VBox/Runtime/r0drv/nt/semmutex-r0drv-nt.cpp index 1079a55a5..71e02e35c 100644 --- a/src/VBox/Runtime/r0drv/nt/semmutex-r0drv-nt.cpp +++ b/src/VBox/Runtime/r0drv/nt/semmutex-r0drv-nt.cpp @@ -29,6 +29,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMMUTEX_WITHOUT_REMAPPING #include "the-nt-kernel.h" #include <iprt/semaphore.h> #include <iprt/alloc.h> @@ -168,7 +169,6 @@ static int rtSemMutexRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies, BOOLEA } -#undef RTSemMutexRequest RTDECL(int) RTSemMutexRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { return rtSemMutexRequest(hMutexSem, cMillies, FALSE /*fInterruptible*/); @@ -181,7 +181,6 @@ RTDECL(int) RTSemMutexRequestDebug(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies, } -#undef RTSemMutexRequestNoResume RTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { return rtSemMutexRequest(hMutexSem, cMillies, TRUE /*fInterruptible*/); diff --git a/src/VBox/Runtime/r0drv/solaris/semevent-r0drv-solaris.c b/src/VBox/Runtime/r0drv/solaris/semevent-r0drv-solaris.c index 66ed05b45..b8921218f 100644 --- a/src/VBox/Runtime/r0drv/solaris/semevent-r0drv-solaris.c +++ b/src/VBox/Runtime/r0drv/solaris/semevent-r0drv-solaris.c @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENT_WITHOUT_REMAPPING #include "the-solaris-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -63,8 +64,8 @@ typedef struct RTSEMEVENTSOLENTRY RTLISTNODE Node; /** The thread. */ kthread_t *pThread; - /** Flag set when waking up the thread by signal or destroy. */ - bool volatile fWokenUp; + /** Set to @c true when waking up the thread by signal or destroy. */ + uint32_t volatile fWokenUp; } RTSEMEVENTSOLENTRY; /** Pointer to waiter entry. */ typedef RTSEMEVENTSOLENTRY *PRTSEMEVENTSOLENTRY; @@ -297,7 +298,7 @@ static int rtR0SemEventSolWait(PRTSEMEVENTINTERNAL pThis, uint32_t fFlags, uint6 else { /* Do the wait and then recheck the conditions. */ - rtR0SemSolWaitDoIt(&Wait, &pThis->Cnd, &pThis->Mtx); + rtR0SemSolWaitDoIt(&Wait, &pThis->Cnd, &pThis->Mtx, &Waiter.fWokenUp, false); continue; } } @@ -315,7 +316,6 @@ static int rtR0SemEventSolWait(PRTSEMEVENTINTERNAL pThis, uint32_t fFlags, uint6 } -#undef RTSemEventWaitEx RTDECL(int) RTSemEventWaitEx(RTSEMEVENT hEventSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c b/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c index 5b812c9fe..6f7fc5ca7 100644 --- a/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c +++ b/src/VBox/Runtime/r0drv/solaris/semeventmulti-r0drv-solaris.c @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMEVENTMULTI_WITHOUT_REMAPPING #include "the-solaris-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -302,7 +303,7 @@ static int rtR0SemEventMultiSolWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t fFl else { /* Do the wait and then recheck the conditions. */ - rtR0SemSolWaitDoIt(&Wait, &pThis->Cnd, &pThis->Mtx); + rtR0SemSolWaitDoIt(&Wait, &pThis->Cnd, &pThis->Mtx, &pThis->fStateAndGen, fOrgStateAndGen); continue; } } @@ -319,7 +320,6 @@ static int rtR0SemEventMultiSolWait(PRTSEMEVENTMULTIINTERNAL pThis, uint32_t fFl -#undef RTSemEventMultiWaitEx RTDECL(int) RTSemEventMultiWaitEx(RTSEMEVENTMULTI hEventMultiSem, uint32_t fFlags, uint64_t uTimeout) { #ifndef RTSEMEVENT_STRICT diff --git a/src/VBox/Runtime/r0drv/solaris/semeventwait-r0drv-solaris.h b/src/VBox/Runtime/r0drv/solaris/semeventwait-r0drv-solaris.h index 53fb0b8ee..45fd29aac 100644 --- a/src/VBox/Runtime/r0drv/solaris/semeventwait-r0drv-solaris.h +++ b/src/VBox/Runtime/r0drv/solaris/semeventwait-r0drv-solaris.h @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -38,6 +38,10 @@ /** The resolution (nanoseconds) specified when using timeout_generic. */ #define RTR0SEMSOLWAIT_RESOLUTION 50000 +/** Disables the cyclic fallback code for old S10 installs - see @bugref{5342}. + * @todo Fixed by @bugref{5595}, can be reenabled after checking out + * CY_HIGH_LEVEL. */ +#define RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK /** * Solaris semaphore wait structure. @@ -59,6 +63,9 @@ typedef struct RTR0SEMSOLWAIT bool fHighRes; /** Set if it's an indefinite wait. */ bool fIndefinite; + /** Set if the waiting thread is ready to be woken up. + * Avoids false setrun() calls due to temporary mutex exits. */ + bool volatile fWantWakeup; /** Set if we've already timed out. * Set by rtR0SemSolWaitDoIt or rtR0SemSolWaitHighResTimeout, read by * rtR0SemSolWaitHasTimedOut. */ @@ -69,7 +76,7 @@ typedef struct RTR0SEMSOLWAIT bool fInterruptible; /** The thread to wake up. */ kthread_t *pThread; -#if 0 /* @bugref{5342} */ +#ifndef RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK /** Cylic timer ID (used by the timeout callback). */ cyclic_id_t idCy; #endif @@ -136,7 +143,10 @@ DECLINLINE(int) rtR0SemSolWaitInit(PRTR0SEMSOLWAIT pWait, uint32_t fFlags, uint6 pWait->fIndefinite = false; if ( ( (fFlags & (RTSEMWAIT_FLAGS_NANOSECS | RTSEMWAIT_FLAGS_ABSOLUTE)) || pWait->cNsRelTimeout < UINT32_C(1000000000) / 100 /*Hz*/ * 4) - && g_pfnrtR0Sol_timeout_generic != NULL /* See @bugref{5342} */) +#ifdef RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK + && g_pfnrtR0Sol_timeout_generic != NULL +#endif + ) pWait->fHighRes = true; else { @@ -160,12 +170,13 @@ DECLINLINE(int) rtR0SemSolWaitInit(PRTR0SEMSOLWAIT pWait, uint32_t fFlags, uint6 pWait->u.lTimeout = LONG_MAX; } + pWait->fWantWakeup = false; pWait->fTimedOut = false; pWait->fInterrupted = false; pWait->fInterruptible = !!(fFlags & RTSEMWAIT_FLAGS_INTERRUPTIBLE); pWait->pThread = curthread; pWait->pvMtx = NULL; -#if 0 /* @bugref{5342} */ +#ifndef RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK pWait->idCy = CYCLIC_NONE; #endif @@ -173,7 +184,7 @@ DECLINLINE(int) rtR0SemSolWaitInit(PRTR0SEMSOLWAIT pWait, uint32_t fFlags, uint6 } -#if 0 /* @bugref{5342} */ +#ifndef RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK /** * Cyclic timeout callback that sets the timeout indicator and wakes up the * waiting thread. @@ -190,18 +201,18 @@ static void rtR0SemSolWaitHighResTimeout(void *pvUser) /* Enter the mutex here to make sure the thread has gone to sleep before we wake it up. Note: Trying to take the cpu_lock here doesn't work. */ - /** @todo LOCK ORDER INVERSION (pMtx & cpu_lock when arming the timer, here it's inverted). - * Possible fix: Use the thread lock for sleep/wakeup race prevention - * instead of the mutex associated with the cv/event. */ mutex_enter(pMtx); if (mutex_owner(&cpu_lock) == curthread) { cyclic_remove(pWait->idCy); pWait->idCy = CYCLIC_NONE; } + bool const fWantWakeup = pWait->fWantWakeup; ASMAtomicWriteBool(&pWait->fTimedOut, true); mutex_exit(pMtx); - setrun(pThread); + + if (fWantWakeup) + setrun(pThread); } } #endif @@ -223,9 +234,12 @@ static void rtR0SemSolWaitTimeout(void *pvUser) /* Enter the mutex here to make sure the thread has gone to sleep before we wake it up. */ mutex_enter(pMtx); + bool const fWantWakeup = pWait->fWantWakeup; ASMAtomicWriteBool(&pWait->fTimedOut, true); mutex_exit(pMtx); - setrun(pThread); + + if (fWantWakeup) + setrun(pThread); } } @@ -237,8 +251,16 @@ static void rtR0SemSolWaitTimeout(void *pvUser) * @param pCnd The condition variable to wait on. * @param pMtx The mutex related to the condition variable. * The caller has entered this. + * @param pfState The state variable to check if have changed + * after leaving the mutex (spinlock). + * @param fCurState The current value of @a pfState. We'll return + * without sleeping if @a pfState doesn't hold + * this value after reacquiring the mutex. + * + * @remarks This must be call with the object mutex (spinlock) held. */ -DECLINLINE(void) rtR0SemSolWaitDoIt(PRTR0SEMSOLWAIT pWait, kcondvar_t *pCnd, kmutex_t *pMtx) +DECLINLINE(void) rtR0SemSolWaitDoIt(PRTR0SEMSOLWAIT pWait, kcondvar_t *pCnd, kmutex_t *pMtx, + uint32_t volatile *pfState, uint32_t const fCurState) { union { @@ -248,15 +270,24 @@ DECLINLINE(void) rtR0SemSolWaitDoIt(PRTR0SEMSOLWAIT pWait, kcondvar_t *pCnd, kmu /* * Arm the timeout callback. + * + * We will have to leave the mutex (spinlock) when doing this because S10 + * (didn't check S11) will not correctly preserve PIL across calls to + * timeout_generic() - @bugref{5595}. We do it for all timeout methods to + * be on the safe side, the nice sideeffect of which is that it solves the + * lock inversion problem found in @bugref{5342}. */ - bool const fHasTimeout = !pWait->fIndefinite; + bool const fHasTimeout = !pWait->fIndefinite; + bool fGoToSleep = !fHasTimeout; if (fHasTimeout) { + pWait->fWantWakeup = false; /* only want fTimedOut */ ASMAtomicWritePtr(&pWait->pvMtx, pMtx); /* atomic is paranoia */ + mutex_exit(pMtx); if (pWait->fHighRes) { -#if 0 /* @bugref{5342} */ +#ifndef RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK if (g_pfnrtR0Sol_timeout_generic != NULL) #endif { @@ -268,7 +299,7 @@ DECLINLINE(void) rtR0SemSolWaitDoIt(PRTR0SEMSOLWAIT pWait, kcondvar_t *pCnd, kmu pWait->uNsAbsTimeout, RTR0SEMSOLWAIT_RESOLUTION, CALLOUT_FLAG_ABSOLUTE); } -#if 0 /* @bugref{5342} */ +#ifndef RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK else { /* @@ -299,43 +330,59 @@ DECLINLINE(void) rtR0SemSolWaitDoIt(PRTR0SEMSOLWAIT pWait, kcondvar_t *pCnd, kmu */ u.idTom = realtime_timeout(rtR0SemSolWaitTimeout, pWait, pWait->u.lTimeout); } + + /* + * Reacquire the mutex and check if the sleep condition still holds and + * that we didn't already time out. + */ + mutex_enter(pMtx); + pWait->fWantWakeup = true; + fGoToSleep = !ASMAtomicUoReadBool(&pWait->fTimedOut) + && ASMAtomicReadU32(pfState) == fCurState; } /* - * Do the waiting. + * Do the waiting if that's still desirable. * (rc > 0 - normal wake-up; rc == 0 - interruption; rc == -1 - timeout) */ - if (pWait->fInterruptible) + if (fGoToSleep) { - int rc = cv_wait_sig(pCnd, pMtx); - if (RT_UNLIKELY(rc <= 0)) + if (pWait->fInterruptible) { - if (RT_LIKELY(rc == 0)) - pWait->fInterrupted = true; - else - AssertMsgFailed(("rc=%d\n", rc)); /* no timeouts, see above! */ + int rc = cv_wait_sig(pCnd, pMtx); + if (RT_UNLIKELY(rc <= 0)) + { + if (RT_LIKELY(rc == 0)) + pWait->fInterrupted = true; + else + AssertMsgFailed(("rc=%d\n", rc)); /* no timeouts, see above! */ + } } + else + cv_wait(pCnd, pMtx); } - else - cv_wait(pCnd, pMtx); /* * Remove the timeout callback. Drop the lock while we're doing that - * to reduce lock contention / deadlocks. (Too bad we are stuck with the - * cv_* API here, it's doing a little bit too much.) + * to reduce lock contention / deadlocks. Before dropping the lock, + * indicate that the callback shouldn't do anything. + * + * (Too bad we are stuck with the cv_* API here, it's doing a little + * bit too much.) */ if (fHasTimeout) { + pWait->fWantWakeup = false; ASMAtomicWritePtr(&pWait->pvMtx, NULL); mutex_exit(pMtx); if (pWait->fHighRes) { -#if 0 /* @bugref{5342} */ +#ifndef RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK if (g_pfnrtR0Sol_timeout_generic != NULL) #endif g_pfnrtR0Sol_untimeout_generic(u.idCo, 0 /*nowait*/); -#if 0 /* @bugref{5342} */ +#ifndef RTR0SEMSOLWAIT_NO_OLD_S10_FALLBACK else { mutex_enter(&cpu_lock); diff --git a/src/VBox/Runtime/r0drv/solaris/semmutex-r0drv-solaris.c b/src/VBox/Runtime/r0drv/solaris/semmutex-r0drv-solaris.c index 94c4bbac3..8394c4d3c 100644 --- a/src/VBox/Runtime/r0drv/solaris/semmutex-r0drv-solaris.c +++ b/src/VBox/Runtime/r0drv/solaris/semmutex-r0drv-solaris.c @@ -28,6 +28,7 @@ /******************************************************************************* * Header Files * *******************************************************************************/ +#define RTSEMMUTEX_WITHOUT_REMAPPING #include "the-solaris-kernel.h" #include "internal/iprt.h" #include <iprt/semaphore.h> @@ -301,7 +302,6 @@ DECLINLINE(int) rtSemMutexSolarisRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMil } -#undef RTSemMutexRequest RTDECL(int) RTSemMutexRequest(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { return rtSemMutexSolarisRequest(hMutexSem, cMillies, false /*fInterruptible*/); @@ -314,7 +314,6 @@ RTDECL(int) RTSemMutexRequestDebug(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies, } -#undef RTSemMutexRequestNoResume RTDECL(int) RTSemMutexRequestNoResume(RTSEMMUTEX hMutexSem, RTMSINTERVAL cMillies) { return rtSemMutexSolarisRequest(hMutexSem, cMillies, true /*fInterruptible*/); diff --git a/src/VBox/Runtime/r0drv/solaris/vbi/i86pc/os/vbi.c b/src/VBox/Runtime/r0drv/solaris/vbi/i86pc/os/vbi.c index c0d26a698..4f0304222 100644 --- a/src/VBox/Runtime/r0drv/solaris/vbi/i86pc/os/vbi.c +++ b/src/VBox/Runtime/r0drv/solaris/vbi/i86pc/os/vbi.c @@ -70,6 +70,15 @@ extern void contig_free(void *, size_t); static void (*p_contig_free)(void *, size_t) = contig_free; /* + * We have to use dl_lookup to find kflt_init() and thereby use kernel pages from + * the freelists if we no longer get user pages from freelist and cachelists. + */ +/* Introduced in v9 */ +static int use_kflt = 0; +page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr); + + +/* * Workarounds for running on old versions of solaris with different cross call * interfaces. If we find xc_init_cpu() in the kernel, then just use the defined * interfaces for xc_call() from the include file where the xc_call() @@ -244,6 +253,21 @@ vbi_init(void) } /* + * Use kernel page freelist flags to get pages from kernel page freelists + * while allocating physical pages, once the userpages are exhausted. + * snv_161+, see @bugref{5632}. + */ + if (kobj_getsymvalue("kflt_init", 1) != NULL) + { + int *p_kflt_disable = (int*)kobj_getsymvalue("kflt_disable", 1); /* amd64 only, on 32-bit kflt's are disabled. */ + if (p_kflt_disable && *p_kflt_disable == 0) + { + use_kflt = 1; + } + } + + + /* * Check if this is S10 or Nevada */ if (!strncmp(utsname.release, "5.11", sizeof("5.11") - 1)) { @@ -1304,19 +1328,15 @@ vbi_pages_alloc(uint64_t *phys, size_t size) * get pages from kseg, the 'virtAddr' here is only for colouring but unfortunately * we don't have the 'virtAddr' to which this memory may be mapped. */ - seg_t kernseg; - kernseg.s_as = &kas; caddr_t virtAddr = NULL; for (int64_t i = 0; i < npages; i++, virtAddr += PAGESIZE) { - /* get a page from the freelist */ - page_t *ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr, - PAGESIZE, 0 /* flags */, NULL /* local group */); + /* get a page from the freelists */ + page_t *ppage = vbi_page_get_fromlist(1 /* freelist */, virtAddr); if (!ppage) { - /* try from the cachelist */ - ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr, - 0 /* flags */, NULL /* local group */); + /* try from the cachelists */ + ppage = vbi_page_get_fromlist(2 /* cachelist */, virtAddr); if (!ppage) { /* damn */ @@ -1412,10 +1432,50 @@ vbi_page_to_pa(page_t **pp_pages, pgcnt_t i) return (uint64_t)pfn << PAGESHIFT; } + +/* + * This is revision 9 of the interface. + */ +page_t *vbi_page_get_fromlist(uint_t freelist, caddr_t virtAddr) +{ + seg_t kernseg; + kernseg.s_as = &kas; + page_t *ppage = NULL; + if (freelist == 1) + { + ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr, + PAGESIZE, 0 /* flags */, NULL /* local group */); + if (!ppage) + { + if (use_kflt) + { + ppage = page_get_freelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr, + PAGESIZE, 0x0200 /* PG_KFLT */, NULL /* local group */); + } + } + } + else + { + /* cachelist */ + ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr, + 0 /* flags */, NULL /* local group */); + if (!ppage) + { + if (use_kflt) + { + ppage = page_get_cachelist(&vbipagevp, 0 /* offset */, &kernseg, virtAddr, + 0x0200 /* PG_KFLT */, NULL /* local group */); + } + } + } + return ppage; +} + + /* * As more functions are added, they should start with a comment indicating * the revision and above this point in the file and the revision level should * be increased. Also change vbi_modlmisc at the top of the file. */ -uint_t vbi_revision_level = 8; +uint_t vbi_revision_level = 9; diff --git a/src/VBox/Runtime/r0drv/solaris/vbi/mp-r0drv-solaris.c b/src/VBox/Runtime/r0drv/solaris/vbi/mp-r0drv-solaris.c index ecbdfa7c2..11106cd54 100644 --- a/src/VBox/Runtime/r0drv/solaris/vbi/mp-r0drv-solaris.c +++ b/src/VBox/Runtime/r0drv/solaris/vbi/mp-r0drv-solaris.c @@ -56,7 +56,7 @@ RTDECL(RTCPUID) RTMpCpuId(void) RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) { - return idCpu < vbi_cpu_maxcount() ? idCpu : -1; + return idCpu < RTCPUSET_MAX_CPUS && idCpu < vbi_cpu_maxcount() ? idCpu : -1; } diff --git a/src/VBox/Runtime/r3/darwin/mp-darwin.cpp b/src/VBox/Runtime/r3/darwin/mp-darwin.cpp index df7eb3763..a03ca41e5 100644 --- a/src/VBox/Runtime/r3/darwin/mp-darwin.cpp +++ b/src/VBox/Runtime/r3/darwin/mp-darwin.cpp @@ -69,7 +69,7 @@ static RTCPUID rtMpDarwinMaxCpus(void) RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) { - return idCpu < rtMpDarwinMaxCpus() ? idCpu : -1; + return idCpu < RTCPUSET_MAX_CPUS && idCpu < rtMpDarwinMaxCpus() ? idCpu : -1; } diff --git a/src/VBox/Runtime/r3/freebsd/mp-freebsd.cpp b/src/VBox/Runtime/r3/freebsd/mp-freebsd.cpp index 35c6fc1ce..8296025b0 100644 --- a/src/VBox/Runtime/r3/freebsd/mp-freebsd.cpp +++ b/src/VBox/Runtime/r3/freebsd/mp-freebsd.cpp @@ -65,7 +65,7 @@ static RTCPUID rtMpFreeBsdMaxCpus(void) RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) { - return idCpu < rtMpFreeBsdMaxCpus() ? idCpu : -1; + return idCpu < RTCPUSET_MAX_CPUS && idCpu < rtMpFreeBsdMaxCpus() ? idCpu : -1; } diff --git a/src/VBox/Runtime/r3/solaris/coredumper-solaris.cpp b/src/VBox/Runtime/r3/solaris/coredumper-solaris.cpp index be71d7548..6f6b1c7fe 100644 --- a/src/VBox/Runtime/r3/solaris/coredumper-solaris.cpp +++ b/src/VBox/Runtime/r3/solaris/coredumper-solaris.cpp @@ -52,6 +52,9 @@ # include <sys/sysmacros.h> # include <sys/systeminfo.h> # include <sys/mman.h> +# include <sys/types.h> +# include <sys/stat.h> +# include <fcntl.h> # include <ucontext.h> #endif /* RT_OS_SOLARIS */ @@ -211,15 +214,15 @@ static inline bool IsProcessArchNative(PVBOXPROCESS pVBoxProc) static size_t GetFileSize(const char *pszPath) { uint64_t cb = 0; - RTFILE hFile; - int rc = RTFileOpen(&hFile, pszPath, RTFILE_O_OPEN | RTFILE_O_READ); - if (RT_SUCCESS(rc)) + int fd = open(pszPath, O_RDONLY); + if (fd >= 0) { + RTFILE hFile = fd; RTFileGetSize(hFile, &cb); RTFileClose(hFile); } else - CORELOGRELSYS((CORELOG_NAME "GetFileSize failed to open %s rc=%Rrc\n", pszPath, rc)); + CORELOGRELSYS((CORELOG_NAME "GetFileSize: failed to open %s rc=%Rrc\n", pszPath, RTErrConvertFromErrno(fd))); return cb < ~(size_t)0 ? (size_t)cb : ~(size_t)0; } @@ -349,7 +352,9 @@ static void *GetMemoryChunk(PVBOXCORE pVBoxCore, size_t cb) * @param ppv Where to store the allocated buffer. * @param pcb Where to store size of the buffer. * - * @return IPRT status code. + * @return IPRT status code. If the proc file is 0 bytes, VINF_SUCCESS is + * returned with pointed to values of @c ppv, @c pcb set to NULL and 0 + * respectively. */ static int ProcReadFileInto(PVBOXCORE pVBoxCore, const char *pszProcFileName, void **ppv, size_t *pcb) { @@ -357,10 +362,11 @@ static int ProcReadFileInto(PVBOXCORE pVBoxCore, const char *pszProcFileName, vo char szPath[PATH_MAX]; RTStrPrintf(szPath, sizeof(szPath), "/proc/%d/%s", (int)pVBoxCore->VBoxProc.Process, pszProcFileName); - RTFILE hFile; - int rc = RTFileOpen(&hFile, szPath, RTFILE_O_OPEN | RTFILE_O_READ); - if (RT_SUCCESS(rc)) + int rc = VINF_SUCCESS; + int fd = open(szPath, O_RDONLY); + if (fd >= 0) { + RTFILE hFile = fd; uint64_t u64Size; RTFileGetSize(hFile, &u64Size); *pcb = u64Size < ~(size_t)0 ? u64Size : ~(size_t)0; @@ -376,11 +382,15 @@ static int ProcReadFileInto(PVBOXCORE pVBoxCore, const char *pszProcFileName, vo { *pcb = 0; *ppv = NULL; + rc = VINF_SUCCESS; } RTFileClose(hFile); } else + { + rc = RTErrConvertFromErrno(fd); CORELOGRELSYS((CORELOG_NAME "ProcReadFileInto: failed to open %s. rc=%Rrc\n", szPath, rc)); + } return rc; } @@ -398,17 +408,23 @@ static int ProcReadInfo(PVBOXCORE pVBoxCore) PVBOXPROCESS pVBoxProc = &pVBoxCore->VBoxProc; char szPath[PATH_MAX]; - RTFILE hFile; + int rc = VINF_SUCCESS; RTStrPrintf(szPath, sizeof(szPath), "/proc/%d/psinfo", (int)pVBoxProc->Process); - int rc = RTFileOpen(&hFile, szPath, RTFILE_O_OPEN | RTFILE_O_READ); - if (RT_SUCCESS(rc)) + int fd = open(szPath, O_RDONLY); + if (fd >= 0) { + RTFILE hFile = fd; size_t cbProcInfo = sizeof(psinfo_t); rc = ReadFileNoIntr(hFile, &pVBoxProc->ProcInfo, cbProcInfo); + RTFileClose(hFile); + } + else + { + rc = RTErrConvertFromErrno(fd); + CORELOGRELSYS((CORELOG_NAME "ProcReadInfo: failed to open %s. rc=%Rrc\n", szPath, rc)); } - RTFileClose(hFile); return rc; } @@ -427,18 +443,24 @@ static int ProcReadStatus(PVBOXCORE pVBoxCore) PVBOXPROCESS pVBoxProc = &pVBoxCore->VBoxProc; char szPath[PATH_MAX]; - RTFILE hFile; + int rc = VINF_SUCCESS; RTStrPrintf(szPath, sizeof(szPath), "/proc/%d/status", (int)pVBoxProc->Process); - int rc = RTFileOpen(&hFile, szPath, RTFILE_O_OPEN | RTFILE_O_READ); - if (RT_SUCCESS(rc)) + int fd = open(szPath, O_RDONLY); + if (fd >= 0) { + RTFILE hFile = fd; size_t cbRead; size_t cbProcStatus = sizeof(pstatus_t); AssertCompile(sizeof(pstatus_t) == sizeof(pVBoxProc->ProcStatus)); rc = ReadFileNoIntr(hFile, &pVBoxProc->ProcStatus, cbProcStatus); + RTFileClose(hFile); + } + else + { + rc = RTErrConvertFromErrno(fd); + CORELOGRELSYS((CORELOG_NAME "ProcReadStatus: failed to open %s. rc=%Rrc\n", szPath, rc)); } - RTFileClose(hFile); return rc; } @@ -517,15 +539,17 @@ static int ProcReadAuxVecs(PVBOXCORE pVBoxCore) PVBOXPROCESS pVBoxProc = &pVBoxCore->VBoxProc; char szPath[PATH_MAX]; - RTFILE hFile = NIL_RTFILE; + int rc = VINF_SUCCESS; RTStrPrintf(szPath, sizeof(szPath), "/proc/%d/auxv", (int)pVBoxProc->Process); - int rc = RTFileOpen(&hFile, szPath, RTFILE_O_OPEN | RTFILE_O_READ); - if (RT_FAILURE(rc)) + int fd = open(szPath, O_RDONLY); + if (fd < 0) { - CORELOGRELSYS((CORELOG_NAME "ProcReadAuxVecs: RTFileOpen %s failed rc=%Rrc\n", szPath, rc)); + rc = RTErrConvertFromErrno(fd); + CORELOGRELSYS((CORELOG_NAME "ProcReadAuxVecs: failed to open %s rc=%Rrc\n", szPath, rc)); return rc; } + RTFILE hFile = fd; uint64_t u64Size; RTFileGetSize(hFile, &u64Size); size_t cbAuxFile = u64Size < ~(size_t)0 ? u64Size : ~(size_t)0; @@ -567,7 +591,10 @@ static int ProcReadAuxVecs(PVBOXCORE pVBoxCore) } } else + { CORELOGRELSYS((CORELOG_NAME "ProcReadAuxVecs: aux file too small %u, expecting %u or more\n", cbAuxFile, sizeof(auxv_t))); + rc = VERR_READ_ERROR; + } RTFileClose(hFile); return rc; @@ -607,16 +634,23 @@ static int ProcReadMappings(PVBOXCORE pVBoxCore) PVBOXPROCESS pVBoxProc = &pVBoxCore->VBoxProc; char szPath[PATH_MAX]; - RTFILE hFile = NIL_RTFILE; + int rc = VINF_SUCCESS; RTStrPrintf(szPath, sizeof(szPath), "/proc/%d/map", (int)pVBoxProc->Process); - int rc = RTFileOpen(&hFile, szPath, RTFILE_O_OPEN | RTFILE_O_READ); - if (RT_FAILURE(rc)) + int fd = open(szPath, O_RDONLY); + if (fd < 0) + { + rc = RTErrConvertFromErrno(fd); + CORELOGRELSYS((CORELOG_NAME "ProcReadMappings: failed to open %s. rc=%Rrc\n", szPath, rc)); return rc; + } + RTFILE hFile = fd; RTStrPrintf(szPath, sizeof(szPath), "/proc/%d/as", (int)pVBoxProc->Process); - rc = RTFileOpen(&pVBoxProc->hAs, szPath, RTFILE_O_OPEN | RTFILE_O_READ); - if (RT_SUCCESS(rc)) + fd = open(szPath, O_RDONLY); + if (fd >= 0) { + pVBoxProc->hAs = fd; + /* * Allocate and read all the prmap_t objects from proc. */ @@ -868,7 +902,7 @@ static int ProcReadThreads(PVBOXCORE pVBoxCore) } } else - CORELOGRELSYS((CORELOG_NAME "ProcReadThreads: Invalid state information for threads.\n", rc)); + CORELOGRELSYS((CORELOG_NAME "ProcReadThreads: Invalid state information for threads. rc=%Rrc\n", rc)); } else { @@ -1146,10 +1180,11 @@ static int rtCoreDumperForEachThread(PVBOXCORE pVBoxCore, uint64_t *pcThreads, char szLpsInfoPath[PATH_MAX]; RTStrPrintf(szLpsInfoPath, sizeof(szLpsInfoPath), "/proc/%d/lpsinfo", (int)pVBoxProc->Process); - RTFILE hFile = NIL_RTFILE; - int rc = RTFileOpen(&hFile, szLpsInfoPath, RTFILE_O_READ); - if (RT_SUCCESS(rc)) + int rc = VINF_SUCCESS; + int fd = open(szLpsInfoPath, O_RDONLY); + if (fd >= 0) { + RTFILE hFile = fd; uint64_t u64Size; RTFileGetSize(hFile, &u64Size); size_t cbInfoHdrAndData = u64Size < ~(size_t)0 ? u64Size : ~(size_t)0; @@ -1176,6 +1211,8 @@ static int rtCoreDumperForEachThread(PVBOXCORE pVBoxCore, uint64_t *pcThreads, rc = VERR_NO_MEMORY; RTFileClose(hFile); } + else + rc = RTErrConvertFromErrno(rc); return rc; } @@ -1751,7 +1788,8 @@ static int ElfWriteMappingHeaders(PVBOXCORE pVBoxCore) * @param pVBoxCore Pointer to the core object. * @param pfnWriter Pointer to the writer function to override default writer (NULL uses default). * - * @remarks Resumes all suspended threads, unless it's an invalid core. + * @remarks Resumes all suspended threads, unless it's an invalid core. This + * function must be called only -after- rtCoreDumperCreateCore(). * @return VBox status. */ static int rtCoreDumperWriteCore(PVBOXCORE pVBoxCore, PFNCOREWRITER pfnWriter) @@ -1766,29 +1804,35 @@ static int rtCoreDumperWriteCore(PVBOXCORE pVBoxCore, PFNCOREWRITER pfnWriter) PVBOXPROCESS pVBoxProc = &pVBoxCore->VBoxProc; char szPath[PATH_MAX]; + int rc = VINF_SUCCESS; /* * Open the process address space file. */ RTStrPrintf(szPath, sizeof(szPath), "/proc/%d/as", (int)pVBoxProc->Process); - int rc = RTFileOpen(&pVBoxProc->hAs, szPath, RTFILE_O_OPEN | RTFILE_O_READ); - if (RT_FAILURE(rc)) + int fd = open(szPath, O_RDONLY); + if (fd < 0) { + rc = RTErrConvertFromErrno(fd); CORELOGRELSYS((CORELOG_NAME "WriteCore: Failed to open address space, %s. rc=%Rrc\n", szPath, rc)); goto WriteCoreDone; } + pVBoxProc->hAs = fd; + /* * Create the core file. */ - rc = RTFileOpen(&pVBoxCore->hCoreFile, pVBoxCore->szCorePath, - RTFILE_O_OPEN_CREATE | RTFILE_O_TRUNCATE | RTFILE_O_READWRITE | RTFILE_O_DENY_ALL); - if (RT_FAILURE(rc)) + fd = open(pVBoxCore->szCorePath, O_CREAT | O_TRUNC | O_RDWR, S_IRUSR); + if (fd < 0) { + rc = RTErrConvertFromErrno(fd); CORELOGRELSYS((CORELOG_NAME "WriteCore: failed to open %s. rc=%Rrc\n", pVBoxCore->szCorePath, rc)); goto WriteCoreDone; } + pVBoxCore->hCoreFile = fd; + pVBoxCore->offWrite = 0; uint32_t cProgHdrs = pVBoxProc->cMappings + 2; /* two PT_NOTE program headers (old, new style) */ @@ -1903,13 +1947,13 @@ static int rtCoreDumperWriteCore(PVBOXCORE pVBoxCore, PFNCOREWRITER pfnWriter) WriteCoreDone: - if (pVBoxCore->hCoreFile != NIL_RTFILE) + if (pVBoxCore->hCoreFile != NIL_RTFILE) /* Initialized in rtCoreDumperCreateCore() */ { RTFileClose(pVBoxCore->hCoreFile); pVBoxCore->hCoreFile = NIL_RTFILE; } - if (pVBoxProc->hAs != NIL_RTFILE) + if (pVBoxProc->hAs != NIL_RTFILE) /* Initialized in rtCoreDumperCreateCore() */ { RTFileClose(pVBoxProc->hAs); pVBoxProc->hAs = NIL_RTFILE; diff --git a/src/VBox/Runtime/r3/win/RTSystemQueryDmiString-win.cpp b/src/VBox/Runtime/r3/win/RTSystemQueryDmiString-win.cpp index c6516b913..578319106 100644 --- a/src/VBox/Runtime/r3/win/RTSystemQueryDmiString-win.cpp +++ b/src/VBox/Runtime/r3/win/RTSystemQueryDmiString-win.cpp @@ -61,6 +61,8 @@ static HRESULT rtSystemDmiWinInitialize(void) NULL); /* Reserved. */ if (hrc == RPC_E_TOO_LATE) hrc = S_OK; + else if (FAILED(hrc)) + CoUninitialize(); } return hrc; } diff --git a/src/VBox/Runtime/r3/win/fileio-win.cpp b/src/VBox/Runtime/r3/win/fileio-win.cpp index 97c39fc16..de9f2b011 100644 --- a/src/VBox/Runtime/r3/win/fileio-win.cpp +++ b/src/VBox/Runtime/r3/win/fileio-win.cpp @@ -403,7 +403,54 @@ RTR3DECL(int) RTFileRead(RTFILE File, void *pvBuf, size_t cbToRead, size_t *pcb } return VINF_SUCCESS; } - return RTErrConvertFromWin32(GetLastError()); + + /* + * If it's a console, we might bump into out of memory conditions in the + * ReadConsole call. + */ + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_NOT_ENOUGH_MEMORY) + { + ULONG cbChunk = cbToReadAdj / 2; + if (cbChunk > 16*_1K) + cbChunk = 16*_1K; + else + cbChunk = RT_ALIGN_32(cbChunk, 256); + + cbRead = 0; + while (cbToReadAdj > cbRead) + { + ULONG cbToRead = RT_MIN(cbChunk, cbToReadAdj - cbRead); + ULONG cbReadPart = 0; + if (!ReadFile((HANDLE)File, (char *)pvBuf + cbRead, cbToRead, &cbReadPart, NULL)) + { + /* If we failed because the buffer is too big, shrink it and + try again. */ + dwErr = GetLastError(); + if ( dwErr == ERROR_NOT_ENOUGH_MEMORY + && cbChunk > 8) + { + cbChunk /= 2; + continue; + } + return RTErrConvertFromWin32(dwErr); + } + cbRead += cbReadPart; + + /* Return if the caller can handle partial reads, otherwise try + fill the buffer all the way up. */ + if (pcbRead) + { + *pcbRead = cbRead; + break; + } + if (cbReadPart == 0) + return VERR_EOF; + } + return VINF_SUCCESS; + } + + return RTErrConvertFromWin32(dwErr); } @@ -442,7 +489,58 @@ RTR3DECL(int) RTFileWrite(RTFILE File, const void *pvBuf, size_t cbToWrite, siz } return VINF_SUCCESS; } - int rc = RTErrConvertFromWin32(GetLastError()); + + /* + * If it's a console, we might bump into out of memory conditions in the + * WriteConsole call. + */ + DWORD dwErr = GetLastError(); + if (dwErr == ERROR_NOT_ENOUGH_MEMORY) + { + ULONG cbChunk = cbToWriteAdj / 2; + if (cbChunk > _32K) + cbChunk = _32K; + else + cbChunk = RT_ALIGN_32(cbChunk, 256); + + cbWritten = 0; + while (cbToWriteAdj > cbWritten) + { + ULONG cbToWrite = RT_MIN(cbChunk, cbToWriteAdj - cbWritten); + ULONG cbWrittenPart = 0; + if (!WriteFile((HANDLE)File, (const char *)pvBuf + cbWritten, cbToWrite, &cbWrittenPart, NULL)) + { + /* If we failed because the buffer is too big, shrink it and + try again. */ + dwErr = GetLastError(); + if ( dwErr == ERROR_NOT_ENOUGH_MEMORY + && cbChunk > 8) + { + cbChunk /= 2; + continue; + } + int rc = RTErrConvertFromWin32(dwErr); + if ( rc == VERR_DISK_FULL + && IsBeyondLimit(File, cbToWriteAdj - cbWritten, FILE_CURRENT)) + rc = VERR_FILE_TOO_BIG; + return rc; + } + cbWritten += cbWrittenPart; + + /* Return if the caller can handle partial writes, otherwise try + write out everything. */ + if (pcbWritten) + { + *pcbWritten = cbWritten; + break; + } + if (cbWrittenPart == 0) + return VERR_WRITE_ERROR; + } + return VINF_SUCCESS; + } + + int rc = RTErrConvertFromWin32(dwErr); if ( rc == VERR_DISK_FULL && IsBeyondLimit(File, cbToWriteAdj - cbWritten, FILE_CURRENT)) rc = VERR_FILE_TOO_BIG; diff --git a/src/VBox/Runtime/r3/win/mp-win.cpp b/src/VBox/Runtime/r3/win/mp-win.cpp index e23b958a1..fed1152ba 100644 --- a/src/VBox/Runtime/r3/win/mp-win.cpp +++ b/src/VBox/Runtime/r3/win/mp-win.cpp @@ -35,6 +35,9 @@ #include <iprt/assert.h> +AssertCompile(MAXIMUM_PROCESSORS <= RTCPUSET_MAX_CPUS); + + /** @todo RTmpCpuId(). */ RTDECL(int) RTMpCpuIdToSetIndex(RTCPUID idCpu) @@ -92,6 +95,7 @@ RTDECL(PRTCPUSET) RTMpGetOnlineSet(PRTCPUSET pSet) { SYSTEM_INFO SysInfo; GetSystemInfo(&SysInfo); +/** @todo port to W2K8 / W7 w/ > 64 CPUs & grouping. */ return RTCpuSetFromU64(pSet, SysInfo.dwActiveProcessorMask); } diff --git a/src/VBox/Runtime/r3/win/thread-win.cpp b/src/VBox/Runtime/r3/win/thread-win.cpp index c2d31cca6..58bcbbe53 100644 --- a/src/VBox/Runtime/r3/win/thread-win.cpp +++ b/src/VBox/Runtime/r3/win/thread-win.cpp @@ -1,10 +1,10 @@ /* $Id: thread-win.cpp $ */ /** @file - * IPRT - Threads, Win32. + * IPRT - Threads, Windows. */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -96,6 +96,93 @@ int rtThreadNativeAdopt(PRTTHREADINT pThread) /** + * Bitch about dangling COM and OLE references, dispose of them + * afterwards so we don't end up deadlocked somewhere below + * OLE32!DllMain. + */ +static void rtThreadNativeUninitComAndOle(void) +{ +#if 1 /* experimental code */ + /* + * Read the counters. + */ + struct MySOleTlsData + { + void *apvReserved0[2]; /**< x86=0x00 W7/64=0x00 */ + DWORD adwReserved0[3]; /**< x86=0x08 W7/64=0x10 */ + void *apvReserved1[1]; /**< x86=0x14 W7/64=0x20 */ + DWORD cComInits; /**< x86=0x18 W7/64=0x28 */ + DWORD cOleInits; /**< x86=0x1c W7/64=0x2c */ + DWORD dwReserved1; /**< x86=0x20 W7/64=0x30 */ + void *apvReserved2[4]; /**< x86=0x24 W7/64=0x38 */ + DWORD adwReserved2[1]; /**< x86=0x34 W7/64=0x58 */ + void *pvCurrentCtx; /**< x86=0x38 W7/64=0x60 */ + IUnknown *pCallState; /**< x86=0x3c W7/64=0x68 */ + } *pOleTlsData = NULL; /* outside the try/except for debugging */ + DWORD cComInits = 0; + DWORD cOleInits = 0; + __try + { + void *pvTeb = NtCurrentTeb(); +# ifdef RT_ARCH_AMD64 + pOleTlsData = *(struct MySOleTlsData **)((uintptr_t)pvTeb + 0x1758); /*TEB.ReservedForOle*/ +# elif RT_ARCH_X86 + pOleTlsData = *(struct MySOleTlsData **)((uintptr_t)pvTeb + 0x0f80); /*TEB.ReservedForOle*/ +# else +# error "Port me!" +# endif + if (pOleTlsData) + { + cComInits = pOleTlsData->cComInits; + cOleInits = pOleTlsData->cOleInits; + } + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + AssertFailedReturnVoid(); + } + + /* + * Assert sanity. If any of these breaks, the structure layout above is + * probably not correct any longer. + */ + AssertMsgReturnVoid(cComInits < 1000, ("%u (%#x)\n", cComInits, cComInits)); + AssertMsgReturnVoid(cOleInits < 1000, ("%u (%#x)\n", cOleInits, cOleInits)); + AssertMsgReturnVoid(cComInits >= cOleInits, ("cComInits=%#x cOleInits=%#x\n", cComInits, cOleInits)); + + /* + * Do the uninitializing. + */ + if (cComInits) + { + AssertMsgFailed(("cComInits=%u (%#x) cOleInits=%u (%#x) - dangling COM/OLE inits!\n", + cComInits, cComInits, cOleInits, cOleInits)); + + HMODULE hOle32 = GetModuleHandle("OLE32"); + AssertReturnVoid(hOle32 != NULL); + + typedef void (WINAPI *PFNOLEUNINITIALIZE)(void); + PFNOLEUNINITIALIZE pfnOleUninitialize = (PFNOLEUNINITIALIZE)GetProcAddress(hOle32, "OleUninitialize"); + AssertReturnVoid(pfnOleUninitialize); + + typedef void (WINAPI *PFNCOUNINITIALIZE)(void); + PFNCOUNINITIALIZE pfnCoUninitialize = (PFNCOUNINITIALIZE)GetProcAddress(hOle32, "CoUninitialize"); + AssertReturnVoid(pfnCoUninitialize); + + while (cOleInits-- > 0) + { + pfnOleUninitialize(); + cComInits--; + } + + while (cComInits-- > 0) + pfnCoUninitialize(); + } +#endif +} + + +/** * Wrapper which unpacks the param stuff and calls thread function. */ static unsigned __stdcall rtThreadNativeMain(void *pvArgs) @@ -109,6 +196,7 @@ static unsigned __stdcall rtThreadNativeMain(void *pvArgs) int rc = rtThreadMain(pThread, dwThreadId, &pThread->szName[0]); TlsSetValue(g_dwSelfTLS, NULL); + rtThreadNativeUninitComAndOle(); _endthreadex(rc); return rc; } @@ -245,3 +333,4 @@ RTR3DECL(int) RTThreadGetExecutionTimeMilli(uint64_t *pKernelTime, uint64_t *pUs AssertMsgFailed(("GetThreadTimes failed, LastError=%d\n", iLastError)); return RTErrConvertFromWin32(iLastError); } + diff --git a/src/VBox/Runtime/r3/xml.cpp b/src/VBox/Runtime/r3/xml.cpp index 602917250..c1007a4da 100644 --- a/src/VBox/Runtime/r3/xml.cpp +++ b/src/VBox/Runtime/r3/xml.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2007-2010 Oracle Corporation + * Copyright (C) 2007-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -1307,11 +1307,13 @@ struct Document::Data { xmlDocPtr plibDocument; ElementNode *pRootElement; + ElementNode *pComment; Data() { plibDocument = NULL; pRootElement = NULL; + pComment = NULL; } ~Data() @@ -1402,7 +1404,8 @@ ElementNode* Document::getRootElement() * Creates a new element node and sets it as the root element. This will * only work if the document is empty; otherwise EDocumentNotEmpty is thrown. */ -ElementNode* Document::createRootElement(const char *pcszRootElementName) +ElementNode* Document::createRootElement(const char *pcszRootElementName, + const char *pcszComment /* = NULL */) { if (m->pRootElement || m->plibDocument) throw EDocumentNotEmpty(RT_SRC_POS); @@ -1414,10 +1417,21 @@ ElementNode* Document::createRootElement(const char *pcszRootElementName) (const xmlChar*)pcszRootElementName))) throw std::bad_alloc(); xmlDocSetRootElement(m->plibDocument, plibRootNode); - // now wrap this in C++ m->pRootElement = new ElementNode(NULL, NULL, plibRootNode); + // add document global comment if specified + if (pcszComment != NULL) + { + xmlNode *pComment; + if (!(pComment = xmlNewDocComment(m->plibDocument, + (const xmlChar *)pcszComment))) + throw std::bad_alloc(); + xmlAddPrevSibling(plibRootNode, pComment); + // now wrap this in C++ + m->pComment = new ElementNode(NULL, NULL, pComment); + } + return m->pRootElement; } diff --git a/src/VBox/Storage/ISCSI.cpp b/src/VBox/Storage/ISCSI.cpp index 8abe19752..a89cb1df8 100644 --- a/src/VBox/Storage/ISCSI.cpp +++ b/src/VBox/Storage/ISCSI.cpp @@ -41,6 +41,9 @@ * Defined Constants And Macros * *******************************************************************************/ +/** The maximum number of release log entries per image. */ +#define MAX_LOG_REL_ERRORS 1024 + /** Default port number to use for iSCSI. */ #define ISCSI_DEFAULT_PORT 3260 @@ -626,6 +629,9 @@ typedef struct ISCSIIMAGE unsigned cCmdsWaiting; /** Table of commands waiting for a response from the target. */ PISCSICMD aCmdsWaiting[ISCSI_CMD_WAITING_ENTRIES]; + + /** Release log counter. */ + unsigned cLogRelErrors; } ISCSIIMAGE; @@ -697,6 +703,20 @@ static void chap_md5_generate_challenge(uint8_t *pbChallenge, size_t *pcbChallen static void chap_md5_compute_response(uint8_t *pbResponse, uint8_t id, const uint8_t *pbChallenge, size_t cbChallenge, const uint8_t *pbSecret, size_t cbSecret); +/** + * Internal: release log wrapper limiting the number of entries. + */ +DECLINLINE(void) iscsiLogRel(PISCSIIMAGE pImage, const char *pcszFormat, ...) +{ + if (pImage->cLogRelErrors++ < MAX_LOG_REL_ERRORS) + { + va_list va; + + va_start(va, pcszFormat); + LogRel(("%N\n", pcszFormat, &va)); + va_end(va); + } +} /** * Internal: signal an error to the frontend. @@ -3379,7 +3399,7 @@ static DECLCALLBACK(int) iscsiIoThreadWorker(RTTHREAD ThreadSelf, void *pvUser) if (rc == VERR_BROKEN_PIPE) iscsiReattach(pImage); else if (RT_FAILURE(rc)) - LogRel(("iSCSI: Handling incoming request failed %Rrc\n", rc)); + iscsiLogRel(pImage, "iSCSI: Handling incoming request failed %Rrc\n", rc); } if (fEvents & VD_INTERFACETCPNET_EVT_WRITE) @@ -3387,7 +3407,14 @@ static DECLCALLBACK(int) iscsiIoThreadWorker(RTTHREAD ThreadSelf, void *pvUser) LogFlow(("The socket is writable\n")); rc = iscsiSendPDUAsync(pImage); if (RT_FAILURE(rc)) - LogRel(("iSCSI: Sending PDU failed %Rrc\n", rc)); + { + /* + * Something unexpected happened, log the error and try to reset everything + * by reattaching to the target. + */ + iscsiLogRel(pImage, "iSCSI: Sending PDU failed %Rrc\n", rc); + iscsiReattach(pImage); + } } if (fEvents & VD_INTERFACETCPNET_EVT_ERROR) @@ -3397,9 +3424,7 @@ static DECLCALLBACK(int) iscsiIoThreadWorker(RTTHREAD ThreadSelf, void *pvUser) } } else - { - LogRel(("iSCSI: Waiting for I/O failed rc=%Rrc\n", rc)); - } + iscsiLogRel(pImage, "iSCSI: Waiting for I/O failed rc=%Rrc\n", rc); } return VINF_SUCCESS; @@ -4423,6 +4448,7 @@ static int iscsiOpen(const char *pszFilename, unsigned uOpenFlags, pImage->pszHostname = NULL; pImage->pVDIfsDisk = pVDIfsDisk; pImage->pVDIfsImage = pVDIfsImage; + pImage->cLogRelErrors = 0; rc = iscsiOpenImage(pImage, uOpenFlags); if (RT_SUCCESS(rc)) diff --git a/src/VBox/Storage/VD.cpp b/src/VBox/Storage/VD.cpp index 719311e1c..60d8664e3 100644 --- a/src/VBox/Storage/VD.cpp +++ b/src/VBox/Storage/VD.cpp @@ -212,6 +212,8 @@ struct VBOXHDD volatile bool fLocked; /** List of waiting requests. - Protected by the critical section. */ RTLISTNODE ListWriteLocked; + /** I/O context which locked the disk. */ + PVDIOCTX pIoCtxLockOwner; /** Pointer to the L2 disk cache if any. */ PVDCACHE pCache; @@ -1199,67 +1201,94 @@ out: return rc; } +DECLINLINE(bool) vdIoCtxIsDiskLockOwner(PVBOXHDD pDisk, PVDIOCTX pIoCtx) +{ + return pDisk->fLocked + && pDisk->pIoCtxLockOwner == pIoCtx; +} + static int vdIoCtxLockDisk(PVBOXHDD pDisk, PVDIOCTX pIoCtx) { int rc = VINF_SUCCESS; + LogFlowFunc(("pDisk=%#p pIoCtx=%#p\n", pDisk, pIoCtx)); + if (!ASMAtomicCmpXchgBool(&pDisk->fLocked, true, false)) { + Assert(pDisk->pIoCtxLockOwner != pIoCtx); /* No nesting allowed. */ + rc = vdIoCtxDefer(pDisk, pIoCtx); if (RT_SUCCESS(rc)) rc = VERR_VD_ASYNC_IO_IN_PROGRESS; } + else + { + Assert(!pDisk->pIoCtxLockOwner); + pDisk->pIoCtxLockOwner = pIoCtx; + } + LogFlowFunc(("returns -> %Rrc\n", rc)); return rc; } -static void vdIoCtxUnlockDisk(PVBOXHDD pDisk, PVDIOCTX pIoCtx) +static void vdIoCtxUnlockDisk(PVBOXHDD pDisk, PVDIOCTX pIoCtx, bool fProcessDeferredReqs) { + LogFlowFunc(("pDisk=%#p pIoCtx=%#p fProcessDeferredReqs=%RTbool\n", + pDisk, pIoCtx, fProcessDeferredReqs)); + + LogFlow(("Unlocking disk lock owner is %#p\n", pDisk->pIoCtxLockOwner)); Assert(pDisk->fLocked); + Assert(pDisk->pIoCtxLockOwner == pIoCtx); + pDisk->pIoCtxLockOwner = NULL; ASMAtomicXchgBool(&pDisk->fLocked, false); - /* Process any pending writes if the current request didn't caused another growing. */ - RTCritSectEnter(&pDisk->CritSect); - - if (!RTListIsEmpty(&pDisk->ListWriteLocked)) + if (fProcessDeferredReqs) { - RTLISTNODE ListTmp; - - RTListMove(&ListTmp, &pDisk->ListWriteLocked); - RTCritSectLeave(&pDisk->CritSect); + /* Process any pending writes if the current request didn't caused another growing. */ + RTCritSectEnter(&pDisk->CritSect); - /* Process the list. */ - do + if (!RTListIsEmpty(&pDisk->ListWriteLocked)) { - int rc; - PVDIOCTXDEFERRED pDeferred = RTListGetFirst(&ListTmp, VDIOCTXDEFERRED, NodeDeferred); - PVDIOCTX pIoCtxWait = pDeferred->pIoCtx; + RTLISTNODE ListTmp; - AssertPtr(pIoCtxWait); + RTListMove(&ListTmp, &pDisk->ListWriteLocked); + RTCritSectLeave(&pDisk->CritSect); - RTListNodeRemove(&pDeferred->NodeDeferred); - RTMemFree(pDeferred); + /* Process the list. */ + do + { + int rc; + PVDIOCTXDEFERRED pDeferred = RTListGetFirst(&ListTmp, VDIOCTXDEFERRED, NodeDeferred); + PVDIOCTX pIoCtxWait = pDeferred->pIoCtx; - Assert(!pIoCtxWait->pIoCtxParent); + AssertPtr(pIoCtxWait); - pIoCtxWait->fBlocked = false; - LogFlowFunc(("Processing waiting I/O context pIoCtxWait=%#p\n", pIoCtxWait)); + RTListNodeRemove(&pDeferred->NodeDeferred); + RTMemFree(pDeferred); - rc = vdIoCtxProcess(pIoCtxWait); - if ( rc == VINF_VD_ASYNC_IO_FINISHED - && ASMAtomicCmpXchgBool(&pIoCtxWait->fComplete, true, false)) - { - LogFlowFunc(("Waiting I/O context completed pIoCtxWait=%#p\n", pIoCtxWait)); - vdThreadFinishWrite(pDisk); - pIoCtxWait->Type.Root.pfnComplete(pIoCtxWait->Type.Root.pvUser1, - pIoCtxWait->Type.Root.pvUser2, - pIoCtxWait->rcReq); - vdIoCtxFree(pDisk, pIoCtxWait); - } - } while (!RTListIsEmpty(&ListTmp)); + Assert(!pIoCtxWait->pIoCtxParent); + + pIoCtxWait->fBlocked = false; + LogFlowFunc(("Processing waiting I/O context pIoCtxWait=%#p\n", pIoCtxWait)); + + rc = vdIoCtxProcess(pIoCtxWait); + if ( rc == VINF_VD_ASYNC_IO_FINISHED + && ASMAtomicCmpXchgBool(&pIoCtxWait->fComplete, true, false)) + { + LogFlowFunc(("Waiting I/O context completed pIoCtxWait=%#p\n", pIoCtxWait)); + vdThreadFinishWrite(pDisk); + pIoCtxWait->Type.Root.pfnComplete(pIoCtxWait->Type.Root.pvUser1, + pIoCtxWait->Type.Root.pvUser2, + pIoCtxWait->rcReq); + vdIoCtxFree(pDisk, pIoCtxWait); + } + } while (!RTListIsEmpty(&ListTmp)); + } + else + RTCritSectLeave(&pDisk->CritSect); } - else - RTCritSectLeave(&pDisk->CritSect); + + LogFlowFunc(("returns\n")); } /** @@ -1294,10 +1323,10 @@ static int vdReadHelperAsync(PVDIOCTX pIoCtx) if (rc == VERR_VD_BLOCK_FREE) { - for (pCurrImage = pCurrImage->pPrev; - pCurrImage != NULL && rc == VERR_VD_BLOCK_FREE; - pCurrImage = pCurrImage->pPrev) + while ( pCurrImage->pPrev != NULL + && rc == VERR_VD_BLOCK_FREE) { + pCurrImage = pCurrImage->pPrev; rc = pCurrImage->Backend->pfnAsyncRead(pCurrImage->pBackendData, uOffset, cbThisRead, pIoCtx, &cbThisRead); @@ -1639,6 +1668,71 @@ static int vdWriteHelper(PVBOXHDD pDisk, PVDIMAGE pImage, } /** + * Flush helper async version. + */ +static int vdSetModifiedHelperAsync(PVDIOCTX pIoCtx) +{ + int rc = VINF_SUCCESS; + PVBOXHDD pDisk = pIoCtx->pDisk; + PVDIMAGE pImage = pIoCtx->pImageCur; + + rc = pImage->Backend->pfnAsyncFlush(pImage->pBackendData, pIoCtx); + if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS) + rc = VINF_SUCCESS; + + return rc; +} + +/** + * internal: mark the disk as modified - async version. + */ +static int vdSetModifiedFlagAsync(PVBOXHDD pDisk, PVDIOCTX pIoCtx) +{ + int rc = VINF_SUCCESS; + + pDisk->uModified |= VD_IMAGE_MODIFIED_FLAG; + if (pDisk->uModified & VD_IMAGE_MODIFIED_FIRST) + { + rc = vdIoCtxLockDisk(pDisk, pIoCtx); + if (RT_SUCCESS(rc)) + { + pDisk->uModified &= ~VD_IMAGE_MODIFIED_FIRST; + + /* First modify, so create a UUID and ensure it's written to disk. */ + vdResetModifiedFlag(pDisk); + + if (!(pDisk->uModified & VD_IMAGE_MODIFIED_DISABLE_UUID_UPDATE)) + { + PVDIOCTX pIoCtxFlush = vdIoCtxChildAlloc(pDisk, VDIOCTXTXDIR_FLUSH, + 0, 0, pDisk->pLast, + NULL, pIoCtx, 0, 0, NULL, + vdSetModifiedHelperAsync); + + if (pIoCtxFlush) + { + rc = vdIoCtxProcess(pIoCtxFlush); + if (rc == VINF_VD_ASYNC_IO_FINISHED) + { + vdIoCtxUnlockDisk(pDisk, pIoCtxFlush, false /* fProcessDeferredReqs */); + vdIoCtxFree(pDisk, pIoCtxFlush); + } + else if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS) + { + pIoCtx->fBlocked = true; + } + else /* Another error */ + vdIoCtxFree(pDisk, pIoCtxFlush); + } + else + rc = VERR_NO_MEMORY; + } + } + } + + return rc; +} + +/** * internal: write a complete block (only used for diff images), taking the * remaining data from parent images. This implementation does not optimize * anything (except that it tries to read only that portions from parent @@ -1927,6 +2021,10 @@ static int vdWriteHelperAsync(PVDIOCTX pIoCtx) size_t cbThisWrite; size_t cbPreRead, cbPostRead; + rc = vdSetModifiedFlagAsync(pDisk, pIoCtx); + if (RT_FAILURE(rc)) /* Includes I/O in progress. */ + return rc; + /* Loop until all written. */ do { @@ -1997,7 +2095,7 @@ static int vdWriteHelperAsync(PVDIOCTX pIoCtx) LogFlow(("Child write request completed\n")); Assert(pIoCtx->cbTransferLeft >= cbThisWrite); ASMAtomicSubU32(&pIoCtx->cbTransferLeft, cbThisWrite); - ASMAtomicWriteBool(&pDisk->fLocked, false); + vdIoCtxUnlockDisk(pDisk, pIoCtx, false /* fProcessDeferredReqs*/ ); vdIoCtxFree(pDisk, pIoCtxWrite); rc = VINF_SUCCESS; @@ -2067,6 +2165,8 @@ static int vdFlushHelperAsync(PVDIOCTX pIoCtx) rc = pImage->Backend->pfnAsyncFlush(pImage->pBackendData, pIoCtx); if (rc == VERR_VD_ASYNC_IO_IN_PROGRESS) rc = VINF_SUCCESS; + else if (rc == VINF_VD_ASYNC_IO_FINISHED) + vdIoCtxUnlockDisk(pDisk, pIoCtx, true /* fProcessDeferredReqs */); } return rc; @@ -2488,24 +2588,27 @@ static int vdIoCtxContinue(PVDIOCTX pIoCtx, int rcReq) { PVDIOCTX pIoCtxParent = pIoCtx->pIoCtxParent; - LogFlowFunc(("I/O context transferred %u bytes for the parent pIoCtxParent=%p\n", - pIoCtx->Type.Child.cbTransferParent, pIoCtxParent)); - - /* Update the parent state. */ Assert(!pIoCtxParent->pIoCtxParent); - Assert(pIoCtx->enmTxDir == VDIOCTXTXDIR_WRITE); - Assert(pIoCtxParent->cbTransferLeft >= pIoCtx->Type.Child.cbTransferParent); - ASMAtomicSubU32(&pIoCtxParent->cbTransferLeft, pIoCtx->Type.Child.cbTransferParent); - if (RT_FAILURE(pIoCtx->rcReq)) ASMAtomicCmpXchgS32(&pIoCtxParent->rcReq, pIoCtx->rcReq, VINF_SUCCESS); + if (pIoCtx->enmTxDir == VDIOCTXTXDIR_WRITE) + { + LogFlowFunc(("I/O context transferred %u bytes for the parent pIoCtxParent=%p\n", + pIoCtx->Type.Child.cbTransferParent, pIoCtxParent)); + + /* Update the parent state. */ + Assert(pIoCtxParent->cbTransferLeft >= pIoCtx->Type.Child.cbTransferParent); + ASMAtomicSubU32(&pIoCtxParent->cbTransferLeft, pIoCtx->Type.Child.cbTransferParent); + } + else + Assert(pIoCtx->enmTxDir == VDIOCTXTXDIR_FLUSH); + /* * A completed child write means that we finished growing the image. * We have to process any pending writes now. */ - Assert(pDisk->fLocked); - ASMAtomicWriteBool(&pDisk->fLocked, false); + vdIoCtxUnlockDisk(pDisk, pIoCtxParent, false /* fProcessDeferredReqs */); /* Unblock the parent */ pIoCtxParent->fBlocked = false; @@ -2526,7 +2629,8 @@ static int vdIoCtxContinue(PVDIOCTX pIoCtx, int rcReq) /* Process any pending writes if the current request didn't caused another growing. */ RTCritSectEnter(&pDisk->CritSect); - if (!RTListIsEmpty(&pDisk->ListWriteLocked) && !pDisk->fLocked) + if ( !RTListIsEmpty(&pDisk->ListWriteLocked) + && !vdIoCtxIsDiskLockOwner(pDisk, pIoCtx)) { RTLISTNODE ListTmp; @@ -2576,7 +2680,7 @@ static int vdIoCtxContinue(PVDIOCTX pIoCtx, int rcReq) { if (pIoCtx->enmTxDir == VDIOCTXTXDIR_FLUSH) { - vdIoCtxUnlockDisk(pDisk, pIoCtx); + vdIoCtxUnlockDisk(pDisk, pIoCtx, true /* fProcessDerredReqs */); vdThreadFinishWrite(pDisk); } else if (pIoCtx->enmTxDir == VDIOCTXTXDIR_WRITE) @@ -2896,6 +3000,8 @@ static int vdIOIntReadUserAsync(void *pvUser, PVDIOSTORAGE pIoStorage, VD_THREAD_IS_CRITSECT_OWNER(pDisk); + Assert(cbRead > 0); + /* Build the S/G array and spawn a new I/O task */ while (cbRead) { @@ -2905,6 +3011,8 @@ static int vdIOIntReadUserAsync(void *pvUser, PVDIOSTORAGE pIoStorage, cbTaskRead = RTSgBufSegArrayCreate(&pIoCtx->SgBuf, aSeg, &cSegments, cbRead); + Assert(cSegments > 0); + Assert(cbTaskRead > 0); AssertMsg(cbTaskRead <= cbRead, ("Invalid number of bytes to read\n")); LogFlow(("Reading %u bytes into %u segments\n", cbTaskRead, cSegments)); @@ -2938,6 +3046,7 @@ static int vdIOIntReadUserAsync(void *pvUser, PVDIOSTORAGE pIoStorage, else if (rc != VERR_VD_ASYNC_IO_IN_PROGRESS) { ASMAtomicDecU32(&pIoCtx->cDataTransfersPending); + vdIoTaskFree(pDisk, pIoTask); break; } @@ -2964,6 +3073,8 @@ static int vdIOIntWriteUserAsync(void *pvUser, PVDIOSTORAGE pIoStorage, VD_THREAD_IS_CRITSECT_OWNER(pDisk); + Assert(cbWrite > 0); + /* Build the S/G array and spawn a new I/O task */ while (cbWrite) { @@ -2973,6 +3084,8 @@ static int vdIOIntWriteUserAsync(void *pvUser, PVDIOSTORAGE pIoStorage, cbTaskWrite = RTSgBufSegArrayCreate(&pIoCtx->SgBuf, aSeg, &cSegments, cbWrite); + Assert(cSegments > 0); + Assert(cbTaskWrite > 0); AssertMsg(cbTaskWrite <= cbWrite, ("Invalid number of bytes to write\n")); LogFlow(("Writing %u bytes from %u segments\n", cbTaskWrite, cSegments)); @@ -3006,6 +3119,7 @@ static int vdIOIntWriteUserAsync(void *pvUser, PVDIOSTORAGE pIoStorage, else if (rc != VERR_VD_ASYNC_IO_IN_PROGRESS) { ASMAtomicDecU32(&pIoCtx->cDataTransfersPending); + vdIoTaskFree(pDisk, pIoTask); break; } @@ -3360,6 +3474,21 @@ static size_t vdIOIntIoCtxSegArrayCreate(void *pvUser, PVDIOCTX pIoCtx, static void vdIOIntIoCtxCompleted(void *pvUser, PVDIOCTX pIoCtx, int rcReq, size_t cbCompleted) { + PVDIO pVDIo = (PVDIO)pvUser; + PVBOXHDD pDisk = pVDIo->pDisk; + + /* + * Grab the disk critical section to avoid races with other threads which + * might still modify the I/O context. + * Example is that iSCSI is doing an asynchronous write but calls us already + * while the other thread is still hanging in vdWriteHelperAsync and couldn't update + * the fBlocked state yet. + * It can overwrite the state to true before we call vdIoCtxContinue and the + * the request would hang indefinite. + */ + int rc = RTCritSectEnter(&pDisk->CritSect); + AssertRC(rc); + /* Continue */ pIoCtx->fBlocked = false; ASMAtomicSubU32(&pIoCtx->cbTransferLeft, cbCompleted); @@ -3369,6 +3498,9 @@ static void vdIOIntIoCtxCompleted(void *pvUser, PVDIOCTX pIoCtx, int rcReq, if (!pIoCtx->cbTransferLeft) pIoCtx->pfnIoCtxTransfer = NULL; + rc = RTCritSectLeave(&pDisk->CritSect); + AssertRC(rc); + vdIoCtxContinue(pIoCtx, rcReq); } @@ -3738,6 +3870,7 @@ VBOXDDU_DECL(int) VDCreate(PVDINTERFACE pVDIfsDisk, VDTYPE enmType, PVBOXHDD *pp pDisk->pInterfaceThreadSync = NULL; pDisk->pInterfaceThreadSyncCallbacks = NULL; pDisk->fLocked = false; + pDisk->pIoCtxLockOwner = NULL; RTListInit(&pDisk->ListWriteLocked); /* Create the I/O ctx cache */ diff --git a/src/VBox/Storage/VMDK.cpp b/src/VBox/Storage/VMDK.cpp index 99d771bca..468f28315 100644 --- a/src/VBox/Storage/VMDK.cpp +++ b/src/VBox/Storage/VMDK.cpp @@ -2451,9 +2451,7 @@ static int vmdkParseDescriptor(PVMDKIMAGE pImage, char *pDescData, RTUuidClear(&pImage->ParentModificationUuid); else { - rc = RTUuidCreate(&pImage->ParentModificationUuid); - if (RT_FAILURE(rc)) - return rc; + RTUuidClear(&pImage->ParentModificationUuid); rc = vmdkDescDDBSetUuid(pImage, &pImage->Descriptor, VMDK_DDB_PARENT_MODIFICATION_UUID, &pImage->ParentModificationUuid); diff --git a/src/VBox/Storage/testcase/vditool.cpp b/src/VBox/Storage/testcase/vditool.cpp index 94d5beb5f..9bec31e71 100644 --- a/src/VBox/Storage/testcase/vditool.cpp +++ b/src/VBox/Storage/testcase/vditool.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2010 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -397,8 +397,9 @@ int main(int argc, char **argv) PRTLOGGER pLogger; static const char * const s_apszGroups[] = VBOX_LOGGROUP_NAMES; int rc = RTLogCreate(&pLogger, 0, "all", - NULL, RT_ELEMENTS(s_apszGroups), s_apszGroups, - RTLOGDEST_STDOUT, NULL); + NULL, RT_ELEMENTS(s_apszGroups), s_apszGroups, RTLOGDEST_STDOUT, + NULL /* pfnBeginEnd */, 0 /* cHistory */, 0 /* cbHistoryFileMax */, 0 /* uHistoryTimeMax */, + NULL); RTLogRelSetDefaultInstance(pLogger); if (strcmp(szCmd, "NEW") == 0) diff --git a/src/VBox/VMM/VMMR0/CPUMR0.cpp b/src/VBox/VMM/VMMR0/CPUMR0.cpp index b4bec8aaf..e3e889816 100644 --- a/src/VBox/VMM/VMMR0/CPUMR0.cpp +++ b/src/VBox/VMM/VMMR0/CPUMR0.cpp @@ -44,7 +44,7 @@ typedef struct uint64_t PhysBase; RTR0MEMOBJ hMemObj; RTR0MEMOBJ hMapObj; - void *pv; + void *pv; uint32_t fHasThermal; } CPUMHOSTLAPIC; @@ -645,10 +645,10 @@ VMMR0DECL(int) CPUMR0LoadHyperDebugState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, b */ static void cpumR0MapLocalApicWorker(RTCPUID idCpu, void *pvUser1, void *pvUser2) { - uint32_t u32MaxIdx; - uint32_t u32EBX, u32ECX, u32EDX; int iCpu = RTMpCpuIdToSetIndex(idCpu); - Assert(iCpu < RTCPUSET_MAX_CPUS); + AssertReturnVoid(iCpu >= 0 && (unsigned)iCpu < RT_ELEMENTS(g_aLApics)); + + uint32_t u32MaxIdx, u32EBX, u32ECX, u32EDX; ASMCpuId(0, &u32MaxIdx, &u32EBX, &u32ECX, &u32EDX); if ( ( ( u32EBX == X86_CPUID_VENDOR_INTEL_EBX && u32ECX == X86_CPUID_VENDOR_INTEL_ECX @@ -663,9 +663,10 @@ static void cpumR0MapLocalApicWorker(RTCPUID idCpu, void *pvUser1, void *pvUser2 && (u32EDX & X86_CPUID_FEATURE_EDX_MSR)) { uint64_t u64ApicBase = ASMRdMsr(MSR_IA32_APICBASE); - uint32_t u32MaxExtIdx; + uint64_t u64Mask = UINT64_C(0x0000000ffffff000); + /* see Intel Manual: Local APIC Status and Location: MAXPHYADDR default is bit 36 */ - uint64_t u64Mask = UINT64_C(0x0000000ffffff000); + uint32_t u32MaxExtIdx; ASMCpuId(0x80000000, &u32MaxExtIdx, &u32EBX, &u32ECX, &u32EDX); if ( u32MaxExtIdx >= 0x80000008 && u32MaxExtIdx < 0x8000ffff) @@ -675,6 +676,7 @@ static void cpumR0MapLocalApicWorker(RTCPUID idCpu, void *pvUser1, void *pvUser2 u32PhysBits &= 0xff; u64Mask = ((UINT64_C(1) << u32PhysBits) - 1) & UINT64_C(0xfffffffffffff000); } + g_aLApics[iCpu].fEnabled = true; g_aLApics[iCpu].PhysBase = u64ApicBase & u64Mask; } @@ -687,7 +689,22 @@ static void cpumR0MapLocalApicWorker(RTCPUID idCpu, void *pvUser1, void *pvUser2 */ static int cpumR0MapLocalApics(void) { + /* + * Check that we'll always stay within the array bounds. + */ + if (RTMpGetArraySize() > RT_ELEMENTS(g_aLApics)) + { + LogRel(("CPUM: Too many real CPUs/cores/threads - %u, max %u\n", RTMpGetArraySize(), RT_ELEMENTS(g_aLApics))); + return VERR_TOO_MANY_CPUS; + } + + /* + * Create mappings for all online CPUs we think have APICs. + */ + /** @todo r=bird: This code is not adequately handling CPUs that are + * offline or unplugged at init time and later bought into action. */ int rc = RTMpOnAll(cpumR0MapLocalApicWorker, NULL, NULL); + for (unsigned iCpu = 0; RT_SUCCESS(rc) && iCpu < RT_ELEMENTS(g_aLApics); iCpu++) { if (g_aLApics[iCpu].fEnabled) @@ -695,27 +712,31 @@ static int cpumR0MapLocalApics(void) rc = RTR0MemObjEnterPhys(&g_aLApics[iCpu].hMemObj, g_aLApics[iCpu].PhysBase, PAGE_SIZE, RTMEM_CACHE_POLICY_MMIO); if (RT_SUCCESS(rc)) - rc = RTR0MemObjMapKernel(&g_aLApics[iCpu].hMapObj, g_aLApics[iCpu].hMemObj, (void*)-1, - PAGE_SIZE, RTMEM_PROT_READ | RTMEM_PROT_WRITE); - if (RT_SUCCESS(rc)) { - void *pApicBase = RTR0MemObjAddress(g_aLApics[iCpu].hMapObj); - uint32_t ApicVersion = ApicRegRead(pApicBase, APIC_REG_VERSION); - /* - * 0x0X 82489 external APIC - * 0x1X Local APIC - * 0x2X..0xFF reserved - */ - if ((APIC_REG_VERSION_GET_VER(ApicVersion) & 0xF0) != 0x10) + rc = RTR0MemObjMapKernel(&g_aLApics[iCpu].hMapObj, g_aLApics[iCpu].hMemObj, (void *)-1, + PAGE_SIZE, RTMEM_PROT_READ | RTMEM_PROT_WRITE); + if (RT_SUCCESS(rc)) { + void *pvApicBase = RTR0MemObjAddress(g_aLApics[iCpu].hMapObj); + + /* + * 0x0X 82489 external APIC + * 0x1X Local APIC + * 0x2X..0xFF reserved + */ + uint32_t ApicVersion = ApicRegRead(pvApicBase, APIC_REG_VERSION); + if ((APIC_REG_VERSION_GET_VER(ApicVersion) & 0xF0) == 0x10) + { + g_aLApics[iCpu].fHasThermal = APIC_REG_VERSION_GET_MAX_LVT(ApicVersion) >= 5; + g_aLApics[iCpu].pv = pvApicBase; + continue; + } + RTR0MemObjFree(g_aLApics[iCpu].hMapObj, true /* fFreeMappings */); - RTR0MemObjFree(g_aLApics[iCpu].hMemObj, true /* fFreeMappings */); - g_aLApics[iCpu].fEnabled = false; - continue; } - g_aLApics[iCpu].fHasThermal = APIC_REG_VERSION_GET_MAX_LVT(ApicVersion) >= 5; - g_aLApics[iCpu].pv = pApicBase; + RTR0MemObjFree(g_aLApics[iCpu].hMemObj, true /* fFreeMappings */); } + g_aLApics[iCpu].fEnabled = false; } } if (RT_FAILURE(rc)) @@ -739,8 +760,10 @@ static void cpumR0UnmapLocalApics(void) { RTR0MemObjFree(g_aLApics[iCpu].hMapObj, true /* fFreeMappings */); RTR0MemObjFree(g_aLApics[iCpu].hMemObj, true /* fFreeMappings */); + g_aLApics[iCpu].hMapObj = NIL_RTR0MEMOBJ; + g_aLApics[iCpu].hMemObj = NIL_RTR0MEMOBJ; g_aLApics[iCpu].fEnabled = false; - g_aLApics[iCpu].pv = NULL; + g_aLApics[iCpu].pv = NULL; } } } diff --git a/src/VBox/VMM/VMMR0/GVMMR0.cpp b/src/VBox/VMM/VMMR0/GVMMR0.cpp index 9eef03687..725eae6a3 100644 --- a/src/VBox/VMM/VMMR0/GVMMR0.cpp +++ b/src/VBox/VMM/VMMR0/GVMMR0.cpp @@ -2413,6 +2413,8 @@ GVMMR0DECL(int) GVMMR0QueryStatistics(PGVMMSTATS pStats, PSUPDRVSESSION pSession pStats->aHostCpus[iDstCpu].cStarts = 0; #endif iDstCpu++; + if (iDstCpu >= RT_ELEMENTS(pStats->aHostCpus)) + break; } } pStats->cHostCpus = iDstCpu; diff --git a/src/VBox/VMM/VMMR0/HWACCMR0.cpp b/src/VBox/VMM/VMMR0/HWACCMR0.cpp index c3cbd3558..c48b367c7 100644 --- a/src/VBox/VMM/VMMR0/HWACCMR0.cpp +++ b/src/VBox/VMM/VMMR0/HWACCMR0.cpp @@ -33,6 +33,7 @@ #include <iprt/asm.h> #include <iprt/asm-amd64-x86.h> #include <iprt/cpuset.h> +#include <iprt/mem.h> #include <iprt/memobj.h> #include <iprt/param.h> #include <iprt/power.h> @@ -46,8 +47,7 @@ *******************************************************************************/ static DECLCALLBACK(void) hwaccmR0EnableCpuCallback(RTCPUID idCpu, void *pvUser1, void *pvUser2); static DECLCALLBACK(void) hwaccmR0DisableCpuCallback(RTCPUID idCpu, void *pvUser1, void *pvUser2); -static DECLCALLBACK(void) HWACCMR0InitCPU(RTCPUID idCpu, void *pvUser1, void *pvUser2); -static int hwaccmR0CheckCpuRcArray(int *paRc, unsigned cErrorCodes, RTCPUID *pidCpu); +static DECLCALLBACK(void) hwaccmR0InitCpu(RTCPUID idCpu, void *pvUser1, void *pvUser2); static bool hwaccmR0IsSubjectToVmxPreemptionTimerErratum(void); static DECLCALLBACK(void) hwaccmR0PowerCallback(RTPOWEREVENT enmEvent, void *pvUser); @@ -142,6 +142,70 @@ static struct } HWACCMR0Globals; +/** + * This is used to manage the status code of a RTMpOnAll in HWACCM. + */ +typedef struct HWACCMR0FIRSTRC +{ + /** The status code. */ + int32_t volatile rc; + /** The ID of the CPU reporting the first failure. */ + RTCPUID volatile idCpu; +} HWACCMR0FIRSTRC; +/** Pointer to a first return code structure. */ +typedef HWACCMR0FIRSTRC *PHWACCMR0FIRSTRC; + + +/** + * Initializes a first return code structure. + * + * @param pFirstRc The structure to init. + */ +static void hwaccmR0FirstRcInit(PHWACCMR0FIRSTRC pFirstRc) +{ + pFirstRc->rc = VINF_SUCCESS; + pFirstRc->idCpu = NIL_RTCPUID; +} + + +/** + * Try se the status code (success ignored). + * + * @param pFirstRc The first return code structure. + * @param rc The status code. + */ +static void hwaccmR0FirstRcSetStatus(PHWACCMR0FIRSTRC pFirstRc, int rc) +{ + if ( RT_FAILURE(rc) + && ASMAtomicCmpXchgS32(&pFirstRc->rc, rc, VINF_SUCCESS)) + pFirstRc->idCpu = RTMpCpuId(); +} + + +/** + * Get the status code of a first return code structure. + * + * @returns The status code; VINF_SUCCESS or error status, no informational or + * warning errors. + * @param pFirstRc The first return code structure. + */ +static int hwaccmR0FirstRcGetStatus(PHWACCMR0FIRSTRC pFirstRc) +{ + return pFirstRc->rc; +} + + +/** + * Get the CPU ID on which the failure status code was reported. + * + * @returns The CPU ID, NIL_RTCPUID if no failure was reported. + * @param pFirstRc The first return code structure. + */ +static RTCPUID hwaccmR0FirstRcGetCpuId(PHWACCMR0FIRSTRC pFirstRc) +{ + return pFirstRc->idCpu; +} + /** * Does global Ring-0 HWACCM initialization. @@ -153,7 +217,6 @@ VMMR0DECL(int) HWACCMR0Init(void) int rc; bool fAMDVPresent = false; - memset(&HWACCMR0Globals, 0, sizeof(HWACCMR0Globals)); HWACCMR0Globals.enmHwAccmState = HWACCMSTATE_UNINITIALIZED; for (unsigned i = 0; i < RT_ELEMENTS(HWACCMR0Globals.aCpuInfo); i++) HWACCMR0Globals.aCpuInfo[i].pMemObj = NIL_RTR0MEMOBJ; @@ -174,6 +237,15 @@ VMMR0DECL(int) HWACCMR0Init(void) HWACCMR0Globals.fGlobalInit = true; /* + * Make sure aCpuInfo is big enough for all the CPUs on this system. + */ + if (RTMpGetArraySize() > RT_ELEMENTS(HWACCMR0Globals.aCpuInfo)) + { + LogRel(("HWACCM: Too many real CPUs/cores/threads - %u, max %u\n", RTMpGetArraySize(), RT_ELEMENTS(HWACCMR0Globals.aCpuInfo))); + return VERR_TOO_MANY_CPUS; + } + + /* * Check for VT-x and AMD-V capabilities */ if (ASMHasCpuId()) @@ -202,9 +274,6 @@ VMMR0DECL(int) HWACCMR0Init(void) && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_FXSR) ) { - int aRc[RTCPUSET_MAX_CPUS]; - RTCPUID idCpu = 0; - HWACCMR0Globals.vmx.msr.feature_ctrl = ASMRdMsr(MSR_IA32_FEATURE_CONTROL); /* @@ -228,12 +297,11 @@ VMMR0DECL(int) HWACCMR0Init(void) HWACCMR0Globals.vmx.fUsingSUPR0EnableVTx = false; /* We need to check if VT-x has been properly initialized on all CPUs. Some BIOSes do a lousy job. */ - memset(aRc, 0, sizeof(aRc)); - HWACCMR0Globals.lLastError = RTMpOnAll(HWACCMR0InitCPU, (void *)u32VendorEBX, aRc); - - /* Check the return code of all invocations. */ + HWACCMR0FIRSTRC FirstRc; + hwaccmR0FirstRcInit(&FirstRc); + HWACCMR0Globals.lLastError = RTMpOnAll(hwaccmR0InitCpu, (void *)u32VendorEBX, &FirstRc); if (RT_SUCCESS(HWACCMR0Globals.lLastError)) - HWACCMR0Globals.lLastError = hwaccmR0CheckCpuRcArray(aRc, RT_ELEMENTS(aRc), &idCpu); + HWACCMR0Globals.lLastError = hwaccmR0FirstRcGetStatus(&FirstRc); } if (RT_SUCCESS(HWACCMR0Globals.lLastError)) { @@ -346,7 +414,7 @@ VMMR0DECL(int) HWACCMR0Init(void) } #ifdef LOG_ENABLED else - SUPR0Printf("HWACCMR0InitCPU failed with rc=%d\n", HWACCMR0Globals.lLastError); + SUPR0Printf("hwaccmR0InitCpu failed with rc=%d\n", HWACCMR0Globals.lLastError); #endif } else @@ -367,25 +435,19 @@ VMMR0DECL(int) HWACCMR0Init(void) && (u32FeaturesEDX & X86_CPUID_FEATURE_EDX_FXSR) ) { - int aRc[RTCPUSET_MAX_CPUS]; - RTCPUID idCpu = 0; - fAMDVPresent = true; /* Query AMD features. */ ASMCpuId(0x8000000A, &HWACCMR0Globals.svm.u32Rev, &HWACCMR0Globals.uMaxASID, &u32Dummy, &HWACCMR0Globals.svm.u32Features); /* We need to check if AMD-V has been properly initialized on all CPUs. Some BIOSes might do a poor job. */ - memset(aRc, 0, sizeof(aRc)); - rc = RTMpOnAll(HWACCMR0InitCPU, (void *)u32VendorEBX, aRc); - AssertRC(rc); - - /* Check the return code of all invocations. */ + HWACCMR0FIRSTRC FirstRc; + hwaccmR0FirstRcInit(&FirstRc); + rc = RTMpOnAll(hwaccmR0InitCpu, (void *)u32VendorEBX, &FirstRc); AssertRC(rc); if (RT_SUCCESS(rc)) - rc = hwaccmR0CheckCpuRcArray(aRc, RT_ELEMENTS(aRc), &idCpu); - + rc = hwaccmR0FirstRcGetStatus(&FirstRc); #ifndef DEBUG_bird - AssertMsg(rc == VINF_SUCCESS || rc == VERR_SVM_IN_USE, ("HWACCMR0InitCPU failed for cpu %d with rc=%d\n", idCpu, rc)); + AssertMsg(rc == VINF_SUCCESS || rc == VERR_SVM_IN_USE, ("hwaccmR0InitCpu failed for cpu %d with rc=%d\n", hwaccmR0FirstRcGetCpuId(&FirstRc), rc)); #endif if (RT_SUCCESS(rc)) { @@ -444,36 +506,6 @@ VMMR0DECL(int) HWACCMR0Init(void) /** - * Checks the error code array filled in for each cpu in the system. - * - * @returns VBox status code. - * @param paRc Error code array - * @param cErrorCodes Array size - * @param pidCpu Value of the first cpu that set an error (out) - */ -static int hwaccmR0CheckCpuRcArray(int *paRc, unsigned cErrorCodes, RTCPUID *pidCpu) -{ - int rc = VINF_SUCCESS; - - Assert(cErrorCodes == RTCPUSET_MAX_CPUS); - - for (unsigned i=0;i<cErrorCodes;i++) - { - if (RTMpIsCpuOnline(i)) - { - if (RT_FAILURE(paRc[i])) - { - rc = paRc[i]; - *pidCpu = i; - break; - } - } - } - return rc; -} - - -/** * Checks if the CPU is subject to the "VMX-Preemption Timer Does Not Count * Down at the Rate Specified" erratum. * @@ -551,15 +583,15 @@ VMMR0DECL(int) HWACCMR0Term(void) /* Only disable VT-x/AMD-V on all CPUs if we enabled it before. */ if (HWACCMR0Globals.fGlobalInit) { - int aRc[RTCPUSET_MAX_CPUS]; - - memset(aRc, 0, sizeof(aRc)); - rc = RTMpOnAll(hwaccmR0DisableCpuCallback, aRc, NULL); + HWACCMR0FIRSTRC FirstRc; + hwaccmR0FirstRcInit(&FirstRc); + rc = RTMpOnAll(hwaccmR0DisableCpuCallback, NULL, &FirstRc); Assert(RT_SUCCESS(rc) || rc == VERR_NOT_SUPPORTED); -#ifdef VBOX_STRICT - for (unsigned i=0;i<RT_ELEMENTS(HWACCMR0Globals.aCpuInfo);i++) - AssertMsgRC(aRc[i], ("hwaccmR0DisableCpuCallback failed for cpu %d with rc=%d\n", i, aRc[i])); -#endif + if (RT_SUCCESS(rc)) + { + rc = hwaccmR0FirstRcGetStatus(&FirstRc); + AssertMsgRC(rc, ("%u: %Rrc\n", hwaccmR0FirstRcGetCpuId(&FirstRc), rc)); + } } /* Free the per-cpu pages used for VT-x and AMD-V */ @@ -584,15 +616,13 @@ VMMR0DECL(int) HWACCMR0Term(void) * @param pvUser1 The 1st user argument. * @param pvUser2 The 2nd user argument. */ -static DECLCALLBACK(void) HWACCMR0InitCPU(RTCPUID idCpu, void *pvUser1, void *pvUser2) +static DECLCALLBACK(void) hwaccmR0InitCpu(RTCPUID idCpu, void *pvUser1, void *pvUser2) { - unsigned u32VendorEBX = (uintptr_t)pvUser1; - int *paRc = (int *)pvUser2; - uint64_t val; + unsigned u32VendorEBX = (uintptr_t)pvUser1; + PHWACCMR0FIRSTRC pFirstRc = (PHWACCMR0FIRSTRC)pvUser2; + uint64_t val; + int rc; -#if defined(LOG_ENABLED) && !defined(DEBUG_bird) - SUPR0Printf("HWACCMR0InitCPU cpu %d\n", idCpu); -#endif Assert(idCpu == (RTCPUID)RTMpCpuIdToSetIndex(idCpu)); /// @todo fix idCpu == index assumption (rainy day) if (u32VendorEBX == X86_CPUID_VENDOR_INTEL_EBX) @@ -613,12 +643,11 @@ static DECLCALLBACK(void) HWACCMR0InitCPU(RTCPUID idCpu, void *pvUser1, void *pv } if ( (val & (MSR_IA32_FEATURE_CONTROL_VMXON|MSR_IA32_FEATURE_CONTROL_LOCK)) == (MSR_IA32_FEATURE_CONTROL_VMXON|MSR_IA32_FEATURE_CONTROL_LOCK)) - paRc[idCpu] = VINF_SUCCESS; + rc = VINF_SUCCESS; else - paRc[idCpu] = VERR_VMX_MSR_LOCKED_OR_DISABLED; + rc = VERR_VMX_MSR_LOCKED_OR_DISABLED; } - else - if (u32VendorEBX == X86_CPUID_VENDOR_AMD_EBX) + else if (u32VendorEBX == X86_CPUID_VENDOR_AMD_EBX) { /* Check if SVM is disabled */ val = ASMRdMsr(MSR_K8_VM_CR); @@ -627,9 +656,7 @@ static DECLCALLBACK(void) HWACCMR0InitCPU(RTCPUID idCpu, void *pvUser1, void *pv /* Turn on SVM in the EFER MSR. */ val = ASMRdMsr(MSR_K6_EFER); if (val & MSR_K6_EFER_SVME) - { - paRc[idCpu] = VERR_SVM_IN_USE; - } + rc = VERR_SVM_IN_USE; else { ASMWrMsr(MSR_K6_EFER, val | MSR_K6_EFER_SVME); @@ -640,18 +667,22 @@ static DECLCALLBACK(void) HWACCMR0InitCPU(RTCPUID idCpu, void *pvUser1, void *pv { /* Restore previous value. */ ASMWrMsr(MSR_K6_EFER, val & ~MSR_K6_EFER_SVME); - paRc[idCpu] = VINF_SUCCESS; + rc = VINF_SUCCESS; } else - paRc[idCpu] = VERR_SVM_ILLEGAL_EFER_MSR; + rc = VERR_SVM_ILLEGAL_EFER_MSR; } } else - paRc[idCpu] = VERR_SVM_DISABLED; + rc = VERR_SVM_DISABLED; } else + { AssertFailed(); /* can't happen */ - return; + rc = VERR_INTERNAL_ERROR_5; + } + + hwaccmR0FirstRcSetStatus(pFirstRc, rc); } @@ -695,11 +726,6 @@ VMMR0DECL(int) HWACCMR0EnableAllCpus(PVM pVM) } else { - int aRc[RTCPUSET_MAX_CPUS]; - RTCPUID idCpu = 0; - - memset(aRc, 0, sizeof(aRc)); - /* Allocate one page per cpu for the global vt-x and amd-v pages */ for (unsigned i=0;i<RT_ELEMENTS(HWACCMR0Globals.aCpuInfo);i++) { @@ -725,12 +751,12 @@ VMMR0DECL(int) HWACCMR0EnableAllCpus(PVM pVM) if (HWACCMR0Globals.fGlobalInit) { /* First time, so initialize each cpu/core */ - rc = RTMpOnAll(hwaccmR0EnableCpuCallback, (void *)pVM, aRc); - - /* Check the return code of all invocations. */ + HWACCMR0FIRSTRC FirstRc; + hwaccmR0FirstRcInit(&FirstRc); + rc = RTMpOnAll(hwaccmR0EnableCpuCallback, (void *)pVM, &FirstRc); if (RT_SUCCESS(rc)) - rc = hwaccmR0CheckCpuRcArray(aRc, RT_ELEMENTS(aRc), &idCpu); - AssertMsgRC(rc, ("HWACCMR0EnableAllCpus failed for cpu %d with rc=%d\n", idCpu, rc)); + rc = hwaccmR0FirstRcGetStatus(&FirstRc); + AssertMsgRC(rc, ("HWACCMR0EnableAllCpus failed for cpu %d with rc=%d\n", hwaccmR0FirstRcGetCpuId(&FirstRc), rc)); } else rc = VINF_SUCCESS; @@ -797,17 +823,10 @@ static int hwaccmR0EnableCpu(PVM pVM, RTCPUID idCpu) */ static DECLCALLBACK(void) hwaccmR0EnableCpuCallback(RTCPUID idCpu, void *pvUser1, void *pvUser2) { - PVM pVM = (PVM)pvUser1; /* can be NULL! */ - int *paRc = (int *)pvUser2; - - if (!HWACCMR0Globals.fGlobalInit) - { - paRc[idCpu] = VINF_SUCCESS; - AssertFailed(); - return; - } - - paRc[idCpu] = hwaccmR0EnableCpu(pVM, idCpu); + PVM pVM = (PVM)pvUser1; /* can be NULL! */ + PHWACCMR0FIRSTRC pFirstRc = (PHWACCMR0FIRSTRC)pvUser2; + AssertReturnVoid(HWACCMR0Globals.fGlobalInit); + hwaccmR0FirstRcSetStatus(pFirstRc, hwaccmR0EnableCpu(pVM, idCpu)); } @@ -859,16 +878,9 @@ static int hwaccmR0DisableCpu(RTCPUID idCpu) */ static DECLCALLBACK(void) hwaccmR0DisableCpuCallback(RTCPUID idCpu, void *pvUser1, void *pvUser2) { - int *paRc = (int *)pvUser1; - - if (!HWACCMR0Globals.fGlobalInit) - { - paRc[idCpu] = VINF_SUCCESS; - AssertFailed(); - return; - } - - paRc[idCpu] = hwaccmR0DisableCpu(idCpu); + PHWACCMR0FIRSTRC pFirstRc = (PHWACCMR0FIRSTRC)pvUser2; + AssertReturnVoid(HWACCMR0Globals.fGlobalInit); + hwaccmR0FirstRcSetStatus(pFirstRc, hwaccmR0DisableCpu(idCpu)); } /** @@ -894,17 +906,16 @@ static DECLCALLBACK(void) hwaccmR0PowerCallback(RTPOWEREVENT enmEvent, void *pvU if (HWACCMR0Globals.enmHwAccmState == HWACCMSTATE_ENABLED) { - int aRc[RTCPUSET_MAX_CPUS]; - int rc; - RTCPUID idCpu; + int rc; + HWACCMR0FIRSTRC FirstRc; + hwaccmR0FirstRcInit(&FirstRc); - memset(aRc, 0, sizeof(aRc)); if (enmEvent == RTPOWEREVENT_SUSPEND) { if (HWACCMR0Globals.fGlobalInit) { /* Turn off VT-x or AMD-V on all CPUs. */ - rc = RTMpOnAll(hwaccmR0DisableCpuCallback, aRc, NULL); + rc = RTMpOnAll(hwaccmR0DisableCpuCallback, NULL, &FirstRc); Assert(RT_SUCCESS(rc) || rc == VERR_NOT_SUPPORTED); } /* else nothing to do here for the local init case */ @@ -912,20 +923,20 @@ static DECLCALLBACK(void) hwaccmR0PowerCallback(RTPOWEREVENT enmEvent, void *pvU else { /* Reinit the CPUs from scratch as the suspend state might have messed with the MSRs. (lousy BIOSes as usual) */ - rc = RTMpOnAll(HWACCMR0InitCPU, (void *)((HWACCMR0Globals.vmx.fSupported) ? X86_CPUID_VENDOR_INTEL_EBX : X86_CPUID_VENDOR_AMD_EBX), aRc); + uintptr_t uFirstArg = HWACCMR0Globals.vmx.fSupported ? X86_CPUID_VENDOR_INTEL_EBX : X86_CPUID_VENDOR_AMD_EBX; + rc = RTMpOnAll(hwaccmR0InitCpu, (void *)uFirstArg , &FirstRc); Assert(RT_SUCCESS(rc) || rc == VERR_NOT_SUPPORTED); - if (RT_SUCCESS(rc)) - rc = hwaccmR0CheckCpuRcArray(aRc, RT_ELEMENTS(aRc), &idCpu); + rc = hwaccmR0FirstRcGetStatus(&FirstRc); #ifdef LOG_ENABLED if (RT_FAILURE(rc)) - SUPR0Printf("hwaccmR0PowerCallback HWACCMR0InitCPU failed with %d\n", rc); + SUPR0Printf("hwaccmR0PowerCallback hwaccmR0InitCpu failed with %Rc\n", rc); #endif if (HWACCMR0Globals.fGlobalInit) { /* Turn VT-x or AMD-V back on on all CPUs. */ - rc = RTMpOnAll(hwaccmR0EnableCpuCallback, NULL, aRc); + rc = RTMpOnAll(hwaccmR0EnableCpuCallback, NULL, &FirstRc /* output ignored */); Assert(RT_SUCCESS(rc) || rc == VERR_NOT_SUPPORTED); } /* else nothing to do here for the local init case */ diff --git a/src/VBox/VMM/VMMR0/HWVMXR0.cpp b/src/VBox/VMM/VMMR0/HWVMXR0.cpp index ecc9c81f8..27b2d0530 100644 --- a/src/VBox/VMM/VMMR0/HWVMXR0.cpp +++ b/src/VBox/VMM/VMMR0/HWVMXR0.cpp @@ -1533,7 +1533,7 @@ VMMR0DECL(int) VMXR0LoadGuestState(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx) val = pCtx->trHid.Attr.u; /* The TSS selector must be busy. */ - if ((val & 0xF) == X86_SEL_TYPE_SYS_286_TSS_AVAIL) + if ((val & 0xD) == X86_SEL_TYPE_SYS_286_TSS_AVAIL) val = (val & ~0xF) | X86_SEL_TYPE_SYS_286_TSS_BUSY; else /* Default even if no TR selector has been set (otherwise vmlaunch will fail!) */ diff --git a/src/VBox/VMM/VMMR3/CPUM.cpp b/src/VBox/VMM/VMMR3/CPUM.cpp index cbdd7d58d..22ca3c3c3 100644 --- a/src/VBox/VMM/VMMR3/CPUM.cpp +++ b/src/VBox/VMM/VMMR3/CPUM.cpp @@ -1095,7 +1095,7 @@ VMMR3DECL(void) CPUMR3ResetCpu(PVMCPU pVCpu) pCtx->trHid.u32Limit = 0xffff; pCtx->trHid.Attr.n.u1Present = 1; - pCtx->trHid.Attr.n.u4Type = X86_SEL_TYPE_SYS_286_TSS_BUSY; + pCtx->trHid.Attr.n.u4Type = X86_SEL_TYPE_SYS_386_TSS_BUSY; /* Deduction, not properly documented by Intel. */ pCtx->dr[6] = X86_DR6_INIT_VAL; pCtx->dr[7] = X86_DR7_INIT_VAL; diff --git a/src/VBox/VMM/VMMR3/PATM.cpp b/src/VBox/VMM/VMMR3/PATM.cpp index 213eb2663..68094920f 100644 --- a/src/VBox/VMM/VMMR3/PATM.cpp +++ b/src/VBox/VMM/VMMR3/PATM.cpp @@ -54,6 +54,20 @@ //#define PATM_REMOVE_PATCH_ON_TOO_MANY_TRAPS //#define PATM_DISABLE_ALL +/** + * Refresh trampoline patch state. + */ +typedef struct PATMREFRESHPATCH +{ + /** Pointer to the VM structure. */ + PVM pVM; + /** The trampoline patch record. */ + PPATCHINFO pPatchTrampoline; + /** The new patch we want to jump to. */ + PPATCHINFO pPatchRec; +} PATMREFRESHPATCH, *PPATMREFRESHPATCH; + + /******************************************************************************* * Internal Functions * *******************************************************************************/ @@ -1151,6 +1165,9 @@ void patmr3AddP2GLookupRecord(PVM pVM, PPATCHINFO pPatch, uint8_t *pPatchInstrHC PRECGUESTTOPATCH pGuestToPatchRec; uint32_t PatchOffset = pPatchInstrHC - pVM->patm.s.pPatchMemHC; /* Offset in memory reserved for PATM. */ + LogFlowFunc(("pVM=%#p pPatch=%#p pPatchInstrHC=%#p pInstrGC=%#x enmType=%d fDirty=%RTbool\n", + pVM, pPatch, pPatchInstrHC, pInstrGC, enmType, fDirty)); + if (enmType == PATM_LOOKUP_PATCH2GUEST) { pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32Get(&pPatch->Patch2GuestAddrTree, PatchOffset); @@ -3257,6 +3274,9 @@ static int patmCreateTrampoline(PVM pVM, RTRCPTR pInstrGC, PPATMPATCHREC pPatchR RTRCPTR pPage, pPatchTargetGC = 0; uint32_t orgOffsetPatchMem = ~0; int rc = VERR_PATCHING_REFUSED; + PPATCHINFO pPatchToJmp = NULL; /**< Patch the trampoline jumps to. */ + PTRAMPREC pTrampRec = NULL; /**< Trampoline record used to find the patch. */ + bool fInserted = false; Log(("patmCreateTrampoline %RRv\n", pInstrGC)); /* Save original offset (in case of failures later on). */ @@ -3275,29 +3295,47 @@ static int patmCreateTrampoline(PVM pVM, RTRCPTR pInstrGC, PPATMPATCHREC pPatchR { if (pPatchPage->aPatch[i]) { - PPATCHINFO pPatch2 = pPatchPage->aPatch[i]; + pPatchToJmp = pPatchPage->aPatch[i]; - if ( (pPatch2->flags & PATMFL_DUPLICATE_FUNCTION) - && pPatch2->uState == PATCH_ENABLED) + if ( (pPatchToJmp->flags & PATMFL_DUPLICATE_FUNCTION) + && pPatchToJmp->uState == PATCH_ENABLED) { - pPatchTargetGC = patmGuestGCPtrToPatchGCPtr(pVM, pPatch2, pInstrGC); + pPatchTargetGC = patmGuestGCPtrToPatchGCPtr(pVM, pPatchToJmp, pInstrGC); if (pPatchTargetGC) { uint32_t offsetPatch = pPatchTargetGC - pVM->patm.s.pPatchMemGC; - PRECPATCHTOGUEST pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32GetBestFit(&pPatch2->Patch2GuestAddrTree, offsetPatch, false); + PRECPATCHTOGUEST pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32GetBestFit(&pPatchToJmp->Patch2GuestAddrTree, offsetPatch, false); Assert(pPatchToGuestRec); pPatchToGuestRec->fJumpTarget = true; - Assert(pPatchTargetGC != pPatch2->pPrivInstrGC); - Log(("patmCreateTrampoline: generating jump to code inside patch at %RRv\n", pPatch2->pPrivInstrGC)); - pPatch2->flags |= PATMFL_EXTERNAL_JUMP_INSIDE; + Assert(pPatchTargetGC != pPatchToJmp->pPrivInstrGC); + Log(("patmCreateTrampoline: generating jump to code inside patch at %RRv (patch target %RRv)\n", pPatchToJmp->pPrivInstrGC, pPatchTargetGC)); break; } } } } } - AssertReturn(pPatchPage && pPatchTargetGC, VERR_PATCHING_REFUSED); + AssertReturn(pPatchPage && pPatchTargetGC && pPatchToJmp, VERR_PATCHING_REFUSED); + + /* + * Only record the trampoline patch if this is the first patch to the target + * or we recorded other patches already. + * The goal is to refuse refreshing function duplicates if the guest + * modifies code after a saved state was loaded because it is not possible + * to save the relation between trampoline and target without changing the + * saved satte version. + */ + if ( !(pPatchToJmp->flags & PATMFL_EXTERNAL_JUMP_INSIDE) + || pPatchToJmp->pTrampolinePatchesHead) + { + pPatchToJmp->flags |= PATMFL_EXTERNAL_JUMP_INSIDE; + pTrampRec = (PTRAMPREC)MMR3HeapAllocZ(pVM, MM_TAG_PATM_PATCH, sizeof(*pTrampRec)); + if (!pTrampRec) + return VERR_NO_MEMORY; /* or better return VERR_PATCHING_REFUSED to let the VM continue? */ + + pTrampRec->pPatchTrampoline = pPatchRec; + } pPatch->nrPatch2GuestRecs = 0; pPatch->pPatchBlockOffset = pVM->patm.s.offPatchMem; @@ -3323,9 +3361,9 @@ static int patmCreateTrampoline(PVM pVM, RTRCPTR pInstrGC, PPATMPATCHREC pPatchR */ LogFlow(("Insert %RRv patch offset %RRv\n", pPatchRec->patch.pPrivInstrGC, pPatch->pPatchBlockOffset)); pPatchRec->CoreOffset.Key = pPatch->pPatchBlockOffset; - rc = RTAvloU32Insert(&pVM->patm.s.PatchLookupTreeHC->PatchTreeByPatchAddr, &pPatchRec->CoreOffset); - AssertMsg(rc, ("RTAvloU32Insert failed for %x\n", pPatchRec->CoreOffset.Key)); - if (!rc) + fInserted = RTAvloU32Insert(&pVM->patm.s.PatchLookupTreeHC->PatchTreeByPatchAddr, &pPatchRec->CoreOffset); + AssertMsg(fInserted, ("RTAvloU32Insert failed for %x\n", pPatchRec->CoreOffset.Key)); + if (!fInserted) { rc = VERR_PATCHING_REFUSED; goto failure; @@ -3346,6 +3384,12 @@ static int patmCreateTrampoline(PVM pVM, RTRCPTR pInstrGC, PPATMPATCHREC pPatchR pPatch->uState = PATCH_ENABLED; /* We allow this patch to be called as a function. */ pPatch->flags |= PATMFL_CALLABLE_AS_FUNCTION; + + if (pTrampRec) + { + pTrampRec->pNext = pPatchToJmp->pTrampolinePatchesHead; + pPatchToJmp->pTrampolinePatchesHead = pTrampRec; + } STAM_COUNTER_INC(&pVM->patm.s.StatInstalledTrampoline); return VINF_SUCCESS; @@ -3370,6 +3414,9 @@ failure: Assert(orgOffsetPatchMem != (uint32_t)~0); pVM->patm.s.offPatchMem = orgOffsetPatchMem; + if (pTrampRec) + MMR3HeapFree(pTrampRec); + return rc; } @@ -4161,6 +4208,7 @@ VMMR3DECL(int) PATMR3InstallPatch(PVM pVM, RTRCPTR pInstrGC, uint64_t flags) pPatchRec->patch.pPrivInstrGC = pInstrGC; pPatchRec->patch.flags = flags; pPatchRec->patch.uOpMode = (flags & PATMFL_CODE32) ? CPUMODE_32BIT : CPUMODE_16BIT; + pPatchRec->patch.pTrampolinePatchesHead = NULL; pPatchRec->patch.pInstrGCLowest = pInstrGC; pPatchRec->patch.pInstrGCHighest = pInstrGC; @@ -5424,6 +5472,46 @@ int PATMRemovePatch(PVM pVM, PPATMPATCHREC pPatchRec, bool fForceRemove) } /** + * RTAvlU32DoWithAll() worker. + * Checks whether the current trampoline instruction is the jump to the target patch + * and updates the displacement to jump to the new target. + * + * @returns VBox status code. + * @retval VERR_ALREADY_EXISTS if the jump was found. + * @param pNode The current patch to guest record to check. + * @param pvUser The refresh state. + */ +static int patmR3PatchRefreshFindTrampolinePatch(PAVLU32NODECORE pNode, void *pvUser) +{ + PRECPATCHTOGUEST pPatch2GuestRec = (PRECPATCHTOGUEST)pNode; + PPATMREFRESHPATCH pRefreshPatchState = (PPATMREFRESHPATCH)pvUser; + PVM pVM = pRefreshPatchState->pVM; + + uint8_t *pPatchInstr = (uint8_t *)(pVM->patm.s.pPatchMemHC + pPatch2GuestRec->Core.Key); + + /* + * Check if the patch instruction starts with a jump. + * ASSUMES that there is no other patch to guest record that starts + * with a jump. + */ + if (*pPatchInstr == 0xE9) + { + /* Jump found, update the displacement. */ + RTRCPTR pPatchTargetGC = patmGuestGCPtrToPatchGCPtr(pVM, pRefreshPatchState->pPatchRec, + pRefreshPatchState->pPatchTrampoline->pPrivInstrGC); + int32_t displ = pPatchTargetGC - (pVM->patm.s.pPatchMemGC + pPatch2GuestRec->Core.Key + SIZEOF_NEARJUMP32); + + LogFlow(("Updating trampoline patch new patch target %RRv, new displacment %d (old was %d)\n", + pPatchTargetGC, displ, *(uint32_t *)&pPatchInstr[1])); + + *(uint32_t *)&pPatchInstr[1] = displ; + return VERR_ALREADY_EXISTS; /** @todo better return code */ + } + + return VINF_SUCCESS; +} + +/** * Attempt to refresh the patch by recompiling its entire code block * * @returns VBox status code. @@ -5435,6 +5523,7 @@ int patmR3RefreshPatch(PVM pVM, PPATMPATCHREC pPatchRec) PPATCHINFO pPatch; int rc; RTRCPTR pInstrGC = pPatchRec->patch.pPrivInstrGC; + PTRAMPREC pTrampolinePatchesHead = NULL; Log(("patmR3RefreshPatch: attempt to refresh patch at %RRv\n", pInstrGC)); @@ -5442,8 +5531,22 @@ int patmR3RefreshPatch(PVM pVM, PPATMPATCHREC pPatchRec) AssertReturn(pPatch->flags & (PATMFL_DUPLICATE_FUNCTION|PATMFL_IDTHANDLER|PATMFL_TRAPHANDLER), VERR_PATCHING_REFUSED); if (pPatch->flags & PATMFL_EXTERNAL_JUMP_INSIDE) { - Log(("patmR3RefreshPatch: refused because external jumps to this patch exist\n")); - return VERR_PATCHING_REFUSED; + if (!pPatch->pTrampolinePatchesHead) + { + /* + * It is sometimes possible that there are trampoline patches to this patch + * but they are not recorded (after a saved state load for example). + * Refuse to refresh those patches. + * Can hurt performance in theory if the patched code is modified by the guest + * and is executed often. However most of the time states are saved after the guest + * code was modified and is not updated anymore afterwards so this shouldn't be a + * big problem. + */ + Log(("patmR3RefreshPatch: refused because external jumps to this patch exist but the jumps are not recorded\n")); + return VERR_PATCHING_REFUSED; + } + Log(("patmR3RefreshPatch: external jumps to this patch exist, updating\n")); + pTrampolinePatchesHead = pPatch->pTrampolinePatchesHead; } /** Note: quite ugly to enable/disable/remove/insert old and new patches, but there's no easy way around it. */ @@ -5517,6 +5620,38 @@ int patmR3RefreshPatch(PVM pVM, PPATMPATCHREC pPatchRec) /* Used by another patch, so don't remove it! */ pNewPatchRec->patch.flags |= PATMFL_CODE_REFERENCED; + + if (pTrampolinePatchesHead) + { + /* Update all trampoline patches to jump to the new patch. */ + PTRAMPREC pTrampRec = NULL; + PATMREFRESHPATCH RefreshPatch; + + RefreshPatch.pVM = pVM; + RefreshPatch.pPatchRec = &pNewPatchRec->patch; + + pTrampRec = pTrampolinePatchesHead; + + while (pTrampRec) + { + PPATCHINFO pPatchTrampoline = &pTrampRec->pPatchTrampoline->patch; + + RefreshPatch.pPatchTrampoline = pPatchTrampoline; + /* + * We have to find the right patch2guest record because there might be others + * for statistics. + */ + rc = RTAvlU32DoWithAll(&pPatchTrampoline->Patch2GuestAddrTree, true, + patmR3PatchRefreshFindTrampolinePatch, &RefreshPatch); + Assert(rc == VERR_ALREADY_EXISTS); + rc = VINF_SUCCESS; + pTrampRec = pTrampRec->pNext; + } + pNewPatchRec->patch.pTrampolinePatchesHead = pTrampolinePatchesHead; + pNewPatchRec->patch.flags |= PATMFL_EXTERNAL_JUMP_INSIDE; + /* Clear the list of trampoline patches for the old patch (safety precaution). */ + pPatchRec->patch.pTrampolinePatchesHead = NULL; + } } failure: diff --git a/src/VBox/VMM/VMMR3/PATMSSM.cpp b/src/VBox/VMM/VMMR3/PATMSSM.cpp index acf2996c6..118ac3907 100644 --- a/src/VBox/VMM/VMMR3/PATMSSM.cpp +++ b/src/VBox/VMM/VMMR3/PATMSSM.cpp @@ -42,6 +42,99 @@ #include <VBox/dis.h> #include <VBox/disopcode.h> +/** + * Patch information - SSM version. + * + * the difference is the missing pTrampolinePatchesHead member + * to avoid changing the saved state version for now (will come later). + */ +typedef struct _PATCHINFOSSM +{ + uint32_t uState; + uint32_t uOldState; + DISCPUMODE uOpMode; + + /* GC pointer of privileged instruction */ + RCPTRTYPE(uint8_t *) pPrivInstrGC; + R3PTRTYPE(uint8_t *) unusedHC; /* todo Can't remove due to structure size dependencies in saved states. */ + uint8_t aPrivInstr[MAX_INSTR_SIZE]; + uint32_t cbPrivInstr; + uint32_t opcode; //opcode for priv instr (OP_*) + uint32_t cbPatchJump; //patch jump size + + /* Only valid for PATMFL_JUMP_CONFLICT patches */ + RTRCPTR pPatchJumpDestGC; + + RTGCUINTPTR32 pPatchBlockOffset; + uint32_t cbPatchBlockSize; + uint32_t uCurPatchOffset; +#if HC_ARCH_BITS == 64 + uint32_t Alignment0; /**< Align flags correctly. */ +#endif + + uint64_t flags; + + /** + * Lowest and highest patched GC instruction address. To optimize searches. + */ + RTRCPTR pInstrGCLowest; + RTRCPTR pInstrGCHighest; + + /* Tree of fixup records for the patch. */ + R3PTRTYPE(PAVLPVNODECORE) FixupTree; + uint32_t nrFixups; + + /* Tree of jumps inside the generated patch code. */ + uint32_t nrJumpRecs; + R3PTRTYPE(PAVLPVNODECORE) JumpTree; + + /** + * Lookup trees for determining the corresponding guest address of an + * instruction in the patch block. + */ + R3PTRTYPE(PAVLU32NODECORE) Patch2GuestAddrTree; + R3PTRTYPE(PAVLU32NODECORE) Guest2PatchAddrTree; + uint32_t nrPatch2GuestRecs; +#if HC_ARCH_BITS == 64 + uint32_t Alignment1; +#endif + + /* Unused, but can't remove due to structure size dependencies in the saved state. */ + PATMP2GLOOKUPREC_OBSOLETE unused; + + /* Temporary information during patch creation. Don't waste hypervisor memory for this. */ + R3PTRTYPE(PPATCHINFOTEMP) pTempInfo; + + /* Count the number of writes to the corresponding guest code. */ + uint32_t cCodeWrites; + + /* Count the number of invalid writes to pages monitored for the patch. */ + //some statistics to determine if we should keep this patch activated + uint32_t cTraps; + + uint32_t cInvalidWrites; + + // Index into the uPatchRun and uPatchTrap arrays (0..MAX_PATCHES-1) + uint32_t uPatchIdx; + + /* First opcode byte, that's overwritten when a patch is marked dirty. */ + uint8_t bDirtyOpcode; + uint8_t Alignment2[7]; /**< Align the structure size on a 8-byte boundary. */ +} PATCHINFOSSM, *PPATCHINFOSSM; + +/** + * Lookup record for patches - SSM version. + */ +typedef struct PATMPATCHRECSSM +{ + /** The key is a GC virtual address. */ + AVLOU32NODECORE Core; + /** The key is a patch offset. */ + AVLOU32NODECORE CoreOffset; + + PATCHINFOSSM patch; +} PATMPATCHRECSSM, *PPATMPATCHRECSSM; + /******************************************************************************* * Defined Constants And Macros * *******************************************************************************/ @@ -183,52 +276,52 @@ static SSMFIELD const g_aPatmGCStateFields[] = */ static SSMFIELD const g_aPatmPatchRecFields[] = { - SSMFIELD_ENTRY( PATMPATCHREC, Core.Key), - SSMFIELD_ENTRY_IGNORE( PATMPATCHREC, Core.pLeft), - SSMFIELD_ENTRY_IGNORE( PATMPATCHREC, Core.pRight), - SSMFIELD_ENTRY_IGNORE( PATMPATCHREC, Core.uchHeight), + SSMFIELD_ENTRY( PATMPATCHRECSSM, Core.Key), + SSMFIELD_ENTRY_IGNORE( PATMPATCHRECSSM, Core.pLeft), + SSMFIELD_ENTRY_IGNORE( PATMPATCHRECSSM, Core.pRight), + SSMFIELD_ENTRY_IGNORE( PATMPATCHRECSSM, Core.uchHeight), SSMFIELD_ENTRY_PAD_HC_AUTO( 3, 3), - SSMFIELD_ENTRY( PATMPATCHREC, CoreOffset.Key), - SSMFIELD_ENTRY_IGNORE( PATMPATCHREC, CoreOffset.pLeft), - SSMFIELD_ENTRY_IGNORE( PATMPATCHREC, CoreOffset.pRight), - SSMFIELD_ENTRY_IGNORE( PATMPATCHREC, CoreOffset.uchHeight), + SSMFIELD_ENTRY( PATMPATCHRECSSM, CoreOffset.Key), + SSMFIELD_ENTRY_IGNORE( PATMPATCHRECSSM, CoreOffset.pLeft), + SSMFIELD_ENTRY_IGNORE( PATMPATCHRECSSM, CoreOffset.pRight), + SSMFIELD_ENTRY_IGNORE( PATMPATCHRECSSM, CoreOffset.uchHeight), SSMFIELD_ENTRY_PAD_HC_AUTO( 3, 3), - SSMFIELD_ENTRY( PATMPATCHREC, patch.uState), - SSMFIELD_ENTRY( PATMPATCHREC, patch.uOldState), - SSMFIELD_ENTRY( PATMPATCHREC, patch.uOpMode), - SSMFIELD_ENTRY_RCPTR( PATMPATCHREC, patch.pPrivInstrGC), - SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHREC, patch.unusedHC), - SSMFIELD_ENTRY( PATMPATCHREC, patch.aPrivInstr), - SSMFIELD_ENTRY( PATMPATCHREC, patch.cbPrivInstr), - SSMFIELD_ENTRY( PATMPATCHREC, patch.opcode), - SSMFIELD_ENTRY( PATMPATCHREC, patch.cbPatchJump), - SSMFIELD_ENTRY_RCPTR( PATMPATCHREC, patch.pPatchJumpDestGC), - SSMFIELD_ENTRY( PATMPATCHREC, patch.pPatchBlockOffset), - SSMFIELD_ENTRY( PATMPATCHREC, patch.cbPatchBlockSize), - SSMFIELD_ENTRY( PATMPATCHREC, patch.uCurPatchOffset), - SSMFIELD_ENTRY_PAD_HC64( PATMPATCHREC, patch.Alignment0, sizeof(uint32_t)), - SSMFIELD_ENTRY( PATMPATCHREC, patch.flags), - SSMFIELD_ENTRY_RCPTR( PATMPATCHREC, patch.pInstrGCLowest), - SSMFIELD_ENTRY_RCPTR( PATMPATCHREC, patch.pInstrGCHighest), - SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHREC, patch.FixupTree), - SSMFIELD_ENTRY( PATMPATCHREC, patch.nrFixups), - SSMFIELD_ENTRY( PATMPATCHREC, patch.nrJumpRecs), // should be zero? - SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHREC, patch.JumpTree), - SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHREC, patch.Patch2GuestAddrTree), - SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHREC, patch.Guest2PatchAddrTree), - SSMFIELD_ENTRY( PATMPATCHREC, patch.nrPatch2GuestRecs), - SSMFIELD_ENTRY_PAD_HC64( PATMPATCHREC, patch.Alignment1, sizeof(uint32_t)), - SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHREC, patch.unused.pPatchLocStartHC), // saved as zero - SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHREC, patch.unused.pPatchLocEndHC), // ditto - SSMFIELD_ENTRY_IGN_RCPTR( PATMPATCHREC, patch.unused.pGuestLoc), // ditto - SSMFIELD_ENTRY_IGNORE( PATMPATCHREC, patch.unused.opsize), // ditto - SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHREC, patch.pTempInfo), - SSMFIELD_ENTRY( PATMPATCHREC, patch.cCodeWrites), - SSMFIELD_ENTRY( PATMPATCHREC, patch.cTraps), - SSMFIELD_ENTRY( PATMPATCHREC, patch.cInvalidWrites), - SSMFIELD_ENTRY( PATMPATCHREC, patch.uPatchIdx), - SSMFIELD_ENTRY( PATMPATCHREC, patch.bDirtyOpcode), - SSMFIELD_ENTRY_IGNORE( PATMPATCHREC, patch.Alignment2), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.uState), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.uOldState), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.uOpMode), + SSMFIELD_ENTRY_RCPTR( PATMPATCHRECSSM, patch.pPrivInstrGC), + SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHRECSSM, patch.unusedHC), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.aPrivInstr), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.cbPrivInstr), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.opcode), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.cbPatchJump), + SSMFIELD_ENTRY_RCPTR( PATMPATCHRECSSM, patch.pPatchJumpDestGC), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.pPatchBlockOffset), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.cbPatchBlockSize), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.uCurPatchOffset), + SSMFIELD_ENTRY_PAD_HC64( PATMPATCHRECSSM, patch.Alignment0, sizeof(uint32_t)), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.flags), + SSMFIELD_ENTRY_RCPTR( PATMPATCHRECSSM, patch.pInstrGCLowest), + SSMFIELD_ENTRY_RCPTR( PATMPATCHRECSSM, patch.pInstrGCHighest), + SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHRECSSM, patch.FixupTree), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.nrFixups), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.nrJumpRecs), // should be zero? + SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHRECSSM, patch.JumpTree), + SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHRECSSM, patch.Patch2GuestAddrTree), + SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHRECSSM, patch.Guest2PatchAddrTree), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.nrPatch2GuestRecs), + SSMFIELD_ENTRY_PAD_HC64( PATMPATCHRECSSM, patch.Alignment1, sizeof(uint32_t)), + SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHRECSSM, patch.unused.pPatchLocStartHC), // saved as zero + SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHRECSSM, patch.unused.pPatchLocEndHC), // ditto + SSMFIELD_ENTRY_IGN_RCPTR( PATMPATCHRECSSM, patch.unused.pGuestLoc), // ditto + SSMFIELD_ENTRY_IGNORE( PATMPATCHRECSSM, patch.unused.opsize), // ditto + SSMFIELD_ENTRY_IGN_HCPTR( PATMPATCHRECSSM, patch.pTempInfo), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.cCodeWrites), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.cTraps), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.cInvalidWrites), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.uPatchIdx), + SSMFIELD_ENTRY( PATMPATCHRECSSM, patch.bDirtyOpcode), + SSMFIELD_ENTRY_IGNORE( PATMPATCHRECSSM, patch.Alignment2), SSMFIELD_ENTRY_TERM() }; @@ -386,6 +479,95 @@ static DECLCALLBACK(int) patmSaveFixupRecords(PAVLPVNODECORE pNode, void *pVM1) return VINF_SUCCESS; } +/** + * Converts a saved state patch record to the memory record. + * + * @returns nothing. + * @param pPatch The memory record. + * @param pPatchSSM The SSM version of the patch record. + */ +static void patmR3PatchConvertSSM2Mem(PPATMPATCHREC pPatch, PPATMPATCHRECSSM pPatchSSM) +{ + /* + * Only restore the patch part of the tree record; not the internal data (except the key of course) + */ + pPatch->Core.Key = pPatchSSM->Core.Key; + pPatch->CoreOffset.Key = pPatchSSM->CoreOffset.Key; + pPatch->patch.uState = pPatchSSM->patch.uState; + pPatch->patch.uOldState = pPatchSSM->patch.uOldState; + pPatch->patch.uOpMode = pPatchSSM->patch.uOpMode; + pPatch->patch.pPrivInstrGC = pPatchSSM->patch.pPrivInstrGC; + pPatch->patch.unusedHC = pPatchSSM->patch.unusedHC; + memcpy(&pPatch->patch.aPrivInstr[0], &pPatchSSM->patch.aPrivInstr[0], MAX_INSTR_SIZE); + pPatch->patch.cbPrivInstr = pPatchSSM->patch.cbPrivInstr; + pPatch->patch.opcode = pPatchSSM->patch.opcode; + pPatch->patch.cbPatchJump = pPatchSSM->patch.cbPatchJump; + pPatch->patch.pPatchJumpDestGC = pPatchSSM->patch.pPatchJumpDestGC; + pPatch->patch.pPatchBlockOffset = pPatchSSM->patch.pPatchBlockOffset; + pPatch->patch.cbPatchBlockSize = pPatchSSM->patch.cbPatchBlockSize; + pPatch->patch.uCurPatchOffset = pPatchSSM->patch.uCurPatchOffset; + pPatch->patch.flags = pPatchSSM->patch.flags; + pPatch->patch.pInstrGCLowest = pPatchSSM->patch.pInstrGCLowest; + pPatch->patch.pInstrGCHighest = pPatchSSM->patch.pInstrGCHighest; + pPatch->patch.FixupTree = pPatchSSM->patch.FixupTree; + pPatch->patch.nrFixups = pPatchSSM->patch.nrFixups; + pPatch->patch.nrJumpRecs = pPatchSSM->patch.nrJumpRecs; + pPatch->patch.JumpTree = pPatchSSM->patch.JumpTree; + pPatch->patch.Patch2GuestAddrTree = pPatchSSM->patch.Patch2GuestAddrTree; + pPatch->patch.Guest2PatchAddrTree = pPatchSSM->patch.Guest2PatchAddrTree; + pPatch->patch.nrPatch2GuestRecs = pPatchSSM->patch.nrPatch2GuestRecs; + pPatch->patch.unused = pPatchSSM->patch.unused; + pPatch->patch.pTempInfo = pPatchSSM->patch.pTempInfo; + pPatch->patch.cCodeWrites = pPatchSSM->patch.cCodeWrites; + pPatch->patch.cTraps = pPatchSSM->patch.cTraps; + pPatch->patch.cInvalidWrites = pPatchSSM->patch.cInvalidWrites; + pPatch->patch.uPatchIdx = pPatchSSM->patch.uPatchIdx; + pPatch->patch.bDirtyOpcode = pPatchSSM->patch.bDirtyOpcode; + pPatch->patch.pTrampolinePatchesHead = NULL; +} + +/** + * Converts a memory patch record to the saved state version. + * + * @returns nothing. + * @param pPatchSSM The saved state record. + * @param pPatch The memory version to save. + */ +static void patmR3PatchConvertMem2SSM(PPATMPATCHRECSSM pPatchSSM, PPATMPATCHREC pPatch) +{ + pPatchSSM->Core = pPatch->Core; + pPatchSSM->CoreOffset = pPatch->CoreOffset; + pPatchSSM->patch.uState = pPatch->patch.uState; + pPatchSSM->patch.uOldState = pPatch->patch.uOldState; + pPatchSSM->patch.uOpMode = pPatch->patch.uOpMode; + pPatchSSM->patch.pPrivInstrGC = pPatch->patch.pPrivInstrGC; + pPatchSSM->patch.unusedHC = pPatch->patch.unusedHC; + memcpy(&pPatchSSM->patch.aPrivInstr[0], &pPatch->patch.aPrivInstr[0], MAX_INSTR_SIZE); + pPatchSSM->patch.cbPrivInstr = pPatch->patch.cbPrivInstr; + pPatchSSM->patch.opcode = pPatch->patch.opcode; + pPatchSSM->patch.cbPatchJump = pPatch->patch.cbPatchJump; + pPatchSSM->patch.pPatchJumpDestGC = pPatch->patch.pPatchJumpDestGC; + pPatchSSM->patch.pPatchBlockOffset = pPatch->patch.pPatchBlockOffset; + pPatchSSM->patch.cbPatchBlockSize = pPatch->patch.cbPatchBlockSize; + pPatchSSM->patch.uCurPatchOffset = pPatch->patch.uCurPatchOffset; + pPatchSSM->patch.flags = pPatch->patch.flags; + pPatchSSM->patch.pInstrGCLowest = pPatch->patch.pInstrGCLowest; + pPatchSSM->patch.pInstrGCHighest = pPatch->patch.pInstrGCHighest; + pPatchSSM->patch.FixupTree = pPatch->patch.FixupTree; + pPatchSSM->patch.nrFixups = pPatch->patch.nrFixups; + pPatchSSM->patch.nrJumpRecs = pPatch->patch.nrJumpRecs; + pPatchSSM->patch.JumpTree = pPatch->patch.JumpTree; + pPatchSSM->patch.Patch2GuestAddrTree = pPatch->patch.Patch2GuestAddrTree; + pPatchSSM->patch.Guest2PatchAddrTree = pPatch->patch.Guest2PatchAddrTree; + pPatchSSM->patch.nrPatch2GuestRecs = pPatch->patch.nrPatch2GuestRecs; + pPatchSSM->patch.unused = pPatch->patch.unused; + pPatchSSM->patch.pTempInfo = pPatch->patch.pTempInfo; + pPatchSSM->patch.cCodeWrites = pPatch->patch.cCodeWrites; + pPatchSSM->patch.cTraps = pPatch->patch.cTraps; + pPatchSSM->patch.cInvalidWrites = pPatch->patch.cInvalidWrites; + pPatchSSM->patch.uPatchIdx = pPatch->patch.uPatchIdx; + pPatchSSM->patch.bDirtyOpcode = pPatch->patch.bDirtyOpcode; +} /** * Callback function for RTAvloU32DoWithAll @@ -398,14 +580,16 @@ static DECLCALLBACK(int) patmSaveFixupRecords(PAVLPVNODECORE pNode, void *pVM1) */ static DECLCALLBACK(int) patmSavePatchState(PAVLOU32NODECORE pNode, void *pVM1) { - PVM pVM = (PVM)pVM1; - PPATMPATCHREC pPatch = (PPATMPATCHREC)pNode; - PATMPATCHREC patch = *pPatch; - PSSMHANDLE pSSM = pVM->patm.s.savedstate.pSSM; - int rc; + PVM pVM = (PVM)pVM1; + PPATMPATCHREC pPatch = (PPATMPATCHREC)pNode; + PATMPATCHRECSSM patch; + PSSMHANDLE pSSM = pVM->patm.s.savedstate.pSSM; + int rc; Assert(!(pPatch->patch.flags & PATMFL_GLOBAL_FUNCTIONS)); + patmR3PatchConvertMem2SSM(&patch, pPatch); + /* * Reset HC pointers that need to be recalculated when loading the state */ @@ -601,7 +785,8 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32 */ for (unsigned i = 0; i < patmInfo.savedstate.cPatches; i++) { - PATMPATCHREC patch, *pPatchRec; + PATMPATCHRECSSM patch; + PATMPATCHREC *pPatchRec; RT_ZERO(patch); rc = SSMR3GetStructEx(pSSM, &patch, sizeof(patch), SSMSTRUCT_FLAGS_MEM_BAND_AID, &g_aPatmPatchRecFields[0], NULL); @@ -615,12 +800,9 @@ DECLCALLBACK(int) patmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32 AssertMsgFailed(("Out of memory!!!!\n")); return VERR_NO_MEMORY; } - /* - * Only restore the patch part of the tree record; not the internal data (except the key of course) - */ - pPatchRec->patch = patch.patch; - pPatchRec->Core.Key = patch.Core.Key; - pPatchRec->CoreOffset.Key = patch.CoreOffset.Key; + + /* Convert SSM version to memory. */ + patmR3PatchConvertSSM2Mem(pPatchRec, &patch); Log(("Restoring patch %RRv -> %RRv\n", pPatchRec->patch.pPrivInstrGC, patmInfo.pPatchMemGC + pPatchRec->patch.pPatchBlockOffset)); bool ret = RTAvloU32Insert(&pVM->patm.s.PatchLookupTreeHC->PatchTree, &pPatchRec->Core); diff --git a/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp b/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp index 62766dae7..d18b616b8 100644 --- a/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp +++ b/src/VBox/VMM/VMMR3/PDMAsyncCompletionFile.cpp @@ -369,7 +369,6 @@ int pdmacFileEpTaskInitiate(PPDMASYNCCOMPLETIONTASK pTask, PCRTSGSEG paSegments, size_t cSegments, size_t cbTransfer, PDMACTASKFILETRANSFER enmTransfer) { - int rc = VINF_SUCCESS; PPDMASYNCCOMPLETIONENDPOINTFILE pEpFile = (PPDMASYNCCOMPLETIONENDPOINTFILE)pEndpoint; PPDMASYNCCOMPLETIONTASKFILE pTaskFile = (PPDMASYNCCOMPLETIONTASKFILE)pTask; PPDMACEPFILEMGR pAioMgr = pEpFile->pAioMgr; @@ -398,13 +397,7 @@ int pdmacFileEpTaskInitiate(PPDMASYNCCOMPLETIONTASK pTask, AssertMsg(!cbTransfer, ("Incomplete transfer %u bytes left\n", cbTransfer)); - if (ASMAtomicReadS32(&pTaskFile->cbTransferLeft) == 0 - && !ASMAtomicXchgBool(&pTaskFile->fCompleted, true)) - pdmR3AsyncCompletionCompleteTask(pTask, pTaskFile->rc, false); - else - rc = VINF_AIO_TASK_PENDING; - - return rc; + return VINF_AIO_TASK_PENDING; } /** diff --git a/src/VBox/VMM/VMMR3/PDMBlkCache.cpp b/src/VBox/VMM/VMMR3/PDMBlkCache.cpp index 967151b21..fe322ec63 100644 --- a/src/VBox/VMM/VMMR3/PDMBlkCache.cpp +++ b/src/VBox/VMM/VMMR3/PDMBlkCache.cpp @@ -480,17 +480,20 @@ static bool pdmBlkCacheReclaim(PPDMBLKCACHEGLOBAL pCache, size_t cbData, bool fR return (cbRemoved >= cbData); } -DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, PPDMBLKCACHEIOXFER pIoXfer) +DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, size_t cbXfer, PPDMBLKCACHEIOXFER pIoXfer) { int rc = VINF_SUCCESS; + LogFlowFunc(("%s: Enqueuing hIoXfer=%#p enmXferDir=%d\n", + __FUNCTION__, pIoXfer, pIoXfer->enmXferDir)); + switch (pBlkCache->enmType) { case PDMBLKCACHETYPE_DEV: { rc = pBlkCache->u.Dev.pfnXferEnqueue(pBlkCache->u.Dev.pDevIns, pIoXfer->enmXferDir, - off, pIoXfer->cbXfer, + off, cbXfer, &pIoXfer->SgBuf, pIoXfer); break; } @@ -498,7 +501,7 @@ DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, PPDMBLK { rc = pBlkCache->u.Drv.pfnXferEnqueue(pBlkCache->u.Drv.pDrvIns, pIoXfer->enmXferDir, - off, pIoXfer->cbXfer, + off, cbXfer, &pIoXfer->SgBuf, pIoXfer); break; } @@ -506,7 +509,7 @@ DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, PPDMBLK { rc = pBlkCache->u.Usb.pfnXferEnqueue(pBlkCache->u.Usb.pUsbIns, pIoXfer->enmXferDir, - off, pIoXfer->cbXfer, + off, cbXfer, &pIoXfer->SgBuf, pIoXfer); break; } @@ -514,7 +517,7 @@ DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, PPDMBLK { rc = pBlkCache->u.Int.pfnXferEnqueue(pBlkCache->u.Int.pvUser, pIoXfer->enmXferDir, - off, pIoXfer->cbXfer, + off, cbXfer, &pIoXfer->SgBuf, pIoXfer); break; } @@ -522,6 +525,7 @@ DECLINLINE(int) pdmBlkCacheEnqueue(PPDMBLKCACHE pBlkCache, uint64_t off, PPDMBLK AssertMsgFailed(("Unknown block cache type!\n")); } + LogFlowFunc(("%s: returns rc=%Rrc\n", __FUNCTION__, rc)); return rc; } @@ -549,11 +553,10 @@ static int pdmBlkCacheEntryReadFromMedium(PPDMBLKCACHEENTRY pEntry) pIoXfer->pEntry = pEntry; pIoXfer->SgSeg.pvSeg = pEntry->pbData; pIoXfer->SgSeg.cbSeg = pEntry->cbData; - pIoXfer->cbXfer = pEntry->cbData; pIoXfer->enmXferDir = PDMBLKCACHEXFERDIR_READ; RTSgBufInit(&pIoXfer->SgBuf, &pIoXfer->SgSeg, 1); - return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pIoXfer); + return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pEntry->cbData, pIoXfer); } /** @@ -580,11 +583,10 @@ static int pdmBlkCacheEntryWriteToMedium(PPDMBLKCACHEENTRY pEntry) pIoXfer->pEntry = pEntry; pIoXfer->SgSeg.pvSeg = pEntry->pbData; pIoXfer->SgSeg.cbSeg = pEntry->cbData; - pIoXfer->cbXfer = pEntry->cbData; pIoXfer->enmXferDir = PDMBLKCACHEXFERDIR_WRITE; RTSgBufInit(&pIoXfer->SgBuf, &pIoXfer->SgSeg, 1); - return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pIoXfer); + return pdmBlkCacheEnqueue(pBlkCache, pEntry->Core.Key, pEntry->cbData, pIoXfer); } /** @@ -611,7 +613,6 @@ static int pdmBlkCacheRequestPassthrough(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ ASMAtomicIncU32(&pReq->cXfersPending); pIoXfer->fIoCache = false; pIoXfer->pReq = pReq; - pIoXfer->cbXfer = cbData; pIoXfer->enmXferDir = enmXferDir; if (pSgBuf) { @@ -619,7 +620,7 @@ static int pdmBlkCacheRequestPassthrough(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ RTSgBufAdvance(pSgBuf, cbData); } - return pdmBlkCacheEnqueue(pBlkCache, offStart, pIoXfer); + return pdmBlkCacheEnqueue(pBlkCache, offStart, cbData, pIoXfer); } /** @@ -1853,14 +1854,13 @@ static PPDMBLKCACHEENTRY pdmBlkCacheEntryCreate(PPDMBLKCACHE pBlkCache, return pEntryNew; } -static PPDMBLKCACHEREQ pdmBlkCacheReqAlloc(size_t cbXfer, void *pvUser) +static PPDMBLKCACHEREQ pdmBlkCacheReqAlloc(void *pvUser) { PPDMBLKCACHEREQ pReq = (PPDMBLKCACHEREQ)RTMemAlloc(sizeof(PDMBLKCACHEREQ)); if (RT_LIKELY(pReq)) { pReq->pvUser = pvUser; - pReq->cbXfer = cbXfer; pReq->rcReq = VINF_SUCCESS; pReq->cXfersPending = 0; } @@ -1904,25 +1904,24 @@ static void pdmBlkCacheReqComplete(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ pReq) } static bool pdmBlkCacheReqUpdate(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEREQ pReq, - size_t cbComplete, int rcReq, bool fCallHandler) + int rcReq, bool fCallHandler) { if (RT_FAILURE(rcReq)) ASMAtomicCmpXchgS32(&pReq->rcReq, rcReq, VINF_SUCCESS); - AssertMsg(pReq->cbXfer >= cbComplete, ("Completed more than left\n")); AssertMsg(pReq->cXfersPending > 0, ("No transfers are pending for this request\n")); - uint32_t cbOld = ASMAtomicSubU32(&pReq->cbXfer, cbComplete); uint32_t cXfersPending = ASMAtomicDecU32(&pReq->cXfersPending); - if ( !(cbOld - cbComplete) - && !cXfersPending) + if (!cXfersPending) { if (fCallHandler) pdmBlkCacheReqComplete(pBlkCache, pReq); + else + RTMemFree(pReq); return true; } - LogFlowFunc(("pReq=%#p cXfersPending=%u cbXfer=%u\n", pReq, cXfersPending, (cbOld - cbComplete))); + LogFlowFunc(("pReq=%#p cXfersPending=%u\n", pReq, cXfersPending)); return false; } @@ -1944,7 +1943,7 @@ VMMR3DECL(int) PDMR3BlkCacheRead(PPDMBLKCACHE pBlkCache, uint64_t off, RTSgBufClone(&SgBuf, pcSgBuf); /* Allocate new request structure. */ - pReq = pdmBlkCacheReqAlloc(cbRead, pvUser); + pReq = pdmBlkCacheReqAlloc(pvUser); if (RT_UNLIKELY(!pReq)) return VERR_NO_MEMORY; @@ -2011,7 +2010,6 @@ VMMR3DECL(int) PDMR3BlkCacheRead(PPDMBLKCACHE pBlkCache, uint64_t off, { /* Read as much as we can from the entry. */ RTSgBufCopyFromBuf(&SgBuf, pEntry->pbData + offDiff, cbToRead); - ASMAtomicSubU32(&pReq->cbXfer, cbToRead); } /* Move this entry to the top position */ @@ -2136,7 +2134,7 @@ VMMR3DECL(int) PDMR3BlkCacheRead(PPDMBLKCACHE pBlkCache, uint64_t off, off += cbToRead; } - if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, 0, rc, false)) + if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false)) rc = VINF_AIO_TASK_PENDING; LogFlowFunc((": Leave rc=%Rrc\n", rc)); @@ -2162,7 +2160,7 @@ VMMR3DECL(int) PDMR3BlkCacheWrite(PPDMBLKCACHE pBlkCache, uint64_t off, RTSgBufClone(&SgBuf, pcSgBuf); /* Allocate new request structure. */ - pReq = pdmBlkCacheReqAlloc(cbWrite, pvUser); + pReq = pdmBlkCacheReqAlloc(pvUser); if (RT_UNLIKELY(!pReq)) return VERR_NO_MEMORY; @@ -2210,7 +2208,6 @@ VMMR3DECL(int) PDMR3BlkCacheWrite(PPDMBLKCACHE pBlkCache, uint64_t off, { RTSgBufCopyToBuf(&SgBuf, pEntry->pbData + offDiff, cbToWrite); - ASMAtomicSubU32(&pReq->cbXfer, cbToWrite); } else { @@ -2243,7 +2240,6 @@ VMMR3DECL(int) PDMR3BlkCacheWrite(PPDMBLKCACHE pBlkCache, uint64_t off, { /* Write as much as we can into the entry and update the file. */ RTSgBufCopyToBuf(&SgBuf, pEntry->pbData + offDiff, cbToWrite); - ASMAtomicSubU32(&pReq->cbXfer, cbToWrite); bool fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntry); if (fCommit) @@ -2333,7 +2329,6 @@ VMMR3DECL(int) PDMR3BlkCacheWrite(PPDMBLKCACHE pBlkCache, uint64_t off, if (!offDiff && pEntryNew->cbData == cbToWrite) { RTSgBufCopyToBuf(&SgBuf, pEntryNew->pbData, cbToWrite); - ASMAtomicSubU32(&pReq->cbXfer, cbToWrite); bool fCommit = pdmBlkCacheAddDirtyEntry(pBlkCache, pEntryNew); if (fCommit) @@ -2371,7 +2366,7 @@ VMMR3DECL(int) PDMR3BlkCacheWrite(PPDMBLKCACHE pBlkCache, uint64_t off, off += cbToWrite; } - if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, 0, rc, false)) + if (!pdmBlkCacheReqUpdate(pBlkCache, pReq, rc, false)) rc = VINF_AIO_TASK_PENDING; LogFlowFunc((": Leave rc=%Rrc\n", rc)); @@ -2393,7 +2388,7 @@ VMMR3DECL(int) PDMR3BlkCacheFlush(PPDMBLKCACHE pBlkCache, void *pvUser) pdmBlkCacheCommit(pBlkCache); /* Allocate new request structure. */ - pReq = pdmBlkCacheReqAlloc(0, pvUser); + pReq = pdmBlkCacheReqAlloc(pvUser); if (RT_UNLIKELY(!pReq)) return VERR_NO_MEMORY; @@ -2420,7 +2415,7 @@ static PPDMBLKCACHEWAITER pdmBlkCacheWaiterComplete(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEWAITER pNext = pWaiter->pNext; PPDMBLKCACHEREQ pReq = pWaiter->pReq; - pdmBlkCacheReqUpdate(pBlkCache, pWaiter->pReq, pWaiter->cbTransfer, rc, true); + pdmBlkCacheReqUpdate(pBlkCache, pWaiter->pReq, rc, true); RTMemFree(pWaiter); @@ -2472,35 +2467,19 @@ static void pdmBlkCacheIoXferCompleteEntry(PPDMBLKCACHE pBlkCache, PPDMBLKCACHEI AssertRC(rc); } - /* - * The entry is still marked as dirty which prevents eviction. - * Add the waiters to the list again. - */ - pEntry->fFlags &= ~PDMBLKCACHE_ENTRY_IS_DIRTY; /* Clear so it gets added to the list again. */ + /* Mark the entry as dirty again to get it added to the list later on. */ fDirty = true; - - if (pComplete) - { - pEntry->pWaitingHead = pComplete; - while (pComplete->pNext) - pComplete = pComplete->pNext; - pEntry->pWaitingTail = pComplete; - pComplete = NULL; - } } - else - { - pEntry->fFlags &= ~PDMBLKCACHE_ENTRY_IS_DIRTY; - while (pCurr) - { - AssertMsg(pCurr->fWrite, ("Completed write entries should never have read tasks attached\n")); + pEntry->fFlags &= ~PDMBLKCACHE_ENTRY_IS_DIRTY; - RTSgBufCopyToBuf(&pCurr->SgBuf, pEntry->pbData + pCurr->offCacheEntry, pCurr->cbTransfer); - fDirty = true; + while (pCurr) + { + AssertMsg(pCurr->fWrite, ("Completed write entries should never have read tasks attached\n")); - pCurr = pCurr->pNext; - } + RTSgBufCopyToBuf(&pCurr->SgBuf, pEntry->pbData + pCurr->offCacheEntry, pCurr->cbTransfer); + fDirty = true; + pCurr = pCurr->pNext; } } else @@ -2547,7 +2526,8 @@ VMMR3DECL(void) PDMR3BlkCacheIoXferComplete(PPDMBLKCACHE pBlkCache, PPDMBLKCACHE if (hIoXfer->fIoCache) pdmBlkCacheIoXferCompleteEntry(pBlkCache, hIoXfer, rcIoXfer); else - pdmBlkCacheReqUpdate(pBlkCache, hIoXfer->pReq, hIoXfer->cbXfer, rcIoXfer, true); + pdmBlkCacheReqUpdate(pBlkCache, hIoXfer->pReq, rcIoXfer, true); + RTMemFree(hIoXfer); } /** diff --git a/src/VBox/VMM/VMMR3/PDMDevHlp.cpp b/src/VBox/VMM/VMMR3/PDMDevHlp.cpp index 75e91562e..9c7eb8bb9 100644 --- a/src/VBox/VMM/VMMR3/PDMDevHlp.cpp +++ b/src/VBox/VMM/VMMR3/PDMDevHlp.cpp @@ -2995,7 +2995,8 @@ static DECLCALLBACK(int) pdmR3DevHlp_VMSuspendSaveAndPowerOffWorker(PVM pVM, PPD int rc = VMR3Suspend(pVM); if (RT_SUCCESS(rc)) { - rc = pVM->pUVM->pVmm2UserMethods->pfnSaveState(pVM->pUVM->pVmm2UserMethods, pVM); + PUVM pUVM = pVM->pUVM; + rc = pUVM->pVmm2UserMethods->pfnSaveState(pVM->pUVM->pVmm2UserMethods, pUVM); /* * On success, power off the VM, on failure we'll leave it suspended. diff --git a/src/VBox/VMM/VMMR3/PDMThread.cpp b/src/VBox/VMM/VMMR3/PDMThread.cpp index 12a1cfdce..02aa7aef0 100644 --- a/src/VBox/VMM/VMMR3/PDMThread.cpp +++ b/src/VBox/VMM/VMMR3/PDMThread.cpp @@ -758,6 +758,11 @@ static DECLCALLBACK(int) pdmR3ThreadMain(RTTHREAD Thread, void *pvUser) Log(("PDMThread: Initializing thread %RTthrd / %p / '%s'...\n", Thread, pThread, RTThreadGetName(Thread))); pThread->Thread = Thread; + PUVM pUVM = pThread->Internal.s.pVM->pUVM; + if ( pUVM->pVmm2UserMethods + && pUVM->pVmm2UserMethods->pfnNotifyPdmtInit) + pUVM->pVmm2UserMethods->pfnNotifyPdmtInit(pUVM->pVmm2UserMethods, pUVM); + /* * The run loop. * @@ -839,6 +844,9 @@ static DECLCALLBACK(int) pdmR3ThreadMain(RTTHREAD Thread, void *pvUser) ASMAtomicXchgSize(&pThread->enmState, PDMTHREADSTATE_TERMINATED); int rc2 = RTThreadUserSignal(Thread); AssertRC(rc2); + if ( pUVM->pVmm2UserMethods + && pUVM->pVmm2UserMethods->pfnNotifyPdmtTerm) + pUVM->pVmm2UserMethods->pfnNotifyPdmtTerm(pUVM->pVmm2UserMethods, pUVM); Log(("PDMThread: Terminating thread %RTthrd / %p / '%s': %Rrc\n", Thread, pThread, RTThreadGetName(Thread), rc)); return rc; } diff --git a/src/VBox/VMM/VMMR3/PGM.cpp b/src/VBox/VMM/VMMR3/PGM.cpp index 5da39be77..c27670d73 100644 --- a/src/VBox/VMM/VMMR3/PGM.cpp +++ b/src/VBox/VMM/VMMR3/PGM.cpp @@ -2039,6 +2039,8 @@ VMMR3DECL(int) PGMR3InitFinalize(PVM pVM) pVM->pgm.s.paDynPageMap32BitPTEsGC = pMapping->aPTs[iPT].pPTRC + iPG * sizeof(pMapping->aPTs[0].pPTR3->a[0]); pVM->pgm.s.paDynPageMapPaePTEsGC = pMapping->aPTs[iPT].paPaePTsRC + iPG * sizeof(pMapping->aPTs[0].paPaePTsR3->a[0]); + LogFlowFunc(("paDynPageMap32BitPTEsGC=%#p paDynPageMapPaePTEsGC=%#p\n", pVM->pgm.s.paDynPageMap32BitPTEsGC, pVM->pgm.s.paDynPageMapPaePTEsGC)); + /* init cache area */ RTHCPHYS HCPhysDummy = MMR3PageDummyHCPhys(pVM); for (uint32_t offDynMap = 0; offDynMap < MM_HYPER_DYNAMIC_SIZE; offDynMap += PAGE_SIZE) @@ -2225,8 +2227,9 @@ VMMR3DECL(void) PGMR3Relocate(PVM pVM, RTGCINTPTR offDelta) for (uint32_t iPage = 0; iPage < pDynMap->cPages; iPage++) { - paPages[iPage].pvPage += offDelta; - paPages[iPage].uPte.pv += offDelta; + paPages[iPage].pvPage += offDelta; + paPages[iPage].uPte.pLegacy += offDelta; + paPages[iPage].uPte.pPae += offDelta; } } diff --git a/src/VBox/VMM/VMMR3/PGMSavedState.cpp b/src/VBox/VMM/VMMR3/PGMSavedState.cpp index 1c2071737..18d1c3738 100644 --- a/src/VBox/VMM/VMMR3/PGMSavedState.cpp +++ b/src/VBox/VMM/VMMR3/PGMSavedState.cpp @@ -47,7 +47,10 @@ *******************************************************************************/ /** Saved state data unit version. * @todo remove the guest mappings from the saved state at next version change! */ -#define PGM_SAVED_STATE_VERSION 12 +#define PGM_SAVED_STATE_VERSION 13 +/** Saved state data unit version after this includes ballooned page flags in + * the state (see #5515). */ +#define PGM_SAVED_STATE_VERSION_BALLOON_BROKEN 12 /** Saved state before the balloon change. */ #define PGM_SAVED_STATE_VERSION_PRE_BALLOON 11 /** Saved state data unit version used during 3.1 development, misses the RAM @@ -81,8 +84,10 @@ #define PGM_STATE_REC_ROM_SHW_ZERO UINT8_C(0x06) /** ROM protection (8-bit). */ #define PGM_STATE_REC_ROM_PROT UINT8_C(0x07) +/** Ballooned page. No data. */ +#define PGM_STATE_REC_RAM_BALLOONED UINT8_C(0x08) /** The last record type. */ -#define PGM_STATE_REC_LAST PGM_STATE_REC_ROM_PROT +#define PGM_STATE_REC_LAST PGM_STATE_REC_RAM_BALLOONED /** End marker. */ #define PGM_STATE_REC_END UINT8_C(0xff) /** Flag indicating that the data is preceded by the page address. @@ -508,7 +513,7 @@ static int pgmR3SaveShadowedRomPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave, b PGMROMPROT enmProt = pRomPage->enmProt; RTGCPHYS GCPhys = pRom->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT); PPGMPAGE pPage = PGMROMPROT_IS_ROM(enmProt) ? &pRomPage->Shadow : pgmPhysGetPage(&pVM->pgm.s, GCPhys); - bool fZero = PGM_PAGE_IS_ZERO(pPage) || PGM_PAGE_IS_BALLOONED(pPage); + bool fZero = PGM_PAGE_IS_ZERO(pPage) || PGM_PAGE_IS_BALLOONED(pPage); Assert(!PGM_PAGE_IS_BALLOONED(pPage)); /* Shouldn't be ballooned. */ int rc = VINF_SUCCESS; if (!fZero) { @@ -1358,7 +1363,7 @@ static void pgmR3ScanRamPages(PVM pVM, bool fFinalPass) paLSPages[iPage].cDirtied = PGMLIVSAVEPAGE_MAX_DIRTIED; } - pgmPhysPageWriteMonitor(pVM, &pCur->aPages[iPage], + pgmPhysPageWriteMonitor(pVM, &pCur->aPages[iPage], pCur->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT)); paLSPages[iPage].fWriteMonitored = 1; paLSPages[iPage].fWriteMonitoredJustNow = 1; @@ -1593,10 +1598,11 @@ static int pgmR3SaveRamPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave, uint32_t */ int rc; RTGCPHYS GCPhys = pCur->GCPhys + ((RTGCPHYS)iPage << PAGE_SHIFT); - bool fZero = PGM_PAGE_IS_ZERO(pCurPage) || PGM_PAGE_IS_BALLOONED(pCurPage); + bool fZero = PGM_PAGE_IS_ZERO(pCurPage); + bool fBallooned = PGM_PAGE_IS_BALLOONED(pCurPage); bool fSkipped = false; - if (!fZero) + if (!fZero && !fBallooned) { /* * Copy the page and then save it outside the lock (since any @@ -1665,7 +1671,7 @@ static int pgmR3SaveRamPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave, uint32_t else { /* - * Dirty zero page. + * Dirty zero or ballooned page. */ #ifdef PGMLIVESAVERAMPAGE_WITH_CRC32 if (paLSPages) @@ -1673,11 +1679,12 @@ static int pgmR3SaveRamPages(PVM pVM, PSSMHANDLE pSSM, bool fLiveSave, uint32_t #endif pgmUnlock(pVM); + uint8_t u8RecType = fBallooned ? PGM_STATE_REC_RAM_BALLOONED : PGM_STATE_REC_RAM_ZERO; if (GCPhys == GCPhysLast + PAGE_SIZE) - rc = SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_ZERO); + rc = SSMR3PutU8(pSSM, u8RecType); else { - SSMR3PutU8(pSSM, PGM_STATE_REC_RAM_ZERO | PGM_STATE_REC_FLAG_ADDR); + SSMR3PutU8(pSSM, u8RecType | PGM_STATE_REC_FLAG_ADDR); rc = SSMR3PutGCPhys(pSSM, GCPhys); } } @@ -2558,12 +2565,13 @@ static int pgmR3LoadMemoryOld(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion) * * @param pVM The VM handle. * @param pSSM The SSM handle. - * @param uVersion The saved state version. + * @param uVersion The PGM saved state unit version. + * @param uPass The pass number. * * @todo This needs splitting up if more record types or code twists are * added... */ -static int pgmR3LoadMemory(PVM pVM, PSSMHANDLE pSSM, uint32_t uPass) +static int pgmR3LoadMemory(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) { /* * Process page records until we hit the terminator. @@ -2601,6 +2609,7 @@ static int pgmR3LoadMemory(PVM pVM, PSSMHANDLE pSSM, uint32_t uPass) */ if (cPendingPages) { + Log(("pgmR3LoadMemory: GMMR3FreePagesPerform pVM=%p cPendingPages=%u\n", pVM, cPendingPages)); rc = GMMR3FreePagesPerform(pVM, pReq, cPendingPages); AssertLogRelRCReturn(rc, rc); } @@ -2615,6 +2624,7 @@ static int pgmR3LoadMemory(PVM pVM, PSSMHANDLE pSSM, uint32_t uPass) */ case PGM_STATE_REC_RAM_ZERO: case PGM_STATE_REC_RAM_RAW: + case PGM_STATE_REC_RAM_BALLOONED: { /* * Get the address and resolve it into a page descriptor. @@ -2640,9 +2650,20 @@ static int pgmR3LoadMemory(PVM pVM, PSSMHANDLE pSSM, uint32_t uPass) { case PGM_STATE_REC_RAM_ZERO: { - if ( PGM_PAGE_IS_ZERO(pPage) - || PGM_PAGE_IS_BALLOONED(pPage)) + if (PGM_PAGE_IS_ZERO(pPage)) + break; + + /* Ballooned pages must be unmarked (live snapshot and + teleportation scenarios). */ + if (PGM_PAGE_IS_BALLOONED(pPage)) + { + Assert(PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM); + if (uVersion == PGM_SAVED_STATE_VERSION_BALLOON_BROKEN) + break; + PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_ZERO); break; + } + AssertLogRelMsgReturn(PGM_PAGE_GET_STATE(pPage) == PGM_PAGE_STATE_ALLOCATED, ("GCPhys=%RGp %R[pgmpage]\n", GCPhys, pPage), VERR_INTERNAL_ERROR_5); /* If this is a ROM page, we must clear it and not try @@ -2663,6 +2684,30 @@ static int pgmR3LoadMemory(PVM pVM, PSSMHANDLE pSSM, uint32_t uPass) rc = pgmPhysFreePage(pVM, pReq, &cPendingPages, pPage, GCPhys); AssertRCReturn(rc, rc); } + /** @todo handle large pages (see #5545) */ + break; + } + + case PGM_STATE_REC_RAM_BALLOONED: + { + Assert(PGM_PAGE_GET_TYPE(pPage) == PGMPAGETYPE_RAM); + if (PGM_PAGE_IS_BALLOONED(pPage)) + break; + + /* We don't map ballooned pages in our shadow page tables, let's + just free it if allocated and mark as ballooned. See #5515. */ + if (PGM_PAGE_IS_ALLOCATED(pPage)) + { + /** @todo handle large pages + ballooning when it works. (see #5515, #5545). */ + AssertLogRelMsgReturn( PGM_PAGE_GET_PDE_TYPE(pPage) != PGM_PAGE_PDE_TYPE_PDE + && PGM_PAGE_GET_PDE_TYPE(pPage) != PGM_PAGE_PDE_TYPE_PDE_DISABLED, + ("GCPhys=%RGp %R[pgmpage]\n", GCPhys, pPage), VERR_INTERNAL_ERROR_5); + + rc = pgmPhysFreePage(pVM, pReq, &cPendingPages, pPage, GCPhys); + AssertRCReturn(rc, rc); + } + Assert(PGM_PAGE_IS_ZERO(pPage)); + PGM_PAGE_SET_STATE(pPage, PGM_PAGE_STATE_BALLOONED); break; } @@ -2995,7 +3040,7 @@ static int pgmR3LoadFinalLocked(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion) return rc; } - rc = pgmR3LoadMemory(pVM, pSSM, SSM_PASS_FINAL); + rc = pgmR3LoadMemory(pVM, pSSM, uVersion, SSM_PASS_FINAL); } else rc = pgmR3LoadMemoryOld(pVM, pSSM, uVersion); @@ -3003,6 +3048,7 @@ static int pgmR3LoadFinalLocked(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion) /* Refresh balloon accounting. */ if (pVM->pgm.s.cBalloonedPages) { + Log(("pgmR3LoadFinalLocked: pVM=%p cBalloonedPages=%#x\n", pVM, pVM->pgm.s.cBalloonedPages)); rc = GMMR3BalloonedPages(pVM, GMMBALLOONACTION_INFLATE, pVM->pgm.s.cBalloonedPages); AssertRCReturn(rc, rc); } @@ -3029,9 +3075,11 @@ static DECLCALLBACK(int) pgmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, */ if ( ( uPass != SSM_PASS_FINAL && uVersion != PGM_SAVED_STATE_VERSION + && uVersion != PGM_SAVED_STATE_VERSION_BALLOON_BROKEN && uVersion != PGM_SAVED_STATE_VERSION_PRE_BALLOON && uVersion != PGM_SAVED_STATE_VERSION_NO_RAM_CFG) || ( uVersion != PGM_SAVED_STATE_VERSION + && uVersion != PGM_SAVED_STATE_VERSION_BALLOON_BROKEN && uVersion != PGM_SAVED_STATE_VERSION_PRE_BALLOON && uVersion != PGM_SAVED_STATE_VERSION_NO_RAM_CFG && uVersion != PGM_SAVED_STATE_VERSION_3_0_0 @@ -3052,7 +3100,7 @@ static DECLCALLBACK(int) pgmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, { pgmLock(pVM); if (uPass != 0) - rc = pgmR3LoadMemory(pVM, pSSM, uPass); + rc = pgmR3LoadMemory(pVM, pSSM, uVersion, uPass); else { pVM->pgm.s.LiveSave.fActive = true; @@ -3065,7 +3113,7 @@ static DECLCALLBACK(int) pgmR3Load(PVM pVM, PSSMHANDLE pSSM, uint32_t uVersion, if (RT_SUCCESS(rc)) rc = pgmR3LoadMmio2Ranges(pVM, pSSM); if (RT_SUCCESS(rc)) - rc = pgmR3LoadMemory(pVM, pSSM, uPass); + rc = pgmR3LoadMemory(pVM, pSSM, uVersion, uPass); } pgmUnlock(pVM); } diff --git a/src/VBox/VMM/VMMR3/TM.cpp b/src/VBox/VMM/VMMR3/TM.cpp index 3e0ccfb36..9d497efb7 100644 --- a/src/VBox/VMM/VMMR3/TM.cpp +++ b/src/VBox/VMM/VMMR3/TM.cpp @@ -121,6 +121,7 @@ *******************************************************************************/ #define LOG_GROUP LOG_GROUP_TM #include <VBox/vmm/tm.h> +#include <iprt/asm-amd64-x86.h> /* for SUPGetCpuHzFromGIP from sup.h */ #include <VBox/vmm/vmm.h> #include <VBox/vmm/mm.h> #include <VBox/vmm/ssm.h> @@ -138,7 +139,6 @@ #include <VBox/log.h> #include <iprt/asm.h> #include <iprt/asm-math.h> -#include <iprt/asm-amd64-x86.h> #include <iprt/assert.h> #include <iprt/thread.h> #include <iprt/time.h> @@ -221,12 +221,20 @@ VMM_INT_DECL(int) TMR3Init(PVM pVM) */ pVM->tm.s.pvGIPR3 = (void *)g_pSUPGlobalInfoPage; AssertMsgReturn(pVM->tm.s.pvGIPR3, ("GIP support is now required!\n"), VERR_INTERNAL_ERROR); + AssertMsgReturn((g_pSUPGlobalInfoPage->u32Version >> 16) == (SUPGLOBALINFOPAGE_VERSION >> 16), + ("Unsupported GIP version!\n"), VERR_INTERNAL_ERROR); + RTHCPHYS HCPhysGIP; rc = SUPR3GipGetPhys(&HCPhysGIP); AssertMsgRCReturn(rc, ("Failed to get GIP physical address!\n"), rc); RTGCPTR GCPtr; +#ifdef SUP_WITH_LOTS_OF_CPUS + rc = MMR3HyperMapHCPhys(pVM, pVM->tm.s.pvGIPR3, NIL_RTR0PTR, HCPhysGIP, (size_t)g_pSUPGlobalInfoPage->cPages * PAGE_SIZE, + "GIP", &GCPtr); +#else rc = MMR3HyperMapHCPhys(pVM, pVM->tm.s.pvGIPR3, NIL_RTR0PTR, HCPhysGIP, PAGE_SIZE, "GIP", &GCPtr); +#endif if (RT_FAILURE(rc)) { AssertMsgFailed(("Failed to map GIP into GC, rc=%Rrc!\n", rc)); @@ -794,34 +802,23 @@ static uint64_t tmR3CalibrateTSC(PVM pVM) /* * Use GIP when available present. */ - uint64_t u64Hz; - PSUPGLOBALINFOPAGE pGip = g_pSUPGlobalInfoPage; - if ( pGip - && pGip->u32Magic == SUPGLOBALINFOPAGE_MAGIC) + uint64_t u64Hz = SUPGetCpuHzFromGIP(g_pSUPGlobalInfoPage); + if (u64Hz != UINT64_MAX) { - unsigned iCpu = pGip->u32Mode != SUPGIPMODE_ASYNC_TSC ? 0 : ASMGetApicId(); - if (iCpu >= RT_ELEMENTS(pGip->aCPUs)) - AssertReleaseMsgFailed(("iCpu=%d - the ApicId is too high. send VBox.log and hardware specs!\n", iCpu)); + if (tmR3HasFixedTSC(pVM)) + /* Sleep a bit to get a more reliable CpuHz value. */ + RTThreadSleep(32); else { - if (tmR3HasFixedTSC(pVM)) - /* Sleep a bit to get a more reliable CpuHz value. */ - RTThreadSleep(32); - else - { - /* Spin for 40ms to try push up the CPU frequency and get a more reliable CpuHz value. */ - const uint64_t u64 = RTTimeMilliTS(); - while ((RTTimeMilliTS() - u64) < 40 /*ms*/) - /* nothing */; - } - - pGip = g_pSUPGlobalInfoPage; - if ( pGip - && pGip->u32Magic == SUPGLOBALINFOPAGE_MAGIC - && (u64Hz = pGip->aCPUs[iCpu].u64CpuHz) - && u64Hz != ~(uint64_t)0) - return u64Hz; + /* Spin for 40ms to try push up the CPU frequency and get a more reliable CpuHz value. */ + const uint64_t u64 = RTTimeMilliTS(); + while ((RTTimeMilliTS() - u64) < 40 /*ms*/) + /* nothing */; } + + u64Hz = SUPGetCpuHzFromGIP(g_pSUPGlobalInfoPage); + if (u64Hz != UINT64_MAX) + return u64Hz; } /* call this once first to make sure it's initialized. */ diff --git a/src/VBox/VMM/VMMR3/VM.cpp b/src/VBox/VMM/VMMR3/VM.cpp index c04129d93..5e9b9dca7 100644 --- a/src/VBox/VMM/VMMR3/VM.cpp +++ b/src/VBox/VMM/VMMR3/VM.cpp @@ -167,11 +167,11 @@ VMMR3DECL(int) VMR3GlobalInit(void) * @returns 0 on success. * @returns VBox error code on failure. * @param cCpus Number of virtual CPUs for the new VM. - * @param pVmm2UserMethods An optional method table that the VMM can use to - * make the user perform various action, like for - * instance state saving. + * @param pVmm2UserMethods An optional method table that the VMM can use + * to make the user perform various action, like + * for instance state saving. * @param pfnVMAtError Pointer to callback function for setting VM - * errors. This was added as an implicit call to + * errors. This was added as an implicit call to * VMR3AtErrorRegister() since there is no way the * caller can get to the VM handle early enough to * do this on its own. @@ -195,7 +195,11 @@ VMMR3DECL(int) VMR3Create(uint32_t cCpus, PCVMM2USERMETHODS pVmm2UserMethods, AssertPtrReturn(pVmm2UserMethods, VERR_INVALID_POINTER); AssertReturn(pVmm2UserMethods->u32Magic == VMM2USERMETHODS_MAGIC, VERR_INVALID_PARAMETER); AssertReturn(pVmm2UserMethods->u32Version == VMM2USERMETHODS_VERSION, VERR_INVALID_PARAMETER); - AssertPtrReturn(pVmm2UserMethods->pfnSaveState, VERR_INVALID_POINTER); + AssertPtrNullReturn(pVmm2UserMethods->pfnSaveState, VERR_INVALID_POINTER); + AssertPtrNullReturn(pVmm2UserMethods->pfnNotifyEmtInit, VERR_INVALID_POINTER); + AssertPtrNullReturn(pVmm2UserMethods->pfnNotifyEmtTerm, VERR_INVALID_POINTER); + AssertPtrNullReturn(pVmm2UserMethods->pfnNotifyPdmtInit, VERR_INVALID_POINTER); + AssertPtrNullReturn(pVmm2UserMethods->pfnNotifyPdmtTerm, VERR_INVALID_POINTER); AssertReturn(pVmm2UserMethods->u32EndMagic == VMM2USERMETHODS_MAGIC, VERR_INVALID_PARAMETER); } AssertPtrNullReturn(pfnVMAtError, VERR_INVALID_POINTER); diff --git a/src/VBox/VMM/VMMR3/VMEmt.cpp b/src/VBox/VMM/VMMR3/VMEmt.cpp index c88a9311c..6465544dd 100644 --- a/src/VBox/VMM/VMMR3/VMEmt.cpp +++ b/src/VBox/VMM/VMMR3/VMEmt.cpp @@ -80,6 +80,10 @@ int vmR3EmulationThreadWithId(RTTHREAD ThreadSelf, PUVMCPU pUVCpu, VMCPUID idCpu rc = RTTlsSet(pUVM->vm.s.idxTLS, pUVCpu); AssertReleaseMsgRCReturn(rc, ("RTTlsSet %x failed with %Rrc\n", pUVM->vm.s.idxTLS, rc), rc); + if ( pUVM->pVmm2UserMethods + && pUVM->pVmm2UserMethods->pfnNotifyEmtInit) + pUVM->pVmm2UserMethods->pfnNotifyEmtInit(pUVM->pVmm2UserMethods, pUVM, pUVCpu); + /* * The request loop. */ @@ -254,6 +258,10 @@ int vmR3EmulationThreadWithId(RTTHREAD ThreadSelf, PUVMCPU pUVCpu, VMCPUID idCpu AssertLogRelRC(rc2); } + if ( pUVM->pVmm2UserMethods + && pUVM->pVmm2UserMethods->pfnNotifyEmtTerm) + pUVM->pVmm2UserMethods->pfnNotifyEmtTerm(pUVM->pVmm2UserMethods, pUVM, pUVCpu); + pUVCpu->vm.s.NativeThreadEMT = NIL_RTNATIVETHREAD; Log(("vmR3EmulationThread: EMT is terminated.\n")); return rc; @@ -1134,7 +1142,7 @@ VMMR3DECL(int) VMR3WaitU(PUVMCPU pUVCpu) */ PUVM pUVM = pUVCpu->pUVM; int rc = g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnWait(pUVCpu); - LogFlow(("VMR3WaitU: returns %Rrc (FF %#x)\n", rc, pVM ? pVM->fGlobalForcedActions : 0)); + LogFlow(("VMR3WaitU: returns %Rrc (FF %#x)\n", rc, pUVM->pVM ? pUVM->pVM->fGlobalForcedActions : 0)); return rc; } diff --git a/src/VBox/VMM/VMMRZ/PGMRZDynMap.cpp b/src/VBox/VMM/VMMRZ/PGMRZDynMap.cpp index 60528994a..973799c60 100644 --- a/src/VBox/VMM/VMMRZ/PGMRZDynMap.cpp +++ b/src/VBox/VMM/VMMRZ/PGMRZDynMap.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2008-2010 Oracle Corporation + * Copyright (C) 2008-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -215,10 +215,8 @@ typedef struct PGMR0DYNMAPENTRY /** PTE pointer, the void version. */ void *pv; } uPte; -# ifndef IN_RC /** CPUs that haven't invalidated this entry after it's last update. */ RTCPUSET PendingSet; -# endif } PGMR0DYNMAPENTRY; /** Pointer a mapping cache entry for the ring-0. * @sa PPGMRZDYNMAPENTRY, PPGMRCDYNMAPENTRY, */ @@ -239,10 +237,8 @@ typedef struct PGMR0DYNMAP { /** The usual magic number / eye catcher (PGMRZDYNMAP_MAGIC). */ uint32_t u32Magic; -# ifndef IN_RC /** Spinlock serializing the normal operation of the cache. */ RTSPINLOCK hSpinlock; -# endif /** Array for tracking and managing the pages. */ PPGMR0DYNMAPENTRY paPages; /** The cache size given as a number of pages. */ @@ -255,15 +251,12 @@ typedef struct PGMR0DYNMAP /** The max load ever. * This is maintained to trigger the adding of more mapping space. */ uint32_t cMaxLoad; -# ifndef IN_RC /** Initialization / termination lock. */ RTSEMFASTMUTEX hInitLock; -# endif /** The number of guard pages. */ uint32_t cGuardPages; /** The number of users (protected by hInitLock). */ uint32_t cUsers; -# ifndef IN_RC /** Array containing a copy of the original page tables. * The entries are either X86PTE or X86PTEPAE according to fLegacyMode. */ void *pvSavedPTEs; @@ -271,7 +264,6 @@ typedef struct PGMR0DYNMAP PPGMR0DYNMAPSEG pSegHead; /** The paging mode. */ SUPPAGINGMODE enmPgMode; -# endif } PGMR0DYNMAP; @@ -1276,7 +1268,6 @@ VMMRCDECL(int) PGMRCDynMapInit(PVM pVM) pThis->u32Magic = PGMRZDYNMAP_MAGIC; pThis->paPages = RT_ALIGN_PT(pThis + 1, 32, PPGMRZDYNMAPENTRY); pThis->cPages = cPages; - pThis->fLegacyMode = PGMGetHostMode(pVM) == PGMMODE_32_BIT; pThis->cLoad = 0; pThis->cMaxLoad = 0; pThis->cGuardPages = 0; @@ -1287,10 +1278,8 @@ VMMRCDECL(int) PGMRCDynMapInit(PVM pVM) pThis->paPages[iPage].HCPhys = NIL_RTHCPHYS; pThis->paPages[iPage].pvPage = pVM->pgm.s.pbDynPageMapBaseGC + iPage * PAGE_SIZE; pThis->paPages[iPage].cRefs = 0; - if (pThis->fLegacyMode) - pThis->paPages[iPage].uPte.pLegacy = &pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage]; - else - pThis->paPages[iPage].uPte.pPae = (PX86PTEPAE)&pVM->pgm.s.paDynPageMapPaePTEsGC[iPage]; + pThis->paPages[iPage].uPte.pLegacy = &pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage]; + pThis->paPages[iPage].uPte.pPae = (PX86PTEPAE)&pVM->pgm.s.paDynPageMapPaePTEsGC[iPage]; } pVM->pgm.s.pRCDynMap = pThis; @@ -1421,8 +1410,9 @@ static uint32_t pgmR0DynMapPageSlow(PPGMRZDYNMAP pThis, RTHCPHYS HCPhys, uint32_ paPages[iFreePage].HCPhys = HCPhys; #ifndef IN_RC RTCpuSetFill(&paPages[iFreePage].PendingSet); -#endif + if (pThis->fLegacyMode) +#endif { X86PGUINT uOld = paPages[iFreePage].uPte.pLegacy->u; X86PGUINT uOld2 = uOld; NOREF(uOld2); @@ -1433,7 +1423,9 @@ static uint32_t pgmR0DynMapPageSlow(PPGMRZDYNMAP pThis, RTHCPHYS HCPhys, uint32_ AssertMsgFailed(("uOld=%#x uOld2=%#x uNew=%#x\n", uOld, uOld2, uNew)); Assert(paPages[iFreePage].uPte.pLegacy->u == uNew); } +#ifndef IN_RC else +#endif { X86PGPAEUINT uOld = paPages[iFreePage].uPte.pPae->u; X86PGPAEUINT uOld2 = uOld; NOREF(uOld2); @@ -1596,7 +1588,10 @@ static int pgmRZDynMapAssertIntegrity(PPGMRZDYNMAP pThis) uint32_t cLoad = 0; PPGMRZDYNMAPENTRY paPages = pThis->paPages; uint32_t iPage = pThis->cPages; + +#ifndef IN_RC if (pThis->fLegacyMode) +#endif { #ifdef IN_RING0 PCX86PGUINT paSavedPTEs = (PCX86PGUINT)pThis->pvSavedPTEs; NOREF(paSavedPTEs); @@ -1636,7 +1631,9 @@ static int pgmRZDynMapAssertIntegrity(PPGMRZDYNMAP pThis) #endif } } +#ifndef IN_RC else +#endif { #ifdef IN_RING0 PCX86PGPAEUINT paSavedPTEs = (PCX86PGPAEUINT)pThis->pvSavedPTEs; NOREF(paSavedPTEs); diff --git a/src/VBox/VMM/include/PATMInternal.h b/src/VBox/VMM/include/PATMInternal.h index 134998ceb..e5506675f 100644 --- a/src/VBox/VMM/include/PATMInternal.h +++ b/src/VBox/VMM/include/PATMInternal.h @@ -240,6 +240,9 @@ typedef struct uint32_t uPatchRetParam1; } PATCHINFOTEMP, *PPATCHINFOTEMP; +/** Forward declaration for a pointer to a trampoline patch record. */ +typedef struct TRAMPREC *PTRAMPREC; + typedef struct _PATCHINFO { uint32_t uState; @@ -297,6 +300,10 @@ typedef struct _PATCHINFO /* Temporary information during patch creation. Don't waste hypervisor memory for this. */ R3PTRTYPE(PPATCHINFOTEMP) pTempInfo; + /* List of trampoline patches referencing this patch. + * Used when refreshing the patch. (Only for function duplicates) */ + R3PTRTYPE(PTRAMPREC) pTrampolinePatchesHead; + /* Count the number of writes to the corresponding guest code. */ uint32_t cCodeWrites; @@ -311,7 +318,7 @@ typedef struct _PATCHINFO /* First opcode byte, that's overwritten when a patch is marked dirty. */ uint8_t bDirtyOpcode; - uint8_t Alignment2[7]; /**< Align the structure size on a 8-byte boundary. */ + uint8_t Alignment2[HC_ARCH_BITS == 64 ? 7 : 3]; /**< Align the structure size on a 8-byte boundary. */ } PATCHINFO, *PPATCHINFO; #define PATCHCODE_PTR_GC(pPatch) (RTRCPTR) (pVM->patm.s.pPatchMemGC + (pPatch)->pPatchBlockOffset) @@ -330,6 +337,17 @@ typedef struct PATMPATCHREC PATCHINFO patch; } PATMPATCHREC, *PPATMPATCHREC; +/** + * Record for a trampoline patch. + */ +typedef struct TRAMPREC +{ + /** Pointer to the next trampoline patch. */ + struct TRAMPREC *pNext; + /** Pointer to the trampoline patch record. */ + PPATMPATCHREC pPatchTrampoline; +} TRAMPREC; + /** Increment for allocating room for pointer array */ #define PATMPATCHPAGE_PREALLOC_INCREMENT 16 diff --git a/src/VBox/VMM/include/PDMBlkCacheInternal.h b/src/VBox/VMM/include/PDMBlkCacheInternal.h index 45cbc9108..60765df5c 100644 --- a/src/VBox/VMM/include/PDMBlkCacheInternal.h +++ b/src/VBox/VMM/include/PDMBlkCacheInternal.h @@ -262,8 +262,6 @@ typedef struct PDMBLKCACHEREQ { /** Opaque user data returned on completion. */ void *pvUser; - /** Number of bytes to transfer. */ - volatile uint32_t cbXfer; /** Number of pending transfers (waiting for a cache entry and passed through). */ volatile uint32_t cXfersPending; /** Status code. */ @@ -291,8 +289,6 @@ typedef struct PDMBLKCACHEIOXFER RTSGBUF SgBuf; /** Transfer direction. */ PDMBLKCACHEXFERDIR enmXferDir; - /** Size of the transfer. */ - size_t cbXfer; } PDMBLKCACHEIOXFER; /** diff --git a/src/VBox/VMM/include/PGMInternal.h b/src/VBox/VMM/include/PGMInternal.h index 1023d7e2e..09e087dbf 100644 --- a/src/VBox/VMM/include/PGMInternal.h +++ b/src/VBox/VMM/include/PGMInternal.h @@ -926,6 +926,13 @@ typedef PPGMPAGE *PPPGMPAGE; #define PGM_PAGE_IS_BALLOONED(pPage) ( (pPage)->uStateY == PGM_PAGE_STATE_BALLOONED ) /** + * Checks if the page is allocated. + * @returns true/false. + * @param pPage Pointer to the physical guest page tracking structure. + */ +#define PGM_PAGE_IS_ALLOCATED(pPage) ( (pPage)->uStateY == PGM_PAGE_STATE_ALLOCATED ) + +/** * Marks the page as written to (for GMM change monitoring). * @param pPage Pointer to the physical guest page tracking structure. */ @@ -1669,17 +1676,13 @@ typedef struct PGMRCDYNMAPENTRY /** The number of references. */ int32_t volatile cRefs; /** PTE pointer union. */ - union PGMRCDYNMAPENTRY_PPTE + struct PGMRCDYNMAPENTRY_PPTE { /** PTE pointer, 32-bit legacy version. */ RCPTRTYPE(PX86PTE) pLegacy; /** PTE pointer, PAE version. */ RCPTRTYPE(PX86PTEPAE) pPae; - /** PTE pointer, the void version. */ - RTRCPTR pv; } uPte; - /** Alignment padding. */ - RTRCPTR RCPtrAlignment; } PGMRCDYNMAPENTRY; /** Pointer to a dynamic mapping cache entry for the raw-mode context. */ typedef PGMRCDYNMAPENTRY *PPGMRCDYNMAPENTRY; @@ -1704,8 +1707,6 @@ typedef struct PGMRCDYNMAP RCPTRTYPE(PPGMRCDYNMAPENTRY) paPages; /** The cache size given as a number of pages. */ uint32_t cPages; - /** Whether it's 32-bit legacy or PAE/AMD64 paging mode. */ - bool fLegacyMode; /** The current load. * This does not include guard pages. */ uint32_t cLoad; diff --git a/src/VBox/VMM/testcase/tstAnimate.cpp b/src/VBox/VMM/testcase/tstAnimate.cpp index cff9a0e4d..4d0616e83 100644 --- a/src/VBox/VMM/testcase/tstAnimate.cpp +++ b/src/VBox/VMM/testcase/tstAnimate.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2007 Oracle Corporation + * Copyright (C) 2006-2011 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; diff --git a/src/VBox/VMM/testcase/tstVMStructRC.cpp b/src/VBox/VMM/testcase/tstVMStructRC.cpp index dbe421146..e464e3ffe 100644 --- a/src/VBox/VMM/testcase/tstVMStructRC.cpp +++ b/src/VBox/VMM/testcase/tstVMStructRC.cpp @@ -797,7 +797,6 @@ int main() GEN_CHECK_OFF(PGMRCDYNMAP, u32Magic); GEN_CHECK_OFF(PGMRCDYNMAP, paPages); GEN_CHECK_OFF(PGMRCDYNMAP, cPages); - GEN_CHECK_OFF(PGMRCDYNMAP, fLegacyMode); GEN_CHECK_OFF(PGMRCDYNMAP, cLoad); GEN_CHECK_OFF(PGMRCDYNMAP, cMaxLoad); GEN_CHECK_OFF(PGMRCDYNMAP, cGuardPages); @@ -808,7 +807,6 @@ int main() GEN_CHECK_OFF(PGMRCDYNMAPENTRY, cRefs); GEN_CHECK_OFF(PGMRCDYNMAPENTRY, uPte.pLegacy); GEN_CHECK_OFF(PGMRCDYNMAPENTRY, uPte.pPae); - GEN_CHECK_OFF(PGMRCDYNMAPENTRY, uPte.pv); GEN_CHECK_OFF(PGMMAPSETENTRY, pvPage); GEN_CHECK_OFF(PGMMAPSETENTRY, iPage); GEN_CHECK_OFF(PGMMAPSETENTRY, cRefs); @@ -1173,6 +1171,7 @@ int main() GEN_CHECK_OFF(PATCHINFO, unused.pGuestLoc); GEN_CHECK_OFF(PATCHINFO, unused.opsize); GEN_CHECK_OFF(PATCHINFO, pTempInfo); + GEN_CHECK_OFF(PATCHINFO, pTrampolinePatchesHead); GEN_CHECK_OFF(PATCHINFO, cCodeWrites); GEN_CHECK_OFF(PATCHINFO, cTraps); GEN_CHECK_OFF(PATCHINFO, cInvalidWrites); |
