public static void GetHipFileChanges(ref HipFile hipFile, string path1, string path2) { HipSection[] hip1 = HipFileToHipArray(path1); HipSection[] hip2 = HipFileToHipArray(path2); Dictionary <uint, Section_AHDR> ahdrs1 = Util.HipArrayToAHDRDict(hip1); Dictionary <uint, Section_AHDR> ahdrs2 = Util.HipArrayToAHDRDict(hip2); foreach (uint assetID in ahdrs1.Keys) { if (ahdrs2.ContainsKey(assetID)) { byte[] data1 = ahdrs1[assetID].data; byte[] data2 = ahdrs2[assetID].data; if (!Util.ByteArraysAreEqual(data1, data2)) { hipFile.modifiedAssets.Add(new ModifiedAsset(ahdrs2[assetID], hip2)); } ahdrs2.Remove(assetID); } else { hipFile.deletedAssets.Add(new DeletedAsset(ahdrs1[assetID], hip1)); } } foreach (Section_AHDR ahdr in ahdrs2.Values) { hipFile.addedAssets.Add(new AddedAsset(ahdr, hip2)); } }
public void Scan(string root1, string root2) { Console.WriteLine(); Console.WriteLine("Scanning..."); Console.WriteLine(); List <string> files1 = GetFiles(root1); List <string> files2 = GetFiles(root2); foreach (string file in files1) { if (files2.Contains(file)) { string path1 = root1 + file; string path2 = root2 + file; if (Util.FileIsHip(file)) { HipFile hip = new HipFile(file); GetHipFileChanges(ref hip, path1, path2); if (hip.addedAssets.Count > 0 || hip.modifiedAssets.Count > 0 || hip.deletedAssets.Count > 0) { hipFiles.Add(hip); PrintFile(PatchType.MODIFY, file); foreach (AddedAsset asset in hip.addedAssets) { PrintAsset(PatchType.ADD, asset.name); } foreach (ModifiedAsset asset in hip.modifiedAssets) { PrintAsset(PatchType.MODIFY, asset.name); } foreach (DeletedAsset asset in hip.deletedAssets) { PrintAsset(PatchType.DELETE, asset.name); } } } else if (!Util.FilesAreEqual(path1, path2)) { byte[] data = File.ReadAllBytes(path2); modifiedFiles.Add(new ModifiedFile(file, data)); PrintFile(PatchType.MODIFY, file); } files2.Remove(file); } else { deletedFiles.Add(new DeletedFile(file)); PrintFile(PatchType.DELETE, file); } } foreach (string file in files2) { string path = root2 + file; byte[] data = File.ReadAllBytes(path); addedFiles.Add(new AddedFile(file, data)); PrintFile(PatchType.ADD, file); } Console.WriteLine(); Console.WriteLine("Done scanning."); Console.WriteLine(); Console.WriteLine("Added files: " + addedFiles.Count.ToString()); Console.WriteLine("Modified files: " + modifiedFiles.Count.ToString()); Console.WriteLine("Deleted files: " + deletedFiles.Count.ToString()); Console.WriteLine("Modified HIP files: " + hipFiles.Count.ToString()); Console.WriteLine(); }
public Patch Commit(string root) { Patch uninstall = new Patch(); uninstall.isUninstall = true; Console.WriteLine(); Console.WriteLine("Patching..."); Console.WriteLine(); foreach (AddedFile file in addedFiles) { string path = root + file.path; DeletedFile backup = new DeletedFile(file.path); uninstall.deletedFiles.Add(backup); File.WriteAllBytes(path, file.data); PrintFile(PatchType.ADD, file.path); } foreach (ModifiedFile file in modifiedFiles) { string path = root + file.path; if (File.Exists(path)) { byte[] data = File.ReadAllBytes(path); ModifiedFile backup = new ModifiedFile(file.path, data); uninstall.modifiedFiles.Add(backup); } File.WriteAllBytes(path, file.data); PrintFile(PatchType.MODIFY, file.path); } foreach (DeletedFile file in deletedFiles) { string path = root + file.path; if (File.Exists(path)) { byte[] data = File.ReadAllBytes(path); AddedFile backup = new AddedFile(file.path, data); uninstall.addedFiles.Add(backup); } File.Delete(path); PrintFile(PatchType.DELETE, file.path); } foreach (HipFile file in hipFiles) { string path = root + file.path; HipFile backup = new HipFile(file.path); HipSection[] hip = HipFileToHipArray(path); Section_HIPA hipa = (Section_HIPA)hip[0]; Section_PACK pack = (Section_PACK)hip[1]; Section_DICT dict = (Section_DICT)hip[2]; Section_STRM strm = (Section_STRM)hip[3]; List <Section_AHDR> ahdrList = dict.ATOC.AHDRList; List <Section_LHDR> lhdrList = dict.LTOC.LHDRList; Dictionary <uint, Section_AHDR> ahdrDict = ahdrList.ToDictionary(s => s.assetID); PrintFile(PatchType.MODIFY, file.path); foreach (AddedAsset asset in file.addedAssets) { Section_ADBG adbg = new Section_ADBG(asset.alignment, asset.name, asset.filename, asset.checksum); Section_AHDR ahdr = new Section_AHDR(asset.id, new string(asset.type), (AHDRFlags)asset.flags, adbg); ahdr.data = asset.data; DeletedAsset backupAsset = new DeletedAsset(asset); backup.deletedAssets.Add(backupAsset); ahdrList.Add(ahdr); Section_LHDR lhdr = lhdrList[asset.layer]; lhdr.assetIDlist.Add(asset.id); PrintAsset(PatchType.ADD, asset.name); } foreach (ModifiedAsset asset in file.modifiedAssets) { if (!ahdrDict.ContainsKey(asset.id)) { break; } Section_ADBG adbg = new Section_ADBG(asset.alignment, asset.name, asset.filename, asset.checksum); Section_AHDR ahdr = new Section_AHDR(asset.id, new string(asset.type), (AHDRFlags)asset.flags, adbg); ahdr.data = asset.data; Section_AHDR oldAHDR = ahdrDict[asset.id]; ahdrList.Remove(oldAHDR); ahdrList.Add(ahdr); ModifiedAsset backupAsset = new ModifiedAsset(oldAHDR, hip); backup.modifiedAssets.Add(backupAsset); PrintAsset(PatchType.MODIFY, asset.name); } foreach (DeletedAsset asset in file.deletedAssets) { if (!ahdrDict.ContainsKey(asset.id)) { break; } Section_AHDR ahdr = ahdrDict[asset.id]; ahdrList.Remove(ahdr); AddedAsset backupAsset = new AddedAsset(ahdr, hip); backup.addedAssets.Add(backupAsset); Section_LHDR lhdr = lhdrList[asset.layer]; lhdr.assetIDlist.Remove(asset.id); PrintAsset(PatchType.DELETE, asset.name); } pack.PCNT.AHDRCount = ahdrList.Count; hip = SetupStream(ref hipa, ref pack, ref dict, ref strm); File.WriteAllBytes(path, HipArrayToFile(hip)); uninstall.hipFiles.Add(backup); } Console.WriteLine("Done patching."); Console.WriteLine(); return(uninstall); }