public static async Task CopyToStorageFile(this IRandomAccessStream stream, IStorageFile file) { var buffer = await stream.ToBuffer(); await FileIO.WriteBufferAsync(file, buffer); }
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; } }
public static async Task CopyToOutputStream(this IRandomAccessStream stream, IOutputStream output) { var buffer = await stream.ToBuffer(); await output.WriteAsync(buffer); }