/*++ Copyright (c) 2001 Microsoft Corporation Module Name : compinst.cxx Abstract: Base classes that are used to define the different instalations Author: Christopher Achille (cachille) Project: Internet Services Setup Revision History: April 2002: Created --*/ #include "stdafx.h" #include "compinst.hxx" #include "webcomp.hxx" #include "ftpcomp.hxx" #include "complus.hxx" #include "wwwcmpts.hxx" #include "comncomp.hxx" // Constructor // // Initialize the Component List to NULL CComponentList::CComponentList() { DWORD i; for ( i = 0; i < COMPONENTS_MAXNUMBER; i++ ) { // Initialize all to NULL m_pComponentList[i] = NULL; } m_dwNumberofComponents = 0; } // Destructor // // Cleanup all the classes we created CComponentList::~CComponentList() { DWORD i; for ( i = 0; i < COMPONENTS_MAXNUMBER; i++ ) { if ( m_pComponentList[i] ) { delete m_pComponentList[i]; m_pComponentList[i] = NULL; } } } // FindComponent // // Find a particular component based on its name // CInstallComponent * CComponentList::FindComponent(LPCTSTR szComponentName) { DWORD i; for ( i = 0; i < GetNumberofComponents(); i++ ) { if ( _tcsicmp( m_pComponentList[i]->GetName(), szComponentName ) == 0 ) { return m_pComponentList[i]; } } // Could not find return NULL; } // GetNumberofComponents // // Return the number of components that we have // DWORD CComponentList::GetNumberofComponents() { return m_dwNumberofComponents; } // Initialize // // Initialize the components that we have to install // BOOL CComponentList::Initialize() { DWORD dwCurrent; DWORD dwComponents = 0; BOOL bRet = TRUE; // Make sure we have not been called before, and we have no components ASSERT( GetNumberofComponents() == 0 ); // Create the classes m_pComponentList[ dwComponents++ ] = new (CWebServiceInstallComponent); m_pComponentList[ dwComponents++ ] = new (CFtpServiceInstallComponent); m_pComponentList[ dwComponents++ ] = new (CCOMPlusInstallComponent); m_pComponentList[ dwComponents++ ] = new (CDTCInstallComponent); m_pComponentList[ dwComponents++ ] = new (CWWWASPInstallComponent); m_pComponentList[ dwComponents++ ] = new (CWWWIDCInstallComponent); m_pComponentList[ dwComponents++ ] = new (CWWWSSIInstallComponent); m_pComponentList[ dwComponents++ ] = new (CWWWWebDavInstallComponent); m_pComponentList[ dwComponents++ ] = new (CCommonInstallComponent); // Make sure that we have not gone past the array ASSERT( dwComponents < COMPONENTS_MAXNUMBER ); // Check to make sure all classes were allocated. // Initialize in order of dependencies, ie. keeping scripts_vdir before web service for ( dwCurrent = 0; dwCurrent < dwComponents; dwCurrent++ ) { if ( m_pComponentList[ dwCurrent ] == NULL ) { // FAILED to allocate one of the classes bRet = FALSE; break; } } if ( !bRet ) { // Failed, so lets cleanup for ( dwCurrent = 0; dwCurrent < dwComponents; dwCurrent++ ) { if ( m_pComponentList[ dwCurrent ] ) { delete m_pComponentList[ dwCurrent ]; m_pComponentList[ dwCurrent ] = NULL; } } } else { m_dwNumberofComponents = dwComponents; } return bRet; } // PreInstall // // Call the PreInstall function for the appropriate component // BOOL CComponentList::PreInstall(LPCTSTR szComponentName) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = TRUE; if ( pComponent && !( pComponent->PreInstall() ) ) { iisDebugOut((LOG_TYPE_ERROR, _T("PreInstall of Component '%s' FAILED\n"), szComponentName )); bRet = FALSE; } return bRet; } // Install // // Call the Install function for the appropriate component // BOOL CComponentList::Install(LPCTSTR szComponentName) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = TRUE; if ( pComponent && !( pComponent->Install() ) ) { iisDebugOut((LOG_TYPE_ERROR, _T("Install of Component '%s' FAILED\n"), szComponentName )); bRet = FALSE; } return bRet; } // PostInstall // // Call the PostInstall function for the appropriate component // BOOL CComponentList::PostInstall(LPCTSTR szComponentName) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = TRUE; if ( pComponent && !( pComponent->PostInstall() ) ) { iisDebugOut((LOG_TYPE_ERROR, _T("PostInstall of Component '%s' FAILED\n"), szComponentName )); bRet = FALSE; } return bRet; } // PreUnInstall // // Call the PreUnInstall function for the appropriate component // BOOL CComponentList::PreUnInstall(LPCTSTR szComponentName) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = TRUE; if ( pComponent && !( pComponent->PreUnInstall() ) ) { iisDebugOut((LOG_TYPE_ERROR, _T("PreUnInstall of Component '%s' FAILED\n"), szComponentName )); bRet = FALSE; } return bRet; } // UnInstall // // Call the UnInstall function for the appropriate component // BOOL CComponentList::UnInstall(LPCTSTR szComponentName) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = TRUE; if ( pComponent && !( pComponent->UnInstall() ) ) { iisDebugOut((LOG_TYPE_ERROR, _T("UnInstall of Component '%s' FAILED\n"), szComponentName )); bRet = FALSE; } return bRet; } // PostUnInstall // // Call the PostUnInstall function for the appropriate component // BOOL CComponentList::PostUnInstall(LPCTSTR szComponentName) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = TRUE; if ( pComponent && !( pComponent->PostUnInstall() ) ) { iisDebugOut((LOG_TYPE_ERROR, _T("PostUnInstall of Component '%s' FAILED\n"), szComponentName )); bRet = FALSE; } return bRet; } // IsInstalled // // Is the component already installed or not // // Parameters: // szComponentName [in] - The name of the component to check // pbIsInstalled [out] - TRUE == it is installed // FALSE == it is not installed // // Return Values // TRUE - We do know if it was installed // FALSE - We don't know if it was installed // BOOL CComponentList::IsInstalled( LPCTSTR szComponentName, LPBOOL pbIsInstalled ) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = FALSE; if ( pComponent ) { bRet = pComponent->IsInstalled( pbIsInstalled ); } return bRet; } // GetFriendlyName // // Call the GetFriendlyName function for the appropriate component // BOOL CComponentList::GetFriendlyName( LPCTSTR szComponentName, TSTR *pstrFriendlyName ) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = FALSE; if ( pComponent ) { bRet = pComponent->GetFriendlyName( pstrFriendlyName ); } return bRet; } // GetSmallIcon // // Retrieve the small icon for the OCM component // BOOL CComponentList::GetSmallIcon( LPCTSTR szComponentName, HBITMAP *phIcon ) { CInstallComponent *pComponent = FindComponent( szComponentName ); BOOL bRet = FALSE; ASSERT( phIcon ); if ( pComponent ) { bRet = pComponent->GetSmallIcon( phIcon ); } return bRet; } // Initialize // // Initialize the component for install. // The default function is to do nothing // BOOL CInstallComponent::Initialize() { return TRUE; } // PreInstall // // PreInstall work for component. This should theoretically be nothing, we should // do everything in the Install Part // BOOL CInstallComponent::PreInstall() { return TRUE; } // Install // // This does all the meat of the install work. Everything should be done inside of // here. // BOOL CInstallComponent::Install() { return TRUE; } // PostInstall // // This does any post install work. In a theoretical world this would not be needed, // but sometimes things need to be done after everything else // BOOL CInstallComponent::PostInstall() { return TRUE; } // PreUninstall // // Anything that needs to be done before any uninstalation occurs. // BOOL CInstallComponent::PreUnInstall() { return TRUE; } // Uninstall // // The core of the work to be done for uninstall. // BOOL CInstallComponent::UnInstall() { return TRUE; } // PostUnInstall // // Anything that needs to be done after all the other uninstall stuff is done. // BOOL CInstallComponent::PostUnInstall() { return TRUE; } // IsInstalled // // Is the component already installed or not // // Parameters: // pbIsInstalled [out] - TRUE == it is installed // FALSE == it is not installed // // Return Values // TRUE - We do know if it was installed // FALSE - We don't know if it was installed BOOL CInstallComponent::IsInstalled( LPBOOL pbIsInstalled ) { // By default, we don't know if it is installed return FALSE; } // GetFriendlyName // // Get the friendly name for the application // // This willr eturn false if it does not know if, // or true if it does BOOL CInstallComponent::GetFriendlyName( TSTR *pstrFriendlyName ) { return FALSE; } // GetSmallIcon // // Retrieve the Small Icon for this OCM component // // Parameters: // phIcon - The icon retrieved // // Return Values: // TRUE - Retrieve Successfully // FALSE - No we do not know what the icon looks like, // or we failed to retrieve it BOOL CInstallComponent::GetSmallIcon( HBITMAP *phIcon ) { // By default, there is no icon return FALSE; } // IsUpgrade // // Is this an upgrade or a fresh install // // Return Values: // TRUE - Upgrade // FALSE - Fresh Install // BOOL CInstallComponent::IsUpgrade() { return g_pTheApp->IsUpgrade(); } // GetUpdateVersion // // Is this is an upgrade, this is the version we are upgrading from // DWORD CInstallComponent::GetUpgradeVersion() { return g_pTheApp->GetUpgradeVersion(); }