예제 #1
0
        public void VirtualChannelOpenEvent(int openHandle, ChannelEvents Event, IntPtr pData, int dataLength, uint totalLength, ChannelFlags dataFlags)
        {
            Debug.Print(DateTime.Now + " " + Environment.MachineName + ": VirtualChannelOpenEvent: " + Event);
            switch (Event)
            {
            case ChannelEvents.DataReceived:
                var data = new byte[dataLength];
                Marshal.Copy(pData, data, 0, dataLength);
                switch (dataFlags & ChannelFlags.Only)
                {
                case ChannelFlags.Only:
                    MessageReceived(ChannelMessage.FromByteArray(data));
                    break;

                case ChannelFlags.First:
                    memoryStream = new MemoryStream((int)totalLength);
                    memoryStream.Write(data, 0, data.Length);
                    break;

                case ChannelFlags.Middle:
                    if (memoryStream != null)
                    {
                        memoryStream.Write(data, 0, data.Length);
                    }
                    break;

                case ChannelFlags.Last:
                    if (memoryStream != null)
                    {
                        memoryStream.Write(data, 0, data.Length);
                        memoryStream.Position = 0;
                        MessageReceived(ChannelMessage.FromStream(memoryStream));
                        memoryStream = null;
                    }
                    break;
                }
                break;

            case ChannelEvents.WriteCanceled:
            case ChannelEvents.WriteComplete:
                /*
                 * The VirtualChannelWrite function is asynchronous. When the write operation has been completed,
                 * your VirtualChannelOpenEvent function receives a CHANNEL_EVENT_WRITE_COMPLETE notification.
                 * Until that notification is received, the caller must not free or reuse the pData buffer passed to VirtualChannelWrite
                 */
                Marshal.FreeHGlobal(pData);
                break;
            }
        }