//////////////////////////////////////////////////////////////////////////////
//
// CLEANUP.CPP / Tuneup
//
//  Microsoft Confidential
//  Copyright (c) Microsoft Corporation 1998
//  All rights reserved
//
//  Functions for the cleanup manager task wizard page.
//
//  8/98 - Jason Cohen (JCOHEN)
//
//////////////////////////////////////////////////////////////////////////////


// Internal include files.
//
#include <windows.h>
#include <tchar.h>
//#include <initguid.h>
#include <emptyvc.h>


BOOL GetCleanupSettings(HWND hLB)
{
    HKEY				hKeyVolCache,
						hClientKey;
	CLSID				clsid;
	LPEMPTYVOLUMECACHE	pVolumeCache;
	LPWSTR				wcsDisplayName,
						wcsDescription;
	TCHAR				szRegKeyName[64];
    DWORD				iSubKey;
    TCHAR				szVolCacheClient[MAX_PATH];
    TCHAR				szGUID[MAX_PATH];
    DWORD				dwGUIDSize,
						dwType,
						dwSize,
						dwRes;
    BOOL				bRet = TRUE;
	TCHAR				szDisplayName[128];
	static TCHAR		szRoot[] = _T("c:\\");
	static TCHAR		szRegVolumeCache[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\explorer\\VolumeCaches");

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegVolumeCache, 0, KEY_READ, &hKeyVolCache) != ERROR_SUCCESS) 
		return FALSE;

    // Enumerate through all of the clients to see how large we need to make the pClientInfo array
    //
    iSubKey = 0;
    while ( RegEnumKey(hKeyVolCache, iSubKey, szVolCacheClient, sizeof(szVolCacheClient)) != ERROR_NO_MORE_ITEMS ) 
        iSubKey++;        
    
	// Fill in the pClientInfo data structure and initialize all of the volume cache clients
	//
    iSubKey = 0;
    while ( RegEnumKey(hKeyVolCache, iSubKey++, szVolCacheClient, sizeof(szVolCacheClient)) != ERROR_NO_MORE_ITEMS )
	{
        if ( RegOpenKeyEx(hKeyVolCache, szVolCacheClient, 0, KEY_ALL_ACCESS, &hClientKey) != ERROR_SUCCESS )
			continue;

		lstrcpy(szRegKeyName, szVolCacheClient);

		// Check whether the StateFlags is non zero.
		//
		wsprintf(szDisplayName, _T("StateFlags%04d"), 0);
		dwSize = sizeof(DWORD);
		dwType = REG_DWORD;
		dwRes = 0;
		if ( RegQueryValueEx(hClientKey, szDisplayName, NULL, &dwType, (LPBYTE)&dwRes, &dwSize) == ERROR_SUCCESS )
		{
			// StateFlags overrides the flags got from Initialize(), so if it's set explicitly
			// as 0, then it's not a selected cleaner.
			//
			if (dwRes == 0)
				goto next;
		}
        
        // Get its GUID, call Initialize method to get the display name.
		//
		dwGUIDSize = sizeof(szGUID);
        dwType = REG_SZ;
        if ( RegQueryValueEx(hClientKey, NULL, NULL, &dwType, (LPBYTE)szGUID, &dwGUIDSize) == ERROR_SUCCESS )
		{
            HRESULT hr;
            WCHAR   wcsFmtID[39];
            WCHAR	wcsRoot[MAX_PATH];

#ifdef _UNICODE
			lstrcpy(wcsFmtID, szGUID);
#else // _UNICODE
            // Convert to Unicode.
			//
            MultiByteToWideChar(CP_ACP, 0, szGUID, -1, wcsFmtID, 39) ;
#endif // _UNICODE
            
            // Convert to GUID.
			//
            hr = CLSIDFromString((LPOLESTR)wcsFmtID, &clsid);
            
			*szDisplayName = 0;

            // Create an instance of the COM object for this cleanup client
			//
            pVolumeCache = NULL;
            hr = CoCreateInstance(clsid,
								  NULL,
								  CLSCTX_INPROC_SERVER,
								  IID_IEmptyVolumeCache,
								  (void **) &pVolumeCache);
                                                
            if ( SUCCEEDED(hr) )
			{
				// Set the flags to pass to the cleanup client.
				//
				DWORD dwInitializeFlags = EVCF_SETTINGSMODE;

#ifdef _UNICODE
				lstrcpy(wcsRoot, szRoot);
#else // _UNICODE
				// Convert szRoot to UNICODE.
				//
				MultiByteToWideChar(CP_ACP, 0, szRoot, -1, wcsRoot, MAX_PATH);
#endif // _UNICODE

                hr = pVolumeCache->Initialize(hClientKey,
											  (LPCWSTR) wcsRoot,
											  &((LPWSTR) wcsDisplayName),
											  &((LPWSTR) wcsDescription),
											  &dwInitializeFlags);

				if ( (dwRes == 0) && !(dwInitializeFlags & EVCF_ENABLEBYDEFAULT_AUTO) )
					// dwRes is 0 and still reach here, means there's no StateFlags, we 
					// reference the dwInitializeFlags at this case
					//
					goto next;

                if ( SUCCEEDED(hr) && (S_OK == hr) && wcsDisplayName)
#ifdef _UNICODE
					lstrcpy(szDisplayName, wcsDisplayName);
#else // _UNICODE
					WideCharToMultiByte(CP_ACP, 0, wcsDisplayName, -1, szDisplayName, 128, NULL, NULL);
#endif // _UNICODE
				else
				{
					// If the client did not return the DisplayName via the Initialize
					// Interface then we need to get it from the registry.

					// First check if their is a "display" value for the client's 
					// name that is displayed in the list box.  If not then use
					// the key name itself.
					//
					dwSize = 128;
					dwType = REG_SZ;
					if ( RegQueryValueEx(hClientKey, _T("display"), NULL, &dwType, (LPBYTE)szDisplayName, &dwSize) != ERROR_SUCCESS )
						// Count not find "display" value so use the key name instead.
						//
						lstrcpy(szDisplayName, szVolCacheClient);
             	}
			}

			if (*szDisplayName)
				SendMessage(hLB, LB_ADDSTRING, 0, (LPARAM)szDisplayName);
		}
next:
		RegCloseKey(hClientKey);
	}
        
	RegCloseKey(hKeyVolCache);
	return bRet;
}