Ejemplo n.º 1
0
        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));
            }
        }
Ejemplo n.º 2
0
        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();
        }
Ejemplo n.º 3
0
        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);
        }