/****************************************************************** Copyright (c) 2000 Microsoft Corporation diskcleanup.h -- disk cleanup COM object for SR Description: delete datastores from stale builds ******************************************************************/ #include extern long g_cLock; //+--------------------------------------------------------------------------- // // Class: CSREmptyVolumeCache2 // // Synopsis: implements IEmptyVolumeCache2 // // Arguments: // // History: 20-Jul-2000 HenryLee Created // //---------------------------------------------------------------------------- class CSREmptyVolumeCache2 : IEmptyVolumeCache2 { public: STDMETHOD(QueryInterface) (REFIID riid, void ** ppObject) { if (riid == IID_IEmptyVolumeCache2) { *ppObject = (IEmptyVolumeCache2 *) this; AddRef(); } else if (riid == IID_IEmptyVolumeCache) { *ppObject = (IEmptyVolumeCache *) this; AddRef(); } else return E_NOINTERFACE; return S_OK; } STDMETHOD_(ULONG, AddRef) () { return InterlockedIncrement (&_lRefs); } STDMETHOD_(ULONG, Release) () { if (0 == InterlockedDecrement (&_lRefs)) { delete this; return 0; } return _lRefs; } CSREmptyVolumeCache2 () { _lRefs = 1; _fStop = FALSE; InterlockedIncrement (&g_cLock); _ulGuids = 0; for (int i=0; i < ARRAYSIZE; i++) _wszGuid[i][0] = L'\0'; _wszVolume[0] = L'\0'; } ~CSREmptyVolumeCache2 () { InterlockedDecrement (&g_cLock); } STDMETHOD(Initialize) ( HKEY hkRegKey, const WCHAR * pcwszVolume, WCHAR **ppwszDisplayName, WCHAR **ppwszDescription, DWORD *pdwFlags) { return InitializeEx ( hkRegKey, pcwszVolume, NULL, ppwszDisplayName, ppwszDescription, NULL, pdwFlags); } STDMETHOD(InitializeEx) ( HKEY hkRegKey, const WCHAR *pcwszVolume, const WCHAR *pcwszKeyName, WCHAR **ppwszDisplayName, WCHAR **ppwszDescription, WCHAR **ppwszBtnText, DWORD *pdwFlags); STDMETHOD(GetSpaceUsed) ( DWORDLONG *pdwlSpaceUsed, IEmptyVolumeCacheCallBack *picb); STDMETHOD(Purge) ( DWORDLONG dwlSpaceToFree, IEmptyVolumeCacheCallBack *picb); STDMETHOD(ShowProperties) (HWND hwnd) { return S_OK; // no special UI } STDMETHOD(Deactivate) (DWORD *pdwFlags); private: DWORD LoadBootIni (); DWORD EnumDataStores (DWORDLONG *pdwlSpaceUsed, IEmptyVolumeCacheCallBack *picb, BOOL fPurge, WCHAR *pwszVolume); HRESULT ForAllMountPoints (DWORDLONG *pdwlSpaceUsed, IEmptyVolumeCacheCallBack *picb, BOOL fPurge); static const enum { ARRAYSIZE = 16 }; static const enum { RESTOREGUID_STRLEN = 64 }; LONG _lRefs; BOOL _fStop; ULONG _ulGuids; WCHAR _wszGuid [ARRAYSIZE][RESTOREGUID_STRLEN]; WCHAR _wszVolume [MAX_PATH]; // DOS drive letter }; //+--------------------------------------------------------------------------- // // Class: CSRClassFactory // // Synopsis: generic class factory // // Arguments: // // History: 20-Jul-2000 HenryLee Created // //---------------------------------------------------------------------------- class CSRClassFactory : IClassFactory { public: STDMETHOD(QueryInterface) (REFIID riid, void ** ppObject) { if (riid == IID_IClassFactory) { *ppObject = (IClassFactory *) this; AddRef(); } else { return E_NOINTERFACE; } return S_OK; } STDMETHOD_(ULONG, AddRef) () { return InterlockedIncrement (&_lRefs); } STDMETHOD_(ULONG, Release) () { if (0 == InterlockedDecrement (&_lRefs)) { delete this; return 0; } return _lRefs; } CSRClassFactory () { _lRefs = 1; InterlockedIncrement (&g_cLock); } ~CSRClassFactory () { InterlockedDecrement (&g_cLock); } STDMETHOD(CreateInstance) (IUnknown *pUnkOuter, REFIID riid, void **ppvObject); STDMETHOD(LockServer) (BOOL fLock) { if (fLock) InterlockedIncrement(&g_cLock); else InterlockedDecrement(&g_cLock); return S_OK; } private: LONG _lRefs; };