simcard communication python class
diff --git a/usb_application/ccid_raw.py b/usb_application/ccid_raw.py
index e9b1fba..b12ba35 100755
--- a/usb_application/ccid_raw.py
+++ b/usb_application/ccid_raw.py
@@ -3,101 +3,81 @@
 from smartcard.scard import *
 import smartcard.util
 
-CMD_SEL_ROOT = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x3F, 0x00]
-CMD_SEL_FILE = [0xA0, 0xA4, 0x00, 0x00, 0x02, 0x7F, 0x20]
-CMD_GET_DATA = [0xA0, 0xC0, 0x00, 0x00, 0x16]
-# SuperSIM ATR
-atr_supersim= [0x3B, 0x9A, 0x94, 0x00, 0x92, 0x02, 0x75, 0x93, 0x11, 0x00, 0x01, 0x02, 0x02, 0x19]
+import array
 
-# Faster sysmocom SIM
-ATR_SYSMOCOM1 = [0x3B, 0x99, 0x18, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60]
-ATR_SYSMOCOM2 = [0x3B, 0x99, 0x11, 0x00, 0x11, 0x88, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x60]
-NEW_ATR = ATR_SYSMOCOM2
+class SmartcardException(Exception):
+    pass
 
-def pattern_match(inpt):
-    if (inpt == ATR_SYSMOCOM1):
-        return NEW_ATR
-    elif (inpt == CMD_SEL_FILE):
-        return CMD_SEL_ROOT 
-    else:
-        return inpt        
+class SmartcardConnection:
+#    hcard, dwActiveProtocol, hcontext, reader
 
-def connect_to_card(hcontext, reader):
-    hresult, hcard, dwActiveProtocol = SCardConnect(hcontext, reader,
-        SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
-    if hresult != SCARD_S_SUCCESS:
-        raise Exception('Unable to connect: ' +
-            SCardGetErrorMessage(hresult))
-    print 'Connected with active protocol', dwActiveProtocol
-    return hresult, hcard, dwActiveProtocol
- 
-def establish_context(): 
-    hresult, hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
-    if hresult != SCARD_S_SUCCESS:
-        raise Exception('Failed to establish context : ' +
-            SCardGetErrorMessage(hresult))
-    print 'Context established!'
+    def __init__(self):
+        self.establish_context()
+        self.connect_card()
 
-    hresult, readers = SCardListReaders(hcontext, [])
-    if hresult != SCARD_S_SUCCESS:
-        raise Exception('Failed to list readers: ' +
-            SCardGetErrorMessage(hresult))
-    print 'PCSC Readers:', readers
-
-    if len(readers) < 1:
-        raise Exception('No smart card readers')
-
-    reader = readers[0]
-    print "Using reader:", reader
-    
-    return (hcontext, reader)
-
-
-def release_context(hcontext):
-    hresult = SCardReleaseContext(hcontext)
-    if hresult != SCARD_S_SUCCESS:
-        raise Exception('Failed to release context: ' +
+    def connect_card(self):
+        hresult, self.hcard, self.dwActiveProtocol = SCardConnect(self.hcontext, self.reader,
+            SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1)
+        if hresult != SCARD_S_SUCCESS:
+            raise SmartcardException('Unable to connect: ' +
                 SCardGetErrorMessage(hresult))
-    print 'Released context.'
+        print 'Connected with active protocol', self.dwActiveProtocol
 
-def send_receive_cmd(cmd, hcard, dwActiveProtocol):
-    print("Response: ")
-    new_cmd = pattern_match(cmd)
-    print(' '.join([hex(i) for i in cmd]))
-    hresult, response = SCardTransmit(hcard, dwActiveProtocol,
-        new_cmd)
-    if hresult != SCARD_S_SUCCESS:
-        raise Exception('Failed to transmit: ' +
-            SCardGetErrorMessage(hresult))
-    resp = pattern_match(response)
-    print 'Ans: ' + smartcard.util.toHexString(resp,
-        smartcard.util.HEX)
-    return response
+    def establish_context(self):
+        hresult, self.hcontext = SCardEstablishContext(SCARD_SCOPE_USER)
+        if hresult != SCARD_S_SUCCESS:
+            raise SmartcardException('Failed to establish context : ' +
+                SCardGetErrorMessage(hresult))
+        print 'Context established!'
 
-def disconnect_card(hcard):
-    hresult = SCardDisconnect(hcard, SCARD_UNPOWER_CARD)
-    if hresult != SCARD_S_SUCCESS:
-        raise Exception('Failed to disconnect: ' +
-            SCardGetErrorMessage(hresult))
-    print 'Disconnected'
+        hresult, readers = SCardListReaders(self.hcontext, [])
+        if hresult != SCARD_S_SUCCESS:
+            raise SmartcardException('Failed to list readers: ' +
+                SCardGetErrorMessage(hresult))
+        print 'PCSC Readers:', readers
+
+        if len(readers) < 1:
+            raise SmartcardException('No smart card readers')
+
+        self.reader = readers[0]
+        print "Using reader:", self.reader
+
+    def release_context(self):
+        hresult = SCardReleaseContext(self.hcontext)
+        if hresult != SCARD_S_SUCCESS:
+            raise SmartcardException('Failed to release context: ' +
+                    SCardGetErrorMessage(hresult))
+        print 'Released context.'
+
+    def send_receive_cmd(self, cmd):
+        print("Cmd: ")
+        hresult, resp = SCardTransmit(self.hcard, self.dwActiveProtocol,
+            cmd.tolist())
+        if hresult != SCARD_S_SUCCESS:
+            raise SmartcardException('Failed to transmit: ' +
+                SCardGetErrorMessage(hresult))
+        print 'Ans: ' + smartcard.util.toHexString(resp,
+            smartcard.util.HEX)
+        return array.array('B', resp)
+
+    def disconnect_card(self):
+        hresult = SCardDisconnect(self.hcard, SCARD_UNPOWER_CARD)
+        if hresult != SCARD_S_SUCCESS:
+            raise SmartcardException('Failed to disconnect: ' +
+                SCardGetErrorMessage(hresult))
+        print 'Disconnected'
 
 
-def do_intercept(cmd, dwActiveProtocol):
-    return send_receive_cmd(cmd, hcard, dwActiveProtocol)
-
-def ccid_raw_init():
-    (hcontext, reader) = establish_context()
-    hresult, hcard, dwActiveProtocol = connect_to_card(hcontext, reader)
-    return hcard, hcontext, dwActiveProtocol
-    
-def ccid_raw_exit(hcard, hcontext):
-    disconnect_card(hcard)
-    release_context(hcontext)
+    def close(self):
+        self.disconnect_card()
+        self.release_context()
 
 
 if __name__ == '__main__':
-    hcard, hcontext, dwActiveProtocol = ccid_raw_init()
-    do_intercept(CMD_SEL_ROOT, dwActiveProtocol)
-    do_intercept(CMD_SEL_FILE, dwActiveProtocol)
-    do_intercept(CMD_GET_DATA, dwActiveProtocol)
-    ccid_raw_exit()
+    import constants
+
+    sm_con = SmartcardConnection()
+    print(sm_con.send_receive_cmd(constants.CMD_SEL_ROOT))
+    print(sm_con.send_receive_cmd(constants.CMD_SEL_FILE))
+    print(sm_con.send_receive_cmd(constants.CMD_GET_DATA))
+    sm_con.close()