Открыть боковую панель
Aurora OS
Demos
NFC Use Cases
Коммиты
b5215de3
Коммит
b5215de3
создал
Мар 03, 2025
по автору
OMP Education
Просмотр файлов
Output information if there are several readers
владелец
7028331c
Изменения
2
Скрыть пробелы
Построчно
Рядом
submodules/pcschandler/src/pcschandler.cpp
Просмотр файла @
b5215de3
...
...
@@ -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_
reader
s
State
[
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_
reader
s
State
[
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
)
{
...
...
submodules/pcschandler/src/pcschandler_p.h
Просмотр файла @
b5215de3
...
...
@@ -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.
Сначала завершите редактирование этого сообщения!
Отмена
Пожалуйста,
зарегистрируйтесь
или
войдите
чтобы прокомментировать