summaryrefslogtreecommitdiff
path: root/src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp')
-rw-r--r--src/VBox/Frontends/VBoxManage/VBoxManageControlVM.cpp281
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]);