Коммит b5215de3 создал по автору OMP Education's avatar OMP Education
Просмотр файлов

Output information if there are several readers

владелец 7028331c
......@@ -86,14 +86,14 @@ void PcscHandlerPrivate::_initialize()
}
if (QFile::exists(dir.absoluteFilePath(fileNameOld))
&& fileNameDateOld.compare(fileNameDateNew) != 0)
&& fileNameDateOld.compare(fileNameDateNew) != 0)
QFile::remove(dir.absoluteFilePath(fileNameOld));
if (QFile::exists(dir.absoluteFilePath(fileNameNew)))
_parseAttributes(dir.absoluteFilePath(fileNameNew));
else
m_manager->get(QNetworkRequest(QStringLiteral(
"http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt")));
"http://ludovic.rousseau.free.fr/softwares/pcsc-tools/smartcard_list.txt")));
LONG rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, nullptr, nullptr, &m_sCardContext);
if (rv != SCARD_S_SUCCESS) {
......@@ -175,44 +175,53 @@ void PcscHandlerPrivate::_detectReaders()
void PcscHandlerPrivate::_detectEvents()
{
SCARD_READERSTATE readerState = { 0 };
readerState.szReader = (LPCTSTR)m_readers.first();
readerState.dwCurrentState = SCARD_STATE_UNAWARE;
readerState.dwEventState = SCARD_STATE_UNKNOWN;
QVector<SCARD_READERSTATE> m_readersState(m_readers.count(), {0});
LONG rv = SCardGetStatusChange(m_sCardContext, INFINITE, &readerState, 1);
bool firstAttempt = true;
for(int i = 0; i < m_readers.count(); ++i) {
m_readersState[i].szReader = (LPCTSTR)m_readers[i];
m_readersState[i].dwCurrentState = SCARD_STATE_UNAWARE;
m_readersState[i].dwEventState = SCARD_STATE_UNKNOWN;
SCardGetStatusChange(m_sCardContext, INFINITE, &m_readersState[i], i);
}
bool firstAttempt = true;
int readerIndex = 0;
while (m_working) {
if ((readerState.dwEventState & SCARD_STATE_EMPTY) == SCARD_STATE_EMPTY) {
if ((m_readersState[readerIndex].dwEventState & SCARD_STATE_EMPTY) == SCARD_STATE_EMPTY) {
if (firstAttempt)
firstAttempt = false;
else
_processDisconnect();
} else if ((readerState.dwEventState & SCARD_STATE_PRESENT) == SCARD_STATE_PRESENT) {
_processConnect();
} else if ((m_readersState[readerIndex].dwEventState & SCARD_STATE_PRESENT) == SCARD_STATE_PRESENT) {
_processConnect(readerIndex);
}
bool needContinue = false;
do {
readerState.dwCurrentState = readerState.dwEventState;
rv = SCardGetStatusChange(m_sCardContext, 50, &readerState, 1);
DWORD stateMask = ~(SCARD_STATE_INUSE | SCARD_STATE_EXCLUSIVE | SCARD_STATE_UNAWARE
| SCARD_STATE_IGNORE | SCARD_STATE_CHANGED);
DWORD stateNew = readerState.dwEventState & stateMask;
DWORD stateOld = readerState.dwCurrentState & stateMask;
if (stateNew != stateOld)
needContinue = true;
for(readerIndex = 0; readerIndex < m_readersState.count() - 1; ++readerIndex) {
m_readersState[readerIndex].dwCurrentState = m_readersState[readerIndex].dwEventState;
SCardGetStatusChange(m_sCardContext, 50, &m_readersState[readerIndex], readerIndex);
DWORD stateMask = ~(SCARD_STATE_INUSE | SCARD_STATE_EXCLUSIVE | SCARD_STATE_UNAWARE
| SCARD_STATE_IGNORE | SCARD_STATE_CHANGED);
DWORD stateNew = m_readersState[readerIndex].dwEventState & stateMask;
DWORD stateOld = m_readersState[readerIndex].dwCurrentState & stateMask;
if (stateNew != stateOld){
needContinue = true;
break;
}
}
} while (!needContinue && m_working);
}
}
void PcscHandlerPrivate::_processConnect()
void PcscHandlerPrivate::_processConnect(int readerIndex)
{
SCARDHANDLE hCard = 0;
DWORD dwActiveProtocol = -1;
LONG rv = SCardConnect(m_sCardContext, (LPCTSTR)m_readers.first(), SCARD_SHARE_SHARED,
LONG rv = SCardConnect(m_sCardContext, (LPCTSTR)m_readers[readerIndex], SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCard, &dwActiveProtocol);
if (rv != SCARD_S_SUCCESS)
return;
......@@ -275,8 +284,8 @@ void PcscHandlerPrivate::_updateChecksum()
quint16 lastAtrByte = 0;
for (DWORD i = 0; i < m_sCardStatusData->dwAtrLen; ++i) {
sum = i > 0 ? m_sCardStatusData->pbAtr[m_sCardStatusData->dwAtrLen]
^ quint16(m_sCardStatusData->pbAtr[i])
: 0;
^ quint16(m_sCardStatusData->pbAtr[i])
: 0;
lastAtrByte = quint8(m_sCardStatusData->pbAtr[i]);
}
checksum =
......@@ -308,9 +317,9 @@ void PcscHandlerPrivate::_updateState()
if ((m_sCardStatusData->dwState & SCARD_NEGOTIABLE) == SCARD_NEGOTIABLE)
states << QStringLiteral("negotiable");
state = QStringLiteral("0x%1 (%2)")
.arg(QString::number(static_cast<quint32>(m_sCardStatusData->dwState), 16)
.toUpper())
.arg(states.join(QStringLiteral(" | ")));
.arg(QString::number(static_cast<quint32>(m_sCardStatusData->dwState), 16)
.toUpper())
.arg(states.join(QStringLiteral(" | ")));
}
if (m_state != state) {
......
......@@ -49,7 +49,7 @@ private slots:
void _parseAttributes(const QString &filePath);
void _detectReaders();
void _detectEvents();
void _processConnect();
void _processConnect(int readerIndex);
void _processDisconnect();
void _updateAttribute();
void _updateChecksum();
......
Поддерживает Markdown
0% или .
You are about to add 0 people to the discussion. Proceed with caution.
Сначала завершите редактирование этого сообщения!
Пожалуйста, зарегистрируйтесь или чтобы прокомментировать