return result;
}
- unsigned int ServerResource::createSession(int socket, unsigned int context, unsigned int terminalID, vector<ByteArray> &certHashes, void *caller)
+ Terminal *ServerResource::getTerminalByReaderID(unsigned int readerID)
+ {
+ Terminal *result = NULL;
+ map<unsigned int, unsigned int>::iterator item;
+
+ if ((item = mapReaders.find(readerID)) != mapReaders.end())
+ {
+ result = getTerminal(item->second);
+ }
+ else
+ {
+ SCARD_DEBUG_ERR("Terminal doesn't exist, reader ID [%d]", readerID);
+ }
+
+ return result;
+ }
+
+ unsigned int ServerResource::getTerminalID(const char *name)
+ {
+ unsigned int result = IntegerHandle::INVALID_HANDLE;
+ map<unsigned int, Terminal *>::iterator item;
+
+ for (item = mapTerminals.begin(); item != mapTerminals.end(); item++)
+ {
+ if (strncmp(name, item->second->getName(), strlen(name)) == 0)
+ {
+ result = item->first;
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ unsigned int ServerResource::createSession(int socket, unsigned int context, unsigned int readerID, vector<ByteArray> &certHashes, void *caller)
{
unsigned int result = -1;
Terminal *temp = NULL;
if ((instance = getService(socket, context)) != NULL)
{
- if ((temp = getTerminal(terminalID)) != NULL)
+ if ((temp = getTerminalByReaderID(readerID)) != NULL)
{
result = instance->openSession(temp, certHashes, caller);
}
SCARD_DEBUG("register success [%s] [%p] [%s] [%p]", library, libHandle, terminal->getName(), terminal);
+ if (terminal->isSecureElementPresence() == true)
+ {
+ createReader(handle);
+ }
+
result = true;
}
else
bool ServerResource::isValidReaderHandle(unsigned int reader)
{
- return (getTerminal(reader) != NULL);
+ return (getTerminalByReaderID(reader) != NULL);
}
bool ServerResource::isValidSessionHandle(int socket, unsigned int context, unsigned int session)
{
ServiceInstance *instance = NULL;
- return (((instance = getService(socket, context)) != NULL) && (getService(socket, context)->isVaildSessionHandle(session)));
+ return (((instance = getService(socket, context)) != NULL) && (instance->isVaildSessionHandle(session)));
}
int ServerResource::getReadersInformation(ByteArray &info)
unsigned int offset = 0;
unsigned int nameLen = 0;
- if (mapTerminals.size() > 0)
+ if (mapReaders.size() > 0)
{
- map<unsigned int, Terminal *>::iterator item;
+ Terminal *terminal = NULL;
+ map<unsigned int, unsigned int>::iterator item;
- for (item = mapTerminals.begin(); item != mapTerminals.end(); item++)
+ for (item = mapReaders.begin(); item != mapReaders.end(); item++)
{
- if (item->second->isSecureElementPresence())
+ if (item->second != IntegerHandle::INVALID_HANDLE)
{
- length += sizeof(nameLen) + strlen(item->second->getName()) + sizeof(unsigned int);
- result++;
+ terminal = getTerminal(item->second);
+ if (terminal != NULL)
+ {
+ if (terminal->isSecureElementPresence())
+ {
+ length += sizeof(nameLen) + strlen(terminal->getName()) + sizeof(unsigned int);
+ result++;
+ }
+ }
}
}
{
memset(buffer, 0, length);
- for (item = mapTerminals.begin(); item != mapTerminals.end(); item++)
+ for (item = mapReaders.begin(); item != mapReaders.end(); item++)
{
- if (item->second->isSecureElementPresence())
+ if (item->second != IntegerHandle::INVALID_HANDLE)
{
- nameLen = strlen(item->second->getName());
-
- memcpy(buffer + offset, &nameLen, sizeof(nameLen));
- offset += sizeof(nameLen);
-
- memcpy(buffer + offset, item->second->getName(), nameLen);
- offset += nameLen;
-
- memcpy(buffer + offset, &item->first, sizeof(unsigned int));
- offset += sizeof(unsigned int);
+ terminal = getTerminal(item->second);
+ if (terminal != NULL)
+ {
+ if (terminal->isSecureElementPresence())
+ {
+ nameLen = strlen(terminal->getName());
+
+ memcpy(buffer + offset, &nameLen, sizeof(nameLen));
+ offset += sizeof(nameLen);
+
+ memcpy(buffer + offset, terminal->getName(), nameLen);
+ offset += nameLen;
+
+ memcpy(buffer + offset, &item->first, sizeof(unsigned int));
+ offset += sizeof(unsigned int);
+ }
+ }
}
}
void ServerResource::terminalCallback(void *terminal, int event, int error, void *user_param)
{
- SCARD_BEGIN();
+ SCARD_DEBUG("terminal [%s], event [%d], error [%d], user_param [%p]", (char *)terminal, event, error, user_param);
switch (event)
{
case Terminal::NOTIFY_SE_AVAILABLE :
{
+ ServerResource &instance = ServerResource::getInstance();
+ unsigned int terminalID = IntegerHandle::INVALID_HANDLE;
Message msg;
SCARD_DEBUG("[NOTIFY_SE_AVAILABLE]");
- SCARD_DEBUG("terminal [%s], error [%d], user_param [%p]", (char *)terminal, error, user_param);
- /* send all client to refresh reader */
- msg.message = msg.MSG_NOTIFY_SE_INSERTED;
- msg.data.setBuffer((unsigned char *)terminal, strlen((char *)terminal) + 1);
+ terminalID = instance.getTerminalID((char *)terminal);
+ if (terminalID != IntegerHandle::INVALID_HANDLE)
+ {
+ /* send all client to refresh reader */
+ msg.message = msg.MSG_NOTIFY_SE_INSERTED;
+ msg.param1 = instance.createReader(terminalID);
+ msg.data.setBuffer((unsigned char *)terminal, strlen((char *)terminal) + 1);
- ServerResource::getInstance().sendMessageToAllClients(msg);
+ instance.sendMessageToAllClients(msg);
+ }
}
break;
case Terminal::NOTIFY_SE_NOT_AVAILABLE :
{
+ ServerResource &instance = ServerResource::getInstance();
+ unsigned int readerID = IntegerHandle::INVALID_HANDLE;
Message msg;
SCARD_DEBUG("[NOTIFY_SE_NOT_AVAILABLE]");
- SCARD_DEBUG("terminal [%s], error [%d], user_param [%p]", (char *)terminal, error, user_param);
+
+ readerID = instance.getReaderID((char *)terminal);
/* send all client to refresh reader */
msg.message = msg.MSG_NOTIFY_SE_REMOVED;
+ msg.param1 = readerID;
msg.data.setBuffer((unsigned char *)terminal, strlen((char *)terminal) + 1);
- ServerResource::getInstance().sendMessageToAllClients(msg);
+ instance.sendMessageToAllClients(msg);
+ instance.removeReader(readerID);
}
break;
SCARD_DEBUG("terminal [%s], event [%d], error [%d], user_param [%p]", (char *)terminal, event, error, user_param);
break;
}
+ }
- SCARD_END();
+ unsigned int ServerResource::createReader(unsigned int terminalID)
+ {
+ unsigned int result = -1;
+
+ result = IntegerHandle::assignHandle();
+
+ mapReaders.insert(make_pair(result, terminalID));
+
+ return result;
+ }
+
+ unsigned int ServerResource::getReaderID(const char *name)
+ {
+ unsigned int result = IntegerHandle::INVALID_HANDLE, terminalID = IntegerHandle::INVALID_HANDLE;
+
+ terminalID = getTerminalID(name);
+ if (terminalID != IntegerHandle::INVALID_HANDLE)
+ {
+ map<unsigned int, unsigned int>::iterator item;
+
+ for (item = mapReaders.begin(); item != mapReaders.end(); item++)
+ {
+ if (item->second == terminalID)
+ {
+ result = item->first;
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+
+ void ServerResource::removeReader(unsigned int readerID)
+ {
+ map<unsigned int, unsigned int>::iterator item;
+
+ if ((item = mapReaders.find(readerID)) != mapReaders.end())
+ {
+ item->second = IntegerHandle::INVALID_HANDLE;
+ }
}
} /* namespace smartcard_service_api */