private void LogPdu(EusbPdu pdu)
 {
     Site.Log.Add(LogEntryKind.Debug, "{0}\r\n{1}\r\n", pdu.GetType().ToString(), pdu.ToString());
 }
        /// <summary>
        /// Receives an IOCONTROL_COMPLETION, URB_COMPLETION or URB_COMPLETION_NO_DATA request from the client.
        /// </summary>
        /// <param name="channel">The channel to be received in.</param>
        /// <returns>The received completion PDU. Returns null, if timeout or required .</returns>
        public EusbPdu ExpectCompletion(DynamicVirtualChannel channel)
        {
            EusbPdu pdu = this.rdpeusbServer.ExpectRdpeusbPdu <EusbPdu>(channel.ChannelId, waitTime);

            if (null == pdu)
            {
                return(null);
            }

            bool isCompletionPdu = (
                (pdu is EusbIoControlCompletionPdu) ||
                (pdu is EusbUrbCompletionPdu) ||
                (pdu is EusbUrbCompletionNoDataPdu)
                );

            Site.Assert.IsTrue(isCompletionPdu, "Expect a completion PDU, current pdu is {0}.", pdu.ToString());

            return(pdu);
        }
        private void SendPdu(EusbPdu pdu, DynamicVirtualChannel channel)
        {
            Site.Assume.IsNotNull(channel, "DynamicVirtualChannel must be initialized.");

            channel.Send(PduMarshaler.Marshal(pdu));

            Site.Log.Add(LogEntryKind.Debug, "Sending {0}: \r\n{1}\r\n", pdu.GetType().ToString(), pdu.ToString());
        }