|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1998.
//
// File: Xforms.cpp
//
// Contents: modifications (transforms) property page
//
// Classes: CXforms
//
// History: 03-14-1998 stevebl Commented
//
//---------------------------------------------------------------------------
#include "precomp.hxx"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CXforms property page
IMPLEMENT_DYNCREATE(CXforms, CPropertyPage)
CXforms::CXforms() : CPropertyPage(CXforms::IDD) { //{{AFX_DATA_INIT(CXforms)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_fModified = FALSE; m_pIClassAdmin = NULL; m_fPreDeploy = FALSE; m_ppThis = NULL; }
CXforms::~CXforms() { if (m_ppThis) { *m_ppThis = NULL; } if (m_pIClassAdmin) { m_pIClassAdmin->Release(); } }
void CXforms::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CXforms)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CXforms, CPropertyPage) //{{AFX_MSG_MAP(CXforms)
ON_BN_CLICKED(IDC_BUTTON3, OnMoveUp) ON_BN_CLICKED(IDC_BUTTON4, OnMoveDown) ON_BN_CLICKED(IDC_BUTTON1, OnAdd) ON_BN_CLICKED(IDC_BUTTON2, OnRemove) ON_WM_CONTEXTMENU() //}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXforms message handlers
void CXforms::OnMoveUp() { CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1); int i = pList->GetCurSel(); if (LB_ERR != i && i > 0) { CString sz; pList->GetText(i, sz); pList->DeleteString(i); pList->InsertString(i-1, sz); pList->SetCurSel(i-1); if (!m_fPreDeploy) SetModified(); m_fModified = TRUE; } }
void CXforms::OnMoveDown() { CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1); int i = pList->GetCurSel(); if (i != LB_ERR && i < pList->GetCount() - 1) { CString sz; pList->GetText(i+1, sz); pList->DeleteString(i+1); pList->InsertString(i, sz); pList->SetCurSel(i+1); if (!m_fPreDeploy) SetModified(); m_fModified = TRUE; } }
void CXforms::OnAdd() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString szExtension; CString szFilter; szExtension.LoadString(IDS_DEF_TRANSFORM_EXTENSION); szFilter.LoadString(IDS_TRANSFORM_EXTENSION_FILTER);
OPENFILENAME ofn; memset(&ofn, 0, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = m_hWnd; ofn.hInstance = ghInstance; TCHAR lpstrFilter[MAX_PATH];
//
// Note that since wcsncpy does not null terminate
// if the string hits the specified character limit,
// we need to prevent it from going all the way
// to the end of the buffer by specifying that
// it should use a length one less than the size
// of the buffer
//
wcsncpy(lpstrFilter, szFilter, MAX_PATH - 1 );
//
// Since the string may not have been null terminated
// as described above, we ensure that the very last
// character is a terminator to handle the case
// where the string was at least MAX_PATH - 1
// chars long.
//
lpstrFilter[ MAX_PATH - 1 ] = L'\0';
ofn.lpstrFilter = lpstrFilter; TCHAR szFileTitle[MAX_PATH]; TCHAR szFile[MAX_PATH]; szFile[0] = NULL; ofn.lpstrFile = szFile; ofn.nMaxFile = MAX_PATH; ofn.lpstrFileTitle = szFileTitle; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrInitialDir = m_pScopePane->m_ToolDefaults.szStartPath; ofn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_FILEMUSTEXIST; ofn.lpstrDefExt = szExtension; int iBreak = 0; while (lpstrFilter[iBreak]) { if (lpstrFilter[iBreak] == TEXT('|')) { lpstrFilter[iBreak] = 0; } iBreak++; } if (GetOpenFileName(&ofn)) { // user selected an application
ULONG cbSize = sizeof(UNIVERSAL_NAME_INFO); UNIVERSAL_NAME_INFO * pUni = (UNIVERSAL_NAME_INFO *) new BYTE [cbSize]; DWORD dwError = WNetGetUniversalName(ofn.lpstrFile, UNIVERSAL_NAME_INFO_LEVEL, pUni, &cbSize); if (ERROR_MORE_DATA == dwError) // we expect this to be true
{ delete [] pUni; pUni = (UNIVERSAL_NAME_INFO *) new BYTE [cbSize]; dwError = WNetGetUniversalName(ofn.lpstrFile, UNIVERSAL_NAME_INFO_LEVEL, pUni, &cbSize); }
CString szTransformPath;
if (ERROR_SUCCESS == dwError) { szTransformPath = pUni->lpUniversalName; } else { szTransformPath = ofn.lpstrFile; } delete[] pUni;
CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1); pList->AddString(szTransformPath); CDC * pDC = pList->GetDC(); CSize size = pDC->GetTextExtent(szTransformPath); pDC->LPtoDP(&size); pList->ReleaseDC(pDC); if (pList->GetHorizontalExtent() < size.cx) { pList->SetHorizontalExtent(size.cx); } pList->SetCurSel(pList->GetCount() - 1); if (!m_fPreDeploy) SetModified(); m_fModified = TRUE; int n = pList->GetCount(); GetDlgItem(IDC_BUTTON2)->EnableWindow(n > 0); GetDlgItem(IDC_BUTTON3)->EnableWindow(n > 1); GetDlgItem(IDC_BUTTON4)->EnableWindow(n > 1); if (NULL == GetFocus()) { GetParent()->GetDlgItem(IDOK)->SetFocus(); } } }
void CXforms::OnRemove() { CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1); int i = pList->GetCurSel(); if (LB_ERR != i) { pList->DeleteString(i); pList->SetCurSel(0); if (!m_fPreDeploy) SetModified(); m_fModified = TRUE; int n = pList->GetCount(); GetDlgItem(IDC_BUTTON2)->EnableWindow(n > 0); GetDlgItem(IDC_BUTTON3)->EnableWindow(n > 1); GetDlgItem(IDC_BUTTON4)->EnableWindow(n > 1); if (NULL == GetFocus()) { GetParent()->GetDlgItem(IDOK)->SetFocus(); } } }
BOOL CXforms::OnInitDialog() { if (m_pScopePane->m_fRSOP || !m_fPreDeploy) { GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); SetDlgItemText(IDC_STATICNOHELP1, TEXT("")); } GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); // Remember what the package name was at first so we can tell if the
// user's changed it.
m_szInitialPackageName = m_pData->m_pDetails->pszPackageName;
RefreshData();
CPropertyPage::OnInitDialog();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
BOOL CXforms::OnApply() { // NOTE
//
// If the transform list changes we really have no choice but to
// re-deploy the app because it can cause virtually every field in the
// package details structure to change (a change in the transform list
// causes a rebuild of the script file which could potentially affect
// almost everything).
//
// For this reason, this property sheet MUST NOT BE ACTIVE once an app
// is deployed.
//
BOOL fBuildSucceeded = FALSE; AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (m_fModified) { CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1); PACKAGEDETAIL * ppd; if (FAILED(CopyPackageDetail(ppd, m_pData->m_pDetails))) { return FALSE; }
CString sz; int i; for (i = ppd->cSources; i--;) { OLESAFE_DELETE(ppd->pszSourceList[i]); } OLESAFE_DELETE(ppd->pszSourceList); int n = pList->GetCount(); ppd->pszSourceList = (LPOLESTR *) OLEALLOC(sizeof(LPOLESTR) * (n + 1)); if (ppd->pszSourceList) { OLESAFE_COPYSTRING(ppd->pszSourceList[0], m_pData->m_pDetails->pszSourceList[0]); for (i = 0; i < n; i++) { pList->GetText(i, sz); OLESAFE_COPYSTRING(ppd->pszSourceList[i+1], sz); } ppd->cSources = n + 1; } else { ppd->cSources = 0; return FALSE; }
// Create a name for the new script file.
// set the script path
GUID guid; HRESULT hr = CoCreateGuid(&guid); if (FAILED(hr)) { // undone
} OLECHAR szGuid [256]; StringFromGUID2(guid, szGuid, 256);
CString szScriptFile = m_pScopePane->m_szGPT_Path; szScriptFile += L"\\"; szScriptFile += szGuid; szScriptFile += L".aas"; OLESAFE_DELETE(ppd->pInstallInfo->pszScriptPath); OLESAFE_COPYSTRING(ppd->pInstallInfo->pszScriptPath, szScriptFile); CString szOldName = ppd->pszPackageName; hr = BuildScriptAndGetActInfo(*ppd, ! m_pData->m_pDetails->pActInfo->bHasClasses); if (SUCCEEDED(hr)) { if (0 != wcscmp(m_szInitialPackageName, szOldName)) { // The User changed the name so we have to preserve his choice.
// If the user hasn't changed the package name then it's ok to
// set the packagename to whatever is in the script file.
OLESAFE_DELETE(ppd->pszPackageName); OLESAFE_COPYSTRING(ppd->pszPackageName, szOldName); }
fBuildSucceeded = TRUE; hr = m_pScopePane->PrepareExtensions(*ppd); if (SUCCEEDED(hr)) { CString szUniqueName; int nHint;
nHint = 1;
m_pScopePane->GetUniquePackageName(ppd->pszPackageName, szUniqueName, nHint); OLESAFE_DELETE(ppd->pszPackageName); OLESAFE_COPYSTRING(ppd->pszPackageName, szUniqueName);
hr = m_pIClassAdmin->RedeployPackage( &m_pData->m_pDetails->pInstallInfo->PackageGuid, ppd);
if (SUCCEEDED(hr)) { // delete the old script
DeleteFile(m_pData->m_pDetails->pInstallInfo->pszScriptPath); // update indexes and property sheets
m_pScopePane->RemoveExtensionEntry(m_cookie, *m_pData); m_pScopePane->RemoveUpgradeEntry(m_cookie, *m_pData); FreePackageDetail(m_pData->m_pDetails); m_pData->m_pDetails = ppd; 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_fModified = FALSE; if (!m_fPreDeploy) { MMCPropertyChangeNotify(m_hConsoleHandle, m_cookie); } } } } if (FAILED(hr)) { CString sz; sz.LoadString(fBuildSucceeded ? IDS_TRANSFORM_FAILED_IN_CS : IDS_TRANSFORM_FAILED); ReportGeneralPropertySheetError(m_hWnd, sz, hr);
// delete new script file (assuming it was created)
DeleteFile(szScriptFile);
FreePackageDetail(ppd); return FALSE; } } return CPropertyPage::OnApply(); }
LRESULT CXforms::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: return GetOwner()->SendMessage(WM_CLOSE); default: return CPropertyPage::WindowProc(message, wParam, lParam); } }
void CXforms::RefreshData(void) { CListBox * pList = (CListBox *)GetDlgItem(IDC_LIST1); pList->ResetContent(); pList->SetHorizontalExtent(0);
UINT i; // Item at 0 is the package. Items > 0 are transforms.
for (i = 1; i < m_pData->m_pDetails->cSources; i++) { pList->AddString(m_pData->m_pDetails->pszSourceList[i]); CDC * pDC = pList->GetDC(); CSize size = pDC->GetTextExtent(m_pData->m_pDetails->pszSourceList[i]); pDC->LPtoDP(&size); pList->ReleaseDC(pDC); if (pList->GetHorizontalExtent() < size.cx) { pList->SetHorizontalExtent(size.cx); } } pList->SetCurSel(0);
SetModified(FALSE); m_fModified = FALSE; }
void CXforms::OnContextMenu(CWnd* pWnd, CPoint point) { StandardContextMenu(pWnd->m_hWnd, IDD_MODIFICATIONS); }
|