Author: kostat
Date: 2008-01-03 08:28:39 -0500 (Thu, 03 Jan 2008)
New Revision: 92171

Added:
   trunk/mcs/class/System/System.IO.Compression/DefalteStream.jvm.cs
Modified:
   trunk/mcs/class/System/System20.csproj
   trunk/mcs/class/System/Test/System.Test20.csproj
Log:
implemented compression classes

Added: trunk/mcs/class/System/System.IO.Compression/DefalteStream.jvm.cs
===================================================================
--- trunk/mcs/class/System/System.IO.Compression/DefalteStream.jvm.cs   
2008-01-03 13:26:50 UTC (rev 92170)
+++ trunk/mcs/class/System/System.IO.Compression/DefalteStream.jvm.cs   
2008-01-03 13:28:39 UTC (rev 92171)
@@ -0,0 +1,371 @@
+// 
+// DeflateStream.cs
+//
+// Authors:
+//     Konstantin Triger <[EMAIL PROTECTED]>
+//
+// (c) 2008 Mainsoft corp. <http://www.mainsoft.com>
+//
+// 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.
+//
+
+//#if NET_2_0
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Runtime.Remoting.Messaging;
+using java.io;
+using java.util.zip;
+using vmw.common;
+
+namespace System.IO.Compression
+{
+       public class DeflateStream : Stream
+       {
+               readonly Stream _baseStream;
+               readonly InflaterInputStream _reader;
+               readonly DeflaterOutputStream _writer;
+
+               readonly bool _leaveOpen;
+               bool _open;
+
+               delegate int ReadMethod (byte [] array, int offset, int count);
+               delegate void WriteMethod (byte [] array, int offset, int 
count);
+
+               internal DeflateStream (Stream compressedStream, 
CompressionMode mode, bool leaveOpen, bool gzip) {
+                       if (compressedStream == null)
+                               throw new ArgumentNullException 
("compressedStream");
+
+                       switch (mode) {
+                       case CompressionMode.Compress:
+                               if (!compressedStream.CanWrite)
+                                       throw new ArgumentException ("The base 
stream is not writeable.");
+                               OutputStream outStream = new 
OutputStreamImpl(compressedStream);
+                               _writer = gzip ? new GZIPOutputStream 
(outStream) : new DeflaterOutputStream (outStream, new Deflater 
(Deflater.DEFAULT_COMPRESSION, true));
+                               break;
+                       case CompressionMode.Decompress:
+                               if (!compressedStream.CanRead)
+                                       throw new ArgumentException ("The base 
stream is not readable.");
+                               InputStream inStream = new InputStreamImpl 
(compressedStream);
+                               _reader = gzip ? new GZIPInputStream (inStream) 
: new InflaterInputStream (inStream, new Inflater (true));
+                               break;
+                       default:
+                               throw new ArgumentException ("mode");
+                       }
+
+                       _baseStream = compressedStream;
+                       _leaveOpen = leaveOpen;
+                       _open = true;
+               }
+
+               public DeflateStream (Stream compressedStream, CompressionMode 
mode)
+                       :
+                       this (compressedStream, mode, false, false) { }
+
+               public DeflateStream (Stream compressedStream, CompressionMode 
mode, bool leaveOpen)
+                       :
+                       this (compressedStream, mode, leaveOpen, false) { }
+
+               protected override void Dispose (bool disposing) {
+                       if (!_open) {
+                               base.Dispose (disposing);
+                               return;
+                       }
+
+                       try {
+                               FlushInternal (true);
+                               base.Dispose (disposing);
+                       }
+                       finally {
+                               _open = false;
+                               if (!_leaveOpen)
+                                       _baseStream.Close ();
+                       }
+               }
+
+               private int ReadInternal (byte [] array, int offset, int count) 
{
+                       int r = _reader.read (TypeUtils.ToSByteArray (array), 
offset, count);
+                       return r < 0 ? 0 : r;
+               }
+
+               public override int Read (byte [] dest, int dest_offset, int 
count) {
+                       if (!_open)
+                               throw new ObjectDisposedException 
("DeflateStream");
+                       if (dest == null)
+                               throw new ArgumentNullException ("Destination 
array is null.");
+                       if (!CanRead)
+                               throw new InvalidOperationException ("Stream 
does not support reading.");
+                       int len = dest.Length;
+                       if (dest_offset < 0 || count < 0)
+                               throw new ArgumentException ("Dest or count is 
negative.");
+                       if (dest_offset > len)
+                               throw new ArgumentException ("destination 
offset is beyond array size");
+                       if ((dest_offset + count) > len)
+                               throw new ArgumentException ("Reading would 
overrun buffer");
+
+                       return ReadInternal (dest, dest_offset, count);
+               }
+
+               private void WriteInternal (byte [] array, int offset, int 
count) {
+                       _writer.write (TypeUtils.ToSByteArray (array), offset, 
count);
+               }
+
+               public override void Write (byte [] src, int src_offset, int 
count) {
+                       if (!_open)
+                               throw new ObjectDisposedException 
("DeflateStream");
+
+                       if (src == null)
+                               throw new ArgumentNullException ("src");
+
+                       if (src_offset < 0)
+                               throw new ArgumentOutOfRangeException 
("src_offset");
+
+                       if (count < 0)
+                               throw new ArgumentOutOfRangeException ("count");
+
+                       if (!CanWrite)
+                               throw new NotSupportedException ("Stream does 
not support writing");
+
+                       WriteInternal (src, src_offset, count);
+               }
+
+               private void FlushInternal (bool finish) {
+                       if (!_open)
+                               throw new ObjectDisposedException 
("DeflateStream");
+
+                       if (_writer != null) {
+                               _writer.flush ();
+
+                               if (finish)
+                                       _writer.finish ();
+                       }
+               }
+
+               public override void Flush () {
+                       FlushInternal (false);
+               }
+
+               public override long Seek (long offset, SeekOrigin origin) {
+                       throw new System.NotSupportedException ();
+               }
+
+               public override void SetLength (long value) {
+                       throw new System.NotSupportedException ();
+               }
+
+               public override IAsyncResult BeginRead (byte [] buffer, int 
offset, int count,
+                                                       AsyncCallback cback, 
object state) {
+                       if (!_open)
+                               throw new ObjectDisposedException 
("DeflateStream");
+
+                       if (!CanRead)
+                               throw new NotSupportedException ("This stream 
does not support reading");
+
+                       if (buffer == null)
+                               throw new ArgumentNullException ("buffer");
+
+                       if (count < 0)
+                               throw new ArgumentOutOfRangeException ("count", 
"Must be >= 0");
+
+                       if (offset < 0)
+                               throw new ArgumentOutOfRangeException 
("offset", "Must be >= 0");
+
+                       if (count + offset > buffer.Length)
+                               throw new ArgumentException ("Buffer too small. 
count/offset wrong.");
+
+                       ReadMethod r = new ReadMethod (ReadInternal);
+                       return r.BeginInvoke (buffer, offset, count, cback, 
state);
+               }
+
+               public override IAsyncResult BeginWrite (byte [] buffer, int 
offset, int count,
+                                                       AsyncCallback cback, 
object state) {
+                       if (!_open)
+                               throw new ObjectDisposedException 
("DeflateStream");
+
+                       if (!CanWrite)
+                               throw new InvalidOperationException ("This 
stream does not support writing");
+
+                       if (buffer == null)
+                               throw new ArgumentNullException ("buffer");
+
+                       if (count < 0)
+                               throw new ArgumentOutOfRangeException ("count", 
"Must be >= 0");
+
+                       if (offset < 0)
+                               throw new ArgumentOutOfRangeException 
("offset", "Must be >= 0");
+
+                       if (count + offset > buffer.Length)
+                               throw new ArgumentException ("Buffer too small. 
count/offset wrong.");
+
+                       WriteMethod w = new WriteMethod (WriteInternal);
+                       return w.BeginInvoke (buffer, offset, count, cback, 
state);
+               }
+
+               public override int EndRead (IAsyncResult async_result) {
+                       if (async_result == null)
+                               throw new ArgumentNullException 
("async_result");
+
+                       AsyncResult ares = async_result as AsyncResult;
+                       if (ares == null)
+                               throw new ArgumentException ("Invalid 
IAsyncResult", "async_result");
+
+                       ReadMethod r = ares.AsyncDelegate as ReadMethod;
+                       if (r == null)
+                               throw new ArgumentException ("Invalid 
IAsyncResult", "async_result");
+
+                       return r.EndInvoke (async_result);
+               }
+
+               public override void EndWrite (IAsyncResult async_result) {
+                       if (async_result == null)
+                               throw new ArgumentNullException 
("async_result");
+
+                       AsyncResult ares = async_result as AsyncResult;
+                       if (ares == null)
+                               throw new ArgumentException ("Invalid 
IAsyncResult", "async_result");
+
+                       WriteMethod w = ares.AsyncDelegate as WriteMethod;
+                       if (w == null)
+                               throw new ArgumentException ("Invalid 
IAsyncResult", "async_result");
+
+                       w.EndInvoke (async_result);
+               }
+
+               public Stream BaseStream {
+                       get {
+                               return _baseStream;
+                       }
+               }
+               public override bool CanRead {
+                       get {
+                               return _open && _reader != null;
+                       }
+               }
+               public override bool CanSeek {
+                       get {
+                               return false;
+                       }
+               }
+               public override bool CanWrite {
+                       get {
+                               return _open && _writer != null;
+                       }
+               }
+               public override long Length {
+                       get {
+                               throw new NotSupportedException ();
+                       }
+               }
+               public override long Position {
+                       get {
+                               throw new NotSupportedException ();
+                       }
+                       set {
+                               throw new NotSupportedException ();
+                       }
+               }
+
+               #region InputStreamImpl
+
+               sealed class InputStreamImpl : InputStream
+               {
+                       readonly Stream _stream;
+
+                       public InputStreamImpl (Stream stream) {
+                               _stream = stream;
+                       }
+
+                       public override void close () {
+                               BaseStream.Close ();
+                       }
+
+                       public override int read () {
+                               return BaseStream.ReadByte ();
+                       }
+
+                       public override int read (sbyte [] b, int off, int len) 
{
+                               int r = BaseStream.Read ((byte []) 
TypeUtils.ToByteArray (b), off, len);
+                               return r == 0 ? -1 : r;
+                       }
+
+                       public override long skip (long n) {
+                               return BaseStream.Seek (n, SeekOrigin.Current);
+                       }
+
+                       public override bool Equals (object obj) {
+                               return (obj is InputStreamImpl) &&
+                                       BaseStream.Equals (((InputStreamImpl) 
obj).BaseStream);
+                       }
+
+                       public override int GetHashCode () {
+                               return _stream.GetHashCode ();
+                       }
+
+                       public Stream BaseStream {
+                               get { return _stream; }
+                       }
+               }
+
+               #endregion
+
+               #region OutputStreamImpl
+
+               sealed class OutputStreamImpl : OutputStream
+               {
+                       readonly Stream _stream;
+
+                       public OutputStreamImpl (Stream stream) {
+                               _stream = stream;
+                       }
+
+                       public override void close () {
+                               BaseStream.Close ();
+                       }
+
+                       public override void flush () {
+                               BaseStream.Flush ();
+                       }
+
+                       public override void write (int b) {
+                               BaseStream.WriteByte ((byte) (b & 0xFF));
+                       }
+
+                       public override void write (sbyte [] b, int off, int 
len) {
+                               BaseStream.Write ((byte []) 
TypeUtils.ToByteArray (b), off, len);
+                       }
+
+                       public override bool Equals (object obj) {
+                               return (obj is OutputStreamImpl) &&
+                                       BaseStream.Equals (((OutputStreamImpl) 
obj).BaseStream);
+                       }
+
+                       public override int GetHashCode () {
+                               return _stream.GetHashCode ();
+                       }
+
+                       public Stream BaseStream {
+                               get { return _stream; }
+                       }
+               }
+
+               #endregion
+       }
+}
+//#endif

Modified: trunk/mcs/class/System/System20.csproj
===================================================================
--- trunk/mcs/class/System/System20.csproj      2008-01-03 13:26:50 UTC (rev 
92170)
+++ trunk/mcs/class/System/System20.csproj      2008-01-03 13:28:39 UTC (rev 
92171)
@@ -666,6 +666,9 @@
     <Compile Include="System.Diagnostics\TraceOptions.cs" />
     <Compile Include="System.Diagnostics\TraceSource.cs" />
     <Compile Include="System.Diagnostics\TraceSourceInfo.cs" />
+    <Compile Include="System.IO.Compression\CompressionMode.cs" />
+    <Compile Include="System.IO.Compression\DefalteStream.jvm.cs" />
+    <Compile Include="System.IO.Compression\GzipStream.cs" />
     <Compile Include="System.IO\ErrorEventArgs.cs" />
     <Compile Include="System.IO\ErrorEventHandler.cs" />
     <Compile Include="System.IO\FileAction.cs" />

Modified: trunk/mcs/class/System/Test/System.Test20.csproj
===================================================================
--- trunk/mcs/class/System/Test/System.Test20.csproj    2008-01-03 13:26:50 UTC 
(rev 92170)
+++ trunk/mcs/class/System/Test/System.Test20.csproj    2008-01-03 13:28:39 UTC 
(rev 92171)
@@ -215,6 +215,8 @@
     <Compile Include="System.Configuration\SettingsPropertyTest.cs" />
     <Compile 
Include="System.Configuration\SettingsPropertyValueCollectionTest.cs" />
     <Compile Include="System.Configuration\SettingsPropertyValueTest.cs" />
+    <Compile Include="System.IO.Compression\DeflateStreamTest.cs" />
+    <Compile Include="System.IO.Compression\GzipStreamTest.cs" />
     <Compile 
Include="System.Net.Configuration\ConnectionManagementSectionTest.cs" />
     <Compile Include="System.Net.Configuration\HttpWebRequestElementTest.cs" />
     <Compile 
Include="System.Net.Configuration\WebRequestModulesSectionTest.cs" />

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to