VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxHeadless/testcase/tstHeadless.cpp@ 63495

Last change on this file since 63495 was 60063, checked in by vboxsync, 9 years ago

Frontends etc: convert more code to use VirtualBoxClient instead of direct creation of VirtualBox instances, to improve error handling

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.0 KB
Line 
1/** @file
2 *
3 * VBox frontends: VBoxHeadless frontend:
4 * Testcases
5 */
6
7/*
8 * Copyright (C) 2006-2016 Oracle Corporation
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 */
18
19#include <VBox/com/com.h>
20#include <VBox/com/string.h>
21#include <VBox/com/Guid.h>
22#include <VBox/com/ErrorInfo.h>
23#include <VBox/com/errorprint.h>
24
25#include <VBox/com/VirtualBox.h>
26
27using namespace com;
28
29#include <VBox/log.h>
30#include <iprt/initterm.h>
31#include <iprt/stream.h>
32
33
34////////////////////////////////////////////////////////////////////////////////
35
36/**
37 * Entry point.
38 */
39int main(int argc, char **argv)
40{
41 // initialize VBox Runtime
42 RTR3InitExe(argc, &argv, 0);
43
44 // the below cannot be Bstr because on Linux Bstr doesn't work
45 // until XPCOM (nsMemory) is initialized
46 const char *name = NULL;
47 const char *operation = NULL;
48
49 // parse the command line
50 if (argc > 1)
51 name = argv [1];
52 if (argc > 2)
53 operation = argv [2];
54
55 if (!name || !operation)
56 {
57 RTPrintf("\nUsage:\n\n"
58 "%s <machine_name> [on|off|pause|resume]\n\n",
59 argv [0]);
60 return 0;
61 }
62
63 RTPrintf("\n");
64 RTPrintf("tstHeadless STARTED.\n");
65
66 RTPrintf("VM name : {%s}\n"
67 "Operation : %s\n\n",
68 name, operation);
69
70 HRESULT rc;
71
72 rc = com::Initialize();
73 if (FAILED(rc))
74 {
75 RTPrintf("ERROR: failed to initialize COM!\n");
76 return rc;
77 }
78
79 do
80 {
81 ComPtr <IVirtualBoxClient> virtualBoxClient;
82 ComPtr <IVirtualBox> virtualBox;
83 ComPtr <ISession> session;
84
85 RTPrintf("Creating VirtualBox object...\n");
86 rc = virtualBoxClient.createInprocObject(CLSID_VirtualBoxClient);
87 if (SUCCEEDED(rc))
88 rc = virtualBoxClient->COMGETTER(VirtualBox)(virtualBox.asOutParam());
89 if (FAILED(rc))
90 RTPrintf("ERROR: failed to create the VirtualBox object!\n");
91 else
92 {
93 rc = session.createInprocObject(CLSID_Session);
94 if (FAILED(rc))
95 RTPrintf("ERROR: failed to create a session object!\n");
96 }
97
98 if (FAILED(rc))
99 {
100 com::ErrorInfo info;
101 if (!info.isFullAvailable() && !info.isBasicAvailable())
102 {
103 com::GluePrintRCMessage(rc);
104 RTPrintf("Most likely, the VirtualBox COM server is not running or failed to start.\n");
105 }
106 else
107 com::GluePrintErrorInfo(info);
108 break;
109 }
110
111 ComPtr <IMachine> m;
112
113 // find ID by name
114 CHECK_ERROR_BREAK(virtualBox, FindMachine(Bstr(name).raw(),
115 m.asOutParam()));
116
117 if (!strcmp(operation, "on"))
118 {
119 ComPtr <IProgress> progress;
120 RTPrintf("Opening a new (remote) session...\n");
121 CHECK_ERROR_BREAK(m,
122 LaunchVMProcess(session, Bstr("vrdp").raw(),
123 NULL, progress.asOutParam()));
124
125 RTPrintf("Waiting for the remote session to open...\n");
126 CHECK_ERROR_BREAK(progress, WaitForCompletion(-1));
127
128 BOOL completed;
129 CHECK_ERROR_BREAK(progress, COMGETTER(Completed)(&completed));
130 ASSERT(completed);
131
132 LONG resultCode;
133 CHECK_ERROR_BREAK(progress, COMGETTER(ResultCode)(&resultCode));
134 if (FAILED(resultCode))
135 {
136 ProgressErrorInfo info(progress);
137 com::GluePrintErrorInfo(info);
138 }
139 else
140 {
141 RTPrintf("Remote session has been successfully opened.\n");
142 }
143 }
144 else
145 {
146 RTPrintf("Opening an existing session...\n");
147 CHECK_ERROR_BREAK(m, LockMachine(session, LockType_Shared));
148
149 ComPtr <IConsole> console;
150 CHECK_ERROR_BREAK(session, COMGETTER(Console)(console.asOutParam()));
151
152 if (!strcmp(operation, "off"))
153 {
154 ComPtr <IProgress> progress;
155 RTPrintf("Powering the VM off...\n");
156 CHECK_ERROR_BREAK(console, PowerDown(progress.asOutParam()));
157
158 RTPrintf("Waiting for the VM to power down...\n");
159 CHECK_ERROR_BREAK(progress, WaitForCompletion(-1));
160
161 BOOL completed;
162 CHECK_ERROR_BREAK(progress, COMGETTER(Completed)(&completed));
163 ASSERT(completed);
164
165 LONG resultCode;
166 CHECK_ERROR_BREAK(progress, COMGETTER(ResultCode)(&resultCode));
167 if (FAILED(resultCode))
168 {
169 ProgressErrorInfo info(progress);
170 com::GluePrintErrorInfo(info);
171 }
172 else
173 {
174 RTPrintf("VM is powered down.\n");
175 }
176 }
177 else
178 if (!strcmp(operation, "pause"))
179 {
180 RTPrintf("Pausing the VM...\n");
181 CHECK_ERROR_BREAK(console, Pause());
182 }
183 else
184 if (!strcmp(operation, "resume"))
185 {
186 RTPrintf("Resuming the VM...\n");
187 CHECK_ERROR_BREAK(console, Resume());
188 }
189 else
190 {
191 RTPrintf("Invalid operation!\n");
192 }
193 }
194
195 RTPrintf("Closing the session (may fail after power off)...\n");
196 CHECK_ERROR(session, UnlockMachine());
197 }
198 while (0);
199 RTPrintf("\n");
200
201 com::Shutdown();
202
203 RTPrintf("tstHeadless FINISHED.\n");
204
205 return rc;
206}
207
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