Пример #1
0
        /**m* SCardChannel/Transmit
         *
         * NAME
         *   SCardChannel.Transmit()
         *
         * SYNOPSIS
         *   bool  Transmit()
         *   RAPDU Transmit(CAPDU capdu)
         *   bool  Transmit(CAPDU capdu, out RAPDU rapdu)
         *   void  Transmit(CAPDU capdu, TransmitDoneCallback callback)
         *
         * DESCRIPTION
         *   Sends a command APDU (CAPDU) to the connected card, and retrieves its response APDU (RAPDU)
         *
         * SOURCE
         *
         *   SCardChannel card = new SCardChannel( ... reader ... );
         *   if (!card.Connect( SCARD.PROTOCOL_T0|SCARD.PROTOCOL_T1 ))
         *   {
         *     // handle error
         *   }
         *
         *
         *   // Example 1
         *   // ---------
         *
         *   card.Command = new CAPDU("00 A4 00 00 02 3F 00");
         *   if (!card.Transmit())
         *   {
         *     // handle error
         *   }
         *   MessageBox.Show("Card answered: " + card.Response.AsString(" "));
         *
         *
         *   // Example 2
         *   // ---------
         *
         *   RAPDU response = card.Transmit(new CAPDU("00 A4 00 00 02 3F 00")))
         *   if (response == null)
         *   {
         *     // handle error
         *   }
         *   MessageBox.Show("Card answered: " + response.AsString(" "));
         *
         *
         *   // Example 3
         *   // ---------
         *
         *   CAPDU command  = new CAPDU("00 A4 00 00 02 3F 00");
         *   RAPDU response = new RAPDU();
         *   if (!card.Transmit(command, out response))
         *   {
         *     // handle error
         *   }
         *   MessageBox.Show("Card answered: " + response.AsString(" "));
         *
         *
         *   // Example 4
         *   // ---------
         *
         *   // In this example the Transmit is performed by a background thread
         *   // We supply a delegate so the main class (window/form) will be notified
         *   // when Transmit will return
         *
         *   delegate void OnTransmitDoneInvoker(RAPDU response);
         *
         *   void OnTransmitDone(RAPDU response)
         *   {
         *     // Ensure we're back in the context of the main thread (application's message pump)
         *     if (this.InvokeRequired)
         *     {
         *       this.BeginInvoke(new OnTransmitDoneInvoker(OnTransmitDone), response);
         *       return;
         *     }
         *
         *     if (response == null)
         *     {
         *       // handle error
         *     }
         *
         *     MessageBox.Show("Card answered: " + response.AsString(" "));
         *   }
         *
         *  card.Transmit(new CAPDU("00 A4 00 00 02 3F 00"), new SCardChannel.TransmitDoneCallback(OnTransmitDone));
         *
         *
         * SEE ALSO
         *   SCardChannel.Connect
         *   SCardChannel.Transmit
         *   SCardChannel.Command
         *   SCardChannel.Response
         *
         **/
        #region Transmit
        public virtual bool Transmit()
        {
            uint rsp_length = 32 * 1024;

            byte[] rsp_buffer = new byte[rsp_length];
            uint   rc;
            IntPtr SendPci = IntPtr.Zero;

            switch (_active_protocol)
            {
            case SCARD.PROTOCOL_T0:
                SendPci = SCARD.PCI_T0();
                break;

            case SCARD.PROTOCOL_T1:
                SendPci = SCARD.PCI_T1();
                break;

            case SCARD.PROTOCOL_RAW:
                SendPci = SCARD.PCI_RAW();
                break;

            default:
                break;
            }

            _rapdu = null;

            Trace.WriteLine("Transmit << " + _capdu.AsString());

            rc = SCARD.Transmit(_hCard,
                                SendPci,
                                _capdu.GetBytes(),
                                (uint)_capdu.Length,
                                IntPtr.Zero,             /* RecvPci is likely to remain NULL */
                                rsp_buffer,
                                ref rsp_length);

            if (rc != SCARD.S_SUCCESS)
            {
                Trace.WriteLine("Transmit : " + rc);
                _last_error = rc;
                return(false);
            }

            _rapdu = new RAPDU(rsp_buffer, (int)rsp_length);

            Trace.WriteLine("Transmit >> " + _rapdu.AsString());

            return(true);
        }