/// <nodoc />
        public static QueryJournalRequest Read(ChangeJournalServiceProtocolReader reader)
        {
            Contract.Requires(reader != null);

            var response = new QueryJournalRequest(reader.ReadVolumeGuidPath());

            return(response);
        }
        /// <nodoc />
        public static ReadJournalResponse Read(ChangeJournalServiceProtocolReader reader)
        {
            Contract.Requires(reader != null);

            var response = new ReadJournalResponse(
                status: reader.ReadUsnJournalReadStatus(),
                nextUsn: new Usn(reader.ReadUInt64()),
                timeout: reader.ReadBoolean());

            return(response);
        }
        /// <nodoc />
        public static ReadJournalRequest Read(ChangeJournalServiceProtocolReader reader)
        {
            Contract.Requires(reader != null);

            return(new ReadJournalRequest(
                       reader.ReadVolumeGuidPath(),
                       journalId: reader.ReadUInt64(),
                       startUsn: new Usn(reader.ReadUInt64()),
                       endUsn: reader.ReadBoolean() ? new Usn(reader.ReadUInt64()) : (Usn?)null,
                       extraReadCount: reader.ReadBoolean() ? reader.ReadInt32() : (int?)null,
                       timeLimit: reader.ReadBoolean() ? TimeSpan.FromTicks(reader.ReadInt64()) : (TimeSpan?)null));
        }
        public static VolumeGuidPath ReadVolumeGuidPath(this ChangeJournalServiceProtocolReader reader)
        {
            Contract.Requires(reader != null);

            string         maybePath = reader.ReadString();
            VolumeGuidPath path;

            if (!VolumeGuidPath.TryCreate(maybePath, out path))
            {
                throw new BuildXLException("Expected a volume GUID path");
            }

            return(path);
        }
        public static ReadUsnJournalStatus ReadUsnJournalReadStatus(this ChangeJournalServiceProtocolReader reader)
        {
            Contract.Requires(reader != null);

            var readStatusValue = reader.ReadByte();
            ReadUsnJournalStatus readStatus;

            if (!EnumTraits <ReadUsnJournalStatus> .TryConvert(readStatusValue, out readStatus))
            {
                throw new BuildXLException("Invalid ReadUsnJournalStatus");
            }

            return(readStatus);
        }
        public static QueryUsnJournalData ReadUsnJournalData(this ChangeJournalServiceProtocolReader reader)
        {
            Contract.Requires(reader != null);

            var data = new QueryUsnJournalData
            {
                UsnJournalId    = reader.ReadUInt64(),
                FirstUsn        = new Usn(reader.ReadUInt64()),
                NextUsn         = new Usn(reader.ReadUInt64()),
                LowestValidUsn  = new Usn(reader.ReadUInt64()),
                MaxUsn          = new Usn(reader.ReadUInt64()),
                MaximumSize     = reader.ReadUInt64(),
                AllocationDelta = reader.ReadUInt64()
            };

            return(data);
        }
        public static QueryUsnJournalResult ReadQueryUsnJournalResult(this ChangeJournalServiceProtocolReader reader)
        {
            Contract.Requires(reader != null);

            var queryStatusValue = reader.ReadInt32();
            QueryUsnJournalStatus queryStatus;

            if (!EnumTraits <QueryUsnJournalStatus> .TryConvert(queryStatusValue, out queryStatus))
            {
                throw new BuildXLException("Invalid QueryUsnJournalStatus");
            }

            if (queryStatus == QueryUsnJournalStatus.Success)
            {
                QueryUsnJournalData data = reader.ReadUsnJournalData();
                return(new QueryUsnJournalResult(queryStatus, data));
            }

            return(new QueryUsnJournalResult(queryStatus, data: null));
        }