public OwRootHandler(BinaryReader stream, BackgroundWorkerEx worker, CASCHandler casc) { worker?.ReportProgress(0, "Loading \"root\"..."); string str = Encoding.ASCII.GetString(stream.ReadBytes((int)stream.BaseStream.Length)); string[] array = str.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); List <string> APMNames = new List <string>(); for (int i = 1; i < array.Length; i++) { string[] filedata = array[i].Split('|'); string name = filedata[4]; if (Path.GetExtension(name) == ".apm" && name.Contains("RDEV")) { APMNames.Add(Path.GetFileNameWithoutExtension(name)); if (!name.Contains("L" + LanguageScan)) { continue; } // add apm file for dev purposes ulong apmNameHash = Hasher.ComputeHash(name); MD5Hash apmMD5 = filedata[0].ToByteArray().ToMD5(); _rootData[apmNameHash] = new OWRootEntry() { baseEntry = new RootEntry() { MD5 = apmMD5, LocaleFlags = LocaleFlags.All, ContentFlags = ContentFlags.None } }; CASCFile.Files[apmNameHash] = new CASCFile(apmNameHash, name); if (!casc.Encoding.GetEntry(apmMD5, out EncodingEntry apmEnc)) { continue; } using (Stream apmStream = casc.OpenFile(apmEnc.Key)) { apmFiles.Add(new APMFile(name, apmStream, casc)); } } worker?.ReportProgress((int)(i / (array.Length / 100f))); } APMList = APMNames.ToArray(); APMNames.Clear(); }
public override void LoadListFile(string path, BackgroundWorkerEx worker = null) { worker?.ReportProgress(0, "Loading \"listfile\"..."); Logger.WriteLine("OWRootHandler: loading file names..."); float pkgOnePct = apmFiles.Sum(a => a.Packages.Length) / 100f; int pkgCount = 0; foreach (var apm in apmFiles) { for (int i = 0; i < apm.Packages.Length; i++) { APMPackage package = apm.Packages[i]; MD5Hash pkgIndexMD5 = package.indexContentKey; string apmName = Path.GetFileNameWithoutExtension(apm.Name); string pkgName = string.Format("{0}/package_{1:X4}_{2:X16}", apmName, i, package.packageKey); string fakeName = string.Format("{0}_index", pkgName); ulong fileHash = Hasher.ComputeHash(fakeName); Logger.WriteLine("Adding package: {0:X16} {1}", fileHash, package.indexContentKey.ToHexString()); if (_rootData.ContainsKey(fileHash)) { if (!_rootData[fileHash].baseEntry.MD5.EqualsTo(package.indexContentKey)) { Logger.WriteLine("Weird duplicate package: {0:X16} {1}", fileHash, package.indexContentKey.ToHexString()); } else { Logger.WriteLine("Duplicate package: {0:X16} {1}", fileHash, package.indexContentKey.ToHexString()); } continue; } _rootData[fileHash] = new OWRootEntry() { baseEntry = new RootEntry() { MD5 = pkgIndexMD5, LocaleFlags = LocaleFlags.All, ContentFlags = ContentFlags.None } }; CASCFile.Files[fileHash] = new CASCFile(fileHash, fakeName); PackageIndex pkgIndex = apm.Indexes[i]; fakeName = string.Format("{0}_bundle_{1:X16}", pkgName, pkgIndex.bundleKey); fileHash = Hasher.ComputeHash(fakeName); Logger.WriteLine("Adding bundle: {0:X16} {1}", fileHash, pkgIndex.bundleContentKey.ToHexString()); if (_rootData.ContainsKey(fileHash)) { if (!_rootData[fileHash].baseEntry.MD5.EqualsTo(pkgIndex.bundleContentKey)) { Logger.WriteLine("Weird duplicate bundle: {0:X16} {1}", fileHash, pkgIndex.bundleContentKey.ToHexString()); } else { Logger.WriteLine("Duplicate bundle: {0:X16} {1}", fileHash, pkgIndex.bundleContentKey.ToHexString()); } continue; } _rootData[fileHash] = new OWRootEntry() { baseEntry = new RootEntry() { MD5 = pkgIndex.bundleContentKey, LocaleFlags = LocaleFlags.All, ContentFlags = ContentFlags.None }, pkgIndex = pkgIndex }; CASCFile.Files[fileHash] = new CASCFile(fileHash, fakeName); PackageIndexRecord[] records = apm.Records[i]; for (int k = 0; k < records.Length; k++) { fakeName = string.Format("files/{0:X3}/{1:X12}.{0:X3}", KeyToTypeID(records[k].Key), records[k].Key & 0xFFFFFFFFFFFF); fileHash = Hasher.ComputeHash(fakeName); //Logger.WriteLine("Adding package record: key {0:X16} hash {1} flags {2:X8}", fileHash, records[k].contentKey.ToHexString(), records[k].flags); if (_rootData.ContainsKey(fileHash)) { if (!_rootData[fileHash].baseEntry.MD5.EqualsTo(records[k].ContentKey)) { Logger.WriteLine("Weird duplicate package record: {0:X16} {1}", fileHash, records[k].ContentKey.ToHexString()); } //else // Logger.WriteLine("Duplicate package record: {0:X16} {1}", fileHash, records[k].contentKey.ToHexString()); continue; } _rootData[fileHash] = new OWRootEntry() { baseEntry = new RootEntry() { MD5 = records[k].ContentKey, LocaleFlags = LocaleFlags.All, ContentFlags = (ContentFlags)records[k].Flags }, pkgIndex = pkgIndex, pkgIndexRec = records[k] }; CASCFile.Files[fileHash] = new CASCFile(fileHash, fakeName); } worker?.ReportProgress((int)(++pkgCount / pkgOnePct)); } } Logger.WriteLine("OWRootHandler: loaded {0} file names", _rootData.Count); }
public bool GetEntry(ulong hash, out OWRootEntry entry) { return(_rootData.TryGetValue(hash, out entry)); }