Exemple #1
0
        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);
        }