/// <summary>
        /// This ROP creates a new attachment on a message. 
        /// </summary>
        /// <param name="handle">The handle to operate</param>
        /// <param name="createAttachmentResponse">The response of this ROP.</param>
        /// <param name="needVerify">Whether need to verify the response.</param>
        /// <returns>The index of the output handle for the response</returns>
        private uint RopCreateAttachment(uint handle, out RopCreateAttachmentResponse createAttachmentResponse, bool needVerify)
        {
            this.rawDataValue = null;
            this.responseValue = null;
            this.responseSOHsValue = null;

            RopCreateAttachmentRequest createAttachmentRequest = new RopCreateAttachmentRequest()
            {
                RopId = (byte)RopId.RopCreateAttachment,
                LogonId = LogonId,
                InputHandleIndex = (byte)HandleIndex.FirstIndex,
                OutputHandleIndex = (byte)HandleIndex.SecondIndex,
            };

            this.responseSOHsValue = this.ProcessSingleRop(createAttachmentRequest, handle, ref this.responseValue, ref this.rawDataValue, RopResponseType.SuccessResponse);
            createAttachmentResponse = (RopCreateAttachmentResponse)this.responseValue;
            if (needVerify)
            {
                this.Site.Assert.AreEqual((uint)RopResponseType.SuccessResponse, createAttachmentResponse.ReturnValue, string.Format("RopCreateAttachmentResponse Failed! Error: 0x{0:X8}", createAttachmentResponse.ReturnValue));
            }

            return this.responseSOHsValue[0][createAttachmentResponse.OutputHandleIndex];
        }
        /// <summary>
        /// Verify the message of RopCreateAttachmentResponse
        /// </summary>
        /// <param name="ropCreateAttachmentResponse"> The message of RopCreateAttachmentResponse </param>
        /// <param name="nID"> ID for the Attachment object </param>
        private void VerifyDataStructureRopCreateAttachmentResponse(RopCreateAttachmentResponse ropCreateAttachmentResponse, int nID)
        {
            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCMSG_R867");

            // Verify MS-OXCMSG requirement: MS-OXCMSG_R867
            bool isVerifyR867 = ropCreateAttachmentResponse.AttachmentID.GetType() == typeof(uint) && ropCreateAttachmentResponse.AttachmentID == nID;

            Site.CaptureRequirementIfIsTrue(
                isVerifyR867,
                867,
                @"[In RopCreateAttachment ROP Response Buffer] AttachmentID: 4 bytes containing the ID for the Attachment object that was created.");
        }
        /// <summary>
        /// Verify RopCreateAttachment Success Response
        /// </summary>
        /// <param name="ropCreateAttachmentResponse">The response of RopCreateAttachment request</param>
        /// <param name="outputHandleIndex">The field of OutputHandleIndex in RopCreateAttachment request</param>
        private void VerifyRopCreateAttachmentSuccessResponse(RopCreateAttachmentResponse ropCreateAttachmentResponse, byte outputHandleIndex)
        {
            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2164");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2164
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropCreateAttachmentResponse.RopId.GetType(),
                2164,
                @"[In RopCreateAttachment ROP Success Response Buffer] RopId (1 byte): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2166");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2166
            Site.CaptureRequirementIfAreEqual<byte>(
                (byte)RopId.RopCreateAttachment,
                ropCreateAttachmentResponse.RopId,
                2166,
                @"[In RopCreateAttachment ROP Success Response Buffer,RopId (1 byte)]For this operation[ RopCreateAttachment], this field is set to 0x23.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2167");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2167
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropCreateAttachmentResponse.OutputHandleIndex.GetType(),
                2167,
                @"[In RopCreateAttachment ROP Success Response Buffer]OutputHandleIndex (1 byte): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2168");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2168
            Site.CaptureRequirementIfAreEqual<byte>(
                outputHandleIndex,
                ropCreateAttachmentResponse.OutputHandleIndex,
                2168,
                @"[In RopCreateAttachment ROP Success Response Buffer,OutputHandleIndex (1 byte)]This index MUST be set to the value specified in the OutputHandleIndex field in the request.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2170");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2170
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(uint),
                ropCreateAttachmentResponse.ReturnValue.GetType(),
                2170,
                @"[In RopCreateAttachment ROP Success Response Buffer]ReturnValue (4 bytes): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2172");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2172
            Site.CaptureRequirementIfAreEqual<uint>(
                SuccessReturnValue,
                ropCreateAttachmentResponse.ReturnValue,
                2172,
                @"[In RopCreateAttachment ROP Success Response Buffer,ReturnValue (4 bytes)] For this response[Success Response ], this field is set to 0x00000000.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2173");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2173
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(uint),
                ropCreateAttachmentResponse.AttachmentID.GetType(),
                2173,
                @"[In RopCreateAttachment ROP Success Response Buffer]AttachmentID (4 bytes): An unsigned integer identifier.");
        }
        /// <summary>
        /// Verify RopCreateAttachment Failure Response
        /// </summary>
        /// <param name="ropCreateAttachmentResponse">The response of RopCreateAttachment request</param>
        /// <param name="outputHandleIndex">The field of OutputHandleIndex in RopCreateAttachment request</param>
        private void VerifyRopCreateAttachmentFailureResponse(RopCreateAttachmentResponse ropCreateAttachmentResponse, byte outputHandleIndex)
        {
            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2176");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2176
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropCreateAttachmentResponse.RopId.GetType(),
                2176,
                @"[In RopCreateAttachment ROP Failure Response Buffer] RopId (1 byte): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2178");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2178
            Site.CaptureRequirementIfAreEqual<byte>(
                (byte)RopId.RopCreateAttachment,
                ropCreateAttachmentResponse.RopId,
                2178,
                @"[In RopCreateAttachment ROP Failure Response Buffer,RopId (1 byte)]For this operation[RopCreateAttachment], this field is set to 0x23.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2179");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2179
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(byte),
                ropCreateAttachmentResponse.OutputHandleIndex.GetType(),
                2179,
                @"[In RopCreateAttachment ROP Failure Response Buffer]OutputHandleIndex (1 byte): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2180");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2180
            Site.CaptureRequirementIfAreEqual<byte>(
                outputHandleIndex,
                ropCreateAttachmentResponse.OutputHandleIndex,
                2180,
                @"[In RopCreateAttachment ROP Failure Response Buffer,OutputHandleIndex (1 byte)]This index that MUST be set to the value specified in the OutputHandleIndex field in the request.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2182");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2182
            Site.CaptureRequirementIfAreEqual<Type>(
                typeof(uint),
                ropCreateAttachmentResponse.ReturnValue.GetType(),
                2182,
                @"[In RopCreateAttachment ROP Failure Response Buffer]ReturnValue (4 bytes): An unsigned integer.");

            // Add the debug information
            Site.Log.Add(LogEntryKind.Debug, "Verify MS-OXCROPS_R2184");

            // Verify MS-OXCROPS requirement: MS-OXCROPS_R2184
            Site.CaptureRequirementIfAreNotEqual<uint>(
                SuccessReturnValue,
                ropCreateAttachmentResponse.ReturnValue,
                2184,
                @"[In RopCreateAttachment ROP Failure Response Buffer,ReturnValue (4 bytes)]For this response[Failure Response ], this field is set to a value other than 0x00000000.");
        }
        /// <summary>
        /// Create an attachment of the given message.
        /// </summary>
        /// <param name="objectHandle">A Server object handle.</param>
        /// <param name="createAttachmentResponse">The RopCreateAttachmentResponse value.</param>
        /// <param name="attachmentId">The created attachment ID.</param>
        /// <returns>A Server object handle of the created attachment.</returns>
        protected uint CreateAttachment(uint objectHandle, out RopCreateAttachmentResponse createAttachmentResponse, out uint attachmentId)
        {
            RopCreateAttachmentRequest createAttachmentRequest = new RopCreateAttachmentRequest()
            {
                RopId = (byte)RopId.RopCreateAttachment,
                LogonId = CommonLogonId,
                InputHandleIndex = CommonInputHandleIndex,
                OutputHandleIndex = CommonOutputHandleIndex
            };
            this.ResponseSOHs = this.MSOXCMSGAdapter.DoRopCall(createAttachmentRequest, objectHandle, ref this.response, ref this.rawData, GetPropertiesFlags.None);
            createAttachmentResponse = (RopCreateAttachmentResponse)this.response;
            Site.Assert.AreEqual<uint>(TestSuiteBase.Success, createAttachmentResponse.ReturnValue, "Call RopCreateAttachment should success.");
            attachmentId = createAttachmentResponse.AttachmentID;

            return this.ResponseSOHs[0][createAttachmentResponse.OutputHandleIndex];
        }