/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 0 8 - 2 0 1 8 ĠD ario ĠS co pp el let ti , Ġ< http :// www . sco pp el let ti . it />. Ċ Ġ* Ċ Ġ* Ġ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 . Ċ Ġ*/ Ċ Ċ @ file : Suppress (" unused ") Ċ Ċ package Ġit . sco pp el let ti . spaces hip . io Ċ Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . isActive Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġmu . Kotlin Logging Ċ import Ġok io . Buffer Ċ import Ġok io . Sink Ċ import Ġok io . Source Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . IOException Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{ Ġ} Ċ Ċ /** Ċ Ġ* ĠI / O Ġextensions . Ċ Ġ*/ Ċ public Ġobject ĠIO Ext Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSe parator Ġbetween Ġthe Ġbase Ġname Ġand Ġthe Ġextension Ġin Ġa Ġfile Ġname . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġconst Ġval ĠEXT _ SEPARATOR : ĠChar Ġ= Ġ'.' Ċ } Ċ Ċ /** Ċ Ġ* ĠCloses Ġa Ġstream Ġignoring Ġany Ġexceptions . Ċ Ġ* Ċ Ġ* ĠThe Ġreturned Ġvalue Ġis Ġalways Ġ` null ` Ġand Ġcan Ġbe Ġassigned Ġto Ġthe Ġreceiver , Ġso Ċ Ġ* Ġthat Ġit Ġcan Ġbe Ġused Ġto Ġcheck Ġwhether Ġthe Ġstream Ġis Ġstill Ġopened Ċ Ġ* Ġ(` stream Ġ!= Ġnull `) Ġor Ġhas Ġbeen Ġclosed Ġ(` stream Ġ== Ġnull `). Ċ Ġ* Ċ Ġ* Ġ@ receiver ĠStream . Ċ Ġ* Ġ@ return ĠĠ Ġ` null ` Ċ Ġ* Ġ@ since ĠĠĠĠ 1 . 0 . 0 Ċ Ġ*/ Ċ public Ġfun Ġ< T Ġ: ĠClose able > ĠT . close Quiet ly (): ĠT ? Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . close () ĊĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġclose Ġstream .", Ġex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠCopy Ġa Ġstream Ġto Ġanother Ġstream . Ċ Ġ* Ċ Ġ* Ġ@ param Ġsource Ġ ĠInput Ġstream . Ċ Ġ* Ġ@ param Ġsink ĠĠĠ ĠOutput Ġstream . Ċ Ġ* Ġ@ param Ġbuf Size ĠSize Ġof Ġthe Ġbuffer Ġused Ġfor Ġcopying . Ċ Ġ* Ġ@ since ĠĠĠĠĠĠĠĠĠ 1 . 0 . 0 Ċ Ġ*/ Ċ @ Throws ( IOException :: class ) Ċ @ Suppress (" Blocking Method In Non Blocking Context ") Ċ public Ġsuspend Ġfun Ġcopy ( ĊĠĠĠĠĠĠĠ Ġsource : ĠSource , ĊĠĠĠĠĠĠĠ Ġsink : ĠS ink , ĊĠĠĠĠĠĠĠ Ġbuf Size : ĠLong Ġ= ĠDEFAULT _ BUFFER _ SIZE . to Long () Ċ ): ĠUnit Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ ĊĠĠĠ Ġvar Ġn : ĠLong ĊĠĠĠ Ġval Ġbuf Ġ= ĠBuffer () ĊĊĠĠĠ Ġn Ġ= Ġsource . read ( buf , Ġbuf Size ) ĊĠĠĠ Ġwhile Ġ( n Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsink . write ( buf , Ġn ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! isActive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġn Ġ= Ġsource . read ( buf , Ġbuf Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsink . flush () Ċ } Ċ