X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2Fcorlib%2FSystem.IO%2FBinaryWriter.cs;h=be47858d4800486f5ea80d6a12e7f960196f0190;hb=e2812813f9cd0a9342982f42f8b8b9818132a7fb;hp=81db6fe482062623abfc31110b945bde6d3b679a;hpb=a9de8761a35ac3f1aeea4dd22c5df0719bc5f4db;p=mono.git diff --git a/mcs/class/corlib/System.IO/BinaryWriter.cs b/mcs/class/corlib/System.IO/BinaryWriter.cs old mode 100755 new mode 100644 index 81db6fe4820..be47858d480 --- a/mcs/class/corlib/System.IO/BinaryWriter.cs +++ b/mcs/class/corlib/System.IO/BinaryWriter.cs @@ -1,42 +1,89 @@ // // System.IO.BinaryWriter // -// Author: +// Authors: // Matt Kimball (matt@kimball.net) +// Marek Safar (marek.safar@gmail.com) +// + +// +// Copyright (C) 2004 Novell, Inc (http://www.novell.com) +// Copyright 2011 Xamarin Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to +// permit persons to whom the Software is furnished to do so, subject to +// the following conditions: +// +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Text; using System.Globalization; +using Mono.Security; +using System.Runtime.InteropServices; namespace System.IO { [Serializable] + [ComVisible (true)] public class BinaryWriter : IDisposable { // Null is a BinaryWriter with no backing store. - public static readonly BinaryWriter Null; + public static readonly BinaryWriter Null = new BinaryWriter (); protected Stream OutStream; private Encoding m_encoding; private byte [] buffer; - private bool disposed = false; + byte [] stringBuffer; + int maxCharsPerRound; + bool disposed; - static BinaryWriter() { - Null = new BinaryWriter(); + protected BinaryWriter() : this (Stream.Null, Encoding.UTF8UnmarkedUnsafe) + { } - protected BinaryWriter() : this (Stream.Null, Encoding.UTF8Unmarked) { + public BinaryWriter(Stream output) : this(output, Encoding.UTF8UnmarkedUnsafe) + { } - - public BinaryWriter(Stream output) : this(output, Encoding.UTF8Unmarked) { + +#if NET_4_5 + readonly bool leave_open; + + public BinaryWriter(Stream output, Encoding encoding) + : this (output, encoding, false) + { } - - public BinaryWriter(Stream output, Encoding encoding) { - if (output == null || encoding == null) - throw new ArgumentNullException(Locale.GetText ("Output or Encoding is a null reference.")); + + public BinaryWriter(Stream output, Encoding encoding, bool leaveOpen) +#else + const bool leave_open = false; + + public BinaryWriter(Stream output, Encoding encoding) +#endif + { + if (output == null) + throw new ArgumentNullException("output"); + if (encoding == null) + throw new ArgumentNullException("encoding"); if (!output.CanWrite) throw new ArgumentException(Locale.GetText ("Stream does not support writing or already closed.")); +#if NET_4_5 + leave_open = leaveOpen; +#endif OutStream = output; m_encoding = encoding; buffer = new byte [16]; @@ -44,6 +91,7 @@ namespace System.IO { public virtual Stream BaseStream { get { + Flush (); return OutStream; } } @@ -52,13 +100,18 @@ namespace System.IO { Dispose (true); } - void IDisposable.Dispose() { +#if NET_4_0 + public void Dispose () +#else + void IDisposable.Dispose() +#endif + { Dispose (true); } protected virtual void Dispose (bool disposing) { - if (disposing && OutStream != null) + if (disposing && OutStream != null && !leave_open) OutStream.Close(); buffer = null; @@ -92,56 +145,56 @@ namespace System.IO { OutStream.WriteByte(value); } - public virtual void Write(byte[] value) { + public virtual void Write(byte[] buffer) { if (disposed) throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); - if (value == null) - throw new ArgumentNullException(Locale.GetText ("Byte buffer is a null reference.")); - OutStream.Write(value, 0, value.Length); + if (buffer == null) + throw new ArgumentNullException("buffer"); + OutStream.Write(buffer, 0, buffer.Length); } - public virtual void Write(byte[] value, int offset, int length) { + public virtual void Write(byte[] buffer, int index, int count) { if (disposed) throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); - if (value == null) - throw new ArgumentNullException(Locale.GetText ("Byte buffer is a null reference.")); - OutStream.Write(value, offset, length); + if (buffer == null) + throw new ArgumentNullException("buffer"); + OutStream.Write(buffer, index, count); } - public virtual void Write(char value) { + public virtual void Write(char ch) { if (disposed) throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); char[] dec = new char[1]; - dec[0] = value; + dec[0] = ch; byte[] enc = m_encoding.GetBytes(dec, 0, 1); OutStream.Write(enc, 0, enc.Length); } - public virtual void Write(char[] value) { + public virtual void Write(char[] chars) { if (disposed) throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); - if (value == null) - throw new ArgumentNullException(Locale.GetText ("Chars is a null reference.")); - byte[] enc = m_encoding.GetBytes(value, 0, value.Length); + if (chars == null) + throw new ArgumentNullException("chars"); + byte[] enc = m_encoding.GetBytes(chars, 0, chars.Length); OutStream.Write(enc, 0, enc.Length); } - public virtual void Write(char[] value, int offset, int length) { + public virtual void Write(char[] chars, int index, int count) { if (disposed) throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); - if (value == null) - throw new ArgumentNullException(Locale.GetText ("Chars is a null reference.")); - byte[] enc = m_encoding.GetBytes(value, offset, length); + if (chars == null) + throw new ArgumentNullException("chars"); + byte[] enc = m_encoding.GetBytes(chars, index, count); OutStream.Write(enc, 0, enc.Length); } @@ -151,20 +204,34 @@ namespace System.IO { throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); byte* value_ptr = (byte *)&value; - for (int i = 0; i < 16; i++) { - - /* - * decimal in stream is lo32, mi32, hi32, ss32 - * but its internal structure si ss32, hi32, lo32, mi32 - */ - if (i < 4) - buffer [i + 12] = value_ptr [i]; - else if (i < 8) - buffer [i + 4] = value_ptr [i]; - else if (i < 12) - buffer [i - 8] = value_ptr [i]; - else - buffer [i - 8] = value_ptr [i]; + + /* + * decimal in stream is lo32, mi32, hi32, ss32 + * but its internal structure si ss32, hi32, lo32, mi32 + */ + + if (BitConverter.IsLittleEndian) { + for (int i = 0; i < 16; i++) { + if (i < 4) + buffer [i + 12] = value_ptr [i]; + else if (i < 8) + buffer [i + 4] = value_ptr [i]; + else if (i < 12) + buffer [i - 8] = value_ptr [i]; + else + buffer [i - 8] = value_ptr [i]; + } + } else { + for (int i = 0; i < 16; i++) { + if (i < 4) + buffer [15 - i] = value_ptr [i]; + else if (i < 8) + buffer [15 - i] = value_ptr [i]; + else if (i < 12) + buffer [11 - i] = value_ptr [i]; + else + buffer [19 - i] = value_ptr [i]; + } } OutStream.Write(buffer, 0, 16); @@ -175,7 +242,7 @@ namespace System.IO { if (disposed) throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); - OutStream.Write(BitConverter.GetBytes(value), 0, 8); + OutStream.Write(BitConverterLE.GetBytes(value), 0, 8); } public virtual void Write(short value) { @@ -225,20 +292,32 @@ namespace System.IO { if (disposed) throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); - OutStream.Write(BitConverter.GetBytes(value), 0, 4); + OutStream.Write(BitConverterLE.GetBytes(value), 0, 4); } - + public virtual void Write(string value) { if (disposed) throw new ObjectDisposedException ("BinaryWriter", "Cannot write to a closed BinaryWriter"); - /* The length field is the byte count, not the - * char count - */ - byte[] enc = m_encoding.GetBytes(value); - Write7BitEncodedInt(enc.Length); - OutStream.Write(enc, 0, enc.Length); + int len = m_encoding.GetByteCount (value); + Write7BitEncodedInt (len); + + if (stringBuffer == null) { + stringBuffer = new byte [512]; + maxCharsPerRound = 512 / m_encoding.GetMaxByteCount (1); + } + + int chpos = 0; + int chrem = value.Length; + while (chrem > 0) { + int cch = (chrem > maxCharsPerRound) ? maxCharsPerRound : chrem; + int blen = m_encoding.GetBytes (value, chpos, cch, stringBuffer, 0); + OutStream.Write (stringBuffer, 0, blen); + + chpos += cch; + chrem -= cch; + } } [CLSCompliant(false)]