Example #1
0
        private static string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
        {
            Stream stream = null;
            StreamReader reader = null;

            try {
                // 以字符流的方式读取HTTP响应
                stream = rsp.GetResponseStream();
                switch (rsp.ContentEncoding) {
                    case "gzip":
                        stream = new System.IO.Compression.GZipStream(stream, System.IO.Compression.CompressionMode.Decompress);
                        break;

                    case "deflate":
                        stream = new System.IO.Compression.DeflateStream(stream, System.IO.Compression.CompressionMode.Decompress);
                        break;
                }
                reader = new StreamReader(stream, encoding);

                return reader.ReadToEnd();
            }
            finally {
                // 释放资源
                if (reader != null) reader.Close();
                if (stream != null) stream.Close();
                if (rsp != null) rsp.Close();
            }
        }
Example #2
0
        public static string Decompress(string strSource, int length)
        {
            byte[] buffer = Convert.FromBase64String(strSource);

            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            ms.Write(buffer, 0, buffer.Length);
            ms.Position = 0;
            System.IO.Compression.DeflateStream stream = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Decompress);
            stream.Flush();

            int nSize = length;
            byte[] decompressBuffer = new byte[nSize];
            int nSizeIncept = stream.Read(decompressBuffer, 0, nSize);
            stream.Close();

            return System.Text.Encoding.Unicode.GetString(decompressBuffer, 0, nSizeIncept);//转换为普通的字符串
        }
Example #3
0
 public static byte[] Unzip(byte[] data)
 {
     System.IO.Compression.CompressionMode mode = System.IO.Compression.CompressionMode.Decompress;
     System.IO.Compression.DeflateStream stream = new System.IO.Compression.DeflateStream(
         new System.IO.MemoryStream(data), mode);
     System.IO.MemoryStream mem = new System.IO.MemoryStream();
     byte[] buffer = new byte[4096];
     while (true)
     {
         int count = stream.Read(buffer, 0, buffer.Length);
         if (count != 0)
             mem.Write(buffer, 0, count);
         if (count != buffer.Length)
             break;
     }
     stream.Close();
     return mem.ToArray();
 }
Example #4
0
        public static string Compress(string strSource)
        {
            if (strSource == null)
                throw new System.ArgumentException("字符串为空!");

            System.Text.Encoding encoding = System.Text.Encoding.Unicode;
            byte[] buffer = encoding.GetBytes(strSource);

            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.IO.Compression.DeflateStream stream = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionMode.Compress, true);
            stream.Write(buffer, 0, buffer.Length);
            stream.Close();

            buffer = ms.ToArray();
            ms.Close();

            //return buffer;
            return Convert.ToBase64String(buffer); //将压缩后的byte[]转换为Base64String
        }
Example #5
0
        public static object DecompressAndDecode(byte[] input)
        {
            MemoryStream compressedStream = new MemoryStream(input);
            compressedStream.Seek(2, SeekOrigin.Begin); //skip zlib header, we're only interested in the deflated bytes
            byte[] outputBytes = new byte[4096];
            DeflateStream stream = new DeflateStream(compressedStream,
                CompressionMode.Decompress);
            try
            {
                stream.Read(outputBytes, 0, (int) input.Length);
                stream.Flush();
                stream.Close();
                return Rencode.Decode(outputBytes);
            }

            catch (Exception e)
            {
                //Console.WriteLine("Exception reading stream");
            }

            return null;
        }
Example #6
0
        public static unsafe byte[] Compress(byte[] buffer)
        {
            using (var compressStream = new System.IO.MemoryStream())
                using (var compressor = new System.IO.Compression.DeflateStream(compressStream, System.IO.Compression.CompressionLevel.Optimal))
                {
                    UInt32 adder = 0;
                    fixed(byte *b = buffer)
                    {
                        adder = CalcAdler32(b, (UInt32)buffer.Length);
                    }

                    compressor.Write(buffer, 0, buffer.Count());
                    compressor.Close();
                    var compressed = compressStream.ToArray();

                    List <byte[]> dst = new List <byte[]>();
                    dst.Add(new byte[] { 0x78, 0x9c });
                    dst.Add(compressed);
                    dst.Add(BitConverter.GetBytes(adder).Reverse().ToArray());

                    return(dst.SelectMany(_ => _).ToArray());
                }
        }
Example #7
0
 /// <summary>
 /// 解压数据
 /// </summary>
 /// <param name="data"></param>
 /// <returns></returns>
 private byte[] DecompressData(byte[] data)
 {
     using (MemoryStream outBuffer = new MemoryStream())
     {
         using (System.IO.Compression.DeflateStream compressedzipStream = new System.IO.Compression.DeflateStream(new MemoryStream(data, 2, data.Length - 2), System.IO.Compression.CompressionMode.Decompress))
         {
             byte[] block = new byte[1024];
             while (true)
             {
                 int bytesRead = compressedzipStream.Read(block, 0, block.Length);
                 if (bytesRead <= 0)
                 {
                     break;
                 }
                 else
                 {
                     outBuffer.Write(block, 0, bytesRead);
                 }
             }
             compressedzipStream.Close();
             return(outBuffer.ToArray());
         }
     }
 }
Example #8
0
        private void WriteDataChunks()
        {
            byte[] pixels = _image.Pixels;

            byte[] data = new byte[_image.PixelWidth * _image.PixelHeight * 4 + _image.PixelHeight];

            int rowLength = _image.PixelWidth * 4 + 1;

            for (int y = 0; y < _image.PixelHeight; y++)
            {
                byte compression = 0;
                if (y > 0)
                {
                    compression = 2;
                }
                data[y * rowLength] = compression;

                for (int x = 0; x < _image.PixelWidth; x++)
                {
                    // Calculate the offset for the new array.
                    int dataOffset = y * rowLength + x * 4 + 1;

                    // Calculate the offset for the original pixel array.
                    int pixelOffset = (y * _image.PixelWidth + x) * 4;

                    data[dataOffset + 0] = pixels[pixelOffset + 0];
                    data[dataOffset + 1] = pixels[pixelOffset + 1];
                    data[dataOffset + 2] = pixels[pixelOffset + 2];
                    data[dataOffset + 3] = pixels[pixelOffset + 3];

                    if (y > 0)
                    {
                        int lastOffset = ((y - 1) * _image.PixelWidth + x) * 4;

                        data[dataOffset + 0] -= pixels[lastOffset + 0];
                        data[dataOffset + 1] -= pixels[lastOffset + 1];
                        data[dataOffset + 2] -= pixels[lastOffset + 2];
                        data[dataOffset + 3] -= pixels[lastOffset + 3];
                    }
                }
            }

            byte[] buffer       = null;
            int    bufferLength = 0;

            MemoryStream memoryStream = null;

            try
            {
                memoryStream = new MemoryStream();

                //using (Ionic.Zlib.DeflateStream zStream = new Ionic.Zlib.DeflateStream(memoryStream, Ionic.Zlib.CompressionMode.Compress))
                using (System.IO.Compression.DeflateStream zStream = new System.IO.Compression.DeflateStream(memoryStream, System.IO.Compression.CompressionMode.Compress))
                {
                    zStream.Write(data, 0, data.Length);
                    zStream.Flush();

                    bufferLength = (int)memoryStream.Length;
                    buffer       = memoryStream.GetBuffer();

                    zStream.Close();
                }

                //using (DeflaterOutputStream zStream = new DeflaterOutputStream(memoryStream))
                //{
                //    zStream.Write(data, 0, data.Length);
                //    zStream.Flush();
                //    zStream.Finish();

                //    bufferLength = (int)memoryStream.Length;
                //    buffer = memoryStream.GetBuffer();
                //}
            }
            finally
            {
                if (memoryStream != null)
                {
                    memoryStream.Dispose();
                }
            }

            int numChunks = bufferLength / MaxBlockSize;

            if (bufferLength % MaxBlockSize != 0)
            {
                numChunks++;
            }

            for (int i = 0; i < numChunks; i++)
            {
                int length = bufferLength - i * MaxBlockSize;

                if (length > MaxBlockSize)
                {
                    length = MaxBlockSize;
                }

                WriteChunk(PngChunkTypes.Data, buffer, i * MaxBlockSize, length);
            }
        }
Example #9
0
            public unsafe void CreateTexture(BinaryReader reader, int[] palette)
            {
                if (Width == 0 || Height == 0) return;
                Image = new Bitmap(Width, Height);
                MaskImage = new Bitmap(1, 1);

                BitmapData data = Image.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
                byte[] bytes = new byte[0];
                byte[] maskbytes = new byte[0];
                MemoryStream output;
                switch (nType)
                {
                    case 0://wemade wil file uncompressed
                        if (palette.Length > 256)
                        {
                            bo16bit = true;
                            nSize = nSize * 2;
                        }
                        bytes = reader.ReadBytes(nSize);
                        break;
                    case 1://shanda wzl file compressed
                    case 4://shanda miz file compressed
                        output = new MemoryStream();
                        Ionic.Zlib.ZlibStream deflateStream = new Ionic.Zlib.ZlibStream(output,Ionic.Zlib.CompressionMode.Decompress);
                        deflateStream.Write(reader.ReadBytes(nSize), 0, nSize);
                        bytes = output.ToArray();
                        deflateStream.Close();
                        output.Close();
                        break;
                    case 2:
                        byte Compressed = reader.ReadByte();
                        reader.ReadBytes(5);
                        if (Compressed != 8)
                        {
                            bytes = reader.ReadBytes(nSize - 6);
                            break;
                        }
                        MemoryStream input = new MemoryStream(reader.ReadBytes(nSize-6));
                        output = new MemoryStream();
                        byte[] buffer = new byte[10];
                        System.IO.Compression.DeflateStream decompress = new System.IO.Compression.DeflateStream(input, System.IO.Compression.CompressionMode.Decompress);
                        int len;
                        while ((len = decompress.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            output.Write(buffer, 0, len);
                        }
                        bytes = output.ToArray();
                        decompress.Close();
                        output.Close();
                        input.Close();
                        break;
                    case 3:
                        MaskImage = new Bitmap(Width, Height);
                        byte[][] DecodedPixels = DecompressWemadeMir3(reader,Width,Height,nSize);
                        if (DecodedPixels != null)
                        {
                            bytes = DecodedPixels[0];
                            if (HasMask)
                                maskbytes = DecodedPixels[1];
                        }
                        else
                        {
                            HasMask = false;
                            bytes = new byte[Width * Height * 2];
                        }
                        break;
                }
                int index = 0;
                int* scan0 = (int*) data.Scan0;
                {
                    for (int y = Height - 1; y >= 0; y--)
                    {
                        for (int x = 0; x < Width; x++)
                        {
                            if (bo16bit)
                                scan0[y * Width + x] = convert16bitTo32bit(bytes[index++] + (bytes[index++] << 8));
                            else
                                scan0[y*Width + x] = palette[bytes[index++]];
                        }
                        if (((nType == 1) || (nType == 4)) & (Width % 4 > 0))
                            index += WidthBytes(bo16bit ? 16 : 8, Width) - (Width * (bo16bit ? 2 : 1));
                    }
                }
                Image.UnlockBits(data);
                index = 0;
                if (HasMask)
                {
                    BitmapData Maskdata = MaskImage.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
                    int* maskscan0 = (int*)Maskdata.Scan0;
                    {
                        for (int y = Height - 1; y >= 0; y--)
                        {
                            for (int x = 0; x < Width; x++)
                                maskscan0[y * Width + x] = convert16bitTo32bit(maskbytes[index++] + (maskbytes[index++] << 8));
                        }
                    }
                    MaskImage.UnlockBits(Maskdata);

                }
            }
Example #10
0
        public void Serialize(Stream fs)
        {
            bPayloadAtEndOfFile = ((BulkDataFlags & 0x01) == 0x01);
            bCompressed         = ((BulkDataFlags & 0x02) == 0x02);

            if (bCompressed)
            {
                MemoryStream ms = new MemoryStream();
                WriteInt64(ms, PackageFileTag);
                WriteInt64(ms, CompressionChunkSize);

                Int64 CompressedSizeOffset = ms.Position; WriteInt64(ms, 0);
                WriteInt64(ms, BulkDataDecompressed.Length);

                TotalChunkCount = (BulkDataDecompressed.Length + CompressionChunkSize - 1) / CompressionChunkSize;

                List <Int64> ChanksOffsetInfo = new List <Int64>();

                for (int j = 0; j < TotalChunkCount; j++)
                {
                    ChanksOffsetInfo.Add(ms.Position);
                    WriteInt64(ms, 0);
                    WriteInt64(ms, 0);
                }

                int   nCurrentOffset = 0;
                int   i          = 0;
                Int64 nTotalSize = 0;
                while (nCurrentOffset < BulkDataDecompressed.Length)
                {
                    ms.Seek(0, SeekOrigin.End);
                    Int64 CurrentCompressionChunkSize = CompressionChunkSize;
                    if (BulkDataDecompressed.Length - nCurrentOffset < CurrentCompressionChunkSize)
                    {
                        CurrentCompressionChunkSize = BulkDataDecompressed.Length - nCurrentOffset;
                    }
                    MemoryStream ms_src = new MemoryStream(BulkDataDecompressed, nCurrentOffset, (int)CurrentCompressionChunkSize);
                    nCurrentOffset += (int)CurrentCompressionChunkSize;
                    Int64 nCurFsOffset = ms.Position;
                    WriteUInt16(ms, 0x9C78);
                    System.IO.Compression.DeflateStream ms_compressed = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionLevel.Optimal, true);
                    ms_src.CopyTo(ms_compressed);
                    ms_compressed.Close();
                    Adler32Computer ad32            = new Adler32Computer();
                    byte[]          BufForAdlerCalc = new byte[ms_src.Length];
                    ms_src.Seek(0, SeekOrigin.Begin);
                    ms_src.Read(BufForAdlerCalc, 0, BufForAdlerCalc.Length);
                    ad32.Update(BufForAdlerCalc, 0, BufForAdlerCalc.Length);
                    byte[] AdlerRes = BitConverter.GetBytes(ad32.Checksum);
                    WriteByte(ms, AdlerRes[3]);
                    WriteByte(ms, AdlerRes[2]);
                    WriteByte(ms, AdlerRes[1]);
                    WriteByte(ms, AdlerRes[0]);
                    Int64 nNewFsOffset = ms.Position;
                    ms.Seek(ChanksOffsetInfo[i], SeekOrigin.Begin);
                    WriteInt64(ms, nNewFsOffset - nCurFsOffset);
                    nTotalSize += nNewFsOffset - nCurFsOffset;
                    WriteInt64(ms, CurrentCompressionChunkSize);
                    i++;
                }

                ms.Seek(CompressedSizeOffset, SeekOrigin.Begin);
                WriteInt64(ms, nTotalSize);

                BulkData = new byte[ms.Length];
                ms.Seek(0, SeekOrigin.Begin);
                ms.Read(BulkData, 0, BulkData.Length);
            }

            WriteUInt32(fs, BulkDataFlags);
            WriteInt32(fs, BulkDataDecompressed.Length);
            WriteInt32(fs, BulkData.Length);
            if (!bPayloadAtEndOfFile)
            {
                WriteInt64(fs, fs.Position + 8);
                fs.Write(BulkData, 0, BulkData.Length);
            }
            else
            {
                Int64 nTotalLength = 0;
                for (int i = 0; i < BulkStorage.Count; i++)
                {
                    nTotalLength += BulkStorage[i].LongLength;
                }
                WriteInt64(fs, nTotalLength);
                BulkStorage.Add(BulkData);
            }
        }
Example #11
0
        public void CreateFromStream(Stream _stream, DateTime _cacheTime, EventHandler <CacheWriteProgressChangedEventArgs> progressCallback)
        {
            Microsoft.VisualBasic.FileIO.FileSystem.CreateDirectory(this.innerfi.DirectoryName);
            bool cancel = false;

            using (BufferedStream bufferStream = new BufferedStream(_stream, 1024))
                using (FileStream fs = this.innerfi.Create())
                {
                    byte[] laiwhg;
                    if (this.IsCompressedStream(bufferStream, out laiwhg))
                    {
                        BinaryWriter bw = new BinaryWriter(fs);
                        bw.Write(false);
                        bw.Flush();
                        long totalread = 0;
                        if (laiwhg != null && laiwhg.Length > 0)
                        {
                            fs.Write(laiwhg, 0, laiwhg.Length);
                            totalread = laiwhg.Length;
                        }
                        byte[] arr      = new byte[1024];
                        int    readbyte = bufferStream.Read(arr, 0, arr.Length);
                        while (readbyte > 0)
                        {
                            if (cancel)
                            {
                                fs.Flush();
                                fs.Close();
                                this.innerfi.Delete();
                                return;
                            }
                            fs.Write(arr, 0, readbyte);
                            totalread += readbyte;
                            if (progressCallback != null)
                            {
                                var myEvent = new CacheWriteProgressChangedEventArgs(totalread);
                                progressCallback.Invoke(this, myEvent);
                                cancel = myEvent.Cancel;
                            }
                            readbyte = bufferStream.Read(arr, 0, arr.Length);
                        }
                        fs.Flush();
                    }
                    else
                    {
                        BinaryWriter bw = new BinaryWriter(fs);
                        bw.Write(true);
                        bw.Flush();
                        using (System.IO.Compression.DeflateStream localfile = new System.IO.Compression.DeflateStream(fs, System.IO.Compression.CompressionMode.Compress))
                        {
                            long totalread = 0;
                            if (laiwhg != null && laiwhg.Length > 0)
                            {
                                localfile.Write(laiwhg, 0, laiwhg.Length);
                                totalread = laiwhg.Length;
                            }
                            byte[] arr      = new byte[1024];
                            int    readbyte = bufferStream.Read(arr, 0, arr.Length);
                            while (readbyte > 0)
                            {
                                if (cancel)
                                {
                                    localfile.Flush();
                                    localfile.Close();
                                    this.innerfi.Delete();
                                    return;
                                }
                                localfile.Write(arr, 0, readbyte);
                                totalread += readbyte;
                                if (progressCallback != null)
                                {
                                    var myEvent = new CacheWriteProgressChangedEventArgs(totalread);
                                    progressCallback.Invoke(this, myEvent);
                                    cancel = myEvent.Cancel;
                                }
                                readbyte = bufferStream.Read(arr, 0, arr.Length);
                            }
                            localfile.Flush();
                        }
                    }
                }

            this.innerfi.CreationTimeUtc  = _cacheTime;
            this.innerfi.LastWriteTimeUtc = _cacheTime;
            if (!this._disposed)
            {
                this.CacheCreateCompleted?.Invoke(this, System.EventArgs.Empty);
            }
        }
Example #12
0
            public unsafe void CreateTexture(BinaryReader reader, int[] palette)
            {
                try
                {
                    if (Width == 0 || Height == 0)
                    {
                        return;
                    }
                    Image     = new Bitmap(Width, Height);
                    MaskImage = new Bitmap(1, 1);

                    BitmapData   data      = Image.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
                    byte[]       bytes     = new byte[0];
                    byte[]       maskbytes = new byte[0];
                    MemoryStream output;
                    switch (nType)
                    {
                    case 0:    //wemade wil file uncompressed
                        if (palette.Length > 256)
                        {
                            bo16bit = true;
                            nSize   = nSize * 2;
                        }
                        bytes = reader.ReadBytes(nSize);
                        break;

                    case 1:    //shanda wzl file compressed
                    case 4:    //shanda miz file compressed
                        output = new MemoryStream();
                        Ionic.Zlib.ZlibStream deflateStream = new Ionic.Zlib.ZlibStream(output, Ionic.Zlib.CompressionMode.Decompress);
                        deflateStream.Write(reader.ReadBytes(nSize), 0, nSize);
                        bytes = output.ToArray();
                        deflateStream.Close();
                        output.Close();
                        break;

                    case 2:
                        byte Compressed = reader.ReadByte();
                        reader.ReadBytes(5);
                        if (Compressed != 8)
                        {
                            bytes = reader.ReadBytes(nSize - 6);
                            break;
                        }
                        MemoryStream input = new MemoryStream(reader.ReadBytes(nSize - 6));
                        output = new MemoryStream();
                        byte[] buffer = new byte[10];
                        System.IO.Compression.DeflateStream decompress = new System.IO.Compression.DeflateStream(input, System.IO.Compression.CompressionMode.Decompress);
                        int len;
                        while ((len = decompress.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            output.Write(buffer, 0, len);
                        }
                        bytes = output.ToArray();
                        decompress.Close();
                        output.Close();
                        input.Close();
                        break;

                    case 3:
                        MaskImage = new Bitmap(Width, Height);
                        byte[][] DecodedPixels = DecompressWemadeMir3(reader, Width, Height, nSize);
                        if (DecodedPixels != null)
                        {
                            bytes = DecodedPixels[0];
                            if (HasMask)
                            {
                                maskbytes = DecodedPixels[1];
                            }
                        }
                        else
                        {
                            HasMask = false;
                            bytes   = new byte[Width * Height * 2];
                        }
                        break;
                    }
                    int index = 0;

                    int *scan0 = (int *)data.Scan0;
                    {
                        for (int y = Height - 1; y >= 0; y--)
                        {
                            for (int x = 0; x < Width; x++)
                            {
                                if (bo16bit)
                                {
                                    scan0[y * Width + x] = convert16bitTo32bit(bytes[index++] + (bytes[index++] << 8));
                                }
                                else
                                {
                                    scan0[y * Width + x] = palette[bytes[index++]];
                                }
                            }
                            if (((nType == 1) || (nType == 4)) & (Width % 4 > 0))
                            {
                                index += WidthBytes(bo16bit ? 16 : 8, Width) - (Width * (bo16bit ? 2 : 1));
                            }
                        }
                    }
                    Image.UnlockBits(data);
                    index = 0;
                    if (HasMask)
                    {
                        BitmapData Maskdata  = MaskImage.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
                        int *      maskscan0 = (int *)Maskdata.Scan0;
                        {
                            for (int y = Height - 1; y >= 0; y--)
                            {
                                for (int x = 0; x < Width; x++)
                                {
                                    maskscan0[y * Width + x] = convert16bitTo32bit(maskbytes[index++] + (maskbytes[index++] << 8));
                                }
                            }
                        }
                        MaskImage.UnlockBits(Maskdata);
                    }
                }

                catch (Exception)
                {
                }
            }
Example #13
0
        private async void Listen()
        {
            Stream _netStream = _clientSocket.InputStream.AsStreamForRead(1024);

            byte[] stableBuffer = new byte[1024];
            while (true)
            {
                if (!_StartState)
                {
                    return;
                }
                try
                {
                    _netStream.ReadB(stableBuffer, 0, 4);
                    var packetlength = BitConverter.ToInt32(stableBuffer, 0);
                    packetlength = IPAddress.NetworkToHostOrder(packetlength);

                    if (packetlength < 16)
                    {
                        throw new NotSupportedException("协议失败: (L:" + packetlength + ")");
                    }

                    _netStream.ReadB(stableBuffer, 0, 2); //magic
                    _netStream.ReadB(stableBuffer, 0, 2); //protocol_version

                    _netStream.ReadB(stableBuffer, 0, 4);
                    var typeId = BitConverter.ToInt32(stableBuffer, 0);
                    typeId = IPAddress.NetworkToHostOrder(typeId);

                    _netStream.ReadB(stableBuffer, 0, 4);//magic, params?

                    var playloadlength = packetlength - 16;
                    if (playloadlength == 0)
                    {
                        continue;//没有内容了
                    }

                    typeId = typeId - 1;


                    var buffer = new byte[playloadlength];
                    _netStream.ReadB(buffer, 0, playloadlength);
                    if (typeId == 2)
                    {
                        var viewer = BitConverter.ToUInt32(buffer.Take(4).Reverse().ToArray(), 0); //观众人数
                        if (NewMessage != null)
                        {
                            NewMessage(null, new LiveDanmuModel()
                            {
                                type = LiveDanmuTypes.Viewer, viewer = Convert.ToInt32(viewer)
                            });
                        }
                        Debug.WriteLine(viewer);
                        continue;
                    }
                    var json_str = "";
                    try
                    {
                        //临时解决方案,可以优化
                        //参考https://github.com/Bililive/BililiveRecorder
                        using (MemoryStream outBuffer = new MemoryStream())
                        {
                            using (System.IO.Compression.DeflateStream compressedzipStream = new System.IO.Compression.DeflateStream(new MemoryStream(buffer, 2, playloadlength - 2), System.IO.Compression.CompressionMode.Decompress))
                            {
                                byte[] block = new byte[1024];
                                while (true)
                                {
                                    int bytesRead = compressedzipStream.Read(block, 0, block.Length);
                                    if (bytesRead <= 0)
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        outBuffer.Write(block, 0, bytesRead);
                                    }
                                }
                                compressedzipStream.Close();
                                buffer = outBuffer.ToArray();
                            }
                        }
                        json_str = Regex.Replace(Encoding.UTF8.GetString(buffer, 16, buffer.Length - 16), "}\\0\\0.*?\\0\\0{", "},{");
                    }
                    catch (Exception)
                    {
                        json_str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
                    }

                    if (json_str.Trim().Length != 0)
                    {
                        json_str = "[" + json_str + "]";
                        Debug.WriteLine(json_str);
                        JArray json_array = JArray.Parse(json_str);
                        foreach (var obj in json_array)
                        {
                            if (obj["cmd"] == null)
                            {
                                continue;
                            }
                            if (obj["cmd"].ToString().Contains("DANMU_MSG"))
                            {
                                var v = new DanmuMsgModel();
                                if (obj["info"] != null && obj["info"].ToArray().Length != 0)
                                {
                                    v.text = obj["info"][1].ToString();
                                    if (obj["info"][2] != null && obj["info"][2].ToArray().Length != 0)
                                    {
                                        v.username = obj["info"][2][1].ToString() + ":";

                                        //v.usernameColor = GetColor(obj["info"][2][0].ToString());
                                        if (obj["info"][2][3] != null && Convert.ToInt32(obj["info"][2][3].ToString()) == 1)
                                        {
                                            v.vip   = "老爷";
                                            v.isVip = Visibility.Visible;
                                        }
                                        if (obj["info"][2][4] != null && Convert.ToInt32(obj["info"][2][4].ToString()) == 1)
                                        {
                                            v.vip      = "年费老爷";
                                            v.isVip    = Visibility.Collapsed;
                                            v.isBigVip = Visibility.Visible;
                                        }
                                        if (obj["info"][2][2] != null && Convert.ToInt32(obj["info"][2][2].ToString()) == 1)
                                        {
                                            v.vip     = "房管";
                                            v.isAdmin = Visibility.Visible;
                                        }
                                    }
                                    if (obj["info"][3] != null && obj["info"][3].ToArray().Length != 0)
                                    {
                                        v.medal_name = obj["info"][3][1].ToString();
                                        v.medal_lv   = obj["info"][3][0].ToString();
                                        v.medalColor = obj["info"][3][4].ToString();
                                        v.hasMedal   = Visibility.Visible;
                                    }
                                    if (obj["info"][4] != null && obj["info"][4].ToArray().Length != 0)
                                    {
                                        v.ul      = "UL" + obj["info"][4][0].ToString();
                                        v.ulColor = obj["info"][4][2].ToString();
                                    }
                                    if (obj["info"][5] != null && obj["info"][5].ToArray().Length != 0)
                                    {
                                        v.user_title = obj["info"][5][0].ToString();
                                        v.hasTitle   = Visibility.Visible;
                                    }

                                    if (NewMessage != null)
                                    {
                                        NewMessage(null, new LiveDanmuModel()
                                        {
                                            type = LiveDanmuTypes.Danmu, value = v
                                        });
                                    }
                                }
                            }
                            //19/10/01,cmd DANMU_MSG变成了DANMU_MSG:4:0:2:2:2:0
                            switch (obj["cmd"].ToString())
                            {
                            //case "DANMU_MSG":
                            //    break;
                            case "SEND_GIFT":
                                var g = new GiftMsgModel();
                                if (obj["data"] != null)
                                {
                                    g.uname    = obj["data"]["uname"].ToString();
                                    g.action   = obj["data"]["action"].ToString();
                                    g.giftId   = Convert.ToInt32(obj["data"]["giftId"].ToString());
                                    g.giftName = obj["data"]["giftName"].ToString();
                                    g.num      = obj["data"]["num"].ToString();
                                    g.uid      = obj["data"]["uid"].ToString();
                                    if (NewMessage != null)
                                    {
                                        NewMessage(null, new LiveDanmuModel()
                                        {
                                            type = LiveDanmuTypes.Gift, value = g
                                        });
                                    }
                                }

                                break;

                            case "WELCOME":
                                var w = new WelcomeMsgModel();
                                if (obj["data"] != null)
                                {
                                    w.uname = obj["data"]["uname"].ToString();
                                    w.uid   = obj["data"]["uid"].ToString();
                                    w.svip  = obj["data"]["vip"].ToInt32() != 1;
                                    if (NewMessage != null)
                                    {
                                        NewMessage(null, new LiveDanmuModel()
                                        {
                                            type = LiveDanmuTypes.Welcome, value = w
                                        });
                                    }
                                }
                                break;

                            case "SYS_MSG":
                                if (obj["msg"] != null)
                                {
                                    if (NewMessage != null)
                                    {
                                        NewMessage(null, new LiveDanmuModel()
                                        {
                                            type = LiveDanmuTypes.SystemMsg, value = obj["msg"].ToString()
                                        });
                                    }
                                }

                                break;

                            case "ANCHOR_LOT_START":
                                if (obj["data"] != null)
                                {
                                    if (NewMessage != null)
                                    {
                                        NewMessage(null, new LiveDanmuModel()
                                        {
                                            type = LiveDanmuTypes.ANCHOR_LOT_START, value = obj["data"].ToString()
                                        });
                                    }
                                }
                                break;

                            case "ANCHOR_LOT_AWARD":
                                if (obj["data"] != null)
                                {
                                    if (NewMessage != null)
                                    {
                                        NewMessage(null, new LiveDanmuModel()
                                        {
                                            type = LiveDanmuTypes.ANCHOR_LOT_AWARD, value = obj["data"].ToString()
                                        });
                                    }
                                }
                                break;

                            default:

                                break;
                            }
                            await Task.Delay(delay);
                        }
                    }



                    // }
                }
                catch (Exception ex)
                {
                    LogHelper.Log("加载直播弹幕失败", LogType.ERROR, ex);
                }

                await Task.Delay(delay);
            }
        }
        void showPPXHome()
        {
            SetContentView(Resource.Layout.PrepexHome);
            var closeButton = FindViewById <Button>(Resource.Id.buttonClose);

            closeButton.Click += (sender, e) => {
                //close activity
                StartActivity(typeof(LauncherActivity));
            };

            var buttonClientEvaluation = FindViewById <Button>(Resource.Id.buttonClientEvaluation);

            buttonClientEvaluation.Click += (sender, e) =>
            {
                StartActivity(typeof(IlaspMainStart));
            };
            buttonClientEvaluation.Text = "Add Survey";

            var buttonUnscheduled = FindViewById <Button>(Resource.Id.buttonUnscheduled);

            buttonUnscheduled.Visibility = Android.Views.ViewStates.Gone;

            var buttonDeviceRemovalVisit = FindViewById <Button>(Resource.Id.buttonDeviceRemovalVisit);

            buttonDeviceRemovalVisit.Visibility = Android.Views.ViewStates.Gone;
            //buttonDeviceRemovalVisit.Click += (sender, e) =>
            //{
            //    StartActivity(typeof(VmmcClientSelectionActivity), typeof(VmmcPostOp1));
            //};
            //buttonDeviceRemovalVisit.Text = "Post Operation";

            var buttonPostRemovalVisit = FindViewById <Button>(Resource.Id.buttonPostRemovalVisit);

            buttonPostRemovalVisit.Visibility = Android.Views.ViewStates.Gone;

            //buttonViewList
            var buttonViewList = FindViewById <Button>(Resource.Id.buttonViewList);

            buttonViewList.Click     += (sender, e) => {
                //StartActivity(typeof(lspFilteredGridDisplayActivity));
                //InitializeLocationManager();
            };
            buttonViewList.Text       = "Get GPS";
            buttonViewList.Visibility = Android.Views.ViewStates.Invisible;

            //buttonEditRecords
            var buttonEditRecords = FindViewById <Button>(Resource.Id.buttonEditRecords);

            buttonEditRecords.Click += (sender, e) => {
                StartActivity(typeof(lspClientSelectionActivity), typeof(lspRecordSelectorActivity));
            };

            var buttonSupplies = FindViewById <Button>(Resource.Id.buttonSupplies);

            buttonSupplies.Visibility = Android.Views.ViewStates.Gone;

            //var unsyncdRecs = new CloudDb(Assets).GetRecordsToSync();
            var buttonViewRecordSummaries = FindViewById <Button>(Resource.Id.buttonViewRecordSummaries);

            buttonViewRecordSummaries.Click += (sender, e) =>
            {
                //await getClientSummaryReport(new lspProvider(), Constants.LSP_KIND_DISPLAYNAMES);
                var unsyncdRecs = new store.CloudDb(Assets).GetRecordsToSync();

                var js    = Newtonsoft.Json.JsonConvert.SerializeObject(unsyncdRecs);
                var bytes = System.Text.Encoding.UTF8.GetBytes(js);

                var b64 = string.Empty;
                using (var input = new System.IO.MemoryStream(bytes))
                {
                    using (var outStream = new System.IO.MemoryStream())
                        using (var deflateStream = new System.IO.Compression
                                                   .DeflateStream(outStream,
                                                                  System.IO.Compression.CompressionMode.Compress))
                        {
                            input.CopyTo(deflateStream);
                            deflateStream.Close();
                            b64 = System.Convert.ToBase64String(outStream.ToArray());
                        }
                }
                setTextResults(b64);
            };
            buttonViewRecordSummaries.Text       = "Get unsynced clients";
            buttonViewRecordSummaries.Visibility = Android.Views.ViewStates.Invisible;
        }
Example #15
0
        public async Task CompressionTest(BucketCompressionAlgorithm alg)
        {
            bool overshoot  = false;
            var  baseStream = new MemoryStream();

            for (int i = 0; i < 10; i++)
            {
                baseStream.Write(Guid.NewGuid().ToByteArray(), 0, 16);
            }

            for (int i = 0; i < 10; i++)
            {
                baseStream.Write(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, 8);
            }

            var baseData = baseStream.ToArray();

            Bucket compressed;

            switch (alg)
            {
            case BucketCompressionAlgorithm.ZLib:
#if !NET6_0_OR_GREATER
                compressed = baseData.AsBucket().Compress(alg);
#else
                {
                    var ms = new MemoryStream();
                    var zs = new System.IO.Compression.ZLibStream(ms, System.IO.Compression.CompressionLevel.Optimal);

                    zs.Write(baseData, 0, baseData.Length);
                    zs.Close();
                    compressed = ms.ToArray().AsBucket();
                }
#endif
                break;

            case BucketCompressionAlgorithm.GZip:
            {
                var ms = new MemoryStream();
                var zs = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionLevel.Optimal);

                zs.Write(baseData, 0, baseData.Length);
                zs.Close();
                compressed = ms.ToArray().AsBucket();
                break;
            }

            case BucketCompressionAlgorithm.Deflate:
            {
                var ms = new MemoryStream();
                var zs = new System.IO.Compression.DeflateStream(ms, System.IO.Compression.CompressionLevel.Optimal);

                zs.Write(baseData, 0, baseData.Length);
                zs.Close();
                compressed = ms.ToArray().AsBucket();
                break;
            }

#if NET6_0_OR_GREATER
            case BucketCompressionAlgorithm.Brotli:
            {
                var ms = new MemoryStream();
                var zs = new System.IO.Compression.BrotliStream(ms, System.IO.Compression.CompressionLevel.Optimal);

                zs.Write(baseData, 0, baseData.Length);
                zs.Close();
                compressed = ms.ToArray().AsBucket();

                overshoot = true;
                break;
            }
#endif
            default:
                throw new InvalidOperationException();
            }

            var finishData     = overshoot ? Array.Empty <byte>() : Guid.NewGuid().ToByteArray();
            var compressedData = await compressed.Append(finishData.AsBucket()).ToArrayAsync();

            ushort firstTwo = NetBitConverter.ToUInt16(compressedData, 0);

            switch (alg)
            {
            case BucketCompressionAlgorithm.GZip:
                Assert.AreEqual(0x1F8B, firstTwo, $"Got 0x{firstTwo:x4}");
                break;

            case BucketCompressionAlgorithm.ZLib:
                bool isZlib = new ushort[] { 0x7801, 0x789C, 0x78da }.Contains(firstTwo);
                Assert.IsTrue(isZlib, $"Got 0x{firstTwo:x4}");
                break;

            case BucketCompressionAlgorithm.Deflate:
                // FirstTwo can be anything
                break;
            }


            var inner = compressedData.AsBucket();
            var bb    = await inner.Decompress(alg).ReadFullAsync(4096);

            Assert.AreEqual(baseData.Length, bb.Length);

            var decompressed = bb.ToArray();

            Assert.IsTrue(decompressed.SequenceEqual(baseData), "Same data after decompression");

            bb = await inner.ReadFullAsync(4096);

            Assert.AreEqual(finishData.Length, bb.Length);
            Assert.IsTrue(bb.ToArray().SequenceEqual(finishData));

            var r = await baseData.AsBucket().Compress(alg).ToArrayAsync();

            Stream rs;
            switch (alg)
            {
            case BucketCompressionAlgorithm.ZLib:
                rs = r.AsBucket().Decompress(BucketCompressionAlgorithm.ZLib).AsStream();
                break;

            case BucketCompressionAlgorithm.GZip:
                rs = new System.IO.Compression.GZipStream(new MemoryStream(r), System.IO.Compression.CompressionMode.Decompress);
                break;

            case BucketCompressionAlgorithm.Deflate:
                rs = new System.IO.Compression.DeflateStream(new MemoryStream(r), System.IO.Compression.CompressionMode.Decompress);
                break;

#if NET6_0_OR_GREATER
            case BucketCompressionAlgorithm.Brotli:
                rs = new System.IO.Compression.BrotliStream(new MemoryStream(r), System.IO.Compression.CompressionMode.Decompress);
                break;
#endif
            default:
                throw new InvalidOperationException();
            }

            byte[] resultBytes = new byte[4096];
            Assert.AreEqual(baseData.Length, rs.Read(resultBytes, 0, resultBytes.Length));
        }
Example #16
0
 public static byte[] Zip(byte[] data)
 {
     System.IO.MemoryStream stream = new System.IO.MemoryStream();
     System.IO.Compression.DeflateStream zStream = new System.IO.Compression.DeflateStream(
         stream, System.IO.Compression.CompressionMode.Compress, true);
     zStream.Write(data, 0, data.Length);
     zStream.Close();
     return stream.ToArray();
 }
Example #17
0
        private void WriteDataChunks()
        {
            byte[] pixels = _image.Pixels;

            byte[] data = new byte[_image.PixelWidth * _image.PixelHeight * 4 + _image.PixelHeight];

            int rowLength = _image.PixelWidth * 4 + 1;

            for (int y = 0; y < _image.PixelHeight; y++)
            {
                byte compression = 0;
                if (y > 0)
                {
                    compression = 2;
                }
                data[y * rowLength] = compression;

                for (int x = 0; x < _image.PixelWidth; x++)
                {
                    // Calculate the offset for the new array.
                    int dataOffset = y * rowLength + x * 4 + 1;

                    // Calculate the offset for the original pixel array.
                    int pixelOffset = (y * _image.PixelWidth + x) * 4;

                    data[dataOffset + 0] = pixels[pixelOffset + 0];
                    data[dataOffset + 1] = pixels[pixelOffset + 1];
                    data[dataOffset + 2] = pixels[pixelOffset + 2];
                    data[dataOffset + 3] = pixels[pixelOffset + 3];

                    if (y > 0)
                    {
                        int lastOffset = ((y - 1) * _image.PixelWidth + x) * 4;

                        data[dataOffset + 0] -= pixels[lastOffset + 0];
                        data[dataOffset + 1] -= pixels[lastOffset + 1];
                        data[dataOffset + 2] -= pixels[lastOffset + 2];
                        data[dataOffset + 3] -= pixels[lastOffset + 3];
                    }
                }
            }

            byte[] buffer = null;
            int bufferLength = 0;

            MemoryStream memoryStream = null;
            try
            {
                memoryStream = new MemoryStream();

                //using (Ionic.Zlib.DeflateStream zStream = new Ionic.Zlib.DeflateStream(memoryStream, Ionic.Zlib.CompressionMode.Compress))
                using (System.IO.Compression.DeflateStream zStream = new System.IO.Compression.DeflateStream(memoryStream, System.IO.Compression.CompressionMode.Compress))
                {
                    zStream.Write(data, 0, data.Length);
                    zStream.Flush();

                    bufferLength = (int)memoryStream.Length;
                    buffer = memoryStream.GetBuffer();

                    zStream.Close();
                }

                //using (DeflaterOutputStream zStream = new DeflaterOutputStream(memoryStream))
                //{
                //    zStream.Write(data, 0, data.Length);
                //    zStream.Flush();
                //    zStream.Finish();

                //    bufferLength = (int)memoryStream.Length;
                //    buffer = memoryStream.GetBuffer();
                //}
            }
            finally
            {
                if (memoryStream != null)
                {
                    memoryStream.Dispose();
                }
            }

            int numChunks = bufferLength / MaxBlockSize;

            if (bufferLength % MaxBlockSize != 0)
            {
                numChunks++;
            }

            for (int i = 0; i < numChunks; i++)
            {
                int length = bufferLength - i * MaxBlockSize;

                if (length > MaxBlockSize)
                {
                    length = MaxBlockSize;
                }

                WriteChunk(PngChunkTypes.Data, buffer, i * MaxBlockSize, length);
            }
        }
Example #18
0
        /// <summary>
        /// Closes the fileStream and removes the FileStreamAssembler from the parentAssemblerList
        /// </summary>
        internal void FinishAssembling()
        {
            this.isActive = false;
            try {
                foreach (byte[] data in tcpPacketBufferWindow.Values)
                {
                    this.fileStream.Write(data, 0, data.Length);
                }
                this.fileStream.Flush();
            }
            catch (Exception ex) {
                if (fileStream != null)
                {
                    parentAssemblerList.PacketHandler.OnAnomalyDetected("Error writing final data to file \"" + fileStream.Name + "\".\n" + ex.Message);
                }
                else
                {
                    parentAssemblerList.PacketHandler.OnAnomalyDetected("Error writing final data to file \"" + this.filename + "\".\n" + ex.Message);
                }
            }
            tcpPacketBufferWindow.Clear();
            parentAssemblerList.Remove(this, false);
            string destinationPath = GetFilePath(false);

            //I need to create the directory here since the file might either be moved to this located or a new file will be created there from a stream
            string directoryName = destinationPath.Substring(0, destinationPath.Length - this.filename.Length);

            if (this.fileStreamType != FileStreamTypes.HttpPostMimeMultipartFormData && !System.IO.Directory.Exists(directoryName))
            {
                try {
                    System.IO.Directory.CreateDirectory(directoryName);
                }
                catch (Exception e) {
                    parentAssemblerList.PacketHandler.OnAnomalyDetected("Error creating directory \"" + directoryName + "\".\n" + e.Message);
                    //parentAssemblerList.PacketHandler.ParentForm.ShowError("Error creating directory \""+directoryName+"\".\n"+e.Message);
                }
            }

            if (System.IO.File.Exists(destinationPath))
            {
                try {
                    System.IO.File.Delete(destinationPath);
                }
                catch (Exception e) {
                    parentAssemblerList.PacketHandler.OnAnomalyDetected("Error deleting file \"" + destinationPath + "\" (tried to replace it)");
                    //parentAssemblerList.PacketHandler.ParentForm.ShowError("Error deleting file \""+destinationPath+"\" (tried to replace it)");
                }
            }

            //do some special fixes such as un-chunk data or decompress compressed data
            if (this.fileStreamType == FileStreamTypes.HttpGetChunked || (parentAssemblerList.DecompressGzipStreams && this.contentEncoding == Packets.HttpPacket.ContentEncodings.Gzip) || this.contentEncoding == Packets.HttpPacket.ContentEncodings.Deflate)
            {
                this.fileStream.Position = 0;//move to fileStream start since it needs to be read

                if (this.fileStreamType == FileStreamTypes.HttpGetChunked && (parentAssemblerList.DecompressGzipStreams && this.contentEncoding == Packets.HttpPacket.ContentEncodings.Gzip))
                {
                    using (DeChunkedDataStream deChunkedStream = new DeChunkedDataStream(this.fileStream)) {
                        using (System.IO.Compression.GZipStream decompressedStream = new System.IO.Compression.GZipStream(deChunkedStream, System.IO.Compression.CompressionMode.Decompress)) {
                            try {
                                this.WriteStreamToFile(decompressedStream, destinationPath);
                            }
                            catch (Exception e) {
                                this.parentAssemblerList.PacketHandler.OnAnomalyDetected("Error: Cannot write to file " + destinationPath + " (" + e.Message + ")");
                                //this.parentAssemblerList.PacketHandler.ParentForm.ShowError("Error: Cannot write to file "+destinationPath+" ("+e.Message+")");
                            }
                            decompressedStream.Close();
                        }
                        deChunkedStream.Close();
                    }
                }
                else if (this.fileStreamType == FileStreamTypes.HttpGetChunked && this.contentEncoding == Packets.HttpPacket.ContentEncodings.Deflate)
                {
                    using (DeChunkedDataStream deChunkedStream = new DeChunkedDataStream(this.fileStream)) {
                        using (System.IO.Compression.DeflateStream decompressedStream = new System.IO.Compression.DeflateStream(deChunkedStream, System.IO.Compression.CompressionMode.Decompress)) {
                            try {
                                this.WriteStreamToFile(decompressedStream, destinationPath);
                            }
                            catch (Exception e) {
                                this.parentAssemblerList.PacketHandler.OnAnomalyDetected("Error: Cannot write to file " + destinationPath + " (" + e.Message + ")");
                                //this.parentAssemblerList.PacketHandler.ParentForm.ShowError("Error: Cannot write to file "+destinationPath+" ("+e.Message+")");
                            }

                            decompressedStream.Close();
                        }
                        deChunkedStream.Close();
                    }
                }
                else if (this.fileStreamType == FileStreamTypes.HttpGetChunked)
                {
                    using (DeChunkedDataStream deChunkedStream = new DeChunkedDataStream(this.fileStream)) {
                        try {
                            this.WriteStreamToFile(deChunkedStream, destinationPath);
                        }
                        catch (Exception e) {
                            this.parentAssemblerList.PacketHandler.OnAnomalyDetected("Error: Cannot write to file " + destinationPath + " (" + e.Message + ")");
                            //this.parentAssemblerList.PacketHandler.ParentForm.ShowError("Error: Cannot write to file "+destinationPath+" ("+e.Message+")");
                        }
                        deChunkedStream.Close();
                    }
                }
                else
                {
                    using (System.IO.Compression.GZipStream decompressedStream = new System.IO.Compression.GZipStream(this.fileStream, System.IO.Compression.CompressionMode.Decompress)) {
                        try {
                            this.WriteStreamToFile(decompressedStream, destinationPath);
                        }
                        catch (Exception e) {
                            this.parentAssemblerList.PacketHandler.OnAnomalyDetected("Error: Cannot write to file " + destinationPath + " (" + e.Message + ")");
                            //this.parentAssemblerList.PacketHandler.ParentForm.ShowError("Error: Cannot write to file "+destinationPath+" ("+e.Message+")");
                        }
                        decompressedStream.Close();
                    }
                }

                this.fileStream.Close();
                System.IO.File.Delete(GetFilePath(true));//delete the temp file
            }
            else if (this.fileStreamType == FileStreamTypes.HttpPostMimeMultipartFormData)
            {
                Mime.UnbufferedReader mimeReader = new PacketParser.Mime.UnbufferedReader(this.fileStream);

                List <Mime.MultipartPart> parts = new List <PacketParser.Mime.MultipartPart>();
                foreach (Mime.MultipartPart part in Mime.PartBuilder.GetParts(mimeReader, this.Details))
                {
                    parts.Add(part);
                }

                this.parentAssemblerList.PacketHandler.ExtractMultipartFormData(parts, sourceHost, destinationHost, timestamp, this.initialFrameNumber, "TCP " + sourcePort, "TCP " + destinationPort, ApplicationLayerProtocol.Unknown);

                foreach (Mime.MultipartPart part in parts)
                {
                    if (part.Attributes["filename"] != null && part.Attributes["filename"].Length > 0 && part.Data != null && part.Data.Length > 0)
                    {
                        //we have a file!
                        string mimeFileLocation = part.Attributes["filename"];
                        if (mimeFileLocation.Contains("/"))
                        {
                            mimeFileLocation = mimeFileLocation.Substring(0, mimeFileLocation.LastIndexOf('/'));
                        }
                        if (mimeFileLocation.Contains("\\"))
                        {
                            mimeFileLocation = mimeFileLocation.Substring(0, mimeFileLocation.LastIndexOf('\\'));
                        }
                        string mimeFileName = part.Attributes["filename"];
                        if (mimeFileName.Contains("/") && mimeFileName.Length > mimeFileName.LastIndexOf('/') + 1)
                        {
                            mimeFileName = mimeFileName.Substring(mimeFileName.LastIndexOf('/') + 1);
                        }
                        if (mimeFileName.Contains("\\") && mimeFileName.Length > mimeFileName.LastIndexOf('\\') + 1)
                        {
                            mimeFileName = mimeFileName.Substring(mimeFileName.LastIndexOf('\\') + 1);
                        }


                        using (FileStreamAssembler partAssembler = new FileStreamAssembler(this.parentAssemblerList, this.sourceHost, this.sourcePort, this.destinationHost, this.destinationPort, this.tcpTransfer, FileStreamTypes.HttpPostMimeFileData, mimeFileName, mimeFileLocation, part.Attributes["filename"], this.initialFrameNumber, this.timestamp)) {
                            this.parentAssemblerList.Add(partAssembler);
                            partAssembler.FileContentLength         = part.Data.Length;
                            partAssembler.FileSegmentRemainingBytes = part.Data.Length;
                            if (partAssembler.TryActivate())
                            {
                                partAssembler.AddData(part.Data, 0);
                            }
                        }

                        /*
                         * FixFilenameAndLocation(ref mimeFileName, ref mimeFileLocation);
                         * string mimeFilePath=GetFilePath(false, this.tcpTransfer, this.sourceHost.IPAddress, this.destinationHost.IPAddress, this.sourcePort, this.destinationPort, this.fileStreamType, mimeFileLocation, mimeFileName, this.parentAssemblerList);
                         * Mime.ByteArrayStream partDataStream=new PacketParser.Mime.ByteArrayStream(part.Data, 0);
                         * pare
                         * this.WriteStreamToFile(partDataStream, mimeFilePath);
                         * try {
                         *  ReconstructedFile completedFile=new ReconstructedFile(mimeFilePath, sourceHost, destinationHost, sourcePort, destinationPort, tcpTransfer, fileStreamType, "boundary="+details, this.initialFrameNumber, this.timestamp);
                         *  parentAssemblerList.PacketHandler.AddReconstructedFile(completedFile);
                         *  //parentAssemblerList.PacketHandler.ParentForm.ShowReconstructedFile(completedFile);
                         * }
                         * catch(Exception e) {
                         *  this.parentAssemblerList.PacketHandler.OnAnomalyDetected("Error creating reconstructed file: "+e.Message);
                         * }*/
                    }
                }
                this.fileStream.Close();
                System.IO.File.Delete(GetFilePath(true));
            }
            else  //files which are already completed can simply be moved to their final destination
            {
                if (this.fileStream != null)
                {
                    this.fileStream.Close();
                }
                try {
                    string tmpPath = GetFilePath(true);
                    if (System.IO.File.Exists(tmpPath))
                    {
                        System.IO.File.Move(tmpPath, destinationPath);
                    }
                }
                catch (Exception e) {
                    this.parentAssemblerList.PacketHandler.OnAnomalyDetected("Error moving file \"" + GetFilePath(true) + "\" to \"" + destinationPath + "\". " + e.Message);
                }
            }
            if (System.IO.File.Exists(destinationPath))
            {
                try {
                    ReconstructedFile completedFile = new ReconstructedFile(destinationPath, sourceHost, destinationHost, sourcePort, destinationPort, tcpTransfer, fileStreamType, details, this.initialFrameNumber, this.timestamp);
                    parentAssemblerList.PacketHandler.AddReconstructedFile(completedFile);
                    //parentAssemblerList.PacketHandler.ParentForm.ShowReconstructedFile(completedFile);
                }
                catch (Exception e) {
                    this.parentAssemblerList.PacketHandler.OnAnomalyDetected("Error creating reconstructed file: " + e.Message);
                }
            }
        }
        void saveIndexedPNG(Stream fs, Form1.frame sprite)
        {
            MemoryStream ms = new MemoryStream();
            BinaryWriter w  = new BinaryWriter(ms);

            w.Write(0x474E5089);
            w.Write(0x0A1A0A0D);

            // IHDR
            w.Write(toBE(13));
            long pos = ms.Position;

            w.Write(0x52444849);
            w.Write(toBE(sprite.W));
            w.Write(toBE(sprite.H));
            w.Write((byte)8);
            w.Write((byte)3);
            w.Write((byte)0);
            w.Write((byte)0);
            w.Write((byte)0);
            w.Write(toBE(CRC(ms, pos, ms.Position)));

            // PLTE
            w.Write(toBE(3 * 256));
            pos = ms.Position;
            w.Write(0x45544C50);
            w.Write((byte)0xff);
            w.Write((byte)0);
            w.Write((byte)0xff);
            for (int i = 1; i < pal.Length; i++)
            {
                w.Write((byte)(pal[i] >> 16));
                w.Write((byte)(pal[i] >> 8));
                w.Write((byte)(pal[i]));
            }
            w.Write(toBE(CRC(ms, pos, ms.Position)));

            // tRNS
            w.Write(toBE(1));
            pos = ms.Position;
            w.Write(0x534E5274);
            w.Write((byte)0);
            w.Write(toBE(CRC(ms, pos, ms.Position)));

            MemoryStream pixeldata = new MemoryStream();

            for (int y = 0; y < sprite.H; y++)
            {
                pixeldata.WriteByte(0);
                pixeldata.Write(sprite.Raw, y * sprite.W, sprite.W);
            }
            pixeldata.Position = 0;
            MemoryStream compressedPixels = new MemoryStream();

            compressedPixels.WriteByte(0x78);
            compressedPixels.WriteByte(0x5E);
            var c = new System.IO.Compression.DeflateStream(compressedPixels, System.IO.Compression.CompressionMode.Compress, true);

            pixeldata.CopyTo(c);
            c.Close();
            compressedPixels.Position = 0;

            // IDAT
            w.Write(toBE((int)compressedPixels.Length));
            pos = ms.Position;
            w.Write(0x54414449);
            compressedPixels.CopyTo(ms);
            w.Write(toBE(CRC(ms, pos, ms.Position)));

            // IEND
            w.Write(0);
            w.Write(0x444E4549);
            w.Write(0x826042AE);

            ms.Position = 0;
            ms.CopyTo(fs);
            fs.Close();
        }