VirtualBox

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

Last change on this file since 40532 was 37069, checked in by vboxsync, 14 years ago

Main: add waitForAsyncProgressCompletion to IProgress

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1/* $Id: ProgressImpl.h 37069 2011-05-13 12:41:38Z vboxsync $ */
2/** @file
3 *
4 * VirtualBox COM class implementation
5 */
6
7/*
8 * Copyright (C) 2006-2010 Oracle Corporation
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
19#ifndef ____H_PROGRESSIMPL
20#define ____H_PROGRESSIMPL
21
22#include "VirtualBoxBase.h"
23
24#include <iprt/semaphore.h>
25
26////////////////////////////////////////////////////////////////////////////////
27
28/**
29 * Base component class for progress objects.
30 */
31class ATL_NO_VTABLE ProgressBase :
32 public VirtualBoxBase,
33 VBOX_SCRIPTABLE_IMPL(IProgress)
34{
35protected:
36
37// VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(ProgressBase, IProgress)
38// cannot be added here or Windows will not buuld; as a result, ProgressBase cannot be
39// instantiated, but we're not doing that anyway (but only its children)
40
41 DECLARE_EMPTY_CTOR_DTOR (ProgressBase)
42
43 HRESULT FinalConstruct();
44
45 // protected initializer/uninitializer for internal purposes only
46 HRESULT protectedInit(AutoInitSpan &aAutoInitSpan,
47#if !defined (VBOX_COM_INPROC)
48 VirtualBox *aParent,
49#endif
50 IUnknown *aInitiator,
51 CBSTR aDescription, OUT_GUID aId = NULL);
52 HRESULT protectedInit(AutoInitSpan &aAutoInitSpan);
53 void protectedUninit(AutoUninitSpan &aAutoUninitSpan);
54
55public:
56
57 // IProgress properties
58 STDMETHOD(COMGETTER(Id)) (BSTR *aId);
59 STDMETHOD(COMGETTER(Description)) (BSTR *aDescription);
60 STDMETHOD(COMGETTER(Initiator)) (IUnknown **aInitiator);
61
62 // IProgress properties
63 STDMETHOD(COMGETTER(Cancelable)) (BOOL *aCancelable);
64 STDMETHOD(COMGETTER(Percent)) (ULONG *aPercent);
65 STDMETHOD(COMGETTER(TimeRemaining)) (LONG *aTimeRemaining);
66 STDMETHOD(COMGETTER(Completed)) (BOOL *aCompleted);
67 STDMETHOD(COMGETTER(Canceled)) (BOOL *aCanceled);
68 STDMETHOD(COMGETTER(ResultCode)) (LONG *aResultCode);
69 STDMETHOD(COMGETTER(ErrorInfo)) (IVirtualBoxErrorInfo **aErrorInfo);
70 STDMETHOD(COMGETTER(OperationCount)) (ULONG *aOperationCount);
71 STDMETHOD(COMGETTER(Operation)) (ULONG *aOperation);
72 STDMETHOD(COMGETTER(OperationDescription)) (BSTR *aOperationDescription);
73 STDMETHOD(COMGETTER(OperationPercent)) (ULONG *aOperationPercent);
74 STDMETHOD(COMGETTER(OperationWeight)) (ULONG *aOperationWeight);
75 STDMETHOD(COMSETTER(Timeout)) (ULONG aTimeout);
76 STDMETHOD(COMGETTER(Timeout)) (ULONG *aTimeout);
77
78 // public methods only for internal purposes
79
80 bool setCancelCallback(void (*pfnCallback)(void *), void *pvUser);
81
82
83 // unsafe inline public methods for internal purposes only (ensure there is
84 // a caller and a read lock before calling them!)
85
86 BOOL getCompleted() const { return mCompleted; }
87 HRESULT getResultCode() const { return mResultCode; }
88 double calcTotalPercent();
89
90protected:
91 void checkForAutomaticTimeout(void);
92
93#if !defined (VBOX_COM_INPROC)
94 /** Weak parent. */
95 VirtualBox * const mParent;
96#endif
97
98 const ComPtr<IUnknown> mInitiator;
99
100 const Guid mId;
101 const Bstr mDescription;
102
103 uint64_t m_ullTimestamp; // progress object creation timestamp, for ETA computation
104
105 void (*m_pfnCancelCallback)(void *);
106 void *m_pvCancelUserArg;
107
108 /* The fields below are to be properly initialized by subclasses */
109
110 BOOL mCompleted;
111 BOOL mCancelable;
112 BOOL mCanceled;
113 HRESULT mResultCode;
114 ComPtr<IVirtualBoxErrorInfo> mErrorInfo;
115
116 ULONG m_cOperations; // number of operations (so that progress dialog can display something like 1/3)
117 ULONG m_ulTotalOperationsWeight; // sum of weights of all operations, given to constructor
118
119 ULONG m_ulOperationsCompletedWeight; // summed-up weight of operations that have been completed; initially 0
120
121 ULONG m_ulCurrentOperation; // operations counter, incremented with each setNextOperation()
122 Bstr m_bstrOperationDescription; // name of current operation; initially from constructor, changed with setNextOperation()
123 ULONG m_ulCurrentOperationWeight; // weight of current operation, given to setNextOperation()
124 ULONG m_ulOperationPercent; // percentage of current operation, set with setCurrentOperationProgress()
125 ULONG m_cMsTimeout; /**< Automatic timeout value. 0 means none. */
126};
127
128////////////////////////////////////////////////////////////////////////////////
129
130/**
131 * Normal progress object.
132 */
133class ATL_NO_VTABLE Progress :
134 public ProgressBase
135{
136
137public:
138 VIRTUALBOXBASE_ADD_ERRORINFO_SUPPORT(Progress, IProgress)
139
140 DECLARE_NOT_AGGREGATABLE (Progress)
141
142 DECLARE_PROTECT_FINAL_CONSTRUCT()
143
144 BEGIN_COM_MAP (Progress)
145 VBOX_DEFAULT_INTERFACE_ENTRIES (IProgress)
146 END_COM_MAP()
147
148 HRESULT FinalConstruct();
149 void FinalRelease();
150
151 // public initializer/uninitializer for internal purposes only
152
153 /**
154 * Simplified constructor for progress objects that have only one
155 * operation as a task.
156 * @param aParent
157 * @param aInitiator
158 * @param aDescription
159 * @param aCancelable
160 * @param aId
161 * @return
162 */
163 HRESULT init(
164#if !defined (VBOX_COM_INPROC)
165 VirtualBox *aParent,
166#endif
167 IUnknown *aInitiator,
168 CBSTR aDescription,
169 BOOL aCancelable,
170 OUT_GUID aId = NULL)
171 {
172 return init(
173#if !defined (VBOX_COM_INPROC)
174 aParent,
175#endif
176 aInitiator,
177 aDescription,
178 aCancelable,
179 1, // cOperations
180 1, // ulTotalOperationsWeight
181 aDescription, // bstrFirstOperationDescription
182 1, // ulFirstOperationWeight
183 aId);
184 }
185
186 /**
187 * Not quite so simplified constructor for progress objects that have
188 * more than one operation, but all sub-operations are weighed the same.
189 * @param aParent
190 * @param aInitiator
191 * @param aDescription
192 * @param aCancelable
193 * @param cOperations
194 * @param bstrFirstOperationDescription
195 * @param aId
196 * @return
197 */
198 HRESULT init(
199#if !defined (VBOX_COM_INPROC)
200 VirtualBox *aParent,
201#endif
202 IUnknown *aInitiator,
203 CBSTR aDescription, BOOL aCancelable,
204 ULONG cOperations,
205 CBSTR bstrFirstOperationDescription,
206 OUT_GUID aId = NULL)
207 {
208 return init(
209#if !defined (VBOX_COM_INPROC)
210 aParent,
211#endif
212 aInitiator,
213 aDescription,
214 aCancelable,
215 cOperations, // cOperations
216 cOperations, // ulTotalOperationsWeight = cOperations
217 bstrFirstOperationDescription, // bstrFirstOperationDescription
218 1, // ulFirstOperationWeight: weigh them all the same
219 aId);
220 }
221
222 HRESULT init(
223#if !defined (VBOX_COM_INPROC)
224 VirtualBox *aParent,
225#endif
226 IUnknown *aInitiator,
227 CBSTR aDescription,
228 BOOL aCancelable,
229 ULONG cOperations,
230 ULONG ulTotalOperationsWeight,
231 CBSTR bstrFirstOperationDescription,
232 ULONG ulFirstOperationWeight,
233 OUT_GUID aId = NULL);
234
235 HRESULT init(BOOL aCancelable,
236 ULONG aOperationCount,
237 CBSTR aOperationDescription);
238
239 void uninit();
240
241 // IProgress methods
242 STDMETHOD(WaitForCompletion)(LONG aTimeout);
243 STDMETHOD(WaitForOperationCompletion)(ULONG aOperation, LONG aTimeout);
244 STDMETHOD(WaitForAsyncProgressCompletion)(IProgress *pProgressAsync);
245 STDMETHOD(Cancel)();
246
247 STDMETHOD(SetCurrentOperationProgress)(ULONG aPercent);
248 STDMETHOD(SetNextOperation)(IN_BSTR bstrNextOperationDescription, ULONG ulNextOperationsWeight);
249
250 // public methods only for internal purposes
251
252 HRESULT setResultCode(HRESULT aResultCode);
253
254 HRESULT notifyComplete(HRESULT aResultCode);
255 HRESULT notifyComplete(HRESULT aResultCode,
256 const GUID &aIID,
257 const char *pcszComponent,
258 const char *aText,
259 ...);
260 HRESULT notifyCompleteV(HRESULT aResultCode,
261 const GUID &aIID,
262 const char *pcszComponent,
263 const char *aText,
264 va_list va);
265 bool notifyPointOfNoReturn(void);
266
267private:
268
269 RTSEMEVENTMULTI mCompletedSem;
270 ULONG mWaitersCount;
271};
272
273#endif /* ____H_PROGRESSIMPL */
274
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