ProgressImpl.h revision c89943130a51d8a0933626bc576ffe71823da7ee
2N/A/* $Id$ */
2N/A/** @file
2N/A *
2N/A * VirtualBox COM class implementation
2N/A */
2N/A
2N/A/*
2N/A * Copyright (C) 2006-2014 Oracle Corporation
2N/A *
2N/A * This file is part of VirtualBox Open Source Edition (OSE), as
2N/A * available from http://www.virtualbox.org. This file is free software;
2N/A * you can redistribute it and/or modify it under the terms of the GNU
2N/A * General Public License (GPL) as published by the Free Software
2N/A * Foundation, in version 2 as it comes in the "COPYING" file of the
2N/A * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2N/A * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2N/A */
2N/A
2N/A#ifndef ____H_PROGRESSIMPL
2N/A#define ____H_PROGRESSIMPL
2N/A
2N/A#include "ProgressWrap.h"
2N/A#include "VirtualBoxBase.h"
2N/A
2N/A#include <iprt/semaphore.h>
2N/A
2N/A////////////////////////////////////////////////////////////////////////////////
2N/A
2N/A/**
2N/A * Class for progress objects.
2N/A */
2N/Aclass ATL_NO_VTABLE Progress :
2N/A public ProgressWrap
2N/A{
2N/Aprotected:
2N/A
2N/A DECLARE_EMPTY_CTOR_DTOR (Progress)
2N/A
2N/A void i_checkForAutomaticTimeout(void);
2N/A
2N/A#if !defined (VBOX_COM_INPROC)
2N/A /** Weak parent. */
2N/A VirtualBox * const mParent;
2N/A#endif
2N/A
2N/A const ComPtr<IUnknown> mInitiator;
2N/A
2N/A const Guid mId;
2N/A const com::Utf8Str mDescription;
2N/A
2N/A uint64_t m_ullTimestamp; // progress object creation timestamp, for ETA computation
2N/A
2N/A void (*m_pfnCancelCallback)(void *);
2N/A void *m_pvCancelUserArg;
2N/A
2N/A /* The fields below are to be properly initialized by subclasses */
2N/A
2N/A BOOL mCompleted;
2N/A BOOL mCancelable;
2N/A BOOL mCanceled;
2N/A HRESULT mResultCode;
2N/A ComPtr<IVirtualBoxErrorInfo> mErrorInfo;
2N/A
2N/A ULONG m_cOperations; // number of operations (so that progress dialog can
2N/A // display something like 1/3)
2N/A ULONG m_ulTotalOperationsWeight; // sum of weights of all operations, given to constructor
ULONG m_ulOperationsCompletedWeight; // summed-up weight of operations that have been completed; initially 0
ULONG m_ulCurrentOperation; // operations counter, incremented with
// each setNextOperation()
com::Utf8Str m_operationDescription; // name of current operation; initially
// from constructor, changed with setNextOperation()
ULONG m_ulCurrentOperationWeight; // weight of current operation, given to setNextOperation()
ULONG m_ulOperationPercent; // percentage of current operation, set with setCurrentOperationProgress()
ULONG m_cMsTimeout; /**< Automatic timeout value. 0 means none. */
public:
DECLARE_NOT_AGGREGATABLE (Progress)
HRESULT FinalConstruct();
void FinalRelease();
// public initializer/uninitializer for internal purposes only
/**
* Simplified constructor for progress objects that have only one
* operation as a task.
* @param aParent
* @param aInitiator
* @param aDescription
* @param aCancelable
* @return
*/
HRESULT init(
#if !defined (VBOX_COM_INPROC)
VirtualBox *aParent,
#endif
IUnknown *aInitiator,
Utf8Str aDescription,
BOOL aCancelable)
{
return init(
#if !defined (VBOX_COM_INPROC)
aParent,
#endif
aInitiator,
aDescription,
aCancelable,
1, // cOperations
1, // ulTotalOperationsWeight
aDescription, // aFirstOperationDescription
1); // ulFirstOperationWeight
}
/**
* Not quite so simplified constructor for progress objects that have
* more than one operation, but all sub-operations are weighed the same.
* @param aParent
* @param aInitiator
* @param aDescription
* @param aCancelable
* @param cOperations
* @param bstrFirstOperationDescription
* @return
*/
HRESULT init(
#if !defined (VBOX_COM_INPROC)
VirtualBox *aParent,
#endif
IUnknown *aInitiator,
Utf8Str aDescription, BOOL aCancelable,
ULONG cOperations,
Utf8Str aFirstOperationDescription)
{
return init(
#if !defined (VBOX_COM_INPROC)
aParent,
#endif
aInitiator,
aDescription,
aCancelable,
cOperations, // cOperations
cOperations, // ulTotalOperationsWeight = cOperations
aFirstOperationDescription, // aFirstOperationDescription
1); // ulFirstOperationWeight: weigh them all the same
}
HRESULT init(
#if !defined (VBOX_COM_INPROC)
VirtualBox *aParent,
#endif
IUnknown *aInitiator,
Utf8Str aDescription,
BOOL aCancelable,
ULONG cOperations,
ULONG ulTotalOperationsWeight,
Utf8Str aFirstOperationDescription,
ULONG ulFirstOperationWeight);
HRESULT init(BOOL aCancelable,
ULONG aOperationCount,
Utf8Str aOperationDescription);
void uninit();
// public methods only for internal purposes
HRESULT i_setResultCode(HRESULT aResultCode);
HRESULT i_notifyComplete(HRESULT aResultCode);
HRESULT i_notifyComplete(HRESULT aResultCode,
const GUID &aIID,
const char *pcszComponent,
const char *aText,
...);
HRESULT i_notifyCompleteV(HRESULT aResultCode,
const GUID &aIID,
const char *pcszComponent,
const char *aText,
va_list va);
bool i_notifyPointOfNoReturn(void);
// public methods only for internal purposes
bool i_setCancelCallback(void (*pfnCallback)(void *), void *pvUser);
// unsafe inline public methods for internal purposes only (ensure there is
// a caller and a read lock before calling them!)
BOOL i_getCompleted() const { return mCompleted; }
HRESULT i_getResultCode() const { return mResultCode; }
double i_calcTotalPercent();
private:
// Wrapped IProgress Data
HRESULT getId(com::Guid &aId);
HRESULT getDescription(com::Utf8Str &aDescription);
HRESULT getInitiator(ComPtr<IUnknown> &aInitiator);
HRESULT getCancelable(BOOL *aCancelable);
HRESULT getPercent(ULONG *aPercent);
HRESULT getTimeRemaining(LONG *aTimeRemaining);
HRESULT getCompleted(BOOL *aCompleted);
HRESULT getCanceled(BOOL *aCanceled);
HRESULT getResultCode(LONG *aResultCode);
HRESULT getErrorInfo(ComPtr<IVirtualBoxErrorInfo> &aErrorInfo);
HRESULT getOperationCount(ULONG *aOperationCount);
HRESULT getOperation(ULONG *aOperation);
HRESULT getOperationDescription(com::Utf8Str &aOperationDescription);
HRESULT getOperationPercent(ULONG *aOperationPercent);
HRESULT getOperationWeight(ULONG *aOperationWeight);
HRESULT getTimeout(ULONG *aTimeout);
HRESULT setTimeout(ULONG aTimeout);
HRESULT setCurrentOperationProgress(ULONG aPercent);
HRESULT setNextOperation(const com::Utf8Str &aNextOperationDescription,
ULONG aNextOperationsWeight);
// Wrapped Iprogress methods
HRESULT waitForCompletion(LONG aTimeout);
HRESULT waitForOperationCompletion(ULONG aOperation,
LONG aTimeout);
HRESULT waitForAsyncProgressCompletion(const ComPtr<IProgress> &aPProgressAsync);
HRESULT cancel();
RTSEMEVENTMULTI mCompletedSem;
ULONG mWaitersCount;
};
#endif /* ____H_PROGRESSIMPL */