diff options
Diffstat (limited to 'src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp')
| -rw-r--r-- | src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp | 281 |
1 files changed, 250 insertions, 31 deletions
diff --git a/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp b/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp index e75310f1..31982d06 100644 --- a/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp +++ b/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp @@ -4,7 +4,7 @@ */ /* - * Copyright (C) 2006-2012 Oracle Corporation + * Copyright (C) 2006-2013 Oracle Corporation * * This file is part of VirtualBox Open Source Edition (OSE), as * available from http://www.virtualbox.org. This file is free software; @@ -25,8 +25,6 @@ #include <VBox/com/array.h> #include <VBox/com/ErrorInfo.h> #include <VBox/com/errorprint.h> -#include <VBox/com/EventQueue.h> - #include <VBox/com/VirtualBox.h> #include <iprt/ctype.h> @@ -66,7 +64,7 @@ static unsigned parseNum(const char *psz, unsigned cMaxNum, const char *name) unsigned int getMaxNics(IVirtualBox* vbox, IMachine* mach) { - ComPtr <ISystemProperties> info; + ComPtr<ISystemProperties> info; ChipsetType_T aChipset; ULONG NetworkAdapterCount = 0; HRESULT rc; @@ -92,7 +90,7 @@ int handleControlVM(HandlerArg *a) return errorSyntax(USAGE_CONTROLVM, "Not enough parameters"); /* try to find the given machine */ - ComPtr <IMachine> machine; + ComPtr<IMachine> machine; CHECK_ERROR(a->virtualBox, FindMachine(Bstr(a->argv[0]).raw(), machine.asOutParam())); if (FAILED(rc)) @@ -283,8 +281,14 @@ int handleControlVM(HandlerArg *a) } else if (!strcmp(a->argv[1], "keyboardputscancode")) { - ComPtr<IKeyboard> keyboard; - CHECK_ERROR_BREAK(console, COMGETTER(Keyboard)(keyboard.asOutParam())); + ComPtr<IKeyboard> pKeyboard; + CHECK_ERROR_BREAK(console, COMGETTER(Keyboard)(pKeyboard.asOutParam())); + if (!pKeyboard) + { + RTMsgError("Guest not running"); + rc = E_FAIL; + break; + } if (a->argc <= 1 + 1) { @@ -328,7 +332,7 @@ int handleControlVM(HandlerArg *a) /* Send scancodes to the VM. */ com::SafeArray<LONG> saScancodes(llScancodes); ULONG codesStored = 0; - CHECK_ERROR_BREAK(keyboard, PutScancodes(ComSafeArrayAsInParam(saScancodes), + CHECK_ERROR_BREAK(pKeyboard, PutScancodes(ComSafeArrayAsInParam(saScancodes), &codesStored)); if (codesStored < saScancodes.size()) { @@ -620,6 +624,53 @@ int handleControlVM(HandlerArg *a) RTMsgError("The NIC %d is currently disabled and thus its properties can't be changed", n); } } + else if (!strncmp(a->argv[1], "nicpromisc", 10)) + { + /* Get the number of network adapters */ + ULONG NetworkAdapterCount = getMaxNics(a->virtualBox,sessionMachine) ; + unsigned n = parseNum(&a->argv[1][10], NetworkAdapterCount, "NIC"); + if (!n) + { + rc = E_FAIL; + break; + } + if (a->argc <= 2) + { + errorArgument("Missing argument to '%s'", a->argv[1]); + rc = E_FAIL; + break; + } + + /* get the corresponding network adapter */ + ComPtr<INetworkAdapter> adapter; + CHECK_ERROR_BREAK(sessionMachine, GetNetworkAdapter(n - 1, adapter.asOutParam())); + if (adapter) + { + BOOL fEnabled; + adapter->COMGETTER(Enabled)(&fEnabled); + if (fEnabled) + { + NetworkAdapterPromiscModePolicy_T enmPromiscModePolicy; + if (!strcmp(a->argv[2], "deny")) + enmPromiscModePolicy = NetworkAdapterPromiscModePolicy_Deny; + else if ( !strcmp(a->argv[2], "allow-vms") + || !strcmp(a->argv[2], "allow-network")) + enmPromiscModePolicy = NetworkAdapterPromiscModePolicy_AllowNetwork; + else if (!strcmp(a->argv[2], "allow-all")) + enmPromiscModePolicy = NetworkAdapterPromiscModePolicy_AllowAll; + else + { + errorArgument("Unknown promiscuous mode policy '%s'", a->argv[2]); + rc = E_INVALIDARG; + break; + } + + CHECK_ERROR(adapter, COMSETTER(PromiscModePolicy)(enmPromiscModePolicy)); + } + else + RTMsgError("The NIC %d is currently disabled and thus its promiscuous mode can't be changed", n); + } + } else if (!strncmp(a->argv[1], "nic", 3)) { /* Get the number of network adapters */ @@ -709,6 +760,18 @@ int handleControlVM(HandlerArg *a) CHECK_ERROR_RET(adapter, COMSETTER(GenericDriver)(Bstr(a->argv[3]).raw()), 1); CHECK_ERROR_RET(adapter, COMSETTER(AttachmentType)(NetworkAttachmentType_Generic), 1); } + else if (!strcmp(a->argv[2], "natnetwork")) + { + if (a->argc <= 3) + { + errorArgument("Missing argument to '%s'", a->argv[2]); + rc = E_FAIL; + break; + } + CHECK_ERROR_RET(adapter, COMSETTER(Enabled)(TRUE), 1); + CHECK_ERROR_RET(adapter, COMSETTER(NATNetwork)(Bstr(a->argv[3]).raw()), 1); + CHECK_ERROR_RET(adapter, COMSETTER(AttachmentType)(NetworkAttachmentType_NATNetwork), 1); + } /** @todo obsolete, remove eventually */ else if (!strcmp(a->argv[2], "vde")) { @@ -873,16 +936,18 @@ int handleControlVM(HandlerArg *a) bool attach = !strcmp(a->argv[1], "usbattach"); Bstr usbId = a->argv[2]; - if (Guid(usbId).isEmpty()) + + Guid guid(usbId); + if (!guid.isValid()) { // assume address if (attach) { - ComPtr <IHost> host; + ComPtr<IHost> host; CHECK_ERROR_BREAK(a->virtualBox, COMGETTER(Host)(host.asOutParam())); SafeIfaceArray <IHostUSBDevice> coll; CHECK_ERROR_BREAK(host, COMGETTER(USBDevices)(ComSafeArrayAsOutParam(coll))); - ComPtr <IHostUSBDevice> dev; + ComPtr<IHostUSBDevice> dev; CHECK_ERROR_BREAK(host, FindUSBDeviceByAddress(Bstr(a->argv[2]).raw(), dev.asOutParam())); CHECK_ERROR_BREAK(dev, COMGETTER(Id)(usbId.asOutParam())); @@ -891,18 +956,24 @@ int handleControlVM(HandlerArg *a) { SafeIfaceArray <IUSBDevice> coll; CHECK_ERROR_BREAK(console, COMGETTER(USBDevices)(ComSafeArrayAsOutParam(coll))); - ComPtr <IUSBDevice> dev; + ComPtr<IUSBDevice> dev; CHECK_ERROR_BREAK(console, FindUSBDeviceByAddress(Bstr(a->argv[2]).raw(), dev.asOutParam())); CHECK_ERROR_BREAK(dev, COMGETTER(Id)(usbId.asOutParam())); } } + else if (guid.isZero()) + { + errorArgument("Zero UUID argument '%s'", a->argv[2]); + rc = E_FAIL; + break; + } if (attach) CHECK_ERROR_BREAK(console, AttachUSBDevice(usbId.raw())); else { - ComPtr <IUSBDevice> dev; + ComPtr<IUSBDevice> dev; CHECK_ERROR_BREAK(console, DetachUSBDevice(usbId.raw(), dev.asOutParam())); } @@ -943,11 +1014,17 @@ int handleControlVM(HandlerArg *a) fChangeOrigin = true; } - ComPtr<IDisplay> display; - CHECK_ERROR_BREAK(console, COMGETTER(Display)(display.asOutParam())); - CHECK_ERROR_BREAK(display, SetVideoModeHint(uDisplayIdx, fEnabled, - fChangeOrigin, iOriginX, iOriginY, - uXRes, uYRes, uBpp)); + ComPtr<IDisplay> pDisplay; + CHECK_ERROR_BREAK(console, COMGETTER(Display)(pDisplay.asOutParam())); + if (!pDisplay) + { + RTMsgError("Guest not running"); + rc = E_FAIL; + break; + } + CHECK_ERROR_BREAK(pDisplay, SetVideoModeHint(uDisplayIdx, fEnabled, + fChangeOrigin, iOriginX, iOriginY, + uXRes, uYRes, uBpp)); } else if (!strcmp(a->argv[1], "setcredentials")) { @@ -993,12 +1070,18 @@ int handleControlVM(HandlerArg *a) domain = a->argv[5]; } - ComPtr<IGuest> guest; - CHECK_ERROR_BREAK(console, COMGETTER(Guest)(guest.asOutParam())); - CHECK_ERROR_BREAK(guest, SetCredentials(Bstr(a->argv[2]).raw(), - Bstr(passwd).raw(), - Bstr(domain).raw(), - fAllowLocalLogon)); + ComPtr<IGuest> pGuest; + CHECK_ERROR_BREAK(console, COMGETTER(Guest)(pGuest.asOutParam())); + if (!pGuest) + { + RTMsgError("Guest not running"); + rc = E_FAIL; + break; + } + CHECK_ERROR_BREAK(pGuest, SetCredentials(Bstr(a->argv[2]).raw(), + Bstr(passwd).raw(), + Bstr(domain).raw(), + fAllowLocalLogon)); } #if 0 /* TODO: review & remove */ else if (!strcmp(a->argv[1], "dvdattach")) @@ -1140,10 +1223,18 @@ int handleControlVM(HandlerArg *a) break; } /* guest is running; update IGuest */ - ComPtr <IGuest> guest; - rc = console->COMGETTER(Guest)(guest.asOutParam()); + ComPtr<IGuest> pGuest; + rc = console->COMGETTER(Guest)(pGuest.asOutParam()); if (SUCCEEDED(rc)) - CHECK_ERROR(guest, COMSETTER(MemoryBalloonSize)(uVal)); + { + if (!pGuest) + { + RTMsgError("Guest not running"); + rc = E_FAIL; + break; + } + CHECK_ERROR(pGuest, COMSETTER(MemoryBalloonSize)(uVal)); + } } else if (!strcmp(a->argv[1], "teleport")) { @@ -1219,10 +1310,10 @@ int handleControlVM(HandlerArg *a) break; } int vrc; - uint32_t displayIdx = 0; + uint32_t iScreen = 0; if (a->argc == 4) { - vrc = RTStrToUInt32Ex(a->argv[3], NULL, 0, &displayIdx); + vrc = RTStrToUInt32Ex(a->argv[3], NULL, 0, &iScreen); if (vrc != VINF_SUCCESS) { errorArgument("Error parsing display number '%s'", a->argv[3]); @@ -1232,10 +1323,17 @@ int handleControlVM(HandlerArg *a) } ComPtr<IDisplay> pDisplay; CHECK_ERROR_BREAK(console, COMGETTER(Display)(pDisplay.asOutParam())); + if (!pDisplay) + { + RTMsgError("Guest not running"); + rc = E_FAIL; + break; + } ULONG width, height, bpp; - CHECK_ERROR_BREAK(pDisplay, GetScreenResolution(displayIdx, &width, &height, &bpp)); + LONG xOrigin, yOrigin; + CHECK_ERROR_BREAK(pDisplay, GetScreenResolution(iScreen, &width, &height, &bpp, &xOrigin, &yOrigin)); com::SafeArray<BYTE> saScreenshot; - CHECK_ERROR_BREAK(pDisplay, TakeScreenShotPNGToArray(displayIdx, width, height, ComSafeArrayAsOutParam(saScreenshot))); + CHECK_ERROR_BREAK(pDisplay, TakeScreenShotPNGToArray(iScreen, width, height, ComSafeArrayAsOutParam(saScreenshot))); RTFILE pngFile = NIL_RTFILE; vrc = RTFileOpen(&pngFile, a->argv[2], RTFILE_O_OPEN_CREATE | RTFILE_O_WRITE | RTFILE_O_TRUNCATE | RTFILE_O_DENY_ALL); if (RT_FAILURE(vrc)) @@ -1252,6 +1350,127 @@ int handleControlVM(HandlerArg *a) } RTFileClose(pngFile); } + else if ( !strcmp(a->argv[1], "vcpenabled")) + { + if (a->argc != 3) + { + errorArgument("Missing argument to '%s'", a->argv[1]); + rc = E_FAIL; + break; + } + if (!strcmp(a->argv[2], "on")) + { + CHECK_ERROR_RET(sessionMachine, COMSETTER(VideoCaptureEnabled)(TRUE), 1); + } + else if (!strcmp(a->argv[2], "off")) + { + CHECK_ERROR_RET(sessionMachine, COMSETTER(VideoCaptureEnabled)(FALSE), 1); + } + else + { + errorArgument("Invalid state '%s'", Utf8Str(a->argv[2]).c_str()); + rc = E_FAIL; + break; + } + } + else if ( !strcmp(a->argv[1], "videocapturescreens")) + { + ULONG cMonitors = 64; + CHECK_ERROR_BREAK(machine, COMGETTER(MonitorCount)(&cMonitors)); + com::SafeArray<BOOL> saScreens(cMonitors); + if ( a->argc == 3 + && !strcmp(a->argv[2], "all")) + { + /* enable all screens */ + for (unsigned i = 0; i < cMonitors; i++) + saScreens[i] = true; + } + else if ( a->argc == 3 + && !strcmp(a->argv[2], "none")) + { + /* disable all screens */ + for (unsigned i = 0; i < cMonitors; i++) + saScreens[i] = false; + } + else + { + /* enable selected screens */ + for (unsigned i = 0; i < cMonitors; i++) + saScreens[i] = false; + for (int i = 2; SUCCEEDED(rc) && i < a->argc; i++) + { + uint32_t iScreen; + int vrc = RTStrToUInt32Ex(a->argv[i], NULL, 0, &iScreen); + if (vrc != VINF_SUCCESS) + { + errorArgument("Error parsing display number '%s'", a->argv[i]); + rc = E_FAIL; + break; + } + if (iScreen >= cMonitors) + { + errorArgument("Invalid screen ID specified '%u'", iScreen); + rc = E_FAIL; + break; + } + saScreens[iScreen] = true; + } + } + + CHECK_ERROR_BREAK(sessionMachine, COMSETTER(VideoCaptureScreens)(ComSafeArrayAsInParam(saScreens))); + } + else if (!strcmp(a->argv[1], "webcam")) + { + if (a->argc < 3) + { + errorArgument("Missing argument to '%s'", a->argv[1]); + rc = E_FAIL; + break; + } + + ComPtr<IEmulatedUSB> pEmulatedUSB; + CHECK_ERROR_BREAK(console, COMGETTER(EmulatedUSB)(pEmulatedUSB.asOutParam())); + if (!pEmulatedUSB) + { + RTMsgError("Guest not running"); + rc = E_FAIL; + break; + } + + if (!strcmp(a->argv[2], "attach")) + { + Bstr path(""); + if (a->argc >= 4) + path = a->argv[3]; + Bstr settings(""); + if (a->argc >= 5) + settings = a->argv[4]; + CHECK_ERROR_BREAK(pEmulatedUSB, WebcamAttach(path.raw(), settings.raw())); + } + else if (!strcmp(a->argv[2], "detach")) + { + Bstr path(""); + if (a->argc >= 4) + path = a->argv[3]; + CHECK_ERROR_BREAK(pEmulatedUSB, WebcamDetach(path.raw())); + } + else if (!strcmp(a->argv[2], "list")) + { + com::SafeArray <BSTR> webcams; + CHECK_ERROR_BREAK(pEmulatedUSB, COMGETTER(Webcams)(ComSafeArrayAsOutParam(webcams))); + for (size_t i = 0; i < webcams.size(); ++i) + { + RTPrintf("%ls\n", webcams[i][0]? webcams[i]: Bstr("default").raw()); + } + } + else + { + errorArgument("Invalid argument to '%s'", a->argv[1]); + rc = E_FAIL; + break; + } + + } else { errorSyntax(USAGE_CONTROLVM, "Invalid parameter '%s'", a->argv[1]); |
