+
     h  c                   s   R t ^ RIt^ RIHtHt ^ RIHt ^ RIt^ RI	H
t
Ht ^ RI5  ! R R]4      t ! R R	]
4      t]! ]R4        ! R
 R]4      t]R8X  dq   ]! R4        ! R R]4      t ! R R]4      t]! ^4      t]! ^4      t]P/                  4        ]P/                  4        ]P1                  4        ]P1                  4        R# R# )aQ  Smart card reader monitoring classes.

ReaderObserver is a base class for objects that are to be notified
upon smartcard reader insertion/removal.

ReaderMonitor is a singleton object notifying registered ReaderObservers
upon reader insertion/removal.

__author__ = "https://www.gemalto.com/"

Copyright 2001-2012 gemalto
Author: Jean-Daniel Aussel, mailto:jean-daniel.aussel@gemalto.com

This file is part of pyscard.

pyscard is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.

pyscard is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with pyscard; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
N)EventThread)sleep)
ObservableObserver)Z*c                   s0   a  ] tR t^)t o RtR tR tRtV tR# )ReaderObserverzv
ReaderObserver is a base abstract class for objects that are to be notified
upon smartcard reader insertion/removal.
c                s    R # N self   &A/usr/lib64/python3.14/site-packages/smartcard/ReaderMonitoring.py__init__ZReaderObserver.__init__/   s        c                s    R# )zCalled upon reader insertion/removal.

@param observable:
@param handlers:
  - addedreaders: list of added readers causing notification
  - removedreaders: list of removed readers causing notification
Nr   )r	   
observablehandlerss   &&&r   updateZReaderObserver.update2   s     	r   r   N)	__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes____classdictcell__Z__classdict__   @r   r   r   )   s     
 r   r   c                   sr   a  ] tR t^=t o Rt/ tR]P                  P                  ^3R lt	R t
R tR tRtV tR# )	ReaderMonitora  Class that monitors reader insertion/removal.
and notify observers

note: a reader monitoring thread will be running
as long as the reader monitor has observers, or ReaderMonitor.stop()
is called.

It implements the shared state design pattern, where objects
of the same type all share the same state, in our case essentially
the ReaderMonitoring Thread. Thanks to Frank Aune for implementing
the shared state pattern logics.
Tc                s,   V P                   V n        \        P                  ! V 4       Wn        W n        W0n        V P                  '       d
   R V n        R # \        W P
                  V P                  4      V n        V P                  P                  4        R # r   )
_ReaderMonitor__shared_state__dict__r   r   startOnDemand
readerProcperiodrmthreadReaderMonitoringThreadstart)r	   r   r   r      &&&&r   r   ZReaderMonitor.__init__M   sh     ++D!*$ DM24$++VDMMM!r   c                s   \         P                  ! W4       V P                  '       d}   ^ V P                  4       8  df   V P                  '       gR   \        W P                  V P                  4      V n        ^ RIpVP                  V P                  P                  R4       R# R# R# VP                  W P                  P                  . 34       R# )zAdd an observer.Nr   )r   addObserverr   countObserversr    r!   r   r   _threadZstart_new_threadr"   r   readers)r	   observerr&   s   && r   r$   ZReaderMonitor.addObserver[   s    t. 4&&((}}}$:oot{{%DM #,,T]]-@-@"E % ) OOD==#8#8""=>r   c                s    \         P                  ! W4       V P                  '       d=   ^ V P                  4       8X  d&   V P                  P                  4        V =RV n        R# R# R# )zRemove an observer.N)r   deleteObserverr   r%   r    stop)r	   r(      &&r   r)   ZReaderMonitor.deleteObserverr   sU    !!$1 D''))""$M $ * r   c                s.    V P                   P                  # r   )Z	__class__r   r   r
   r   __str__ZReaderMonitor.__str__}   s    ~~&&&r   )r   r   r   r    r   N)r   r   r   r   r   r   	smartcardZSystemr'   r   r$   r)   r,   r   r   r   r   r   r   r   =   s?      N !Y-=-=-E-Ea"?.	%' 'r   r   c                   s:   a  ] tR t^t o Rt/ tR tR tR tRt	V t
R# )r!   z|Reader insertion thread.
This thread polls for pcsc reader insertion, since no
reader insertion event is available in pcsc.
c                s    V P                   V n        \        P                  ! V 4       Wn        \        4       V n        V P                  P                  4        . V n        R V n	        RV n
        W n        W0n        R# )Tz smartcard.ReaderMonitoringThreadN)%_ReaderMonitoringThread__shared_stater   r   r   r   r    	stopEventZclearr'   daemonnamer   r   )r	   r   r   r   r#   r   r   ZReaderMonitoringThread.__init__   sX    ++$6	$r   c                s6   V P                   P                  4       '       Eg6    ^ V P                  P                  4       8  d   V P	                  4       p. p. pWP
                  8w  d   V F&  pW@P
                  9  g   K  VP                  V4       K(  	  V P
                   F  pWA9  g   K  VP                  V4       K  	  V'       g	   V'       db   . V n        V F  pV P
                  P                  V4       K   	  V P                  P                  4        V P                  P                  W#34       V P                   P                  V P                  4       EKV  R#   \         d5    \        P                  ! 4        T P                   P                  4         EK  i ; i)zXRuns until stopEvent is notified, and notify
observers of all reader insertion/removal.
N)r/   Zis_setr   r%   r   r'   ZappendZ
setChangedZnotifyObserversZwaitr   Z	Exception	tracebackZ	print_excset)r	   ZcurrentReadersZaddedReadersZremovedReadersZreaderZrs   &     r   runZReaderMonitoringThread.run   s8    ..''))#%t5577%)__%6N#%L%'N%5&4F%\\9 , 3 3F ; '5 '+llF%; . 5 5f = '3 (>+-DL%3 $ 3 3A 6 &4 OO668 OO;;!- >
 ##DKK07 *:  %##%
 ""$$%s+   AE ='E )E E BE :FFc                sZ    V P                   P                  4        V P                  4        R # r   )r/   r3   joinr   r
   r   r*   ZReaderMonitoringThread.stop   s    		r   )r   r0   r1   r   r   r   r'   r/   N)r   r   r   r   r   r.   r   r4   r*   r   r   r   r   r   r!   r!      s&     
 N
(%T r   r!   Z__main__z/insert or remove readers in the next 20 secondsc                   s,   a  ] tR t^t o R tR tRtV tR# )printobserverc                s    Wn         R # r   obsindexr	   r8   r+   r   r   Zprintobserver.__init__   s    $Mr   c                s    Vw  r4\        R V P                  ,          V4       \        RV P                  ,          V4       R# )z%d - added:   z%d - removed: N)printr8   )r	   r   r   ZaddedreadersZremovedreaderss   &&&  r   r   Zprintobserver.update   s2    +3(L"T]]2LA"T]]2NCr   r7   N)r   r   r   r   r   r   r   r   r   r   r   r6   r6      s     	%	D 	Dr   r6   c                   s,   a  ] tR t^t o R tR tRtV tR# )
testthreadc                sj    \         P                  ! V 4       \        4       V n        Wn        R V n        R # r   )r   r   r   readermonitorr8   r(   r9   r+   r   r   Ztestthread.__init__   s$    OOD!!.D$M DMr   c                s    \        V P                  4      V n        V P                  P	                  V P                  4       \        ^4       V P                  P                  V P                  4       R# )i   N)r6   r8   r(   r<   r$   r   r)   r   r
   r   r4   Ztestthread.run   sI    )$--8DM**4==9"I--dmm<r   )r(   r8   r<   N)r   r   r   r   r   r4   r   r   r   r   r   r;   r;      s     	!	= 	=r   r;   z\addObserver deleteObserver deleteObservers setChanged clearChanged hasChanged countObservers)r   r2   Z	threadingr    r   Ztimer   Zsmartcard.Systemr-   Zsmartcard.Observerr   r   Zsmartcard.Synchronizationr   r   Zsynchronizer!   r   r:   r6   r;   Zt1Zt2r"   r5   r   r   r   <module>r=      s   <  #   3 'X (A'J A'H @V @F z	
;<D D=V = 
AB	ABHHJHHJGGIGGIE r   