/* Ċ Ġ* ĠContext . kt Ċ Ġ* ĠInterface Ġfor ĠSC ARD CONTEXT ĠPC / SC Ġoperations Ċ Ġ* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 - 2 0 2 1 ĠMichael ĠFar re ll Ġ< m ico lo us + git @ gmail . com > Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġau . id . m ico lo us . kotlin . pc sc Ċ Ċ import Ġkotlinx . coroutines .* Ċ Ċ /** Ċ Ġ* ĠMain Ġinterface Ġfor ĠPC / SC ĠAPI Ġoperations Ġ(` SC ARD CONTEXT `). Ċ Ġ* Ċ Ġ* Ġ@ see ĠContext . est ablish Ċ Ġ*/ Ċ expect Ġclass ĠContext Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRelease s Ġthe Ġgiven Ġcontext , Ġand Ġrenders Ġit Ġun usable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠE quivalent Ġto ĊĠĠĠĠ Ġ* Ġ[ SC ard Release Context ]( https :// docs . microsoft . com / en - us / windows / win 3 2 / api / win sc ard / nf - win sc ard - sc ard release context ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrelease () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġ` true ` Ġif Ġthis Ġclass Ġrepresents Ġa Ġvalid Ġcontext . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠE quivalent Ġto ĊĠĠĠĠ Ġ* Ġ[ SC ard IsValid Context ]( https :// docs . microsoft . com / en - us / windows / win 3 2 / api / win sc ard / nf - win sc ard - sc ard is valid context ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠisValid () Ġ: ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTermin ates Ġall Ġoutstanding Ġactions Ġwithin Ġthis Ġ[ Context ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠE quivalent Ġto ĊĠĠĠĠ Ġ* Ġ[ SC ard Cancel ]( https :// docs . microsoft . com / en - us / windows / win 3 2 / api / win sc ard / nf - win sc ard - sc ard cancel ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠPC SC Error ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcancel () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLists Ġall Ġreaders Ġavailable Ġin Ġthis Ġ[ Context ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠE quivalent Ġto ĊĠĠĠĠ Ġ* Ġ[ SC ard List Read ers ]( https :// docs . microsoft . com / en - us / windows / win 3 2 / api / win sc ard / nf - win sc ard - sc ard list readers a ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġgroups ĠIf Ġspecified , Ġa Ġlist Ġof Ġgroup Ġnames Ġto Ġsearch Ġwithin . ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ List ] Ġof Ġreader Ġnames , Ġas Ġ[ String ], Ġwhich Ġcan Ġbe Ġused Ġwith Ġ[ connect ]. ĊĠĠĠĠ Ġ* ĠIf Ġthere Ġare Ġno Ġreaders Ġavailable , Ġreturns Ġan Ġempty Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġlist Read ers ( groups : ĠList < String >? Ġ= Ġnull ) Ġ: ĠList < String > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConnect s Ġto Ġa Ġgiven Ġreader . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠE quivalent Ġto ĊĠĠĠĠ Ġ* Ġ[ SC ard Connect ]( https :// docs . microsoft . com / en - us / windows / win 3 2 / api / win sc ard / nf - win sc ard - sc ard connect a ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġreader ĠReader Ġname Ġfrom Ġ[ list Read ers ] ĊĠĠĠĠ Ġ* Ġ@ param Ġshare Mode ĠFlag Ġto Ġindicate Ġif Ġother Ġapplications Ġmay Ġform Ġconnections Ġto Ġthe Ġcard ĊĠĠĠĠ Ġ* Ġ@ param Ġpreferred Prot cols ĠA Ġset Ġof Ġprotocols Ġto Ġuse Ġwhen Ġcommunic ating . ĊĠĠĠĠ Ġ* ĠIf Ġ` null `, Ġthen Ġno Ġprotocol Ġneg otiation Ġwill Ġtake Ġplace . ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ Card ] Ġobject Ġto Ġcommunicate Ġwith Ġthe Ġcard . ĠThe Ġprotocol Ġin Ġuse Ġis ĊĠĠĠĠ Ġ* Ġaval iable Ġas Ġ[ Card . protocol ] ĊĠĠĠĠ Ġ* Ġ@ throws ĠPC SC Error ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġconnect ( reader : ĠString , Ġshare Mode : ĠShare Mode , Ġpreferred Prot cols : ĠSet < Protocol > ?) Ġ: ĠCard ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW aits Ġfor Ġstatus Ġchanges Ġin Ġthe Ġgiven Ġlist Ġof Ġreaders . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠE quivalent Ġto ĊĠĠĠĠ Ġ* Ġ[ SC ard Get Status Change ]( https :// docs . microsoft . com / en - us / windows / win 3 2 / api / win sc ard / nf - win sc ard - sc ard get status change a ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout ĠNumber Ġof Ġseconds Ġto Ġwait . ĠTo Ġwait Ġfor Ġa Ġlong Ġtime , Ġuse Ġ[ LONG _ TIMEOUT ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun ĠgetStatus Change ( timeout : ĠInt , Ġreaders : ĠList < Reader State >) Ġ: ĠList < Reader State > ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠEst abl ishes Ġa Ġnew ĠPC / SC Ġcontext . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠE quivalent Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ SC ard Est ablish Context ]( https :// docs . microsoft . com / en - us / windows / win 3 2 / api / win sc ard / nf - win sc ard - sc ar dest ablish context ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġscope ĠScope Ġto Ġuse . ĠDefaults Ġto Ġ[ Scope . User ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġ[ Context ] Ġfor Ġworking Ġwith ĠPC / SC ĠAPI ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ throws ĠPC SC Error ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġestablish ( scope : ĠScope Ġ= ĠScope . User ) Ġ: ĠContext ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġ@ see Ġ[ Context . connect ] Ċ Ġ* Ġ@ param Ġpreferred Protocol ĠSingle Ġpreferred Ġprotocol Ġto Ġuse . Ċ Ġ* ĠIf Ġnot Ġspecified , Ġdefaults Ġto Ġ[ Protocol . Any ]. Ċ Ġ*/ Ċ fun ĠContext . connect ( reader : ĠString , Ġshare Mode : ĠShare Mode , Ġpreferred Protocol : ĠProtocol Ġ= ĠProtocol . Any ) Ġ: ĠCard ĊĠĠĠĠĠĠĠ Ġ= Ġconnect ( reader , Ġshare Mode , Ġset Of ( preferred Protocol )) Ċ Ċ /** Ċ Ġ* ĠW aits Ġfor Ġstatus Ġchanges Ġin Ġa Ġsingle Ġreader . Ċ Ġ* Ċ Ġ* ĠE quivalent Ġto Ċ Ġ* Ġ[ SC ard Get Status Change ]( https :// docs . microsoft . com / en - us / windows / win 3 2 / api / win sc ard / nf - win sc ard - sc ard get status change a ). Ċ Ġ* Ċ Ġ* Ġ@ param Ġtimeout ĠNumber Ġof Ġseconds Ġto Ġwait . ĠTo Ġwait Ġfor Ġa Ġlong Ġtime , Ġuse Ġ[ LONG _ TIMEOUT ]. Ċ Ġ*/ Ċ suspend Ġfun ĠContext . getStatus Change ( timeout : ĠInt , Ġreader : ĠReader State ) ĊĠĠĠ Ġ= ĠgetStatus Change ( timeout , ĠlistOf ( reader )). first () Ċ Ċ /** Ċ Ġ* ĠGets Ġthe Ġcurrent Ġstate Ġof Ġthe Ġgiven Ġreaders , Ġand Ġreturns Ġimmediately . Ċ Ġ* Ċ Ġ* ĠE quivalent Ġto Ġ` SC ard Get Status Change ( dw Timeout Ġ= Ġ 0 , Ġ...) `. Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ Context . getStatus Change ] Ċ Ġ*/ Ċ fun ĠContext . getStatus ( readers : ĠList < String >) Ġ: ĠList < Reader State > Ġ= Ġrun Blocking Ġ{ ĊĠĠĠ ĠgetStatus Change ( 0 , Ġreaders . map Ġ{ ĠReader State ( it ) Ġ}) Ċ } Ċ Ċ /** Ċ Ġ* ĠGets Ġthe Ġcurrent Ġstate Ġof Ġa Ġsingle Ġreader , Ġand Ġreturns Ġimmediately . Ċ Ġ* Ċ Ġ* ĠE quivalent Ġto Ġ` SC ard Get Status Change ( dw Timeout Ġ= Ġ 0 , Ġ...) `. Ċ Ġ* Ċ Ġ* Ġ@ see Ġ[ Context . getStatus Change ] Ċ Ġ*/ Ċ fun ĠContext . getStatus ( reader : ĠString ): ĠReader State ĊĠĠĠĠĠĠĠ Ġ= ĠgetStatus ( listOf ( reader )). first () Ċ Ċ /** Ċ Ġ* ĠGets Ġthe Ġstatus Ġof Ġall Ġconnected Ġreaders . Ċ Ġ* Ċ Ġ* Ġ@ param Ġgroups ĠIf Ġspecified , Ġa Ġlist Ġof Ġgroup Ġnames Ġto Ġsearch Ġwithin . Ċ Ġ* Ġ@ returns Ġ[ List ] Ġof Ġall Ġconnected Ġreaders Ċ Ġ* Ġ@ see Ġ[ Context . getStatus ], Ġ[ Context . list Read ers ] Ċ Ġ*/ Ċ fun ĠContext . getAll Reader Status ( groups : ĠList < String >? Ġ= Ġnull ): ĠList < Reader State > ĊĠĠĠĠĠĠĠ Ġ= Ġlist Read ers ( groups ). take Unless Ġ{ Ġit . isEmpty () Ġ} ?. let (:: getStatus ). or Empty () Ċ