/// <summary>
        /// Process this IRequest and update the given <b>Response</b> with
        /// the result.
        /// </summary>
        /// <remarks>
        /// Implementations of this method are free to throw an exception
        /// while processing the IRequest. An exception will result in the
        /// <b>Response</b> being marked as a failure that the
        /// <b>Response</b> result will be the exception itself.
        /// </remarks>
        /// <param name="response">
        /// The <b>Response</b> that will be sent back to the requestor.
        /// </param>
        /// <exception cref="Exception">
        /// If exception occurs during execution.
        /// </exception>
        protected override void OnRun(Response response)
        {
            IChannel channel0 = Channel;

            Debug.Assert(channel0.Id == 0);

            Connection connection = (Connection)channel0.Connection;

            Debug.Assert(connection != null);

            Peer module = (Peer)Channel.Receiver;
            int  id     = ChannelId;

            connection.AcceptChannelRequest
            (
                id,
                module.AssertIdentityToken(module.DeserializeIdentityToken(IdentityToken))
            );

            // Cannot use ImplVersion here as channel0 is established prior to protocol
            // version negotiation.  Instead check the negotiated version directly on the connection's
            // MessageFactoryMap.
            MessageFactory clientFactory = (MessageFactory)connection.MessageFactoryMap
                                           [channel0.MessageFactory.Protocol.Name];

            if (clientFactory != null && clientFactory.Version >= 3)
            {
                response.Result = id;
            }
        }