private AutoWebProxyState EnsureEngineAvailable(ref int syncStatus)
{
GlobalLog.Enter("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable");
AutoWebProxyScriptWrapper newScriptInstance;
if (state == AutoWebProxyState.Uninitialized || engineScriptLocation == null)
{
// Either Auto-Detect wasn't enabled or something failed with it. Try the manual script location.
if (automaticConfigurationScript != null)
{
GlobalLog.Print("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable() using automaticConfigurationScript:" + ValidationHelper.ToString(automaticConfigurationScript) + " engineScriptLocation:" + ValidationHelper.ToString(engineScriptLocation));
state = AutoWebProxyState.DiscoverySuccess;
if (automaticConfigurationScript.Equals(engineScriptLocation))
{
state = AutoWebProxyState.CompilationSuccess;
GlobalLog.Leave("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable", ValidationHelper.ToString(state));
return state;
}
state = DownloadAndCompile(automaticConfigurationScript, out newScriptInstance, ref syncStatus);
if (state == AutoWebProxyState.CompilationSuccess)
{
UpdateScriptInstance(newScriptInstance);
engineScriptLocation = automaticConfigurationScript;
GlobalLog.Leave("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable", ValidationHelper.ToString(state));
return state;
}
}
}
else
{
// We always want to call DownloadAndCompile to check the expiration.
GlobalLog.Print("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable() state:" + state + " engineScriptLocation:" + ValidationHelper.ToString(engineScriptLocation));
state = AutoWebProxyState.DiscoverySuccess;
state = DownloadAndCompile(engineScriptLocation, out newScriptInstance, ref syncStatus);
if (state == AutoWebProxyState.CompilationSuccess)
{
UpdateScriptInstance(newScriptInstance);
GlobalLog.Leave("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable", ValidationHelper.ToString(state));
return state;
}
// There's still an opportunity to fail over to the automaticConfigurationScript.
if (!engineScriptLocation.Equals(automaticConfigurationScript))
{
GlobalLog.Print("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable() Update failed. Falling back to automaticConfigurationScript:" + ValidationHelper.ToString(automaticConfigurationScript));
state = AutoWebProxyState.DiscoverySuccess;
state = DownloadAndCompile(automaticConfigurationScript, out newScriptInstance, ref syncStatus);
if (state == AutoWebProxyState.CompilationSuccess)
{
UpdateScriptInstance(newScriptInstance);
engineScriptLocation = automaticConfigurationScript;
GlobalLog.Leave("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable", ValidationHelper.ToString(state));
return state;
}
}
}
// Everything failed. Set this instance to mostly-dead. It will wake up again if there's a reg/connectoid change.
GlobalLog.Print("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable() All failed.");
state = AutoWebProxyState.DiscoveryFailure;
UpdateScriptInstance(null);
engineScriptLocation = null;
GlobalLog.Leave("AutoWebProxyScriptEngine#" + ValidationHelper.HashString(this) + "::EnsureEngineAvailable", ValidationHelper.ToString(state));
return state;
}