VirtualBox

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

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

Added vim modelines to aid following coding guidelines, like no tabs,
similar to what is already in the xidl file.

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