VirtualBox

source: vbox/trunk/src/VBox/Main/include/ProgressImpl.h@ 14949

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

Appended vim modeline to set tabstop and expand tabs (in the way
suggested by our coding guidelines).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 11.8 KB
Line 
1/* $Id: ProgressImpl.h 14949 2008-12-03 15:17:16Z vboxsync $ */
2/** @file
3 *
4 * VirtualBox COM class implementation
5 */
6
7/*
8 * Copyright (C) 2006-2008 Sun Microsystems, Inc.
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
19 * Clara, CA 95054 USA or visit http://www.sun.com if you need
20 * additional information or have any questions.
21 */
22
23#ifndef ____H_PROGRESSIMPL
24#define ____H_PROGRESSIMPL
25
26#include "VirtualBoxBase.h"
27#include "Collection.h"
28
29#include <VBox/com/SupportErrorInfo.h>
30
31#include <iprt/semaphore.h>
32
33#include <vector>
34
35class VirtualBox;
36
37////////////////////////////////////////////////////////////////////////////////
38
39/**
40 * Base component class for progress objects.
41 */
42class ATL_NO_VTABLE ProgressBase :
43 public VirtualBoxBaseNEXT,
44 public com::SupportErrorInfoBase,
45 public VirtualBoxSupportTranslation <ProgressBase>,
46 public IProgress
47{
48protected:
49
50 VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT (ProgressBase)
51
52 DECLARE_EMPTY_CTOR_DTOR (ProgressBase)
53
54 HRESULT FinalConstruct();
55
56 // protected initializer/uninitializer for internal purposes only
57 HRESULT protectedInit (AutoInitSpan &aAutoInitSpan,
58#if !defined (VBOX_COM_INPROC)
59 VirtualBox *aParent,
60#endif
61 IUnknown *aInitiator,
62 const BSTR aDescription, GUIDPARAMOUT aId = NULL);
63 HRESULT protectedInit (AutoInitSpan &aAutoInitSpan);
64 void protectedUninit (AutoUninitSpan &aAutoUninitSpan);
65
66public:
67
68 // IProgress properties
69 STDMETHOD(COMGETTER(Id)) (GUIDPARAMOUT aId);
70 STDMETHOD(COMGETTER(Description)) (BSTR *aDescription);
71 STDMETHOD(COMGETTER(Initiator)) (IUnknown **aInitiator);
72
73 // IProgress properties
74 STDMETHOD(COMGETTER(Cancelable)) (BOOL *aCancelable);
75 STDMETHOD(COMGETTER(Percent)) (LONG *aPercent);
76 STDMETHOD(COMGETTER(Completed)) (BOOL *aCompleted);
77 STDMETHOD(COMGETTER(Canceled)) (BOOL *aCanceled);
78 STDMETHOD(COMGETTER(ResultCode)) (HRESULT *aResultCode);
79 STDMETHOD(COMGETTER(ErrorInfo)) (IVirtualBoxErrorInfo **aErrorInfo);
80 STDMETHOD(COMGETTER(OperationCount)) (ULONG *aOperationCount);
81 STDMETHOD(COMGETTER(Operation)) (ULONG *aCount);
82 STDMETHOD(COMGETTER(OperationDescription)) (BSTR *aOperationDescription);
83 STDMETHOD(COMGETTER(OperationPercent)) (LONG *aOperationPercent);
84
85 // public methods only for internal purposes
86
87 static HRESULT setErrorInfoOnThread (IProgress *aProgress);
88
89 // unsafe inline public methods for internal purposes only (ensure there is
90 // a caller and a read lock before calling them!)
91
92 BOOL completed() const { return mCompleted; }
93 HRESULT resultCode() const { return mResultCode; }
94
95protected:
96
97#if !defined (VBOX_COM_INPROC)
98 /** Weak parent. */
99 const ComObjPtr <VirtualBox, ComWeakRef> mParent;
100#endif
101
102 const ComPtr <IUnknown> mInitiator;
103
104 const Guid mId;
105 const Bstr mDescription;
106
107 /* The fields below are to be properly initalized by subclasses */
108
109 BOOL mCompleted;
110 BOOL mCancelable;
111 BOOL mCanceled;
112 HRESULT mResultCode;
113 ComPtr <IVirtualBoxErrorInfo> mErrorInfo;
114
115 ULONG mOperationCount;
116 ULONG mOperation;
117 Bstr mOperationDescription;
118 LONG mOperationPercent;
119};
120
121////////////////////////////////////////////////////////////////////////////////
122
123/**
124 * Normal progress object.
125 */
126class ATL_NO_VTABLE Progress :
127 public com::SupportErrorInfoDerived <ProgressBase, Progress, IProgress>,
128 public VirtualBoxSupportTranslation <Progress>
129{
130
131public:
132
133 VIRTUALBOXSUPPORTTRANSLATION_OVERRIDE (Progress)
134
135 DECLARE_NOT_AGGREGATABLE (Progress)
136
137 DECLARE_PROTECT_FINAL_CONSTRUCT()
138
139 BEGIN_COM_MAP (Progress)
140 COM_INTERFACE_ENTRY (ISupportErrorInfo)
141 COM_INTERFACE_ENTRY (IProgress)
142 END_COM_MAP()
143
144 NS_DECL_ISUPPORTS
145
146 HRESULT FinalConstruct();
147 void FinalRelease();
148
149 // public initializer/uninitializer for internal purposes only
150
151 HRESULT init (
152#if !defined (VBOX_COM_INPROC)
153 VirtualBox *aParent,
154#endif
155 IUnknown *aInitiator,
156 const BSTR aDescription, BOOL aCancelable,
157 GUIDPARAMOUT aId = NULL)
158 {
159 return init (
160#if !defined (VBOX_COM_INPROC)
161 aParent,
162#endif
163 aInitiator, aDescription, aCancelable, 1, aDescription, aId);
164 }
165
166 HRESULT init (
167#if !defined (VBOX_COM_INPROC)
168 VirtualBox *aParent,
169#endif
170 IUnknown *aInitiator,
171 const BSTR aDescription, BOOL aCancelable,
172 ULONG aOperationCount, const BSTR aOperationDescription,
173 GUIDPARAMOUT aId = NULL);
174
175 HRESULT init (BOOL aCancelable, ULONG aOperationCount,
176 const BSTR aOperationDescription);
177
178 void uninit();
179
180 // IProgress methods
181 STDMETHOD(WaitForCompletion) (LONG aTimeout);
182 STDMETHOD(WaitForOperationCompletion) (ULONG aOperation, LONG aTimeout);
183 STDMETHOD(Cancel)();
184
185 // public methods only for internal purposes
186
187 HRESULT notifyProgress (LONG aPercent);
188 HRESULT advanceOperation (const BSTR aOperationDescription);
189
190 HRESULT notifyComplete (HRESULT aResultCode);
191 HRESULT notifyComplete (HRESULT aResultCode, const GUID &aIID,
192 const Bstr &aComponent,
193 const char *aText, ...);
194 HRESULT notifyCompleteBstr (HRESULT aResultCode, const GUID &aIID,
195 const Bstr &aComponent, const Bstr &aText);
196
197 /** For com::SupportErrorInfoImpl. */
198 static const char *ComponentName() { return "Progress"; }
199
200private:
201
202 RTSEMEVENTMULTI mCompletedSem;
203 ULONG mWaitersCount;
204};
205
206////////////////////////////////////////////////////////////////////////////////
207
208/**
209 * The CombinedProgress class allows to combine several progress objects to a
210 * single progress component. This single progress component will treat all
211 * operations of individual progress objects as a single sequence of operations
212 * that follow each other in the same order as progress objects are passed to
213 * the #init() method.
214 *
215 * Individual progress objects are sequentially combined so that this progress
216 * object:
217 *
218 * - is cancelable only if all progresses are cancelable.
219 * - is canceled once a progress that follows next to successfully completed
220 * ones reports it was canceled.
221 * - is completed successfully only after all progresses are completed
222 * successfully.
223 * - is completed unsuccessfully once a progress that follows next to
224 * successfully completed ones reports it was completed unsuccessfully;
225 * the result code and error info of the unsuccessful progress
226 * will be reported as the result code and error info of this progress.
227 * - returns N as the operation number, where N equals to the number of
228 * operations in all successfully completed progresses starting from the
229 * first one plus the operation number of the next (not yet complete)
230 * progress; the operation description of the latter one is reported as
231 * the operation description of this progress object.
232 * - returns P as the percent value, where P equals to the sum of percents
233 * of all successfully completed progresses starting from the
234 * first one plus the percent value of the next (not yet complete)
235 * progress, normalized to 100%.
236 *
237 * @note It's the respoisibility of the combined progress object creator to
238 * complete individual progresses in the right order: if, let's say, the
239 * last progress is completed before all previous ones,
240 * #WaitForCompletion(-1) will most likely give 100% CPU load because it
241 * will be in a loop calling a method that returns immediately.
242 */
243class ATL_NO_VTABLE CombinedProgress :
244 public com::SupportErrorInfoDerived <ProgressBase, CombinedProgress, IProgress>,
245 public VirtualBoxSupportTranslation <CombinedProgress>
246{
247
248public:
249
250 VIRTUALBOXSUPPORTTRANSLATION_OVERRIDE (CombinedProgress)
251
252 DECLARE_NOT_AGGREGATABLE (CombinedProgress)
253
254 DECLARE_PROTECT_FINAL_CONSTRUCT()
255
256 BEGIN_COM_MAP (CombinedProgress)
257 COM_INTERFACE_ENTRY (ISupportErrorInfo)
258 COM_INTERFACE_ENTRY (IProgress)
259 END_COM_MAP()
260
261 NS_DECL_ISUPPORTS
262
263 HRESULT FinalConstruct();
264 void FinalRelease();
265
266 // public initializer/uninitializer for internal purposes only
267
268 HRESULT init (
269#if !defined (VBOX_COM_INPROC)
270 VirtualBox *aParent,
271#endif
272 IUnknown *aInitiator,
273 const BSTR aDescription,
274 IProgress *aProgress1, IProgress *aProgress2,
275 GUIDPARAMOUT aId = NULL);
276
277 /**
278 * Initializes the combined progress object given the first and the last
279 * normal progress object from the list.
280 *
281 * @param aParent See ProgressBase::init().
282 * @param aInitiator See ProgressBase::init().
283 * @param aDescription See ProgressBase::init().
284 * @param aFirstProgress Iterator of the first normal progress object.
285 * @param aSecondProgress Iterator of the last normal progress object.
286 * @param aId See ProgressBase::init().
287 */
288 template <typename InputIterator>
289 HRESULT init (
290#if !defined (VBOX_COM_INPROC)
291 VirtualBox *aParent,
292#endif
293 IUnknown *aInitiator,
294 const BSTR aDescription,
295 InputIterator aFirstProgress, InputIterator aLastProgress,
296 GUIDPARAMOUT aId = NULL)
297 {
298 /* Enclose the state transition NotReady->InInit->Ready */
299 AutoInitSpan autoInitSpan (this);
300 AssertReturn (autoInitSpan.isOk(), E_FAIL);
301
302 mProgresses = ProgressVector (aFirstProgress, aLastProgress);
303
304 HRESULT rc = protectedInit (autoInitSpan,
305#if !defined (VBOX_COM_INPROC)
306 aParent,
307#endif
308 aInitiator, aDescription, aId);
309
310 /* Confirm a successful initialization when it's the case */
311 if (SUCCEEDED (rc))
312 autoInitSpan.setSucceeded();
313
314 return rc;
315 }
316
317protected:
318
319 HRESULT protectedInit (AutoInitSpan &aAutoInitSpan,
320#if !defined (VBOX_COM_INPROC)
321 VirtualBox *aParent,
322#endif
323 IUnknown *aInitiator,
324 const BSTR aDescription, GUIDPARAMOUT aId);
325
326public:
327
328 void uninit();
329
330 // IProgress properties
331 STDMETHOD(COMGETTER(Percent)) (LONG *aPercent);
332 STDMETHOD(COMGETTER(Completed)) (BOOL *aCompleted);
333 STDMETHOD(COMGETTER(Canceled)) (BOOL *aCanceled);
334 STDMETHOD(COMGETTER(ResultCode)) (HRESULT *aResultCode);
335 STDMETHOD(COMGETTER(ErrorInfo)) (IVirtualBoxErrorInfo **aErrorInfo);
336 STDMETHOD(COMGETTER(Operation)) (ULONG *aCount);
337 STDMETHOD(COMGETTER(OperationDescription)) (BSTR *aOperationDescription);
338 STDMETHOD(COMGETTER(OperationPercent)) (LONG *aOperationPercent);
339
340 // IProgress methods
341 STDMETHOD(WaitForCompletion) (LONG aTimeout);
342 STDMETHOD(WaitForOperationCompletion) (ULONG aOperation, LONG aTimeout);
343 STDMETHOD(Cancel)();
344
345 // public methods only for internal purposes
346
347 /** For com::SupportErrorInfoImpl. */
348 static const char *ComponentName() { return "CombinedProgress"; }
349
350private:
351
352 HRESULT checkProgress();
353
354 typedef std::vector <ComPtr <IProgress> > ProgressVector;
355 ProgressVector mProgresses;
356
357 size_t mProgress;
358 ULONG mCompletedOperations;
359};
360
361COM_DECL_READONLY_ENUM_AND_COLLECTION_AS (Progress, IProgress)
362
363#endif /* ____H_PROGRESSIMPL */
364/* vi: set tabstop=4 shiftwidth=4 expandtab: */
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette