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

  1. //+--------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1994 - 1998.
  5. //
  6. // File: UpList.cpp
  7. //
  8. // Contents: upgrade realationships property sheet
  9. //
  10. // Classes: CUpgradeList
  11. //
  12. // History: 03-14-1998 stevebl Commented
  13. //
  14. //---------------------------------------------------------------------------
  15. #include "precomp.hxx"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. // uncomment the following line to allow double clicking on a list box to
  22. // launch a property sheet for the the thing you've double clicked on
  23. // #define DOUBLECLICKLAUNCH 1
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CUpgradeList property page
  26. IMPLEMENT_DYNCREATE(CUpgradeList, CPropertyPage)
  27. CUpgradeList::CUpgradeList() : CPropertyPage(CUpgradeList::IDD)
  28. {
  29. //{{AFX_DATA_INIT(CUpgradeList)
  30. m_fForceUpgrade = FALSE;
  31. //}}AFX_DATA_INIT
  32. m_ppThis = NULL;
  33. m_fModified = FALSE;
  34. m_pIClassAdmin = NULL;
  35. m_fPreDeploy = FALSE;
  36. }
  37. CUpgradeList::~CUpgradeList()
  38. {
  39. if (m_ppThis)
  40. {
  41. *m_ppThis = NULL;
  42. }
  43. if (m_pIClassAdmin)
  44. {
  45. m_pIClassAdmin->Release();
  46. }
  47. }
  48. void CUpgradeList::DoDataExchange(CDataExchange* pDX)
  49. {
  50. CPropertyPage::DoDataExchange(pDX);
  51. //{{AFX_DATA_MAP(CUpgradeList)
  52. DDX_Control(pDX, IDC_LIST2, m_UpgradedBy);
  53. DDX_Control(pDX, IDC_LIST1, m_Upgrades);
  54. DDX_Check(pDX, IDC_CHECK1, m_fForceUpgrade);
  55. //}}AFX_DATA_MAP
  56. }
  57. BEGIN_MESSAGE_MAP(CUpgradeList, CPropertyPage)
  58. //{{AFX_MSG_MAP(CUpgradeList)
  59. ON_LBN_DBLCLK(IDC_LIST1, OnDblclkList1)
  60. ON_LBN_DBLCLK(IDC_LIST2, OnDblclkList2)
  61. ON_BN_CLICKED(IDC_CHECK1, OnRequire)
  62. ON_BN_CLICKED(IDC_BUTTON1, OnAdd)
  63. ON_BN_CLICKED(IDC_BUTTON3, OnRemove)
  64. ON_BN_CLICKED(IDC_BUTTON2, OnEdit)
  65. ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1)
  66. ON_WM_CONTEXTMENU()
  67. //}}AFX_MSG_MAP
  68. END_MESSAGE_MAP()
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CUpgradeList message handlers
  71. LRESULT CUpgradeList::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  72. {
  73. switch (message)
  74. {
  75. case WM_HELP:
  76. StandardHelp((HWND)((LPHELPINFO) lParam)->hItemHandle, IDD);
  77. return 0;
  78. case WM_USER_REFRESH:
  79. RefreshData();
  80. return 0;
  81. case WM_USER_CLOSE:
  82. m_dlgAdd.EndDialog(IDCANCEL);
  83. return GetOwner()->SendMessage(WM_CLOSE);
  84. default:
  85. return CPropertyPage::WindowProc(message, wParam, lParam);
  86. }
  87. }
  88. BOOL CUpgradeList::OnInitDialog()
  89. {
  90. m_dlgAdd.m_pUpgradeList = &m_UpgradeList;
  91. m_dlgAdd.m_pScope = m_pScopePane;
  92. m_fForceUpgrade = (0 != (m_pData->m_pDetails->pInstallInfo->dwActFlags & ACTFLG_ForceUpgrade));
  93. if (m_fMachine)
  94. {
  95. GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);
  96. }
  97. if (m_fRSOP)
  98. {
  99. CString szText;
  100. szText.LoadString(IDS_RSOPUPGRADEDTEXT);
  101. SetDlgItemText(IDC_STATIC1, szText);
  102. }
  103. CPropertyPage::OnInitDialog();
  104. RefreshData();
  105. return TRUE; // return TRUE unless you set the focus to a control
  106. // EXCEPTION: OCX Property Pages should return FALSE
  107. }
  108. void CUpgradeList::RefreshData()
  109. {
  110. GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
  111. CString szUpgrade;
  112. CString szReplace;
  113. szUpgrade.LoadString(IDS_UPGRADE);
  114. szReplace.LoadString(IDS_REPLACE);
  115. m_Upgrades.ResetContent();
  116. m_Upgrades.SetHorizontalExtent(0);
  117. m_UpgradedBy.ResetContent();
  118. m_UpgradedBy.SetHorizontalExtent(0);
  119. m_UpgradeList.erase(m_UpgradeList.begin(), m_UpgradeList.end());
  120. m_NameIndex.erase(m_NameIndex.begin(), m_NameIndex.end());
  121. // populate m_Upgrades and m_UpgradedBy
  122. if (m_fRSOP)
  123. {
  124. // disable EVERYTHING
  125. GetDlgItem(IDC_CHECK1)->EnableWindow(FALSE);
  126. GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
  127. GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
  128. // populate the upgrade lists using the RSOP data
  129. set <CString>::iterator i;
  130. i = m_pData->m_setUpgradedBy.begin();
  131. while (i != m_pData->m_setUpgradedBy.end())
  132. {
  133. m_UpgradedBy.AddString(*i);
  134. CDC * pDC = m_UpgradedBy.GetDC();
  135. CSize size = pDC->GetTextExtent(*i);
  136. pDC->LPtoDP(&size);
  137. m_UpgradedBy.ReleaseDC(pDC);
  138. if (m_UpgradedBy.GetHorizontalExtent() < size.cx)
  139. {
  140. m_UpgradedBy.SetHorizontalExtent(size.cx);
  141. }
  142. i++;
  143. }
  144. i = m_pData->m_setUpgrade.begin();
  145. while (i != m_pData->m_setUpgrade.end())
  146. {
  147. CString sz;
  148. sz = szUpgrade;
  149. sz += L'\t';
  150. sz += *i;
  151. m_Upgrades.AddString(sz);
  152. CDC * pDC = m_Upgrades.GetDC();
  153. CSize size = pDC->GetTextExtent(*i);
  154. pDC->LPtoDP(&size);
  155. m_Upgrades.ReleaseDC(pDC);
  156. if (m_Upgrades.GetHorizontalExtent() < size.cx)
  157. {
  158. m_Upgrades.SetHorizontalExtent(size.cx);
  159. }
  160. i++;
  161. }
  162. i = m_pData->m_setReplace.begin();
  163. while (i != m_pData->m_setReplace.end())
  164. {
  165. CString sz;
  166. sz = szReplace;
  167. sz += L'\t';
  168. sz += *i;
  169. m_Upgrades.AddString(sz);
  170. CDC * pDC = m_Upgrades.GetDC();
  171. CSize size = pDC->GetTextExtent(*i);
  172. pDC->LPtoDP(&size);
  173. m_Upgrades.ReleaseDC(pDC);
  174. if (m_Upgrades.GetHorizontalExtent() < size.cx)
  175. {
  176. m_Upgrades.SetHorizontalExtent(size.cx);
  177. }
  178. i++;
  179. }
  180. }
  181. else
  182. {
  183. UINT n = m_pData->m_pDetails->pInstallInfo->cUpgrades;
  184. while (n--)
  185. {
  186. CString szPackageName;
  187. CUpgradeData data;
  188. memcpy(&data.m_PackageGuid, &m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].PackageGuid, sizeof(GUID));
  189. data.m_szClassStore = m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].szClassStore;
  190. data.m_flags = m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag;
  191. HRESULT hr = m_pScopePane->GetPackageNameFromUpgradeInfo(szPackageName, data.m_PackageGuid, (LPOLESTR)((LPCWSTR)data.m_szClassStore));
  192. if (SUCCEEDED(hr))
  193. {
  194. // found a match
  195. if (0 != (UPGFLG_UpgradedBy & data.m_flags))
  196. {
  197. m_UpgradedBy.AddString(szPackageName);
  198. CDC * pDC = m_UpgradedBy.GetDC();
  199. CSize size = pDC->GetTextExtent(szPackageName);
  200. pDC->LPtoDP(&size);
  201. m_UpgradedBy.ReleaseDC(pDC);
  202. if (m_UpgradedBy.GetHorizontalExtent() < size.cx)
  203. {
  204. m_UpgradedBy.SetHorizontalExtent(size.cx);
  205. }
  206. }
  207. else
  208. {
  209. CString sz = UPGFLG_Uninstall == m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag ? szReplace : szUpgrade;
  210. sz += L'\t';
  211. sz += szPackageName;
  212. m_Upgrades.AddString(sz);
  213. CDC * pDC = m_Upgrades.GetDC();
  214. CSize size = pDC->GetTextExtent(sz);
  215. pDC->LPtoDP(&size);
  216. m_Upgrades.ReleaseDC(pDC);
  217. if (m_Upgrades.GetHorizontalExtent() < size.cx)
  218. {
  219. m_Upgrades.SetHorizontalExtent(size.cx);
  220. }
  221. CString szIndex = GetUpgradeIndex(data.m_PackageGuid);
  222. m_UpgradeList[szIndex] = data;
  223. m_NameIndex[sz] = szIndex;
  224. }
  225. }
  226. }
  227. }
  228. }
  229. void CUpgradeList::OnDblclkList1()
  230. {
  231. #if DOUBLECLICKLAUNCH
  232. int i = m_Upgrades.GetCurSel();
  233. if (i != LB_ERR)
  234. {
  235. CString sz;
  236. m_Upgrades.GetText(i, sz);
  237. m_pScopePane->DisplayPropSheet(sz, 2);
  238. }
  239. #endif
  240. }
  241. void CUpgradeList::OnDblclkList2()
  242. {
  243. #if DOUBLECLICKLAUNCH
  244. int i = m_UpgradedBy.GetCurSel();
  245. if (i != LB_ERR)
  246. {
  247. CString sz;
  248. m_UpgradedBy.GetText(i, sz);
  249. m_pScopePane->DisplayPropSheet(sz, 2);
  250. }
  251. #endif
  252. }
  253. void CUpgradeList::OnRequire()
  254. {
  255. if (!m_fPreDeploy)
  256. SetModified();
  257. m_fModified = TRUE;
  258. }
  259. void CUpgradeList::OnAdd()
  260. {
  261. CString szUpgrade;
  262. CString szReplace;
  263. szUpgrade.LoadString(IDS_UPGRADE);
  264. szReplace.LoadString(IDS_REPLACE);
  265. m_dlgAdd.m_szMyGuid = GetUpgradeIndex(m_pData->m_pDetails->pInstallInfo->PackageGuid);
  266. if (IDOK == m_dlgAdd.DoModal())
  267. {
  268. CString szIndex = GetUpgradeIndex(m_dlgAdd.m_UpgradeData.m_PackageGuid);
  269. if (IsUpgradeLegal(szIndex))
  270. {
  271. // add the chosen app
  272. m_UpgradeList[szIndex] = m_dlgAdd.m_UpgradeData;
  273. // m_dlgAdd.m_fUninstall ? UPGFLG_Uninstall : UPGFLG_NoUninstall;
  274. CString sz = 0 != (m_dlgAdd.m_UpgradeData.m_flags & UPGFLG_Uninstall) ? szReplace : szUpgrade;
  275. sz += L'\t';
  276. sz += m_dlgAdd.m_szPackageName;
  277. m_Upgrades.AddString(sz);
  278. CDC * pDC = m_Upgrades.GetDC();
  279. CSize size = pDC->GetTextExtent(sz);
  280. pDC->LPtoDP(&size);
  281. m_Upgrades.ReleaseDC(pDC);
  282. if (m_Upgrades.GetHorizontalExtent() < size.cx)
  283. {
  284. m_Upgrades.SetHorizontalExtent(size.cx);
  285. }
  286. m_NameIndex[sz] = szIndex;
  287. if (!m_fPreDeploy)
  288. SetModified();
  289. m_fModified = TRUE;
  290. }
  291. else
  292. {
  293. CString szText;
  294. szText.LoadString(IDS_INVALIDUPGRADE);
  295. MessageBox(szText, m_dlgAdd.m_szPackageName, MB_ICONEXCLAMATION | MB_OK);
  296. }
  297. }
  298. }
  299. BOOL CUpgradeList::IsUpgradeLegal(CString sz)
  300. {
  301. // for now I'll just check to make sure that this guy isn't upgrading me
  302. CString sz2;
  303. UINT n = m_pData->m_pDetails->pInstallInfo->cUpgrades;
  304. while (n--)
  305. {
  306. if (0 != (UPGFLG_UpgradedBy & m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].Flag))
  307. {
  308. sz2 = GetUpgradeIndex(m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].PackageGuid);
  309. if (0 == sz.CompareNoCase(sz2))
  310. return FALSE;
  311. }
  312. }
  313. return TRUE;
  314. }
  315. void CUpgradeList::OnSelchangeList1()
  316. {
  317. int iSel = m_Upgrades.GetCurSel();
  318. if (iSel != LB_ERR)
  319. {
  320. CString sz;
  321. m_Upgrades.GetText(iSel, sz);
  322. }
  323. GetDlgItem(IDC_BUTTON3)->EnableWindow( !m_fRSOP );
  324. }
  325. void CUpgradeList::OnRemove()
  326. {
  327. int iSel = m_Upgrades.GetCurSel();
  328. if (iSel != LB_ERR)
  329. {
  330. CString sz;
  331. m_Upgrades.GetText(iSel, sz);
  332. // check to be sure app does not have UPGFLG_Enforced
  333. m_UpgradeList.erase(m_NameIndex[sz]);
  334. m_NameIndex.erase(sz);
  335. m_Upgrades.DeleteString(iSel);
  336. if (!m_fPreDeploy)
  337. SetModified();
  338. m_fModified = TRUE;
  339. if (GetDlgItem(IDC_BUTTON3) == GetFocus())
  340. {
  341. GetParent()->GetDlgItem(IDOK)->SetFocus();
  342. }
  343. GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
  344. }
  345. }
  346. void CUpgradeList::OnEdit()
  347. {
  348. // TODO: Add your control notification handler code here
  349. }
  350. BOOL CUpgradeList::OnApply()
  351. {
  352. if (m_fModified)
  353. {
  354. // Set the new upgrade list and flags
  355. DWORD dwActFlags = m_pData->m_pDetails->pInstallInfo->dwActFlags;
  356. if (m_fForceUpgrade)
  357. dwActFlags |= ACTFLG_ForceUpgrade;
  358. else
  359. dwActFlags &= ~ACTFLG_ForceUpgrade;
  360. // Pilot flag stuff is for backward compatability - it will
  361. // eventually be yanked.
  362. UINT n = m_UpgradeList.size();
  363. if (n)
  364. {
  365. if (m_fForceUpgrade)
  366. dwActFlags &= ~ACTFLG_Pilot;
  367. else
  368. dwActFlags |= ACTFLG_Pilot;
  369. }
  370. else
  371. {
  372. // no upgrades left in the list - remove the pilot flag just
  373. // to be safe
  374. dwActFlags &= ~ACTFLG_Pilot;
  375. }
  376. // count the "upgraded by" elements
  377. UINT n2 = m_pData->m_pDetails->pInstallInfo->cUpgrades;
  378. while (n2--)
  379. {
  380. if (0 != (UPGFLG_UpgradedBy & m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].Flag))
  381. {
  382. n++;
  383. }
  384. }
  385. UINT cUpgrades = n;
  386. UPGRADEINFO * prgUpgradeInfoList = NULL;
  387. if (n)
  388. {
  389. prgUpgradeInfoList = (UPGRADEINFO *) OLEALLOC(sizeof(UPGRADEINFO) * n);
  390. if (prgUpgradeInfoList)
  391. {
  392. n = 0;
  393. // add the "upgraded by" elements
  394. n2 = m_pData->m_pDetails->pInstallInfo->cUpgrades;
  395. while (n2--)
  396. {
  397. if (0 != (UPGFLG_UpgradedBy & m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].Flag))
  398. {
  399. prgUpgradeInfoList[n].Flag = m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].Flag;
  400. OLESAFE_COPYSTRING(prgUpgradeInfoList[n].szClassStore, m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].szClassStore);
  401. memcpy(&prgUpgradeInfoList[n].PackageGuid, &m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n2].PackageGuid, sizeof(GUID));
  402. n++;
  403. }
  404. }
  405. // add the "upgrading" elements
  406. map <CString, CUpgradeData>::iterator i;
  407. for (i = m_UpgradeList.begin(); i != m_UpgradeList.end(); i++)
  408. {
  409. prgUpgradeInfoList[n].Flag = i->second.m_flags;
  410. OLESAFE_COPYSTRING(prgUpgradeInfoList[n].szClassStore, i->second.m_szClassStore);
  411. memcpy(&prgUpgradeInfoList[n].PackageGuid, &i->second.m_PackageGuid, sizeof(GUID));
  412. n++;
  413. }
  414. }
  415. else
  416. {
  417. // out of memory
  418. HRESULT hr = E_OUTOFMEMORY;
  419. CString sz;
  420. sz.LoadString(IDS_CHANGEFAILED);
  421. ReportGeneralPropertySheetError(m_hWnd, sz, hr);
  422. return FALSE;
  423. }
  424. }
  425. HRESULT hr = E_FAIL;
  426. if (m_pIClassAdmin)
  427. {
  428. hr = m_pIClassAdmin->ChangePackageProperties(m_pData->m_pDetails->pszPackageName,
  429. NULL,
  430. &dwActFlags,
  431. NULL,
  432. NULL,
  433. NULL,
  434. NULL);
  435. }
  436. if (SUCCEEDED(hr))
  437. {
  438. hr = m_pIClassAdmin->ChangePackageUpgradeList(m_pData->m_pDetails->pszPackageName,
  439. cUpgrades,
  440. prgUpgradeInfoList);
  441. if (SUCCEEDED(hr))
  442. {
  443. m_pScopePane->RemoveExtensionEntry(m_cookie, *m_pData);
  444. m_pScopePane->RemoveUpgradeEntry(m_cookie, *m_pData);
  445. n = m_pData->m_pDetails->pInstallInfo->cUpgrades;
  446. if (n)
  447. {
  448. while (n--)
  449. {
  450. OLESAFE_DELETE(m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList[n].szClassStore);
  451. }
  452. OLESAFE_DELETE(m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList);
  453. }
  454. m_pData->m_pDetails->pInstallInfo->prgUpgradeInfoList = prgUpgradeInfoList;
  455. m_pData->m_pDetails->pInstallInfo->cUpgrades = cUpgrades;
  456. m_pData->m_pDetails->pInstallInfo->dwActFlags = dwActFlags;
  457. m_pScopePane->InsertExtensionEntry(m_cookie, *m_pData);
  458. m_pScopePane->InsertUpgradeEntry(m_cookie, *m_pData);
  459. if (m_pScopePane->m_pFileExt)
  460. {
  461. m_pScopePane->m_pFileExt->SendMessage(WM_USER_REFRESH, 0, 0);
  462. }
  463. m_pData->m_szUpgrades.Empty(); // Clear the cached
  464. // upgrade relation
  465. // string so it will be
  466. // refreshed.
  467. m_fModified = FALSE;
  468. if (!m_fPreDeploy)
  469. {
  470. MMCPropertyChangeNotify(m_hConsoleHandle, m_cookie);
  471. }
  472. m_fModified = FALSE;
  473. }
  474. else
  475. {
  476. DebugMsg((DM_WARNING, TEXT("ChangePackageUpgradeList failed with 0x%x"), hr));
  477. // Put back the original flags if for some reason we were
  478. // able to change the flags but unable to change the upgrade
  479. // list.
  480. m_pIClassAdmin->ChangePackageProperties(m_pData->m_pDetails->pszPackageName,
  481. NULL,
  482. &m_pData->m_pDetails->pInstallInfo->dwActFlags,
  483. NULL,
  484. NULL,
  485. NULL,
  486. NULL);
  487. // Note that if this fails there's little we could do to
  488. // recover so I just assume it succeeds.
  489. }
  490. }
  491. else
  492. {
  493. DebugMsg((DM_WARNING, TEXT("ChangePackageProperties failed with 0x%x"), hr));
  494. }
  495. if (FAILED(hr))
  496. {
  497. CString sz;
  498. sz.LoadString(IDS_CHANGEFAILED);
  499. ReportGeneralPropertySheetError(m_hWnd, sz, hr);
  500. n = cUpgrades;
  501. if (n)
  502. {
  503. while (n--)
  504. {
  505. OLESAFE_DELETE(prgUpgradeInfoList[n].szClassStore);
  506. }
  507. OLESAFE_DELETE(prgUpgradeInfoList);
  508. }
  509. return FALSE;
  510. }
  511. }
  512. return CPropertyPage::OnApply();
  513. }
  514. void CUpgradeList::OnContextMenu(CWnd* pWnd, CPoint point)
  515. {
  516. StandardContextMenu(pWnd->m_hWnd, IDD_UPGRADES);
  517. }