private async Task DequeueCollectRequestAndSendFrame(WebSocket websocket) { var collectRequest = mCollectRequests.Dequeue(); await collectRequest.Task; mScreenScale = collectRequest.Collector.Scale; mCollectors.Enqueue(collectRequest.Collector); var frame = new FrameInfo(); GetFrame(collectRequest.Collector, frame); GetClipInfo(frame); frame.Seq = collectRequest.DrawRequest.Seq; // TBD: Remove? await ViewtopServer.WriteJson(websocket, frame); }
async Task TryProcessOpenViewtopWebsocketsAsync(WebSocket websocket) { // Main loop Task <WebSocketMessageType> receiveTask = null; while (websocket.State < WebSocketState.CloseSent) { // Start read request if needed if (receiveTask == null) { receiveTask = websocket.ReceiveAsync(mWebsocketRequestStream, CancellationToken.None); } // Await something to do (message from remote, or a completed screen capture) var timeout = Task.Delay(REMOTE_COMMUNICATIONS_TIMEOUT_MS); if (mCollectRequests.Count != 0) { await Task.WhenAny(new Task[] { timeout, mCollectRequests.Peek().Task, receiveTask }); } else { await Task.WhenAny(new Task[] { timeout, receiveTask }); } // Fail if too long without any communications from client if (timeout.IsCompleted) { break; } // Send frames that may have completed in the background while (mCollectRequests.Count != 0 && mCollectRequests.Peek().Task.IsCompleted) { await DequeueCollectRequestAndSendFrame(websocket); } // Process remote events if (receiveTask.IsCompleted) { if (await receiveTask == WebSocketMessageType.Close) { break; // Closed by remote } receiveTask = null; var request = ViewtopServer.ReadJson <RemoteEvents>(mWebsocketRequestStream); if (request.Options != null) { mOptions = request.Options; mLastScreenHash = 0; // Ask CopyScreen blocking to end early } ProcessRemoteEvents(request.Events); if (request.DrawRequest != null) { await EnqueueCollectRequestAsync(websocket, request); } } } }