update the latest source
[platform/core/connectivity/smartcard-service.git] / test-client / test-client.cpp
1 /*
2 * Copyright (c) 2012 Samsung Electronics Co., Ltd All Rights Reserved
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18 #include <stdio.h>
19 #include <string.h>
20 #include <glib.h>
21
22 #include "Debug.h"
23 #include "SEService.h"
24 #include "Reader.h"
25 #include "Session.h"
26 #include "APDUHelper.h"
27
28 using namespace smartcard_service_api;
29
30 typedef struct _user_context_t
31 {
32         Session *clientSession;
33         SEServiceHelper *clientService;
34         Channel *clientChannel;
35 }
36 user_context_t;
37
38 /* global variable */
39 GMainLoop *loop = NULL;
40 user_context_t user_context = { 0, };
41
42 void testCloseCallback(int error, void *userData);
43 void testTransmitCallback(unsigned char *buffer, unsigned int length, int error, void *userData);
44 void testOpenChannelCallback(Channel *channel, int error, void *userData);
45 void testGetATRCallback(unsigned char *atr, unsigned int length, int error, void *userData);
46 void testCloseSessionCallback(int error, void *userData);
47 void testOpenSessionCallback(SessionHelper *session, int error, void *userData);
48 void testConnectedCallback(SEServiceHelper *service, void *context);
49
50 class TestEventHandler : public SEServiceListener
51 {
52         void serviceConnected(SEServiceHelper *service, void *userData)
53         {
54                 SCARD_BEGIN();
55                 testConnectedCallback(service, userData);
56                 SCARD_END();
57         }
58
59         void eventHandler(SEServiceHelper *service, char *seName, int event, void *userData)
60         {
61                 SCARD_BEGIN();
62
63                 SCARD_DEBUG("event occured service [%p], seName[%p], event [%d]", service, seName, event);
64
65                 SCARD_END();
66         }
67
68         void errorHandler(SEServiceHelper *service, int error, void *userData)
69         {
70                 SCARD_BEGIN();
71
72                 SCARD_DEBUG("error occured service [%p], error [%d]", service, error);
73
74                 SCARD_END();
75         }
76 };
77
78 TestEventHandler testEventHandler;
79
80 void testCloseCallback(int error, void *userData)
81 {
82         user_context_t *context = (user_context_t *)userData;
83
84         SCARD_DEBUG("result [%d], userData [%p]", error, userData);
85
86         context->clientService->shutdown();
87 }
88
89 void testTransmitCallback(unsigned char *buffer, unsigned int length, int error, void *userData)
90 {
91         ByteArray response(buffer, length);
92         user_context_t *context = (user_context_t *)userData;
93
94         SCARD_DEBUG("buffer [%p], length [%d], error [%d], userData [%p]", buffer, length, error, userData);
95
96         context->clientChannel->close(testCloseCallback, userData);
97 }
98
99 void testOpenChannelCallback(Channel *channel, int error, void *userData)
100 {
101         SCARD_DEBUG("channel [%p]", channel);
102
103         if (error == 0 && channel != NULL)
104         {
105                 ByteArray response;
106                 ByteArray data, command;
107                 int fid = 0x00003150;
108                 user_context_t *context = (user_context_t *)userData;
109
110                 context->clientChannel = channel;
111
112                 response = channel->getSelectResponse();
113
114                 SCARD_DEBUG("response : %s", response.toString());
115
116                 SCARD_DEBUG("isBasicChannel() = %s", channel->isBasicChannel() ? "Basic" : "Logical");
117                 SCARD_DEBUG("isClosed() = %s", channel->isClosed() ? "Closed" : "Opened");
118
119                 data.setBuffer((unsigned char *)&fid, 2);
120                 command = APDUHelper::generateAPDU(APDUHelper::COMMAND_SELECT_BY_ID, 0, data);
121                 context->clientChannel->transmit(command, testTransmitCallback, userData);
122         }
123         else
124         {
125                 SCARD_DEBUG_ERR("openBasicChannel failed");
126         }
127 }
128
129 void testGetATRCallback(unsigned char *atr, unsigned int length, int error, void *userData)
130 {
131 //      unsigned char MF[] = { 0x3F, 0x00 };
132         unsigned char MF[] = { 0xA0, 0x00, 0x00, 0x00, 0x63, 0x50, 0x4B, 0x43, 0x53, 0x2D, 0x31, 0x35 };
133         ByteArray aid, result(atr, length);
134         user_context_t *context = (user_context_t *)userData;
135
136         SCARD_DEBUG("atr[%d] : %s", result.getLength(), result.toString());
137
138         aid.setBuffer(MF, sizeof(MF));
139         context->clientSession->openLogicalChannel(aid, testOpenChannelCallback, userData);
140 }
141
142 void testCloseSessionCallback(int error, void *userData)
143 {
144
145 }
146
147 void testOpenSessionCallback(SessionHelper *session, int error, void *userData)
148 {
149         SCARD_DEBUG("session [%p]", session);
150
151         if (session != NULL)
152         {
153                 user_context_t *context = (user_context_t *)userData;
154
155                 context->clientSession = (Session *)session;
156                 context->clientSession->getATR(testGetATRCallback, userData);
157         }
158         else
159         {
160                 SCARD_DEBUG_ERR("openSession failed");
161         }
162 }
163
164 void testConnectedCallback(SEServiceHelper *service, void *userData)
165 {
166         vector<ReaderHelper *> readers;
167         user_context_t *context = (user_context_t *)userData;
168
169         SCARD_BEGIN();
170
171         if (service != NULL)
172         {
173                 SCARD_DEBUG("callback called, service [%p]", service);
174
175                 context->clientService = service;
176
177                 readers = service->getReaders();
178
179                 if (readers.size() > 0)
180                 {
181                         Reader *reader = NULL;
182
183                         reader = (Reader *)readers[0];
184
185                         SCARD_DEBUG("reader [%p]", reader);
186
187                         reader->openSession(testOpenSessionCallback, userData);
188                 }
189                 else
190                 {
191                         SCARD_DEBUG_ERR("reader is empty");
192                 }
193         }
194         else
195         {
196                 SCARD_DEBUG_ERR("service is NULL");
197         }
198
199         SCARD_END();
200 }
201
202 int main(int argv, char *args[])
203 {
204         SEService *service = new SEService((void *)&user_context, &testEventHandler);
205
206         loop = g_main_new(TRUE);
207         g_main_loop_run(loop);
208
209         if (service != NULL)
210                 delete service;
211
212         return 0;
213 }