windows-nt/Source/XPSP1/NT/termsrv/setup/dll/subcomp.cpp
2020-09-26 16:20:57 +08:00

373 lines
9.4 KiB
C++

//Copyright (c) 1998 - 1999 Microsoft Corporation
// subcomp.cpp
// implementation a default sub component
#include "stdafx.h"
#include "subcomp.h"
OCMSubComp::OCMSubComp ()
{
m_lTicks = 0;
}
BOOL OCMSubComp::Initialize ()
{
return TRUE;
}
BOOL OCMSubComp::GetCurrentSubCompState () const
{
return GetHelperRoutines().QuerySelectionState(
GetHelperRoutines().OcManagerContext,
GetSubCompID(),
OCSELSTATETYPE_CURRENT);
}
BOOL OCMSubComp::GetOriginalSubCompState () const
{
return GetHelperRoutines().QuerySelectionState(
GetHelperRoutines().OcManagerContext,
GetSubCompID(),
OCSELSTATETYPE_ORIGINAL);
}
BOOL OCMSubComp::HasStateChanged () const
{
//
// returns true if current selection state is different from previous.
//
return GetCurrentSubCompState() != GetOriginalSubCompState();
}
//
// this functions ticks the gauge for the specified count
// keep traks of the count reported to the OC_QUERY_STEP_COUNT
//
void OCMSubComp::Tick (DWORD dwTickCount /* = 1 */)
{
if (m_lTicks > 0)
{
m_lTicks -= dwTickCount;
while(dwTickCount--)
GetHelperRoutines().TickGauge( GetHelperRoutines().OcManagerContext );
}
else
{
m_lTicks = 0;
}
}
//
// completes the remaining ticks.
//
void OCMSubComp::TickComplete ()
{
ASSERT(m_lTicks >= 0);
while (m_lTicks--)
GetHelperRoutines().TickGauge( GetHelperRoutines().OcManagerContext );
}
DWORD OCMSubComp::OnQueryStepCount()
{
m_lTicks = GetStepCount() + 2;
return m_lTicks;
}
DWORD OCMSubComp::GetStepCount () const
{
return 0;
}
DWORD OCMSubComp::OnQueryState ( UINT uiWhichState ) const
{
LOGMESSAGE1(_T("In OCMSubComp::OnQueryState for %s"), GetSubCompID());
ASSERT(OCSELSTATETYPE_ORIGINAL == uiWhichState ||
OCSELSTATETYPE_CURRENT == uiWhichState ||
OCSELSTATETYPE_FINAL == uiWhichState );
return SubcompUseOcManagerDefault;
}
DWORD OCMSubComp::OnQuerySelStateChange (BOOL /* bNewState */, BOOL /* bDirectSelection */) const
{
return TRUE;
}
DWORD OCMSubComp::LookupTargetSection(LPTSTR szTargetSection, DWORD dwSize, LPCTSTR lookupSection)
{
DWORD dwError = GetStringValue(GetComponentInfHandle(), GetSubCompID(), lookupSection, szTargetSection, dwSize);
if (dwError == ERROR_SUCCESS)
{
LOGMESSAGE2(_T("sectionname = <%s>, actual section = <%s>"), lookupSection, szTargetSection);
}
else
{
AssertFalse();
LOGMESSAGE1(_T("ERROR:GetSectionToBeProcess:GetStringValue failed GetLastError() = %lu"), dwError);
}
return dwError;
}
DWORD OCMSubComp::GetTargetSection(LPTSTR szTargetSection, DWORD dwSize, ESections eSectionType, BOOL *pbNoSection)
{
ASSERT(szTargetSection);
ASSERT(pbNoSection);
//
// get section to be processed
//
LPCTSTR szSection = GetSectionToBeProcessed( eSectionType );
if (szSection == NULL)
{
*pbNoSection = TRUE;
return NO_ERROR;
}
else
{
//
// there is a section to be processed.
//
*pbNoSection = FALSE;
}
//
// look for the target section
//
return LookupTargetSection(szTargetSection, dwSize, szSection);
}
DWORD OCMSubComp::OnCalcDiskSpace ( DWORD addComponent, HDSKSPC dspace )
{
LOGMESSAGE1(_T("In OCMSubComp::OnCalcDiskSpace for %s"), GetSubCompID());
TCHAR TargetSection[S_SIZE];
BOOL bNoSection = FALSE;
DWORD rc = GetTargetSection(TargetSection, S_SIZE, kDiskSpaceAddSection, &bNoSection);
//
// if there is no section to be processed. just return success.
//
if (bNoSection)
{
return NO_ERROR;
}
if (rc == NO_ERROR)
{
if (addComponent)
{
LOGMESSAGE1(_T("Calculating disk space for add section = %s"), TargetSection);
rc = SetupAddInstallSectionToDiskSpaceList(
dspace,
GetComponentInfHandle(),
NULL,
TargetSection,
0,
0);
}
else
{
LOGMESSAGE1(_T("Calculating disk space for remove section = %s"), TargetSection);
rc = SetupRemoveInstallSectionFromDiskSpaceList(
dspace,
GetComponentInfHandle(),
NULL,
TargetSection,
0,
0);
}
if (!rc)
rc = GetLastError();
else
rc = NO_ERROR;
}
return rc;
}
DWORD OCMSubComp::OnQueueFiles ( HSPFILEQ queue )
{
LOGMESSAGE1(_T("In OCMSubComp::OnQueueFiles for %s"), GetSubCompID());
TCHAR TargetSection[S_SIZE];
BOOL bNoSection = FALSE;
DWORD rc = GetTargetSection(TargetSection, S_SIZE, kFileSection, &bNoSection);
//
// if there is no section to be processed. just return success.
//
if (bNoSection)
{
return NO_ERROR;
}
if (rc == NO_ERROR)
{
LOGMESSAGE1(_T("Queuing Files from Section = %s"), TargetSection);
if (!SetupInstallFilesFromInfSection(
GetComponentInfHandle(),
NULL,
queue,
TargetSection,
NULL,
0 // this should eliminate the warning about overwriting newer file.
))
{
rc = GetLastError();
LOGMESSAGE2(_T("ERROR:OnQueueFileOps::SetupInstallFilesFromInfSection <%s> failed.GetLastError() = <%ul)"), TargetSection, rc);
}
else
{
return NO_ERROR;
}
}
return rc;
}
DWORD OCMSubComp::OnCompleteInstall ()
{
LOGMESSAGE1(_T("In OCMSubComp::OnCompleteInstall for %s"), GetSubCompID());
if (!BeforeCompleteInstall ())
{
LOGMESSAGE0(_T("ERROR:BeforeCompleteInstall failed!"));
}
TCHAR TargetSection[S_SIZE];
BOOL bNoSection = FALSE;
DWORD dwError = GetTargetSection(TargetSection, S_SIZE, kRegistrySection, &bNoSection);
//
// if there is no section to be processed. just go ahead.
//
if (!bNoSection)
{
LOGMESSAGE1(_T("Setting up Registry/Links/RegSvrs from section = %s"), TargetSection);
dwError = SetupInstallFromInfSection(
NULL, // hwndOwner
GetComponentInfHandle(), // inf handle
TargetSection, //
SPINST_ALL & ~SPINST_FILES, // operation flags
NULL, // relative key root
NULL, // source root path
0, // copy flags
NULL, // callback routine
NULL, // callback routine context
NULL, // device info set
NULL // device info struct
);
if (dwError == 0)
LOGMESSAGE1(_T("ERROR:while installating section <%lu>"), GetLastError());
}
Tick();
if (!AfterCompleteInstall ())
{
LOGMESSAGE0(_T("ERROR:AfterCompleteInstall failed!"));
}
TickComplete();
return NO_ERROR;
}
BOOL OCMSubComp::BeforeCompleteInstall ()
{
return TRUE;
}
BOOL OCMSubComp::AfterCompleteInstall ()
{
return TRUE;
}
DWORD OCMSubComp::OnAboutToCommitQueue ()
{
return NO_ERROR;
}
void
OCMSubComp::SetupRunOnce( HINF hInf, LPCTSTR SectionName )
{
INFCONTEXT sic;
TCHAR CommandLine[ RUNONCE_CMDBUFSIZE ];
BOOL b;
STARTUPINFO startupinfo;
PROCESS_INFORMATION process_information;
DWORD dwErr;
if (!SetupFindFirstLine( hInf, SectionName, NULL , &sic))
{
LOGMESSAGE1(_T("WARNING: nothing in %s to be processed."), SectionName);
}
else
{
do {
if (!SetupGetStringField(&sic, 1, CommandLine, RUNONCE_CMDBUFSIZE, NULL))
{
LOGMESSAGE1(_T("WARNING: No command to be processed."), SectionName);
break;
}
LOGMESSAGE1(_T("RunOnce: spawning process %s"), CommandLine);
ZeroMemory( &startupinfo, sizeof(startupinfo) );
startupinfo.cb = sizeof(startupinfo);
startupinfo.dwFlags = STARTF_USESHOWWINDOW;
startupinfo.wShowWindow = SW_HIDE | SW_SHOWMINNOACTIVE;
b = CreateProcess( NULL,
CommandLine,
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE,
NULL,
NULL,
&startupinfo,
&process_information );
if ( !b )
{
LOGMESSAGE1(_T("ERROR: failed to spawn %s process."), CommandLine);
continue;
}
dwErr = WaitForSingleObject( process_information.hProcess, RUNONCE_DEFAULTWAIT );
if ( dwErr != NO_ERROR )
{
LOGMESSAGE1(_T("ERROR: process %s failed to complete in time."), CommandLine);
// Don't terminate process, just go on to next one.
}
else
{
LOGMESSAGE1(_T("INFO: process %s completed successfully."), CommandLine);
}
CloseHandle( process_information.hProcess );
CloseHandle( process_information.hThread );
} while ( SetupFindNextLine( &sic, &sic ) );
}
return;
}