////////////////////////////////////////////////////////////////////////////////////////////// // // ApplicationManagerAdmin.cpp // // Copyright (C) 1998, 1999 Microsoft Corporation. All rights reserved. // // Abstract : // // This is the implementation of IApplicationManagerAdmin // // History : // // 05/06/1999 luish Created // ////////////////////////////////////////////////////////////////////////////////////////////// #include #include "AppMan.h" #include "AppManAdmin.h" #include "ApplicationManager.h" #include "AppManDebug.h" #include "ExceptionHandler.h" #include "RegistryKey.h" //To flag as DBG_APPMANADMIN #ifdef DBG_MODULE #undef DBG_MODULE #endif #define DBG_MODULE DBG_APPMANADMIN ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// CApplicationManagerAdmin::CApplicationManagerAdmin(void) { FUNCTION("CApplicationManagerAdmin::CApplicationManagerAdmin (void)"); } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// CApplicationManagerAdmin::CApplicationManagerAdmin(CApplicationManagerRoot * lpParent) { FUNCTION("CApplicationManagerAdmin::CApplicationManagerAdmin (CApplicationManagerRoot *pParent)"); assert(NULL != lpParent); m_pParentObject = lpParent; m_InformationManager.Initialize(); } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// CApplicationManagerAdmin::~CApplicationManagerAdmin(void) { FUNCTION("CApplicationManagerAdmin::~CApplicationManagerAdmin (void)"); } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::QueryInterface(REFIID RefIID, LPVOID * lppVoidObject) { FUNCTION("CApplicationManagerAdmin::QueryInterface ()"); if (NULL == m_pParentObject) { return E_NOINTERFACE; } return m_pParentObject->QueryInterface(RefIID, lppVoidObject); } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP_(ULONG) CApplicationManagerAdmin::AddRef(void) { FUNCTION("CApplicationManagerAdmin::AddRef ()"); if (NULL != m_pParentObject) { return m_pParentObject->AddRef(); } return 0; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP_(ULONG) CApplicationManagerAdmin::Release(void) { FUNCTION("CApplicationManagerAdmin::Release ()"); if (NULL != m_pParentObject) { return m_pParentObject->Release(); } return 0; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::EnumerateDevices(const DWORD dwIndex, GUID * lpGuid) { FUNCTION("CApplicationManagerAdmin::EnumerateDevices ()"); HRESULT hResult = E_FAIL; DEVICE_RECORD sDeviceRecord; /////////////////////////////////////////////////////////////////////////////////////// try { // // Enumerate devices. Get the device GUID for device record at dwIndex // if (S_OK == m_InformationManager.CheckDeviceExistance(dwIndex)) { hResult = m_InformationManager.GetDeviceInfoWithIndex(dwIndex, &sDeviceRecord); if (SUCCEEDED(hResult)) { memcpy(lpGuid, &(sDeviceRecord.sDeviceGuid), sizeof(GUID)); } } } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; } catch(...) { hResult = E_UNEXPECTED; } return hResult; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::GetDeviceProperty(const DWORD dwProperty, const GUID * lpGuid, LPVOID lpData, const DWORD /*dwDataLen*/) // Get rid of /W4 warning. { FUNCTION("CApplicationManagerAdmin::GetDeviceProperty ()"); HRESULT hResult = S_OK; /////////////////////////////////////////////////////////////////////////////////////// try { DEVICE_RECORD sDeviceRecord = {0}; DEVICE_SPACE_INFO sDeviceSpaceInfo = {0}; // // Prefetch the device information // ZeroMemory(&sDeviceRecord, sizeof(sDeviceRecord)); memcpy(&(sDeviceRecord.sDeviceGuid), lpGuid, sizeof(GUID)); hResult = m_InformationManager.GetDeviceInfo(&sDeviceRecord); if (SUCCEEDED(hResult)) { hResult = m_InformationManager.GetDeviceSpaceInfoWithIndex(sDeviceRecord.sDeviceInfo.dwDeviceIndex, &sDeviceSpaceInfo); if (SUCCEEDED(hResult)) { hResult = m_InformationManager.GetDeviceInfo(&sDeviceRecord); } } if (SUCCEEDED(hResult)) { switch(dwProperty) { case DEVICE_PROPERTY_TOTALKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwTotalKilobytes; break; case DEVICE_PROPERTY_TOTALFREEKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwTotalFreeKilobytes; break; case DEVICE_PROPERTY_TOTALAVAILABLEKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwMaximumUsableKilobytes; break; case DEVICE_PROPERTY_OPTIMALAVAILABLEKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwOptimalUsableKilobytes; break; case DEVICE_PROPERTY_REMOVABLEKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwTotalRemovableKilobytes; break; case DEVICE_PROPERTY_NONREMOVABLEKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwTotalNonRemovableKilobytes; break; case DEVICE_PROPERTY_RESERVEDKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwTotalReservedKilobytes; break; case DEVICE_PROPERTY_TOTALTEMPORARYKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwTotalReservedTemporaryKilobytes; break; case DEVICE_PROPERTY_USEDTEMPORARYKILOBYTES : *(LPDWORD)lpData = sDeviceSpaceInfo.dwTotalUsedTemporaryKilobytes; break; case DEVICE_PROPERTY_PERCENTCACHESIZE : *(LPDWORD)lpData = sDeviceRecord.sDeviceInfo.dwPercentCacheSize; break; case DEVICE_PROPERTY_PERCENTMINIMUMFREESIZE : *(LPDWORD)lpData = sDeviceRecord.sDeviceInfo.dwPercentMinimumFreeSize; break; case DEVICE_PROPERTY_EXCLUSIONMASK : *(LPDWORD)lpData = sDeviceRecord.sDeviceInfo.dwApplicationCategoryExclusionMask; break; default : THROW(APPMANADMIN_E_INVALIDPROPERTY); break; } } } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; } catch(...) { hResult = E_UNEXPECTED; } return hResult; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::SetDeviceProperty(const DWORD dwProperty, const GUID * lpGuid, LPVOID lpData, const DWORD /*dwDataLen*/) // Get rid of /W4 warning. { FUNCTION("CApplicationManagerAdmin::SetDeviceProperty ()"); HRESULT hResult = S_OK; /////////////////////////////////////////////////////////////////////////////////////// try { DEVICE_RECORD sDeviceRecord; ZeroMemory(&sDeviceRecord, sizeof(sDeviceRecord)); memcpy(&(sDeviceRecord.sDeviceGuid), lpGuid, sizeof(GUID)); hResult = m_InformationManager.GetDeviceInfo(&sDeviceRecord); if (SUCCEEDED(hResult)) { switch(dwProperty) { case DEVICE_PROPERTY_TOTALKILOBYTES: case DEVICE_PROPERTY_TOTALFREEKILOBYTES: case DEVICE_PROPERTY_TOTALAVAILABLEKILOBYTES: case DEVICE_PROPERTY_OPTIMALAVAILABLEKILOBYTES: case DEVICE_PROPERTY_REMOVABLEKILOBYTES: case DEVICE_PROPERTY_NONREMOVABLEKILOBYTES: case DEVICE_PROPERTY_RESERVEDKILOBYTES: case DEVICE_PROPERTY_TOTALTEMPORARYKILOBYTES: case DEVICE_PROPERTY_USEDTEMPORARYKILOBYTES : THROW(APPMANADMIN_E_READONLYPROPERTY); break; case DEVICE_PROPERTY_PERCENTCACHESIZE : sDeviceRecord.sDeviceInfo.dwPercentCacheSize = (DWORD) *((LPDWORD) lpData); if (100 < sDeviceRecord.sDeviceInfo.dwPercentCacheSize) { if (0xffffffff == sDeviceRecord.sDeviceInfo.dwPercentCacheSize) { CRegistryKey sRegistryKey; DWORD dwType, dwSize; sRegistryKey.OpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\AppMan", KEY_ALL_ACCESS); sDeviceRecord.sDeviceInfo.dwPercentCacheSize = DEFAULT_PERCENT_CACHE_SIZE; if (S_OK == sRegistryKey.CheckForExistingValue("DefaultPercentCacheSize")) { dwSize = sizeof(sDeviceRecord.sDeviceInfo.dwPercentCacheSize); sRegistryKey.GetValue("DefaultPercentCacheSize", &dwType, (LPBYTE) &sDeviceRecord.sDeviceInfo.dwPercentCacheSize, &dwSize); } // // Is the registry value corrupt // if (100 < sDeviceRecord.sDeviceInfo.dwPercentCacheSize) { sDeviceRecord.sDeviceInfo.dwPercentCacheSize = DEFAULT_PERCENT_CACHE_SIZE; sRegistryKey.SetValue("DefaultPercentCacheSize", REG_DWORD, (const BYTE *) &sDeviceRecord.sDeviceInfo.dwPercentCacheSize, sizeof(sDeviceRecord.sDeviceInfo.dwPercentCacheSize)); } } else { THROW(APPMAN_E_INVALIDPROPERTYVALUE); } } hResult = m_InformationManager.SetDeviceInfoWithIndex(sDeviceRecord.sDeviceInfo.dwDeviceIndex, &sDeviceRecord); break; case DEVICE_PROPERTY_PERCENTMINIMUMFREESIZE : sDeviceRecord.sDeviceInfo.dwPercentMinimumFreeSize = (DWORD) *((LPDWORD) lpData); if (100 < sDeviceRecord.sDeviceInfo.dwPercentMinimumFreeSize) { THROW(APPMAN_E_INVALIDPROPERTYVALUE); } hResult = m_InformationManager.SetDeviceInfoWithIndex(sDeviceRecord.sDeviceInfo.dwDeviceIndex, &sDeviceRecord); break; case DEVICE_PROPERTY_EXCLUSIONMASK : sDeviceRecord.sDeviceInfo.dwApplicationCategoryExclusionMask &= ~DEVICE_EXCLUSION_MASK; sDeviceRecord.sDeviceInfo.dwApplicationCategoryExclusionMask |= (DWORD) *((LPDWORD) lpData); hResult = m_InformationManager.SetDeviceInfoWithIndex(sDeviceRecord.sDeviceInfo.dwDeviceIndex, &sDeviceRecord); break; default : THROW(APPMANADMIN_E_INVALIDPROPERTY); break; } } } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; } catch(...) { hResult = E_UNEXPECTED; } return hResult; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::GetAppManProperty(const DWORD dwProperty, LPVOID lpData, const DWORD /*dwDataLen*/) { FUNCTION("CApplicationManagerAdmin::GetAppManProperty ()"); HRESULT hResult = S_OK; /////////////////////////////////////////////////////////////////////////////////////// try { DWORD dwMaxKilobytes = 0, dwOptimalKilobytes = 0, dwAdvancedMode = 0; // // Prefetch some of the global information // hResult = m_InformationManager.GetMaximumAvailableSpace(APP_CATEGORY_ENTERTAINMENT, &dwMaxKilobytes); if (SUCCEEDED(hResult)) { hResult = m_InformationManager.GetOptimalAvailableSpace(APP_CATEGORY_ENTERTAINMENT, &dwOptimalKilobytes); if (SUCCEEDED(hResult)) { hResult = m_InformationManager.GetAdvancedMode(&dwAdvancedMode); } } if (SUCCEEDED(hResult)) { switch(dwProperty) { case APPMAN_PROPERTY_TOTALKILOBYTES : *(LPDWORD)lpData = dwMaxKilobytes; break; case APPMAN_PROPERTY_OPTIMALKILOBYTES : *(LPDWORD)lpData = dwOptimalKilobytes; break; case APPMAN_PROPERTY_ADVANCEDMODE : *(LPDWORD)lpData = dwAdvancedMode; break; default : THROW(APPMANADMIN_E_INVALIDPROPERTY); break; } } } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; } catch(...) { hResult = E_UNEXPECTED; } return hResult; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::SetAppManProperty(const DWORD dwProperty, LPCVOID lpData, const DWORD /*dwDataLen*/) { FUNCTION("CApplicationManagerAdmin::SetAppManProperty()"); HRESULT hResult = S_OK; /////////////////////////////////////////////////////////////////////////////////////// try { if (APPMAN_PROPERTY_ADVANCEDMODE == dwProperty) { hResult = m_InformationManager.SetAdvancedMode((DWORD) *((LPDWORD) lpData)); } } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; } catch(...) { hResult = E_UNEXPECTED; } return hResult; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::CreateApplicationEntry(IApplicationEntry ** ppObject) { FUNCTION("CApplicationManagerAdmin::CreateApplicationEntry ()"); HRESULT hResult = S_OK; /////////////////////////////////////////////////////////////////////////////////////// try { *ppObject = (IApplicationEntry *) new CApplicationEntry; hResult = ((CApplicationEntry *) *ppObject)->Initialize(); } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { // // Get Result code // hResult = pException->GetResultCode(); // // Make sure we clean up and delete the CApplicationEntry object // delete ((CApplicationEntry *) *ppObject); *ppObject = NULL; // // Delete exception handler // delete pException; } catch(...) { // // Make sure we clean up and delete the CApplicationEntry object // delete ((CApplicationEntry *) *ppObject); *ppObject = NULL; // // If we failed to handle an exception, we default to APPMAN_E_CRITICALERROR // hResult = E_UNEXPECTED; } /////////////////////////////////////////////////////////////////////////////////////// return hResult; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::GetApplicationInfo(IApplicationEntry * lpObject) { FUNCTION("CApplicationManagerAdmin::GetApplicationInfo ()"); HRESULT hResult = S_OK; /////////////////////////////////////////////////////////////////////////////////////// try { // // Check to make sure the pointer we receive is good // if ((NULL == lpObject)||(IsBadReadPtr(lpObject, sizeof(CApplicationEntry)))) { THROW(E_INVALIDARG); } hResult = m_InformationManager.GetApplicationData(((CApplicationEntry *) lpObject)->GetApplicationDataPtr()); if (SUCCEEDED(hResult)) { ((CApplicationEntry *) lpObject)->SetInitializationLevel(INIT_LEVEL_TOTAL); } } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { // // Get Result code // hResult = pException->GetResultCode(); // // Delete exception handler // delete pException; } catch(...) { // // If we failed to handle an exception, we default to APPMAN_E_CRITICALERROR // hResult = E_UNEXPECTED; } /////////////////////////////////////////////////////////////////////////////////////// return hResult; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::EnumApplications(const DWORD dwApplicationIndex, IApplicationEntry * lpObject) { FUNCTION("CApplicationManagerAdmin::EnumApplications ()"); HRESULT hResult = S_OK; /////////////////////////////////////////////////////////////////////////////////////// try { // // Check to make sure the pointer we receive is good // if ((NULL == lpObject)||(IsBadReadPtr(lpObject, sizeof(CApplicationEntry)))) { THROW(E_INVALIDARG); } hResult = m_InformationManager.GetApplicationDataWithIndex(dwApplicationIndex, ((CApplicationEntry *) lpObject)->GetApplicationDataPtr()); if (SUCCEEDED(hResult)) { ((CApplicationEntry *) lpObject)->SetInitializationLevel(INIT_LEVEL_TOTAL); } } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { // // Get Result code // hResult = pException->GetResultCode(); // // Delete exception handler // delete pException; } catch(...) { // // If we failed to handle an exception, we default to APPMAN_E_CRITICALERROR // hResult = E_UNEXPECTED; } /////////////////////////////////////////////////////////////////////////////////////// return hResult; } ////////////////////////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////////////////////////// STDMETHODIMP CApplicationManagerAdmin::DoApplicationAction(const DWORD dwAction, const GUID * lpGuid, const DWORD dwStringProperty, LPVOID lpData, const DWORD dwDataLen) { FUNCTION("CApplicationManagerAdmin::DoApplicationAction ()"); HRESULT hResult = S_OK; /////////////////////////////////////////////////////////////////////////////////////// try { APPLICATION_DATA sApplicationData; DWORD dwVariable; ZeroMemory(&sApplicationData, sizeof(sApplicationData)); memcpy(&(sApplicationData.sBaseInfo.sApplicationGuid), lpGuid, sizeof(GUID)); m_InformationManager.ValidateApplicationPropertyWithIndex(IDX_PROPERTY_GUID, &sApplicationData); hResult = m_InformationManager.GetApplicationData(&sApplicationData); if (SUCCEEDED(hResult)) { // // Handle the GetProperty() request // switch(dwAction) { case ACTION_APP_DOWNSIZE : // // Make sure the required parameters are proper // if ((NULL == lpData)||(sizeof(DWORD) != dwDataLen)) { THROW(APPMANADMIN_E_INVALIDPARAMETERS); } hResult = m_InformationManager.DownsizeApplication((DWORD) *((LPDWORD) lpData), &sApplicationData); break; case ACTION_APP_REINSTALL : hResult = m_InformationManager.ReInstallApplication(&sApplicationData); break; case ACTION_APP_UNINSTALL : hResult = m_InformationManager.UnInstallApplication(&sApplicationData); break; case ACTION_APP_UNINSTALLBLOCK : hResult = m_InformationManager.UnInstallApplicationWait(&sApplicationData); break; case ACTION_APP_SELFTEST : hResult = m_InformationManager.SelfTestApplication(&sApplicationData); break; case ACTION_APP_RUN_BLOCK : hResult = m_InformationManager.RunApplication(&sApplicationData, APP_RUN_BLOCK, dwStringProperty, (LPWSTR) lpData, dwDataLen); break; case ACTION_APP_RUN_NOBLOCK : hResult = m_InformationManager.RunApplication(&sApplicationData, APP_RUN_NOBLOCK, dwStringProperty, (LPWSTR) lpData, dwDataLen); break; case ACTION_APP_PIN : if (FALSE == sApplicationData.sBaseInfo.dwPinState) { dwVariable = TRUE; } else { dwVariable = FALSE; } hResult = m_InformationManager.PinApplication(&sApplicationData, (BOOL *) &dwVariable); break; } } } /////////////////////////////////////////////////////////////////////////////////////// catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; } catch(...) { hResult = E_UNEXPECTED; } return hResult; }