Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
                    }
                }
            }
        }