Beispiel #1
0
        public static async Task CopyToStorageFile(this IRandomAccessStream stream, IStorageFile file)
        {
            var buffer = await stream.ToBuffer();

            await FileIO.WriteBufferAsync(file, buffer);
        }
Beispiel #2
0
        private async Task ProcessIncomingFrame(FrameParser.Frame frame)
        {
            switch (frame.opCode)
            {
            case FrameParser.OP_CONTINUATION:
                await _stream.WriteAsync(frame.payload?.ToBuffer());

                if (frame.isFinal)
                {
                    var    buffer  = _stream.ToBuffer();
                    byte[] message = buffer.ToByteArray();
                    if (this.OnMessage != null)
                    {
                        this.OnMessage(this, new WebSocketMessageEventArgs(this.Control.MessageType, message));
                    }
                    this.ResetStream();
                }
                break;

            case FrameParser.OP_TEXT:
                if (frame.isFinal)
                {
                    if (this.OnMessage != null)
                    {
                        this.OnMessage(this, new WebSocketMessageEventArgs(this.Control.MessageType, frame.payload));
                    }
                }
                else
                {
                    if (_stream.Size != 0)
                    {
                        throw new IOException("no FIN frame");
                    }
                    this.Control.MessageType = WebSocketMessageType.Text;
                    await _stream.WriteAsync(frame.payload.ToBuffer());
                }
                break;

            case FrameParser.OP_BINARY:
                if (frame.isFinal)
                {
                    if (this.OnMessage != null)
                    {
                        this.OnMessage(this, new WebSocketMessageEventArgs(this.Control.MessageType, frame.payload));
                    }
                }
                else
                {
                    if (_stream.Size != 0)
                    {
                        throw new IOException("no FIN frame");
                    }
                    this.Control.MessageType = WebSocketMessageType.Binary;
                    await _stream.WriteAsync(frame.payload.ToBuffer());
                }
                break;

            case FrameParser.OP_CLOSE:
                int code = 0;
                if (frame.payload.Length >= 2)
                {
                    code = ((frame.payload[0] << 8) | (frame.payload[1] & 0xFF)) & 0xFFFF;
                }
                string reason = null;
                if (frame.payload.Length > 2)
                {
                    var temp = frame.payload.CopyOfRange(2, frame.payload.Length);
                    reason = Encoding.UTF8.GetString(temp, 0, temp.Length);
                }
                if (this.Closed != null)
                {
                    this.Closed(this, new WebSocketClosedEventArgs(code, reason));
                }
                this.Disconnect();
                break;

            case FrameParser.OP_PING:
                if (frame.payload.Length > 125)
                {
                    throw new IOException("Ping payload too large");
                }
                byte[] data = FrameParser.BuildFrame(frame.payload, FrameParser.OP_PONG, -1, IS_CLIENT, true);
                await SendFrame(data);

                break;

            case FrameParser.OP_PONG:
                if (this.OnPong != null)
                {
                    this.OnPong(this, frame.payload);
                }
                break;
            }
        }
Beispiel #3
0
        public static async Task CopyToOutputStream(this IRandomAccessStream stream, IOutputStream output)
        {
            var buffer = await stream.ToBuffer();

            await output.WriteAsync(buffer);
        }