private static async Task <HashSet <CompDBXmlClass.CompDB> > GetCompDBs(UpdateData update) { HashSet <CompDBXmlClass.CompDB> neutralCompDB = new HashSet <CompDBXmlClass.CompDB>(); HashSet <CExtendedUpdateInfoXml.File> metadataCabs = new HashSet <CExtendedUpdateInfoXml.File>(); foreach (CExtendedUpdateInfoXml.File file in update.Xml.Files.File) { if (file.PatchingType.Equals("metadata", StringComparison.InvariantCultureIgnoreCase)) { metadataCabs.Add(file); } } if (metadataCabs.Count == 0) { return(neutralCompDB); } if (metadataCabs.Count == 1 && metadataCabs.First().FileName.Contains("metadata", StringComparison.InvariantCultureIgnoreCase)) { // This is the new metadata format where all metadata is in a single cab if (string.IsNullOrEmpty(update.CachedMetadata)) { var fileDownloadInfo = await FE3Handler.GetFileUrl(update, metadataCabs.First().Digest); if (fileDownloadInfo == null) { return(neutralCompDB); } string metadataCabTemp = Path.GetTempFileName(); // Download the file await client.DownloadFileTaskAsync(new Uri(fileDownloadInfo.DownloadUrl), metadataCabTemp); if (fileDownloadInfo.IsEncrypted) { if (!fileDownloadInfo.Decrypt(metadataCabTemp, metadataCabTemp + ".decrypted")) { return(neutralCompDB); } metadataCabTemp += ".decrypted"; } update.CachedMetadata = metadataCabTemp; } using (CabinetHandler cabinet = new CabinetHandler(File.OpenRead(update.CachedMetadata))) { foreach (string file in cabinet.Files) { using (CabinetHandler cabinet2 = new CabinetHandler(cabinet.OpenFile(file))) { string xmlfile = cabinet2.Files.First(); using (Stream xmlstream = cabinet2.OpenFile(xmlfile)) { neutralCompDB.Add(CompDBXmlClass.DeserializeCompDB(xmlstream)); } } } } } else { // This is the old format, each cab is a file in WU foreach (CExtendedUpdateInfoXml.File file in metadataCabs) { var fileDownloadInfo = await FE3Handler.GetFileUrl(update, file.Digest); if (fileDownloadInfo == null) { continue; } string metadataCabTemp = Path.GetTempFileName(); // Download the file await client.DownloadFileTaskAsync(new Uri(fileDownloadInfo.DownloadUrl), metadataCabTemp); if (fileDownloadInfo.IsEncrypted) { if (!fileDownloadInfo.Decrypt(metadataCabTemp, metadataCabTemp + ".decrypted")) { continue; } metadataCabTemp += ".decrypted"; } update.CachedMetadata = metadataCabTemp; using (CabinetHandler cabinet2 = new CabinetHandler(File.OpenRead(update.CachedMetadata))) { string xmlfile = cabinet2.Files.First(); using (Stream xmlstream = cabinet2.OpenFile(xmlfile)) { neutralCompDB.Add(CompDBXmlClass.DeserializeCompDB(xmlstream)); } } } } return(neutralCompDB); }
public async static Task <string> GetBuildStringAsync(this UpdateData update) { try { CExtendedUpdateInfoXml.File deploymentCab = null; foreach (var file in update.Xml.Files.File) { if (file.FileName.EndsWith("deployment.cab", StringComparison.InvariantCultureIgnoreCase)) { deploymentCab = file; break; } } if (deploymentCab == null) { return(null); } var fileDownloadInfo = await FE3Handler.GetFileUrl(update, deploymentCab.Digest); if (fileDownloadInfo == null) { return(null); } string deploymentCabTemp = Path.GetTempFileName(); await client.DownloadFileTaskAsync(new Uri(fileDownloadInfo.DownloadUrl), deploymentCabTemp); if (fileDownloadInfo.IsEncrypted) { if (!fileDownloadInfo.Decrypt(deploymentCabTemp, deploymentCabTemp + ".decrypted")) { return(null); } File.Delete(deploymentCabTemp); File.Move(deploymentCabTemp + ".decrypted", deploymentCabTemp); } string result = null; try { using (var cabinet = new CabinetHandler(File.OpenRead(deploymentCabTemp))) { foreach (var file in cabinet.Files) { if (file.Equals("UpdateAgent.dll", StringComparison.InvariantCultureIgnoreCase)) { byte[] buffer; using (var dllstream = cabinet.OpenFile(file)) { buffer = new byte[dllstream.Length]; await dllstream.ReadAsync(buffer, 0, (int)dllstream.Length); } result = GetBuildStringFromUpdateAgent(buffer); break; } } } } catch { } var reportedBuildNumberFromService = update.Xml.ExtendedProperties.ReleaseVersion.Split('.')[2]; if (!string.IsNullOrEmpty(result) && result.Count(x => x == '.') >= 2) { var elements = result.Split('.'); elements[2] = reportedBuildNumberFromService; result = string.Join(".", elements); } File.Delete(deploymentCabTemp); return(result); } catch { return(null); } }