247 lines
7.5 KiB
JavaScript
247 lines
7.5 KiB
JavaScript
//
|
|
// This file contains script that is common to all the shell files.
|
|
//
|
|
|
|
// Activation errors
|
|
var ERR_ACT_UNINITIALIZED = -1;
|
|
var ERR_ACT_SUCCESS = 0;
|
|
var ERR_ACT_INACCESSIBLE = 1;
|
|
var ERR_ACT_INVALID_PID = 2;
|
|
var ERR_ACT_USED_PID = 3;
|
|
var ERR_ACT_INTERNAL_WINDOWS_ERR = 4;
|
|
var ERR_ACT_BLOCKED_PID = 5;
|
|
var ERR_ACT_CORRUPTED_PID = 6;
|
|
var ERR_ACT_NETWORK_FAILURE = 7;
|
|
var ERR_ACT_DEDICATED_PID_ENTRY = 8;
|
|
|
|
// Global variables
|
|
var g_ProductName = "Windows XP";
|
|
var g_ActivationRequired = window.external.NeedActivation();
|
|
var g_DoActivation = false;
|
|
var g_ActivationStatus = ERR_ACT_UNINITIALIZED;
|
|
var g_act_specific_error = 0;
|
|
var g_OOBEMUIDir = window.external.GetOOBEMUIPath();
|
|
|
|
// generic missing OEM Name error string. This is being used in msobshel.htm and error.js
|
|
var L_MissingOEMName_Text = "Error: Missing OEM Name in oobeinfo.ini [Branding] section.";
|
|
|
|
// window.external object caches
|
|
var DebugObj = null;
|
|
|
|
// Mandatory Initialization Code
|
|
if (null == DebugObj){
|
|
DebugObj = new Object;
|
|
DebugObj = window.external.Debug;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// trace
|
|
//
|
|
// Send trace output to setuplog.txt and the debugger. Requires that
|
|
// HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\OOBE\MsDebug=DWORD:1.
|
|
// Output to the debugger requires a checked version of syssetup.dll.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
function trace(sMsg)
|
|
{
|
|
DebugObj.Trace(sMsg);
|
|
}
|
|
|
|
|
|
function Navigate(strURL)
|
|
{
|
|
// We are showing the next page. Make sure the cursor is normal
|
|
try
|
|
{
|
|
g.document.body.style.cursor = "default";
|
|
}
|
|
catch(e){}
|
|
|
|
strURL = g_OOBEMUIDir + "\\" + strURL;
|
|
|
|
trace("Navigate: " + strURL);
|
|
g.navigate(strURL);
|
|
} // Navigate
|
|
|
|
|
|
var g_CheckFinishAgain = true;
|
|
function CheckFinishStatus()
|
|
{
|
|
if (g_CheckFinishAgain)
|
|
{
|
|
if (g_DoActivation)
|
|
g_IsActivationSuccessful = true;
|
|
else
|
|
g_IsActivationSuccessful = false;
|
|
if (g_PostToMS)
|
|
g_IsMSRegistrationSuccessful = true;
|
|
else
|
|
g_IsMSRegistrationSuccessful = false;
|
|
|
|
if (g_PostToOEM)
|
|
g_IsOEMRegistrationSuccessful = true;
|
|
else
|
|
g_IsOEMRegistrationSuccessful = false;
|
|
}
|
|
}
|
|
|
|
<!--REQUIRED FUNCTION NAME-->
|
|
function ActivationComplete(status, status_errcode)
|
|
{
|
|
g_CheckFinishAgain = true;
|
|
if ( status != null) {
|
|
|
|
g_ActivationStatus = status;
|
|
|
|
if ( g_ActivationStatus != ERR_ACT_SUCCESS ) {
|
|
|
|
trace("Activation failed. Error = " + g_ActivationStatus);
|
|
|
|
// These vars are for use in our finish page.
|
|
g_IsActivationSuccessful = false;
|
|
g_IsMSRegistrationSuccessful = false;
|
|
g_IsOEMRegistrationSuccessful = false;
|
|
|
|
g_act_specific_error = status_errcode;
|
|
GoNavigate(CKPT_ACT_MSG);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
CheckFinishStatus();
|
|
// we don't want CheckFinishStatus() to run again since g_DoActivation is set to false a few lines after this line, which causes some problems for the finish page.
|
|
g_CheckFinishAgain = false;
|
|
}
|
|
|
|
g_ActivationRequired = false;
|
|
g_DoActivation = false;
|
|
StatusObj.set_Status(MS_REGISTRATION, true);
|
|
}
|
|
|
|
if (g_PostToOEM)
|
|
{
|
|
if (0 == RegisterObj.get_OEMAddRegPage)
|
|
{
|
|
window.external.PostRegData(POST_TO_OEM);
|
|
StatusObj.set_Status(OEM_REGISTRATION, true);
|
|
g_IgnoreDialErr = true;
|
|
PopCKPT(CKPT_REGDIAL);
|
|
PopCKPT(CKPT_REGISTER3);
|
|
PopCKPT(); // either CKPT_REGISTER1 or CKPT_ACTIVATION
|
|
CheckFinishStatus();
|
|
if (InReminderMode())
|
|
GoNavigate(CKPT_ACT_MSG); // if we reach here, we were successful in our activation. Desktop.
|
|
else
|
|
GoNavigate(CKPT_ICONN); // if we reach here, we were successful in our activation. Full screen. But we don't show the congrats page anymore.
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// OEM should set the OEM_REGISTRATION once user has completed registration
|
|
// on the oemadd.htm by calling StatusObj.set_Status(OEM_REGISTRATION, true)
|
|
//
|
|
g_IgnoreDialErr = true;
|
|
|
|
if ( APP_REG_MODE == window.external.Directions.get_AppMode() )
|
|
{
|
|
Navigate("html\\oemreg\\roemadd.htm");
|
|
}
|
|
else
|
|
{
|
|
Navigate("html\\oemreg\\oemadd.htm");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
g_IgnoreDialErr = true;
|
|
|
|
PopCKPT(CKPT_REGDIAL);
|
|
PopCKPT(CKPT_REGISTER3);
|
|
PopCKPT(); // either CKPT_REGISTER1 or CKPT_ACTIVATION
|
|
CheckFinishStatus();
|
|
if (InReminderMode())
|
|
GoNavigate(CKPT_ACT_MSG); // if we reach here, we were successful in our activation. Desktop.
|
|
else
|
|
GoNavigate(CKPT_ICONN); // if we reach here, we were successful in our activation. Full screen. But we don't show the congrats page anymore.
|
|
}
|
|
|
|
if ((g_PostToMS && g_PostToOEM && (1 == RegisterObj.get_PostToOEM)) ||
|
|
((0 == RegisterObj.get_PostToOEM) && g_PostToMS))
|
|
{
|
|
if ( APP_REG_MODE == window.external.Directions.get_AppMode() )
|
|
{
|
|
// If user register both MS and OEM or
|
|
// if user register MS while OEM disable posting,
|
|
// then we won't remind user
|
|
window.external.StopRemind(REMIND_REG);
|
|
}
|
|
else
|
|
{
|
|
// If user register both MS and OEM or
|
|
// if user register MS while OEM disable posting,
|
|
// reminder has already created, need to delete it
|
|
window.external.DeleteRemind(REMIND_REG);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// LANGUAGE SETTINGS
|
|
|
|
// sort order
|
|
var SORT_DEFAULT = 0x0; // sorting default
|
|
// primary languages
|
|
var LANG_JAPANESE = 0x11;
|
|
var LANG_KOREAN = 0x12;
|
|
var LANG_CHINESE = 0x04;
|
|
// sub languages
|
|
var SUBLANG_KOREAN = 0x01; // Korean (Extended Wansung)
|
|
var SUBLANG_CHINESE_TRADITIONAL = 0x01; // Taiwan
|
|
var SUBLANG_CHINESE_SIMPLIFIED = 0x02; // Chinese (PR China)
|
|
var SUBLANG_DEFAULT = 0x01; // user default
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// MAKELANGID
|
|
//
|
|
// Creates a complete language identifier from a primary and a secondary
|
|
// language identifier.
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
function MAKELANGID(p, s)
|
|
{
|
|
return (( s << 10) | p);
|
|
}
|
|
|
|
function MAKELCID(lgid, srtid)
|
|
{
|
|
return ((srtid << 16) | lgid);
|
|
}
|
|
|
|
function IsKoreanLocale() {
|
|
var language = ApiObj.get_UserDefaultUILanguage();
|
|
if (language == MAKELCID(MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN), SORT_DEFAULT)) {
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function IsFarEastLocale()
|
|
{
|
|
// if local is Korean, Simplified Chinese,
|
|
// Traditional Chinese,or Japanese then we return true
|
|
var language = ApiObj.get_UserDefaultUILanguage();
|
|
|
|
if (language == MAKELCID(MAKELANGID(LANG_KOREAN, SUBLANG_KOREAN), SORT_DEFAULT) ||
|
|
language == MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL), SORT_DEFAULT) ||
|
|
language == MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT) ||
|
|
language == MAKELCID(MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT), SORT_DEFAULT))
|
|
return true
|
|
else
|
|
return false;
|
|
}
|
|
|