VirtualBox

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

Last change on this file since 27730 was 27730, checked in by vboxsync, 15 years ago

Backed out 59261 & 59266

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.2 KB
Line 
1/* $Id: VirtualBoxImpl.h 27730 2010-03-26 11:13:56Z vboxsync $ */
2
3/** @file
4 *
5 * VirtualBox COM class implementation
6 */
7
8/*
9 * Copyright (C) 2006-2009 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#ifndef ____H_VIRTUALBOXIMPL
25#define ____H_VIRTUALBOXIMPL
26
27#include "VirtualBoxBase.h"
28
29#ifdef RT_OS_WINDOWS
30# include "win/resource.h"
31#endif
32
33namespace com
34{
35 class Event;
36 class EventQueue;
37}
38
39class SessionMachine;
40class GuestOSType;
41class SharedFolder;
42class Progress;
43class Host;
44class SystemProperties;
45class DHCPServer;
46class PerformanceCollector;
47
48#ifdef RT_OS_WINDOWS
49class SVCHlpClient;
50#endif
51
52struct VMClientWatcherData;
53
54namespace settings
55{
56 class MainConfigFile;
57}
58
59class ATL_NO_VTABLE VirtualBox :
60 public VirtualBoxBase,
61 public VirtualBoxSupportErrorInfoImpl<VirtualBox, IVirtualBox>,
62 public VirtualBoxSupportTranslation<VirtualBox>,
63 VBOX_SCRIPTABLE_IMPL(IVirtualBox)
64#ifdef RT_OS_WINDOWS
65 , public CComCoClass<VirtualBox, &CLSID_VirtualBox>
66#endif
67{
68
69public:
70
71 typedef std::list< ComPtr<IVirtualBoxCallback> > CallbackList;
72 typedef std::list< ComObjPtr<SessionMachine> > SessionMachineList;
73 typedef std::list< ComPtr<IInternalSessionControl> > InternalControlList;
74
75 class CallbackEvent;
76 friend class CallbackEvent;
77
78 VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(VirtualBox)
79
80 DECLARE_CLASSFACTORY_SINGLETON(VirtualBox)
81
82 DECLARE_REGISTRY_RESOURCEID(IDR_VIRTUALBOX)
83 DECLARE_NOT_AGGREGATABLE(VirtualBox)
84
85 DECLARE_PROTECT_FINAL_CONSTRUCT()
86
87 BEGIN_COM_MAP(VirtualBox)
88 COM_INTERFACE_ENTRY(IDispatch)
89 COM_INTERFACE_ENTRY(ISupportErrorInfo)
90 COM_INTERFACE_ENTRY(IVirtualBox)
91 END_COM_MAP()
92
93 // to postpone generation of the default ctor/dtor
94 VirtualBox();
95 ~VirtualBox();
96
97 HRESULT FinalConstruct();
98 void FinalRelease();
99
100 /* public initializer/uninitializer for internal purposes only */
101 HRESULT init();
102 HRESULT initMachines();
103 HRESULT initMedia();
104 void uninit();
105
106 /* IVirtualBox properties */
107 STDMETHOD(COMGETTER(Version)) (BSTR *aVersion);
108 STDMETHOD(COMGETTER(Revision)) (ULONG *aRevision);
109 STDMETHOD(COMGETTER(PackageType)) (BSTR *aPackageType);
110 STDMETHOD(COMGETTER(HomeFolder)) (BSTR *aHomeFolder);
111 STDMETHOD(COMGETTER(SettingsFilePath)) (BSTR *aSettingsFilePath);
112 STDMETHOD(COMGETTER(Host)) (IHost **aHost);
113 STDMETHOD(COMGETTER(SystemProperties)) (ISystemProperties **aSystemProperties);
114 STDMETHOD(COMGETTER(Machines)) (ComSafeArrayOut (IMachine *, aMachines));
115 STDMETHOD(COMGETTER(HardDisks)) (ComSafeArrayOut (IMedium *, aHardDisks));
116 STDMETHOD(COMGETTER(DVDImages)) (ComSafeArrayOut (IMedium *, aDVDImages));
117 STDMETHOD(COMGETTER(FloppyImages)) (ComSafeArrayOut (IMedium *, aFloppyImages));
118 STDMETHOD(COMGETTER(ProgressOperations)) (ComSafeArrayOut (IProgress *, aOperations));
119 STDMETHOD(COMGETTER(GuestOSTypes)) (ComSafeArrayOut (IGuestOSType *, aGuestOSTypes));
120 STDMETHOD(COMGETTER(SharedFolders)) (ComSafeArrayOut (ISharedFolder *, aSharedFolders));
121 STDMETHOD(COMGETTER(PerformanceCollector)) (IPerformanceCollector **aPerformanceCollector);
122 STDMETHOD(COMGETTER(DHCPServers)) (ComSafeArrayOut (IDHCPServer *, aDHCPServers));
123
124 /* IVirtualBox methods */
125
126 STDMETHOD(CreateMachine) (IN_BSTR aName, IN_BSTR aOsTypeId, IN_BSTR aBaseFolder,
127 IN_BSTR aId, IMachine **aMachine);
128 STDMETHOD(CreateLegacyMachine) (IN_BSTR aName, IN_BSTR aOsTypeId, IN_BSTR aSettingsFile,
129 IN_BSTR aId, IMachine **aMachine);
130 STDMETHOD(OpenMachine) (IN_BSTR aSettingsFile, IMachine **aMachine);
131 STDMETHOD(RegisterMachine) (IMachine *aMachine);
132 STDMETHOD(GetMachine) (IN_BSTR aId, IMachine **aMachine);
133 STDMETHOD(FindMachine) (IN_BSTR aName, IMachine **aMachine);
134 STDMETHOD(UnregisterMachine) (IN_BSTR aId, IMachine **aMachine);
135 STDMETHOD(CreateAppliance) (IAppliance **anAppliance);
136
137 STDMETHOD(CreateHardDisk)(IN_BSTR aFormat, IN_BSTR aLocation,
138 IMedium **aHardDisk);
139 STDMETHOD(OpenHardDisk) (IN_BSTR aLocation, AccessMode_T accessMode,
140 BOOL aSetImageId, IN_BSTR aImageId,
141 BOOL aSetParentId, IN_BSTR aParentId,
142 IMedium **aHardDisk);
143 STDMETHOD(GetHardDisk) (IN_BSTR aId, IMedium **aHardDisk);
144 STDMETHOD(FindHardDisk) (IN_BSTR aLocation, IMedium **aHardDisk);
145
146 STDMETHOD(OpenDVDImage) (IN_BSTR aLocation, IN_BSTR aId,
147 IMedium **aDVDImage);
148 STDMETHOD(GetDVDImage) (IN_BSTR aId, IMedium **aDVDImage);
149 STDMETHOD(FindDVDImage) (IN_BSTR aLocation, IMedium **aDVDImage);
150
151 STDMETHOD(OpenFloppyImage) (IN_BSTR aLocation, IN_BSTR aId,
152 IMedium **aFloppyImage);
153 STDMETHOD(GetFloppyImage) (IN_BSTR aId, IMedium **aFloppyImage);
154 STDMETHOD(FindFloppyImage) (IN_BSTR aLocation, IMedium **aFloppyImage);
155
156 STDMETHOD(GetGuestOSType) (IN_BSTR aId, IGuestOSType **aType);
157 STDMETHOD(CreateSharedFolder) (IN_BSTR aName, IN_BSTR aHostPath, BOOL aWritable);
158 STDMETHOD(RemoveSharedFolder) (IN_BSTR aName);
159 STDMETHOD(GetExtraDataKeys) (ComSafeArrayOut(BSTR, aKeys));
160 STDMETHOD(GetExtraData) (IN_BSTR aKey, BSTR *aValue);
161 STDMETHOD(SetExtraData) (IN_BSTR aKey, IN_BSTR aValue);
162 STDMETHOD(OpenSession) (ISession *aSession, IN_BSTR aMachineId);
163 STDMETHOD(OpenRemoteSession) (ISession *aSession, IN_BSTR aMachineId,
164 IN_BSTR aType, IN_BSTR aEnvironment,
165 IProgress **aProgress);
166 STDMETHOD(OpenExistingSession) (ISession *aSession, IN_BSTR aMachineId);
167
168 STDMETHOD(RegisterCallback) (IVirtualBoxCallback *aCallback);
169 STDMETHOD(UnregisterCallback) (IVirtualBoxCallback *aCallback);
170
171 STDMETHOD(WaitForPropertyChange) (IN_BSTR aWhat, ULONG aTimeout,
172 BSTR *aChanged, BSTR *aValues);
173
174 STDMETHOD(CreateDHCPServer) (IN_BSTR aName, IDHCPServer ** aServer);
175 STDMETHOD(FindDHCPServerByNetworkName) (IN_BSTR aName, IDHCPServer ** aServer);
176 STDMETHOD(RemoveDHCPServer) (IDHCPServer * aServer);
177 STDMETHOD(CheckFirmwarePresent)(FirmwareType_T aFirmwareType, IN_BSTR aVersion,
178 BSTR * aUrl, BSTR * aFile, BOOL * aResult);
179
180 /* public methods only for internal purposes */
181
182 /**
183 * Simple run-time type identification without having to enable C++ RTTI.
184 * The class IDs are defined in VirtualBoxBase.h.
185 * @return
186 */
187 virtual VBoxClsID getClassID() const
188 {
189 return clsidVirtualBox;
190 }
191
192 /**
193 * Override of the default locking class to be used for validating lock
194 * order with the standard member lock handle.
195 */
196 virtual VBoxLockingClass getLockingClass() const
197 {
198 return LOCKCLASS_VIRTUALBOXOBJECT;
199 }
200
201#ifdef DEBUG
202 void dumpAllBackRefs();
203#endif
204
205 HRESULT postEvent(Event *event);
206
207 HRESULT addProgress(IProgress *aProgress);
208 HRESULT removeProgress(IN_GUID aId);
209
210#ifdef RT_OS_WINDOWS
211 typedef DECLCALLBACKPTR (HRESULT, SVCHelperClientFunc)
212 (SVCHlpClient *aClient, Progress *aProgress, void *aUser, int *aVrc);
213 HRESULT startSVCHelperClient(bool aPrivileged,
214 SVCHelperClientFunc aFunc,
215 void *aUser, Progress *aProgress);
216#endif
217
218 void addProcessToReap (RTPROCESS pid);
219 void updateClientWatcher();
220
221 void onMachineStateChange(const Guid &aId, MachineState_T aState);
222 void onMachineDataChange(const Guid &aId);
223 BOOL onExtraDataCanChange(const Guid &aId, IN_BSTR aKey, IN_BSTR aValue,
224 Bstr &aError);
225 void onExtraDataChange(const Guid &aId, IN_BSTR aKey, IN_BSTR aValue);
226 void onMachineRegistered(const Guid &aId, BOOL aRegistered);
227 void onSessionStateChange(const Guid &aId, SessionState_T aState);
228
229 void onSnapshotTaken(const Guid &aMachineId, const Guid &aSnapshotId);
230 void onSnapshotDeleted(const Guid &aMachineId, const Guid &aSnapshotId);
231 void onSnapshotChange(const Guid &aMachineId, const Guid &aSnapshotId);
232 void onGuestPropertyChange(const Guid &aMachineId, IN_BSTR aName, IN_BSTR aValue,
233 IN_BSTR aFlags);
234
235 ComObjPtr<GuestOSType> getUnknownOSType();
236
237 void getOpenedMachines(SessionMachineList &aMachines,
238 InternalControlList *aControls = NULL);
239
240 bool isMachineIdValid(const Guid &aId)
241 {
242 return SUCCEEDED(findMachine(aId, false /* aSetError */, NULL));
243 }
244
245 HRESULT findMachine (const Guid &aId, bool aSetError,
246 ComObjPtr<Machine> *machine = NULL);
247
248 HRESULT findHardDisk(const Guid *aId, CBSTR aLocation,
249 bool aSetError, ComObjPtr<Medium> *aHardDisk = NULL);
250 HRESULT findDVDImage(const Guid *aId, CBSTR aLocation,
251 bool aSetError, ComObjPtr<Medium> *aImage = NULL);
252 HRESULT findFloppyImage(const Guid *aId, CBSTR aLocation,
253 bool aSetError, ComObjPtr<Medium> *aImage = NULL);
254
255 HRESULT findGuestOSType(const Bstr &bstrOSType,
256 GuestOSType*& pGuestOSType);
257
258 const ComObjPtr<Host>& host() const;
259 const ComObjPtr<SystemProperties>& systemProperties() const;
260#ifdef VBOX_WITH_RESOURCE_USAGE_API
261 const ComObjPtr<PerformanceCollector>& performanceCollector() const;
262#endif /* VBOX_WITH_RESOURCE_USAGE_API */
263
264 const Utf8Str& getDefaultMachineFolder() const;
265 const Utf8Str& getDefaultHardDiskFolder() const;
266 const Utf8Str& getDefaultHardDiskFormat() const;
267
268 /** Returns the VirtualBox home directory */
269 const Utf8Str& homeDir() const;
270
271 int calculateFullPath(const Utf8Str &strPath, Utf8Str &aResult);
272 void calculateRelativePath(const Utf8Str &strPath, Utf8Str &aResult);
273
274 HRESULT registerHardDisk(Medium *aHardDisk, bool *pfNeedsSaveSettings);
275 HRESULT unregisterHardDisk(Medium *aHardDisk, bool *pfNeedsSaveSettings);
276
277 HRESULT registerImage(Medium *aImage, DeviceType_T argType, bool *pfNeedsSaveSettings);
278 HRESULT unregisterImage(Medium *aImage, DeviceType_T argType, bool *pfNeedsSaveSettings);
279
280 void rememberMachineNameChangeForMedia(const Utf8Str &strOldConfigDir,
281 const Utf8Str &strNewConfigDir);
282
283 HRESULT saveSettings();
284
285 static HRESULT ensureFilePathExists(const Utf8Str &strFileName);
286
287 static HRESULT handleUnexpectedExceptions (RT_SRC_POS_DECL);
288
289 const Utf8Str& settingsFilePath();
290
291 RWLockHandle& getMediaTreeLockHandle();
292
293 /* for VirtualBoxSupportErrorInfoImpl */
294 static const wchar_t *getComponentName() { return L"VirtualBox"; }
295
296private:
297
298 HRESULT checkMediaForConflicts2(const Guid &aId, const Utf8Str &aLocation,
299 Utf8Str &aConflictType);
300
301 HRESULT registerMachine (Machine *aMachine);
302
303 HRESULT registerDHCPServer(DHCPServer *aDHCPServer,
304 bool aSaveRegistry = true);
305 HRESULT unregisterDHCPServer(DHCPServer *aDHCPServer,
306 bool aSaveRegistry = true);
307
308 struct Data; // opaque data structure, defined in VirtualBoxImpl.cpp
309 Data *m;
310
311 /* static variables (defined in VirtualBoxImpl.cpp) */
312 static Bstr sVersion;
313 static ULONG sRevision;
314 static Bstr sPackageType;
315
316 static DECLCALLBACK(int) ClientWatcher (RTTHREAD thread, void *pvUser);
317 static DECLCALLBACK(int) AsyncEventHandler (RTTHREAD thread, void *pvUser);
318
319#ifdef RT_OS_WINDOWS
320 static DECLCALLBACK(int) SVCHelperClientThread (RTTHREAD aThread, void *aUser);
321#endif
322};
323
324////////////////////////////////////////////////////////////////////////////////
325
326#endif // ____H_VIRTUALBOXIMPL
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