VirtualBox

source: vbox/trunk/src/VBox/Main/src-client/AdditionsFacilityImpl.cpp@ 45029

Last change on this file since 45029 was 40212, checked in by vboxsync, 13 years ago

Main: Added facility for auto-logon modules; added book-keeping of last facility statuses (10 max).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.4 KB
Line 
1/** @file
2 *
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2012 Oracle Corporation
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 "AdditionsFacilityImpl.h"
19#include "Global.h"
20
21#include "AutoCaller.h"
22#include "Logging.h"
23
24/* static */
25const AdditionsFacility::FacilityInfo AdditionsFacility::s_aFacilityInfo[8] =
26{
27 /* NOTE: We assume that unknown is always the first entry! */
28 { "Unknown", AdditionsFacilityType_None, AdditionsFacilityClass_None },
29 { "VirtualBox Base Driver", AdditionsFacilityType_VBoxGuestDriver, AdditionsFacilityClass_Driver },
30 { "Auto Logon", AdditionsFacilityType_AutoLogon, AdditionsFacilityClass_Feature },
31 { "VirtualBox System Service", AdditionsFacilityType_VBoxService, AdditionsFacilityClass_Service },
32 { "VirtualBox Desktop Integration", AdditionsFacilityType_VBoxTrayClient, AdditionsFacilityClass_Program },
33 { "Seamless Mode", AdditionsFacilityType_Seamless, AdditionsFacilityClass_Feature },
34 { "Graphics Mode", AdditionsFacilityType_Graphics, AdditionsFacilityClass_Feature },
35};
36
37// constructor / destructor
38/////////////////////////////////////////////////////////////////////////////
39
40DEFINE_EMPTY_CTOR_DTOR(AdditionsFacility)
41
42HRESULT AdditionsFacility::FinalConstruct()
43{
44 LogFlowThisFunc(("\n"));
45 return BaseFinalConstruct();
46}
47
48void AdditionsFacility::FinalRelease()
49{
50 LogFlowThisFuncEnter();
51 uninit();
52 BaseFinalRelease();
53 LogFlowThisFuncLeave();
54}
55
56// public initializer/uninitializer for internal purposes only
57/////////////////////////////////////////////////////////////////////////////
58
59HRESULT AdditionsFacility::init(Guest *a_pParent, AdditionsFacilityType_T a_enmFacility, AdditionsFacilityStatus_T a_enmStatus,
60 uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS)
61{
62 LogFlowThisFunc(("a_pParent=%p\n", a_pParent));
63
64 /* Enclose the state transition NotReady->InInit->Ready. */
65 AutoInitSpan autoInitSpan(this);
66 AssertReturn(autoInitSpan.isOk(), E_FAIL);
67
68 FacilityState state;
69 state.mStatus = a_enmStatus;
70 state.mTimestamp = *a_pTimeSpecTS;
71 NOREF(a_fFlags);
72
73 Assert(mData.mStates.size() == 0);
74 mData.mStates.push_back(state);
75 mData.mType = a_enmFacility;
76 /** @todo mClass is not initialized here. */
77 NOREF(a_fFlags);
78
79 /* Confirm a successful initialization when it's the case. */
80 autoInitSpan.setSucceeded();
81
82 return S_OK;
83}
84
85/**
86 * Uninitializes the instance.
87 * Called from FinalRelease().
88 */
89void AdditionsFacility::uninit()
90{
91 LogFlowThisFunc(("\n"));
92
93 /* Enclose the state transition Ready->InUninit->NotReady. */
94 AutoUninitSpan autoUninitSpan(this);
95 if (autoUninitSpan.uninitDone())
96 return;
97
98 mData.mStates.clear();
99}
100
101STDMETHODIMP AdditionsFacility::COMGETTER(ClassType)(AdditionsFacilityClass_T *aClass)
102{
103 LogFlowThisFuncEnter();
104
105 CheckComArgOutPointerValid(aClass);
106
107 AutoCaller autoCaller(this);
108 if (FAILED(autoCaller.rc())) return autoCaller.rc();
109
110 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
111
112 *aClass = getClass();
113
114 return S_OK;
115}
116
117STDMETHODIMP AdditionsFacility::COMGETTER(Name)(BSTR *aName)
118{
119 LogFlowThisFuncEnter();
120
121 CheckComArgOutPointerValid(aName);
122
123 AutoCaller autoCaller(this);
124 if (FAILED(autoCaller.rc())) return autoCaller.rc();
125
126 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
127
128 Bstr(getName()).cloneTo(aName);
129
130 return S_OK;
131}
132
133STDMETHODIMP AdditionsFacility::COMGETTER(LastUpdated)(LONG64 *aTimestamp)
134{
135 LogFlowThisFuncEnter();
136
137 CheckComArgOutPointerValid(aTimestamp);
138
139 AutoCaller autoCaller(this);
140 if (FAILED(autoCaller.rc())) return autoCaller.rc();
141
142 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
143
144 *aTimestamp = getLastUpdated();
145
146 return S_OK;
147}
148
149STDMETHODIMP AdditionsFacility::COMGETTER(Status)(AdditionsFacilityStatus_T *aStatus)
150{
151 LogFlowThisFuncEnter();
152
153 CheckComArgOutPointerValid(aStatus);
154
155 AutoCaller autoCaller(this);
156 if (FAILED(autoCaller.rc())) return autoCaller.rc();
157
158 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
159
160 *aStatus = getStatus();
161
162 return S_OK;
163}
164
165STDMETHODIMP AdditionsFacility::COMGETTER(Type)(AdditionsFacilityType_T *aType)
166{
167 LogFlowThisFuncEnter();
168
169 CheckComArgOutPointerValid(aType);
170
171 AutoCaller autoCaller(this);
172 if (FAILED(autoCaller.rc())) return autoCaller.rc();
173
174 AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
175
176 *aType = getType();
177
178 return S_OK;
179}
180
181const AdditionsFacility::FacilityInfo &AdditionsFacility::typeToInfo(AdditionsFacilityType_T aType)
182{
183 for (size_t i = 0; i < RT_ELEMENTS(s_aFacilityInfo); ++i)
184 {
185 if (s_aFacilityInfo[i].mType == aType)
186 return s_aFacilityInfo[i];
187 }
188 return s_aFacilityInfo[0]; /* Return unknown type. */
189}
190
191AdditionsFacilityClass_T AdditionsFacility::getClass() const
192{
193 return AdditionsFacility::typeToInfo(mData.mType).mClass;
194}
195
196Bstr AdditionsFacility::getName() const
197{
198 return AdditionsFacility::typeToInfo(mData.mType).mName;
199}
200
201LONG64 AdditionsFacility::getLastUpdated() const
202{
203 if (mData.mStates.size())
204 return RTTimeSpecGetMilli(&mData.mStates.front().mTimestamp);
205
206 AssertMsgFailed(("Unknown timestamp of facility!\n"));
207 return 0; /* Should never happen! */
208}
209
210AdditionsFacilityStatus_T AdditionsFacility::getStatus() const
211{
212 if (mData.mStates.size())
213 return mData.mStates.back().mStatus;
214
215 AssertMsgFailed(("Unknown status of facility!\n"));
216 return AdditionsFacilityStatus_Unknown; /* Should never happen! */
217}
218
219AdditionsFacilityType_T AdditionsFacility::getType() const
220{
221 return mData.mType;
222}
223
224/**
225 * Method used by IGuest::facilityUpdate to make updates.
226 */
227void AdditionsFacility::update(AdditionsFacilityStatus_T a_enmStatus, uint32_t a_fFlags, PCRTTIMESPEC a_pTimeSpecTS)
228{
229 FacilityState state;
230 state.mStatus = a_enmStatus;
231 state.mTimestamp = *a_pTimeSpecTS;
232 NOREF(a_fFlags);
233
234 mData.mStates.push_back(state);
235 if (mData.mStates.size() > 10) /* Only keep the last 10 states. */
236 mData.mStates.erase(mData.mStates.begin());
237}
238
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