Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

536 lines
14 KiB

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1998.
//
// File: data.cpp
//
// Contents: Defines storage class that maintains data for snap-in nodes.
//
// Classes: CAppData
//
// History: 05-27-1997 stevebl Created
//
//---------------------------------------------------------------------------
#include "precomp.hxx"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CAppData::CAppData()
{
m_pDetails = NULL;
m_itemID = 0;
m_fVisible = 0;
m_fHide = FALSE;
m_pProduct = NULL;
m_pDeploy = NULL;
m_pCategory = NULL;
m_pXforms = NULL;
m_pPkgDetails = NULL;
m_pUpgradeList = NULL;
m_pErrorInfo = NULL;
m_pCause = NULL;
m_fRSoP = FALSE;
m_psd = NULL;
m_dwApplyCause = 0;
m_dwLanguageMatch = 0;
m_szOnDemandFileExtension = L"";
m_szOnDemandClsid = L"";
m_szOnDemandProgid = L"";
m_dwRemovalCause = 0;
m_dwRemovalType = 0;
m_szRemovingApplication = L"";
m_szEventSource = L"";
m_szEventLogName = L"";
m_dwEventID = 0;
m_szEventTime = L"";
m_szEventLogText = L"";
m_hrErrorCode = 0;
m_nStatus = 0;
}
CAppData::~CAppData()
{
if (m_pProduct)
{
m_pProduct->SendMessage(WM_USER_CLOSE, 0, 0);
}
if (m_pDeploy)
{
m_pDeploy->SendMessage(WM_USER_CLOSE, 0, 0);
}
if (m_pCategory)
{
m_pCategory->SendMessage(WM_USER_CLOSE, 0, 0);
}
if (m_pUpgradeList)
{
m_pUpgradeList->SendMessage(WM_USER_CLOSE, 0, 0);
}
if (m_pXforms)
{
m_pXforms->SendMessage(WM_USER_CLOSE, 0, 0);
}
if (m_pPkgDetails)
{
m_pPkgDetails->SendMessage(WM_USER_CLOSE, 0, 0);
}
if (m_pErrorInfo)
{
m_pErrorInfo->SendMessage(WM_USER_CLOSE, 0, 0);
}
}
void CAppData::NotifyChange(void)
{
if (m_pProduct)
{
m_pProduct->SendMessage(WM_USER_REFRESH, 0, 0);
}
if (m_pDeploy)
{
m_pDeploy->SendMessage(WM_USER_REFRESH, 0, 0);
}
if (m_pCategory)
{
m_pCategory->SendMessage(WM_USER_REFRESH, 0, 0);
}
if (m_pUpgradeList)
{
m_pUpgradeList->SendMessage(WM_USER_REFRESH, 0, 0);
}
if (m_pXforms)
{
m_pXforms->SendMessage(WM_USER_REFRESH, 0, 0);
}
if (m_pPkgDetails)
{
m_pPkgDetails->SendMessage(WM_USER_REFRESH, 0, 0);
}
if (m_pErrorInfo)
{
m_pErrorInfo->SendMessage(WM_USER_REFRESH, 0, 0);
}
}
void CAppData::InitializeExtraInfo(void)
{
// at the moment, there is no extra info
return;
}
void CAppData::GetSzPublisher(CString &sz)
{
sz = m_pDetails->pszPublisher;
}
void CAppData::GetSzOOSUninstall(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
sz.LoadString((m_pDetails->pInstallInfo->dwActFlags & ACTFLG_UninstallOnPolicyRemoval) ? IDS_YES : IDS_NO);
}
void CAppData::GetSzShowARP(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
sz.LoadString((m_pDetails->pInstallInfo->dwActFlags & ACTFLG_UserInstall) ? IDS_YES : IDS_NO);
}
void CAppData::GetSzUIType(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
sz.LoadString((m_pDetails->pInstallInfo->InstallUiLevel == INSTALLUILEVEL_FULL) ? IDS_MAXIMUM : IDS_BASIC);
}
void CAppData::GetSzIgnoreLoc(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
sz.LoadString((m_pDetails->pInstallInfo->dwActFlags & ACTFLG_IgnoreLanguage) ? IDS_YES : IDS_NO);
}
void CAppData::GetSzRemovePrev(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
sz.LoadString((m_pDetails->pInstallInfo->dwActFlags & ACTFLG_UninstallUnmanaged) ? IDS_YES : IDS_NO);
}
void CAppData::GetSzX86OnWin64(CString &sz)
{
BOOL fYes = 0;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//
// Check this only for 32-bit apps
//
if ( ! Is64Bit() )
{
fYes = 0 != (m_pDetails->pInstallInfo->dwActFlags & ACTFLG_ExcludeX86OnWin64);
}
if ( ! Is64Bit() )
{
if (m_pDetails->pInstallInfo->PathType == SetupNamePath)
{
//reverse the sense for legacy apps
// (this flag has the opposite meaning for legacy apps)
fYes = !fYes;
}
}
sz.LoadString(fYes ? IDS_YES : IDS_NO);
}
void CAppData::GetSzFullInstall(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (m_pDetails->pInstallInfo->dwActFlags & ACTFLG_Assigned)
{
sz.LoadString((m_pDetails->pInstallInfo->dwActFlags & ACTFLG_InstallUserAssign) ? IDS_YES : IDS_NO);
}
else
{
sz.LoadString(IDS_NA);
}
}
void CAppData::GetSzProductCode(CString &sz)
{
// szA = dataA.m_pDetails->pInstallInfo->ProductCode
OLECHAR szTemp[80];
StringFromGUID2(m_pDetails->pInstallInfo->ProductCode,
szTemp,
sizeof(szTemp) / sizeof(szTemp[0]));
sz = szTemp;
}
void CAppData::GetSzOrigin(CString &sz)
{
sz = m_szGPOName;
}
void CAppData::GetSzSOM(CString &sz)
{
sz = m_szSOMID;
}
void CAppData::GetSzDeployment(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
int id;
if (m_pDetails->pInstallInfo->dwActFlags & ACTFLG_Assigned)
id = IDS_ASSIGNED;
else
if (m_pDetails->pInstallInfo->dwActFlags & ACTFLG_Published)
id = IDS_PUBLISHED;
else
id = IDS_DISABLED;
sz.LoadString(id);
}
void CAppData::GetSzAutoInstall(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
sz.LoadString((m_pDetails->pInstallInfo->dwActFlags & ACTFLG_OnDemandInstall) ? IDS_YES : IDS_NO);
}
void CAppData::GetSzLocale(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
TCHAR szBuffer[256];
sz = "";
UINT i = 0;
while (i < m_pDetails->pPlatformInfo->cLocales)
{
if (i > 0)
{
sz += ", ";
}
if (m_pDetails->pPlatformInfo->prgLocale[i])
{
GetLocaleInfo(m_pDetails->pPlatformInfo->prgLocale[i], LOCALE_SLANGUAGE, szBuffer, 256);
sz += szBuffer;
#ifdef SHOWCOUNTRY
GetLocaleInfo(m_pDetails->pPlatformInfo->prgLocale[i], LOCALE_SCOUNTRY, szBuffer, 256);
sz += _T(" - ");
sz += szBuffer;
#endif
}
else
{
// neutral locale
CString szNeutral;
szNeutral.LoadString(IDS_NEUTRAL_LOCALE);
sz += szNeutral;
}
i++;
}
}
void CAppData::GetSzPlatform(CString &sz)
{
TCHAR szBuffer[256];
sz = "";
UINT i = 0;
while (i < m_pDetails->pPlatformInfo->cPlatforms)
{
if (i > 0)
{
sz += ", ";
}
::LoadString(ghInstance, IDS_HW + m_pDetails->pPlatformInfo->prgPlatform[i].dwProcessorArch, szBuffer, 256);
sz += szBuffer;
i++;
}
}
void CAppData::GetSzUpgrades(CString &sz, CScopePane * pScopePane)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (!m_szUpgrades.IsEmpty())
{
sz = m_szUpgrades;
return;
}
if (m_fRSoP)
{
switch (m_setUpgrade.size() + m_setReplace.size())
{
case 0:
sz.LoadString(IDS_NONE);
break;
case 1:
if (1 == m_setUpgrade.size())
{
sz = *m_setUpgrade.begin();
}
else
{
sz = *m_setReplace.begin();
}
break;
default:
sz.LoadString(IDS_MULTIPLE);
break;
}
}
else
{
sz="";
CString szName;
UINT n = m_pDetails->pInstallInfo->cUpgrades;
while (n--)
{
if (0 == (UPGFLG_UpgradedBy & m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag))
{
HRESULT hr = pScopePane->GetPackageNameFromUpgradeInfo(szName, m_pDetails->pInstallInfo->prgUpgradeInfoList[n].PackageGuid, m_pDetails->pInstallInfo->prgUpgradeInfoList[n].szClassStore);
if (SUCCEEDED(hr))
{
if (sz.GetLength())
{
// We'd already found one
sz.LoadString(IDS_MULTIPLE);
m_szUpgrades = sz;
return;
}
sz = szName;
}
}
}
if (0 == sz.GetLength())
{
sz.LoadString(IDS_NONE);
}
}
m_szUpgrades = sz;
}
void CAppData::GetSzUpgradedBy(CString &sz, CScopePane * pScopePane)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (m_fRSoP)
{
switch (m_setUpgradedBy.size())
{
case 0:
sz.LoadString(IDS_NONE);
break;
case 1:
sz = *m_setUpgradedBy.begin();
break;
default:
sz.LoadString(IDS_MULTIPLE);
break;
}
}
else
{
UINT n = m_pDetails->pInstallInfo->cUpgrades;
CString szName;
sz="";
while (n--)
{
if (0 != (UPGFLG_UpgradedBy & m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag))
{
HRESULT hr = pScopePane->GetPackageNameFromUpgradeInfo(szName, m_pDetails->pInstallInfo->prgUpgradeInfoList[n].PackageGuid, m_pDetails->pInstallInfo->prgUpgradeInfoList[n].szClassStore);
if (SUCCEEDED(hr))
{
if (sz.GetLength())
{
// We'd already found one
sz.LoadString(IDS_MULTIPLE);
return;
}
sz = szName;
}
}
}
if (0 == sz.GetLength())
{
sz.LoadString(IDS_NONE);
}
}
}
void CAppData::GetSzStage(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
BOOL fUpgrades = FALSE;
if (m_fRSoP)
{
fUpgrades = (m_setUpgrade.size() + m_setReplace.size()) != 0;
}
else
{
UINT n = m_pDetails->pInstallInfo->cUpgrades;
while (n-- && !fUpgrades)
{
if (0 == (UPGFLG_UpgradedBy & m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag))
{
fUpgrades = TRUE;
}
}
}
if (!fUpgrades)
{
sz.LoadString(IDS_NONE);
}
else
if (ACTFLG_ForceUpgrade & m_pDetails->pInstallInfo->dwActFlags)
sz.LoadString(IDS_REQUIRED);
else
sz.LoadString(IDS_OPTIONAL);
}
void CAppData::GetSzVersion(CString &sz)
{
TCHAR szBuffer[256];
(void) StringCchPrintf(szBuffer,
sizeof(szBuffer)/sizeof(szBuffer[0]),
_T("%u.%u"),
m_pDetails->pInstallInfo->dwVersionHi,
m_pDetails->pInstallInfo->dwVersionLo);
sz = szBuffer;
}
void CAppData::GetSzSource(CString &sz)
{
if (1 <= m_pDetails->cSources)
{
sz = m_pDetails->pszSourceList[0];
}
else
sz = "";
}
void CAppData::GetSzMods(CString &sz)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (2 < m_pDetails->cSources)
{
sz.LoadString(IDS_MULTIPLE);
}
else
{
if (2 == m_pDetails->cSources)
{
sz = m_pDetails->pszSourceList[1];
}
else
sz = "";
}
}
int CAppData::GetImageIndex(CScopePane * pScopePane)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (m_nStatus == 3)
{
// RSoP setting failed status
return IMG_OPEN_FAILED;
}
CString sz;
GetSzUpgrades(sz, pScopePane);
CString sz2;
sz2.LoadString(IDS_NONE);
// gonna use the upgrade icon but it's only gonna be used when
// m_szUpgrades doesn't read "none"
if (0 != sz2.Compare(sz))
{
// we must be upgrading something
return IMG_UPGRADE;
}
if (m_pDetails->pInstallInfo->dwActFlags & ACTFLG_Assigned)
return IMG_ASSIGNED;
else
if (m_pDetails->pInstallInfo->dwActFlags & ACTFLG_Published)
return IMG_PUBLISHED;
else
return IMG_DISABLED;
}
DWORD CAppData::Get64BitMsiArchFlags( PACKAGEDETAIL* pPackageDetails )
{
UINT n = pPackageDetails->pPlatformInfo->cPlatforms;
while (n--)
{
if (pPackageDetails->pPlatformInfo->prgPlatform[n].dwProcessorArch == PROCESSOR_ARCHITECTURE_AMD64)
{
return MSIARCHITECTUREFLAGS_AMD64;
}
if (pPackageDetails->pPlatformInfo->prgPlatform[n].dwProcessorArch == PROCESSOR_ARCHITECTURE_IA64)
{
return MSIARCHITECTUREFLAGS_IA64;
}
}
return 0;
}
BOOL CAppData::Is64Bit( PACKAGEDETAIL* pPackageDetails )
{
UINT n = pPackageDetails->pPlatformInfo->cPlatforms;
while (n--)
{
if ((pPackageDetails->pPlatformInfo->prgPlatform[n].dwProcessorArch == PROCESSOR_ARCHITECTURE_AMD64) ||
(pPackageDetails->pPlatformInfo->prgPlatform[n].dwProcessorArch == PROCESSOR_ARCHITECTURE_IA64))
{
return TRUE;
}
}
return FALSE;
}
BOOL CAppData::Is64Bit(void)
{
return Is64Bit( m_pDetails );
}