コード例 #1
0
        public ResourcesFile FindResourcesFile(ISerializedFile ifile, string resName)
        {
            SerializedFile file = (SerializedFile)ifile;

            resName = FilenameUtils.FixResourcePath(resName);

            // check asset bundles / web files
            string filePath = file.FilePath;

            foreach (ResourcesFile res in m_resources)
            {
                if (res.FilePath == filePath && res.Name == resName)
                {
                    return(res.CreateReference());
                }
            }

            string resPath = m_resourceCallback?.Invoke(resName);

            if (resPath == null)
            {
                return(null);
            }
            using (SmartStream stream = SmartStream.OpenRead(resPath))
            {
                return(new ResourcesFile(stream, resPath, resName, 0, stream.Length));
            }
        }
        public IResourceFile FindResourceFile(string resName)
        {
            string fixedName = FilenameUtils.FixResourcePath(resName);

            if (m_resources.TryGetValue(fixedName, out ResourceFile file))
            {
                return(file);
            }

            string resPath = m_resourceCallback?.Invoke(fixedName);

            if (resPath == null)
            {
                Logger.Log(LogType.Warning, LogCategory.Import, $"Resource file '{resName}' hasn't been found");
                m_resources.Add(fixedName, null);
                return(null);
            }

            using (ResourceFileScheme scheme = ResourceFile.LoadScheme(resPath, fixedName))
            {
                ResourceFile resourceFile = scheme.ReadFile();
                AddResourceFile(resourceFile);
            }
            Logger.Log(LogType.Info, LogCategory.Import, $"Resource file '{resName}' has been loaded");
            return(m_resources[fixedName]);
        }
コード例 #3
0
        internal SerializedFile(IFileCollection collection, IAssemblyManager manager, SerializedFileScheme scheme)
        {
            if (collection == null)
            {
                throw new ArgumentNullException(nameof(collection));
            }
            if (manager == null)
            {
                throw new ArgumentNullException(nameof(manager));
            }
            if (scheme == null)
            {
                throw new ArgumentNullException(nameof(scheme));
            }

            Collection      = collection;
            AssemblyManager = manager;
            FilePath        = scheme.FilePath;
            NameOrigin      = scheme.Name;
            Name            = FilenameUtils.FixFileIdentifier(scheme.Name);
            Flags           = scheme.Flags;

            Header   = scheme.Header;
            Metadata = scheme.Metadata;
        }
コード例 #4
0
        public string RequestDependency(string dependency)
        {
            if (Files.TryGetValue(dependency, out string dependencyPath))
            {
                return(dependencyPath);
            }

            foreach (string dataPath in DataPathes)
            {
                string filePath = Path.Combine(dataPath, dependency);
                if (MultiFileStream.Exists(filePath))
                {
                    return(filePath);
                }

                if (FilenameUtils.IsDefaultResource(dependency))
                {
                    return(FindEngineDependency(dataPath, FilenameUtils.DefaultResourceName1) ??
                           FindEngineDependency(dataPath, FilenameUtils.DefaultResourceName2));
                }
                else if (FilenameUtils.IsBuiltinExtra(dependency))
                {
                    return(FindEngineDependency(dataPath, FilenameUtils.BuiltinExtraName1) ??
                           FindEngineDependency(dataPath, FilenameUtils.BuiltinExtraName2));
                }
            }
            return(null);
        }
コード例 #5
0
        private void ReadScheme()
        {
            using (PartialStream stream = new PartialStream(m_stream, m_offset, m_size))
            {
                using (EndianReader reader = new EndianReader(stream, EndianType.BigEndian))
                {
                    Header.Read(reader);
                }

                EndianType endianess = Header.SwapEndianess ? EndianType.BigEndian : EndianType.LittleEndian;
                using (SerializedFileReader reader = new SerializedFileReader(stream, endianess, Header.Generation))
                {
                    if (IsMetadataAtTheEnd(reader.Generation))
                    {
                        reader.BaseStream.Position = Header.FileSize - Header.MetadataSize;
                        reader.BaseStream.Position++;
                    }

                    Metadata.Read(reader);
                }
            }

#warning TEMP HACK
            Flags = Metadata.Hierarchy.Platform == Platform.NoTarget ? TransferInstructionFlags.NoTransferInstructionFlags : Flags;
            if (FilenameUtils.IsEngineResource(Name) || Header.Generation < FileGeneration.FG_500a1 && FilenameUtils.IsBuiltinExtra(Name))
            {
                Flags |= TransferInstructionFlags.IsBuiltinResourcesFile;
            }
            Flags |= Header.SwapEndianess ? TransferInstructionFlags.SwapEndianess : TransferInstructionFlags.NoTransferInstructionFlags;
        }
コード例 #6
0
        public DependencyCollection(FileCollection fileCollection, IEnumerable <FileEntry> entries, Action <string> dependencyCallback)
        {
            if (fileCollection == null)
            {
                throw new ArgumentNullException(nameof(fileCollection));
            }
            if (entries == null)
            {
                throw new ArgumentNullException(nameof(entries));
            }
            if (dependencyCallback == null)
            {
                throw new ArgumentNullException(nameof(dependencyCallback));
            }

            m_fileCollection = fileCollection;
            Dictionary <string, FileEntry> fileEntries = new Dictionary <string, FileEntry>();

            foreach (FileEntry entry in entries)
            {
                string name = FilenameUtils.FixFileIdentifier(entry.Name);
                fileEntries.Add(name, entry);
            }
            m_entries            = fileEntries;
            m_dependencyCallback = dependencyCallback;
        }
コード例 #7
0
        public void ReadFiles()
        {
            foreach (FileEntry entry in m_entries.Values)
            {
                if (entry.EntryType == FileEntryType.Resource)
                {
                    entry.ReadResourcesFile(m_fileCollection);
                }
            }

            foreach (FileEntry entry in m_entries.Values)
            {
                if (entry.EntryType == FileEntryType.Serialized)
                {
                    string name = FilenameUtils.FixFileIdentifier(entry.Name);
                    if (m_loadedFiles.Add(name))
                    {
                        entry.ReadSerializedFile(m_fileCollection, OnRequestDependency);
                    }
                }
            }

            foreach (FileEntry entry in m_entries.Values)
            {
                if (entry.EntryType == FileEntryType.Bundle)
                {
                    entry.ReadBundleFile(m_fileCollection);
                }
                else if (entry.EntryType == FileEntryType.Web)
                {
                    entry.ReadWebFile(m_fileCollection);
                }
            }
        }
        private static AssetLayout GetLayout(GameCollection collection, SerializedFileScheme scheme, string name)
        {
            if (!SerializedFileMetadata.HasPlatform(scheme.Header.Version))
            {
                return(collection.Layout);
            }
            if (FilenameUtils.IsDefaultResource(name))
            {
                return(collection.Layout);
            }

            LayoutInfo info = new LayoutInfo(scheme.Metadata.UnityVersion, scheme.Metadata.TargetPlatform, scheme.Flags);

            return(collection.GetLayout(info));
        }
コード例 #9
0
ファイル: SerializedFile.cs プロジェクト: wyfleb/UtinyRipper
        private static AssetLayout GetLayout(GameCollection collection, SerializedFileScheme scheme, string name)
        {
            if (!RTTIClassHierarchyDescriptor.HasPlatform(scheme.Header.Generation))
            {
                return(collection.Layout);
            }
            if (FilenameUtils.IsDefaultResource(name))
            {
                return(collection.Layout);
            }

            LayoutInfo info = new LayoutInfo(scheme.Metadata.Hierarchy.Version, scheme.Metadata.Hierarchy.Platform, scheme.Flags);

            return(collection.GetLayout(info));
        }
コード例 #10
0
ファイル: SerializedFile.cs プロジェクト: wyfleb/UtinyRipper
        internal SerializedFile(GameCollection collection, SerializedFileScheme scheme)
        {
            Collection = collection ?? throw new ArgumentNullException(nameof(collection));
            FilePath   = scheme.FilePath;
            NameOrigin = scheme.Name;
            Name       = FilenameUtils.FixFileIdentifier(scheme.Name);
            Layout     = GetLayout(collection, scheme, Name);

            Header   = scheme.Header;
            Metadata = scheme.Metadata;

            for (int i = 0; i < Metadata.Entries.Length; i++)
            {
                m_assetEntryLookup.Add(Metadata.Entries[i].PathID, i);
            }
        }
コード例 #11
0
ファイル: SerializedFile.cs プロジェクト: lego13/UtinyRipper
        internal SerializedFile(IFileCollection collection, IAssemblyManager manager, SerializedFileScheme scheme)
        {
            Collection      = collection ?? throw new ArgumentNullException(nameof(collection));
            AssemblyManager = manager ?? throw new ArgumentNullException(nameof(manager));
            FilePath        = scheme.FilePath;
            NameOrigin      = scheme.Name;
            Name            = FilenameUtils.FixFileIdentifier(scheme.Name);
            Flags           = scheme.Flags;

            Header   = scheme.Header;
            Metadata = scheme.Metadata;

            for (int i = 0; i < Metadata.Entries.Length; i++)
            {
                m_assetEntryLookup.Add(Metadata.Entries[i].PathID, i);
            }
        }
コード例 #12
0
 public FileScheme(SmartStream stream, long offset, long size, string filePath, string fileName)
 {
     if (stream == null)
     {
         throw new ArgumentNullException(nameof(stream));
     }
     if (string.IsNullOrEmpty(filePath))
     {
         throw new ArgumentNullException(nameof(filePath));
     }
     m_stream   = stream.CreateReference();
     m_offset   = offset;
     m_size     = size;
     FilePath   = filePath;
     NameOrigin = fileName;
     Name       = FilenameUtils.FixFileIdentifier(fileName);
 }
コード例 #13
0
        private void ReadScheme()
        {
            using (PartialStream stream = new PartialStream(m_stream, m_offset, m_size))
            {
                using (EndianReader reader = new EndianReader(stream, EndianType.BigEndian))
                {
                    Header.Read(reader);
                }

                EndianType endianess = EndianType.LittleEndian;
                if (SerializedFileHeader.HasEndian(Header.Generation))
                {
                    endianess = Header.SwapEndianess ? EndianType.BigEndian : EndianType.LittleEndian;
                }
                using (SerializedReader reader = new SerializedReader(stream, endianess, Name, Header.Generation))
                {
                    if (SerializedFileMetadata.IsMetadataAtTheEnd(reader.Generation))
                    {
                        reader.BaseStream.Position = Header.FileSize - Header.MetadataSize;
                        reader.BaseStream.Position++;
                    }

                    Metadata.Read(reader);
                }
            }

            SerializedFileMetadataConverter.CombineFormats(Header.Generation, Metadata);
            RTTIClassHierarchyDescriptorConverter.FixResourceVersion(Name, ref Metadata.Hierarchy);

#warning TEMP HACK
            if (Metadata.Hierarchy.Platform == Platform.NoTarget)
            {
                Flags = TransferInstructionFlags.NoTransferInstructionFlags;
            }
            if (FilenameUtils.IsEngineResource(Name) || Header.Generation < FileGeneration.FG_500a1 && FilenameUtils.IsBuiltinExtra(Name))
            {
                Flags |= TransferInstructionFlags.IsBuiltinResourcesFile;
            }
            if (Header.SwapEndianess)
            {
                Flags |= TransferInstructionFlags.SwapEndianess;
            }
        }
コード例 #14
0
        public bool RequestDependency(string dependency)
        {
            if (Files.TryGetValue(dependency, out string dependencyPath))
            {
                LoadDependency(dependency, dependencyPath);
                return(true);
            }

            foreach (string dataPath in DataPathes)
            {
                string filePath = Path.Combine(dataPath, dependency);
                if (FileMultiStream.Exists(filePath))
                {
                    LoadDependency(dependency, filePath);
                    return(true);
                }

                if (FilenameUtils.IsDefaultResource(dependency))
                {
                    if (LoadEngineDependency(dataPath, FilenameUtils.DefaultResourceName1))
                    {
                        return(true);
                    }
                    if (LoadEngineDependency(dataPath, FilenameUtils.DefaultResourceName2))
                    {
                        return(true);
                    }
                }
                else if (FilenameUtils.IsBuiltinExtra(dependency))
                {
                    if (LoadEngineDependency(dataPath, FilenameUtils.BuiltinExtraName1))
                    {
                        return(true);
                    }
                    if (LoadEngineDependency(dataPath, FilenameUtils.BuiltinExtraName2))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
コード例 #15
0
        public IResourceFile FindResourceFile(string resName)
        {
            string fixedName = FilenameUtils.FixResourcePath(resName);

            if (m_resources.TryGetValue(fixedName, out ResourceFile file))
            {
                return(file);
            }

            string resPath = m_resourceCallback?.Invoke(fixedName);

            if (resPath == null)
            {
                m_resources.Add(fixedName, null);
                return(null);
            }

            using (ResourceFileScheme scheme = ResourceFile.LoadScheme(resPath, fixedName))
            {
                AddFile(scheme, this, AssemblyManager);
            }
            return(m_resources[fixedName]);
        }
コード例 #16
0
        private void UpdateFlags()
        {
            Flags = TransferInstructionFlags.SerializeGameRelease;
            if (RTTIClassHierarchyDescriptor.HasPlatform(Header.Generation))
            {
                if (Metadata.Hierarchy.Platform == Platform.NoTarget)
                {
                    Flags = TransferInstructionFlags.NoTransferInstructionFlags;
                    if (FilePath.EndsWith(".unity", StringComparison.Ordinal))
                    {
                        Flags |= TransferInstructionFlags.SerializeEditorMinimalScene;
                    }
                }
            }

            if (FilenameUtils.IsEngineResource(Name) || Header.Generation < FileGeneration.FG_500a1 && FilenameUtils.IsBuiltinExtra(Name))
            {
                Flags |= TransferInstructionFlags.IsBuiltinResourcesFile;
            }
            if (Header.SwapEndianess || Metadata.SwapEndianess)
            {
                Flags |= TransferInstructionFlags.SwapEndianess;
            }
        }
コード例 #17
0
        private void UpdateFlags()
        {
            Flags = TransferInstructionFlags.SerializeGameRelease;
            if (SerializedFileMetadata.HasPlatform(Header.Version))
            {
                if (Metadata.TargetPlatform == Platform.NoTarget)
                {
                    Flags = TransferInstructionFlags.NoTransferInstructionFlags;
                    if (FilePath.EndsWith(".unity", StringComparison.Ordinal))
                    {
                        Flags |= TransferInstructionFlags.SerializeEditorMinimalScene;
                    }
                }
            }

            if (FilenameUtils.IsEngineResource(Name) || Header.Version < FormatVersion.Unknown_10 && FilenameUtils.IsBuiltinExtra(Name))
            {
                Flags |= TransferInstructionFlags.IsBuiltinResourcesFile;
            }
            if (Header.Endianess || Metadata.SwapEndianess)
            {
                Flags |= TransferInstructionFlags.SwapEndianess;
            }
        }
コード例 #18
0
 protected FileScheme(string filePath, string fileName)
 {
     FilePath   = filePath ?? throw new ArgumentNullException(nameof(filePath));
     NameOrigin = fileName;
     Name       = FilenameUtils.FixFileIdentifier(fileName);
 }