2 * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include "SEService.h"
25 #include "APDUHelper.h"
27 using namespace smartcard_service_api;
29 typedef struct _user_context_t
31 Session *clientSession;
32 SEServiceHelper *clientService;
33 Channel *clientChannel;
38 GMainLoop *loop = NULL;
39 user_context_t user_context = { 0, };
41 void testCloseCallback(int error, void *userData);
42 void testTransmitCallback(unsigned char *buffer, unsigned int length, int error, void *userData);
43 void testOpenChannelCallback(Channel *channel, int error, void *userData);
44 void testGetATRCallback(unsigned char *atr, unsigned int length, int error, void *userData);
45 void testCloseSessionCallback(int error, void *userData);
46 void testOpenSessionCallback(SessionHelper *session, int error, void *userData);
47 void testConnectedCallback(SEServiceHelper *service, void *context);
49 class TestEventHandler : public SEServiceListener
51 void serviceConnected(SEServiceHelper *service, void *userData)
54 testConnectedCallback(service, userData);
58 void eventHandler(SEServiceHelper *service, char *seName, int event, void *userData)
60 // user_context_t *context = (user_context_t *)userData;
61 vector<ReaderHelper *> readers;
66 SCARD_DEBUG("event occured service [%p], seName[%s], event [%d], userData [%p]", service, seName, event, userData);
68 readers = service->getReaders();
70 for (i = 0; i < readers.size(); i++)
72 SCARD_DEBUG("Reader[%d] : name [%s], %s", i, readers[i]->getName(), readers[i]->isSecureElementPresent() ? "available" : "unavailable");
77 testConnectedCallback(service, userData);
83 void errorHandler(SEServiceHelper *service, int error, void *userData)
87 SCARD_DEBUG("error occured service [%p], error [%d]", service, error);
93 TestEventHandler testEventHandler;
95 void testCloseCallback(int error, void *userData)
97 user_context_t *context = (user_context_t *)userData;
99 SCARD_DEBUG("result [%d], userData [%p]", error, userData);
101 context->clientService->shutdown();
104 void testTransmitCallback(unsigned char *buffer, unsigned int length, int error, void *userData)
106 ByteArray response(buffer, length);
107 user_context_t *context = (user_context_t *)userData;
109 SCARD_DEBUG("buffer [%p], length [%d], error [%d], userData [%p]", buffer, length, error, userData);
111 context->clientChannel->close(testCloseCallback, userData);
114 void testOpenChannelCallback(Channel *channel, int error, void *userData)
116 SCARD_DEBUG("channel [%p]", channel);
118 if (error == 0 && channel != NULL)
121 ByteArray data, command;
122 int fid = 0x00003150;
123 user_context_t *context = (user_context_t *)userData;
125 context->clientChannel = channel;
127 response = channel->getSelectResponse();
129 SCARD_DEBUG("response : %s", response.toString());
131 SCARD_DEBUG("isBasicChannel() = %s", channel->isBasicChannel() ? "Basic" : "Logical");
132 SCARD_DEBUG("isClosed() = %s", channel->isClosed() ? "Closed" : "Opened");
134 data.setBuffer((unsigned char *)&fid, 2);
135 command = APDUHelper::generateAPDU(APDUHelper::COMMAND_SELECT_BY_ID, 0, data);
136 context->clientChannel->transmit(command, testTransmitCallback, userData);
140 SCARD_DEBUG_ERR("openBasicChannel failed");
144 void testGetATRCallback(unsigned char *atr, unsigned int length, int error, void *userData)
146 // unsigned char MF[] = { 0x3F, 0x00 };
147 unsigned char MF[] = { 0xA0, 0x00, 0x00, 0x00, 0x63, 0x50, 0x4B, 0x43, 0x53, 0x2D, 0x31, 0x35 };
148 ByteArray aid, result(atr, length);
149 user_context_t *context = (user_context_t *)userData;
151 SCARD_DEBUG("atr[%d] : %s", result.getLength(), result.toString());
153 aid.setBuffer(MF, sizeof(MF));
154 context->clientSession->openLogicalChannel(aid, testOpenChannelCallback, userData);
157 void testCloseSessionCallback(int error, void *userData)
162 void testOpenSessionCallback(SessionHelper *session, int error, void *userData)
164 SCARD_DEBUG("session [%p]", session);
168 user_context_t *context = (user_context_t *)userData;
170 context->clientSession = (Session *)session;
171 context->clientSession->getATR(testGetATRCallback, userData);
175 SCARD_DEBUG_ERR("openSession failed");
179 void testConnectedCallback(SEServiceHelper *service, void *userData)
181 vector<ReaderHelper *> readers;
182 user_context_t *context = (user_context_t *)userData;
188 SCARD_DEBUG("callback called, service [%p]", service);
190 context->clientService = service;
192 readers = service->getReaders();
194 if (readers.size() > 0)
196 Reader *reader = NULL;
198 reader = (Reader *)readers[0];
200 SCARD_DEBUG("reader [%p]", reader);
202 reader->openSession(testOpenSessionCallback, userData);
206 SCARD_DEBUG_ERR("reader is empty");
211 SCARD_DEBUG_ERR("service is NULL");
217 int main(int argv, char *args[])
219 SEService *service = new SEService((void *)&user_context, &testEventHandler);
221 loop = g_main_new(TRUE);
222 g_main_loop_run(loop);