internal void SendOneItemToSession(
            WSManNativeApi.WSManPluginRequest requestDetails,
            int flags,
            string stream,
            WSManNativeApi.WSManData_UnToMan inboundData)
        {
            if ((!String.Equals(stream, WSManPluginConstants.SupportedInputStream, StringComparison.Ordinal)) &&
                (!String.Equals(stream, WSManPluginConstants.SupportedPromptResponseStream, StringComparison.Ordinal)))
            {
                WSManPluginInstance.ReportOperationComplete(
                    requestDetails,
                    WSManPluginErrorCodes.InvalidInputStream,
                    StringUtil.Format(
                        RemotingErrorIdStrings.WSManPluginInvalidInputStream,
                        WSManPluginConstants.SupportedInputStream));
                return;
            }

            if (null == inboundData)
            {
                // no data is supplied..just ignore.
                WSManPluginInstance.ReportOperationComplete(
                    requestDetails,
                    WSManPluginErrorCodes.NoError);
                return;
            }

            if ((uint)WSManNativeApi.WSManDataType.WSMAN_DATA_TYPE_BINARY != inboundData.Type)
            {
                // only binary data is supported
                WSManPluginInstance.ReportOperationComplete(
                    requestDetails,
                    WSManPluginErrorCodes.InvalidInputDatatype,
                    StringUtil.Format(
                        RemotingErrorIdStrings.WSManPluginInvalidInputStream,
                        "WSMAN_DATA_TYPE_BINARY"));
                return;
            }

            lock (_syncObject)
            {
                if (true == isClosed)
                {
                    WSManPluginInstance.ReportWSManOperationComplete(requestDetails, lastErrorReported);
                    return;
                }
                // store the send request details..because the operation complete
                // may happen from a different thread.
                sendRequestDetails = requestDetails;
            }

            SendOneItemToSessionHelper(inboundData.Data, stream);

            // report operation complete.
            ReportSendOperationComplete();
        }
 /// <summary>
 /// Main routine for connect on a command/pipeline.. Currently NO-OP
 /// will be enhanced later to support intelligent connect... like ending input streams on pipelines
 /// that are still waiting for input data
 /// </summary>
 /// <param name="requestDetails"></param>
 /// <param name="flags"></param>
 /// <param name="inboundConnectInformation"></param>
 internal override void ExecuteConnect(
     WSManNativeApi.WSManPluginRequest requestDetails,
     int flags,
     WSManNativeApi.WSManData_UnToMan inboundConnectInformation)
 {
     WSManPluginInstance.ReportOperationComplete(
         requestDetails,
         WSManPluginErrorCodes.NoError);
     return;
 }
        /// <summary>
        /// Main Routine for Connect on a Shell.
        /// Calls in server remotesessions ExecuteConnect to run the Connect algorithm
        /// This call is synchronous. i.e WSManOperationComplete will be called before the routine completes
        /// </summary>
        /// <param name="requestDetails"></param>
        /// <param name="flags"></param>
        /// <param name="inboundConnectInformation"></param>
        internal override void ExecuteConnect(
            WSManNativeApi.WSManPluginRequest requestDetails,           // in
            int flags,                                                  // in
            WSManNativeApi.WSManData_UnToMan inboundConnectInformation) // in optional
        {
            if (null == inboundConnectInformation)
            {
                WSManPluginInstance.ReportOperationComplete(
                    requestDetails,
                    WSManPluginErrorCodes.NullInvalidInput,
                    StringUtil.Format(
                        RemotingErrorIdStrings.WSManPluginNullInvalidInput,
                        "inboundConnectInformation",
                        "WSManPluginShellConnect"));
                return;
            }

            //not registering shutdown event as this is a synchronous operation.

            IntPtr responseXml = IntPtr.Zero;

            try
            {
                System.Byte[] inputData;
                System.Byte[] outputData;

                // Retrieve the string (Base64 encoded)
                inputData = ServerOperationHelpers.ExtractEncodedXmlElement(
                    inboundConnectInformation.Text,
                    WSManNativeApi.PS_CONNECT_XML_TAG);

                //this will raise exceptions on failure
                try
                {
                    _remoteSession.ExecuteConnect(inputData, out outputData);

                    //construct Xml to send back
                    string responseData = String.Format(System.Globalization.CultureInfo.InvariantCulture,
                                                        "<{0} xmlns=\"{1}\">{2}</{0}>",
                                                        WSManNativeApi.PS_CONNECTRESPONSE_XML_TAG,
                                                        WSManNativeApi.PS_XML_NAMESPACE,
                                                        Convert.ToBase64String(outputData));

                    //TODO: currently using OperationComplete to report back the responseXml. This will need to change to use WSManReportObject
                    //that is currently internal.
                    WSManPluginInstance.ReportOperationComplete(requestDetails, WSManPluginErrorCodes.NoError, responseData);
                }
                catch (PSRemotingDataStructureException ex)
                {
                    WSManPluginInstance.ReportOperationComplete(requestDetails, WSManPluginErrorCodes.PluginConnectOperationFailed, ex.Message);
                }
            }
            catch (OutOfMemoryException)
            {
                WSManPluginInstance.ReportOperationComplete(requestDetails, WSManPluginErrorCodes.OutOfMemory);
            }
            finally
            {
                if (responseXml != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(responseXml);
                }
            }

            return;
        }
 internal abstract void ExecuteConnect(
     WSManNativeApi.WSManPluginRequest requestDetails,            // in
     int flags,                                                   // in
     WSManNativeApi.WSManData_UnToMan inboundConnectInformation); // in optional