/// <summary>
        /// This method is used to lock a specified range of bytes in a Stream object.
        /// </summary>
        /// <param name="preState">Specifies the pre-state before call [RopLockRegionStream]</param>
        /// <param name="error">Return error
        /// 1. If there are previous locks that are not expired, the server MUST return an AccessDenied error.
        /// 2. If a session with an expired lock calls any ROP for this Stream object that would encounter the locked region, 
        /// the server MUST return a NetworkError.</param>
        public void RopLockRegionStreamMethod(PreStateBeforeLock preState, out CPRPTErrorCode error)
        {
            error = CPRPTErrorCode.None;
            RopLockRegionStreamResponse lockRegionStreamResponse;

            // The regionOffset value used in RopLockRegionStream.
            ulong regionOffset = 0;

            // The lockFlags value used in RopLockRegionStream.
            uint lockFlags = (uint)LockFlags.OtherValue;
            RopGetStreamSizeResponse getStreamSizeRes = this.RopGetStreamSize(this.cprptCurrentHandle, true);
            ulong regionSize = getStreamSizeRes.StreamSize;

            lockRegionStreamResponse = this.RopLockRegionStream(this.cprptCurrentHandle, regionOffset, regionSize, lockFlags, false);

            if (preState == PreStateBeforeLock.PreLockNotExpired)
            {
                error = (CPRPTErrorCode)lockRegionStreamResponse.ReturnValue;
                this.Site.Assert.AreEqual(CPRPTErrorCode.None, error, string.Format("RopLockRegionStream failed with error: 0x{0:X8}", lockRegionStreamResponse.ReturnValue));

                lockRegionStreamResponse = this.RopLockRegionStream(this.cprptCurrentHandle, regionOffset, regionSize, lockFlags, false);
                error = (CPRPTErrorCode)lockRegionStreamResponse.ReturnValue;
            }
            else if (preState == PreStateBeforeLock.WithExpiredLock)
            {
                // The byteCount variable in RopReadStream.
                ushort byteCount = 1;

                // The maxByteCount Variable in RopReadStream.
                uint maxByteCount = 1;
                this.RopReadStream(this.cprptCurrentHandle, byteCount, maxByteCount, false);
                error = (CPRPTErrorCode)lockRegionStreamResponse.ReturnValue;

                this.Site.Assert.AreNotEqual(CPRPTErrorCode.AccessDenied, error, string.Format("RopLockRegionStream failed with error: 0x{0:X8}", lockRegionStreamResponse.ReturnValue));
            }
            else if (preState == PreStateBeforeLock.Normal)
            {
                error = (CPRPTErrorCode)lockRegionStreamResponse.ReturnValue;

                this.Site.Assert.AreEqual((uint)CPRPTErrorCode.None, lockRegionStreamResponse.ReturnValue, string.Format("RopLockRegionStream failed with error: 0x{0:X8}", lockRegionStreamResponse.ReturnValue));
            }

            this.VerifyRopLockRegionStream(lockRegionStreamResponse);
        }
        public static void RopLockRegionStreamMethod(PreStateBeforeLock preState, out CPRPTErrorCode error)
        {
            Condition.IsTrue(isInitialized && isStreamOpenedSuccess);

            // RopUnlockRegionStream is only implemented on Exchange server 2007.
            Condition.IsTrue(requirementContainer[750]);
            error = CPRPTErrorCode.None;
            if (preState == PreStateBeforeLock.WithExpiredLock || preState == PreStateBeforeLock.Normal)
            {
                error = CPRPTErrorCode.None;
                ModelHelper.CaptureRequirement(
                     610,
                     "[In Processing RopLockRegionStream] If the server implements this ROP, if all previous locks are expired, or if there are no previous locks, the server MUST grant the requesting client a new lock.");
            }

            isStreamLocked = true;
        }