public static PkgProperties FromGp4(GP4.Gp4Project project, string projDir)
        {
            DateTime CreationDate;
            bool     UseCreationTime = false;

            if ((project.volume.Package.CreationDate ?? "") == "")
            {
                CreationDate = DateTime.Now;
            }
            else if (project.volume.Package.CreationDate == "actual_datetime")
            {
                CreationDate    = DateTime.Now;
                UseCreationTime = true;
            }
            else
            {
                var split = project.volume.Package.CreationDate.Split(' ');
                UseCreationTime = split.Length == 2; // Date and time specified
                CreationDate    = DateTime.Parse(project.volume.Package.CreationDate).ToUniversalTime();
            }
            return(new PkgProperties
            {
                ContentId = project.volume.Package.ContentId,
                VolumeType = GP4.VolumeTypeUtil.OfString(project.volume.volume_type),
                Passcode = project.volume.Package.Passcode,
                TimeStamp = project.volume.TimeStamp,
                EntitlementKey = project.volume.Package.EntitlementKey,
                CreationDate = CreationDate,
                UseCreationTime = UseCreationTime,
                RootDir = PFS.PfsProperties.BuildFSTree(project, projDir)
            });
        }
Exemple #2
0
        /// <summary>
        /// Takes a directory and a root node, and recursively makes a filesystem tree.
        /// </summary>
        /// <param name="proj">GP4 Project</param>
        /// <param name="projDir">Directory of GP4 file</param>
        /// <returns>Root directory of the image</returns>
        public static FSDir BuildFSTree(GP4.Gp4Project proj, string projDir)
        {
            void AddDirs(FSDir parent, List <GP4.Dir> imgDir)
            {
                foreach (var d in imgDir)
                {
                    FSDir dir;
                    parent.Dirs.Add(dir = new FSDir {
                        name = d.TargetName, Parent = parent
                    });
                    AddDirs(dir, d.Children);
                }
            }

            var root = new FSDir();

            AddDirs(root, proj.RootDir);

            foreach (var f in proj.files.Items)
            {
                var lastSlash = f.TargetPath.LastIndexOf('/') + 1;
                var name      = f.TargetPath.Substring(lastSlash);
                var source    = Path.Combine(projDir, f.OrigPath);
                var parent    = lastSlash == 0 ? root : FindDir(f.TargetPath.Substring(0, lastSlash - 1), root);
                parent.Files.Add(new FSFile(source)
                {
                    Parent = parent,
                    name   = name,
                });
            }
            return(root);
        }
Exemple #3
0
        private static long GetTimeStamp(GP4.Gp4Project proj)
        {
            // FIXME: This is incorrect when DST of current time and project time are different
            var timestamp = DateTime.Parse(proj.volume.TimeStamp).ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds;

            return((long)timestamp);
        }
Exemple #4
0
        public static Manifest FromProject(GP4.Gp4Project project)
        {
            var man = new Manifest
            {
                Format     = "playgo-manifest",
                version    = "0990",
                chunk_info = project.volume.chunk_info
            };

            man.chunk_info.chunks = null;
            return(man);
        }
Exemple #5
0
        public static PfsProperties MakeInnerPFSProps(GP4.Gp4Project proj, string projDir)
        {
            var root = new FSDir();

            BuildFSTree(root, proj, projDir);
            var timestamp = DateTime.Parse(proj.volume.TimeStamp).ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds;

            return(new PfsProperties()
            {
                root = root,
                BlockSize = 0x10000,
                Encrypt = false,
                Sign = false,
                FileTime = GetTimeStamp(proj),
            });
        }
Exemple #6
0
        /// <summary>
        /// Takes a directory and a root node, and recursively makes a filesystem tree.
        /// </summary>
        /// <param name="root">Root directory of the image</param>
        /// <param name="proj">GP4 Project</param>
        /// <param name="projDir">Directory of GP4 file</param>
        static void BuildFSTree(FSDir root, GP4.Gp4Project proj, string projDir)
        {
            void AddDirs(FSDir parent, List <GP4.Dir> imgDir)
            {
                foreach (var d in imgDir)
                {
                    FSDir dir;
                    parent.Dirs.Add(dir = new FSDir {
                        name = d.TargetName, Parent = parent
                    });
                    AddDirs(dir, d.Children);
                }
            }

            FSDir FindDir(string name)
            {
                FSDir dir         = root;
                var   breadcrumbs = name.Split('/');

                foreach (var crumb in breadcrumbs)
                {
                    dir = dir.Dirs.Where(d => d.name == crumb).First();
                }
                return(dir);
            }

            AddDirs(root, proj.RootDir);

            foreach (var f in proj.files)
            {
                var lastSlash = f.TargetPath.LastIndexOf('/') + 1;
                if (f.TargetPath == "sce_sys/param.sfo")
                {
                    continue;
                }
                var name   = f.TargetPath.Substring(lastSlash);
                var source = Path.Combine(projDir, f.OrigPath);
                var parent = lastSlash == 0 ? root : FindDir(f.TargetPath.Substring(0, lastSlash - 1));
                parent.Files.Add(new FSFile(source)
                {
                    Parent = parent,
                    name   = name,
                });
            }
        }
Exemple #7
0
        public static PfsProperties MakeOuterPFSProps(GP4.Gp4Project proj, PfsBuilder innerPFS, byte[] EKPFS, bool encrypt = true)
        {
            var root = new FSDir();

            root.Files.Add(new FSFile(innerPFS)
            {
                Parent = root,
            });
            return(new PfsProperties()
            {
                root = root,
                BlockSize = 0x10000,
                Encrypt = encrypt,
                Sign = true,
                EKPFS = EKPFS,
                Seed = new byte[16],
                FileTime = GetTimeStamp(proj),
            });
        }
 public PkgBuilder(GP4.Gp4Project proj, string proj_dir)
 {
     project    = proj;
     projectDir = proj_dir;
 }