/* Ċ Ġ* ĠP _ File Open . kt Ċ Ġ* ĠCopyright ĠÂ© Ġ 1 9 9 3 - 2 0 2 0 , ĠThe ĠAv ail ĠFoundation , ĠLLC . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠRedistribution Ġand Ġuse Ġin Ġsource Ġand Ġbinary Ġforms , Ġwith Ġor Ġwithout Ċ Ġ* Ġmodification , Ġare Ġpermitted Ġprovided Ġthat Ġthe Ġfollowing Ġconditions Ġare Ġmet : Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġof Ġsource Ġcode Ġmust Ġretain Ġthe Ġabove Ġcopyright Ġnotice , Ġthis Ċ Ġ* ĠĠ Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer . Ċ Ġ* Ċ Ġ* Ġ* ĠRedistributions Ġin Ġbinary Ġform Ġmust Ġreproduce Ġthe Ġabove Ġcopyright Ġnotice , Ċ Ġ* ĠĠ Ġthis Ġlist Ġof Ġconditions Ġand Ġthe Ġfollowing Ġdisclaimer Ġin Ġthe Ġdocumentation Ċ Ġ* ĠĠ Ġand / or Ġother Ġmaterials Ġprovided Ġwith Ġthe Ġdistribution . Ċ Ġ* Ċ Ġ* Ġ* ĠNeither Ġthe Ġname Ġof Ġthe Ġcopyright Ġholder Ġnor Ġthe Ġnames Ġof Ġthe Ġcontributors Ċ Ġ* ĠĠ Ġmay Ġbe Ġused Ġto Ġendorse Ġor Ġpromote Ġproducts Ġderived Ġfrom Ġthis Ġsoftware Ċ Ġ* ĠĠ Ġwithout Ġspecific Ġprior Ġwritten Ġpermission . Ċ Ġ* Ċ Ġ* ĠTHIS ĠSOFTWARE ĠIS ĠPROVIDED ĠBY ĠTHE ĠCOPYRIGHT ĠHOLDERS ĠAND ĠCONTRIBUTORS Ġ" AS ĠIS " Ċ Ġ* ĠAND ĠANY ĠEXPRESS ĠOR ĠIMPLIED ĠWARRANTIES , ĠINCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠTHE Ċ Ġ* ĠIMPLIED ĠWARRANTIES ĠOF ĠMERCHANTABILITY ĠAND ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE Ċ Ġ* ĠARE ĠDISCLAIMED . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠCOPYRIGHT ĠHOLDER ĠOR ĠCONTRIBUTORS ĠBE Ċ Ġ* ĠLIABLE ĠFOR ĠANY ĠDIRECT , ĠINDIRECT , ĠINCIDENTAL , ĠSPECIAL , ĠEXEMPLARY , ĠOR Ċ Ġ* ĠCONSEQUENTIAL ĠDAMAGES Ġ( INCLUDING , ĠBUT ĠNOT ĠLIMITED ĠTO , ĠPROCUREMENT ĠOF Ċ Ġ* ĠSUBSTITUTE ĠGOODS ĠOR ĠSERVICES ; ĠLOSS ĠOF ĠUSE , ĠDATA , ĠOR ĠPROFITS ; ĠOR ĠBUSINESS Ċ Ġ* ĠINTERRUPTION ) ĠHOWEVER ĠCAUSED ĠAND ĠON ĠANY ĠTHEORY ĠOF ĠLIABILITY , ĠWHETHER ĠIN Ċ Ġ* ĠCONTRACT , ĠSTRICT ĠLIABILITY , ĠOR ĠTORT Ġ( INCLUDING ĠNEGLIGENCE ĠOR ĠOTHERWISE ) Ċ Ġ* ĠARISING ĠIN ĠANY ĠWAY ĠOUT ĠOF ĠTHE ĠUSE ĠOF ĠTHIS ĠSOFTWARE , ĠEVEN ĠIF ĠADVISED ĠOF ĠTHE Ċ Ġ* ĠPOSSIBILITY ĠOF ĠSUCH ĠDAMAGE . Ċ Ġ*/ Ċ package Ġcom . avail . interpreter . primitive . files Ċ Ċ import Ġcom . avail . Avail Runtime . Companion . current Runtime Ċ import Ġcom . avail . descriptor . atoms . A _ Atom . Companion . set Atom Property Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor . Companion . create Atom Ċ import Ġcom . avail . descriptor . atoms . Atom Descriptor . Special Atom . FILE _ KEY Ċ import Ġcom . avail . descriptor . numbers . A _ Number . Companion . extract Int Ċ import Ġcom . avail . descriptor . po jos . Raw Po jo Descriptor . Companion . identity Po jo Ċ import Ġcom . avail . descriptor . representation . Nil Descriptor . Companion . nil Ċ import Ġcom . avail . descriptor . sets . A _ Set Ċ import Ġcom . avail . descriptor . sets . Set Descriptor Ċ import Ġcom . avail . descriptor . sets . Set Descriptor . Companion . set Ċ import Ġcom . avail . descriptor . tuples . Object Tuple Descriptor . Companion . tuple Ċ import Ġcom . avail . descriptor . types . A _ Type Ċ import Ġcom . avail . descriptor . types . Abstract Enumeration TypeDescriptor . Companion . enumeration With Ċ import Ġcom . avail . descriptor . types . FunctionType Descriptor . Companion . function Type Ċ import Ġcom . avail . descriptor . types . Integer Range TypeDescriptor . Companion . inclusive Ċ import Ġcom . avail . descriptor . types . Integer Range TypeDescriptor . Companion . whole Numbers Ċ import Ġcom . avail . descriptor . types . Set TypeDescriptor . Companion . setType For Sizes ContentType Ċ import Ġcom . avail . descriptor . types . Tuple TypeDescriptor . Companion . string Type Ċ import Ġcom . avail . descriptor . types . TypeDescriptor . Types . ATOM Ċ import Ġcom . avail . exceptions . Avail ErrorCode . E _ EX CE ED S _ VM _ LIMIT Ċ import Ġcom . avail . exceptions . Avail ErrorCode . E _ IL LEG AL _ OPTION Ċ import Ġcom . avail . exceptions . Avail ErrorCode . E _ INVALID _ PATH Ċ import Ġcom . avail . exceptions . Avail ErrorCode . E _ IO _ ERROR Ċ import Ġcom . avail . exceptions . Avail ErrorCode . E _ OPERATION _ NOT _ SUPPORTED Ċ import Ġcom . avail . exceptions . Avail ErrorCode . E _ PERMISSION _ DEN IED Ċ import Ġcom . avail . interpreter . Primitive Ċ import Ġcom . avail . interpreter . Primitive . Flag . Can Inline Ċ import Ġcom . avail . interpreter . Primitive . Flag . Has Side Effect Ċ import Ġcom . avail . interpreter . execution . Interpreter Ċ import Ġcom . avail . io . IO System Ċ import Ġcom . avail . io . IO System . File Handle Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . channels . As ynchronous File Channel Ċ import Ġjava . nio . file . Access Denied Exception Ċ import Ġjava . nio . file . FileSystem Ċ import Ġjava . nio . file . Invalid Path Exception Ċ import Ġjava . nio . file . Open Option Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Standard Open Option Ċ import Ġjava . nio . file . Standard Open Option . READ Ċ import Ġjava . nio . file . Standard Open Option . WRITE Ċ import Ġjava . nio . file . attribute . File Attribute Ċ import Ġjava . nio . file . attribute . Pos ix File Permission Ċ import Ġjava . nio . file . attribute . Pos ix File Permissions Ċ import Ġjava . util . Enum Set Ċ Ċ /** Ċ Ġ* Ġ** Primitive :** ĠOpen Ġan Ġ[ file ][ As ynchronous File Channel ]. ĠAnswer Ġa Ċ Ġ* Ġ[ handle ][ Atom Descriptor ] Ġthat Ġuniquely Ġidentifies Ġthe Ġfile . Ċ Ġ* Ċ Ġ* Ġ@ author ĠT odd ĠL ĠSmith Ġ& lt ; tod d @ avail lang . org & gt ; Ċ Ġ*/ Ċ @ Suppress (" unused ") Ċ object ĠP _ File Open Ġ: ĠPrimitive ( 4 , ĠCan Inline , ĠHas Side Effect ) Ċ { Ċ ĉ override Ġfun Ġattempt ( interpreter : ĠInterpreter ): ĠResult Ċ ĉ { Ċĉ ĉ interpreter . check Argument Count ( 4 ) Ċĉ ĉ val Ġfilename Ġ= Ġinterpreter . argument ( 0 ) Ċĉ ĉ val Ġalignment Ġ= Ġinterpreter . argument ( 1 ) Ċĉ ĉ val Ġoptions Ġ= Ġinterpreter . argument ( 2 ) Ċĉ ĉ val Ġpermissions Ġ= Ġinterpreter . argument ( 3 ) ĊĊĉ ĉ if Ġ(! alignment . is Int ) Ċĉ ĉ { Ċĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ EX CE ED S _ VM _ LIMIT ) Ċĉ ĉ } Ċĉ ĉ var Ġalignment Int Ġ= Ġalignment . extract Int () Ċĉ ĉ if Ġ( alignment Int Ġ== Ġ 0 ) Ċĉ ĉ { Ċĉĉ ĉ // ĠPlug Ġin Ġthe Ġdefault Ġalignment Ġfor Ġthe Ġdevice Ġon Ġwhich Ġthe Ċĉĉ ĉ // Ġfilename Ġis Ġlocated . Ġ ĠA hem , Ġ erm , ĠJava Ġactually Ġdoesn 't Ġmake Ġthis Ċĉĉ ĉ // Ġavailable Ġin Ġany Ġway . Ġ ĠF udge Ġit Ġfor Ġnow Ġas Ġ 4 0 9 6 . Ċĉĉ ĉ alignment Int Ġ= Ġ 4 0 9 6 Ċĉ ĉ } Ċĉ ĉ assert ( alignment Int Ġ> Ġ 0 ) Ċĉ ĉ val Ġio System Ġ= Ġcurrent Runtime (). io System () Ċĉ ĉ val Ġfile Options Ġ= Ġopen Options For ( options ) Ċĉ ĉ val Ġfile Attributes Ġ= Ġpermissions For ( permissions ) Ċĉ ĉ if Ġ(! file Options . contains ( READ ) Ġ&& Ġ! file Options . contains ( WRITE )) Ċĉ ĉ { Ċĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ IL LEG AL _ OPTION ) Ċĉ ĉ } Ċĉ ĉ val Ġpath : ĠPath Ġ= Ċĉĉ ĉ try Ċĉĉ ĉ { Ċĉĉĉ ĉ IO System . file System . getPath ( filename . as Native String ()) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠInvalid Path Exception ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ INVALID _ PATH ) Ċĉĉ ĉ } ĊĊĉ ĉ val Ġatom Ġ= Ġcreate Atom ( filename , Ġnil ) Ċĉ ĉ val Ġchannel : ĠAs ynchronous File Channel Ġ= Ċĉĉ ĉ try Ċĉĉ ĉ { Ċĉĉĉ ĉ io System . open File ( path , Ġfile Options , Ġ* file Attributes ) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠIllegalArgumentException ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ IL LEG AL _ OPTION ) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠUnsupportedOperationException ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ OPERATION _ NOT _ SUPPORTED ) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠSecurity Exception ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ PERMISSION _ DEN IED ) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠAccess Denied Exception ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ PERMISSION _ DEN IED ) Ċĉĉ ĉ } Ċĉĉ ĉ catch Ġ( e : ĠIOException ) Ċĉĉ ĉ { Ċĉĉĉ ĉ return Ġinterpreter . primitive Failure ( E _ IO _ ERROR ) Ċĉĉ ĉ } ĊĊĉ ĉ val Ġfile Handle Ġ= ĠFile Handle ( Ċĉĉ ĉ filename , Ċĉĉ ĉ alignment Int , Ċĉĉ ĉ file Options . contains ( READ ), Ċĉĉ ĉ file Options . contains ( WRITE ), Ċĉĉ ĉ channel ) Ċĉ ĉ val Ġpo jo Ġ= Ġidentity Po jo ( file Handle ) Ċĉ ĉ atom . set Atom Property ( FILE _ KEY . atom , Ġpo jo ) Ċĉ ĉ return Ġinterpreter . primitive Success ( atom ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġprivate BlockType Restriction (): ĠA _ Type Ġ= Ċĉ ĉ function Type ( Ċĉĉ ĉ tuple ( Ċĉĉĉ ĉ string Type (), Ċĉĉĉ ĉ whole Numbers , Ċĉĉĉ ĉ setType For Sizes ContentType ( Ċĉĉĉĉ ĉ whole Numbers , Ġinclusive ( 0 , Ġ 9 )), Ċĉĉĉ ĉ setType For Sizes ContentType ( Ċĉĉĉĉ ĉ whole Numbers , Ġinclusive ( 1 , Ġ 9 ))), Ċĉĉ ĉ ATOM . o Ċĉ ĉ ) ĊĊ ĉ override Ġfun Ġprivate Failure Variable Type (): ĠA _ Type Ġ= Ċĉ ĉ enumeration With ( Ċĉĉ ĉ set ( Ċĉĉĉ ĉ E _ EX CE ED S _ VM _ LIMIT , Ċĉĉĉ ĉ E _ INVALID _ PATH , Ċĉĉĉ ĉ E _ IL LEG AL _ OPTION , Ċĉĉĉ ĉ E _ OPERATION _ NOT _ SUPPORTED , Ċĉĉĉ ĉ E _ PERMISSION _ DEN IED , Ċĉĉĉ ĉ E _ IO _ ERROR )) ĊĊ ĉ /** Ċĉ Ġ* ĠSt ash Ġthe Ġenum Ġvalues Ġfor ĠStandard Open Option Ġto Ġavoid Ġarray Ġcopying . Ċĉ Ġ*/ Ċ ĉ internal Ġval Ġall Standard Open Options Ġ= ĠStandard Open Option . values () ĊĊ ĉ /** Ċĉ Ġ* ĠConstruct Ġthe Ġ[ set ][ Enum Set ] Ġof Ġ[ open ][ Open Option ] Ġthat Ġcorrespond Ġto Ġthe Ċĉ Ġ* Ġsupplied Ġ[ set ][ Set Descriptor ] Ġof Ġintegral Ġoption Ġindicators . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġoption Ints Ċĉ Ġ* ĠĠ ĠSome Ġintegral Ġoption Ġindicators . Ċĉ Ġ* Ġ@ return ĠThe Ġimplied Ġopen Ġoptions . Ċĉ Ġ*/ Ċ ĉ private Ġfun Ġopen Options For ( option Ints : ĠA _ Set ): ĠSet < Open Option > Ċ ĉ { Ċĉ ĉ val Ġoptions Ġ= Ċĉĉ ĉ Enum Set . none Of ( Standard Open Option :: class . java ) Ċĉ ĉ for Ġ( option Int Ġin Ġoption Ints ) Ċĉ ĉ { Ċĉĉ ĉ options . add ( all Standard Open Options [ option Int . extract Int ()]) Ċĉ ĉ } Ċĉ ĉ return Ġoptions Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠConstruct Ġthe Ġ[ set ][ Enum Set ] Ġof Ġ[ file &# 3 2 ; attributes ][ File Attribute ] Ġthat Ċĉ Ġ* Ġspecify Ġthe Ġ[ POSIX ][ Pos ix File Permission ] Ġthat Ġcorrespond Ġto Ġthe Ġsupplied Ċĉ Ġ* Ġ[ set ][ Set Descriptor ] Ġof Ġintegral Ġoption Ġindicators . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġoption Ints Ċĉ Ġ* ĠĠ ĠSome Ġintegral Ġoption Ġindicators . Ċĉ Ġ* Ġ@ return ĠAn Ġarray Ġwhose Ġl one Ġelement Ġis Ġa Ġset Ġcontaining Ġan Ġattribute Ġthat Ċĉ Ġ* ĠĠ Ġspecifies Ġthe Ġimplied ĠPOSIX Ġfile Ġpermissions , Ġor Ġan Ġempty Ġarray Ġif Ġthe Ċĉ Ġ* ĠĠ Ġ[ file &# 3 2 ; system ][ FileSystem ] Ġdoes Ġnot Ġsupport ĠPOSIX Ġfile Ġpermissions . Ċĉ Ġ*/ Ċ ĉ private Ġfun Ġpermissions For ( option Ints : ĠA _ Set ): ĠArray < File Attribute <* >> Ġ= Ċĉ ĉ if Ġ( IO System . file System . supported File Attribute Views (). contains (" posix ")) Ċĉ ĉ { Ċĉĉ ĉ val Ġall Permissions Ġ= ĠIO System . posix Permissions Ċĉĉ ĉ val Ġpermissions Ġ= ĠEnum Set . none Of ( Ċĉĉĉ ĉ Pos ix File Permission :: class . java ) Ċĉĉ ĉ for Ġ( option Int Ġin Ġoption Ints ) Ċĉĉ ĉ { Ċĉĉĉ ĉ permissions . add ( all Permissions [ option Int . extract Int () Ġ- Ġ 1 ]) Ċĉĉ ĉ } Ċĉĉ ĉ array Of ( Pos ix File Permissions . as File Attribute ( permissions )) Ċĉ ĉ } Ċĉ ĉ else Ġ{ ĠarrayOf () Ġ} Ċ } Ċ