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.
191 lines
5.7 KiB
191 lines
5.7 KiB
#include <windows.h>
|
|
#include <ntverp.h>
|
|
#include <winbase.h> // for GetCommandLine
|
|
#include "datasrc.h"
|
|
#include "autorun.h"
|
|
#include "util.h"
|
|
#include "resource.h"
|
|
#include "assert.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CDataSource::CDataSource()
|
|
{
|
|
m_iItems = 0;
|
|
}
|
|
|
|
CDataSource::~CDataSource()
|
|
{
|
|
}
|
|
|
|
CDataItem & CDataSource::operator[](int i)
|
|
{
|
|
return m_data[m_piScreen[i]];
|
|
}
|
|
|
|
// Init
|
|
//
|
|
// For autorun we read all the items out of the resources.
|
|
BOOL CDataSource::Init(LPSTR pszCommandLine)
|
|
{
|
|
BOOL fRet = FALSE;
|
|
|
|
// read the text for the items from the resources
|
|
HINSTANCE hinst = GetModuleHandle(NULL);
|
|
if (hinst)
|
|
{
|
|
for (int i=0; i<MAX_OPTIONS; i++)
|
|
{
|
|
TCHAR szTitle[256];
|
|
TCHAR szConfig[MAX_PATH];
|
|
TCHAR szArgs[MAX_PATH];
|
|
|
|
szTitle[0] = szConfig[0] = szArgs[0] = 0;
|
|
|
|
if (LoadStringAuto(hinst, IDS_TITLE0+i, szTitle, ARRAYSIZE(szTitle)))
|
|
{
|
|
LoadStringAuto(hinst, IDS_CONFIG0+i, szConfig, ARRAYSIZE(szConfig)); // may be empty
|
|
|
|
if (INSTALL_WINNT == i) // for INSTALL_WINNT we pass through the command line args to setup.exe
|
|
{
|
|
// if we can't fit the whole cmdline, copy none rather than truncate
|
|
if (lstrlen(pszCommandLine) < ARRAYSIZE(szArgs))
|
|
{
|
|
lstrcpyn(szArgs, pszCommandLine, ARRAYSIZE(szArgs));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LoadStringAuto(hinst, IDS_ARGS0+i, szArgs, ARRAYSIZE(szArgs));
|
|
}
|
|
}
|
|
|
|
m_data[i].SetData(szTitle, szConfig, *szArgs?szArgs:NULL, 0, i);
|
|
}
|
|
|
|
// Should we display the "This CD contains a newer version" dialog?
|
|
OSVERSIONINFO ovi;
|
|
ovi.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO );
|
|
if ( !GetVersionEx(&ovi) || ovi.dwPlatformId==VER_PLATFORM_WIN32s )
|
|
{
|
|
// We cannot upgrade win32s systems.
|
|
m_Version = VER_INCOMPATIBLE;
|
|
}
|
|
else if ( ovi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS )
|
|
{
|
|
if (ovi.dwMajorVersion > 3)
|
|
{
|
|
// we can always upgrade win98+ systems to NT
|
|
m_Version = VER_OLDER;
|
|
|
|
// Disable ARP. ARP is only enabled if the CD and the OS are the same version
|
|
m_data[LAUNCH_ARP].m_dwFlags |= WF_DISABLED|WF_ALTERNATECOLOR;
|
|
}
|
|
else
|
|
{
|
|
m_Version = VER_INCOMPATIBLE;
|
|
}
|
|
}
|
|
else if ((VER_PRODUCTMAJORVERSION > ovi.dwMajorVersion) ||
|
|
((VER_PRODUCTMAJORVERSION == ovi.dwMajorVersion) && ((VER_PRODUCTMINORVERSION > ovi.dwMinorVersion) || ((VER_PRODUCTMINORVERSION == ovi.dwMinorVersion) && (VER_PRODUCTBUILD > ovi.dwBuildNumber)))))
|
|
{
|
|
// For NT to NT upgrades, we only upgrade if the version is lower
|
|
|
|
m_Version = VER_OLDER;
|
|
|
|
// Disable ARP. ARP is only enabled if the CD and the OS are the same version
|
|
m_data[LAUNCH_ARP].m_dwFlags |= WF_DISABLED|WF_ALTERNATECOLOR;
|
|
}
|
|
else if ((VER_PRODUCTMAJORVERSION < ovi.dwMajorVersion) || (VER_PRODUCTMINORVERSION < ovi.dwMinorVersion) || (VER_PRODUCTBUILD < ovi.dwBuildNumber))
|
|
{
|
|
m_Version = VER_NEWER;
|
|
|
|
// disable upgrade and ARP buttons and associated things
|
|
m_data[INSTALL_WINNT].m_dwFlags |= WF_DISABLED|WF_ALTERNATECOLOR;
|
|
m_data[COMPAT_LOCAL].m_dwFlags |= WF_DISABLED|WF_ALTERNATECOLOR;
|
|
m_data[LAUNCH_ARP].m_dwFlags |= WF_DISABLED|WF_ALTERNATECOLOR;
|
|
}
|
|
else
|
|
{
|
|
m_Version = VER_SAME;
|
|
}
|
|
|
|
if (m_Version == VER_SAME)
|
|
{
|
|
m_piScreen = c_aiWhistler;
|
|
m_iItems = c_cWhistler;
|
|
}
|
|
else
|
|
{
|
|
m_piScreen = c_aiMain;
|
|
m_iItems = c_cMain;
|
|
}
|
|
fRet = TRUE;
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
void CDataSource::SetWindow(HWND hwnd)
|
|
{
|
|
m_hwndDlg = hwnd;
|
|
}
|
|
|
|
void CDataSource::Invoke( int i, HWND hwnd )
|
|
{
|
|
i = m_piScreen[i];
|
|
// if this item is disalbled then do nothing
|
|
if ( m_data[i].m_dwFlags & WF_DISABLED )
|
|
{
|
|
MessageBeep(0);
|
|
return;
|
|
}
|
|
|
|
// otherwise we have already built the correct command and arg strings so just invoke them
|
|
switch (i)
|
|
{
|
|
case INSTALL_WINNT:
|
|
case LAUNCH_ARP:
|
|
case BROWSE_CD:
|
|
case COMPAT_WEB:
|
|
case COMPAT_LOCAL:
|
|
case HOMENET_WIZ:
|
|
case MIGRATION_WIZ:
|
|
case TS_CLIENT:
|
|
case VIEW_RELNOTES:
|
|
m_data[i].Invoke(hwnd);
|
|
break;
|
|
case SUPPORT_TOOLS:
|
|
m_piScreen = c_aiSupport;
|
|
m_iItems = c_cSupport;
|
|
PostMessage(m_hwndDlg, ARM_CHANGESCREEN, SCREEN_TOOLS, 0);
|
|
break;
|
|
|
|
case COMPAT_TOOLS:
|
|
m_piScreen = c_aiCompat;
|
|
m_iItems = c_cCompat;
|
|
PostMessage(m_hwndDlg, ARM_CHANGESCREEN, SCREEN_COMPAT, 0);
|
|
break;
|
|
|
|
case BACK:
|
|
if (m_Version == VER_SAME)
|
|
{
|
|
m_piScreen = c_aiWhistler;
|
|
m_iItems = c_cWhistler;
|
|
}
|
|
else
|
|
{
|
|
m_piScreen = c_aiMain;
|
|
m_iItems = c_cMain;
|
|
}
|
|
PostMessage(m_hwndDlg, ARM_CHANGESCREEN, SCREEN_MAIN, 0);
|
|
break;
|
|
|
|
default:
|
|
assert(0);
|
|
break;
|
|
}
|
|
}
|
|
|