windows-nt/Source/XPSP1/NT/shell/applets/cleanup/cleanmgr/callback.cpp
2020-09-26 16:20:57 +08:00

256 lines
6.2 KiB
C++

/*
**------------------------------------------------------------------------------
** Module: Disk Cleanup Applet
** File: callback.cpp
**
** Purpose: Defines the IEmptyVoluemCacheCallback interface for
** the cleanup manager.
** Notes:
** Mod Log: Created by Jason Cobb (2/97)
**
** Copyright (c)1997 Microsoft Corporation, All Rights Reserved
**------------------------------------------------------------------------------
*/
/*
**------------------------------------------------------------------------------
** Project include files
**------------------------------------------------------------------------------
*/
#include "common.h"
#include "callback.h"
#include "dmgrinfo.h"
#include "dmgrdlg.h"
/*
**------------------------------------------------------------------------------
** Local variables
**------------------------------------------------------------------------------
*/
static PCLIENTINFO g_pClientInfo; // Set to the current CLIENTINFO struct
static CleanupMgrInfo *g_pcmi;
CVolumeCacheCallBack::CVolumeCacheCallBack(
void
)
{
g_pClientInfo = NULL;
g_pcmi = NULL;
}
CVolumeCacheCallBack::~CVolumeCacheCallBack(
void
)
{
;
}
/*
**------------------------------------------------------------------------------
** CVolumeCacheCallBack::QueryInterface
**
** Purpose: Part of the IUnknown interface
** Parameters:
** riid - interface ID to query on
** ppv - pointer to interface if we support it
** Return: NOERROR on success, E_NOINTERFACE otherwise
** Notes;
** Mod Log: Created by Jason Cobb (2/97)
**------------------------------------------------------------------------------
*/
STDMETHODIMP CVolumeCacheCallBack::QueryInterface(
REFIID riid,
LPVOID FAR *ppv
)
{
*ppv = NULL;
//
//Check for IUnknown interface request
//
if (IsEqualIID (riid, IID_IUnknown))
{
//
//Typecast to the requested interface so C++ sets up
//the virtual tables correctly
//
*ppv = (LPUNKNOWN)(LPEMPTYVOLUMECACHECALLBACK) this;
AddRef();
return NOERROR;
}
//
//Check for IEmptyVolumeCacheCallBack interface request
//
if (IsEqualIID (riid, IID_IEmptyVolumeCacheCallBack))
{
//
//Typecast to the requested interface so C++ sets up
//the virtual tables correctly
//
*ppv = (LPEMPTYVOLUMECACHECALLBACK) this;
AddRef();
return NOERROR;
}
//
//Error - unsupported interface requested
//
return E_NOINTERFACE;
}
/*
**------------------------------------------------------------------------------
** CVolumeCacheCallBack::AddRef
**
** Purpose: ups the reference count to this object
** Notes;
** Return: current refernce count
** Mod Log: Created by Jason Cobb (2/97)
**------------------------------------------------------------------------------
*/
STDMETHODIMP_(ULONG) CVolumeCacheCallBack::AddRef()
{
return ++m_cRef;
}
/*
**------------------------------------------------------------------------------
** CVolumeCacheCallBack::Release
**
** Purpose: downs the reference count to this object
** and deletes the object if no one is using it
** Notes;
** Mod Log: Created by Jason Cobb (2/97)
**------------------------------------------------------------------------------
*/
STDMETHODIMP_(ULONG) CVolumeCacheCallBack::Release()
{
//
//Decrement and check
//
if (--m_cRef)
return m_cRef;
//
//No references left to this object
//
delete this;
return 0L;
}
/*
**------------------------------------------------------------------------------
** CVolumeCacheCallBack::ScanProgress
**
** Purpose: Part of the IUnknown interface
** Parameters:
** dwSpaceUsed - Amount of space that the client can free so far
** dwFlags - IEmptyVolumeCache flags
** pszStatus - Display string to tell the user what is happening
** Return: If E_ABORT then this indicates that no more notifications
** are required and the client should abort the scan. S_OK
** if the client should continue scanning.
** Notes;
** Mod Log: Created by Jason Cobb (2/97)
**------------------------------------------------------------------------------
*/
STDMETHODIMP
CVolumeCacheCallBack::ScanProgress(
DWORDLONG dwSpaceUsed,
DWORD dwFlags,
LPCWSTR pszStatus
)
{
//
//Update the amount of used disk space for this client
//
if (g_pClientInfo)
g_pClientInfo->dwUsedSpace.QuadPart = dwSpaceUsed;
//
//Check the Flags. If this is the last notification from this client
//then set g_pClientInfo to NULL
//
if (dwFlags & EVCCBF_LASTNOTIFICATION)
g_pClientInfo = NULL;
//
//Has the user aborted the scan? If so let the cleanup object know
//so that it can stop scanning
//
if (g_pcmi->bAbortScan)
return E_ABORT;
else
return S_OK;
}
/*
**------------------------------------------------------------------------------
** CVolumeCacheCallBack::PurgeProgress
**
** Purpose: Part of the IUnknown interface
** Parameters:
** dwSpaceFreed - Amount of disk space freed so far.
** dwSpaceToFree - Amount the client was expected to free.
** dwFlags - IEmptyVolumeCache flags
** pszStatus - Display string to tell the user what is happening
** Return: If E_ABORT then this indicates that no more notifications
** are required and the client should abort the scan. S_OK
** if the client should continue scanning.
** Notes;
** Mod Log: Created by Jason Cobb (2/97)
**------------------------------------------------------------------------------
*/
STDMETHODIMP
CVolumeCacheCallBack::PurgeProgress(
DWORDLONG dwSpaceFreed,
DWORDLONG dwSpaceToFree,
DWORD dwFlags,
LPCWSTR pszStatus
)
{
g_pcmi->cbCurrentClientPurgedSoFar.QuadPart = dwSpaceFreed;
//
//Update the progress bar
//
PostMessage(g_pcmi->hAbortPurgeWnd, WMAPP_UPDATEPROGRESS, 0, 0);
//
//Has the user aborted the purge? If so let the cleanup object know
//so that it can stop purging
//
if (g_pcmi->bAbortPurge)
return E_ABORT;
else
return S_OK;
}
void
CVolumeCacheCallBack::SetCleanupMgrInfo(
PVOID pVoid
)
{
if (pVoid)
g_pcmi = (CleanupMgrInfo*)pVoid;
}
void
CVolumeCacheCallBack::SetCurrentClient(
PVOID pVoid
)
{
if (pVoid)
g_pClientInfo = (PCLIENTINFO)pVoid;
}