// ICS Connectivity status.
var ICS_CONN_STARTING = 1;
var ICS_CONN_CONNECTING = 2;
var ICS_CONN_CONNECTED = 3;
var ICS_CONN_DISCONNECTING = 4;
var ICS_CONN_DISCONNECTED = 5;
var ICS_CONN_STOPPED = 6;
var ICS_CONN_PERMANENT = 7;
var ICS_CONN_UNK_DIAL_STATE = 8;
var ICS_CONN_CALLWAITING = 9;
var ICS_CONN_HN_UNAVAILABLE = 1000;
var ICS_CONN_TIMEOUT = 5000;
var oldState = ICS_CONN_DISCONNECTED;
var currentState = ICS_CONN_DISCONNECTED;
// Types of connections to the Internet via ICS
var ICS_CONN_TYPE_REG = 0;
var ICS_CONN_TYPE_ISP = 1;
var ICS_CONN_TYPE_REF = 2;
var ICS_CONN_TYPE_MIG = 3;
var ICS_Error_Id = 0;
var ICS_ERR_HN_UNAVAILABLE = ICS_Error_Id++;
var ICS_ERR_MODEM_DISCONNECTED = ICS_Error_Id++;
var ICS_ERR_MODEM_FAILED_CONNECT = ICS_Error_Id++;
var ICS_ERR_STOPPED = ICS_Error_Id++;
var ICS_ERR_PERM_DISCONNECTED = ICS_Error_Id++;
var ICS_ERR_TIMEOUT = ICS_Error_Id++;
var LAN_ERR_HW_UNAVAILABLE1 = ICS_Error_Id++;
var LAN_ERR_HW_UNAVAILABLE2 = ICS_Error_Id++;
// Connection type bitmasks
//
// No attempt has been made at detecting connections or an attempt was made
// but failed. This is different from CONNECTIONTYPE_NONE in that it
// indicates that another attempt should be made to determine if connections
// exist.
//
var CONNECTIONTYPE_INVALID = 0x00000000;
// No connection devices exist
//
var CONNECTIONTYPE_NONE = 0x00000001;
// A modem is installed
//
var CONNECTIONTYPE_MODEM = 0x00000002;
// A network card is present and the ICS beacon was detected
//
var CONNECTIONTYPE_LAN_ICS = 0x00000004;
// A network card is present but ICS was not detected
//
var CONNECTIONTYPE_LAN_BROADBAND = 0x00000008;
// Multiple network cards were present and ICS was not detected. It is not
// possible to determine which card to use.
//
var CONNECTIONTYPE_LAN_INDETERMINATE = 0x00000010;
// An ISDN, PPPoE connection is present
//
var CONNECTIONTYPE_OTHER = 0x00000020;
var CONNECTIONTYPE_LAN = (CONNECTIONTYPE_LAN_ICS |
CONNECTIONTYPE_LAN_BROADBAND |
CONNECTIONTYPE_LAN_INDETERMINATE);
// Enumeration to indicate whether we can connect to the Internet
//
var INTERNET_UNKNOWN = -1;
var INTERNET_NO = 0;
var INTERNET_YES = 1;
// Enumeration to indicate whether we can configure a machine's Lan,
// including firewalling, setting IP address and etc.
//
var CONFIG_LAN_UNKNOWN = -1;
var CONFIG_LAN_NO = 0;
var CONFIG_LAN_YES = 1;
var g_ConnectionCapabilities = CONNECTIONTYPE_INVALID;
var g_PreferredConnection = null; // This is initialized in InitApplication() in msobshel.htm
var g_Internet = INTERNET_UNKNOWN;
var g_ModemTypes = null;
var g_CanConfigLan = CONFIG_LAN_UNKNOWN;
var g_PublicLanCount = 0;
var L_ERR_HN_UNAVAILABLE_Text = "Your computer is no longer connected to the Internet through your network.
To restore the connection, make sure that the network cable is securely plugged into your computer as well as the network.";
// var L_ERR_MODEM_DISCONNECTED = "The Shared Internet connection was unexpectedly interrupted. If your shared Internet Connection is a modem connection. It might have been disconnected.";
// var L_ERR_MODEM_FAILED_CONNECT = "The Shared Internet connection was unexpectedly interrupted as it was being established.
Click Retry to try connecting again.";
var L_ERRSTOPPED_Text = "Internet Connection Sharing is presently not available on your network. Click Retry to try connecting again.";
var L_ERR_PERM_DISCONNECTED_Text = "Internet Connection Sharing has been disconnected. If you're using a high-speed adapter to connect to the Internet (e.g. Broadband), please ensure that the adapter has been correctly configured and that the cables are securely attached.
Click Retry to try connecting again.";
var L_ERRTIMEOUT_Text = "There is a problem connecting to the Internet. Either your connection has timed out or this computer is not configured correctly to use the Shared Internet Connection.
Click Retry to try connecting again.";
var L_ERR_LAN_UNAVAILABLE1_Text = "Your computer is not connected to the Internet through your network.
Please check your network settings and confirm that you are able to connect to the Internet, then try again.";
var L_ERR_LAN_UNAVAILABLE2_Text = "Your computer is not connected to the Internet through your network.
Please select one of the following methods:";
function OnIcsConnectionStatus(iStatus)
{
oldState = currentState;
currentState = iStatus;
switch (g_CurrentCKPT)
{
case CKPT_REGISTER1:
case CKPT_REGISTER3:
case CKPT_ISPSIGNUP:
case CKPT_REFDIAL:
case CKPT_MIGDIAL:
break;
default:
return;
}
switch(iStatus)
{
case ICS_CONN_TIMEOUT:
ICS_Error_Id = ICS_ERR_TIMEOUT;
Navigate("icserror\\icsdc.htm");
break;
case ICS_CONN_PERMANENT:
break;
case ICS_CONN_STOPPED:
switch (oldState)
{
case ICS_CONN_PERMANENT:
ICS_Error_Id = ICS_ERR_STOPPED;
Navigate("icserror\\icsdc.htm");
break;
default:
break;
}
break;
case ICS_CONN_HN_UNAVAILABLE:
ICS_Error_Id = ICS_ERR_HN_UNAVAILABLE;
Navigate("icserror\\icsdc.htm");
break;
default:
break;
}
}
// one page handles all disconnect errors
function IcsDcError_LoadMe()
{
InitFrameRef();
InitNewButtons();
g.btnNext.onclick = IcsErrorNextBtnHandler;
g.btnSkip.onclick = IcsErrorSkipBtnHandler;
switch (ICS_Error_Id)
{
case ICS_ERR_HN_UNAVAILABLE:
g.ErrorPara1.innerHTML = L_ERR_HN_UNAVAILABLE_Text;
break;
case ICS_ERR_STOPPED:
g.ErrorPara1.innerHTML = L_ERRSTOPPED_Text;
break;
case ICS_ERR_PERM_DISCONNECTED:
g.ErrorPara1.innerHTML = L_ERR_PERM_DISCONNECTED_Text;
break;
case ICS_ERR_TIMEOUT:
g.ErrorPara1.innerHTML = L_ERRTIMEOUT_Text;
break;
case LAN_ERR_HW_UNAVAILABLE1:
case LAN_ERR_HW_UNAVAILABLE2:
g.btnBack.style.visibility = "visible";
g.BackBtnLocalText.style.visibility = "visible";
g.btnBack.onclick = IcsErrorBackBtnHandler;
if (ICS_Error_Id == LAN_ERR_HW_UNAVAILABLE1)
{
g.ErrorPara1.innerHTML = L_ERR_LAN_UNAVAILABLE1_Text;
}
else
{
g.ErrorPara1.innerHTML = L_ERR_LAN_UNAVAILABLE2_Text;
g.ErrorPara2.style.display = "inline";
}
break;
}
g.btnNext.focus();
}
function IcsErrorBackBtnHandler()
{
GoNavigate(g_CurrentCKPT);
}
function IcsErrorNextBtnHandler()
{
DisableAllButtons();
ResetConnectedToInternetEx();
switch (g_CurrentCKPT)
{
case CKPT_REGISTER1:
case CKPT_REGISTER3:
if (ICS_Error_Id == LAN_ERR_HW_UNAVAILABLE1)
{
LanActReg();
}
else if (ICS_Error_Id == LAN_ERR_HW_UNAVAILABLE2)
{
if (g.rb_conn_modem.checked)
{
GoNavigate(CKPT_REGDIAL);
}
else
{
LanActReg();
}
}
else
{
IcsConnect(ICS_CONN_TYPE_REG);
}
break;
case CKPT_ISPSIGNUP:
IcsConnect(ICS_CONN_TYPE_ISP);
break;
case CKPT_REFDIAL:
IcsConnect(ICS_CONN_TYPE_REF);
break;
case CKPT_MIGDIAL:
IcsConnect(ICS_CONN_TYPE_MIG);
break;
default:
break;
}
}
function IcsErrorSkipBtnHandler()
{
switch (g_CurrentCKPT)
{
case CKPT_REGISTER1:
case CKPT_REGISTER3:
// showing icsdc.htm is similar to showing acterror.htm
g_CurrentCKPT = CKPT_ACT_MSG;
break;
default:
break;
}
GoCancel();
}
function LanActReg()
{
if (g_Internet == INTERNET_UNKNOWN)
{
ConnectedToInternetEx(true, "LanActReg2();");
g.document.body.style.cursor = "wait";
}
else
{
LanActReg2();
}
}
function LanActReg2()
{
if (!ConnectedToInternetEx(false))
{
if (HasModem())
{
ICS_Error_Id = LAN_ERR_HW_UNAVAILABLE2;
}
else
{
ICS_Error_Id = LAN_ERR_HW_UNAVAILABLE1;
}
Navigate("icserror\\icsdc.htm");
}
else
{
CommonActReg();
}
}
function IcsConnect(iConnectionType)
{
// REVIEW: How does PPPoE affect the logic flow of this function?
// REVIEW: What happens if a PPPoE connection hasn't been established?
// REVIEW: What happens if a PPPoE connection can't be established?
if (g_Internet == INTERNET_UNKNOWN)
{
ConnectedToInternetEx(true, "IcsConnect2("+iConnectionType+")");
}
else
{
IcsConnect2(iConnectionType);
}
}
function IcsConnect2(iConnectionType)
{
if (!ConnectedToInternetEx(false))
{
OnIcsConnectionStatus ( ICS_CONN_HN_UNAVAILABLE );
return;
}
switch (iConnectionType)
{
case ICS_CONN_TYPE_REG:
CommonActReg();
break;
case ICS_CONN_TYPE_ISP:
// REVIEW: Remove. OOBE should never attempt ISP signup via LAN/ICS.
window.external.Connect(CONNECTED_ISP_SIGNUP, "msobe.isp");
break;
case ICS_CONN_TYPE_REF:
// REVIEW: Remove. OOBE should never attempt ISP signup via LAN/ICS.
window.external.Connect(CONNECTED_REFFERAL, "migrate.isp");
break;
case ICS_CONN_TYPE_MIG:
// REVIEW: Remove. window.external.Connect does not handle ISP index
// parameter. ISP migration is not done via LAN/ICS.
window.external.Connect(CONNECTED_ISP_MIGRATE, gselectedISPIndx);
break;
default:
break;
}
}
function CommonActReg()
{
// REVIEW:Does window.external.Connect do anything useful in this case?
//
window.external.Connect(CONNECTED_REGISTRATION, "reg.isp");
if (g_DoActivation)
{
window.external.AsyncActivate(g_PostToMS);
}
else
{
if (g_PostToMS)
{
window.external.PostRegData(POST_TO_MS);
StatusObj.set_Status(MS_REGISTRATION, true);
}
ActivationComplete();
}
}
function UseIcs()
{
fResult = ((CONNECTIONTYPE_LAN_ICS == GetPreferredConnection())
&& HasIcs()) ? true : false;
trace("UseIcs: " + fResult);
return fResult;
} // UseIcs
function HasIcs()
{
fResult = (CONNECTIONTYPE_LAN_ICS & GetConnectionCapabilities()) ? true : false;
trace("HasIcs: " + fResult);
return fResult;
} // HasIcs
function UseBroadband()
{
fResult = (CONNECTIONTYPE_LAN_BROADBAND == GetPreferredConnection() && HasBroadband()) ? true : false;
trace("UseBroadband: " + fResult);
return fResult;
} // UseBroadband
function HasBroadband()
{
fResult = (CONNECTIONTYPE_LAN_BROADBAND & GetConnectionCapabilities()) ? true : false;
trace("HasBroadband: " + fResult);
return fResult;
} // HasBroadband
function HasIndeterminateLan()
{
fResult = (CONNECTIONTYPE_LAN_INDETERMINATE & GetConnectionCapabilities()) ? true : false;
trace("HasIndeterminateLan: " + fResult);
return fResult;
} // HasIndeterminateLan
// This will return true if you have a modem but no NIC. It will return false if you have a modem and a NIC,
// because NIC will always be the preferred connection over a modem.
function UseModem()
{
fResult = (CONNECTIONTYPE_MODEM == GetPreferredConnection() && HasModem()) ? true : false;
trace("UseModem: " + fResult);
return fResult;
} // UseModem
// This will return true if you have a modem regardless if you have a NIC or not.
function HasModem()
{
// For XP, window.external.GetConnectionCapabilities ignores
// modems. Use window.external.CheckDialReady instead.
//
fResult = (CONNECTIONTYPE_MODEM & GetConnectionCapabilities()) ? true : false;
trace("HasModem: " + fResult);
return fResult;
} // HasModem
function HasAnalogModem()
{
GetConnectionCapabilities();
fResult = (g_ModemTypes == ERR_COMM_NO_ERROR);
trace("HasAnalogModem: " + fResult);
return fResult;
} // HasAnalogModem
function UseAnalogModem()
{
fResult = (CONNECTIONTYPE_MODEM == GetPreferredConnection() && HasAnalogModem()) ? true : false;
trace("UseAnalogModem: " + fResult);
return fResult;
} // UseAnalogModem
function UseNetwork()
{
return (UseIcs() || UseBroadband() || HasIndeterminateLan());
} // UseNetwork
function HasNetwork()
{
var fResult = (GetConnectionCapabilities() & CONNECTIONTYPE_LAN) ? true : false;
trace("HasNetwork: " + fResult);
return fResult;
} // HasNetwork
function HasConnection()
{
fResult = (HasNetwork() || HasModem());
trace("HasConnection: " + fResult);
return fResult;
} // HasConnection
function SetPreferredConnection(ctPreferred)
{
// window.external.SetPreferredConnection validates the connection type.
// Only update g_PreferredConnection if the connection type is valid.
//
if (window.external.SetPreferredConnection(ctPreferred))
{
g_PreferredConnection = ctPreferred;
}
else if ((ctPreferred == CONNECTIONTYPE_MODEM) && HasModem())
{
g_PreferredConnection = CONNECTIONTYPE_MODEM;
}
// Save g_PreferredConnection to registry, for use in cases where we cold boot OOBE after ics.htm page.
ApiObj.set_RegValue(HKEY_LOCAL_MACHINE, OOBE_MAIN_REG_KEY + "\\TEMP", PREFCONN_REG_VALUE, g_PreferredConnection);
} // SetConnectionPreferred
function GetPreferredConnection()
{
if (CONNECTIONTYPE_INVALID == g_PreferredConnection
)
{
trace("Calling window.external.GetPreferredConnection");
g_PreferredConnection = window.external.GetPreferredConnection();
// For XP, window.external.GetPreferredConnection ignores
// modems.
//
if (CONNECTIONTYPE_NONE == g_PreferredConnection
&& HasModem() )
{
g_PreferredConnection = CONNECTIONTYPE_MODEM;
}
}
trace("GetPreferredConnection: " + g_PreferredConnection);
return g_PreferredConnection;
} // GetPreferredConnection
function GetConnectionCapabilities()
{
// REVIEW: need to return invalid until services have been started.
if (CONNECTIONTYPE_INVALID == g_ConnectionCapabilities)
{
trace("Calling window.external.GetConnectionCapabilities");
g_ConnectionCapabilities = window.external.GetConnectionCapabilities();
// For XP, window.external.GetConnectionCapabilities ignores
// modems.
//
g_ModemTypes = window.external.CheckDialReady();
if (ERR_COMM_NO_ERROR == g_ModemTypes ||
ERR_COMM_ISDN == g_ModemTypes ||
ERR_COMM_PHONE_AND_ISDN == g_ModemTypes)
{
g_ConnectionCapabilities |= CONNECTIONTYPE_MODEM;
}
}
trace("GetConnectionCapabilities: " + g_ConnectionCapabilities);
return g_ConnectionCapabilities;
} // GetConnectionCapabilities
function InternetCapabilityExists()
{
var fExists = false;
// look for network connection first, then modem if that fails
//
if (HasNetwork())
{
fExists = true;
}
if (!fExists && HasModem())
{
fExists = true;
}
trace("InternetCapabilityExists: " + fExists);
return fExists;
} // InternetCapabilityExists
var ICS_MINIMUM_CALLBACK_SLEEP_TIME = 6000;
var ICS_MINIMUM_TIMEOUT = 40;
function AsyncCallback(callback)
{
this._callback = callback;
this._startTime = (new Date()).getTime();
}
function InvokeCallback()
{
if (this._callback != null)
{
var timeRemained = ICS_MINIMUM_CALLBACK_SLEEP_TIME -
((new Date()).getTime() - this._startTime);
// We need to use setTimeout so that the script won't be
// executed by abitrary application, but the script engine thread.
// Otherwise, the script engine may hang.
//
if (timeRemained < ICS_MINIMUM_TIMEOUT)
{
// The timeout value chosen is arbitrary. It just need to be small.
//
setTimeout(this._callback, ICS_MINIMUM_TIMEOUT);
}
else
{
setTimeout(this._callback, timeRemained);
}
}
}
AsyncCallback.prototype.InvokeCallback = InvokeCallback;
var g_ConnectedToInternetCallback = null;
//
// Return the internet connection status.
//
// If the callback is null, always returns normally (synchronously).
// If callback is not null, always returns using the callback (asynchronously),
// which should check the status by ConnectedToInternetEx(false).
//
function ConnectedToInternetEx(bRefresh, callback)
{
var retval = false;
if (UseModem() && (GetConnectionCapabilities() == CONNECTIONTYPE_MODEM))
{
// Use whatever returned by the old API and don't change the
// global state
if (callback == null)
{
retval = window.external.ConnectedToInternet();
}
else
{
trace("ConnectedToInternetEx("+bRefresh+", "+callback+")");
setTimeout(callback, ICS_MINIMUM_CALLBACK_SLEEP_TIME);
}
}
else if (bRefresh && g_Internet == INTERNET_UNKNOWN)
{
// Refresh the global state about the Internet connection
if (callback == null)
{
retval = window.external.ConnectedToInternetEx()
g_Internet = (retval) ? INTERNET_YES : INTERNET_NO;
}
else
{
g_ConnectedToInternetCallback = new AsyncCallback(callback);
setTimeout("window.external.AsyncConnectedToInternetEx()",
ICS_MINIMUM_TIMEOUT);
// return at ReturnConnectedToInternetEx
}
}
else
{
// Use cached results
if (callback == null)
{
retval = (g_Internet == INTERNET_YES);
}
else
{
setTimeout(callback, ICS_MINIMUM_CALLBACK_SLEEP_TIME);
}
}
return retval;
}
function ResetConnectedToInternetEx()
{
g_Internet = INTERNET_UNKNOWN;
}
function ReturnConnectedToInternetEx(bConnected)
{
g_Internet = (bConnected) ? INTERNET_YES : INTERNET_NO;
if (g_ConnectedToInternetCallback != null)
{
g_ConnectedToInternetCallback.InvokeCallback();
g_ConnectedToInternetCallback = null;
}
}
function CanConfigLan()
{
if (HasBroadband() || HasIndeterminateLan())
{
return g_CanConfigLan;
}
return CONFIG_LAN_NO;
}
function GetPublicLanCount()
{
return g_PublicLanCount;
}
var g_CheckIfConfigInternetCallback = null;
//
// Precondition:
//
// CanConfigLan() != CONFIG_LAN_NO
//
// Description:
//
// The callback will be invoked asynchronously one the
// window.external.AsyncGetPublicLanCount returns through
// ReturnGetPublicLanCount. The UI won't be frozened.
//
// Postcondition:
//
// g_CanConfigLan, g_PublicLanCount and g_Internet are determined.
// callback is invoked.
//
function CheckIfConfigLan(callback)
{
g_CheckIfConfigInternetCallback = new AsyncCallback(callback);
setTimeout("window.external.AsyncGetPublicLanCount()", ICS_MINIMUM_TIMEOUT);
// return at ReturnCheckIfConfigInternet
}
function ReturnGetPublicLanCount(bConnected, cPublicLan)
{
// bConnected and/or cPublicLan can be null if some serious failure occurred.
g_Internet = (bConnected) ? INTERNET_YES : INTERNET_NO;
if (cPublicLan)
{
g_PublicLanCount = cPublicLan;
}
else
{
g_PublicLanCount = 0;
}
// g_Internet and g_PublicLanCount can be inconsistent because
// they rely on the status of different servers on the Internet.
if (g_Internet == INTERNET_YES)
{
if (g_PublicLanCount == 0)
{
if (HasBroadband())
{
g_PublicLanCount = 1;
}
}
}
if (g_PublicLanCount >= 1 || HasBroadband())
{
g_CanConfigLan = CONFIG_LAN_YES;
}
else
{
g_CanConfigLan = CONFIG_LAN_NO;
}
if (g_CheckIfConfigInternetCallback != null)
{
g_CheckIfConfigInternetCallback.InvokeCallback();
g_CheckIfConfigInternetCallback = null;
}
}