VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxManage/VBoxManageModifyVM.cpp@ 23760

Last change on this file since 23760 was 23754, checked in by vboxsync, 16 years ago

VBoxManageModifyVM: get uuid only if dvdMedium is present

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 77.9 KB
Line 
1/* $Id: VBoxManageModifyVM.cpp 23754 2009-10-14 11:29:45Z vboxsync $ */
2/** @file
3 * VBoxManage - Implementation of modifyvm command.
4 */
5
6/*
7 * Copyright (C) 2006-2009 Sun Microsystems, Inc.
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
18 * Clara, CA 95054 USA or visit http://www.sun.com if you need
19 * additional information or have any questions.
20 */
21
22/*******************************************************************************
23* Header Files *
24*******************************************************************************/
25#ifndef VBOX_ONLY_DOCS
26#include <VBox/com/com.h>
27#include <VBox/com/array.h>
28#include <VBox/com/ErrorInfo.h>
29#include <VBox/com/errorprint.h>
30#include <VBox/com/EventQueue.h>
31
32#include <VBox/com/VirtualBox.h>
33
34#include <vector>
35#include <list>
36#endif /* !VBOX_ONLY_DOCS */
37
38#include <iprt/cidr.h>
39#include <iprt/param.h>
40#include <iprt/path.h>
41#include <iprt/stream.h>
42#include <iprt/string.h>
43#include <iprt/getopt.h>
44#include <VBox/log.h>
45
46#include "VBoxManage.h"
47
48#ifndef VBOX_ONLY_DOCS
49using namespace com;
50
51
52/** @todo refine this after HDD changes; MSC 8.0/64 has trouble with handleModifyVM. */
53#if defined(_MSC_VER)
54# pragma optimize("g", off)
55#endif
56
57enum enOptionCodes
58{
59 MODIFYVMNAME = 1000,
60 MODIFYVMOSTYPE,
61 MODIFYVMMEMORY,
62 MODIFYVMVRAM,
63 MODIFYVMFIRMWARE,
64 MODIFYVMACPI,
65 MODIFYVMIOAPIC,
66 MODIFYVMPAE,
67 MODIFYVMSYNTHCPU,
68 MODIFYVMHWVIRTEX,
69 MODIFYVMHWVIRTEXEXCLUSIVE,
70 MODIFYVMNESTEDPAGING,
71 MODIFYVMVTXVPID,
72 MODIFYVMCPUS,
73 MODIFYVMMONITORCOUNT,
74 MODIFYVMACCELERATE3D,
75 MODIFYVMACCELERATE2DVIDEO,
76 MODIFYVMBIOSLOGOFADEIN,
77 MODIFYVMBIOSLOGOFADEOUT,
78 MODIFYVMBIOSLOGODISPLAYTIME,
79 MODIFYVMBIOSLOGOIMAGEPATH,
80 MODIFYVMBIOSBOOTMENU,
81 MODIFYVMBIOSSYSTEMTIMEOFFSET,
82 MODIFYVMBIOSPXEDEBUG,
83 MODIFYVMBOOT,
84 MODIFYVMHDA,
85 MODIFYVMHDB,
86 MODIFYVMHDD,
87 MODIFYVMIDECONTROLLER,
88 MODIFYVMSATAIDEEMULATION,
89 MODIFYVMSATAPORTCOUNT,
90 MODIFYVMSATAPORT,
91 MODIFYVMSATA,
92 MODIFYVMSCSIPORT,
93 MODIFYVMSCSITYPE,
94 MODIFYVMSCSI,
95 MODIFYVMDVDPASSTHROUGH,
96 MODIFYVMDVD,
97 MODIFYVMFLOPPY,
98 MODIFYVMNICTRACEFILE,
99 MODIFYVMNICTRACE,
100 MODIFYVMNICTYPE,
101 MODIFYVMNICSPEED,
102 MODIFYVMNIC,
103 MODIFYVMCABLECONNECTED,
104 MODIFYVMBRIDGEADAPTER,
105 MODIFYVMHOSTONLYADAPTER,
106 MODIFYVMINTNET,
107 MODIFYVMNATNET,
108 MODIFYVMMACADDRESS,
109 MODIFYVMUARTMODE,
110 MODIFYVMUART,
111 MODIFYVMGUESTSTATISTICSINTERVAL,
112 MODIFYVMGUESTMEMORYBALLOON,
113 MODIFYVMAUDIOCONTROLLER,
114 MODIFYVMAUDIO,
115 MODIFYVMCLIPBOARD,
116 MODIFYVMVRDPPORT,
117 MODIFYVMVRDPADDRESS,
118 MODIFYVMVRDPAUTHTYPE,
119 MODIFYVMVRDPMULTICON,
120 MODIFYVMVRDPREUSECON,
121 MODIFYVMVRDP,
122 MODIFYVMUSBEHCI,
123 MODIFYVMUSB,
124 MODIFYVMSNAPSHOTFOLDER,
125 MODIFYVMLIVEMIGRATIONTARGET,
126 MODIFYVMLIVEMIGRATIONPORT,
127 MODIFYVMLIVEMIGRATIONPASSWORD,
128};
129
130static const RTGETOPTDEF g_aModifyVMOptions[] =
131{
132 { "--name", MODIFYVMNAME, RTGETOPT_REQ_STRING },
133 { "--ostype", MODIFYVMOSTYPE, RTGETOPT_REQ_STRING },
134 { "--memory", MODIFYVMMEMORY, RTGETOPT_REQ_UINT32 },
135 { "--vram", MODIFYVMVRAM, RTGETOPT_REQ_UINT32 },
136 { "--firmware", MODIFYVMFIRMWARE, RTGETOPT_REQ_STRING },
137 { "--acpi", MODIFYVMACPI, RTGETOPT_REQ_STRING },
138 { "--ioapic", MODIFYVMIOAPIC, RTGETOPT_REQ_STRING },
139 { "--pae", MODIFYVMPAE, RTGETOPT_REQ_STRING },
140 { "--synthcpu", MODIFYVMSYNTHCPU, RTGETOPT_REQ_STRING },
141 { "--hwvirtex", MODIFYVMHWVIRTEX, RTGETOPT_REQ_STRING },
142 { "--hwvirtexexcl", MODIFYVMHWVIRTEXEXCLUSIVE, RTGETOPT_REQ_STRING },
143 { "--nestedpaging", MODIFYVMNESTEDPAGING, RTGETOPT_REQ_STRING },
144 { "--vtxvpid", MODIFYVMVTXVPID, RTGETOPT_REQ_STRING },
145 { "--cpus", MODIFYVMCPUS, RTGETOPT_REQ_UINT32 },
146 { "--monitorcount", MODIFYVMMONITORCOUNT, RTGETOPT_REQ_UINT32 },
147 { "--accelerate3d", MODIFYVMACCELERATE3D, RTGETOPT_REQ_STRING },
148 { "--accelerate2dvideo", MODIFYVMACCELERATE2DVIDEO, RTGETOPT_REQ_STRING },
149 { "--bioslogofadein", MODIFYVMBIOSLOGOFADEIN, RTGETOPT_REQ_STRING },
150 { "--bioslogofadeout", MODIFYVMBIOSLOGOFADEOUT, RTGETOPT_REQ_STRING },
151 { "--bioslogodisplaytime", MODIFYVMBIOSLOGODISPLAYTIME, RTGETOPT_REQ_UINT64 },
152 { "--bioslogoimagepath", MODIFYVMBIOSLOGOIMAGEPATH, RTGETOPT_REQ_STRING },
153 { "--biosbootmenu", MODIFYVMBIOSBOOTMENU, RTGETOPT_REQ_STRING },
154 { "--biossystemtimeoffset", MODIFYVMBIOSSYSTEMTIMEOFFSET, RTGETOPT_REQ_UINT64 },
155 { "--biospxedebug", MODIFYVMBIOSPXEDEBUG, RTGETOPT_REQ_STRING },
156 { "--boot", MODIFYVMBOOT, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
157 { "--hda", MODIFYVMHDA, RTGETOPT_REQ_STRING },
158 { "--hdb", MODIFYVMHDB, RTGETOPT_REQ_STRING },
159 { "--hdd", MODIFYVMHDD, RTGETOPT_REQ_STRING },
160 { "--idecontroller", MODIFYVMIDECONTROLLER, RTGETOPT_REQ_STRING },
161 { "--sataideemulation", MODIFYVMSATAIDEEMULATION, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
162 { "--sataportcount", MODIFYVMSATAPORTCOUNT, RTGETOPT_REQ_UINT32 },
163 { "--sataport", MODIFYVMSATAPORT, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
164 { "--sata", MODIFYVMSATA, RTGETOPT_REQ_STRING },
165 { "--scsiport", MODIFYVMSCSIPORT, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
166 { "--scsitype", MODIFYVMSCSITYPE, RTGETOPT_REQ_STRING },
167 { "--scsi", MODIFYVMSCSI, RTGETOPT_REQ_STRING },
168 { "--dvdpassthrough", MODIFYVMDVDPASSTHROUGH, RTGETOPT_REQ_STRING },
169 { "--dvd", MODIFYVMDVD, RTGETOPT_REQ_STRING },
170 { "--floppy", MODIFYVMFLOPPY, RTGETOPT_REQ_STRING },
171 { "--nictracefile", MODIFYVMNICTRACEFILE, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
172 { "--nictrace", MODIFYVMNICTRACE, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
173 { "--nictype", MODIFYVMNICTYPE, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
174 { "--nicspeed", MODIFYVMNICSPEED, RTGETOPT_REQ_UINT32 | RTGETOPT_FLAG_INDEX },
175 { "--nic", MODIFYVMNIC, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
176 { "--cableconnected", MODIFYVMCABLECONNECTED, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
177 { "--bridgeadapter", MODIFYVMBRIDGEADAPTER, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
178 { "--hostonlyadapter", MODIFYVMHOSTONLYADAPTER, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
179 { "--intnet", MODIFYVMINTNET, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
180 { "--natnet", MODIFYVMNATNET, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
181 { "--macaddress", MODIFYVMMACADDRESS, RTGETOPT_REQ_MACADDR | RTGETOPT_FLAG_INDEX },
182 { "--uartmode", MODIFYVMUARTMODE, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
183 { "--uart", MODIFYVMUART, RTGETOPT_REQ_STRING | RTGETOPT_FLAG_INDEX },
184 { "--gueststatisticsinterval", MODIFYVMGUESTSTATISTICSINTERVAL, RTGETOPT_REQ_UINT32 },
185 { "--guestmemoryballoon", MODIFYVMGUESTMEMORYBALLOON, RTGETOPT_REQ_UINT32 },
186 { "--audiocontroller", MODIFYVMAUDIOCONTROLLER, RTGETOPT_REQ_STRING },
187 { "--audio", MODIFYVMAUDIO, RTGETOPT_REQ_STRING },
188 { "--clipboard", MODIFYVMCLIPBOARD, RTGETOPT_REQ_STRING },
189 { "--vrdpport", MODIFYVMVRDPPORT, RTGETOPT_REQ_STRING },
190 { "--vrdpaddress", MODIFYVMVRDPADDRESS, RTGETOPT_REQ_STRING },
191 { "--vrdpauthtype", MODIFYVMVRDPAUTHTYPE, RTGETOPT_REQ_STRING },
192 { "--vrdpmulticon", MODIFYVMVRDPMULTICON, RTGETOPT_REQ_STRING },
193 { "--vrdpreusecon", MODIFYVMVRDPREUSECON, RTGETOPT_REQ_STRING },
194 { "--vrdp", MODIFYVMVRDP, RTGETOPT_REQ_STRING },
195 { "--usbehci", MODIFYVMUSBEHCI, RTGETOPT_REQ_STRING },
196 { "--usb", MODIFYVMUSB, RTGETOPT_REQ_STRING },
197 { "--snapshotfolder", MODIFYVMSNAPSHOTFOLDER, RTGETOPT_REQ_STRING },
198 { "--livemigrationtarget", MODIFYVMLIVEMIGRATIONTARGET, RTGETOPT_REQ_STRING },
199 { "--livemigrationport", MODIFYVMLIVEMIGRATIONPORT, RTGETOPT_REQ_UINT32 },
200 { "--livemigrationpassword", MODIFYVMLIVEMIGRATIONPASSWORD, RTGETOPT_REQ_STRING },
201};
202
203int handleModifyVM(HandlerArg *a)
204{
205 int c;
206 HRESULT rc;
207 Bstr name;
208 Bstr machineuuid (a->argv[0]);
209 RTGETOPTUNION pValueUnion;
210 RTGETOPTSTATE pGetState;
211 ComPtr <IMachine> machine;
212 ComPtr <IBIOSSettings> biosSettings;
213
214 /* VM ID + at least one parameter. Parameter arguments are checked
215 * individually. */
216 if (a->argc < 2)
217 return errorSyntax(USAGE_MODIFYVM, "Not enough parameters");
218
219 /* Get the number of network adapters */
220 ULONG NetworkAdapterCount = 0;
221 {
222 ComPtr <ISystemProperties> info;
223 CHECK_ERROR_RET (a->virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
224 CHECK_ERROR_RET (info, COMGETTER(NetworkAdapterCount) (&NetworkAdapterCount), 1);
225 }
226 ULONG SerialPortCount = 0;
227 {
228 ComPtr <ISystemProperties> info;
229 CHECK_ERROR_RET (a->virtualBox, COMGETTER(SystemProperties) (info.asOutParam()), 1);
230 CHECK_ERROR_RET (info, COMGETTER(SerialPortCount) (&SerialPortCount), 1);
231 }
232
233 /* try to find the given machine */
234 if (!Guid(machineuuid).isEmpty())
235 {
236 CHECK_ERROR_RET (a->virtualBox, GetMachine (machineuuid, machine.asOutParam()), 1);
237 }
238 else
239 {
240 CHECK_ERROR_RET (a->virtualBox, FindMachine(Bstr(a->argv[0]), machine.asOutParam()), 1);
241 machine->COMGETTER(Id)(machineuuid.asOutParam());
242 }
243
244 /* open a session for the VM */
245 CHECK_ERROR_RET (a->virtualBox, OpenSession(a->session, machineuuid), 1);
246
247 /* get the mutable session machine */
248 a->session->COMGETTER(Machine)(machine.asOutParam());
249 machine->COMGETTER(BIOSSettings)(biosSettings.asOutParam());
250
251 RTGetOptInit (&pGetState, a->argc, a->argv, g_aModifyVMOptions,
252 RT_ELEMENTS(g_aModifyVMOptions), 1, 0 /* fFlags */);
253
254 while ( SUCCEEDED (rc)
255 && (c = RTGetOpt(&pGetState, &pValueUnion)))
256 {
257 switch (c)
258 {
259 case MODIFYVMNAME:
260 {
261 if (pValueUnion.psz)
262 CHECK_ERROR (machine, COMSETTER(Name)(Bstr(pValueUnion.psz)));
263 break;
264 }
265 case MODIFYVMOSTYPE:
266 {
267 if (pValueUnion.psz)
268 {
269 ComPtr<IGuestOSType> guestOSType;
270 CHECK_ERROR (a->virtualBox, GetGuestOSType(Bstr(pValueUnion.psz), guestOSType.asOutParam()));
271 if (SUCCEEDED(rc) && guestOSType)
272 {
273 CHECK_ERROR (machine, COMSETTER(OSTypeId)(Bstr(pValueUnion.psz)));
274 }
275 else
276 {
277 errorArgument("Invalid guest OS type '%s'", Utf8Str(pValueUnion.psz).raw());
278 rc = E_FAIL;
279 }
280 }
281 break;
282 }
283
284 case MODIFYVMMEMORY:
285 {
286 if (pValueUnion.u32 > 0)
287 CHECK_ERROR (machine, COMSETTER(MemorySize)(pValueUnion.u32));
288 break;
289 }
290
291 case MODIFYVMVRAM:
292 {
293 if (pValueUnion.u32 > 0)
294 CHECK_ERROR (machine, COMSETTER(VRAMSize)(pValueUnion.u32));
295 break;
296 }
297
298 case MODIFYVMFIRMWARE:
299 {
300 if (pValueUnion.psz)
301 {
302 if (!strcmp(pValueUnion.psz, "efi"))
303 {
304 CHECK_ERROR (machine, COMSETTER(FirmwareType)(FirmwareType_EFI));
305 }
306 else if (!strcmp(pValueUnion.psz, "bios"))
307 {
308 CHECK_ERROR (machine, COMSETTER(FirmwareType)(FirmwareType_BIOS));
309 }
310 else
311 {
312 errorArgument("Invalid --firmware argument '%s'", pValueUnion.psz);
313 rc = E_FAIL;
314 }
315 }
316 break;
317 }
318
319 case MODIFYVMACPI:
320 {
321 if (pValueUnion.psz)
322 {
323 if (!strcmp(pValueUnion.psz, "on"))
324 {
325 CHECK_ERROR (biosSettings, COMSETTER(ACPIEnabled)(true));
326 }
327 else if (!strcmp(pValueUnion.psz, "off"))
328 {
329 CHECK_ERROR (biosSettings, COMSETTER(ACPIEnabled)(false));
330 }
331 else
332 {
333 errorArgument("Invalid --acpi argument '%s'", pValueUnion.psz);
334 rc = E_FAIL;
335 }
336 }
337 break;
338 }
339
340 case MODIFYVMIOAPIC:
341 {
342 if (pValueUnion.psz)
343 {
344 if (!strcmp(pValueUnion.psz, "on"))
345 {
346 CHECK_ERROR (biosSettings, COMSETTER(IOAPICEnabled)(true));
347 }
348 else if (!strcmp(pValueUnion.psz, "off"))
349 {
350 CHECK_ERROR (biosSettings, COMSETTER(IOAPICEnabled)(false));
351 }
352 else
353 {
354 errorArgument("Invalid --ioapic argument '%s'", pValueUnion.psz);
355 rc = E_FAIL;
356 }
357 }
358 break;
359 }
360
361 case MODIFYVMPAE:
362 {
363 if (pValueUnion.psz)
364 {
365 if (!strcmp(pValueUnion.psz, "on"))
366 {
367 CHECK_ERROR (machine, SetCpuProperty(CpuPropertyType_PAE, true));
368 }
369 else if (!strcmp(pValueUnion.psz, "off"))
370 {
371 CHECK_ERROR (machine, SetCpuProperty(CpuPropertyType_PAE, false));
372 }
373 else
374 {
375 errorArgument("Invalid --pae argument '%s'", pValueUnion.psz);
376 rc = E_FAIL;
377 }
378 }
379 break;
380 }
381
382 case MODIFYVMSYNTHCPU:
383 {
384 if (pValueUnion.psz)
385 {
386 if (!strcmp(pValueUnion.psz, "on"))
387 {
388 CHECK_ERROR (machine, SetCpuProperty(CpuPropertyType_Synthetic, true));
389 }
390 else if (!strcmp(pValueUnion.psz, "off"))
391 {
392 CHECK_ERROR (machine, SetCpuProperty(CpuPropertyType_Synthetic, false));
393 }
394 else
395 {
396 errorArgument("Invalid --synthcpu argument '%s'", pValueUnion.psz);
397 rc = E_FAIL;
398 }
399 }
400 break;
401 }
402
403 case MODIFYVMHWVIRTEX:
404 {
405 if (pValueUnion.psz)
406 {
407 if (!strcmp(pValueUnion.psz, "on"))
408 {
409 CHECK_ERROR (machine, SetHWVirtExProperty(HWVirtExPropertyType_Enabled, TRUE));
410 }
411 else if (!strcmp(pValueUnion.psz, "off"))
412 {
413 CHECK_ERROR (machine, SetHWVirtExProperty(HWVirtExPropertyType_Enabled, FALSE));
414 }
415 else
416 {
417 errorArgument("Invalid --hwvirtex argument '%s'", pValueUnion.psz);
418 rc = E_FAIL;
419 }
420 }
421 break;
422 }
423
424 case MODIFYVMHWVIRTEXEXCLUSIVE:
425 {
426 if (pValueUnion.psz)
427 {
428 if (!strcmp(pValueUnion.psz, "on"))
429 {
430 CHECK_ERROR (machine, SetHWVirtExProperty(HWVirtExPropertyType_Exclusive, TRUE));
431 }
432 else if (!strcmp(pValueUnion.psz, "off"))
433 {
434 CHECK_ERROR (machine, SetHWVirtExProperty(HWVirtExPropertyType_Exclusive, FALSE));
435 }
436 else
437 {
438 errorArgument("Invalid --hwvirtex argument '%s'", pValueUnion.psz);
439 rc = E_FAIL;
440 }
441 }
442 break;
443 }
444
445 case MODIFYVMNESTEDPAGING:
446 {
447 if (pValueUnion.psz)
448 {
449 if (!strcmp(pValueUnion.psz, "on"))
450 {
451 CHECK_ERROR (machine, SetHWVirtExProperty(HWVirtExPropertyType_NestedPaging, TRUE));
452 }
453 else if (!strcmp(pValueUnion.psz, "off"))
454 {
455 CHECK_ERROR (machine, SetHWVirtExProperty(HWVirtExPropertyType_NestedPaging, FALSE));
456 }
457 else
458 {
459 errorArgument("Invalid --nestedpaging argument '%s'", pValueUnion.psz);
460 rc = E_FAIL;
461 }
462 }
463 break;
464 }
465
466 case MODIFYVMVTXVPID:
467 {
468 if (pValueUnion.psz)
469 {
470 if (!strcmp(pValueUnion.psz, "on"))
471 {
472 CHECK_ERROR (machine, SetHWVirtExProperty(HWVirtExPropertyType_VPID, TRUE));
473 }
474 else if (!strcmp(pValueUnion.psz, "off"))
475 {
476 CHECK_ERROR (machine, SetHWVirtExProperty(HWVirtExPropertyType_VPID, FALSE));
477 }
478 else
479 {
480 errorArgument("Invalid --vtxvpid argument '%s'", pValueUnion.psz);
481 rc = E_FAIL;
482 }
483 }
484 break;
485 }
486
487 case MODIFYVMCPUS:
488 {
489 if (pValueUnion.u32 > 0)
490 CHECK_ERROR (machine, COMSETTER(CPUCount)(pValueUnion.u32));
491 break;
492 }
493
494 case MODIFYVMMONITORCOUNT:
495 {
496 if (pValueUnion.u32 > 0)
497 CHECK_ERROR (machine, COMSETTER(MonitorCount)(pValueUnion.u32));
498 break;
499 }
500
501 case MODIFYVMACCELERATE3D:
502 {
503 if (pValueUnion.psz)
504 {
505 if (!strcmp(pValueUnion.psz, "on"))
506 {
507 CHECK_ERROR (machine, COMSETTER(Accelerate3DEnabled)(true));
508 }
509 else if (!strcmp(pValueUnion.psz, "off"))
510 {
511 CHECK_ERROR (machine, COMSETTER(Accelerate3DEnabled)(false));
512 }
513 else
514 {
515 errorArgument("Invalid --accelerate3d argument '%s'", pValueUnion.psz);
516 rc = E_FAIL;
517 }
518 }
519 break;
520 }
521
522 case MODIFYVMACCELERATE2DVIDEO:
523 {
524#ifdef VBOX_WITH_VIDEOHWACCEL
525 if (pValueUnion.psz)
526 {
527 if (!strcmp(pValueUnion.psz, "on"))
528 {
529 CHECK_ERROR (machine, COMSETTER(Accelerate2DVideoEnabled)(true));
530 }
531 else if (!strcmp(pValueUnion.psz, "off"))
532 {
533 CHECK_ERROR (machine, COMSETTER(Accelerate2DVideoEnabled)(false));
534 }
535 else
536 {
537 errorArgument("Invalid --accelerate2dvideo argument '%s'", pValueUnion.psz);
538 rc = E_FAIL;
539 }
540 }
541#endif
542 break;
543 }
544
545 case MODIFYVMBIOSLOGOFADEIN:
546 {
547 if (pValueUnion.psz)
548 {
549 if (!strcmp(pValueUnion.psz, "on"))
550 {
551 CHECK_ERROR (biosSettings, COMSETTER(LogoFadeIn)(true));
552 }
553 else if (!strcmp(pValueUnion.psz, "off"))
554 {
555 CHECK_ERROR (biosSettings, COMSETTER(LogoFadeIn)(false));
556 }
557 else
558 {
559 errorArgument("Invalid --bioslogofadein argument '%s'", pValueUnion.psz);
560 rc = E_FAIL;
561 }
562 }
563 break;
564 }
565
566 case MODIFYVMBIOSLOGOFADEOUT:
567 {
568 if (pValueUnion.psz)
569 {
570 if (!strcmp(pValueUnion.psz, "on"))
571 {
572 CHECK_ERROR (biosSettings, COMSETTER(LogoFadeOut)(true));
573 }
574 else if (!strcmp(pValueUnion.psz, "off"))
575 {
576 CHECK_ERROR (biosSettings, COMSETTER(LogoFadeOut)(false));
577 }
578 else
579 {
580 errorArgument("Invalid --bioslogofadeout argument '%s'", pValueUnion.psz);
581 rc = E_FAIL;
582 break;
583 }
584 }
585 break;
586 }
587
588 case MODIFYVMBIOSLOGODISPLAYTIME:
589 {
590 if (pValueUnion.u64 > 0)
591 CHECK_ERROR (biosSettings, COMSETTER(LogoDisplayTime)(pValueUnion.u64));
592 break;
593 }
594
595 case MODIFYVMBIOSLOGOIMAGEPATH:
596 {
597 if (pValueUnion.psz)
598 CHECK_ERROR (biosSettings, COMSETTER(LogoImagePath)(Bstr(pValueUnion.psz)));
599 break;
600 }
601
602 case MODIFYVMBIOSBOOTMENU:
603 {
604 if (pValueUnion.psz)
605 {
606 if (!strcmp(pValueUnion.psz, "disabled"))
607 CHECK_ERROR (biosSettings, COMSETTER(BootMenuMode)(BIOSBootMenuMode_Disabled));
608 else if (!strcmp(pValueUnion.psz, "menuonly"))
609 CHECK_ERROR (biosSettings, COMSETTER(BootMenuMode)(BIOSBootMenuMode_MenuOnly));
610 else if (!strcmp(pValueUnion.psz, "messageandmenu"))
611 CHECK_ERROR (biosSettings, COMSETTER(BootMenuMode)(BIOSBootMenuMode_MessageAndMenu));
612 else
613 {
614 errorArgument("Invalid --biosbootmenu argument '%s'", pValueUnion.psz);
615 rc = E_FAIL;
616 }
617 }
618 break;
619 }
620
621 case MODIFYVMBIOSSYSTEMTIMEOFFSET:
622 {
623 if (pValueUnion.u64 > 0)
624 CHECK_ERROR (biosSettings, COMSETTER(TimeOffset)(pValueUnion.u64));
625 break;
626 }
627
628 case MODIFYVMBIOSPXEDEBUG:
629 {
630 if (pValueUnion.psz)
631 {
632 if (!strcmp(pValueUnion.psz, "on"))
633 {
634 CHECK_ERROR (biosSettings, COMSETTER(PXEDebugEnabled)(true));
635 }
636 else if (!strcmp(pValueUnion.psz, "off"))
637 {
638 CHECK_ERROR (biosSettings, COMSETTER(PXEDebugEnabled)(false));
639 }
640 else
641 {
642 errorArgument("Invalid --biospxedebug argument '%s'", pValueUnion.psz);
643 rc = E_FAIL;
644 }
645 }
646 break;
647 }
648
649 case MODIFYVMBOOT:
650 {
651 if ((pGetState.uIndex < 1) && (pGetState.uIndex > 4))
652 return errorSyntax(USAGE_MODIFYVM,
653 "Missing or Invalid boot slot number in '%s'",
654 pGetState.pDef->pszLong);
655
656 if (!strcmp(pValueUnion.psz, "none"))
657 {
658 CHECK_ERROR (machine, SetBootOrder (pGetState.uIndex, DeviceType_Null));
659 }
660 else if (!strcmp(pValueUnion.psz, "floppy"))
661 {
662 CHECK_ERROR (machine, SetBootOrder (pGetState.uIndex, DeviceType_Floppy));
663 }
664 else if (!strcmp(pValueUnion.psz, "dvd"))
665 {
666 CHECK_ERROR (machine, SetBootOrder (pGetState.uIndex, DeviceType_DVD));
667 }
668 else if (!strcmp(pValueUnion.psz, "disk"))
669 {
670 CHECK_ERROR (machine, SetBootOrder (pGetState.uIndex, DeviceType_HardDisk));
671 }
672 else if (!strcmp(pValueUnion.psz, "net"))
673 {
674 CHECK_ERROR (machine, SetBootOrder (pGetState.uIndex, DeviceType_Network));
675 }
676 else
677 return errorArgument("Invalid boot device '%s'", pValueUnion.psz);
678
679 break;
680 }
681
682 case MODIFYVMHDA:
683 {
684 if (!strcmp(pValueUnion.psz, "none"))
685 {
686 machine->DetachDevice(Bstr("IDE Controller"), 0, 0);
687 }
688 else
689 {
690 /* first guess is that it's a UUID */
691 Bstr uuid(pValueUnion.psz);
692 ComPtr<IMedium> hardDisk;
693 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
694 /* not successful? Then it must be a filename */
695 if (!hardDisk)
696 {
697 rc = a->virtualBox->FindHardDisk(Bstr(pValueUnion.psz), hardDisk.asOutParam());
698 if (FAILED(rc))
699 {
700 /* open the new hard disk object */
701 CHECK_ERROR (a->virtualBox,
702 OpenHardDisk(Bstr(pValueUnion.psz),
703 AccessMode_ReadWrite, false, Bstr(""),
704 false, Bstr(""), hardDisk.asOutParam()));
705 }
706 }
707 if (hardDisk)
708 {
709 hardDisk->COMGETTER(Id)(uuid.asOutParam());
710 CHECK_ERROR (machine, AttachDevice(Bstr("IDE Controller"), 0, 0, DeviceType_HardDisk, uuid));
711 }
712 else
713 rc = E_FAIL;
714 }
715 break;
716 }
717
718 case MODIFYVMHDB:
719 {
720 if (!strcmp(pValueUnion.psz, "none"))
721 {
722 machine->DetachDevice(Bstr("IDE Controller"), 0, 1);
723 }
724 else
725 {
726 /* first guess is that it's a UUID */
727 Bstr uuid(pValueUnion.psz);
728 ComPtr<IMedium> hardDisk;
729 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
730 /* not successful? Then it must be a filename */
731 if (!hardDisk)
732 {
733 rc = a->virtualBox->FindHardDisk(Bstr(pValueUnion.psz), hardDisk.asOutParam());
734 if (FAILED(rc))
735 {
736 /* open the new hard disk object */
737 CHECK_ERROR (a->virtualBox,
738 OpenHardDisk(Bstr(pValueUnion.psz),
739 AccessMode_ReadWrite, false, Bstr(""),
740 false, Bstr(""), hardDisk.asOutParam()));
741 }
742 }
743 if (hardDisk)
744 {
745 hardDisk->COMGETTER(Id)(uuid.asOutParam());
746 CHECK_ERROR (machine, AttachDevice(Bstr("IDE Controller"), 0, 1, DeviceType_HardDisk, uuid));
747 }
748 else
749 rc = E_FAIL;
750 }
751 break;
752 }
753
754 case MODIFYVMHDD:
755 {
756 if (!strcmp(pValueUnion.psz, "none"))
757 {
758 machine->DetachDevice(Bstr("IDE Controller"), 1, 1);
759 }
760 else
761 {
762 /* first guess is that it's a UUID */
763 Bstr uuid(pValueUnion.psz);
764 ComPtr<IMedium> hardDisk;
765 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
766 /* not successful? Then it must be a filename */
767 if (!hardDisk)
768 {
769 rc = a->virtualBox->FindHardDisk(Bstr(pValueUnion.psz), hardDisk.asOutParam());
770 if (FAILED(rc))
771 {
772 /* open the new hard disk object */
773 CHECK_ERROR (a->virtualBox,
774 OpenHardDisk(Bstr(pValueUnion.psz),
775 AccessMode_ReadWrite, false, Bstr(""),
776 false, Bstr(""), hardDisk.asOutParam()));
777 }
778 }
779 if (hardDisk)
780 {
781 hardDisk->COMGETTER(Id)(uuid.asOutParam());
782 CHECK_ERROR (machine, AttachDevice(Bstr("IDE Controller"), 1, 1, DeviceType_HardDisk, uuid));
783 }
784 else
785 rc = E_FAIL;
786 }
787 break;
788 }
789
790 case MODIFYVMIDECONTROLLER:
791 {
792 ComPtr<IStorageController> storageController;
793 CHECK_ERROR (machine, GetStorageControllerByName(Bstr("IDE Controller"),
794 storageController.asOutParam()));
795
796 if (!RTStrICmp(pValueUnion.psz, "PIIX3"))
797 {
798 CHECK_ERROR(storageController, COMSETTER(ControllerType)(StorageControllerType_PIIX3));
799 }
800 else if (!RTStrICmp(pValueUnion.psz, "PIIX4"))
801 {
802 CHECK_ERROR(storageController, COMSETTER(ControllerType)(StorageControllerType_PIIX4));
803 }
804 else if (!RTStrICmp(pValueUnion.psz, "ICH6"))
805 {
806 CHECK_ERROR(storageController, COMSETTER(ControllerType)(StorageControllerType_ICH6));
807 }
808 else
809 {
810 errorArgument("Invalid --idecontroller argument '%s'", pValueUnion.psz);
811 rc = E_FAIL;
812 }
813 break;
814 }
815
816 case MODIFYVMSATAIDEEMULATION:
817 {
818 ComPtr<IStorageController> SataCtl;
819 CHECK_ERROR (machine, GetStorageControllerByName(Bstr("SATA"), SataCtl.asOutParam()));
820
821 if ((pGetState.uIndex < 1) && (pGetState.uIndex > 4))
822 return errorSyntax(USAGE_MODIFYVM,
823 "Missing or Invalid SATA boot slot number in '%s'",
824 pGetState.pDef->pszLong);
825
826 if ((pValueUnion.u32 < 1) && (pValueUnion.u32 > 30))
827 return errorSyntax(USAGE_MODIFYVM,
828 "Missing or Invalid SATA port number in '%s'",
829 pGetState.pDef->pszLong);
830
831 if (SUCCEEDED(rc))
832 CHECK_ERROR(SataCtl, SetIDEEmulationPort(pGetState.uIndex, pValueUnion.u32));
833
834 break;
835 }
836
837 case MODIFYVMSATAPORTCOUNT:
838 {
839 ComPtr<IStorageController> SataCtl;
840 CHECK_ERROR (machine, GetStorageControllerByName(Bstr("SATA"), SataCtl.asOutParam()));
841
842 if (SUCCEEDED(rc) && pValueUnion.u32 > 0)
843 CHECK_ERROR(SataCtl, COMSETTER(PortCount)(pValueUnion.u32));
844
845 break;
846 }
847
848 case MODIFYVMSATAPORT:
849 {
850 if ((pGetState.uIndex < 1) && (pGetState.uIndex > 30))
851 return errorSyntax(USAGE_MODIFYVM,
852 "Missing or Invalid SATA port number in '%s'",
853 pGetState.pDef->pszLong);
854
855 if (!strcmp(pValueUnion.psz, "none"))
856 {
857 machine->DetachDevice(Bstr("SATA"), pGetState.uIndex, 0);
858 }
859 else
860 {
861 /* first guess is that it's a UUID */
862 Bstr uuid(pValueUnion.psz);
863 ComPtr<IMedium> hardDisk;
864 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
865 /* not successful? Then it must be a filename */
866 if (!hardDisk)
867 {
868 rc = a->virtualBox->FindHardDisk(Bstr(pValueUnion.psz), hardDisk.asOutParam());
869 if (FAILED(rc))
870 {
871 /* open the new hard disk object */
872 CHECK_ERROR (a->virtualBox,
873 OpenHardDisk(Bstr(pValueUnion.psz), AccessMode_ReadWrite,
874 false, Bstr(""), false,
875 Bstr(""), hardDisk.asOutParam()));
876 }
877 }
878 if (hardDisk)
879 {
880 hardDisk->COMGETTER(Id)(uuid.asOutParam());
881 CHECK_ERROR (machine,
882 AttachDevice(Bstr("SATA"), pGetState.uIndex,
883 0, DeviceType_HardDisk, uuid));
884 }
885 else
886 rc = E_FAIL;
887 }
888 break;
889 }
890
891 case MODIFYVMSATA:
892 {
893 if (!strcmp(pValueUnion.psz, "on") || !strcmp(pValueUnion.psz, "enable"))
894 {
895 ComPtr<IStorageController> ctl;
896 CHECK_ERROR (machine, AddStorageController(Bstr("SATA"), StorageBus_SATA, ctl.asOutParam()));
897 CHECK_ERROR (ctl, COMSETTER(ControllerType)(StorageControllerType_IntelAhci));
898 }
899 else if (!strcmp(pValueUnion.psz, "off") || !strcmp(pValueUnion.psz, "disable"))
900 CHECK_ERROR (machine, RemoveStorageController(Bstr("SATA")));
901 else
902 return errorArgument("Invalid --usb argument '%s'", pValueUnion.psz);
903 break;
904 }
905
906 case MODIFYVMSCSIPORT:
907 {
908 if ((pGetState.uIndex < 1) && (pGetState.uIndex > 16))
909 return errorSyntax(USAGE_MODIFYVM,
910 "Missing or Invalid SCSI port number in '%s'",
911 pGetState.pDef->pszLong);
912
913 if (!strcmp(pValueUnion.psz, "none"))
914 {
915 rc = machine->DetachDevice(Bstr("LsiLogic"), pGetState.uIndex, 0);
916 if (FAILED(rc))
917 CHECK_ERROR(machine, DetachDevice(Bstr("BusLogic"), pGetState.uIndex, 0));
918 }
919 else
920 {
921 /* first guess is that it's a UUID */
922 Bstr uuid(pValueUnion.psz);
923 ComPtr<IMedium> hardDisk;
924 rc = a->virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
925 /* not successful? Then it must be a filename */
926 if (!hardDisk)
927 {
928 rc = a->virtualBox->FindHardDisk(Bstr(pValueUnion.psz), hardDisk.asOutParam());
929 if (FAILED(rc))
930 {
931 /* open the new hard disk object */
932 CHECK_ERROR (a->virtualBox,
933 OpenHardDisk(Bstr(pValueUnion.psz),
934 AccessMode_ReadWrite, false, Bstr(""),
935 false, Bstr(""), hardDisk.asOutParam()));
936 }
937 }
938 if (hardDisk)
939 {
940 hardDisk->COMGETTER(Id)(uuid.asOutParam());
941 rc = machine->AttachDevice(Bstr("LsiLogic"), pGetState.uIndex, 0, DeviceType_HardDisk, uuid);
942 if (FAILED(rc))
943 CHECK_ERROR (machine,
944 AttachDevice(Bstr("BusLogic"),
945 pGetState.uIndex, 0,
946 DeviceType_HardDisk, uuid));
947 }
948 else
949 rc = E_FAIL;
950 }
951 break;
952 }
953
954 case MODIFYVMSCSITYPE:
955 {
956 ComPtr<IStorageController> ctl;
957
958 if (!RTStrICmp(pValueUnion.psz, "LsiLogic"))
959 {
960 rc = machine->RemoveStorageController(Bstr("BusLogic"));
961 if (FAILED(rc))
962 CHECK_ERROR (machine, RemoveStorageController(Bstr("LsiLogic")));
963
964 CHECK_ERROR (machine,
965 AddStorageController(Bstr("LsiLogic"),
966 StorageBus_SCSI,
967 ctl.asOutParam()));
968
969 if (SUCCEEDED(rc))
970 CHECK_ERROR (ctl, COMSETTER(ControllerType)(StorageControllerType_LsiLogic));
971 }
972 else if (!RTStrICmp(pValueUnion.psz, "BusLogic"))
973 {
974 rc = machine->RemoveStorageController(Bstr("LsiLogic"));
975 if (FAILED(rc))
976 CHECK_ERROR (machine, RemoveStorageController(Bstr("BusLogic")));
977
978 CHECK_ERROR (machine,
979 AddStorageController(Bstr("BusLogic"),
980 StorageBus_SCSI,
981 ctl.asOutParam()));
982
983 if (SUCCEEDED(rc))
984 CHECK_ERROR (ctl, COMSETTER(ControllerType)(StorageControllerType_BusLogic));
985 }
986 else
987 return errorArgument("Invalid --scsitype argument '%s'", pValueUnion.psz);
988 break;
989 }
990
991 case MODIFYVMSCSI:
992 {
993 if (!strcmp(pValueUnion.psz, "on") || !strcmp(pValueUnion.psz, "enable"))
994 {
995 ComPtr<IStorageController> ctl;
996
997 CHECK_ERROR (machine, AddStorageController(Bstr("BusLogic"), StorageBus_SCSI, ctl.asOutParam()));
998 if (SUCCEEDED(rc))
999 CHECK_ERROR (ctl, COMSETTER(ControllerType)(StorageControllerType_BusLogic));
1000 }
1001 else if (!strcmp(pValueUnion.psz, "off") || !strcmp(pValueUnion.psz, "disable"))
1002 {
1003 rc = machine->RemoveStorageController(Bstr("BusLogic"));
1004 if (FAILED(rc))
1005 CHECK_ERROR (machine, RemoveStorageController(Bstr("LsiLogic")));
1006 }
1007 break;
1008 }
1009
1010 case MODIFYVMDVDPASSTHROUGH:
1011 {
1012 ComPtr<IMediumAttachment> dvdAttachment;
1013 machine->GetMediumAttachment(Bstr("IDE Controller"), 1, 0, dvdAttachment.asOutParam());
1014 ASSERT(dvdAttachment);
1015
1016 CHECK_ERROR (dvdAttachment, COMSETTER(Passthrough)(!strcmp(pValueUnion.psz, "on")));
1017 break;
1018 }
1019
1020 case MODIFYVMDVD:
1021 {
1022 ComPtr<IMedium> dvdMedium;
1023 Bstr uuid(pValueUnion.psz);
1024
1025 /* unmount? */
1026 if (!strcmp(pValueUnion.psz, "none"))
1027 {
1028 /* nothing to do, NULL object will cause unmount */
1029 }
1030 /* host drive? */
1031 else if (!strncmp(pValueUnion.psz, "host:", 5))
1032 {
1033 ComPtr<IHost> host;
1034 CHECK_ERROR (a->virtualBox, COMGETTER(Host)(host.asOutParam()));
1035 rc = host->FindHostDVDDrive(Bstr(pValueUnion.psz + 5), dvdMedium.asOutParam());
1036 if (!dvdMedium)
1037 {
1038 /* 2nd try: try with the real name, important on Linux+libhal */
1039 char szPathReal[RTPATH_MAX];
1040 if (RT_FAILURE(RTPathReal(pValueUnion.psz + 5, szPathReal, sizeof(szPathReal))))
1041 {
1042 errorArgument("Invalid host DVD drive name \"%s\"", pValueUnion.psz + 5);
1043 rc = E_FAIL;
1044 break;
1045 }
1046 rc = host->FindHostDVDDrive(Bstr(szPathReal), dvdMedium.asOutParam());
1047 if (!dvdMedium)
1048 {
1049 errorArgument("Invalid host DVD drive name \"%s\"", pValueUnion.psz + 5);
1050 rc = E_FAIL;
1051 break;
1052 }
1053 }
1054 }
1055 else
1056 {
1057 /* first assume it's a UUID */
1058 rc = a->virtualBox->GetDVDImage(uuid, dvdMedium.asOutParam());
1059 if (FAILED(rc) || !dvdMedium)
1060 {
1061 /* must be a filename, check if it's in the collection */
1062 rc = a->virtualBox->FindDVDImage(Bstr(pValueUnion.psz), dvdMedium.asOutParam());
1063 /* not registered, do that on the fly */
1064 if (!dvdMedium)
1065 {
1066 Bstr emptyUUID;
1067 CHECK_ERROR (a->virtualBox, OpenDVDImage(Bstr(pValueUnion.psz),
1068 emptyUUID, dvdMedium.asOutParam()));
1069 }
1070 }
1071 if (!dvdMedium)
1072 {
1073 rc = E_FAIL;
1074 break;
1075 }
1076 }
1077
1078 /** @todo generalize this, allow arbitrary number of DVD drives
1079 * and as a consequence multiple attachments and different
1080 * storage controllers. */
1081 if (dvdMedium)
1082 dvdMedium->COMGETTER(Id)(uuid.asOutParam());
1083 CHECK_ERROR (machine, MountMedium(Bstr("IDE Controller"), 1, 0, uuid));
1084 break;
1085 }
1086
1087 case MODIFYVMFLOPPY:
1088 {
1089 Bstr uuid(pValueUnion.psz);
1090 ComPtr<IMedium> floppyMedium;
1091 ComPtr<IMediumAttachment> floppyAttachment;
1092 machine->GetMediumAttachment(Bstr("Floppy Controller"), 0, 0, floppyAttachment.asOutParam());
1093
1094 /* disable? */
1095 if (!strcmp(pValueUnion.psz, "disabled"))
1096 {
1097 /* disable the controller */
1098 if (floppyAttachment)
1099 CHECK_ERROR(machine, DetachDevice(Bstr("Floppy Controller"), 0, 0));
1100 }
1101 else
1102 {
1103 /* enable the controller */
1104 if (!floppyAttachment)
1105 CHECK_ERROR(machine, AttachDevice(Bstr("Floppy Controller"), 0, 0, DeviceType_Floppy, NULL));
1106
1107 /* unmount? */
1108 if ( !strcmp(pValueUnion.psz, "none")
1109 || !strcmp(pValueUnion.psz, "empty")) // deprecated
1110 {
1111 /* nothing to do, NULL object will cause unmount */
1112 }
1113 /* host drive? */
1114 else if (!strncmp(pValueUnion.psz, "host:", 5))
1115 {
1116 ComPtr<IHost> host;
1117 CHECK_ERROR(a->virtualBox, COMGETTER(Host)(host.asOutParam()));
1118 rc = host->FindHostFloppyDrive(Bstr(pValueUnion.psz + 5), floppyMedium.asOutParam());
1119 if (!floppyMedium)
1120 {
1121 errorArgument("Invalid host floppy drive name \"%s\"", pValueUnion.psz + 5);
1122 rc = E_FAIL;
1123 break;
1124 }
1125 }
1126 else
1127 {
1128 /* first assume it's a UUID */
1129 rc = a->virtualBox->GetFloppyImage(uuid, floppyMedium.asOutParam());
1130 if (FAILED(rc) || !floppyMedium)
1131 {
1132 /* must be a filename, check if it's in the collection */
1133 rc = a->virtualBox->FindFloppyImage(Bstr(pValueUnion.psz), floppyMedium.asOutParam());
1134 /* not registered, do that on the fly */
1135 if (!floppyMedium)
1136 {
1137 Bstr emptyUUID;
1138 CHECK_ERROR (a->virtualBox,
1139 OpenFloppyImage(Bstr(pValueUnion.psz),
1140 emptyUUID,
1141 floppyMedium.asOutParam()));
1142 }
1143 }
1144 if (!floppyMedium)
1145 {
1146 rc = E_FAIL;
1147 break;
1148 }
1149 }
1150 floppyMedium->COMGETTER(Id)(uuid.asOutParam());
1151 CHECK_ERROR (machine, MountMedium(Bstr("Floppy Controller"), 0, 0, uuid));
1152 }
1153 break;
1154 }
1155
1156 case MODIFYVMNICTRACEFILE:
1157 {
1158 ComPtr<INetworkAdapter> nic;
1159
1160 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1161 return errorSyntax(USAGE_MODIFYVM,
1162 "Missing or Invalid NIC slot number in '%s'",
1163 pGetState.pDef->pszLong);
1164
1165 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1166 ASSERT(nic);
1167
1168 CHECK_ERROR (nic, COMSETTER(TraceFile)(Bstr(pValueUnion.psz)));
1169 break;
1170 }
1171
1172 case MODIFYVMNICTRACE:
1173 {
1174 ComPtr<INetworkAdapter> nic;
1175
1176 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1177 return errorSyntax(USAGE_MODIFYVM,
1178 "Missing or Invalid NIC slot number in '%s'",
1179 pGetState.pDef->pszLong);
1180
1181 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1182 ASSERT(nic);
1183
1184 if (!strcmp(pValueUnion.psz, "on"))
1185 {
1186 CHECK_ERROR (nic, COMSETTER(TraceEnabled)(TRUE));
1187 }
1188 else if (!strcmp(pValueUnion.psz, "off"))
1189 {
1190 CHECK_ERROR (nic, COMSETTER(TraceEnabled)(FALSE));
1191 }
1192 else
1193 {
1194 errorArgument("Invalid --nictrace%lu argument '%s'", pGetState.uIndex, pValueUnion.psz);
1195 rc = E_FAIL;
1196 }
1197 break;
1198 }
1199
1200 case MODIFYVMNICTYPE:
1201 {
1202 ComPtr<INetworkAdapter> nic;
1203
1204 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1205 return errorSyntax(USAGE_MODIFYVM,
1206 "Missing or Invalid NIC slot number in '%s'",
1207 pGetState.pDef->pszLong);
1208
1209 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1210 ASSERT(nic);
1211
1212 if (!strcmp(pValueUnion.psz, "Am79C970A"))
1213 {
1214 CHECK_ERROR (nic, COMSETTER(AdapterType)(NetworkAdapterType_Am79C970A));
1215 }
1216 else if (!strcmp(pValueUnion.psz, "Am79C973"))
1217 {
1218 CHECK_ERROR (nic, COMSETTER(AdapterType)(NetworkAdapterType_Am79C973));
1219 }
1220#ifdef VBOX_WITH_E1000
1221 else if (!strcmp(pValueUnion.psz, "82540EM"))
1222 {
1223 CHECK_ERROR (nic, COMSETTER(AdapterType)(NetworkAdapterType_I82540EM));
1224 }
1225 else if (!strcmp(pValueUnion.psz, "82543GC"))
1226 {
1227 CHECK_ERROR (nic, COMSETTER(AdapterType)(NetworkAdapterType_I82543GC));
1228 }
1229 else if (!strcmp(pValueUnion.psz, "82545EM"))
1230 {
1231 CHECK_ERROR (nic, COMSETTER(AdapterType)(NetworkAdapterType_I82545EM));
1232 }
1233#endif
1234#ifdef VBOX_WITH_VIRTIO
1235 else if (!strcmp(pValueUnion.psz, "virtio"))
1236 {
1237 CHECK_ERROR (nic, COMSETTER(AdapterType)(NetworkAdapterType_Virtio));
1238 }
1239#endif /* VBOX_WITH_VIRTIO */
1240 else
1241 {
1242 errorArgument("Invalid NIC type '%s' specified for NIC %lu", pValueUnion.psz, pGetState.uIndex);
1243 rc = E_FAIL;
1244 }
1245 break;
1246 }
1247
1248 case MODIFYVMNICSPEED:
1249 {
1250 ComPtr<INetworkAdapter> nic;
1251
1252 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1253 return errorSyntax(USAGE_MODIFYVM,
1254 "Missing or Invalid NIC slot number in '%s'",
1255 pGetState.pDef->pszLong);
1256
1257 if ((pValueUnion.u32 < 1000) && (pValueUnion.u32 > 4000000))
1258 {
1259 errorArgument("Invalid --nicspeed%lu argument '%u'", pGetState.uIndex, pValueUnion.u32);
1260 rc = E_FAIL;
1261 break;
1262 }
1263
1264 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1265 ASSERT(nic);
1266
1267 CHECK_ERROR (nic, COMSETTER(LineSpeed)(pValueUnion.u32));
1268 break;
1269 }
1270
1271 case MODIFYVMNIC:
1272 {
1273 ComPtr<INetworkAdapter> nic;
1274
1275 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1276 return errorSyntax(USAGE_MODIFYVM,
1277 "Missing or Invalid NIC slot number in '%s'",
1278 pGetState.pDef->pszLong);
1279
1280 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1281 ASSERT(nic);
1282
1283 if (!strcmp(pValueUnion.psz, "none"))
1284 {
1285 CHECK_ERROR (nic, COMSETTER(Enabled) (FALSE));
1286 }
1287 else if (!strcmp(pValueUnion.psz, "null"))
1288 {
1289 CHECK_ERROR (nic, COMSETTER(Enabled) (TRUE));
1290 CHECK_ERROR (nic, Detach());
1291 }
1292 else if (!strcmp(pValueUnion.psz, "nat"))
1293 {
1294 CHECK_ERROR (nic, COMSETTER(Enabled) (TRUE));
1295 CHECK_ERROR (nic, AttachToNAT());
1296 }
1297 else if ( !strcmp(pValueUnion.psz, "bridged")
1298 || !strcmp(pValueUnion.psz, "hostif")) /* backward compatibility */
1299 {
1300 CHECK_ERROR (nic, COMSETTER(Enabled) (TRUE));
1301 CHECK_ERROR (nic, AttachToBridgedInterface());
1302 }
1303 else if (!strcmp(pValueUnion.psz, "intnet"))
1304 {
1305 CHECK_ERROR (nic, COMSETTER(Enabled) (TRUE));
1306 CHECK_ERROR (nic, AttachToInternalNetwork());
1307 }
1308#if defined(VBOX_WITH_NETFLT)
1309 else if (!strcmp(pValueUnion.psz, "hostonly"))
1310 {
1311
1312 CHECK_ERROR (nic, COMSETTER(Enabled) (TRUE));
1313 CHECK_ERROR (nic, AttachToHostOnlyInterface());
1314 }
1315#endif
1316 else
1317 {
1318 errorArgument("Invalid type '%s' specfied for NIC %lu", pValueUnion.psz, pGetState.uIndex);
1319 rc = E_FAIL;
1320 }
1321 break;
1322 }
1323
1324 case MODIFYVMCABLECONNECTED:
1325 {
1326 ComPtr<INetworkAdapter> nic;
1327
1328 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1329 return errorSyntax(USAGE_MODIFYVM,
1330 "Missing or Invalid NIC slot number in '%s'",
1331 pGetState.pDef->pszLong);
1332
1333 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1334 ASSERT(nic);
1335
1336 if (!strcmp(pValueUnion.psz, "on"))
1337 {
1338 CHECK_ERROR (nic, COMSETTER(CableConnected)(TRUE));
1339 }
1340 else if (!strcmp(pValueUnion.psz, "off"))
1341 {
1342 CHECK_ERROR (nic, COMSETTER(CableConnected)(FALSE));
1343 }
1344 else
1345 {
1346 errorArgument("Invalid --cableconnected%lu argument '%s'", pGetState.uIndex, pValueUnion.psz);
1347 rc = E_FAIL;
1348 }
1349 break;
1350 }
1351
1352 case MODIFYVMBRIDGEADAPTER:
1353 case MODIFYVMHOSTONLYADAPTER:
1354 {
1355 ComPtr<INetworkAdapter> nic;
1356
1357 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1358 return errorSyntax(USAGE_MODIFYVM,
1359 "Missing or Invalid NIC slot number in '%s'",
1360 pGetState.pDef->pszLong);
1361
1362 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1363 ASSERT(nic);
1364
1365 /* remove it? */
1366 if (!strcmp(pValueUnion.psz, "none"))
1367 {
1368 CHECK_ERROR (nic, COMSETTER(HostInterface)(NULL));
1369 }
1370 else
1371 {
1372 CHECK_ERROR (nic, COMSETTER(HostInterface)(Bstr(pValueUnion.psz)));
1373 }
1374 break;
1375 }
1376
1377 case MODIFYVMINTNET:
1378 {
1379 ComPtr<INetworkAdapter> nic;
1380
1381 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1382 return errorSyntax(USAGE_MODIFYVM,
1383 "Missing or Invalid NIC slot number in '%s'",
1384 pGetState.pDef->pszLong);
1385
1386 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1387 ASSERT(nic);
1388
1389 /* remove it? */
1390 if (!strcmp(pValueUnion.psz, "none"))
1391 {
1392 CHECK_ERROR (nic, COMSETTER(InternalNetwork)(NULL));
1393 }
1394 else
1395 {
1396 CHECK_ERROR (nic, COMSETTER(InternalNetwork)(Bstr(pValueUnion.psz)));
1397 }
1398 break;
1399 }
1400
1401 case MODIFYVMNATNET:
1402 {
1403 ComPtr<INetworkAdapter> nic;
1404
1405 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1406 return errorSyntax(USAGE_MODIFYVM,
1407 "Missing or Invalid NIC slot number in '%s'",
1408 pGetState.pDef->pszLong);
1409
1410 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1411 ASSERT(nic);
1412
1413 CHECK_ERROR (nic, COMSETTER(NATNetwork)(Bstr(pValueUnion.psz)));
1414
1415 break;
1416 }
1417
1418 case MODIFYVMMACADDRESS:
1419 {
1420 ComPtr<INetworkAdapter> nic;
1421
1422 if ((pGetState.uIndex < 1) && (pGetState.uIndex > NetworkAdapterCount))
1423 return errorSyntax(USAGE_MODIFYVM,
1424 "Missing or Invalid NIC slot number in '%s'",
1425 pGetState.pDef->pszLong);
1426
1427 CHECK_ERROR_BREAK (machine, GetNetworkAdapter (pGetState.uIndex - 1, nic.asOutParam()));
1428 ASSERT(nic);
1429
1430 /* generate one? */
1431 if (!strcmp(pValueUnion.psz, "auto"))
1432 {
1433 CHECK_ERROR (nic, COMSETTER(MACAddress)(NULL));
1434 }
1435 else
1436 {
1437 CHECK_ERROR (nic, COMSETTER(MACAddress)(Bstr(pValueUnion.psz)));
1438 }
1439 break;
1440 }
1441
1442 case MODIFYVMUARTMODE:
1443 {
1444 ComPtr<ISerialPort> uart;
1445 char *pszIRQ = NULL;
1446
1447 if ((pGetState.uIndex < 1) && (pGetState.uIndex > SerialPortCount))
1448 return errorSyntax(USAGE_MODIFYVM,
1449 "Missing or Invalid Serial Port number in '%s'",
1450 pGetState.pDef->pszLong);
1451
1452 CHECK_ERROR_BREAK (machine, GetSerialPort (pGetState.uIndex - 1, uart.asOutParam()));
1453 ASSERT(uart);
1454
1455 if (!strcmp(pValueUnion.psz, "disconnected"))
1456 {
1457 CHECK_ERROR (uart, COMSETTER(HostMode) (PortMode_Disconnected));
1458 }
1459 else if ( !strcmp(pValueUnion.psz, "server")
1460 || !strcmp(pValueUnion.psz, "client")
1461 || !strcmp(pValueUnion.psz, "file"))
1462 {
1463 char *pszIRQ = NULL;
1464
1465 /**
1466 * @todo: not the right way to get the second value for
1467 * the argument, change this when RTGetOpt can return
1468 * multiple values
1469 */
1470 pszIRQ = pGetState.argv[pGetState.iNext];
1471 pGetState.iNext++;
1472
1473 if (!pszIRQ)
1474 return errorSyntax(USAGE_MODIFYVM,
1475 "Missing or Invalid argument to '%s'",
1476 pGetState.pDef->pszLong);
1477
1478 CHECK_ERROR (uart, COMSETTER(Path) (Bstr(pszIRQ)));
1479
1480 if (!strcmp(pValueUnion.psz, "server"))
1481 {
1482 CHECK_ERROR (uart, COMSETTER(HostMode) (PortMode_HostPipe));
1483 CHECK_ERROR (uart, COMSETTER(Server) (TRUE));
1484 }
1485 else if (!strcmp(pValueUnion.psz, "client"))
1486 {
1487 CHECK_ERROR (uart, COMSETTER(HostMode) (PortMode_HostPipe));
1488 CHECK_ERROR (uart, COMSETTER(Server) (FALSE));
1489 }
1490 else if (!strcmp(pValueUnion.psz, "file"))
1491 {
1492 CHECK_ERROR (uart, COMSETTER(HostMode) (PortMode_RawFile));
1493 }
1494 }
1495 else
1496 {
1497 CHECK_ERROR (uart, COMSETTER(Path) (Bstr(pValueUnion.psz)));
1498 CHECK_ERROR (uart, COMSETTER(HostMode) (PortMode_HostDevice));
1499 }
1500 break;
1501 }
1502
1503 case MODIFYVMUART:
1504 {
1505 ComPtr<ISerialPort> uart;
1506
1507 if ((pGetState.uIndex < 1) && (pGetState.uIndex > SerialPortCount))
1508 return errorSyntax(USAGE_MODIFYVM,
1509 "Missing or Invalid Serial Port number in '%s'",
1510 pGetState.pDef->pszLong);
1511
1512 CHECK_ERROR_BREAK (machine, GetSerialPort (pGetState.uIndex - 1, uart.asOutParam()));
1513 ASSERT(uart);
1514
1515 if (!strcmp(pValueUnion.psz, "off") || !strcmp(pValueUnion.psz, "disable"))
1516 CHECK_ERROR (uart, COMSETTER(Enabled) (FALSE));
1517 else
1518 {
1519 char *pszIRQ = NULL;
1520 uint32_t uVal = 0;
1521 int vrc;
1522
1523 /**
1524 * @todo: not the right way to get the second value for
1525 * the argument, change this when RTGetOpt can return
1526 * multiple values
1527 */
1528 pszIRQ = pGetState.argv[pGetState.iNext];
1529 pGetState.iNext++;
1530
1531 if (!pszIRQ)
1532 return errorSyntax(USAGE_MODIFYVM,
1533 "Missing or Invalid argument to '%s'",
1534 pGetState.pDef->pszLong);
1535
1536 vrc = RTStrToUInt32Ex(pszIRQ, NULL, 0, &uVal);
1537 if (vrc != VINF_SUCCESS || uVal == 0)
1538 return errorArgument("Error parsing UART I/O base '%s'", pszIRQ);
1539
1540 CHECK_ERROR (uart, COMSETTER(IRQ) (uVal));
1541
1542 vrc = RTStrToUInt32Ex(pValueUnion.psz, NULL, 0, &uVal);
1543 if (vrc != VINF_SUCCESS || uVal == 0)
1544 return errorArgument("Error parsing UART I/O base '%s'", pszIRQ);
1545 CHECK_ERROR (uart, COMSETTER(IOBase) (uVal));
1546
1547 CHECK_ERROR (uart, COMSETTER(Enabled) (TRUE));
1548 }
1549 break;
1550 }
1551
1552 case MODIFYVMGUESTSTATISTICSINTERVAL:
1553 {
1554 if (pValueUnion.u32 > 0)
1555 CHECK_ERROR (machine, COMSETTER(StatisticsUpdateInterval)(pValueUnion.u32));
1556 break;
1557 }
1558
1559#ifdef VBOX_WITH_MEM_BALLOONING
1560 case MODIFYVMGUESTMEMORYBALLOON:
1561 {
1562 if (pValueUnion.u32 > 0)
1563 CHECK_ERROR (machine, COMSETTER(MemoryBalloonSize)(pValueUnion.u32));
1564 break;
1565 }
1566#endif
1567
1568 case MODIFYVMAUDIOCONTROLLER:
1569 {
1570 if (pValueUnion.psz)
1571 {
1572 ComPtr<IAudioAdapter> audioAdapter;
1573 machine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
1574 ASSERT(audioAdapter);
1575
1576 if (!strcmp(pValueUnion.psz, "sb16"))
1577 CHECK_ERROR (audioAdapter, COMSETTER(AudioController)(AudioControllerType_SB16));
1578 else if (!strcmp(pValueUnion.psz, "ac97"))
1579 CHECK_ERROR (audioAdapter, COMSETTER(AudioController)(AudioControllerType_AC97));
1580 else
1581 {
1582 errorArgument("Invalid --audiocontroller argument '%s'", pValueUnion.psz);
1583 rc = E_FAIL;
1584 }
1585 }
1586 break;
1587 }
1588
1589 case MODIFYVMAUDIO:
1590 {
1591 if (pValueUnion.psz)
1592 {
1593 ComPtr<IAudioAdapter> audioAdapter;
1594 machine->COMGETTER(AudioAdapter)(audioAdapter.asOutParam());
1595 ASSERT(audioAdapter);
1596
1597 /* disable? */
1598 if (!strcmp(pValueUnion.psz, "none"))
1599 {
1600 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(false));
1601 }
1602 else if (!strcmp(pValueUnion.psz, "null"))
1603 {
1604 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_Null));
1605 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1606 }
1607#ifdef RT_OS_WINDOWS
1608#ifdef VBOX_WITH_WINMM
1609 else if (!strcmp(pValueUnion.psz, "winmm"))
1610 {
1611 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_WinMM));
1612 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1613 }
1614#endif
1615 else if (!strcmp(pValueUnion.psz, "dsound"))
1616 {
1617 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_DirectSound));
1618 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1619 }
1620#endif /* RT_OS_WINDOWS */
1621#ifdef RT_OS_LINUX
1622 else if (!strcmp(pValueUnion.psz, "oss"))
1623 {
1624 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_OSS));
1625 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1626 }
1627# ifdef VBOX_WITH_ALSA
1628 else if (!strcmp(pValueUnion.psz, "alsa"))
1629 {
1630 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_ALSA));
1631 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1632 }
1633# endif
1634# ifdef VBOX_WITH_PULSE
1635 else if (!strcmp(pValueUnion.psz, "pulse"))
1636 {
1637 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_Pulse));
1638 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1639 }
1640# endif
1641#endif /* !RT_OS_LINUX */
1642#ifdef RT_OS_SOLARIS
1643 else if (!strcmp(pValueUnion.psz, "solaudio"))
1644 {
1645 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_SolAudio));
1646 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1647 }
1648
1649# ifdef VBOX_WITH_SOLARIS_OSS
1650 else if (!strcmp(pValueUnion.psz, "oss"))
1651 {
1652 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_OSS));
1653 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1654 }
1655# endif
1656
1657#endif /* !RT_OS_SOLARIS */
1658#ifdef RT_OS_DARWIN
1659 else if (!strcmp(pValueUnion.psz, "coreaudio"))
1660 {
1661 CHECK_ERROR (audioAdapter, COMSETTER(AudioDriver)(AudioDriverType_CoreAudio));
1662 CHECK_ERROR (audioAdapter, COMSETTER(Enabled)(true));
1663 }
1664
1665#endif /* !RT_OS_DARWIN */
1666 else
1667 {
1668 errorArgument("Invalid --audio argument '%s'", pValueUnion.psz);
1669 rc = E_FAIL;
1670 }
1671 }
1672 break;
1673 }
1674
1675 case MODIFYVMCLIPBOARD:
1676 {
1677 if (pValueUnion.psz)
1678 {
1679 if (!strcmp(pValueUnion.psz, "disabled"))
1680 {
1681 CHECK_ERROR (machine, COMSETTER(ClipboardMode)(ClipboardMode_Disabled));
1682 }
1683 else if (!strcmp(pValueUnion.psz, "hosttoguest"))
1684 {
1685 CHECK_ERROR (machine, COMSETTER(ClipboardMode)(ClipboardMode_HostToGuest));
1686 }
1687 else if (!strcmp(pValueUnion.psz, "guesttohost"))
1688 {
1689 CHECK_ERROR (machine, COMSETTER(ClipboardMode)(ClipboardMode_GuestToHost));
1690 }
1691 else if (!strcmp(pValueUnion.psz, "bidirectional"))
1692 {
1693 CHECK_ERROR (machine, COMSETTER(ClipboardMode)(ClipboardMode_Bidirectional));
1694 }
1695 else
1696 {
1697 errorArgument("Invalid --clipboard argument '%s'", pValueUnion.psz);
1698 rc = E_FAIL;
1699 }
1700 }
1701 break;
1702 }
1703
1704#ifdef VBOX_WITH_VRDP
1705 case MODIFYVMVRDPPORT:
1706 {
1707 if (pValueUnion.psz)
1708 {
1709 ComPtr<IVRDPServer> vrdpServer;
1710 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1711 ASSERT(vrdpServer);
1712
1713 if (!strcmp(pValueUnion.psz, "default"))
1714 CHECK_ERROR (vrdpServer, COMSETTER(Ports)(Bstr("0")));
1715 else
1716 CHECK_ERROR (vrdpServer, COMSETTER(Ports)(Bstr(pValueUnion.psz)));
1717 }
1718 break;
1719 }
1720
1721 case MODIFYVMVRDPADDRESS:
1722 {
1723 if (pValueUnion.psz)
1724 {
1725 ComPtr<IVRDPServer> vrdpServer;
1726 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1727 ASSERT(vrdpServer);
1728
1729 CHECK_ERROR (vrdpServer, COMSETTER(NetAddress)(Bstr(pValueUnion.psz)));
1730 }
1731 break;
1732 }
1733
1734 case MODIFYVMVRDPAUTHTYPE:
1735 {
1736 if (pValueUnion.psz)
1737 {
1738 ComPtr<IVRDPServer> vrdpServer;
1739 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1740 ASSERT(vrdpServer);
1741
1742 if (!strcmp(pValueUnion.psz, "null"))
1743 {
1744 CHECK_ERROR (vrdpServer, COMSETTER(AuthType)(VRDPAuthType_Null));
1745 }
1746 else if (!strcmp(pValueUnion.psz, "external"))
1747 {
1748 CHECK_ERROR (vrdpServer, COMSETTER(AuthType)(VRDPAuthType_External));
1749 }
1750 else if (!strcmp(pValueUnion.psz, "guest"))
1751 {
1752 CHECK_ERROR (vrdpServer, COMSETTER(AuthType)(VRDPAuthType_Guest));
1753 }
1754 else
1755 {
1756 errorArgument("Invalid --vrdpauthtype argument '%s'", pValueUnion.psz);
1757 rc = E_FAIL;
1758 }
1759 }
1760 break;
1761 }
1762
1763 case MODIFYVMVRDPMULTICON:
1764 {
1765 if (pValueUnion.psz)
1766 {
1767 ComPtr<IVRDPServer> vrdpServer;
1768 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1769 ASSERT(vrdpServer);
1770
1771 if (!strcmp(pValueUnion.psz, "on"))
1772 {
1773 CHECK_ERROR (vrdpServer, COMSETTER(AllowMultiConnection)(true));
1774 }
1775 else if (!strcmp(pValueUnion.psz, "off"))
1776 {
1777 CHECK_ERROR (vrdpServer, COMSETTER(AllowMultiConnection)(false));
1778 }
1779 else
1780 {
1781 errorArgument("Invalid --vrdpmulticon argument '%s'", pValueUnion.psz);
1782 rc = E_FAIL;
1783 }
1784 }
1785 break;
1786 }
1787
1788 case MODIFYVMVRDPREUSECON:
1789 {
1790 if (pValueUnion.psz)
1791 {
1792 ComPtr<IVRDPServer> vrdpServer;
1793 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1794 ASSERT(vrdpServer);
1795
1796 if (!strcmp(pValueUnion.psz, "on"))
1797 {
1798 CHECK_ERROR (vrdpServer, COMSETTER(ReuseSingleConnection)(true));
1799 }
1800 else if (!strcmp(pValueUnion.psz, "off"))
1801 {
1802 CHECK_ERROR (vrdpServer, COMSETTER(ReuseSingleConnection)(false));
1803 }
1804 else
1805 {
1806 errorArgument("Invalid --vrdpreusecon argument '%s'", pValueUnion.psz);
1807 rc = E_FAIL;
1808 }
1809 }
1810 break;
1811 }
1812
1813 case MODIFYVMVRDP:
1814 {
1815 if (pValueUnion.psz)
1816 {
1817 ComPtr<IVRDPServer> vrdpServer;
1818 machine->COMGETTER(VRDPServer)(vrdpServer.asOutParam());
1819 ASSERT(vrdpServer);
1820
1821 if (!strcmp(pValueUnion.psz, "on"))
1822 {
1823 CHECK_ERROR (vrdpServer, COMSETTER(Enabled)(true));
1824 }
1825 else if (!strcmp(pValueUnion.psz, "off"))
1826 {
1827 CHECK_ERROR (vrdpServer, COMSETTER(Enabled)(false));
1828 }
1829 else
1830 {
1831 errorArgument("Invalid --vrdp argument '%s'", pValueUnion.psz);
1832 rc = E_FAIL;
1833 }
1834 }
1835 break;
1836 }
1837#endif /* VBOX_WITH_VRDP */
1838
1839 case MODIFYVMUSBEHCI:
1840 {
1841 if (pValueUnion.psz)
1842 {
1843 ComPtr<IUSBController> UsbCtl;
1844 CHECK_ERROR (machine, COMGETTER(USBController)(UsbCtl.asOutParam()));
1845 if (SUCCEEDED(rc))
1846 {
1847 if (!strcmp(pValueUnion.psz, "on") || !strcmp(pValueUnion.psz, "enable"))
1848 CHECK_ERROR (UsbCtl, COMSETTER(EnabledEhci)(true));
1849 else if (!strcmp(pValueUnion.psz, "off") || !strcmp(pValueUnion.psz, "disable"))
1850 CHECK_ERROR (UsbCtl, COMSETTER(EnabledEhci)(false));
1851 else
1852 return errorArgument("Invalid --usbehci argument '%s'", pValueUnion.psz);
1853 }
1854 }
1855 break;
1856 }
1857
1858 case MODIFYVMUSB:
1859 {
1860 if (pValueUnion.psz)
1861 {
1862 ComPtr<IUSBController> UsbCtl;
1863 CHECK_ERROR (machine, COMGETTER(USBController)(UsbCtl.asOutParam()));
1864 if (SUCCEEDED(rc))
1865 {
1866 if (!strcmp(pValueUnion.psz, "on") || !strcmp(pValueUnion.psz, "enable"))
1867 CHECK_ERROR (UsbCtl, COMSETTER(Enabled)(true));
1868 else if (!strcmp(pValueUnion.psz, "off") || !strcmp(pValueUnion.psz, "disable"))
1869 CHECK_ERROR (UsbCtl, COMSETTER(Enabled)(false));
1870 else
1871 return errorArgument("Invalid --usb argument '%s'", pValueUnion.psz);
1872 }
1873 }
1874 break;
1875 }
1876
1877 case MODIFYVMSNAPSHOTFOLDER:
1878 {
1879 if (pValueUnion.psz)
1880 {
1881 if (!strcmp(pValueUnion.psz, "default"))
1882 CHECK_ERROR (machine, COMSETTER(SnapshotFolder)(NULL));
1883 else
1884 CHECK_ERROR (machine, COMSETTER(SnapshotFolder)(Bstr(pValueUnion.psz)));
1885 }
1886 break;
1887 }
1888
1889 case MODIFYVMLIVEMIGRATIONTARGET:
1890 {
1891 if (pValueUnion.psz)
1892 {
1893 if (!strcmp(pValueUnion.psz, "on"))
1894 CHECK_ERROR (machine, COMSETTER(LiveMigrationTarget)(1));
1895 else if (!strcmp(pValueUnion.psz, "off"))
1896 CHECK_ERROR (machine, COMSETTER(LiveMigrationTarget)(0));
1897 else
1898 return errorArgument("Invalid --livemigrationtarget value '%s'", pValueUnion.psz);
1899 }
1900 break;
1901 }
1902
1903 case MODIFYVMLIVEMIGRATIONPORT:
1904 {
1905 if (pValueUnion.u32 > 0)
1906 CHECK_ERROR (machine, COMSETTER(LiveMigrationPort)(pValueUnion.u32));
1907 break;
1908 }
1909
1910 case MODIFYVMLIVEMIGRATIONPASSWORD:
1911 {
1912 if (pValueUnion.psz)
1913 CHECK_ERROR (machine, COMSETTER(LiveMigrationPassword)(Bstr(pValueUnion.psz)));
1914 break;
1915 }
1916
1917 default:
1918 {
1919 errorGetOpt(USAGE_MODIFYVM, c, &pValueUnion);
1920 rc = E_FAIL;
1921 break;
1922 }
1923 }
1924 }
1925
1926 /* commit changes */
1927 if (SUCCEEDED(rc))
1928 CHECK_ERROR (machine, SaveSettings());
1929
1930 /* it's important to always close sessions */
1931 a->session->Close();
1932
1933 return SUCCEEDED(rc) ? 0 : 1;
1934}
1935
1936#endif /* !VBOX_ONLY_DOCS */
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette