/// <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; }