public static async Task <uint> GetFileDataIDByFilename(string buildConfig, string cdnConfig, string filename) { var build = await BuildCache.GetOrCreate(buildConfig, cdnConfig); using var hasher = new Jenkins96(); var lookup = hasher.ComputeHash(filename, true); if (build.root.entriesLookup.TryGetValue(lookup, out var entry)) { return(entry[0].fileDataID); } return(0); }
public static async Task <bool> FileExists(string buildConfig, string filename) { var build = await BuildCache.GetOrCreate(buildConfig); using (var hasher = new Jenkins96()) { var lookup = hasher.ComputeHash(filename, true); if (build.root.entriesLookup.ContainsKey(lookup)) { return(true); } } return(false); }
public static byte[] GetFileByFilename(string buildConfig, string cdnConfig, string filename) { if (!buildDictionary.ContainsKey(buildConfig)) { LoadBuild("wowt", buildConfig, cdnConfig); } var build = buildDictionary[buildConfig]; var hasher = new Jenkins96(); var lookup = hasher.ComputeHash(filename, true); var target = ""; if (build.root.entriesLookup.TryGetValue(lookup, out var entry)) { RootEntry?prioritizedEntry = entry.FirstOrDefault(subentry => subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && (subentry.localeFlags.HasFlag(LocaleFlags.All_WoW) || subentry.localeFlags.HasFlag(LocaleFlags.enUS)) ); var selectedEntry = (prioritizedEntry != null) ? prioritizedEntry.Value : entry.First(); target = selectedEntry.md5.ToHexString().ToLower(); } if (string.IsNullOrEmpty(target)) { var filedataid = Database.GetFileDataIDByFilename(filename); if (filedataid != 0) { if (build.root.entriesFDID.TryGetValue(filedataid, out var fdidentry)) { RootEntry?prioritizedEntry = fdidentry.FirstOrDefault(subentry => subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && (subentry.localeFlags.HasFlag(LocaleFlags.All_WoW) || subentry.localeFlags.HasFlag(LocaleFlags.enUS)) ); var selectedEntry = (prioritizedEntry != null) ? prioritizedEntry.Value : fdidentry.First(); target = selectedEntry.md5.ToHexString().ToLower(); } } } if (string.IsNullOrEmpty(target)) { throw new FileNotFoundException("No file found in root for filename " + filename); } return(GetFile(buildConfig, cdnConfig, target)); }
public static bool FileExists(string buildConfig, string cdnConfig, string filename) { if (!buildDictionary.ContainsKey(buildConfig)) { LoadBuild("wowt", buildConfig, cdnConfig); } var hasher = new Jenkins96(); var lookup = hasher.ComputeHash(filename, true); if (buildDictionary[buildConfig].root.entriesLookup.ContainsKey(lookup)) { return(true); } return(false); }
public static uint GetFileDataIDByFilename(string buildConfig, string cdnConfig, string filename) { if (!buildDictionary.ContainsKey(buildConfig)) { LoadBuild("wowt", buildConfig, cdnConfig); } var build = buildDictionary[buildConfig]; var hasher = new Jenkins96(); var lookup = hasher.ComputeHash(filename, true); if (build.root.entriesLookup.TryGetValue(lookup, out var entry)) { return(entry[0].fileDataID); } return(0); }
public async static Task <byte[]> GetFileByFilename(string buildConfig, string cdnConfig, string filename, LocaleFlags locale = LocaleFlags.All_WoW) { var build = await BuildCache.GetOrCreate(buildConfig, cdnConfig); using var hasher = new Jenkins96(); var lookup = hasher.ComputeHash(filename, true); var target = ""; if (build.root.entriesLookup.TryGetValue(lookup, out var entry)) { RootEntry prioritizedEntry; if (locale == LocaleFlags.All_WoW) { prioritizedEntry = entry.FirstOrDefault(subentry => subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && (subentry.localeFlags.HasFlag(LocaleFlags.All_WoW) || subentry.localeFlags.HasFlag(LocaleFlags.enUS)) ); } else { prioritizedEntry = entry.FirstOrDefault(subentry => subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && subentry.localeFlags.HasFlag(locale) ); } var selectedEntry = (prioritizedEntry.fileDataID != 0) ? prioritizedEntry : entry.First(); target = selectedEntry.md5.ToHexString().ToLower(); } if (string.IsNullOrEmpty(target)) { var filedataid = await Database.GetFileDataIDByFilename(filename); if (filedataid != 0) { if (build.root.entriesFDID.TryGetValue(filedataid, out var fdidentry)) { RootEntry prioritizedEntry; if (locale == LocaleFlags.All_WoW) { prioritizedEntry = fdidentry.FirstOrDefault(subentry => subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && (subentry.localeFlags.HasFlag(LocaleFlags.All_WoW) || subentry.localeFlags.HasFlag(LocaleFlags.enUS)) ); } else { prioritizedEntry = fdidentry.FirstOrDefault(subentry => subentry.contentFlags.HasFlag(ContentFlags.LowViolence) == false && subentry.localeFlags.HasFlag(locale) ); } var selectedEntry = (prioritizedEntry.fileDataID != 0) ? prioritizedEntry : fdidentry.First(); target = selectedEntry.md5.ToHexString().ToLower(); } } } if (string.IsNullOrEmpty(target)) { throw new FileNotFoundException("No file found in root for filename " + filename); } return(await GetFile(buildConfig, cdnConfig, target)); }
public static RootFile GetRoot(string url, string hash, bool parseIt = false) { var root = new RootFile { entriesLookup = new MultiDictionary <ulong, RootEntry>(), entriesFDID = new MultiDictionary <uint, RootEntry>(), }; byte[] content; if (url.StartsWith("http:")) { content = CDN.Get(url + "data/" + hash[0] + hash[1] + "/" + hash[2] + hash[3] + "/" + hash); } else { content = File.ReadAllBytes(Path.Combine(url, "data", "" + hash[0] + hash[1], "" + hash[2] + hash[3], hash)); } if (!parseIt) { return(root); } var hasher = new Jenkins96(); var namedCount = 0; var unnamedCount = 0; uint totalFiles = 0; uint namedFiles = 0; var newRoot = false; using (BinaryReader bin = new BinaryReader(new MemoryStream(BLTE.Parse(content)))) { var header = bin.ReadUInt32(); if (header == 1296454484) { totalFiles = bin.ReadUInt32(); namedFiles = bin.ReadUInt32(); newRoot = true; } else { bin.BaseStream.Position = 0; } while (bin.BaseStream.Position < bin.BaseStream.Length) { var count = bin.ReadUInt32(); var contentFlags = (ContentFlags)bin.ReadUInt32(); var localeFlags = (LocaleFlags)bin.ReadUInt32(); var entries = new RootEntry[count]; var filedataIds = new int[count]; var fileDataIndex = 0; for (var i = 0; i < count; ++i) { entries[i].localeFlags = localeFlags; entries[i].contentFlags = contentFlags; filedataIds[i] = fileDataIndex + bin.ReadInt32(); entries[i].fileDataID = (uint)filedataIds[i]; fileDataIndex = filedataIds[i] + 1; } if (!newRoot) { for (var i = 0; i < count; ++i) { entries[i].md5 = bin.Read <MD5Hash>(); entries[i].lookup = bin.ReadUInt64(); root.entriesLookup.Add(entries[i].lookup, entries[i]); root.entriesFDID.Add(entries[i].fileDataID, entries[i]); } } else { for (var i = 0; i < count; ++i) { entries[i].md5 = bin.Read <MD5Hash>(); } for (var i = 0; i < count; ++i) { if (contentFlags.HasFlag(ContentFlags.NoNames)) { //entries[i].lookup = hasher.ComputeHash("BY_FDID_" + entries[i].fileDataID); entries[i].lookup = 0; unnamedCount++; } else { entries[i].lookup = bin.ReadUInt64(); namedCount++; root.entriesLookup.Add(entries[i].lookup, entries[i]); } root.entriesFDID.Add(entries[i].fileDataID, entries[i]); } } } } return(root); }