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; } } }
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; }
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(); }
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); }
internal CacheFileHeader(CacheFileHeader old_state) { if (old_state == null) throw new ArgumentNullException("old_state"); this.engineSignature = old_state.engineSignature; }
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); }