/// <summary>
        /// Creates a subscription for specified notifications on the server. 
        /// </summary>
        /// <param name="notificationType">The notification type which want to subscribe.</param>
        /// <param name="wantWholeStore">The value of WantWholeStore.</param>
        /// <param name="flolderId">The value of specified folder ID.</param>
        /// <param name="messageId">The value of specified message ID</param>
        /// <param name="notificationHandle">The value of notificationHandle</param>
        /// <returns>The server response.</returns>
        public RopRegisterNotificationResponse RegisterNotificationWithParameter(NotificationType notificationType, byte wantWholeStore, ulong flolderId, ulong messageId, out uint notificationHandle)
        {
            RopRegisterNotificationRequest registerNotificationRequest;
            RopRegisterNotificationResponse registerNotificationResponse;

            registerNotificationRequest.RopId = (byte)RopId.RopRegisterNotification;
            byte logonId = this.LogonId;
            registerNotificationRequest.LogonId = logonId;

            // Set InputHandleIndex to 0x00, which specifies the location in the Server object handle table
            // where the handle for the input Server object is stored.
            registerNotificationRequest.InputHandleIndex = 0;

            // Set OutputHandleIndex to 0x00, which specifies the location in the Server object handle table where the handle,
            // for the output Server object will be stored, as specified in [MS-OXCROPS] section 2.2.6.2.1
            registerNotificationRequest.OutputHandleIndex = 1;

            // Set the type of the notification that the client is interested in receiving.
            registerNotificationRequest.NotificationTypes = (byte)notificationType;

            // This field is reserved. The field value MUST be 0x00.
            registerNotificationRequest.Reserved = 0;

            // If the scope for notifications is the entire database, the value of wantWholeStore is true; otherwise, FALSE (0x00).
            registerNotificationRequest.WantWholeStore = wantWholeStore;

            // Set the value of the specified message ID.
            registerNotificationRequest.MessageId = messageId;

            // Set the value of the specified folder ID.
            registerNotificationRequest.FolderId = flolderId;

            IList<IDeserializable> responseMessages = this.Process(
                registerNotificationRequest,
                this.LogonHandle,
                out this.responseSOHs);
            registerNotificationResponse = (RopRegisterNotificationResponse)responseMessages[0];
            this.Site.Assert.AreEqual<uint>(
                0,
                registerNotificationResponse.ReturnValue,
                "If ROP succeeds, the ReturnValue of its response is 0(success).");
            notificationHandle = this.responseSOHs[0][registerNotificationResponse.OutputHandleIndex];
            this.VerifyRopRegisterNotificationResponseHandle(notificationHandle);
            this.VerifyROPTransport();
            this.VerifyMAPITransport();
            return registerNotificationResponse;
        }