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.
 
 
 
 
 
 

562 lines
19 KiB

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1998.
//
// File: UpList.cpp
//
// Contents: upgrade realationships property sheet
//
// Classes: CUpgradeList
//
// History: 03-14-1998 stevebl Commented
//
//---------------------------------------------------------------------------
#include "precomp.hxx"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// uncomment the following line to allow double clicking on a list box to
// launch a property sheet for the the thing you've double clicked on
// #define DOUBLECLICKLAUNCH 1
/////////////////////////////////////////////////////////////////////////////
// CUpgradeList property page
IMPLEMENT_DYNCREATE(CUpgradeList, CPropertyPage)
CUpgradeList::CUpgradeList() : CPropertyPage(CUpgradeList::IDD)
{
//{{AFX_DATA_INIT(CUpgradeList)
m_fForceUpgrade = FALSE;
//}}AFX_DATA_INIT
m_ppThis = NULL;
m_fModified = FALSE;
m_pIClassAdmin = NULL;
m_fPreDeploy = FALSE;
}
CUpgradeList::~CUpgradeList()
{
if (m_ppThis)
{
*m_ppThis = NULL;
}
if (m_pIClassAdmin)
{
m_pIClassAdmin->Release();
}
}
void CUpgradeList::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CUpgradeList)
DDX_Control(pDX, IDC_LIST2, m_UpgradedBy);
DDX_Control(pDX, IDC_LIST1, m_Upgrades);
DDX_Check(pDX, IDC_CHECK1, m_fForceUpgrade);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CUpgradeList, CPropertyPage)
//{{AFX_MSG_MAP(CUpgradeList)
ON_LBN_DBLCLK(IDC_LIST1, OnDblclkList1)
ON_LBN_DBLCLK(IDC_LIST2, OnDblclkList2)
ON_BN_CLICKED(IDC_CHECK1, OnRequire)
ON_BN_CLICKED(IDC_BUTTON1, OnAdd)
ON_BN_CLICKED(IDC_BUTTON3, OnRemove)
ON_BN_CLICKED(IDC_BUTTON2, OnEdit)
ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
ON_WM_CONTEXTMENU()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CUpgradeList message handlers
LRESULT CUpgradeList::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_HELP:
StandardHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, IDD);
return 0;
case WM_USER_REFRESH:
RefreshData();
return 0;
case WM_USER_CLOSE:
m_dlgAdd.EndDialog(IDCANCEL);
return GetOwner()->SendMessage(WM_CLOSE);
default:
return CPropertyPage::WindowProc(message, wParam, lParam);
}
}
BOOL CUpgradeList::OnInitDialog()
{
m_dlgAdd.m_pUpgradeList = &m_UpgradeList;
m_dlgAdd.m_pScope = m_pScopePane;
m_fForceUpgrade = (0 != (m_pData->m_pDetails->pInstallInfo->dwActFlags & ACTFLG_ForceUpgrade));
if (m_fMachine)
{
GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);
}
if (m_fRSOP)
{
CString szText;
szText.LoadString(IDS_RSOPUPGRADEDTEXT);
SetDlgItemText(IDC_STATIC1, szText);
}
CPropertyPage::OnInitDialog();
RefreshData();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CUpgradeList::RefreshData()
{
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
CString szUpgrade;
CString szReplace;
szUpgrade.LoadString(IDS_UPGRADE);
szReplace.LoadString(IDS_REPLACE);
m_Upgrades.ResetContent();
m_Upgrades.SetHorizontalExtent(0);
m_UpgradedBy.ResetContent();
m_UpgradedBy.SetHorizontalExtent(0);
m_UpgradeList.erase(m_UpgradeList.begin(), m_UpgradeList.end());
m_NameIndex.erase(m_NameIndex.begin(), m_NameIndex.end());
// populate m_Upgrades and m_UpgradedBy
if (m_fRSOP)
{
// disable EVERYTHING
GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
// populate the upgrade lists using the RSOP data
set <CString>::iterator i;
i = m_pData->m_setUpgradedBy.begin();
while (i != m_pData->m_setUpgradedBy.end())
{
m_UpgradedBy.AddString(*i);
CDC * pDC = m_UpgradedBy.GetDC();
CSize size = pDC->GetTextExtent(*i);
pDC->LPtoDP(&size);
m_UpgradedBy.ReleaseDC(pDC);
if (m_UpgradedBy.GetHorizontalExtent() < size.cx)
{
m_UpgradedBy.SetHorizontalExtent(size.cx);
}
i++;
}
i = m_pData->m_setUpgrade.begin();
while (i != m_pData->m_setUpgrade.end())
{
CString sz;
sz = szUpgrade;
sz += L'\t';
sz += *i;
m_Upgrades.AddString(sz);
CDC * pDC = m_Upgrades.GetDC();
CSize size = pDC->GetTextExtent(*i);
pDC->LPtoDP(&size);
m_Upgrades.ReleaseDC(pDC);
if (m_Upgrades.GetHorizontalExtent() < size.cx)
{
m_Upgrades.SetHorizontalExtent(size.cx);
}
i++;
}
i = m_pData->m_setReplace.begin();
while (i != m_pData->m_setReplace.end())
{
CString sz;
sz = szReplace;
sz += L'\t';
sz += *i;
m_Upgrades.AddString(sz);
CDC * pDC = m_Upgrades.GetDC();
CSize size = pDC->GetTextExtent(*i);
pDC->LPtoDP(&size);
m_Upgrades.ReleaseDC(pDC);
if (m_Upgrades.GetHorizontalExtent() < size.cx)
{
m_Upgrades.SetHorizontalExtent(size.cx);
}
i++;
}
}
else
{
UINT n = m_pData->m_pDetails->pInstallInfo->cUpgrades;
while (n--)
{
CString szPackageName;
CUpgradeData data;
memcpy(&data.m_PackageGuid, &m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].PackageGuid, sizeof(GUID));
data.m_szClassStore = m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].szClassStore;
data.m_flags = m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag;
HRESULT hr = m_pScopePane->GetPackageNameFromUpgradeInfo(szPackageName, data.m_PackageGuid, (LPOLESTR)((LPCWSTR)data.m_szClassStore));
if (SUCCEEDED(hr))
{
// found a match
if (0 != (UPGFLG_UpgradedBy & data.m_flags))
{
m_UpgradedBy.AddString(szPackageName);
CDC * pDC = m_UpgradedBy.GetDC();
CSize size = pDC->GetTextExtent(szPackageName);
pDC->LPtoDP(&size);
m_UpgradedBy.ReleaseDC(pDC);
if (m_UpgradedBy.GetHorizontalExtent() < size.cx)
{
m_UpgradedBy.SetHorizontalExtent(size.cx);
}
}
else
{
CString sz = UPGFLG_Uninstall == m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag ? szReplace : szUpgrade;
sz += L'\t';
sz += szPackageName;
m_Upgrades.AddString(sz);
CDC * pDC = m_Upgrades.GetDC();
CSize size = pDC->GetTextExtent(sz);
pDC->LPtoDP(&size);
m_Upgrades.ReleaseDC(pDC);
if (m_Upgrades.GetHorizontalExtent() < size.cx)
{
m_Upgrades.SetHorizontalExtent(size.cx);
}
CString szIndex = GetUpgradeIndex(data.m_PackageGuid);
m_UpgradeList[szIndex] = data;
m_NameIndex[sz] = szIndex;
}
}
}
}
}
void CUpgradeList::OnDblclkList1()
{
#if DOUBLECLICKLAUNCH
int i = m_Upgrades.GetCurSel();
if (i != LB_ERR)
{
CString sz;
m_Upgrades.GetText(i, sz);
m_pScopePane->DisplayPropSheet(sz, 2);
}
#endif
}
void CUpgradeList::OnDblclkList2()
{
#if DOUBLECLICKLAUNCH
int i = m_UpgradedBy.GetCurSel();
if (i != LB_ERR)
{
CString sz;
m_UpgradedBy.GetText(i, sz);
m_pScopePane->DisplayPropSheet(sz, 2);
}
#endif
}
void CUpgradeList::OnRequire()
{
if (!m_fPreDeploy)
SetModified();
m_fModified = TRUE;
}
void CUpgradeList::OnAdd()
{
CString szUpgrade;
CString szReplace;
szUpgrade.LoadString(IDS_UPGRADE);
szReplace.LoadString(IDS_REPLACE);
m_dlgAdd.m_szMyGuid = GetUpgradeIndex(m_pData->m_pDetails->pInstallInfo->PackageGuid);
if (IDOK == m_dlgAdd.DoModal())
{
CString szIndex = GetUpgradeIndex(m_dlgAdd.m_UpgradeData.m_PackageGuid);
if (IsUpgradeLegal(szIndex))
{
// add the chosen app
m_UpgradeList[szIndex] = m_dlgAdd.m_UpgradeData;
// m_dlgAdd.m_fUninstall ? UPGFLG_Uninstall : UPGFLG_NoUninstall;
CString sz = 0 != (m_dlgAdd.m_UpgradeData.m_flags & UPGFLG_Uninstall) ? szReplace : szUpgrade;
sz += L'\t';
sz += m_dlgAdd.m_szPackageName;
m_Upgrades.AddString(sz);
CDC * pDC = m_Upgrades.GetDC();
CSize size = pDC->GetTextExtent(sz);
pDC->LPtoDP(&size);
m_Upgrades.ReleaseDC(pDC);
if (m_Upgrades.GetHorizontalExtent() < size.cx)
{
m_Upgrades.SetHorizontalExtent(size.cx);
}
m_NameIndex[sz] = szIndex;
if (!m_fPreDeploy)
SetModified();
m_fModified = TRUE;
}
else
{
CString szText;
szText.LoadString(IDS_INVALIDUPGRADE);
MessageBox(szText, m_dlgAdd.m_szPackageName, MB_ICONEXCLAMATION | MB_OK);
}
}
}
BOOL CUpgradeList::IsUpgradeLegal(CString sz)
{
// for now I'll just check to make sure that this guy isn't upgrading me
CString sz2;
UINT n = m_pData->m_pDetails->pInstallInfo->cUpgrades;
while (n--)
{
if (0 != (UPGFLG_UpgradedBy & m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag))
{
sz2 = GetUpgradeIndex(m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].PackageGuid);
if (0 == sz.CompareNoCase(sz2))
return FALSE;
}
}
return TRUE;
}
void CUpgradeList::OnSelchangeList1()
{
int iSel = m_Upgrades.GetCurSel();
if (iSel != LB_ERR)
{
CString sz;
m_Upgrades.GetText(iSel, sz);
}
GetDlgItem(IDC_BUTTON3)->EnableWindow( !m_fRSOP );
}
void CUpgradeList::OnRemove()
{
int iSel = m_Upgrades.GetCurSel();
if (iSel != LB_ERR)
{
CString sz;
m_Upgrades.GetText(iSel, sz);
// check to be sure app does not have UPGFLG_Enforced
m_UpgradeList.erase(m_NameIndex[sz]);
m_NameIndex.erase(sz);
m_Upgrades.DeleteString(iSel);
if (!m_fPreDeploy)
SetModified();
m_fModified = TRUE;
if (GetDlgItem(IDC_BUTTON3) == GetFocus())
{
GetParent()->GetDlgItem(IDOK)->SetFocus();
}
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
}
}
void CUpgradeList::OnEdit()
{
// TODO: Add your control notification handler code here
}
BOOL CUpgradeList::OnApply()
{
if (m_fModified)
{
// Set the new upgrade list and flags
DWORD dwActFlags = m_pData->m_pDetails->pInstallInfo->dwActFlags;
if (m_fForceUpgrade)
dwActFlags |= ACTFLG_ForceUpgrade;
else
dwActFlags &= ~ACTFLG_ForceUpgrade;
// Pilot flag stuff is for backward compatability - it will
// eventually be yanked.
UINT n = m_UpgradeList.size();
if (n)
{
if (m_fForceUpgrade)
dwActFlags &= ~ACTFLG_Pilot;
else
dwActFlags |= ACTFLG_Pilot;
}
else
{
// no upgrades left in the list - remove the pilot flag just
// to be safe
dwActFlags &= ~ACTFLG_Pilot;
}
// count the "upgraded by" elements
UINT n2 = m_pData->m_pDetails->pInstallInfo->cUpgrades;
while (n2--)
{
if (0 != (UPGFLG_UpgradedBy & m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].Flag))
{
n++;
}
}
UINT cUpgrades = n;
UPGRADEINFO * prgUpgradeInfoList = NULL;
if (n)
{
prgUpgradeInfoList = (UPGRADEINFO *) OLEALLOC(sizeof(UPGRADEINFO) * n);
if (prgUpgradeInfoList)
{
n = 0;
// add the "upgraded by" elements
n2 = m_pData->m_pDetails->pInstallInfo->cUpgrades;
while (n2--)
{
if (0 != (UPGFLG_UpgradedBy & m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].Flag))
{
prgUpgradeInfoList[n].Flag = m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].Flag;
OLESAFE_COPYSTRING(prgUpgradeInfoList[n].szClassStore, m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].szClassStore);
memcpy(&prgUpgradeInfoList[n].PackageGuid, &m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].PackageGuid, sizeof(GUID));
n++;
}
}
// add the "upgrading" elements
map <CString, CUpgradeData>::iterator i;
for (i = m_UpgradeList.begin(); i != m_UpgradeList.end(); i++)
{
prgUpgradeInfoList[n].Flag = i->second.m_flags;
OLESAFE_COPYSTRING(prgUpgradeInfoList[n].szClassStore, i->second.m_szClassStore);
memcpy(&prgUpgradeInfoList[n].PackageGuid, &i->second.m_PackageGuid, sizeof(GUID));
n++;
}
}
else
{
// out of memory
HRESULT hr = E_OUTOFMEMORY;
CString sz;
sz.LoadString(IDS_CHANGEFAILED);
ReportGeneralPropertySheetError(m_hWnd, sz, hr);
return FALSE;
}
}
HRESULT hr = E_FAIL;
if (m_pIClassAdmin)
{
hr = m_pIClassAdmin->ChangePackageProperties(m_pData->m_pDetails->pszPackageName,
NULL,
&dwActFlags,
NULL,
NULL,
NULL,
NULL);
}
if (SUCCEEDED(hr))
{
hr = m_pIClassAdmin->ChangePackageUpgradeList(m_pData->m_pDetails->pszPackageName,
cUpgrades,
prgUpgradeInfoList);
if (SUCCEEDED(hr))
{
m_pScopePane->RemoveExtensionEntry(m_cookie, *m_pData);
m_pScopePane->RemoveUpgradeEntry(m_cookie, *m_pData);
n = m_pData->m_pDetails->pInstallInfo->cUpgrades;
if (n)
{
while (n--)
{
OLESAFE_DELETE(m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].szClassStore);
}
OLESAFE_DELETE(m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList);
}
m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList = prgUpgradeInfoList;
m_pData->m_pDetails->pInstallInfo->cUpgrades = cUpgrades;
m_pData->m_pDetails->pInstallInfo->dwActFlags = dwActFlags;
m_pScopePane->InsertExtensionEntry(m_cookie, *m_pData);
m_pScopePane->InsertUpgradeEntry(m_cookie, *m_pData);
if (m_pScopePane->m_pFileExt)
{
m_pScopePane->m_pFileExt->SendMessage(WM_USER_REFRESH, 0, 0);
}
m_pData->m_szUpgrades.Empty(); // Clear the cached
// upgrade relation
// string so it will be
// refreshed.
m_fModified = FALSE;
if (!m_fPreDeploy)
{
MMCPropertyChangeNotify(m_hConsoleHandle, m_cookie);
}
m_fModified = FALSE;
}
else
{
DebugMsg((DM_WARNING, TEXT("ChangePackageUpgradeList failed with 0x%x"), hr));
// Put back the original flags if for some reason we were
// able to change the flags but unable to change the upgrade
// list.
m_pIClassAdmin->ChangePackageProperties(m_pData->m_pDetails->pszPackageName,
NULL,
&m_pData->m_pDetails->pInstallInfo->dwActFlags,
NULL,
NULL,
NULL,
NULL);
// Note that if this fails there's little we could do to
// recover so I just assume it succeeds.
}
}
else
{
DebugMsg((DM_WARNING, TEXT("ChangePackageProperties failed with 0x%x"), hr));
}
if (FAILED(hr))
{
CString sz;
sz.LoadString(IDS_CHANGEFAILED);
ReportGeneralPropertySheetError(m_hWnd, sz, hr);
n = cUpgrades;
if (n)
{
while (n--)
{
OLESAFE_DELETE(prgUpgradeInfoList[n].szClassStore);
}
OLESAFE_DELETE(prgUpgradeInfoList);
}
return FALSE;
}
}
return CPropertyPage::OnApply();
}
void CUpgradeList::OnContextMenu(CWnd* pWnd, CPoint point)
{
StandardContextMenu(pWnd->m_hWnd, IDD_UPGRADES);
}