|
|
//////////////////////////////////////////////////////////////////////////////////////////////
//
// ApplicationManager.cpp
//
// Copyright (C) 1998, 1999 Microsoft Corporation. All rights reserved.
//
// Abstract :
//
// This is the implementation of IApplicationManager
//
// History :
//
// 05/06/1999 luish Created
//
//////////////////////////////////////////////////////////////////////////////////////////////
#include "Resource.h"
#include "AppMan.h"
#include "ExceptionHandler.h"
#include "ApplicationManager.h"
#include "AppManDebug.h"
#include "Global.h"
#include "RegistryKey.h"
#include "Win32API.h"
//To flag as DBG_APPMAN
#ifdef DBG_MODULE
#undef DBG_MODULE
#endif
#define DBG_MODULE DBG_APPMAN
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CApplicationManager::CApplicationManager(void) { FUNCTION("CApplicationManager::CApplicationManager (void)"); assert(TRUE); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CApplicationManager::CApplicationManager(CApplicationManagerRoot * pParent) { FUNCTION("CApplicationManager::CApplicationManager (CApplicationManagerRoot * pParent)");
HRESULT hResult = S_OK;
assert(NULL != pParent);
m_pParentObject = pParent;
if ((hResult = m_InformationManager.Initialize()) == E_ACCESSDENIED) { pParent->m_bInsufficientAccessToRun = TRUE; } }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
CApplicationManager::~CApplicationManager(void) { FUNCTION("CApplicationManager::~CApplicationManager (void)"); }
//////////////////////////////////////////////////////////////////////////////////////////////
//
// IUnknown interface implementation
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CApplicationManager::QueryInterface(REFIID RefIID, LPVOID * ppVoidObject) { FUNCTION("CApplicationManager::QueryInterface ()");
HRESULT hResult = S_OK;
///////////////////////////////////////////////////////////////////////////////////////
try { if (NULL == &RefIID) { THROW(E_UNEXPECTED); }
*ppVoidObject = NULL;
if ((RefIID == IID_IUnknown)||(RefIID == IID_ApplicationManager)) { *ppVoidObject = (LPVOID) this; }
if (*ppVoidObject) { ((LPUNKNOWN)*ppVoidObject)->AddRef(); } else { hResult = E_NOINTERFACE; } }
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; }
catch(...) { if ((NULL == &RefIID)||(NULL == ppVoidObject)||(IsBadWritePtr(ppVoidObject, sizeof(LPVOID)))) { hResult = E_INVALIDARG; } else { hResult = E_UNEXPECTED; } }
return hResult; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
// IUnknown interface implementation
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CApplicationManager::AddRef(void) { FUNCTION("CApplicationManager::AddRef ()");
if (NULL != m_pParentObject) { return m_pParentObject->AddRef(); }
return 0; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
// IUnknown interface implementation
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CApplicationManager::Release(void) { FUNCTION("CApplicationManager::Release ()");
if (NULL != m_pParentObject) { return m_pParentObject->Release(); }
return 0; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CApplicationManager::GetAdvancedMode(LPDWORD lpdwAdvancedModeMask) { FUNCTION("CApplicationManager::GetAdvancedMode ()");
HRESULT hResult = APPMAN_E_INVALIDDATA;
try { //
// Check to make sure the pointer we receive is good
//
if ((NULL == lpdwAdvancedModeMask)||(IsBadWritePtr(lpdwAdvancedModeMask, sizeof(DWORD)))) { THROW(APPMAN_E_INVALIDDATA); }
//
// Get the advanced mode
//
hResult = m_InformationManager.GetAdvancedMode(lpdwAdvancedModeMask); }
///////////////////////////////////////////////////////////////////////////////////////
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 CApplicationManager::GetAvailableSpace(const DWORD dwApplicationCategory, LPDWORD lpdwMaximumSpace, LPDWORD lpdwOptimalSpace) { FUNCTION("CApplicationManager::GetAvailableSpace ()");
HRESULT hResult = S_OK;
try { //
// Check to make sure the pointer we receive is good
//
if ((NULL == lpdwMaximumSpace)||(NULL == lpdwOptimalSpace)||(IsBadWritePtr(lpdwMaximumSpace, sizeof(DWORD)))||(IsBadWritePtr(lpdwOptimalSpace, sizeof(DWORD)))) { THROW(E_INVALIDARG); }
hResult = m_InformationManager.GetMaximumAvailableSpace(dwApplicationCategory, lpdwMaximumSpace); if (SUCCEEDED(hResult)) { hResult = m_InformationManager.GetOptimalAvailableSpace(dwApplicationCategory, lpdwOptimalSpace); } }
///////////////////////////////////////////////////////////////////////////////////////
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; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
// The CreateObject() method will return a new instantiation of an IApplicationEntry
// to the caller.
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CApplicationManager::CreateApplicationEntry(IApplicationEntry ** lppObject) { FUNCTION("CApplicationManager::CreateApplicationEntry ()");
HRESULT hResult = S_OK;
///////////////////////////////////////////////////////////////////////////////////////
try { //
// Check to make sure the pointer we receive is good
//
if ((NULL == lppObject)||(IsBadWritePtr(lppObject, sizeof(IApplicationEntry *)))) { THROW(E_INVALIDARG); }
*lppObject = (IApplicationEntry *) new CApplicationEntry; hResult = ((CApplicationEntry *) *lppObject)->Initialize(); }
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { //
// Get Result code
//
hResult = pException->GetResultCode();
//
// Make sure we clean up and delete the CApplicationEntry object
//
if ((NULL != lppObject)&&(!IsBadReadPtr(lppObject, sizeof(IApplicationEntry *)))) { delete ((CApplicationEntry *) *lppObject); *lppObject = NULL; }
//
// Delete exception handler
//
delete pException; }
catch(...) { //
// Make sure we clean up and delete the CApplicationEntry object
//
if ((NULL != lppObject)&&(!IsBadReadPtr(lppObject, sizeof(IApplicationEntry *)))) { delete ((CApplicationEntry *) *lppObject); *lppObject = NULL; }
//
// If we failed to handle an exception, we default to APPMAN_E_CRITICALERROR
//
hResult = E_UNEXPECTED; }
///////////////////////////////////////////////////////////////////////////////////////
return hResult; }
//////////////////////////////////////////////////////////////////////////////////////////////
//
// The GetApplicationInfo() method will take a pre-initialized object as parameter and seek
// the first matching registered object based on what was pre-initialized in the pObject. The
// valid fields for pre-initialization in order of importance are:
//
// OBJECT_PROPERTY_GUID
// OBJECT_PROPERTY_SIGNATURE
//
// If none of the above properties are set within the object being passed in, the function
// will fail.
//
//////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CApplicationManager::GetApplicationInfo(IApplicationEntry * lpObject) { FUNCTION("CApplicationManager::GetApplicationInfo ()");
HRESULT hResult = S_OK;
///////////////////////////////////////////////////////////////////////////////////////
try { HRESULT hGuidInitialized;
//
// Check to make sure the pointer we receive is good
//
if ((NULL == lpObject)||(IsBadReadPtr(lpObject, sizeof(CApplicationEntry)))) { THROW(E_INVALIDARG); }
if (CURRENT_ACTION_NONE != ((CApplicationEntry *) lpObject)->GetActionState()) { THROW(APPMAN_E_ACTIONINPROGRESS); }
hGuidInitialized = m_InformationManager.IsApplicationPropertyInitializedWithIndex(IDX_PROPERTY_GUID, ((CApplicationEntry *) lpObject)->GetApplicationDataPtr()); hResult = m_InformationManager.GetApplicationData(((CApplicationEntry *) lpObject)->GetApplicationDataPtr()); if (SUCCEEDED(hResult)) { if (S_OK == hGuidInitialized) { ((CApplicationEntry *) lpObject)->SetInitializationLevel(INIT_LEVEL_TOTAL); } else { ((CApplicationEntry *) lpObject)->SetInitializationLevel(INIT_LEVEL_BASIC); } } } ///////////////////////////////////////////////////////////////////////////////////////
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 CApplicationManager::EnumApplications(const DWORD dwApplicationIndex, IApplicationEntry * lpObject) { FUNCTION("CApplicationManager::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_BASIC); } }
///////////////////////////////////////////////////////////////////////////////////////
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 CApplicationManager::EnumDevices(const DWORD dwTargetIndex, LPDWORD lpdwKilobytes, LPDWORD lpdwExclusionMask, const DWORD dwStringMask, LPVOID lpData, const DWORD dwDataLen) { FUNCTION("CApplicationManager::EnumDevices()");
HRESULT hResult = S_OK;
///////////////////////////////////////////////////////////////////////////////////////
try { DEVICE_RECORD sDeviceRecord = {0}; BOOL fFound; DWORD dwIndex, dwActualTargetIndex; DWORD dwKilobytes = 0;
//
// Make sure the string mask is good
//
if ((APP_PROPERTY_STR_ANSI != dwStringMask)&&(APP_PROPERTY_STR_UNICODE != dwStringMask)) { THROW(APPMAN_E_INVALIDPARAMETERS); }
//
// Check to make sure dwDataLen is greater than 0
//
if ((0 == dwDataLen)||(NULL == lpData)||(IsBadWritePtr(lpData, dwDataLen))) { THROW(APPMAN_E_INVALIDPARAMETERS); }
//
// Check to make sure lpdwKilobytes is valid
//
if ((NULL == lpdwKilobytes)||(IsBadWritePtr(lpdwKilobytes, sizeof(DWORD)))) { THROW(APPMAN_E_INVALIDPARAMETERS); }
//
// Check to make sure lpdwExclusionMask is valid
//
if ((NULL == lpdwExclusionMask)||(IsBadWritePtr(lpdwExclusionMask, sizeof(DWORD)))) { THROW(APPMAN_E_INVALIDPARAMETERS); }
//
// Get the nth device record.
//
fFound = FALSE; dwActualTargetIndex = dwTargetIndex; dwIndex = 0; do { if (S_OK == m_InformationManager.CheckDeviceExistance(dwIndex)) { if (dwActualTargetIndex == dwIndex) { hResult = m_InformationManager.GetDeviceInfoWithIndex(dwIndex, &sDeviceRecord); if (SUCCEEDED(hResult)) { hResult = m_InformationManager.GetDeviceMaximumSpaceWithIndex(dwIndex, &dwKilobytes); if (SUCCEEDED(hResult)) { fFound = TRUE; } } } } else { if (25 > dwActualTargetIndex) { dwActualTargetIndex++; } } dwIndex++; } while ((FALSE == fFound)&&(dwIndex <= dwActualTargetIndex)&&(SUCCEEDED(hResult)));
//
// Did we get the information we were looking for
//
if (TRUE == fFound) { //
// Get the Program files folder
//
CRegistryKey oRegistryKey; CHAR szProgramFiles[MAX_PATH]; DWORD dwSize, dwType;
if (SUCCEEDED(oRegistryKey.OpenKey(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion"), KEY_READ))) { dwSize = sizeof(szProgramFiles); if (SUCCEEDED(oRegistryKey.GetValue(TEXT("ProgramFilesDir"), &dwType, (LPBYTE) szProgramFiles, &dwSize))) { *lpdwKilobytes = dwKilobytes; *lpdwExclusionMask = sDeviceRecord.sDeviceInfo.dwApplicationCategoryExclusionMask; szProgramFiles[0] = ((CHAR) (sDeviceRecord.sDeviceInfo.dwDeviceIndex + 65)); strcat(szProgramFiles, "\\"); if (StrLenA(szProgramFiles) > dwDataLen) { THROW(APPMAN_E_OVERFLOW); } if (APP_PROPERTY_STR_ANSI == dwStringMask) { sprintf((LPSTR) lpData, "%s", szProgramFiles); } else { CWin32API oWin32API;
oWin32API.MultiByteToWideChar(szProgramFiles, MAX_PATH, (LPWSTR) lpData, dwDataLen); } } } } else { hResult = APPMAN_E_INVALIDINDEX; } }
///////////////////////////////////////////////////////////////////////////////////////
catch(CAppManExceptionHandler * pException) { hResult = pException->GetResultCode(); delete pException; }
catch(...) { hResult = E_UNEXPECTED; }
///////////////////////////////////////////////////////////////////////////////////////
return hResult; }
|