VirtualBox

source: vbox/trunk/src/VBox/Main/include/VirtualBoxImpl.h@ 53323

Last change on this file since 53323 was 53323, checked in by vboxsync, 10 years ago

Main/VirtualBox: take vbox lock before locking dhcp server list (#7500)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 16.5 KB
Line 
1/* $Id: VirtualBoxImpl.h 53323 2014-11-13 14:52:50Z vboxsync $ */
2/** @file
3 * VirtualBox COM class implementation
4 */
5
6/*
7 * Copyright (C) 2006-2014 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#ifndef ____H_VIRTUALBOXIMPL
19#define ____H_VIRTUALBOXIMPL
20
21#include "VirtualBoxBase.h"
22#include "objectslist.h"
23#include "VirtualBoxWrap.h"
24
25#ifdef RT_OS_WINDOWS
26# include "win/resource.h"
27#endif
28
29namespace com
30{
31 class Event;
32 class EventQueue;
33}
34
35class SessionMachine;
36class GuestOSType;
37class Progress;
38class Host;
39class SystemProperties;
40class DHCPServer;
41class PerformanceCollector;
42#ifdef VBOX_WITH_EXTPACK
43class ExtPackManager;
44#endif
45class AutostartDb;
46class NATNetwork;
47
48
49typedef std::list<ComObjPtr<SessionMachine> > SessionMachinesList;
50
51#ifdef RT_OS_WINDOWS
52class SVCHlpClient;
53#endif
54
55namespace settings
56{
57 class MainConfigFile;
58 struct MediaRegistry;
59}
60class ATL_NO_VTABLE VirtualBox :
61 public VirtualBoxWrap
62#ifdef RT_OS_WINDOWS
63 , public CComCoClass<VirtualBox, &CLSID_VirtualBox>
64#endif
65{
66
67public:
68
69 typedef std::list<ComPtr<IInternalSessionControl> > InternalControlList;
70 typedef ObjectsList<Machine> MachinesOList;
71
72 class CallbackEvent;
73 friend class CallbackEvent;
74
75 DECLARE_CLASSFACTORY_SINGLETON(VirtualBox)
76
77 DECLARE_REGISTRY_RESOURCEID(IDR_VIRTUALBOX)
78
79 // Kind of redundant (VirtualBoxWrap declares itself not aggregatable and
80 // CComCoClass<VirtualBox, &CLSID_VirtualBox> as aggregatable, the former
81 // is the first inheritance), but the C++ multiple inheritance rules and
82 // the class factory in svcmain.cpp needs this to disambiguate.
83 DECLARE_NOT_AGGREGATABLE(VirtualBox)
84
85 // to postpone generation of the default ctor/dtor
86 DECLARE_EMPTY_CTOR_DTOR(VirtualBox)
87
88 HRESULT FinalConstruct();
89 void FinalRelease();
90
91 /* public initializer/uninitializer for internal purposes only */
92 HRESULT init();
93 HRESULT initMachines();
94 HRESULT initMedia(const Guid &uuidMachineRegistry,
95 const settings::MediaRegistry mediaRegistry,
96 const Utf8Str &strMachineFolder);
97 void uninit();
98
99 /* public methods only for internal purposes */
100
101 /**
102 * Override of the default locking class to be used for validating lock
103 * order with the standard member lock handle.
104 */
105 virtual VBoxLockingClass getLockingClass() const
106 {
107 return LOCKCLASS_VIRTUALBOXOBJECT;
108 }
109
110#ifdef DEBUG
111 void i_dumpAllBackRefs();
112#endif
113
114 HRESULT i_postEvent(Event *event);
115
116 HRESULT i_addProgress(IProgress *aProgress);
117 HRESULT i_removeProgress(IN_GUID aId);
118
119#ifdef RT_OS_WINDOWS
120 typedef DECLCALLBACKPTR(HRESULT, SVCHelperClientFunc)
121 (SVCHlpClient *aClient, Progress *aProgress, void *aUser, int *aVrc);
122 HRESULT i_startSVCHelperClient(bool aPrivileged,
123 SVCHelperClientFunc aFunc,
124 void *aUser, Progress *aProgress);
125#endif
126
127 void i_addProcessToReap(RTPROCESS pid);
128 void i_updateClientWatcher();
129
130 int i_loadVDPlugin(const char *pszPluginLibrary);
131 int i_unloadVDPlugin(const char *pszPluginLibrary);
132
133 void i_onMachineStateChange(const Guid &aId, MachineState_T aState);
134 void i_onMachineDataChange(const Guid &aId, BOOL aTemporary = FALSE);
135 BOOL i_onExtraDataCanChange(const Guid &aId, IN_BSTR aKey, IN_BSTR aValue,
136 Bstr &aError);
137 void i_onExtraDataChange(const Guid &aId, IN_BSTR aKey, IN_BSTR aValue);
138 void i_onMachineRegistered(const Guid &aId, BOOL aRegistered);
139 void i_onSessionStateChange(const Guid &aId, SessionState_T aState);
140
141 void i_onSnapshotTaken(const Guid &aMachineId, const Guid &aSnapshotId);
142 void i_onSnapshotDeleted(const Guid &aMachineId, const Guid &aSnapshotId);
143 void i_onSnapshotChange(const Guid &aMachineId, const Guid &aSnapshotId);
144 void i_onGuestPropertyChange(const Guid &aMachineId, IN_BSTR aName, IN_BSTR aValue,
145 IN_BSTR aFlags);
146 void i_onNatRedirectChange(const Guid &aMachineId, ULONG ulSlot, bool fRemove, IN_BSTR aName,
147 NATProtocol_T aProto, IN_BSTR aHostIp, uint16_t aHostPort,
148 IN_BSTR aGuestIp, uint16_t aGuestPort);
149 void i_onNATNetworkChange(IN_BSTR aNetworkName);
150 void i_onNATNetworkStartStop(IN_BSTR aNetworkName, BOOL aStart);
151 void i_onNATNetworkSetting(IN_BSTR aNetworkName, BOOL aEnabled, IN_BSTR aNetwork,
152 IN_BSTR aGateway, BOOL aAdvertiseDefaultIpv6RouteEnabled,
153 BOOL fNeedDhcpServer);
154 void i_onNATNetworkPortForward(IN_BSTR aNetworkName, BOOL create, BOOL fIpv6,
155 IN_BSTR aRuleName, NATProtocol_T proto,
156 IN_BSTR aHostIp, LONG aHostPort,
157 IN_BSTR aGuestIp, LONG aGuestPort);
158 void i_onHostNameResolutionConfigurationChange();
159
160 int i_natNetworkRefInc(IN_BSTR aNetworkName);
161 int i_natNetworkRefDec(IN_BSTR aNetworkName);
162
163 ComObjPtr<GuestOSType> i_getUnknownOSType();
164
165 void i_getOpenedMachines(SessionMachinesList &aMachines,
166 InternalControlList *aControls = NULL);
167 MachinesOList &i_getMachinesList();
168
169 HRESULT i_findMachine(const Guid &aId,
170 bool fPermitInaccessible,
171 bool aSetError,
172 ComObjPtr<Machine> *aMachine = NULL);
173
174 HRESULT i_findMachineByName(const Utf8Str &aName,
175 bool aSetError,
176 ComObjPtr<Machine> *aMachine = NULL);
177
178 HRESULT i_validateMachineGroup(const Utf8Str &aGroup, bool fPrimary);
179 HRESULT i_convertMachineGroups(const std::vector<com::Utf8Str> aMachineGroups, StringsList *pllMachineGroups);
180
181 HRESULT i_findHardDiskById(const Guid &id,
182 bool aSetError,
183 ComObjPtr<Medium> *aHardDisk = NULL);
184 HRESULT i_findHardDiskByLocation(const Utf8Str &strLocation,
185 bool aSetError,
186 ComObjPtr<Medium> *aHardDisk = NULL);
187 HRESULT i_findDVDOrFloppyImage(DeviceType_T mediumType,
188 const Guid *aId,
189 const Utf8Str &aLocation,
190 bool aSetError,
191 ComObjPtr<Medium> *aImage = NULL);
192 HRESULT i_findRemoveableMedium(DeviceType_T mediumType,
193 const Guid &uuid,
194 bool fRefresh,
195 bool aSetError,
196 ComObjPtr<Medium> &pMedium);
197
198 HRESULT i_findGuestOSType(const Bstr &bstrOSType,
199 GuestOSType*& pGuestOSType);
200
201 const Guid &i_getGlobalRegistryId() const;
202
203 const ComObjPtr<Host>& i_host() const;
204 SystemProperties* i_getSystemProperties() const;
205#ifdef VBOX_WITH_EXTPACK
206 ExtPackManager* i_getExtPackManager() const;
207#endif
208#ifdef VBOX_WITH_RESOURCE_USAGE_API
209 const ComObjPtr<PerformanceCollector>& i_performanceCollector() const;
210#endif /* VBOX_WITH_RESOURCE_USAGE_API */
211
212 void i_getDefaultMachineFolder(Utf8Str &str) const;
213 void i_getDefaultHardDiskFormat(Utf8Str &str) const;
214
215 /** Returns the VirtualBox home directory */
216 const Utf8Str& i_homeDir() const;
217 int i_calculateFullPath(const Utf8Str &strPath, Utf8Str &aResult);
218 void i_copyPathRelativeToConfig(const Utf8Str &strSource, Utf8Str &strTarget);
219 HRESULT i_registerMedium(const ComObjPtr<Medium> &pMedium, ComObjPtr<Medium> *ppMedium, DeviceType_T argType, AutoWriteLock &mediaTreeLock);
220 HRESULT i_unregisterMedium(Medium *pMedium);
221 void i_pushMediumToListWithChildren(MediaList &llMedia, Medium *pMedium);
222 HRESULT i_unregisterMachineMedia(const Guid &id);
223 HRESULT i_unregisterMachine(Machine *pMachine, const Guid &id);
224 void i_rememberMachineNameChangeForMedia(const Utf8Str &strOldConfigDir,
225 const Utf8Str &strNewConfigDir);
226 void i_saveMediaRegistry(settings::MediaRegistry &mediaRegistry,
227 const Guid &uuidRegistry,
228 const Utf8Str &strMachineFolder);
229 HRESULT i_saveSettings();
230 void i_markRegistryModified(const Guid &uuid);
231 void i_saveModifiedRegistries();
232 static const com::Utf8Str &i_getVersionNormalized();
233 static HRESULT i_ensureFilePathExists(const Utf8Str &strFileName, bool fCreate);
234 const Utf8Str& i_settingsFilePath();
235 AutostartDb* i_getAutostartDb() const;
236 RWLockHandle& i_getMachinesListLockHandle();
237 RWLockHandle& i_getMediaTreeLockHandle();
238 int i_encryptSetting(const Utf8Str &aPlaintext, Utf8Str *aCiphertext);
239 int i_decryptSetting(Utf8Str *aPlaintext, const Utf8Str &aCiphertext);
240 void i_storeSettingsKey(const Utf8Str &aKey);
241 bool i_isMediaUuidInUse(const Guid &aId, DeviceType_T deviceType);
242
243private:
244 class ClientWatcher;
245
246 // wrapped IVirtualBox properties
247 HRESULT getVersion(com::Utf8Str &aVersion);
248 HRESULT getVersionNormalized(com::Utf8Str &aVersionNormalized);
249 HRESULT getRevision(ULONG *aRevision);
250 HRESULT getPackageType(com::Utf8Str &aPackageType);
251 HRESULT getAPIVersion(com::Utf8Str &aAPIVersion);
252 HRESULT getHomeFolder(com::Utf8Str &aHomeFolder);
253 HRESULT getSettingsFilePath(com::Utf8Str &aSettingsFilePath);
254 HRESULT getHost(ComPtr<IHost> &aHost);
255 HRESULT getSystemProperties(ComPtr<ISystemProperties> &aSystemProperties);
256 HRESULT getMachines(std::vector<ComPtr<IMachine> > &aMachines);
257 HRESULT getMachineGroups(std::vector<com::Utf8Str> &aMachineGroups);
258 HRESULT getHardDisks(std::vector<ComPtr<IMedium> > &aHardDisks);
259 HRESULT getDVDImages(std::vector<ComPtr<IMedium> > &aDVDImages);
260 HRESULT getFloppyImages(std::vector<ComPtr<IMedium> > &aFloppyImages);
261 HRESULT getProgressOperations(std::vector<ComPtr<IProgress> > &aProgressOperations);
262 HRESULT getGuestOSTypes(std::vector<ComPtr<IGuestOSType> > &aGuestOSTypes);
263 HRESULT getSharedFolders(std::vector<ComPtr<ISharedFolder> > &aSharedFolders);
264 HRESULT getPerformanceCollector(ComPtr<IPerformanceCollector> &aPerformanceCollector);
265 HRESULT getDHCPServers(std::vector<ComPtr<IDHCPServer> > &aDHCPServers);
266 HRESULT getNATNetworks(std::vector<ComPtr<INATNetwork> > &aNATNetworks);
267 HRESULT getEventSource(ComPtr<IEventSource> &aEventSource);
268 HRESULT getExtensionPackManager(ComPtr<IExtPackManager> &aExtensionPackManager);
269 HRESULT getInternalNetworks(std::vector<com::Utf8Str> &aInternalNetworks);
270 HRESULT getGenericNetworkDrivers(std::vector<com::Utf8Str> &aGenericNetworkDrivers);
271
272 // wrapped IVirtualBox methods
273 HRESULT composeMachineFilename(const com::Utf8Str &aName,
274 const com::Utf8Str &aGroup,
275 const com::Utf8Str &aCreateFlags,
276 const com::Utf8Str &aBaseFolder,
277 com::Utf8Str &aFile);
278 HRESULT createMachine(const com::Utf8Str &aSettingsFile,
279 const com::Utf8Str &aName,
280 const std::vector<com::Utf8Str> &aGroups,
281 const com::Utf8Str &aOsTypeId,
282 const com::Utf8Str &aFlags,
283 ComPtr<IMachine> &aMachine);
284 HRESULT openMachine(const com::Utf8Str &aSettingsFile,
285 ComPtr<IMachine> &aMachine);
286 HRESULT registerMachine(const ComPtr<IMachine> &aMachine);
287 HRESULT findMachine(const com::Utf8Str &aNameOrId,
288 ComPtr<IMachine> &aMachine);
289 HRESULT getMachinesByGroups(const std::vector<com::Utf8Str> &aGroups,
290 std::vector<ComPtr<IMachine> > &aMachines);
291 HRESULT getMachineStates(const std::vector<ComPtr<IMachine> > &aMachines,
292 std::vector<MachineState_T> &aStates);
293 HRESULT createAppliance(ComPtr<IAppliance> &aAppliance);
294 HRESULT createHardDisk(const com::Utf8Str &aFormat,
295 const com::Utf8Str &aLocation,
296 ComPtr<IMedium> &aMedium);
297 HRESULT openMedium(const com::Utf8Str &aLocation,
298 DeviceType_T aDeviceType,
299 AccessMode_T aAccessMode,
300 BOOL aForceNewUuid,
301 ComPtr<IMedium> &aMedium);
302 HRESULT getGuestOSType(const com::Utf8Str &aId,
303 ComPtr<IGuestOSType> &aType);
304 HRESULT createSharedFolder(const com::Utf8Str &aName,
305 const com::Utf8Str &aHostPath,
306 BOOL aWritable,
307 BOOL aAutomount);
308 HRESULT removeSharedFolder(const com::Utf8Str &aName);
309 HRESULT getExtraDataKeys(std::vector<com::Utf8Str> &aKeys);
310 HRESULT getExtraData(const com::Utf8Str &aKey,
311 com::Utf8Str &aValue);
312 HRESULT setExtraData(const com::Utf8Str &aKey,
313 const com::Utf8Str &aValue);
314 HRESULT setSettingsSecret(const com::Utf8Str &aPassword);
315 HRESULT createDHCPServer(const com::Utf8Str &aName,
316 ComPtr<IDHCPServer> &aServer);
317 HRESULT findDHCPServerByNetworkName(const com::Utf8Str &aName,
318 ComPtr<IDHCPServer> &aServer);
319 HRESULT removeDHCPServer(const ComPtr<IDHCPServer> &aServer);
320 HRESULT createNATNetwork(const com::Utf8Str &aNetworkName,
321 ComPtr<INATNetwork> &aNetwork);
322 HRESULT findNATNetworkByName(const com::Utf8Str &aNetworkName,
323 ComPtr<INATNetwork> &aNetwork);
324 HRESULT removeNATNetwork(const ComPtr<INATNetwork> &aNetwork);
325 HRESULT checkFirmwarePresent(FirmwareType_T aFirmwareType,
326 const com::Utf8Str &aVersion,
327 com::Utf8Str &aUrl,
328 com::Utf8Str &aFile,
329 BOOL *aResult);
330
331 static HRESULT i_setErrorStatic(HRESULT aResultCode,
332 const Utf8Str &aText)
333 {
334 return setErrorInternal(aResultCode, getStaticClassIID(), getStaticComponentName(), aText, false, true);
335 }
336
337 HRESULT i_registerMachine(Machine *aMachine);
338 HRESULT i_registerDHCPServer(DHCPServer *aDHCPServer,
339 bool aSaveRegistry = true);
340 HRESULT i_unregisterDHCPServer(DHCPServer *aDHCPServer);
341 HRESULT i_registerNATNetwork(NATNetwork *aNATNetwork,
342 bool aSaveRegistry = true);
343 HRESULT i_unregisterNATNetwork(NATNetwork *aNATNetwork,
344 bool aSaveRegistry = true);
345 HRESULT i_checkMediaForConflicts(const Guid &aId,
346 const Utf8Str &aLocation,
347 Utf8Str &aConflictType,
348 ComObjPtr<Medium> *pDupMedium);
349 int i_decryptSettings();
350 int i_decryptMediumSettings(Medium *pMedium);
351 int i_decryptSettingBytes(uint8_t *aPlaintext,
352 const uint8_t *aCiphertext,
353 size_t aCiphertextSize) const;
354 int i_encryptSettingBytes(const uint8_t *aPlaintext,
355 uint8_t *aCiphertext,
356 size_t aPlaintextSize,
357 size_t aCiphertextSize) const;
358
359 struct Data; // opaque data structure, defined in VirtualBoxImpl.cpp
360
361 Data *m;
362
363 /* static variables (defined in VirtualBoxImpl.cpp) */
364 static com::Utf8Str sVersion;
365 static com::Utf8Str sVersionNormalized;
366 static ULONG sRevision;
367 static com::Utf8Str sPackageType;
368 static com::Utf8Str sAPIVersion;
369 static std::map<com::Utf8Str, int> sNatNetworkNameToRefCount;
370 static RWLockHandle* spMtxNatNetworkNameToRefCountLock;
371
372 static DECLCALLBACK(int) AsyncEventHandler(RTTHREAD thread, void *pvUser);
373
374#ifdef RT_OS_WINDOWS
375 static DECLCALLBACK(int) SVCHelperClientThread(RTTHREAD aThread, void *aUser);
376#endif
377};
378
379////////////////////////////////////////////////////////////////////////////////
380
381#endif // !____H_VIRTUALBOXIMPL
382
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