VirtualBox

source: vbox/trunk/src/VBox/Main/testcase/tstAPI.cpp@ 12455

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

Rolled back change set 36536 as some other changes got mixed with the fix

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 37.9 KB
Line 
1/** @file
2 *
3 * tstAPI - test program for our COM/XPCOM interface
4 */
5
6/*
7 * Copyright (C) 2006-2007 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#include <stdio.h>
23#include <stdlib.h>
24
25#include <VBox/com/com.h>
26#include <VBox/com/string.h>
27#include <VBox/com/array.h>
28#include <VBox/com/Guid.h>
29#include <VBox/com/ErrorInfo.h>
30#include <VBox/com/EventQueue.h>
31
32#include <VBox/com/VirtualBox.h>
33
34using namespace com;
35
36#define LOG_ENABLED
37#define LOG_GROUP LOG_GROUP_MAIN
38#define LOG_INSTANCE NULL
39#include <VBox/log.h>
40
41#include <iprt/runtime.h>
42#include <iprt/stream.h>
43
44#define printf RTPrintf
45
46
47// forward declarations
48///////////////////////////////////////////////////////////////////////////////
49
50void queryMetrics (ComPtr <IPerformanceCollector> collector,
51 ComSafeArrayIn (IUnknown *, objects));
52
53// funcs
54///////////////////////////////////////////////////////////////////////////////
55
56HRESULT readAndChangeMachineSettings (IMachine *machine, IMachine *readonlyMachine = 0)
57{
58 HRESULT rc = S_OK;
59
60 Bstr name;
61 printf ("Getting machine name...\n");
62 CHECK_RC_RET (machine->COMGETTER(Name) (name.asOutParam()));
63 printf ("Name: {%ls}\n", name.raw());
64
65 printf("Getting machine GUID...\n");
66 Guid guid;
67 CHECK_RC (machine->COMGETTER(Id) (guid.asOutParam()));
68 if (SUCCEEDED (rc) && !guid.isEmpty()) {
69 printf ("Guid::toString(): {%s}\n", (const char *) guid.toString());
70 } else {
71 printf ("WARNING: there's no GUID!");
72 }
73
74 ULONG memorySize;
75 printf ("Getting memory size...\n");
76 CHECK_RC_RET (machine->COMGETTER(MemorySize) (&memorySize));
77 printf ("Memory size: %d\n", memorySize);
78
79 MachineState_T machineState;
80 printf ("Getting machine state...\n");
81 CHECK_RC_RET (machine->COMGETTER(State) (&machineState));
82 printf ("Machine state: %d\n", machineState);
83
84 BOOL modified;
85 printf ("Are any settings modified?...\n");
86 CHECK_RC (machine->COMGETTER(SettingsModified) (&modified));
87 if (SUCCEEDED (rc))
88 printf ("%s\n", modified ? "yes" : "no");
89
90 ULONG memorySizeBig = memorySize * 10;
91 printf("Changing memory size to %d...\n", memorySizeBig);
92 CHECK_RC (machine->COMSETTER(MemorySize) (memorySizeBig));
93
94 if (SUCCEEDED (rc))
95 {
96 printf ("Are any settings modified now?...\n");
97 CHECK_RC_RET (machine->COMGETTER(SettingsModified) (&modified));
98 printf ("%s\n", modified ? "yes" : "no");
99 ASSERT_RET (modified, 0);
100
101 ULONG memorySizeGot;
102 printf ("Getting memory size again...\n");
103 CHECK_RC_RET (machine->COMGETTER(MemorySize) (&memorySizeGot));
104 printf ("Memory size: %d\n", memorySizeGot);
105 ASSERT_RET (memorySizeGot == memorySizeBig, 0);
106
107 if (readonlyMachine)
108 {
109 printf ("Getting memory size of the counterpart readonly machine...\n");
110 ULONG memorySizeRO;
111 readonlyMachine->COMGETTER(MemorySize) (&memorySizeRO);
112 printf ("Memory size: %d\n", memorySizeRO);
113 ASSERT_RET (memorySizeRO != memorySizeGot, 0);
114 }
115
116 printf ("Discarding recent changes...\n");
117 CHECK_RC_RET (machine->DiscardSettings());
118 printf ("Are any settings modified after discarding?...\n");
119 CHECK_RC_RET (machine->COMGETTER(SettingsModified) (&modified));
120 printf ("%s\n", modified ? "yes" : "no");
121 ASSERT_RET (!modified, 0);
122
123 printf ("Getting memory size once more...\n");
124 CHECK_RC_RET (machine->COMGETTER(MemorySize) (&memorySizeGot));
125 printf ("Memory size: %d\n", memorySizeGot);
126 ASSERT_RET (memorySizeGot == memorySize, 0);
127
128 memorySize = memorySize > 128 ? memorySize / 2 : memorySize * 2;
129 printf("Changing memory size to %d...\n", memorySize);
130 CHECK_RC_RET (machine->COMSETTER(MemorySize) (memorySize));
131 }
132
133 Bstr desc;
134 printf ("Getting description...\n");
135 CHECK_ERROR_RET (machine, COMGETTER(Description) (desc.asOutParam()), rc);
136 printf ("Description is: \"%ls\"\n", desc.raw());
137
138 desc = L"This is an exemplary description (changed).";
139 printf ("Setting description to \"%ls\"...\n", desc.raw());
140 CHECK_ERROR_RET (machine, COMSETTER(Description) (desc), rc);
141
142 printf ("Saving machine settings...\n");
143 CHECK_RC (machine->SaveSettings());
144 if (SUCCEEDED (rc))
145 {
146 printf ("Are any settings modified after saving?...\n");
147 CHECK_RC_RET (machine->COMGETTER(SettingsModified) (&modified));
148 printf ("%s\n", modified ? "yes" : "no");
149 ASSERT_RET (!modified, 0);
150
151 if (readonlyMachine) {
152 printf ("Getting memory size of the counterpart readonly machine...\n");
153 ULONG memorySizeRO;
154 readonlyMachine->COMGETTER(MemorySize) (&memorySizeRO);
155 printf ("Memory size: %d\n", memorySizeRO);
156 ASSERT_RET (memorySizeRO == memorySize, 0);
157 }
158 }
159
160 Bstr extraDataKey = L"Blafasel";
161 Bstr extraData;
162 printf ("Getting extra data key {%ls}...\n", extraDataKey.raw());
163 CHECK_RC_RET (machine->GetExtraData (extraDataKey, extraData.asOutParam()));
164 if (!extraData.isEmpty()) {
165 printf ("Extra data value: {%ls}\n", extraData.raw());
166 } else {
167 if (extraData.isNull())
168 printf ("No extra data exists\n");
169 else
170 printf ("Extra data is empty\n");
171 }
172
173 if (extraData.isEmpty())
174 extraData = L"Das ist die Berliner Luft, Luft, Luft...";
175 else
176 extraData.setNull();
177 printf (
178 "Setting extra data key {%ls} to {%ls}...\n",
179 extraDataKey.raw(), extraData.raw()
180 );
181 CHECK_RC (machine->SetExtraData (extraDataKey, extraData));
182
183 if (SUCCEEDED (rc)) {
184 printf ("Getting extra data key {%ls} again...\n", extraDataKey.raw());
185 CHECK_RC_RET (machine->GetExtraData (extraDataKey, extraData.asOutParam()));
186 if (!extraData.isEmpty()) {
187 printf ("Extra data value: {%ls}\n", extraData.raw());
188 } else {
189 if (extraData.isNull())
190 printf ("No extra data exists\n");
191 else
192 printf ("Extra data is empty\n");
193 }
194 }
195
196 return rc;
197}
198
199// main
200///////////////////////////////////////////////////////////////////////////////
201
202int main(int argc, char *argv[])
203{
204 /*
205 * Initialize the VBox runtime without loading
206 * the support driver.
207 */
208 RTR3Init();
209
210 HRESULT rc;
211
212 {
213 char homeDir [RTPATH_MAX];
214 GetVBoxUserHomeDirectory (homeDir, sizeof (homeDir));
215 printf ("VirtualBox Home Directory = '%s'\n", homeDir);
216 }
217
218 printf ("Initializing COM...\n");
219
220 CHECK_RC_RET (com::Initialize());
221
222 do
223 {
224 // scopes all the stuff till shutdown
225 ////////////////////////////////////////////////////////////////////////////
226
227 ComPtr <IVirtualBox> virtualBox;
228 ComPtr <ISession> session;
229
230#if 0
231 // Utf8Str test
232 ////////////////////////////////////////////////////////////////////////////
233
234 Utf8Str nullUtf8Str;
235 printf ("nullUtf8Str='%s'\n", nullUtf8Str.raw());
236
237 Utf8Str simpleUtf8Str = "simpleUtf8Str";
238 printf ("simpleUtf8Str='%s'\n", simpleUtf8Str.raw());
239
240 Utf8Str utf8StrFmt = Utf8StrFmt ("[0=%d]%s[1=%d]",
241 0, "utf8StrFmt", 1);
242 printf ("utf8StrFmt='%s'\n", utf8StrFmt.raw());
243
244#endif
245
246 printf ("Creating VirtualBox object...\n");
247 CHECK_RC (virtualBox.createLocalObject (CLSID_VirtualBox));
248 if (FAILED (rc))
249 {
250 CHECK_ERROR_NOCALL();
251 break;
252 }
253
254 printf ("Creating Session object...\n");
255 CHECK_RC (session.createInprocObject (CLSID_Session));
256 if (FAILED (rc))
257 {
258 CHECK_ERROR_NOCALL();
259 break;
260 }
261
262#if 0
263 // IUnknown identity test
264 ////////////////////////////////////////////////////////////////////////////
265 {
266 {
267 ComPtr <IVirtualBox> virtualBox2;
268
269 printf ("Creating one more VirtualBox object...\n");
270 CHECK_RC (virtualBox2.createLocalObject (CLSID_VirtualBox));
271 if (FAILED (rc))
272 {
273 CHECK_ERROR_NOCALL();
274 break;
275 }
276
277 printf ("IVirtualBox(virualBox)=%p IVirtualBox(virualBox2)=%p\n",
278 (IVirtualBox *) virtualBox, (IVirtualBox *) virtualBox2);
279 Assert ((IVirtualBox *) virtualBox == (IVirtualBox *) virtualBox2);
280
281 ComPtr <IUnknown> unk (virtualBox);
282 ComPtr <IUnknown> unk2;
283 unk2 = virtualBox2;
284
285 printf ("IUnknown(virualBox)=%p IUnknown(virualBox2)=%p\n",
286 (IUnknown *) unk, (IUnknown *) unk2);
287 Assert ((IUnknown *) unk == (IUnknown *) unk2);
288
289 ComPtr <IVirtualBox> vb = unk;
290 ComPtr <IVirtualBox> vb2 = unk;
291
292 printf ("IVirtualBox(IUnknown(virualBox))=%p IVirtualBox(IUnknown(virualBox2))=%p\n",
293 (IVirtualBox *) vb, (IVirtualBox *) vb2);
294 Assert ((IVirtualBox *) vb == (IVirtualBox *) vb2);
295 }
296
297 {
298 ComPtr <IHost> host;
299 CHECK_ERROR_BREAK (virtualBox, COMGETTER(Host)(host.asOutParam()));
300 printf (" IHost(host)=%p\n", (IHost *) host);
301 ComPtr <IUnknown> unk = host;
302 printf (" IUnknown(host)=%p\n", (IUnknown *) unk);
303 ComPtr <IHost> host_copy = unk;
304 printf (" IHost(host_copy)=%p\n", (IHost *) host_copy);
305 ComPtr <IUnknown> unk_copy = host_copy;
306 printf (" IUnknown(host_copy)=%p\n", (IUnknown *) unk_copy);
307 Assert ((IUnknown *) unk == (IUnknown *) unk_copy);
308
309 /* query IUnknown on IUnknown */
310 ComPtr <IUnknown> unk_copy_copy;
311 unk_copy.queryInterfaceTo (unk_copy_copy.asOutParam());
312 printf (" IUnknown(unk_copy)=%p\n", (IUnknown *) unk_copy_copy);
313 Assert ((IUnknown *) unk_copy == (IUnknown *) unk_copy_copy);
314 /* query IUnknown on IUnknown in the opposite direction */
315 unk_copy_copy.queryInterfaceTo (unk_copy.asOutParam());
316 printf (" IUnknown(unk_copy_copy)=%p\n", (IUnknown *) unk_copy);
317 Assert ((IUnknown *) unk_copy == (IUnknown *) unk_copy_copy);
318
319 /* query IUnknown again after releasing all previous IUnknown instances
320 * but keeping IHost -- it should remain the same (Identity Rule) */
321 IUnknown *oldUnk = unk;
322 unk.setNull();
323 unk_copy.setNull();
324 unk_copy_copy.setNull();
325 unk = host;
326 printf (" IUnknown(host)=%p\n", (IUnknown *) unk);
327 Assert (oldUnk == (IUnknown *) unk);
328 }
329
330// printf ("Will be now released (press Enter)...");
331// getchar();
332 }
333#endif
334
335 // create the event queue
336 // (here it is necessary only to process remaining XPCOM/IPC events
337 // after the session is closed)
338 EventQueue eventQ;
339
340#if 0
341 // the simplest COM API test
342 ////////////////////////////////////////////////////////////////////////////
343 {
344 Bstr version;
345 CHECK_ERROR_BREAK (virtualBox, COMGETTER(Version) (version.asOutParam()));
346 printf ("VirtualBox version = %ls\n", version.raw());
347 }
348#endif
349
350#if 1
351 // Array test
352 ////////////////////////////////////////////////////////////////////////////
353 {
354 printf ("Calling IVirtualBox::Machines...\n");
355
356 com::SafeIfaceArray <IMachine> machines;
357 CHECK_ERROR_BREAK (virtualBox,
358 COMGETTER(Machines2) (ComSafeArrayAsOutParam (machines)));
359
360 printf ("%u machines registered (machines.isNull()=%d).\n",
361 machines.size(), machines.isNull());
362
363 for (size_t i = 0; i < machines.size(); ++ i)
364 {
365 Bstr name;
366 CHECK_ERROR_BREAK (machines [i], COMGETTER(Name) (name.asOutParam()));
367 printf ("machines[%u]='%s'\n", i, Utf8Str (name).raw());
368 }
369 }
370#endif
371
372#if 0
373 // some outdated stuff
374 ////////////////////////////////////////////////////////////////////////////
375
376 printf("Getting IHost interface...\n");
377 IHost *host;
378 rc = virtualBox->GetHost(&host);
379 if (SUCCEEDED(rc))
380 {
381 IHostDVDDriveCollection *dvdColl;
382 rc = host->GetHostDVDDrives(&dvdColl);
383 if (SUCCEEDED(rc))
384 {
385 IHostDVDDrive *dvdDrive = NULL;
386 dvdColl->GetNextHostDVDDrive(dvdDrive, &dvdDrive);
387 while (dvdDrive)
388 {
389 BSTR driveName;
390 char *driveNameUtf8;
391 dvdDrive->GetDriveName(&driveName);
392 RTUtf16ToUtf8((PCRTUTF16)driveName, &driveNameUtf8);
393 printf("Host DVD drive name: %s\n", driveNameUtf8);
394 RTStrFree(driveNameUtf8);
395 SysFreeString(driveName);
396 IHostDVDDrive *dvdDriveTemp = dvdDrive;
397 dvdColl->GetNextHostDVDDrive(dvdDriveTemp, &dvdDrive);
398 dvdDriveTemp->Release();
399 }
400 dvdColl->Release();
401 } else
402 {
403 printf("Could not get host DVD drive collection\n");
404 }
405
406 IHostFloppyDriveCollection *floppyColl;
407 rc = host->GetHostFloppyDrives(&floppyColl);
408 if (SUCCEEDED(rc))
409 {
410 IHostFloppyDrive *floppyDrive = NULL;
411 floppyColl->GetNextHostFloppyDrive(floppyDrive, &floppyDrive);
412 while (floppyDrive)
413 {
414 BSTR driveName;
415 char *driveNameUtf8;
416 floppyDrive->GetDriveName(&driveName);
417 RTUtf16ToUtf8((PCRTUTF16)driveName, &driveNameUtf8);
418 printf("Host floppy drive name: %s\n", driveNameUtf8);
419 RTStrFree(driveNameUtf8);
420 SysFreeString(driveName);
421 IHostFloppyDrive *floppyDriveTemp = floppyDrive;
422 floppyColl->GetNextHostFloppyDrive(floppyDriveTemp, &floppyDrive);
423 floppyDriveTemp->Release();
424 }
425 floppyColl->Release();
426 } else
427 {
428 printf("Could not get host floppy drive collection\n");
429 }
430 host->Release();
431 } else
432 {
433 printf("Call failed\n");
434 }
435 printf ("\n");
436#endif
437
438#if 0
439 // IVirtualBoxErrorInfo test
440 ////////////////////////////////////////////////////////////////////////////
441 {
442 // RPC calls
443
444 // call a method that will definitely fail
445 Guid uuid;
446 ComPtr <IHardDisk> hardDisk;
447 rc = virtualBox->GetHardDisk(uuid, hardDisk.asOutParam());
448 printf ("virtualBox->GetHardDisk(null-uuid)=%08X\n", rc);
449
450// {
451// com::ErrorInfo info (virtualBox);
452// PRINT_ERROR_INFO (info);
453// }
454
455 // call a method that will definitely succeed
456 Bstr version;
457 rc = virtualBox->COMGETTER(Version) (version.asOutParam());
458 printf ("virtualBox->COMGETTER(Version)=%08X\n", rc);
459
460 {
461 com::ErrorInfo info (virtualBox);
462 PRINT_ERROR_INFO (info);
463 }
464
465 // Local calls
466
467 // call a method that will definitely fail
468 ComPtr <IMachine> machine;
469 rc = session->COMGETTER(Machine)(machine.asOutParam());
470 printf ("session->COMGETTER(Machine)=%08X\n", rc);
471
472// {
473// com::ErrorInfo info (virtualBox);
474// PRINT_ERROR_INFO (info);
475// }
476
477 // call a method that will definitely succeed
478 SessionState_T state;
479 rc = session->COMGETTER(State) (&state);
480 printf ("session->COMGETTER(State)=%08X\n", rc);
481
482 {
483 com::ErrorInfo info (virtualBox);
484 PRINT_ERROR_INFO (info);
485 }
486 }
487#endif
488
489#if 0
490 // register the existing hard disk image
491 ///////////////////////////////////////////////////////////////////////////
492 do
493 {
494 ComPtr <IHardDisk> hd;
495 Bstr src = L"E:\\develop\\innotek\\images\\NewHardDisk.vdi";
496 printf ("Opening the existing hard disk '%ls'...\n", src.raw());
497 CHECK_ERROR_BREAK (virtualBox, OpenHardDisk (src, hd.asOutParam()));
498 printf ("Enter to continue...\n");
499 getchar();
500 printf ("Registering the existing hard disk '%ls'...\n", src.raw());
501 CHECK_ERROR_BREAK (virtualBox, RegisterHardDisk (hd));
502 printf ("Enter to continue...\n");
503 getchar();
504 }
505 while (FALSE);
506 printf ("\n");
507#endif
508
509#if 0
510 // find and unregister the existing hard disk image
511 ///////////////////////////////////////////////////////////////////////////
512 do
513 {
514 ComPtr <IVirtualDiskImage> vdi;
515 Bstr src = L"CreatorTest.vdi";
516 printf ("Unregistering the hard disk '%ls'...\n", src.raw());
517 CHECK_ERROR_BREAK (virtualBox, FindVirtualDiskImage (src, vdi.asOutParam()));
518 ComPtr <IHardDisk> hd = vdi;
519 Guid id;
520 CHECK_ERROR_BREAK (hd, COMGETTER(Id) (id.asOutParam()));
521 CHECK_ERROR_BREAK (virtualBox, UnregisterHardDisk (id, hd.asOutParam()));
522 }
523 while (FALSE);
524 printf ("\n");
525#endif
526
527#if 0
528 // clone the registered hard disk
529 ///////////////////////////////////////////////////////////////////////////
530 do
531 {
532#if defined RT_OS_LINUX
533 Bstr src = L"/mnt/hugaida/common/develop/innotek/images/freedos-linux.vdi";
534#else
535 Bstr src = L"E:/develop/innotek/images/freedos.vdi";
536#endif
537 Bstr dst = L"./clone.vdi";
538 RTPrintf ("Cloning '%ls' to '%ls'...\n", src.raw(), dst.raw());
539 ComPtr <IVirtualDiskImage> vdi;
540 CHECK_ERROR_BREAK (virtualBox, FindVirtualDiskImage (src, vdi.asOutParam()));
541 ComPtr <IHardDisk> hd = vdi;
542 ComPtr <IProgress> progress;
543 CHECK_ERROR_BREAK (hd, CloneToImage (dst, vdi.asOutParam(), progress.asOutParam()));
544 RTPrintf ("Waiting for completion...\n");
545 CHECK_ERROR_BREAK (progress, WaitForCompletion (-1));
546 ProgressErrorInfo ei (progress);
547 if (FAILED (ei.getResultCode()))
548 {
549 PRINT_ERROR_INFO (ei);
550 }
551 else
552 {
553 vdi->COMGETTER(FilePath) (dst.asOutParam());
554 RTPrintf ("Actual clone path is '%ls'\n", dst.raw());
555 }
556 }
557 while (FALSE);
558 printf ("\n");
559#endif
560
561#if 0
562 // find a registered hard disk by location
563 ///////////////////////////////////////////////////////////////////////////
564 do
565 {
566 ComPtr <IHardDisk> hd;
567 static const wchar_t *Names[] =
568 {
569#ifndef RT_OS_LINUX
570 L"E:/Develop/innotek/images/thinker/freedos.vdi",
571 L"E:/Develop/innotek/images/thinker/fReeDoS.vDI",
572 L"E:/Develop/innotek/images/vmdk/haiku.vmdk",
573#else
574 L"/mnt/host/common/Develop/innotek/images/maggot/freedos.vdi",
575 L"/mnt/host/common/Develop/innotek/images/maggot/fReeDoS.vDI",
576#endif
577 };
578 for (size_t i = 0; i < ELEMENTS (Names); ++ i)
579 {
580 Bstr src = Names [i];
581 printf ("Searching for hard disk '%ls'...\n", src.raw());
582 rc = virtualBox->FindHardDisk (src, hd.asOutParam());
583 if (SUCCEEDED (rc))
584 {
585 Guid id;
586 Bstr location;
587 CHECK_ERROR_BREAK (hd, COMGETTER(Id) (id.asOutParam()));
588 CHECK_ERROR_BREAK (hd, COMGETTER(Location) (location.asOutParam()));
589 printf ("Found, UUID={%Vuuid}, location='%ls'.\n",
590 id.raw(), location.raw());
591 }
592 else
593 {
594 PRINT_ERROR_INFO (com::ErrorInfo (virtualBox));
595 }
596 }
597 }
598 while (FALSE);
599 printf ("\n");
600#endif
601
602#if 0
603 // access the machine in read-only mode
604 ///////////////////////////////////////////////////////////////////////////
605 do
606 {
607 ComPtr <IMachine> machine;
608 Bstr name = argc > 1 ? argv [1] : "dos";
609 printf ("Getting a machine object named '%ls'...\n", name.raw());
610 CHECK_ERROR_BREAK (virtualBox, FindMachine (name, machine.asOutParam()));
611 printf ("Accessing the machine in read-only mode:\n");
612 readAndChangeMachineSettings (machine);
613#if 0
614 if (argc != 2)
615 {
616 printf ("Error: a string has to be supplied!\n");
617 }
618 else
619 {
620 Bstr secureLabel = argv[1];
621 machine->COMSETTER(ExtraData)(L"VBoxSDL/SecureLabel", secureLabel);
622 }
623#endif
624 }
625 while (0);
626 printf ("\n");
627#endif
628
629#if 0
630 // create a new machine (w/o registering it)
631 ///////////////////////////////////////////////////////////////////////////
632 do
633 {
634 ComPtr <IMachine> machine;
635#if defined (RT_OS_LINUX)
636 Bstr baseDir = L"/tmp/vbox";
637#else
638 Bstr baseDir = L"C:\\vbox";
639#endif
640 Bstr name = L"machina";
641
642 printf ("Creating a new machine object (base dir '%ls', name '%ls')...\n",
643 baseDir.raw(), name.raw());
644 CHECK_ERROR_BREAK (virtualBox, CreateMachine (baseDir, name,
645 machine.asOutParam()));
646
647 printf ("Getting name...\n");
648 CHECK_ERROR_BREAK (machine, COMGETTER(Name) (name.asOutParam()));
649 printf ("Name: {%ls}\n", name.raw());
650
651 BOOL modified = FALSE;
652 printf ("Are any settings modified?...\n");
653 CHECK_ERROR_BREAK (machine, COMGETTER(SettingsModified) (&modified));
654 printf ("%s\n", modified ? "yes" : "no");
655
656 ASSERT_BREAK (modified == TRUE);
657
658 name = L"Kakaya prekrasnaya virtual'naya mashina!";
659 printf ("Setting new name ({%ls})...\n", name.raw());
660 CHECK_ERROR_BREAK (machine, COMSETTER(Name) (name));
661
662 printf ("Setting memory size to 111...\n");
663 CHECK_ERROR_BREAK (machine, COMSETTER(MemorySize) (111));
664
665 Bstr desc = L"This is an exemplary description.";
666 printf ("Setting description to \"%ls\"...\n", desc.raw());
667 CHECK_ERROR_BREAK (machine, COMSETTER(Description) (desc));
668
669 ComPtr <IGuestOSType> guestOSType;
670 Bstr type = L"os2warp45";
671 CHECK_ERROR_BREAK (virtualBox, GetGuestOSType (type, guestOSType.asOutParam()));
672
673 printf ("Saving new machine settings...\n");
674 CHECK_ERROR_BREAK (machine, SaveSettings());
675
676 printf ("Accessing the newly created machine:\n");
677 readAndChangeMachineSettings (machine);
678 }
679 while (FALSE);
680 printf ("\n");
681#endif
682
683#if 0
684 // enumerate host DVD drives
685 ///////////////////////////////////////////////////////////////////////////
686 do
687 {
688 ComPtr <IHost> host;
689 CHECK_RC_BREAK (virtualBox->COMGETTER(Host) (host.asOutParam()));
690
691 {
692 ComPtr <IHostDVDDriveCollection> coll;
693 CHECK_RC_BREAK (host->COMGETTER(DVDDrives) (coll.asOutParam()));
694 ComPtr <IHostDVDDriveEnumerator> enumerator;
695 CHECK_RC_BREAK (coll->Enumerate (enumerator.asOutParam()));
696 BOOL hasmore;
697 while (SUCCEEDED (enumerator->HasMore (&hasmore)) && hasmore)
698 {
699 ComPtr <IHostDVDDrive> drive;
700 CHECK_RC_BREAK (enumerator->GetNext (drive.asOutParam()));
701 Bstr name;
702 CHECK_RC_BREAK (drive->COMGETTER(Name) (name.asOutParam()));
703 printf ("Host DVD drive: name={%ls}\n", name.raw());
704 }
705 CHECK_RC_BREAK (rc);
706
707 ComPtr <IHostDVDDrive> drive;
708 CHECK_ERROR (enumerator, GetNext (drive.asOutParam()));
709 CHECK_ERROR (coll, GetItemAt (1000, drive.asOutParam()));
710 CHECK_ERROR (coll, FindByName (Bstr ("R:"), drive.asOutParam()));
711 if (SUCCEEDED (rc))
712 {
713 Bstr name;
714 CHECK_RC_BREAK (drive->COMGETTER(Name) (name.asOutParam()));
715 printf ("Found by name: name={%ls}\n", name.raw());
716 }
717 }
718 }
719 while (FALSE);
720 printf ("\n");
721#endif
722
723#if 0
724 // enumerate hard disks & dvd images
725 ///////////////////////////////////////////////////////////////////////////
726 do
727 {
728 {
729 ComPtr <IHardDiskCollection> coll;
730 CHECK_RC_BREAK (virtualBox->COMGETTER(HardDisks) (coll.asOutParam()));
731 ComPtr <IHardDiskEnumerator> enumerator;
732 CHECK_RC_BREAK (coll->Enumerate (enumerator.asOutParam()));
733 BOOL hasmore;
734 while (SUCCEEDED (enumerator->HasMore (&hasmore)) && hasmore)
735 {
736 ComPtr <IHardDisk> disk;
737 CHECK_RC_BREAK (enumerator->GetNext (disk.asOutParam()));
738 Guid id;
739 CHECK_RC_BREAK (disk->COMGETTER(Id) (id.asOutParam()));
740 Bstr path;
741 CHECK_RC_BREAK (disk->COMGETTER(FilePath) (path.asOutParam()));
742 printf ("Hard Disk: id={%s}, path={%ls}\n",
743 id.toString().raw(), path.raw());
744 Guid mid;
745 CHECK_RC_BREAK (
746 virtualBox->GetHardDiskUsage (id, ResourceUsage_All,
747 mid.asOutParam())
748 );
749 if (mid.isEmpty())
750 printf (" not used\n");
751 else
752 printf (" used by VM: {%s}\n", mid.toString().raw());
753 }
754 CHECK_RC_BREAK (rc);
755 }
756
757 {
758 ComPtr <IDVDImageCollection> coll;
759 CHECK_RC_BREAK (virtualBox->COMGETTER(DVDImages) (coll.asOutParam()));
760 ComPtr <IDVDImageEnumerator> enumerator;
761 CHECK_RC_BREAK (coll->Enumerate (enumerator.asOutParam()));
762 BOOL hasmore;
763 while (SUCCEEDED (enumerator->HasMore (&hasmore)) && hasmore)
764 {
765 ComPtr <IDVDImage> image;
766 CHECK_RC_BREAK (enumerator->GetNext (image.asOutParam()));
767 Guid id;
768 CHECK_RC_BREAK (image->COMGETTER(Id) (id.asOutParam()));
769 Bstr path;
770 CHECK_RC_BREAK (image->COMGETTER(FilePath) (path.asOutParam()));
771 printf ("CD/DVD Image: id={%s}, path={%ls}\n",
772 id.toString().raw(), path.raw());
773 Bstr mIDs;
774 CHECK_RC_BREAK (
775 virtualBox->GetDVDImageUsage (id, ResourceUsage_All,
776 mIDs.asOutParam())
777 );
778 if (mIDs.isNull())
779 printf (" not used\n");
780 else
781 printf (" used by VMs: {%ls}\n", mIDs.raw());
782 }
783 CHECK_RC_BREAK (rc);
784 }
785 }
786 while (FALSE);
787 printf ("\n");
788#endif
789
790#if 0
791 // open a (direct) session
792 ///////////////////////////////////////////////////////////////////////////
793 do
794 {
795 ComPtr <IMachine> machine;
796 Bstr name = argc > 1 ? argv [1] : "dos";
797 printf ("Getting a machine object named '%ls'...\n", name.raw());
798 CHECK_ERROR_BREAK (virtualBox, FindMachine (name, machine.asOutParam()));
799 Guid guid;
800 CHECK_RC_BREAK (machine->COMGETTER(Id) (guid.asOutParam()));
801 printf ("Opening a session for this machine...\n");
802 CHECK_RC_BREAK (virtualBox->OpenSession (session, guid));
803#if 1
804 ComPtr <IMachine> sessionMachine;
805 printf ("Getting sessioned machine object...\n");
806 CHECK_RC_BREAK (session->COMGETTER(Machine) (sessionMachine.asOutParam()));
807 printf ("Accessing the machine within the session:\n");
808 readAndChangeMachineSettings (sessionMachine, machine);
809#if 0
810 printf ("\n");
811 printf ("Enabling the VRDP server (must succeed even if the VM is saved):\n");
812 ComPtr <IVRDPServer> vrdp;
813 CHECK_ERROR_BREAK (sessionMachine, COMGETTER(VRDPServer) (vrdp.asOutParam()));
814 if (FAILED (vrdp->COMSETTER(Enabled) (TRUE)))
815 {
816 PRINT_ERROR_INFO (com::ErrorInfo (vrdp));
817 }
818 else
819 {
820 BOOL enabled = FALSE;
821 CHECK_ERROR_BREAK (vrdp, COMGETTER(Enabled) (&enabled));
822 printf ("VRDP server is %s\n", enabled ? "enabled" : "disabled");
823 }
824#endif
825#endif
826#if 0
827 ComPtr <IConsole> console;
828 printf ("Getting the console object...\n");
829 CHECK_RC_BREAK (session->COMGETTER(Console) (console.asOutParam()));
830 printf ("Discarding the current machine state...\n");
831 ComPtr <IProgress> progress;
832 CHECK_ERROR_BREAK (console, DiscardCurrentState (progress.asOutParam()));
833 printf ("Waiting for completion...\n");
834 CHECK_ERROR_BREAK (progress, WaitForCompletion (-1));
835 ProgressErrorInfo ei (progress);
836 if (FAILED (ei.getResultCode()))
837 {
838 PRINT_ERROR_INFO (ei);
839
840 ComPtr <IUnknown> initiator;
841 CHECK_ERROR_BREAK (progress, COMGETTER(Initiator) (initiator.asOutParam()));
842
843 printf ("initiator(unk) = %p\n", (IUnknown *) initiator);
844 printf ("console(unk) = %p\n", (IUnknown *) ComPtr <IUnknown> ((IConsole *) console));
845 printf ("console = %p\n", (IConsole *) console);
846 }
847#endif
848 printf("Press enter to close session...");
849 getchar();
850 session->Close();
851 }
852 while (FALSE);
853 printf ("\n");
854#endif
855
856#if 0
857 // open a remote session
858 ///////////////////////////////////////////////////////////////////////////
859 do
860 {
861 ComPtr <IMachine> machine;
862 Bstr name = L"dos";
863 printf ("Getting a machine object named '%ls'...\n", name.raw());
864 CHECK_RC_BREAK (virtualBox->FindMachine (name, machine.asOutParam()));
865 Guid guid;
866 CHECK_RC_BREAK (machine->COMGETTER(Id) (guid.asOutParam()));
867 printf ("Opening a remote session for this machine...\n");
868 ComPtr <IProgress> progress;
869 CHECK_RC_BREAK (virtualBox->OpenRemoteSession (session, guid, Bstr("gui"),
870 NULL, progress.asOutParam()));
871 printf ("Waiting for the session to open...\n");
872 CHECK_RC_BREAK (progress->WaitForCompletion (-1));
873 ComPtr <IMachine> sessionMachine;
874 printf ("Getting sessioned machine object...\n");
875 CHECK_RC_BREAK (session->COMGETTER(Machine) (sessionMachine.asOutParam()));
876 ComPtr <IConsole> console;
877 printf ("Getting console object...\n");
878 CHECK_RC_BREAK (session->COMGETTER(Console) (console.asOutParam()));
879 printf ("Press enter to pause the VM execution in the remote session...");
880 getchar();
881 CHECK_RC (console->Pause());
882 printf ("Press enter to close this session...");
883 getchar();
884 session->Close();
885 }
886 while (FALSE);
887 printf ("\n");
888#endif
889
890#if 0
891 // open an existing remote session
892 ///////////////////////////////////////////////////////////////////////////
893 do
894 {
895 ComPtr <IMachine> machine;
896 Bstr name = "dos";
897 printf ("Getting a machine object named '%ls'...\n", name.raw());
898 CHECK_RC_BREAK (virtualBox->FindMachine (name, machine.asOutParam()));
899 Guid guid;
900 CHECK_RC_BREAK (machine->COMGETTER(Id) (guid.asOutParam()));
901 printf ("Opening an existing remote session for this machine...\n");
902 CHECK_RC_BREAK (virtualBox->OpenExistingSession (session, guid));
903 ComPtr <IMachine> sessionMachine;
904 printf ("Getting sessioned machine object...\n");
905 CHECK_RC_BREAK (session->COMGETTER(Machine) (sessionMachine.asOutParam()));
906
907#if 0
908 Bstr extraDataKey = "VBoxSDL/SecureLabel";
909 Bstr extraData = "Das kommt jetzt noch viel krasser vom total konkreten API!";
910 CHECK_RC (sessionMachine->SetExtraData (extraDataKey, extraData));
911#endif
912#if 0
913 ComPtr <IConsole> console;
914 printf ("Getting console object...\n");
915 CHECK_RC_BREAK (session->COMGETTER(Console) (console.asOutParam()));
916 printf ("Press enter to pause the VM execution in the remote session...");
917 getchar();
918 CHECK_RC (console->Pause());
919 printf ("Press enter to close this session...");
920 getchar();
921#endif
922 session->Close();
923 }
924 while (FALSE);
925 printf ("\n");
926#endif
927
928#ifdef VBOX_WITH_RESOURCE_USAGE_API
929 do {
930 // Get collector
931 ComPtr <IPerformanceCollector> collector;
932 CHECK_ERROR_BREAK (virtualBox,
933 COMGETTER(PerformanceCollector) (collector.asOutParam()));
934
935
936 // Fill base metrics array
937 Bstr baseMetricNames[] = { L"CPU/Load,RAM/Usage" };
938 com::SafeArray<BSTR> baseMetrics (1);
939 baseMetricNames[0].cloneTo (&baseMetrics [0]);
940
941 // Get host
942 ComPtr <IHost> host;
943 CHECK_ERROR_BREAK (virtualBox, COMGETTER(Host) (host.asOutParam()));
944
945 // Get machine
946 ComPtr <IMachine> machine;
947 Bstr name = argc > 1 ? argv [1] : "dsl";
948 printf ("Getting a machine object named '%ls'...\n", name.raw());
949 CHECK_RC_BREAK (virtualBox->FindMachine (name, machine.asOutParam()));
950
951 // Open session
952 Guid guid;
953 CHECK_RC_BREAK (machine->COMGETTER(Id) (guid.asOutParam()));
954 printf ("Opening a remote session for this machine...\n");
955 ComPtr <IProgress> progress;
956 CHECK_RC_BREAK (virtualBox->OpenRemoteSession (session, guid, Bstr("vrdp"),
957 NULL, progress.asOutParam()));
958 printf ("Waiting for the session to open...\n");
959 CHECK_RC_BREAK (progress->WaitForCompletion (-1));
960 ComPtr <IMachine> sessionMachine;
961 printf ("Getting sessioned machine object...\n");
962 CHECK_RC_BREAK (session->COMGETTER(Machine) (sessionMachine.asOutParam()));
963
964 // Setup base metrics
965 // Note that one needs to set up metrics after a session is open for a machine.
966 com::SafeIfaceArray<IUnknown> objects(2);
967 host.queryInterfaceTo(&objects[0]);
968 machine.queryInterfaceTo(&objects[1]);
969 CHECK_ERROR_BREAK (collector, SetupMetrics(ComSafeArrayAsInParam(baseMetrics),
970 ComSafeArrayAsInParam(objects), 1u, 10u) );
971
972 // Get console
973 ComPtr <IConsole> console;
974 printf ("Getting console object...\n");
975 CHECK_RC_BREAK (session->COMGETTER(Console) (console.asOutParam()));
976
977 RTThreadSleep(5000); // Sleep for 5 seconds
978
979 printf("Metrics collected with DSL machine running: --------------------\n");
980 queryMetrics(collector, ComSafeArrayAsInParam(objects));
981
982 // Pause
983 //printf ("Press enter to pause the VM execution in the remote session...");
984 //getchar();
985 CHECK_RC (console->Pause());
986
987 RTThreadSleep(5000); // Sleep for 5 seconds
988
989 printf("Metrics collected with DSL machine paused: ---------------------\n");
990 queryMetrics(collector, ComSafeArrayAsInParam(objects));
991
992 // Power off
993 printf ("Press enter to power off VM...");
994 getchar();
995 CHECK_RC (console->PowerDown());
996 printf ("Press enter to close this session...");
997 getchar();
998 session->Close();
999 } while (false);
1000#endif /* VBOX_WITH_RESOURCE_USAGE_API */
1001
1002 printf ("Press enter to release Session and VirtualBox instances...");
1003 getchar();
1004
1005 // end "all-stuff" scope
1006 ////////////////////////////////////////////////////////////////////////////
1007 }
1008 while (0);
1009
1010 printf("Press enter to shutdown COM...");
1011 getchar();
1012
1013 com::Shutdown();
1014
1015 printf ("tstAPI FINISHED.\n");
1016
1017 return rc;
1018}
1019
1020#ifdef VBOX_WITH_RESOURCE_USAGE_API
1021void queryMetrics (ComPtr <IPerformanceCollector> collector,
1022 ComSafeArrayIn (IUnknown *, objects))
1023{
1024 HRESULT rc;
1025
1026 //Bstr metricNames[] = { L"CPU/Load/User:avg,CPU/Load/System:avg,CPU/Load/Idle:avg,RAM/Usage/Total,RAM/Usage/Used:avg" };
1027 Bstr metricNames[] = { L"*" };
1028 com::SafeArray<BSTR> metrics (1);
1029 metricNames[0].cloneTo (&metrics [0]);
1030 com::SafeArray<BSTR> retNames;
1031 com::SafeIfaceArray<IUnknown> retObjects;
1032 com::SafeArray<ULONG> retIndices;
1033 com::SafeArray<ULONG> retLengths;
1034 com::SafeArray<LONG> retData;
1035 CHECK_ERROR (collector, QueryMetricsData(ComSafeArrayAsInParam(metrics),
1036 ComSafeArrayInArg(objects),
1037 ComSafeArrayAsOutParam(retNames),
1038 ComSafeArrayAsOutParam(retObjects),
1039 ComSafeArrayAsOutParam(retIndices),
1040 ComSafeArrayAsOutParam(retLengths),
1041 ComSafeArrayAsOutParam(retData)) );
1042 for (unsigned i = 0; i < retNames.size(); i++)
1043 {
1044 // Get info for the metric
1045 com::SafeArray<BSTR> nameOfMetric(1);
1046 Bstr tmpName(retNames[i]);
1047 tmpName.detachTo (&nameOfMetric[0]);
1048 com::SafeIfaceArray<IUnknown> anObject(1);
1049 ComPtr<IUnknown> tmpObject(retObjects[i]);
1050 tmpObject.queryInterfaceTo(&anObject[0]);
1051 com::SafeIfaceArray <IPerformanceMetric> metricInfo;
1052 CHECK_RC_BREAK (collector->GetMetrics( ComSafeArrayAsInParam(nameOfMetric),
1053 ComSafeArrayAsInParam(anObject),
1054 ComSafeArrayAsOutParam(metricInfo) ));
1055 BSTR metricUnitBSTR;
1056 CHECK_RC_BREAK (metricInfo[0]->COMGETTER(Unit) (&metricUnitBSTR));
1057 Bstr metricUnit(metricUnitBSTR);
1058 Bstr metricName(retNames[i]);
1059 LONG minVal, maxVal;
1060 CHECK_RC_BREAK (metricInfo[0]->COMGETTER(MinimumValue) (&minVal));
1061 CHECK_RC_BREAK (metricInfo[0]->COMGETTER(MaximumValue) (&maxVal));
1062 printf("obj(%p) %ls (min=%lu max=%lu)", anObject[0], metricName.raw(), minVal, maxVal);
1063 for (unsigned j = 0; j < retLengths[i]; j++)
1064 {
1065 printf(", %d %ls", retData[retIndices[i] + j] / (strcmp((const char *)metricUnit.raw(), "%")?1:1000), metricUnit.raw());
1066 }
1067 printf("\n");
1068 }
1069}
1070#endif /* VBOX_WITH_RESOURCE_USAGE_API */
Note: See TracBrowser for help on using the repository browser.

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