/// <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)) { // 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 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(AnalyzerInconsistencyBuildResponse.Create(reader)); case ResponseType.Shutdown: return(ShutdownBuildResponse.Create(reader)); case ResponseType.Rejected: return(RejectedBuildResponse.Create(reader)); default: throw new InvalidOperationException("Received invalid response type from server."); } } }