示例#1
0
        /// <summary>
        /// May throw exceptions if there are pipe problems.
        /// </summary>
        /// <param name="stream"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static async Task <BuildResponse> ReadAsync(Stream stream, CancellationToken cancellationToken = default(CancellationToken))
        {
            Log("Reading response length");
            // Read the response length
            var lengthBuffer = new byte[4];

            await ReadAllAsync(stream, lengthBuffer, 4, cancellationToken).ConfigureAwait(false);

            var length = BitConverter.ToUInt32(lengthBuffer, 0);

            // Read the response
            Log("Reading response of length {0}", length);
            var responseBuffer = new byte[length];

            await ReadAllAsync(stream,
                               responseBuffer,
                               responseBuffer.Length,
                               cancellationToken).ConfigureAwait(false);

            using (var reader = new BinaryReader(new MemoryStream(responseBuffer), Encoding.Unicode))
            {
                var responseType = (ResponseType)reader.ReadInt32();

                switch (responseType)
                {
                case ResponseType.Completed:
                    return(CompletedBuildResponse.Create(reader));

                case ResponseType.MismatchedVersion:
                    return(new MismatchedVersionBuildResponse());

                case ResponseType.IncorrectHash:
                    return(new IncorrectHashBuildResponse());

                case ResponseType.AnalyzerInconsistency:
                    return(new AnalyzerInconsistencyBuildResponse());

                case ResponseType.Shutdown:
                    return(ShutdownBuildResponse.Create(reader));

                case ResponseType.Rejected:
                    return(new RejectedBuildResponse());

                default:
                    throw new InvalidOperationException("Received invalid response type from server.");
                }
            }
        }
示例#2
0
 private async Task<ConnectionData> HandleShutdownRequest(CancellationToken cancellationToken)
 {
     var id = Process.GetCurrentProcess().Id;
     var response = new ShutdownBuildResponse(id);
     await response.WriteAsync(_stream, cancellationToken).ConfigureAwait(false);
     return new ConnectionData(CompletionReason.ClientShutdownRequest);
 }
示例#3
0
        public async Task ShutdownResponseWriteRead()
        {
            var response = new ShutdownBuildResponse(42);
            Assert.Equal(BuildResponse.ResponseType.Shutdown, response.Type);

            var memoryStream = new MemoryStream();
            await response.WriteAsync(memoryStream, CancellationToken.None);
            memoryStream.Position = 0;

            var read = await BuildResponse.ReadAsync(memoryStream, CancellationToken.None);
            Assert.Equal(BuildResponse.ResponseType.Shutdown, read.Type);
            var typed = (ShutdownBuildResponse)read;
            Assert.Equal(42, typed.ServerProcessId);
        }