#region Using Statements using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using ANX.Framework.Graphics; #endregion // This file is part of the ANX.Framework created by the // "ANX.Framework developer group" and released under the Ms-PL license. // For details see: http://anxframework.codeplex.com/license namespace ANX.Framework.Content.Pipeline.Serialization.Compiler { public sealed class ContentWriter : BinaryWriter { private TargetPlatform targetPlatform; private GraphicsProfile targetProfile; private ContentCompiler compiler; private MemoryStream headerData; private MemoryStream contentData; private Stream finalOutput; private Boolean compressContent; private string rootDirectory; private string referenceRelocationPath; internal ContentWriter(ContentCompiler compiler, Stream output, TargetPlatform targetPlatform, GraphicsProfile targetProfile, bool compressContent, string rootDirectory, string referenceRelocationPath) { this.compiler = compiler; this.targetPlatform = targetPlatform; this.targetProfile = targetProfile; this.compressContent = compressContent; this.rootDirectory = rootDirectory; this.referenceRelocationPath = referenceRelocationPath; this.finalOutput = output; this.headerData = new MemoryStream(); this.contentData = new MemoryStream(); this.OutStream = this.contentData; } public void Write(Color value) { base.Write(value.PackedValue); } public void Write(Matrix value) { base.Write(value.M11); base.Write(value.M12); base.Write(value.M13); base.Write(value.M14); base.Write(value.M21); base.Write(value.M22); base.Write(value.M23); base.Write(value.M24); base.Write(value.M31); base.Write(value.M32); base.Write(value.M33); base.Write(value.M34); base.Write(value.M41); base.Write(value.M42); base.Write(value.M43); base.Write(value.M44); } public void Write(Quaternion value) { base.Write(value.X); base.Write(value.Y); base.Write(value.Z); base.Write(value.W); } public void Write(Vector2 value) { base.Write(value.X); base.Write(value.Y); } public void Write(Vector3 value) { base.Write(value.X); base.Write(value.Y); base.Write(value.Z); } public void Write(Vector4 value) { base.Write(value.X); base.Write(value.Y); base.Write(value.Z); base.Write(value.W); } public void WriteExternalReference(ExternalReference reference) { throw new NotImplementedException(); } public void WriteObject(T value) { if (value == null) { base.Write7BitEncodedInt(0); return; } ContentTypeWriter typeWriter = this.compiler.GetTypeWriter(value.GetType()); base.Write7BitEncodedInt(1); //if (this.recurseDetector.ContainsKey(value)) //{ // throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.FoundCyclicReference, new object[] // { // value // })); //} //this.recurseDetector.Add(value, true); this.InvokeWriter(value, typeWriter); //this.recurseDetector.Remove(value); } private void InvokeWriter(T value, ContentTypeWriter writer) { ContentTypeWriter contentTypeWriter = writer as ContentTypeWriter; if (contentTypeWriter != null) { contentTypeWriter.Write(this, value); return; } writer.Write(this, value); } public void WriteObject(T value, ContentTypeWriter typeWriter) { throw new NotImplementedException(); } public void WriteRawObject(T value) { throw new NotImplementedException(); } public void WriteRawObject(T value, ContentTypeWriter typeWriter) { throw new NotImplementedException(); } public void WriteSharedResource(T value) { throw new NotImplementedException(); } internal void FlushOutput() { //TODO: implement //this.WriteSharedResources(); this.WriteHeader(); this.WriteFinalOutput(); } private void WriteHeader() { this.OutStream = this.headerData; //TODO: implement //base.Write7BitEncodedInt(this.typeWriters.Count); //foreach (ContentTypeWriter current in this.typeWriters) //{ // this.Write(current.GetRuntimeReader(this.targetPlatform)); // this.Write(current.TypeVersion); //} //base.Write7BitEncodedInt(this.sharedResourceNames.Count); } private void WriteFinalOutput() { this.OutStream = this.finalOutput; this.Write('X'); this.Write('N'); this.Write('B'); this.Write((byte)this.targetPlatform); //if (this.targetPlatform == TargetPlatform.Windows) //{ // this.Write((byte)119); //} //else //{ // if (this.targetPlatform == TargetPlatform.XBox360) // { // this.Write((byte)120); // } // else // { // if (this.targetPlatform != TargetPlatform.WindowsPhone) // { // throw new NotSupportedException(); // } // this.Write((byte)109); // } //} if (this.compressContent) { throw new NotImplementedException(); //this.WriteCompressedOutput(); return; } this.WriteUncompressedOutput(); } private void WriteUncompressedOutput() { this.WriteVersionNumber(5); int num = (int)this.headerData.Length; int num2 = (int)this.contentData.Length; this.Write(10 + num + num2); this.OutStream.Write(this.headerData.GetBuffer(), 0, num); this.OutStream.Write(this.contentData.GetBuffer(), 0, num2); } private void WriteVersionNumber(ushort version) { version |= (ushort)((int)this.targetProfile << 8); this.Write(version); } public TargetPlatform TargetPlatform { get { return targetPlatform; } } public GraphicsProfile TargetProfile { get { return TargetProfile; } } } }