bool EncodeVariantBlob(FileStream fs, KBlam.RuntimeData.Variants.GameEngineVariant gev) { var megalo_variant = gev.TryGetMegaloVariant(); var blf_result = KBlam.Blob.Transport.BlobChunkVerificationResultInfo.ValidResult; long blffile_length = KBlam.Blob.GameEngineVariantBlob.GetBlfFileLength(mGameBuildAndTarget); using (var blf = new KBlam.Blob.Transport.BlobTransportStream()) { blf.GameTarget = mGameBuildAndTarget; var blob_system = mRequiredSystems.BlobSystemRef.System; if (fs.Length < blffile_length) { fs.SetLength(blffile_length); } blf_result = blf.OpenForWrite(fs, mFileOffset, blffile_length); if (blf_result.IsValid) { blf.UnderlyingStream.StreamMode = FileAccess.Write; int engine_version_to_write = mEngineVersion; if (megalo_variant != null) { if (megalo_variant.EngineVersion <= 0) { megalo_variant.EngineVersion = engine_version_to_write; } else { engine_version_to_write = megalo_variant.EngineVersion; } } var chdr = (KBlam.Blob.ContentHeaderBlob)blob_system.CreateObject(mGameBuildAndTarget, KBlam.Blob.WellKnownBlob.ContentHeader); chdr.ChangeData(gev.Variant.BaseVariant.Header, engine_version_to_write); var mpvr = (KBlam.Blob.GameEngineVariantBlob)blob_system.CreateObject(mGameBuildAndTarget, KBlam.Blob.WellKnownBlob.GameVariant); mpvr.ChangeData(gev); blf_result = blf.WriteChunksSansAuthentication(chdr, mpvr); } } if (blf_result.IsInvalid) { Console.WriteLine("Error: Failed to encode variant file{0}{1}", System.Environment.NewLine, blf_result.BuildErrorMessage()); } return(blf_result.IsValid); }
bool DecodeVariantBlob(FileStream fs, out KBlam.RuntimeData.Variants.GameEngineVariant gev) { gev = null; KBlam.Blob.GameEngineVariantBlob gevb = null; var blf_result = KBlam.Blob.Transport.BlobChunkVerificationResultInfo.ValidResult; long blffile_length = KBlam.Blob.GameEngineVariantBlob.GetBlfFileLength(mGameBuildAndTarget); using (var blf = new KBlam.Blob.Transport.BlobTransportStream()) { blf.GameTarget = mGameBuildAndTarget; var blob_system = mGameEngineBlobSystemRef.System; blf_result = blf.OpenRange(fs, mFileOffset, mFileOffset + blffile_length, FileAccess.Read); if (blf_result.IsValid) { blf.UnderlyingStream.StreamMode = FileAccess.Read; IEnumerable <KBlam.Blob.BlobObject> objects; blf_result = blf.EnumerateChunks(blob_system, out objects); if (blf_result.IsValid) { gevb = (from bo in objects where bo is KBlam.Blob.GameEngineVariantBlob select bo).FirstOrDefault() as KBlam.Blob.GameEngineVariantBlob; } } } if (blf_result.IsInvalid) { Console.WriteLine("Error: Failed to decode variant file{0}{1}", System.Environment.NewLine, blf_result.BuildErrorMessage()); } else if (gevb == null) { Console.WriteLine("Error: Not a game variant file"); } else if (KBlam.Blob.GameEngineVariantBlob.RequireValidHashes && gevb.InvalidData) { Console.WriteLine("Error: Game variant file's bitstream is corrupt"); } else { gev = gevb.Data; } return(blf_result.IsValid); }