示例#1
0
        public void Read(EndianReader reader)
        {
            EndianFormat = DetectEndianFormat(reader);
            MapVersion   = GetMapFileVersion(reader);
            Version      = DetectCacheVersion(reader);
            var deserializer = new TagDeserializer(Version);

            reader.SeekTo(0);
            var dataContext = new DataSerializationContext(reader);

            Header = (CacheFileHeader)deserializer.Deserialize(dataContext, typeof(CacheFileHeader));

            // temporary code until map file format cleanup
            if (MapVersion == CacheFileVersion.HaloOnline)
            {
                var mapFileHeaderSize = (int)TagStructure.GetTagStructureInfo(typeof(CacheFileHeader), Version).TotalSize;

                // Seek to the blf
                reader.SeekTo(mapFileHeaderSize);
                // Read blf
                MapFileBlf = new Blf(Version);
                if (!MapFileBlf.Read(reader))
                {
                    MapFileBlf = null;
                }
            }
        }
示例#2
0
        protected Compiler(BlamVersion engine)
        {
            Head         = new CacheFileHeader(engine);
            MemoryStream = null;
            OwnerState   = null;

            DebugStrings = new Util.StringPool(true);
            RamMemory    = new BlamLib.IO.EndianWriter(new System.IO.MemoryStream(1024), this);
        }
            internal CacheFileHeader(CacheFileHeader old_state)
            {
                if (old_state == null)
                {
                    throw new ArgumentNullException("old_state");
                }

                this.engineSignature = old_state.engineSignature;
            }
示例#4
0
        public virtual void Reset()
        {
            Dispose();

            Head = new CacheFileHeader(Head);

            DebugStrings = new Util.StringPool(true);
            RamMemory    = new BlamLib.IO.EndianWriter(new System.IO.MemoryStream(1024), this);

            Locations.Clear();
        }
示例#5
0
        private MapFile GenerateMapFile(CachedTag scenarioTag, Blf mapInfo = null)
        {
            MapFile  map    = new MapFile();
            var      header = new CacheFileHeader();
            Scenario scnr;

            using (var stream = Cache.OpenCacheRead())
            {
                scnr = Cache.Deserialize <Scenario>(stream, scenarioTag);
            }

            map.Version      = Cache.Version;
            map.EndianFormat = EndianFormat.LittleEndian;
            map.MapVersion   = CacheFileVersion.HaloOnline;

            header.HeaderSignature = new Tag("head");
            header.FooterSignature = new Tag("foot");
            header.FileVersion     = map.MapVersion;
            header.Build           = CacheVersionDetection.GetBuildName(Cache.Version);

            switch (scnr.MapType)
            {
            case ScenarioMapType.MainMenu:
                header.CacheType = CacheFileType.MainMenu;
                break;

            case ScenarioMapType.SinglePlayer:
                header.CacheType = CacheFileType.Campaign;
                break;

            case ScenarioMapType.Multiplayer:
                header.CacheType = CacheFileType.Multiplayer;
                break;
            }
            header.SharedType = CacheFileSharedType.None;

            header.MapId            = scnr.MapId;
            header.ScenarioTagIndex = scenarioTag.Index;
            header.Name             = scenarioTag.Name.Split('\\').Last();
            header.ScenarioPath     = scenarioTag.Name;

            map.Header = header;

            header.FileLength = 0x3390;

            if (mapInfo != null)
            {
                if (mapInfo.ContentFlags.HasFlag(BlfFileContentFlags.StartOfFile) && mapInfo.ContentFlags.HasFlag(BlfFileContentFlags.EndOfFile) && mapInfo.ContentFlags.HasFlag(BlfFileContentFlags.Scenario))
                {
                    map.MapFileBlf = mapInfo;
                }
            }
            return(map);
        }
示例#6
0
		public virtual void Reset()
		{
			Dispose();

			Head = new CacheFileHeader(Head);

			DebugStrings = new Util.StringPool(true);
			RamMemory = new BlamLib.IO.EndianWriter(new System.IO.MemoryStream(1024), this);

			Locations.Clear();
		}
示例#7
0
		protected Compiler(BlamVersion engine)
		{
			Head = new CacheFileHeader(engine);
			MemoryStream = null;
			OwnerState = null;

			DebugStrings = new Util.StringPool(true);
			RamMemory = new BlamLib.IO.EndianWriter(new System.IO.MemoryStream(1024), this);
		}
示例#8
0
			internal CacheFileHeader(CacheFileHeader old_state)
			{
				if (old_state == null) throw new ArgumentNullException("old_state");

				this.engineSignature = old_state.engineSignature;
			}
示例#9
0
        private static T[] GetAll___ <T>(
            Assembly a, string discriminator,
            Func <IEnumerable <string>, IEnumerable <T> > decode,
            Func <IEnumerable <Type>, IEnumerable <T> > createResult,
            Func <T[], IEnumerable <string> > encode
            )
        {
            var assemblyFileName  = a.Location;
            var cacheFileName     = CreateCacheFileName(assemblyFileName, discriminator.ToGuid());
            var assemblyTimeStamp = File.GetLastWriteTimeUtc(assemblyFileName);

            if (File.Exists(cacheFileName))
            {
                /* var cacheFileTimeStamp = */ File.GetLastWriteTimeUtc(cacheFileName);
                var lines  = File.ReadAllLines(cacheFileName);
                var header = lines.Length > 0 ? CacheFileHeader.Parse(lines[0]) : null;
                if (header != null && header.TimeStampOfCachedFile == assemblyTimeStamp)
                {
                    // return cached types
                    Report.Line(4, "[cache hit ] {0}", a);
                    return(decode(lines.Skip(1)).ToArray());
                }
            }

            Report.Line(4, "[cache miss] {0}", a);

            // Notes by hs:
            // previously (rev 19495) typeloadexception resulted in empty result set.
            // even in case of typeloadexception there may be some successfully loaded
            // types in result set. Just continue processing with these types
            // effect: dlls with external unused dependencies don't have to be shipped.
            Type[] ts = new Type[0];
            try
            {
                ts = a.GetTypes().ToArray();
            }
            catch (ReflectionTypeLoadException e)
            {
                Report.Begin("ReflectionTypeLoadException error in assembly {0}", a.GetName().Name);
                Report.Line("Full assembly name is {0}.", a.FullName);
                Report.Line("Exception is {0}", e);
                Report.Begin("Loader exceptions are");
                foreach (var x in e.LoaderExceptions)
                {
                    Report.Line("{0}", x);
                }
                Report.End();
                Report.End();
                ts = e.Types.Where(t => t != null).ToArray();
            }

            var result = createResult(ts).ToArray();

            // write cache file
            var headerLine =
                new CacheFileHeader {
                Version = 1, TimeStampOfCachedFile = assemblyTimeStamp
            }
            .ToString()
            .IntoIEnumerable()
            ;

            File.WriteAllLines(cacheFileName, headerLine.Concat(encode(result)).ToArray());

            return(result);
        }