Advertisement
Guest User

CardBase.cs

a guest
Aug 22nd, 2010
451
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.33 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Threading;
  5.  
  6. namespace GemCard
  7. {
  8.     /// <summary>
  9.     /// Values for AttrId of SCardGetAttrib
  10.     /// </summary>
  11.     public class SCARD_ATTR_VALUE
  12.     {
  13.         private const uint
  14.             SCARD_CLASS_COMMUNICATIONS = 2,
  15.             SCARD_CLASS_PROTOCOL = 3,
  16.             SCARD_CLASS_MECHANICAL = 6,
  17.             SCARD_CLASS_VENDOR_DEFINED = 7,
  18.             SCARD_CLASS_IFD_PROTOCOL = 8,
  19.             SCARD_CLASS_ICC_STATE = 9,
  20.             SCARD_CLASS_SYSTEM = 0x7fff;
  21.  
  22.         private static UInt32 SCardAttrValue(UInt32 attrClass, UInt32 val)
  23.         {
  24.             return (attrClass << 16) | val;
  25.         }
  26.  
  27.         public static UInt32 CHANNEL_ID { get { return SCardAttrValue(SCARD_CLASS_COMMUNICATIONS, 0x0110); } }
  28.  
  29.         public static UInt32 CHARACTERISTICS { get { return SCardAttrValue(SCARD_CLASS_MECHANICAL, 0x0150); } }
  30.  
  31.         public static UInt32 CURRENT_PROTOCOL_TYPE { get { return SCardAttrValue(SCARD_CLASS_IFD_PROTOCOL, 0x0201); } }
  32.  
  33.         public static UInt32 DEVICE_UNIT { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0001); } }
  34.         public static UInt32 DEVICE_FRIENDLY_NAME { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0003); } }
  35.         public UInt32 DEVICE_SYSTEM_NAME { get { return SCardAttrValue(SCARD_CLASS_SYSTEM, 0x0004); } }
  36.  
  37.         public static UInt32 ICC_PRESENCE { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0300); } }
  38.         public static UInt32 ICC_INTERFACE_STATUS { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0301); } }
  39.         public static UInt32 ATR_STRING { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0303); } }
  40.         public static UInt32 ICC_TYPE_PER_ATR { get { return SCardAttrValue(SCARD_CLASS_ICC_STATE, 0x0304); } }
  41.  
  42.         public static UInt32 PROTOCOL_TYPES { get { return SCardAttrValue(SCARD_CLASS_PROTOCOL, 0x0120); } }
  43.  
  44.         public static UInt32 VENDOR_NAME { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0100); } }
  45.         public static UInt32 VENDOR_IFD_TYPE { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0101); } }
  46.         public static UInt32 VENDOR_IFD_VERSION { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0102); } }
  47.         public static UInt32 VENDOR_IFD_SERIAL_NO { get { return SCardAttrValue(SCARD_CLASS_VENDOR_DEFINED, 0x0103); } }
  48.     }
  49.  
  50.     /// <summary>
  51.     /// Delegate for the CardInserted event
  52.     /// </summary>
  53.     public delegate void CardInsertedEventHandler(string reader);
  54.  
  55.     /// <summary>
  56.     /// Delegate for the CardRemoved event
  57.     /// </summary>
  58.     public delegate void CardRemovedEventHandler(string reader);
  59.  
  60.     /// <summary>
  61.     /// Abstract class that adds a basic event management to the ICard interface.
  62.     /// </summary>
  63.     abstract public class CardBase : ICard
  64.     {
  65.         protected const uint INFINITE = 0xFFFFFFFF;
  66.         protected const uint WAIT_TIME = 250;
  67.  
  68.         protected bool m_bRunCardDetection = true;
  69.         protected Thread m_thread = null;
  70.  
  71.         /// <summary>
  72.         /// Event handler for the card insertion
  73.         /// </summary>
  74.         public event CardInsertedEventHandler OnCardInserted = null;
  75.  
  76.         /// <summary>
  77.         /// Event handler for the card removal
  78.         /// </summary>
  79.         public event CardRemovedEventHandler OnCardRemoved = null;
  80.  
  81.         ~CardBase()
  82.         {
  83.             // Stop any eventual card detection thread
  84.             StopCardEvents();
  85.         }
  86.  
  87.         #region Abstract method that implement the ICard interface
  88.         abstract public string[] ListReaders();
  89.         abstract public void Connect(string Reader, SHARE ShareMode, PROTOCOL PreferredProtocols);
  90.         abstract public void Disconnect(DISCONNECT Disposition);
  91.         abstract public APDUResponse Transmit(APDUCommand ApduCmd);
  92.         abstract public void BeginTransaction();
  93.         abstract public void EndTransaction(DISCONNECT Disposition);
  94.         abstract public byte[] GetAttribute(UInt32 AttribId);
  95.         #endregion
  96.  
  97.         /// <summary>
  98.         /// This method should start a thread that checks for card insertion or removal
  99.         /// </summary>
  100.         /// <param name="Reader"></param>
  101.         public void StartCardEvents(string Reader)
  102.         {
  103.             if (m_thread == null)
  104.             {
  105.                 m_bRunCardDetection = true;
  106.  
  107.                 m_thread = new Thread(new ParameterizedThreadStart(RunCardDetection));
  108.                 m_thread.Start(Reader);
  109.             }
  110.         }
  111.  
  112.         /// <summary>
  113.         /// Stops the card events thread
  114.         /// </summary>
  115.         public void StopCardEvents()
  116.         {
  117.             if (m_thread != null)
  118.             {
  119.                 int
  120.                     nTimeOut = 10,
  121.                     nCount = 0;
  122.                 bool m_bStop = false;
  123.                 m_bRunCardDetection = false;
  124.  
  125.                 do
  126.                 {
  127.                     if (nCount > nTimeOut)
  128.                     {
  129.                         m_thread.Abort();
  130.                         break;
  131.                     }
  132.  
  133.                     if (m_thread.ThreadState == ThreadState.Aborted)
  134.                         m_bStop = true;
  135.  
  136.                     if (m_thread.ThreadState == ThreadState.Stopped)
  137.                         m_bStop = true;
  138.  
  139.                     Thread.Sleep(200);
  140.                     ++nCount;           // Manage time out
  141.                 }
  142.                 while (!m_bStop);
  143.  
  144.                 m_thread = null;
  145.             }
  146.         }
  147.  
  148.         /// <summary>
  149.         /// This function must implement a card detection mechanism.
  150.         ///
  151.         /// When card insertion is detected, it must call the method CardInserted()
  152.         /// When card removal is detected, it must call the method CardRemoved()
  153.         ///
  154.         /// </summary>
  155.         /// <param name="Reader">Name of the reader to scan for card event</param>
  156.         abstract protected void RunCardDetection(object Reader);
  157.  
  158.         #region Event methods
  159.         protected void CardInserted(string reader)
  160.         {
  161.             if (OnCardInserted != null)
  162.                 OnCardInserted(reader);
  163.         }
  164.  
  165.         protected void CardRemoved(string reader)
  166.         {
  167.             if (OnCardRemoved != null)
  168.                 OnCardRemoved(reader);
  169.         }
  170.         #endregion
  171.     }
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement