コード例 #1
0
        public IEnumerable <string> AllFileNames()
        {
            var lookup = new Dictionary <uint, string>();

            if (Exists("local mix database.dat"))
            {
                var db = new XccLocalDatabase(GetContent("local mix database.dat"));
                foreach (var e in db.Entries)
                {
                    var hash = PackageEntry.HashFilename(e, type);
                    if (!lookup.ContainsKey(hash))
                    {
                        lookup.Add(hash, e);
                    }
                }
            }

            if (GlobalFileSystem.Exists("global mix database.dat"))
            {
                var db = new XccGlobalDatabase(GlobalFileSystem.Open("global mix database.dat"));
                foreach (var e in db.Entries)
                {
                    var hash = PackageEntry.HashFilename(e, type);
                    if (!lookup.ContainsKey(hash))
                    {
                        lookup.Add(hash, e);
                    }
                }
            }

            return(index.Keys.Select(k => lookup.ContainsKey(k) ? lookup[k] : "{0:X}".F(k)));
        }
コード例 #2
0
        void IUtilityCommand.Run(Utility utility, string[] args)
        {
            string[] globalFilenames;
            using (var db = new XccGlobalDatabase(File.OpenRead(args[2])))
                globalFilenames = db.Entries;

            var package = new MixLoader.MixFile(File.OpenRead(args[1]), args[1], globalFilenames);

            foreach (var kv in package.Index.OrderBy(kv => kv.Value.Offset))
            {
                Console.WriteLine("{0}:", kv.Key);
                Console.WriteLine("\tOffset: {0}", kv.Value.Offset);
                Console.WriteLine("\tLength: {0}", kv.Value.Length);
            }
        }
コード例 #3
0
		void IUtilityCommand.Run(Utility utility, string[] args)
		{
			var allPossibleFilenames = new HashSet<string>();
			using (var db = new XccGlobalDatabase(File.OpenRead(args[2])))
				foreach (var e in db.Entries)
					allPossibleFilenames.Add(e);

			var package = new MixLoader.MixFile(File.OpenRead(args[1]), args[1], allPossibleFilenames);
			foreach (var kv in package.Index.OrderBy(kv => kv.Value.Offset))
			{
				Console.WriteLine("{0}:", kv.Key);
				Console.WriteLine("\tOffset: {0}", kv.Value.Offset);
				Console.WriteLine("\tLength: {0}", kv.Value.Length);
			}
		}
コード例 #4
0
ファイル: BagFile.cs プロジェクト: huwpascoe/OpenRA
        public IEnumerable <string> AllFileNames()
        {
            var lookup = new Dictionary <uint, string>();

            if (context.Exists("global mix database.dat"))
            {
                var db = new XccGlobalDatabase(context.Open("global mix database.dat"));
                foreach (var e in db.Entries)
                {
                    var hash = IdxEntry.HashFilename(e, PackageHashType.CRC32);
                    if (!lookup.ContainsKey(hash))
                    {
                        lookup.Add(hash, e);
                    }
                }
            }

            return(index.Keys.Select(k => lookup.ContainsKey(k) ? lookup[k] : "{0:X}".F(k)));
        }
コード例 #5
0
ファイル: MixFile.cs プロジェクト: AttacqueSuperior/Engine
        bool IPackageLoader.TryParsePackage(Stream s, string filename, FS context, out IReadOnlyPackage package)
        {
            if (!filename.EndsWith(".mix", StringComparison.InvariantCultureIgnoreCase))
            {
                package = null;
                return(false);
            }

            // Load the global mix database
            if (globalFilenames == null)
            {
                if (context.TryOpen("global mix database.dat", out var mixDatabase))
                {
                    using (var db = new XccGlobalDatabase(mixDatabase))
                        globalFilenames = db.Entries.Distinct().ToArray();
                }
            }

            package = new MixFile(s, filename, globalFilenames ?? Array.Empty <string>());
            return(true);
        }
コード例 #6
0
ファイル: MixFile.cs プロジェクト: dnqbob/OpenRA
        bool IPackageLoader.TryParsePackage(Stream s, string filename, FS context, out IReadOnlyPackage package)
        {
            if (!filename.EndsWith(".mix", StringComparison.InvariantCultureIgnoreCase))
            {
                package = null;
                return(false);
            }

            // Load the global mix database
            var allPossibleFilenames = new HashSet <string>();

            if (context.TryOpen("global mix database.dat", out var mixDatabase))
            {
                using (var db = new XccGlobalDatabase(mixDatabase))
                    foreach (var e in db.Entries)
                    {
                        allPossibleFilenames.Add(e);
                    }
            }

            package = new MixFile(s, filename, allPossibleFilenames);
            return(true);
        }
コード例 #7
0
ファイル: MixFile.cs プロジェクト: SoftEngGroup/OpenRAGroup
        Dictionary <string, PackageEntry> ParseIndex(Dictionary <uint, PackageEntry> entries)
        {
            var classicIndex         = new Dictionary <string, PackageEntry>();
            var crcIndex             = new Dictionary <string, PackageEntry>();
            var allPossibleFilenames = new HashSet <string>();

            // Try and find a local mix database
            var dbNameClassic = PackageEntry.HashFilename("local mix database.dat", PackageHashType.Classic);
            var dbNameCRC     = PackageEntry.HashFilename("local mix database.dat", PackageHashType.CRC32);

            foreach (var kv in entries)
            {
                if (kv.Key == dbNameClassic || kv.Key == dbNameCRC)
                {
                    var db = new XccLocalDatabase(GetContent(kv.Value));
                    foreach (var e in db.Entries)
                    {
                        allPossibleFilenames.Add(e);
                    }

                    break;
                }
            }

            // Load the global mix database
            // TODO: This should be passed to the mix file ctor
            if (context.Exists("global mix database.dat"))
            {
                using (var db = new XccGlobalDatabase(context.Open("global mix database.dat")))
                {
                    foreach (var e in db.Entries)
                    {
                        allPossibleFilenames.Add(e);
                    }
                }
            }

            foreach (var filename in allPossibleFilenames)
            {
                var          classicHash = PackageEntry.HashFilename(filename, PackageHashType.Classic);
                var          crcHash     = PackageEntry.HashFilename(filename, PackageHashType.CRC32);
                PackageEntry e;

                if (entries.TryGetValue(classicHash, out e))
                {
                    classicIndex.Add(filename, e);
                }

                if (entries.TryGetValue(crcHash, out e))
                {
                    crcIndex.Add(filename, e);
                }
            }

            var bestIndex = crcIndex.Count > classicIndex.Count ? crcIndex : classicIndex;

            var unknown = entries.Count - bestIndex.Count;

            if (unknown > 0)
            {
                Log.Write("debug", "{0}: failed to resolve filenames for {1} unknown hashes".F(Name, unknown));
            }

            return(bestIndex);
        }