VirtualBox

source: vbox/trunk/src/VBox/Main/cbinding/tstXPCOMCGlue.c@ 21571

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

Main: back out the IProgess::GetResultCode() parameter change

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.7 KB
Line 
1/* $Revision: 20220 $ */
2/** @file tstXPCOMCGlue.c
3 * Demonstrator program to illustrate use of C bindings of Main API.
4 *
5 * Linux only at the moment due to shared library magic in the Makefile.
6 */
7
8/*
9 * Copyright (C) 2009 Sun Microsystems, Inc.
10 *
11 * This file is part of VirtualBox Open Source Edition (OSE), as
12 * available from http://www.virtualbox.org. This file is free software;
13 * you can redistribute it and/or modify it under the terms of the GNU
14 * General Public License (GPL) as published by the Free Software
15 * Foundation, in version 2 as it comes in the "COPYING" file of the
16 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
17 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
20 * Clara, CA 95054 USA or visit http://www.sun.com if you need
21 * additional information or have any questions.
22 */
23
24/*******************************************************************************
25* Header Files *
26*******************************************************************************/
27#include "VBoxXPCOMCGlue.h"
28#include <stdio.h>
29#include <string.h>
30#include <stdlib.h>
31
32static void listVMs(IVirtualBox *virtualBox, ISession *session);
33static void startVM(IVirtualBox *virtualBox, ISession *session, PRUnichar *id);
34
35/**
36 * List the registered VMs.
37 *
38 * @param virtualBox ptr to IVirtualBox object
39 * @param session ptr to ISession object
40 */
41static void listVMs(IVirtualBox *virtualBox, ISession *session)
42{
43 nsresult rc;
44 IMachine **machines = NULL;
45 PRUint32 machineCnt = 0;
46 PRUint32 i;
47 unsigned start_id;
48
49 /*
50 * Get the list of all registered VMs.
51 */
52
53 rc = virtualBox->vtbl->GetMachines(virtualBox, &machineCnt, &machines);
54 if (NS_FAILED(rc))
55 {
56 fprintf(stderr, "could not get list of machines, rc=%08x\n",
57 (unsigned)rc);
58 return;
59 }
60
61 if (machineCnt == 0)
62 {
63 printf("\tNo VMs\n");
64 return;
65 }
66
67 printf("VM List:\n\n");
68
69 /*
70 * Iterate through the collection.
71 */
72
73 for (i = 0; i < machineCnt; ++i)
74 {
75 IMachine *machine = machines[i];
76 PRBool isAccessible = PR_FALSE;
77
78 printf("\tMachine #%u\n", (unsigned)i);
79
80 if (!machine)
81 {
82 printf("\t(skipped, NULL)\n");
83 continue;
84 }
85
86 machine->vtbl->GetAccessible(machine, &isAccessible);
87
88 if (isAccessible)
89 {
90 PRUnichar *machineNameUtf16;
91 char *machineName;
92
93 machine->vtbl->GetName(machine, &machineNameUtf16);
94 g_pVBoxFuncs->pfnUtf16ToUtf8(machineNameUtf16,&machineName);
95 printf("\tName: %s\n", machineName);
96
97 g_pVBoxFuncs->pfnUtf8Free(machineName);
98 g_pVBoxFuncs->pfnComUnallocMem(machineNameUtf16);
99 }
100 else
101 {
102 printf("\tName: <inaccessible>\n");
103 }
104
105
106 {
107 PRUnichar *uuidUtf16 = NULL;
108 char *uuidUtf8 = NULL;
109
110 machine->vtbl->GetId(machine, &uuidUtf16);
111 g_pVBoxFuncs->pfnUtf16ToUtf8(uuidUtf16, &uuidUtf8);
112 printf("\tUUID: %s\n", uuidUtf8);
113
114 g_pVBoxFuncs->pfnUtf8Free(uuidUtf8);
115 g_pVBoxFuncs->pfnUtf16Free(uuidUtf16);
116 }
117
118 if (isAccessible)
119 {
120 {
121 PRUnichar *configFile;
122 char *configFile1 = calloc((size_t)64, (size_t)1);
123
124 machine->vtbl->GetSettingsFilePath(machine, &configFile);
125 g_pVBoxFuncs->pfnUtf16ToUtf8(configFile, &configFile1);
126 printf("\tConfig file: %s\n", configFile1);
127
128 free(configFile1);
129 g_pVBoxFuncs->pfnComUnallocMem(configFile);
130 }
131
132 {
133 PRUint32 memorySize;
134
135 machine->vtbl->GetMemorySize(machine, &memorySize);
136 printf("\tMemory size: %uMB\n", memorySize);
137 }
138
139 {
140 PRUnichar *typeId;
141 PRUnichar *osNameUtf16;
142 char *osName;
143 IGuestOSType *osType = NULL;
144
145 machine->vtbl->GetOSTypeId(machine, &typeId);
146 virtualBox->vtbl->GetGuestOSType(virtualBox, typeId, &osType);
147 osType->vtbl->GetDescription(osType, &osNameUtf16);
148 g_pVBoxFuncs->pfnUtf16ToUtf8(osNameUtf16,&osName);
149 printf("\tGuest OS: %s\n\n", osName);
150
151 osType->vtbl->nsisupports.Release((void *)osType);
152 g_pVBoxFuncs->pfnUtf8Free(osName);
153 g_pVBoxFuncs->pfnComUnallocMem(osNameUtf16);
154 g_pVBoxFuncs->pfnComUnallocMem(typeId);
155 }
156 }
157 }
158
159 /*
160 * Let the user chose a machine to start.
161 */
162
163 printf("Type Machine# to start (0 - %u) or 'quit' to do nothing: ",
164 (unsigned)(machineCnt - 1));
165 fflush(stdout);
166
167 if (scanf("%u", &start_id) == 1 && start_id < machineCnt)
168 {
169 IMachine *machine = machines[start_id];
170
171 if (machine)
172 {
173 PRUnichar *uuidUtf16 = NULL;
174
175 machine->vtbl->GetId(machine, &uuidUtf16);
176 startVM(virtualBox, session, uuidUtf16);
177
178 g_pVBoxFuncs->pfnUtf16Free(uuidUtf16);
179 }
180 }
181
182 /*
183 * Don't forget to release the objects in the array.
184 */
185
186 for (i = 0; i < machineCnt; ++i)
187 {
188 IMachine *machine = machines[i];
189
190 if (machine)
191 {
192 machine->vtbl->nsisupports.Release((void *)machine);
193 }
194 }
195}
196
197/**
198 * Start a VM.
199 *
200 * @param virtualBox ptr to IVirtualBox object
201 * @param session ptr to ISession object
202 * @param id identifies the machine to start
203 */
204static void startVM(IVirtualBox *virtualBox, ISession *session, PRUnichar *id)
205{
206 nsresult rc;
207 IMachine *machine = NULL;
208 IProgress *progress = NULL;
209 PRUnichar *env = NULL;
210 PRUnichar *sessionType;
211
212 rc = virtualBox->vtbl->GetMachine(virtualBox, id, &machine);
213
214 if (NS_FAILED(rc) || !machine)
215 {
216 fprintf(stderr, "Error: Couldn't get the machine handle.\n");
217 return;
218 }
219
220 g_pVBoxFuncs->pfnUtf8ToUtf16("gui", &sessionType);
221
222 rc = virtualBox->vtbl->OpenRemoteSession(
223 virtualBox,
224 session,
225 id,
226 sessionType,
227 env,
228 &progress
229 );
230
231 g_pVBoxFuncs->pfnUtf16Free(sessionType);
232
233 if (NS_FAILED(rc))
234 {
235 fprintf(stderr, "Error: OpenRemoteSession failed.\n");
236 }
237 else
238 {
239 PRBool completed;
240 PRInt32 resultCode;
241
242 printf("Waiting for the remote session to open...\n");
243 progress->vtbl->WaitForCompletion(progress, -1);
244
245 rc = progress->vtbl->GetCompleted(progress, &completed);
246 if (NS_FAILED(rc))
247 {
248 fprintf (stderr, "Error: GetCompleted status failed.\n");
249 }
250
251 progress->vtbl->GetResultCode(progress, &resultCode);
252 if (NS_FAILED(resultCode))
253 {
254 IVirtualBoxErrorInfo *errorInfo;
255 PRUnichar *textUtf16;
256 char *text;
257
258 progress->vtbl->GetErrorInfo(progress, &errorInfo);
259 errorInfo->vtbl->GetText(errorInfo, &textUtf16);
260 g_pVBoxFuncs->pfnUtf16ToUtf8(textUtf16, &text);
261 printf("Error: %s\n", text);
262
263 g_pVBoxFuncs->pfnComUnallocMem(textUtf16);
264 g_pVBoxFuncs->pfnUtf8Free(text);
265 }
266 else
267 {
268 fprintf(stderr, "Remote session has been successfully opened.\n");
269 }
270 progress->vtbl->nsisupports.Release((void *)progress);
271 }
272
273 /* It's important to always release resources. */
274 machine->vtbl->nsisupports.Release((void *)machine);
275}
276
277/* Main - Start the ball rolling. */
278
279int main(int argc, char **argv)
280{
281 IVirtualBox *vbox = NULL;
282 ISession *session = NULL;
283 PRUint32 revision = 0;
284 PRUnichar *versionUtf16 = NULL;
285 PRUnichar *homefolderUtf16 = NULL;
286 nsresult rc; /* Result code of various function (method) calls. */
287
288 printf("Starting Main\n");
289
290 /*
291 * VBoxComInitialize does all the necessary startup action and
292 * provides us with pointers to vbox and session handles.
293 * It should be matched by a call to VBoxComUninitialize(vbox)
294 * when done.
295 */
296
297 if (VBoxCGlueInit() != 0)
298 {
299 fprintf(stderr, "%s: FATAL: VBoxCGlueInit failed: %s\n",
300 argv[0], g_szVBoxErrMsg);
301 return EXIT_FAILURE;
302 }
303
304 g_pVBoxFuncs->pfnComInitialize(IVIRTUALBOX_IID_STR, &vbox,
305 ISESSION_IID_STR, &session);
306 if (vbox == NULL)
307 {
308 fprintf(stderr, "%s: FATAL: could not get vbox handle\n", argv[0]);
309 return EXIT_FAILURE;
310 }
311 if (session == NULL)
312 {
313 fprintf(stderr, "%s: FATAL: could not get session handle\n", argv[0]);
314 return EXIT_FAILURE;
315 }
316
317 /*
318 * Now ask for revision, version and home folder information of
319 * this vbox. Were not using fancy macros here so it
320 * remains easy to see how we access C++'s vtable.
321 */
322
323 printf("----------------------------------------------------\n");
324
325 /* 1. Revision */
326
327 rc = vbox->vtbl->GetRevision(vbox, &revision);
328 if (NS_SUCCEEDED(rc))
329 {
330 printf("\tRevision: %u\n", revision);
331 }
332 else
333 {
334 fprintf(stderr, "%s: GetRevision() returned %08x\n",
335 argv[0], (unsigned)rc);
336 }
337
338 /* 2. Version */
339
340 rc = vbox->vtbl->GetVersion(vbox, &versionUtf16);
341 if (NS_SUCCEEDED(rc))
342 {
343 char *version = NULL;
344 g_pVBoxFuncs->pfnUtf16ToUtf8(versionUtf16, &version);
345 printf("\tVersion: %s\n", version);
346 g_pVBoxFuncs->pfnUtf8Free(version);
347 g_pVBoxFuncs->pfnComUnallocMem(versionUtf16);
348 }
349 else
350 {
351 fprintf(stderr, "%s: GetVersion() returned %08x\n",
352 argv[0], (unsigned)rc);
353 }
354
355 /* 3. Home Folder */
356
357 rc = vbox->vtbl->GetHomeFolder(vbox, &homefolderUtf16);
358 if (NS_SUCCEEDED(rc))
359 {
360 char *homefolder = NULL;
361 g_pVBoxFuncs->pfnUtf16ToUtf8(homefolderUtf16, &homefolder);
362 printf("\tHomeFolder: %s\n", homefolder);
363 g_pVBoxFuncs->pfnUtf8Free(homefolder);
364 g_pVBoxFuncs->pfnComUnallocMem(homefolderUtf16);
365 }
366 else
367 {
368 fprintf(stderr, "%s: GetHomeFolder() returned %08x\n",
369 argv[0], (unsigned)rc);
370 }
371
372 listVMs(vbox, session);
373 session->vtbl->Close(session);
374
375 printf("----------------------------------------------------\n");
376
377 /*
378 * Do as mom told us: always clean up after yourself.
379 */
380
381 g_pVBoxFuncs->pfnComUninitialize();
382 VBoxCGlueTerm();
383 printf("Finished Main\n");
384
385 return 0;
386}
387/* vim: set ts=4 sw=4 et: */
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