Files
ZuneShell.dll/ZuneUI/SoftwareUpdates.cs
T

311 lines
11 KiB
C#

// Decompiled with JetBrains decompiler
// Type: ZuneUI.SoftwareUpdates
// Assembly: ZuneShell, Version=4.7.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: FC8028F3-A47B-4FB4-B35B-11D1752D8264
// Assembly location: C:\Program Files\Zune\ZuneShell.dll
using Microsoft.Iris;
using Microsoft.Win32;
using Microsoft.Zune.Configuration;
using Microsoft.Zune.Service;
using Microsoft.Zune.Util;
using MicrosoftZuneLibrary;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.Net;
using System.Text;
using System.Threading;
namespace ZuneUI
{
public class SoftwareUpdates : ModelItem
{
private const string m_PID = "92510-320-9256355-04773";
private bool m_checkingForUpdates;
private bool m_backgroundCheck;
private bool m_userInitiatedUpdate;
private static SoftwareUpdates m_instance;
private UpdateCheckEventArguments _lastUpdateCheckResult;
public event EventHandler InstallInitiated;
public static SoftwareUpdates Instance
{
get
{
if (m_instance == null)
m_instance = new SoftwareUpdates();
return m_instance;
}
}
public static string PID => "92510-320-9256355-04773";
public void StartUp() => Application.DeferredInvoke(new DeferredInvokeHandler(this.DeferredStartUp), DeferredInvokePriority.Low);
public bool CheckingForUpdates
{
get => this.m_checkingForUpdates;
private set
{
if (this.m_checkingForUpdates == value)
return;
this.m_checkingForUpdates = value;
this.FirePropertyChanged(nameof(CheckingForUpdates));
}
}
public UpdateCheckEventArguments LastUpdateCheckResult
{
get => this._lastUpdateCheckResult;
set
{
if (this._lastUpdateCheckResult == value)
return;
this._lastUpdateCheckResult = value;
this.FirePropertyChanged(nameof(LastUpdateCheckResult));
}
}
public void CheckForUpdates(bool isUserInitiated)
{
if (!this.CheckingForUpdates)
{
this._lastUpdateCheckResult = null;
this.CheckingForUpdates = true;
this.m_userInitiatedUpdate = isUserInitiated;
UpdateManager.Instance.BeginUpdateCheck(new UpdateProgressHandler(this.UpdateCheckCallback));
if (!this.m_userInitiatedUpdate)
return;
SQMLog.Log(SQMDataId.ManualCheckForUpdatesInvoked, 1);
}
else
this.m_backgroundCheck = false;
}
public void CancelCheckForUpdates()
{
UpdateManager.Instance.CancelUpdateCheck();
Instance.CheckingForUpdates = false;
}
public void InstallUpdates()
{
this.OnInstallInitiated();
UpdateManager.Instance.InstallUpdate(new UpdateProgressHandler(this.UpdateCheckCallback));
}
public void ShowUpdateAvailabilityDialog()
{
if (!this.LastUpdateCheckResult.UpdateFound && this.m_backgroundCheck)
return;
if (this.IsWUClientUpToDate())
{
if (this.LastUpdateCheckResult.HR >= 0)
UpdateDialogInfo.Show(this.LastUpdateCheckResult.UpdateFound, this.LastUpdateCheckResult.CriticalUpdateFound, this.m_userInitiatedUpdate);
else
Shell.ShowErrorDialog(this.LastUpdateCheckResult.HR, StringId.IDS_CHECK_FOR_UPDATES_FAILED);
}
else
Shell.ShowErrorDialog(-1072885299, StringId.IDS_CHECK_FOR_UPDATES_FAILED, StringId.IDS_CHECK_FOR_UPDATES_FAILED_DESCRIPTION);
}
private bool IsWUClientUpToDate()
{
string str = Environment.ExpandEnvironmentVariables("%windir%\\System32\\wuaueng.dll");
bool flag = false;
if (str != null && System.IO.File.Exists(str) && new Version(FileVersionInfo.GetVersionInfo(str).ProductVersion).CompareTo(new Version("7.2.6001.784")) >= 0)
flag = true;
return flag;
}
private void OnInstallInitiated()
{
if (this.InstallInitiated != null)
this.InstallInitiated(this, null);
this.FirePropertyChanged("InstallInitiated");
}
private void DeferredStartUp(object state)
{
this.CheckOsUpgrade();
DateTime lastUpdateCheck = ClientConfiguration.Shell.LastUpdateCheck;
uint num = Math.Min((uint)MachineConfiguration.Setup.UpdateCheckFrequency, 14U);
if (Math.Abs((DateTime.UtcNow - lastUpdateCheck).Days) >= num && !Fue.Instance.IsFirstLaunch && !Shell.SettingsFrame.Wizard.IsCurrent)
{
this.m_backgroundCheck = true;
this.CheckForUpdates(false);
}
this.CheckCodecAccounting();
}
private void DeferredUpdateCheckCallback(object args)
{
this.LastUpdateCheckResult = (UpdateCheckEventArguments)args;
if (this.LastUpdateCheckResult.HR >= 0)
{
try
{
ClientConfiguration.Shell.LastUpdateCheck = DateTime.UtcNow;
}
catch (ApplicationException ex)
{
}
}
if (this.m_backgroundCheck)
this.ShowUpdateAvailabilityDialog();
this.m_userInitiatedUpdate = false;
this.m_backgroundCheck = false;
this.CheckingForUpdates = false;
}
private void UpdateCheckCallback(UpdateCheckEventArguments args) => Application.DeferredInvoke(new DeferredInvokeHandler(this.DeferredUpdateCheckCallback), args, DeferredInvokePriority.Normal);
private void CheckOsUpgrade()
{
int num = Environment.OSVersion.Version.Major * 100 + Environment.OSVersion.Version.Minor;
int osVersion = MachineConfiguration.Setup.OSVersion;
if (num <= osVersion)
return;
if (osVersion < 600 && MachineConfiguration.HME.CurrentSharingUID != 0)
ThreadPool.QueueUserWorkItem(new WaitCallback(this.RepairNetworkSharingService), num);
if (osVersion >= 601 || num < 601)
return;
ThreadPool.QueueUserWorkItem(new WaitCallback(this.CreatePodcastLibraryTemplate), num);
}
private void RepairNetworkSharingService(object state)
{
int num = (int)state;
HMESettings hmeSettings = new HMESettings();
HRESULT hresult = hmeSettings.Init();
if (hresult.IsSuccess)
hresult = hmeSettings.RepairSharing();
if (!hresult.IsSuccess)
return;
MachineConfiguration.Setup.OSVersion = num;
}
private void CreatePodcastLibraryTemplate(object state)
{
int num = (int)state;
if (((HRESULT)Win7ShellManager.Instance.CreatePodcastLibraryTemplate()).IsSuccess)
MachineConfiguration.Setup.OSVersion = num;
Win7ShellManager.Instance.SyncLibraryFolders();
}
private void CheckCodecAccounting()
{
if (MachineConfiguration.Setup.CodecInfoSent)
return;
RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Zune");
DateTime utcNow = DateTime.UtcNow;
DateTime localTime = utcNow.ToLocalTime();
long totalMilliseconds = (long)localTime.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds;
string str1 = "ZuneSetup.exe";
string wtProfile = MachineConfiguration.Setup.WTProfile;
string str2 = totalMilliseconds.ToString();
string str3 = localTime.ToString("yyyy/MM/dd");
string str4 = TimeZone.CurrentTimeZone.GetUtcOffset(localTime).Hours.ToString();
string str5 = localTime.Hour.ToString();
string ietfLanguageTag = CultureInfo.CurrentUICulture.IetfLanguageTag;
string installationSource = MachineConfiguration.Setup.InstallationSource;
string pid = PID;
string version1 = (string)registryKey.GetValue("CurrentVersion");
string oldVersion = MachineConfiguration.Setup.OldVersion;
string str6 = string.Empty;
string str7 = "New";
if (!string.IsNullOrEmpty(version1))
{
try
{
Version version2 = new Version(version1);
int major = version2.Major;
int minor = version2.Minor;
if (!string.IsNullOrEmpty(oldVersion))
{
Version version3 = new Version(oldVersion);
str7 = !(version2 == version3) ? (version2.Major <= version3.Major ? (version2.Major != version3.Major ? "ReInstall" : "Upgrade") : "MajorUpgrade") : "ReInstall";
}
}
catch (ArgumentException ex)
{
}
catch (FormatException ex)
{
}
catch (OverflowException ex)
{
}
}
try
{
using (CryptoHelper cryptoHelper = new CryptoHelper(pid))
{
string data = utcNow.ToString("yyyy-MM-dd-hh-mm-ss");
str6 = Uri.EscapeDataString(cryptoHelper.Encrypt(data));
}
}
catch (Win32Exception ex)
{
}
string[] strArray = new string[27]
{
"http://m.webtrends.com/dcs8fe5yk00000s538qdxmbst_2t2k/dcs.gif",
"?dcsdat=",
str2,
"&dcsuri=",
str1,
"&dcssip=",
wtProfile,
"&wt.tz=",
str4,
"&wt.bh=",
str5,
"&wt.date=",
str3,
"&wt.ul=",
ietfLanguageTag,
"&zune_cver=",
version1,
"&zune_isource=",
installationSource,
"&zune_itype=",
str7,
"&zune_over=",
oldVersion,
"&zune_pid=",
pid,
"&zune_gmthash=",
str6
};
StringBuilder stringBuilder = new StringBuilder();
for (int index = 0; index < strArray.Length; ++index)
stringBuilder.Append(strArray[index]);
try
{
Microsoft.Zune.Service.HttpWebRequest httpWebRequest = Microsoft.Zune.Service.HttpWebRequest.Create(new Uri(stringBuilder.ToString()));
httpWebRequest.CancelOnShutdown = true;
httpWebRequest.GetResponseAsync(new AsyncRequestComplete(this.OnRequestComplete), null);
}
catch (Exception ex)
{
}
}
private void OnRequestComplete(Microsoft.Zune.Service.HttpWebResponse response, object requestArgs)
{
if (response.StatusCode == HttpStatusCode.OK)
{
MachineConfiguration.Setup.CodecInfoSent = true;
}
else
{
int statusCode = (int)response.StatusCode;
}
}
}
}