VirtualBox

source: vbox/trunk/src/VBox/Main/GuestImpl.cpp@ 7554

Last change on this file since 7554 was 7409, checked in by vboxsync, 17 years ago

VMMDev: added VMMDEV_GUEST_SUPPORTS_GRAPHICS capability, enabled by default, to distinguish cases where the guest additions are loaded but graphics are not supported

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.1 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2007 innotek GmbH
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
18#include "GuestImpl.h"
19#include "ConsoleImpl.h"
20#include "VMMDev.h"
21
22#include "Logging.h"
23
24#include <VBox/VBoxDev.h>
25#include <iprt/cpputils.h>
26
27// defines
28/////////////////////////////////////////////////////////////////////////////
29
30// constructor / destructor
31/////////////////////////////////////////////////////////////////////////////
32
33DEFINE_EMPTY_CTOR_DTOR (Guest)
34
35HRESULT Guest::FinalConstruct()
36{
37 return S_OK;
38}
39
40void Guest::FinalRelease()
41{
42 uninit ();
43}
44
45// public methods only for internal purposes
46/////////////////////////////////////////////////////////////////////////////
47
48/**
49 * Initializes the guest object.
50 */
51HRESULT Guest::init (Console *aParent)
52{
53 LogFlowThisFunc (("aParent=%p\n", aParent));
54
55 ComAssertRet (aParent, E_INVALIDARG);
56
57 /* Enclose the state transition NotReady->InInit->Ready */
58 AutoInitSpan autoInitSpan (this);
59 AssertReturn (autoInitSpan.isOk(), E_UNEXPECTED);
60
61 unconst (mParent) = aParent;
62
63 /* mData.mAdditionsActive is FALSE */
64
65 /* Confirm a successful initialization when it's the case */
66 autoInitSpan.setSucceeded();
67
68 ULONG aMemoryBalloonSize;
69 HRESULT ret = mParent->machine()->COMGETTER(MemoryBalloonSize)(&aMemoryBalloonSize);
70 if (ret == S_OK)
71 mMemoryBalloonSize = aMemoryBalloonSize;
72 else
73 mMemoryBalloonSize = 0; /* Default is no ballooning */
74
75 ULONG aStatUpdateInterval;
76 ret = mParent->machine()->COMGETTER(StatisticsUpdateInterval)(&aStatUpdateInterval);
77 if (ret == S_OK)
78 mStatUpdateInterval = aStatUpdateInterval;
79 else
80 mStatUpdateInterval = 0; /* Default is not to report guest statistics at all */
81
82 /* invalidate all stats */
83 for (int i=0;i<GuestStatisticType_MaxVal;i++)
84 mCurrentGuestStat[i] = GUEST_STAT_INVALID;
85
86 /* start with sample 0 */
87 mCurrentGuestStat[GuestStatisticType_SampleNumber] = 0;
88 return S_OK;
89}
90
91/**
92 * Uninitializes the instance and sets the ready flag to FALSE.
93 * Called either from FinalRelease() or by the parent when it gets destroyed.
94 */
95void Guest::uninit()
96{
97 LogFlowThisFunc (("\n"));
98
99 /* Enclose the state transition Ready->InUninit->NotReady */
100 AutoUninitSpan autoUninitSpan (this);
101 if (autoUninitSpan.uninitDone())
102 return;
103
104 unconst (mParent).setNull();
105}
106
107// IGuest properties
108/////////////////////////////////////////////////////////////////////////////
109
110STDMETHODIMP Guest::COMGETTER(OSTypeId) (BSTR *aOSTypeId)
111{
112 if (!aOSTypeId)
113 return E_POINTER;
114
115 AutoCaller autoCaller (this);
116 CheckComRCReturnRC (autoCaller.rc());
117
118 AutoReaderLock alock (this);
119
120 // redirect the call to IMachine if no additions are installed
121 if (mData.mAdditionsVersion.isNull())
122 return mParent->machine()->COMGETTER(OSTypeId) (aOSTypeId);
123
124 mData.mOSTypeId.cloneTo (aOSTypeId);
125
126 return S_OK;
127}
128
129STDMETHODIMP Guest::COMGETTER(AdditionsActive) (BOOL *aAdditionsActive)
130{
131 if (!aAdditionsActive)
132 return E_POINTER;
133
134 AutoCaller autoCaller (this);
135 CheckComRCReturnRC (autoCaller.rc());
136
137 AutoReaderLock alock (this);
138
139 *aAdditionsActive = mData.mAdditionsActive;
140
141 return S_OK;
142}
143
144STDMETHODIMP Guest::COMGETTER(AdditionsVersion) (BSTR *aAdditionsVersion)
145{
146 if (!aAdditionsVersion)
147 return E_POINTER;
148
149 AutoCaller autoCaller (this);
150 CheckComRCReturnRC (autoCaller.rc());
151
152 AutoReaderLock alock (this);
153
154 mData.mAdditionsVersion.cloneTo (aAdditionsVersion);
155
156 return S_OK;
157}
158
159STDMETHODIMP Guest::COMGETTER(SupportsSeamless) (BOOL *aSupportsSeamless)
160{
161 if (!aSupportsSeamless)
162 return E_POINTER;
163
164 AutoCaller autoCaller (this);
165 CheckComRCReturnRC (autoCaller.rc());
166
167 AutoReaderLock alock (this);
168
169 *aSupportsSeamless = mData.mSupportsSeamless;
170
171 return S_OK;
172}
173
174STDMETHODIMP Guest::COMGETTER(SupportsGraphics) (BOOL *aSupportsGraphics)
175{
176 if (!aSupportsGraphics)
177 return E_POINTER;
178
179 AutoCaller autoCaller (this);
180 CheckComRCReturnRC (autoCaller.rc());
181
182 AutoReaderLock alock (this);
183
184 *aSupportsGraphics = mData.mSupportsGraphics;
185
186 return S_OK;
187}
188
189STDMETHODIMP Guest::COMGETTER(MemoryBalloonSize) (ULONG *aMemoryBalloonSize)
190{
191 if (!aMemoryBalloonSize)
192 return E_POINTER;
193
194 AutoCaller autoCaller (this);
195 CheckComRCReturnRC (autoCaller.rc());
196
197 AutoReaderLock alock (this);
198
199 *aMemoryBalloonSize = mMemoryBalloonSize;
200
201 return S_OK;
202}
203
204STDMETHODIMP Guest::COMSETTER(MemoryBalloonSize) (ULONG aMemoryBalloonSize)
205{
206 AutoCaller autoCaller (this);
207 CheckComRCReturnRC (autoCaller.rc());
208
209 AutoLock alock (this);
210
211 HRESULT ret = mParent->machine()->COMSETTER(MemoryBalloonSize)(aMemoryBalloonSize);
212 if (ret == S_OK)
213 {
214 mMemoryBalloonSize = aMemoryBalloonSize;
215 /* forward the information to the VMM device */
216 VMMDev *vmmDev = mParent->getVMMDev();
217 if (vmmDev)
218 vmmDev->getVMMDevPort()->pfnSetMemoryBalloon(vmmDev->getVMMDevPort(), aMemoryBalloonSize);
219 }
220
221 return ret;
222}
223
224STDMETHODIMP Guest::COMGETTER(StatisticsUpdateInterval) (ULONG *aUpdateInterval)
225{
226 if (!aUpdateInterval)
227 return E_POINTER;
228
229 AutoCaller autoCaller (this);
230 CheckComRCReturnRC (autoCaller.rc());
231
232 AutoReaderLock alock (this);
233
234 *aUpdateInterval = mStatUpdateInterval;
235
236 return S_OK;
237}
238
239STDMETHODIMP Guest::COMSETTER(StatisticsUpdateInterval) (ULONG aUpdateInterval)
240{
241 AutoCaller autoCaller (this);
242 CheckComRCReturnRC (autoCaller.rc());
243
244 AutoLock alock (this);
245
246 HRESULT ret = mParent->machine()->COMSETTER(StatisticsUpdateInterval)(aUpdateInterval);
247 if (ret == S_OK)
248 {
249 mStatUpdateInterval = aUpdateInterval;
250 /* forward the information to the VMM device */
251 VMMDev *vmmDev = mParent->getVMMDev();
252 if (vmmDev)
253 vmmDev->getVMMDevPort()->pfnSetStatisticsInterval(vmmDev->getVMMDevPort(), aUpdateInterval);
254 }
255
256 return ret;
257}
258
259STDMETHODIMP Guest::SetCredentials(INPTR BSTR aUserName, INPTR BSTR aPassword,
260 INPTR BSTR aDomain, BOOL aAllowInteractiveLogon)
261{
262 if (!aUserName || !aPassword || !aDomain)
263 return E_INVALIDARG;
264
265 AutoCaller autoCaller (this);
266 CheckComRCReturnRC (autoCaller.rc());
267
268 /* forward the information to the VMM device */
269 VMMDev *vmmDev = mParent->getVMMDev();
270 if (vmmDev)
271 {
272 uint32_t u32Flags = VMMDEV_SETCREDENTIALS_GUESTLOGON;
273 if (!aAllowInteractiveLogon)
274 u32Flags = VMMDEV_SETCREDENTIALS_NOLOCALLOGON;
275
276 vmmDev->getVMMDevPort()->pfnSetCredentials(vmmDev->getVMMDevPort(),
277 Utf8Str(aUserName).raw(), Utf8Str(aPassword).raw(),
278 Utf8Str(aDomain).raw(), u32Flags);
279 return S_OK;
280 }
281
282 return setError (E_FAIL,
283 tr ("VMM device is not available (is the VM running?)"));
284}
285
286STDMETHODIMP Guest::GetStatistic(ULONG aCpuId, GuestStatisticType_T aStatistic, ULONG *aStatVal)
287{
288 if (!aStatVal)
289 return E_INVALIDARG;
290
291 if (aCpuId != 0)
292 return E_INVALIDARG;
293
294 if (aStatistic >= GuestStatisticType_MaxVal)
295 return E_INVALIDARG;
296
297 /* not available or not yet reported? */
298 if (mCurrentGuestStat[aStatistic] == GUEST_STAT_INVALID)
299 return E_INVALIDARG;
300
301 *aStatVal = mCurrentGuestStat[aStatistic];
302 return S_OK;
303}
304
305STDMETHODIMP Guest::SetStatistic(ULONG aCpuId, GuestStatisticType_T aStatistic, ULONG aStatVal)
306{
307 if (aCpuId != 0)
308 return E_INVALIDARG;
309
310 if (aStatistic >= GuestStatisticType_MaxVal)
311 return E_INVALIDARG;
312
313 /* internal method assumes that the caller known what he's doing (no boundary checks) */
314 mCurrentGuestStat[aStatistic] = aStatVal;
315 return S_OK;
316}
317
318// public methods only for internal purposes
319/////////////////////////////////////////////////////////////////////////////
320
321void Guest::setAdditionsVersion (Bstr aVersion)
322{
323 AssertReturnVoid (!aVersion.isEmpty());
324
325 AutoCaller autoCaller (this);
326 AssertComRCReturnVoid (autoCaller.rc());
327
328 AutoLock alock (this);
329
330 mData.mAdditionsVersion = aVersion;
331 /* this implies that Additions are active */
332 mData.mAdditionsActive = TRUE;
333}
334
335void Guest::setSupportsSeamless (BOOL aSupportsSeamless)
336{
337 AutoCaller autoCaller (this);
338 AssertComRCReturnVoid (autoCaller.rc());
339
340 AutoLock alock (this);
341
342 mData.mSupportsSeamless = aSupportsSeamless;
343}
344
345void Guest::setSupportsGraphics (BOOL aSupportsGraphics)
346{
347 AutoCaller autoCaller (this);
348 AssertComRCReturnVoid (autoCaller.rc());
349
350 AutoLock alock (this);
351
352 mData.mSupportsGraphics = aSupportsGraphics;
353}
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