public static HashSet <CompDBXmlClass.CompDB> GetCompDBsFromUUPFiles(string UUPPath) { HashSet <CompDBXmlClass.CompDB> compDBs = new HashSet <CompDBXmlClass.CompDB>(); try { if (Directory.EnumerateFiles(UUPPath, "*aggregatedmetadata*").Count() > 0) { using (CabinetHandler cabinet = new CabinetHandler(File.OpenRead(Directory.EnumerateFiles(UUPPath, "*aggregatedmetadata*").First()))) { foreach (var file in cabinet.Files.Where(x => x.EndsWith(".xml.cab", StringComparison.InvariantCultureIgnoreCase))) { try { using (CabinetHandler cabinet2 = new CabinetHandler(cabinet.OpenFile(file))) { string xmlfile = cabinet2.Files.First(); using (Stream xmlstream = cabinet2.OpenFile(xmlfile)) { compDBs.Add(CompDBXmlClass.DeserializeCompDB(xmlstream)); } } } catch { } } } } else { IEnumerable <string> files = Directory.EnumerateFiles(UUPPath).Select(x => Path.GetFileName(x)).Where(x => x.EndsWith(".xml.cab", StringComparison.InvariantCultureIgnoreCase)); foreach (var file in files) { try { using (CabinetHandler cabinet2 = new CabinetHandler(File.OpenRead(Path.Combine(UUPPath, file)))) { string xmlfile = cabinet2.Files.First(); using (Stream xmlstream = cabinet2.OpenFile(xmlfile)) { compDBs.Add(CompDBXmlClass.DeserializeCompDB(xmlstream)); } } } catch { } } } } catch { } return(compDBs); }
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); }