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.
17 /* standard library header */
21 /* SLP library header */
25 #include "ServerDispatcher.h"
26 #include "ServerResource.h"
27 #include "ServerSEService.h"
28 #include "ServerChannel.h"
29 #include "ServerSession.h"
30 #include "ServerReader.h"
32 namespace smartcard_service_api
34 ServerDispatcher::ServerDispatcher():DispatcherHelper()
38 runDispatcherThread();
43 ServerDispatcher::~ServerDispatcher()
47 ServerDispatcher *ServerDispatcher::getInstance()
49 static ServerDispatcher instance;
54 void *ServerDispatcher::dispatcherThreadFunc(DispatcherMsg *msg, void *data)
57 ServerResource *resource = NULL;
61 SCARD_DEBUG_ERR("dispatcher instance is null");
67 SCARD_DEBUG_ERR("message is null");
71 resource = &ServerResource::getInstance();
72 socket = msg->getPeerSocket();
77 case Message::MSG_REQUEST_READERS :
79 SCARD_DEBUG("[MSG_REQUEST_READERS]");
82 seService->dispatcherCallback(msg, msg->getPeerSocket());
85 Message response(*msg);
87 ClientInstance *instance = NULL;
89 resource->loadSecureElements();
91 if ((instance = resource->getClient(socket)) != NULL)
93 /* update client PID */
94 if (instance->getPID() == -1)
96 instance->setPID(msg->error);
97 SCARD_DEBUG_ERR("update PID [%d]", msg->error);
99 /* generate certification hashes */
100 instance->generateCertificationHashes();
104 if (resource->getService(socket, (unsigned long)msg->userParam) == NULL)
106 if (resource->createService(socket, (unsigned long)msg->userParam) == true)
108 SCARD_DEBUG_ERR("client added : context [%d]", (unsigned long)msg->userParam);
112 SCARD_DEBUG_ERR("createClient failed");
117 /* response to client */
118 ServerIPC::getInstance()->sendMessage(socket, &response);
124 if ((count = resource->getReadersInformation(info)) > 0)
126 response.param1 = count;
129 response.data = info;
133 SCARD_DEBUG("no secure elements");
140 SCARD_DEBUG("client doesn't exist, socket [%d]", socket);
145 /* response to client */
146 ServerIPC::getInstance()->sendMessage(socket, &response);
151 case Message::MSG_REQUEST_SHUTDOWN :
154 Message response(*msg);
156 SCARD_DEBUG("[MSG_REQUEST_SHUTDOWN]");
158 if (msg->param1 != 0)
160 ServerChannel *channel = NULL;
162 channel = (ServerChannel *)msg->param1;
164 channel->closeSync();
167 /* response to client */
168 ServerIPC::getInstance()->sendMessage(msg->getPeerSocket(), &response);
172 Message response(*msg);
174 SCARD_DEBUG("[MSG_REQUEST_SHUTDOWN]");
178 resource->removeService(socket, msg->error/* service context */);
180 /* response to client */
181 ServerIPC::getInstance()->sendMessage(socket, &response);
186 case Message::MSG_REQUEST_OPEN_SESSION :
189 Message response(*msg);
190 ServerReader *reader = NULL;
191 ServerSession *session = NULL;
193 SCARD_DEBUG("[MSG_REQUEST_OPEN_SESSION]");
195 if (msg->param1 != 0)
197 reader = (ServerReader *)msg->param1;
199 session = reader->openSessionSync(msg->data, msg->caller);
202 /* TODO : attach atr??? */
203 response.param1 = (unsigned int)session;
205 /* response to client */
206 ServerIPC::getInstance()->sendMessage(msg->getPeerSocket(), &response);
210 Message response(*msg);
211 unsigned int handle = -1;
213 SCARD_DEBUG("[MSG_REQUEST_OPEN_SESSION]");
215 response.param1 = -1;
218 if (resource->isValidReaderHandle(msg->param1))
221 vector<ByteArray> temp;
222 handle = resource->createSession(socket, msg->error/* service context */, msg->param1, temp, msg->caller);
224 handle = resource->createSession(socket, msg->error/* service context */, msg->param1, msg->data, msg->caller);
226 if (handle != IntegerHandle::INVALID_HANDLE)
228 response.param1 = handle;
233 SCARD_DEBUG_ERR("createSession failed [%d]", handle);
238 SCARD_DEBUG_ERR("request invalid reader handle [%d]", msg->param1);
241 /* response to client */
242 ServerIPC::getInstance()->sendMessage(socket, &response);
247 case Message::MSG_REQUEST_CLOSE_SESSION :
250 Message response(*msg);
251 ServerSession *session = NULL;
253 SCARD_DEBUG("[MSG_REQUEST_CLOSE_SESSION]");
255 if (msg->param1 != 0)
257 session = (ServerSession *)msg->param1;
259 session->closeSync();
262 /* response to client */
263 ServerIPC::getInstance()->sendMessage(msg->getPeerSocket(), &response);
267 Message response(*msg);
269 SCARD_DEBUG("[MSG_REQUEST_CLOSE_SESSION]");
271 response.param1 = -1;
274 if (resource->isValidSessionHandle(socket, msg->error/* service context */, msg->param1))
276 resource->removeSession(socket, msg->error/* service context */, msg->param1);
279 /* response to client */
280 ServerIPC::getInstance()->sendMessage(socket, &response);
285 case Message::MSG_REQUEST_OPEN_CHANNEL :
288 Message response(*msg);
289 ServerSession *session = NULL;
291 SCARD_DEBUG("[MSG_REQUEST_OPEN_CHANNEL]");
293 if (/* check valid session handle */msg->param2 != 0)
295 ServerChannel *channel = NULL;
297 session = (ServerSession *)msg->param2;
299 if (msg->param1 == 0)
300 channel = (ServerChannel *)session->openBasicChannelSync(msg->data, msg->caller);
302 channel = (ServerChannel *)session->openLogicalChannelSync(msg->data, msg->caller);
306 response.param1 = (unsigned int)channel;
307 response.param2 = channel->getChannelID();
309 response.data = channel->getSelectResponse();
313 SCARD_DEBUG_ERR("channel is null.");
315 /* set error value */
319 response.data.releaseBuffer();
324 SCARD_DEBUG_ERR("session is invalid");
329 response.data.releaseBuffer();
332 /* response to client */
333 ServerIPC::getInstance()->sendMessage(msg->getPeerSocket(), &response);
337 Message response(*msg);
338 unsigned int channelID = -1;
340 SCARD_DEBUG("[MSG_REQUEST_OPEN_CHANNEL]");
345 response.data.releaseBuffer();
347 channelID = resource->createChannel(socket, msg->error/* service context */, msg->param2, msg->param1, msg->data);
348 if (channelID != IntegerHandle::INVALID_HANDLE)
350 ServerChannel *temp = (ServerChannel *)resource->getChannel(socket, msg->error/* service context */, channelID);
354 response.param1 = channelID;
355 response.param2 = temp->getChannelNumber();
357 response.data = temp->getSelectResponse();
361 SCARD_DEBUG_ERR("IS IT POSSIBLE??????????????????");
366 SCARD_DEBUG_ERR("channel is null.");
368 /* set error value */
372 /* response to client */
373 ServerIPC::getInstance()->sendMessage(socket, &response);
378 case Message::MSG_REQUEST_GET_CHANNEL_COUNT :
380 Message response(*msg);
382 SCARD_DEBUG("[MSG_REQUEST_GET_CHANNEL_COUNT]");
386 response.param1 = resource->getChannelCount(socket, msg->error/* service context */, msg->param1);
388 /* response to client */
389 ServerIPC::getInstance()->sendMessage(socket, &response);
393 case Message::MSG_REQUEST_CLOSE_CHANNEL :
396 Message response(*msg);
398 SCARD_DEBUG("[MSG_REQUEST_CLOSE_CHANNEL]");
400 if (msg->param1 != 0)
402 ServerChannel *channel = NULL;
404 channel = (ServerChannel *)msg->param1;
406 channel->closeSync();
409 /* response to client */
410 ServerIPC::getInstance()->sendMessage(msg->getPeerSocket(), &response);
414 Message response(*msg);
416 SCARD_DEBUG("[MSG_REQUEST_CLOSE_CHANNEL]");
420 if (resource->getChannel(socket, msg->error/* service context */, msg->param1) != NULL)
422 resource->removeChannel(socket, msg->error/* service context */, msg->param1);
425 /* response to client */
426 ServerIPC::getInstance()->sendMessage(socket, &response);
431 case Message::MSG_REQUEST_GET_ATR :
434 Message response(*msg);
436 SCARD_DEBUG("[MSG_REQUEST_GET_ATR]");
438 if (msg->param1 != 0)
440 ServerChannel *channel = NULL;
442 channel = (ServerChannel *)msg->param1;
444 channel->closeSync();
447 /* response to client */
448 ServerIPC::getInstance()->sendMessage(msg->getPeerSocket(), &response);
453 Message response(*msg);
455 ServiceInstance *client = NULL;
457 SCARD_DEBUG("[MSG_REQUEST_GET_ATR]");
463 if ((client = resource->getService(socket, msg->error/* service context */)) != NULL)
465 Terminal *terminal = NULL;
467 if ((terminal = client->getTerminal(msg->param1)) != NULL)
469 if ((rv = terminal->getATRSync(result)) == 0)
471 response.data = result;
476 SCARD_DEBUG_ERR("transmit failed [%d]", rv);
483 SCARD_DEBUG_ERR("getTerminal failed : socket [%d], context [%d], session [%d]", socket, msg->error/* service context */, msg->param1);
488 SCARD_DEBUG_ERR("getClient failed : socket [%d], context [%d], session [%d]", socket, msg->error/* service context */, msg->param1);
491 /* response to client */
492 ServerIPC::getInstance()->sendMessage(socket, &response);
497 case Message::MSG_REQUEST_TRANSMIT :
500 Message response(*msg);
504 SCARD_DEBUG("[MSG_REQUEST_TRANSMIT]");
506 if (msg->param1 != 0)
508 ServerChannel *channel = NULL;
510 channel = (ServerChannel *)msg->param1;
512 if ((rv = channel->transmitSync(msg->data, result)) == 0)
514 response.data = result;
518 SCARD_DEBUG_ERR("transmit failed [%d]", rv);
522 // if (resource->isValidChannelHandle((void *)msg->param1))
526 /* response to client */
527 ServerIPC::getInstance()->sendMessage(msg->getPeerSocket(), &response);
532 Message response(*msg);
534 Channel *channel = NULL;
536 SCARD_DEBUG("[MSG_REQUEST_TRANSMIT]");
542 if ((channel = resource->getChannel(socket, msg->error/* service context */, msg->param1)) != NULL)
544 if ((rv = channel->transmitSync(msg->data, result)) == 0)
546 response.data = result;
551 SCARD_DEBUG_ERR("transmit failed [%d]", rv);
558 SCARD_DEBUG_ERR("invalid handle : socket [%d], context [%d], channel [%d]", socket, msg->error/* service context */, msg->param1);
561 /* response to client */
562 ServerIPC::getInstance()->sendMessage(socket, &response);
567 case Message::MSG_OPERATION_RELEASE_CLIENT :
570 Message response(*msg);
572 SCARD_DEBUG("[MSG_REQUEST_CLOSE_CHANNEL]");
574 if (msg->param1 != 0)
576 ServerChannel *channel = NULL;
578 channel = (ServerChannel *)msg->param1;
580 channel->closeSync();
583 /* response to client */
584 ServerIPC::getInstance()->sendMessage(msg->getPeerSocket(), &response);
588 SCARD_DEBUG("[MSG_OPERATION_RELEASE_CLIENT]");
590 resource->removeClient(msg->param1);
591 SCARD_DEBUG("remain client [%d]", resource->getClientCount());
595 if (resource->getClientCount() == 0)
597 SCARD_DEBUG("There is no client. shutting down service");
598 g_main_loop_quit((GMainLoop *)resource->getMainLoopInstance());
604 SCARD_DEBUG("unknown message [%s], socket [%d]", msg->toString(), socket);
611 } /* namespace smartcard_service_api */