IntPtr z_stream;
byte [] io_buffer;
+ GCHandle data;
+
public DeflateStream (Stream compressedStream, CompressionMode mode) :
this (compressedStream, mode, false, false)
{
if (mode != CompressionMode.Compress && mode != CompressionMode.Decompress)
throw new ArgumentException ("mode");
+ this.data = GCHandle.Alloc (this);
this.base_stream = compressedStream;
this.feeder = (mode == CompressionMode.Compress) ? new UnmanagedReadOrWrite (UnmanagedWrite) :
new UnmanagedReadOrWrite (UnmanagedRead);
- this.z_stream = CreateZStream (mode, gzip, feeder);
+ this.z_stream = CreateZStream (mode, gzip, feeder, GCHandle.ToIntPtr (data));
if (z_stream == IntPtr.Zero) {
this.base_stream = null;
this.feeder = null;
CheckResult (res, "Dispose");
}
+ if (data.IsAllocated) {
+ data.Free ();
+ data = new GCHandle ();
+ }
+
base.Dispose (disposing);
}
+#if MONOTOUCH
+ [MonoPInvokeCallback (typeof (UnmanagedReadOrWrite))]
+#endif
+ static int UnmanagedRead (IntPtr buffer, int length, IntPtr data)
+ {
+ GCHandle s = GCHandle.FromIntPtr (data);
+ var self = s.Target as DeflateStream;
+ if (self == null)
+ return -1;
+ return self.UnmanagedRead (buffer, length);
+ }
+
int UnmanagedRead (IntPtr buffer, int length)
{
int total = 0;
return total;
}
+#if MONOTOUCH
+ [MonoPInvokeCallback (typeof (UnmanagedReadOrWrite))]
+#endif
+ static int UnmanagedWrite (IntPtr buffer, int length, IntPtr data)
+ {
+ GCHandle s = GCHandle.FromIntPtr (data);
+ var self = s.Target as DeflateStream;
+ if (self == null)
+ return -1;
+ return self.UnmanagedWrite (buffer, length);
+ }
+
int UnmanagedWrite (IntPtr buffer, int length)
{
int total = 0;
#endif
[DllImport (LIBNAME)]
- static extern IntPtr CreateZStream (CompressionMode compress, bool gzip, UnmanagedReadOrWrite feeder);
+ static extern IntPtr CreateZStream (CompressionMode compress, bool gzip, UnmanagedReadOrWrite feeder, IntPtr data);
[DllImport (LIBNAME)]
static extern int CloseZStream (IntPtr stream);