/* Ċ * ĠTor On ion Proxy Library - Android Ġ( a . k . a . Ġto pl - android ) Ġis Ġa Ġder ivation Ġof Ċ * Ġwork Ġfrom Ġthe ĠTor _ On ion _ Proxy _ Library Ġproject Ġthat Ġstarted Ġat Ġcommit Ċ * Ġhash Ġ` 7 4 4 0 7 1 1 4 cb fa 8 ea 6 f 2 ac 5 1 4 1 7 dda 8 be 9 8 d 8 aba 8 6 `. ĠCont ributions Ġmade Ġafter Ċ * Ġsaid Ġcommit Ġhash Ġare : Ċ * Ċ * ĠĠĠĠ ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠMat thew ĠN el son Ċ * Ċ * ĠĠĠĠ ĠThis Ġprogram Ġis Ġfree Ġsoftware : Ġyou Ġcan Ġredistribute Ġit Ġand / or Ġmodify Ġit Ċ * ĠĠĠĠ Ġunder Ġthe Ġterms Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġas Ġpublished Ġby Ġthe Ċ * ĠĠĠĠ ĠFree ĠSoftware ĠFoundation , Ġeither Ġversion Ġ 3 Ġof Ġthe ĠLicense , Ġor Ġ( at Ġyour Ċ * ĠĠĠĠ Ġoption ) Ġany Ġlater Ġversion . Ċ * Ċ * ĠĠĠĠ ĠThis Ġprogram Ġ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 ĠGeneral ĠPublic ĠLicense Ċ * ĠĠĠĠ Ġfor Ġmore Ġdetails . Ċ * Ċ * ĠĠĠĠ ĠYou Ġshould Ġhave Ġreceived Ġa Ġcopy Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ċ * ĠĠĠĠ Ġalong Ġwith Ġthis Ġprogram . ĠIf Ġnot , Ġsee Ġ< https :// www . gnu . org / licenses />. Ċ * Ċ * Ġ` ================================================================ =========== ` Ċ * Ġ` ++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++ ++++++++ +++ ` Ċ * Ġ` ================================================================ =========== ` Ċ * Ċ * ĠThe Ġfollowing Ġexception Ġis Ġan Ġadditional Ġpermission Ġunder Ġsection Ġ 7 Ġof Ġthe Ċ * ĠGNU ĠGeneral ĠPublic ĠLicense , Ġversion Ġ 3 Ġ( âĢľ GPL v 3 âĢĿ ). Ċ * Ċ * ĠĠĠĠ Ġ" The ĠInterfaces " Ġis Ġhence for th Ġdefined Ġas ĠApplication ĠProgramming ĠInterfaces Ċ * ĠĠĠĠ Ġneeded Ġto Ġimplement ĠTor On ion Proxy Library - Android , Ġas Ġlisted Ġbelow : Ċ * Ċ * ĠĠĠĠĠ Ġ- ĠFrom Ġthe Ġ` to pl - core - base ` Ġmodule : Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠAll ĠClasses / methods / variables Ċ * Ċ * ĠĠĠĠĠ Ġ- ĠFrom Ġthe Ġ` to pl - service - base ` Ġmodule : Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠAll ĠClasses / methods / variables Ċ * Ċ * ĠĠĠĠĠ Ġ- ĠFrom Ġthe Ġ` to pl - service ` Ġmodule : Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠThe ĠTor Service Controller Ġclass Ġand Ġit 's Ġcontained Ġclasses / methods / variables Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠThe ĠService Notification . Builder Ġclass Ġand Ġit 's Ġcontained Ġclasses / methods / variables Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠThe ĠBackground Manager . Builder Ġclass Ġand Ġit 's Ġcontained Ġclasses / methods / variables Ċ * ĠĠĠĠĠĠĠĠĠ Ġ- ĠThe ĠBackground Manager . Companion Ġclass Ġand Ġit 's Ġcontained Ġmethods / variables Ċ * Ċ * ĠĠĠĠ ĠThe Ġfollowing Ġcode Ġis Ġexcluded Ġfrom Ġ" The ĠInterfaces ": Ċ * Ċ * ĠĠĠĠĠĠ Ġ- ĠAll Ġother Ġcode Ċ * Ċ * ĠĠĠĠ ĠLink ing ĠTor On ion Proxy Library - Android Ġstatic ally Ġor Ġdynamically Ġwith Ġother Ċ * ĠĠĠĠ Ġmodules Ġis Ġmaking Ġa Ġcombined Ġwork Ġbased Ġon ĠTor On ion Proxy Library - Android . Ċ * ĠĠĠĠ ĠThus , Ġthe Ġterms Ġand Ġconditions Ġof Ġthe ĠGNU ĠGeneral ĠPublic ĠLicense Ġcover Ġthe Ċ * ĠĠĠĠ Ġwhole Ġcombination . Ċ * Ċ * ĠĠĠĠ ĠAs Ġa Ġspecial Ġexception , Ġthe Ġcopyright Ġholder Ġof ĠTor On ion Proxy Library - Android Ċ * ĠĠĠĠ Ġgives Ġyou Ġpermission Ġto Ġcombine ĠTor On ion Proxy Library - Android Ġprogram Ġwith Ġfree Ċ * ĠĠĠĠ Ġsoftware Ġprograms Ġor Ġlibraries Ġthat Ġare Ġreleased Ġunder Ġthe ĠGNU ĠLGPL Ġand Ġwith Ċ * ĠĠĠĠ Ġindependent Ġmodules Ġthat Ġcommunicate Ġwith ĠTor On ion Proxy Library - Android Ġsole ly Ċ * ĠĠĠĠ Ġthrough Ġ" The ĠInterfaces ". ĠYou Ġmay Ġcopy Ġand Ġdistribute Ġsuch Ġa Ġsystem Ġfollowing Ċ * ĠĠĠĠ Ġthe Ġterms Ġof Ġthe ĠGNU ĠGPL Ġfor ĠTor On ion Proxy Library - Android Ġand Ġthe Ġlicenses Ġof Ċ * ĠĠĠĠ Ġthe Ġother Ġcode Ġconcerned , Ġprovided Ġthat Ġyou Ġinclude Ġthe Ġsource Ġcode Ġof Ġthat Ċ * ĠĠĠĠ Ġother Ġcode Ġwhen Ġand Ġas Ġthe ĠGNU ĠGPL Ġrequires Ġdistribution Ġof Ġsource Ġcode Ġand Ċ * ĠĠĠĠ Ġprovided Ġthat Ġyou Ġdo Ġnot Ġmodify Ġ" The ĠInterfaces ". Ċ * Ċ * ĠĠĠĠ ĠNote Ġthat Ġpeople Ġwho Ġmake Ġmodified Ġversions Ġof ĠTor On ion Proxy Library - Android Ċ * ĠĠĠĠ Ġare Ġnot Ġoblig ated Ġto Ġgrant Ġthis Ġspecial Ġexception Ġfor Ġtheir Ġmodified Ġversions ; Ċ * ĠĠĠĠ Ġit Ġis Ġtheir Ġchoice Ġwhether Ġto Ġdo Ġso . ĠThe ĠGNU ĠGeneral ĠPublic ĠLicense Ġgives Ċ * ĠĠĠĠ Ġpermission Ġto Ġrelease Ġa Ġmodified Ġversion Ġwithout Ġthis Ġexception ; Ġthis Ġexception Ċ * ĠĠĠĠ Ġalso Ġmakes Ġit Ġpossible Ġto Ġrelease Ġa Ġmodified Ġversion Ġwhich Ġcar ries Ġforward Ġthis Ċ * ĠĠĠĠ Ġexception . ĠIf Ġyou Ġmodify Ġ" The ĠInterfaces ", Ġthis Ġexception Ġdoes Ġnot Ġapply Ġto Ġyour Ċ * ĠĠĠĠ Ġmodified Ġversion Ġof ĠTor On ion Proxy Library - Android , Ġand Ġyou Ġmust Ġremove Ġthis Ċ * ĠĠĠĠ Ġexception Ġwhen Ġyou Ġdistribute Ġyour Ġmodified Ġversion . Ċ * Ċ * Ġ================================================================= =============== Ċ * Ġ+ ++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++ ++++++++ ++++ +++ Ċ * Ġ================================================================= =============== Ċ * Ċ * ĠThe Ġoriginal Ġcode , Ġprior Ġto Ġcommit Ġhash Ġ 7 4 4 0 7 1 1 4 cb fa 8 ea 6 f 2 ac 5 1 4 1 7 dda 8 be 9 8 d 8 aba 8 6 , Ċ * Ġwas : Ċ * Ċ * ĠĠĠĠ ĠCopyright Ġ( c ) ĠMicrosoft ĠOpen ĠTechnologies , ĠInc . Ċ * ĠĠĠĠ ĠAll ĠRights ĠReserved Ċ * Ċ * ĠĠĠĠ Ġ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 Ċ * Ċ * Ċ * ĠĠĠĠ ĠTHIS ĠCODE ĠIS ĠPROVIDED ĠON ĠAN Ġ* AS ĠIS * ĠBASIS , ĠWITHOUT ĠWARRANTIES ĠOR Ċ * ĠĠĠĠ ĠCONDITIONS ĠOF ĠANY ĠKIND , ĠE IT HER ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING Ċ * ĠĠĠĠ ĠWITHOUT ĠLIMIT ATION ĠANY ĠIMPLIED ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠTITLE , Ċ * ĠĠĠĠ ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE , ĠMER CHANT AB L ITY ĠOR ĠNON - INFRINGEMENT . Ċ * Ċ * ĠĠĠĠ ĠSee Ġthe ĠApache Ġ 2 ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ * ĠĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ * Ċ * Ġ` ================================================================ =========== ` Ċ * Ġ` ++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++ ++++++++ +++ ` Ċ * Ġ` ================================================================ =========== ` Ċ * Ċ * ĠThis Ġcode Ġtook Ġthe ĠS ocks 4 a Ġlogic Ġfrom ĠS ocks Proxy Client Conn Operator Ġin ĠNet Cipher Ċ * Ġwhich Ġwas Ġthen Ġmodified Ġto Ġmeet Ġour Ġneeds . ĠThat Ġoriginal Ġcode Ġwas Ġlicensed Ġas : Ċ * Ċ * ĠThis Ġfile Ġcontains Ġthe Ġlicense Ġfor ĠOr lib , Ġa Ġfree Ġsoftware Ġproject Ġto Ċ * Ġprovide Ġan onym ity Ġon Ġthe ĠInternet Ġfrom Ġa ĠGoogle ĠAndroid Ġs mar tp hone . Ċ * Ċ * ĠĠĠĠ ĠFor Ġmore Ġinformation Ġabout ĠOr lib , Ġsee Ġhttps :// guardian project . info / Ċ * Ċ * ĠIf Ġyou Ġgot Ġthis Ġfile Ġas Ġa Ġpart Ġof Ġa Ġlarger Ġbundle , Ġthere Ġmay Ġbe Ġother Ċ * Ġlicense Ġterms Ġthat Ġyou Ġshould Ġbe Ġaware Ġof . Ċ * Ċ * Ċ * ĠĠĠĠ ĠOr lib Ġis Ġdistributed Ġunder Ġthis Ġlicense Ġ( aka Ġthe Ġ 3 - clause ĠBSD Ġlicense ) Ċ * ĠĠĠĠ ĠCopyright Ġ( c ) Ġ 2 0 0 9 - 2 0 1 0 , ĠN athan ĠFre itas , ĠThe ĠGuard ian ĠProject Ċ * Ċ * ĠĠĠĠ Ġ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 Ġnames Ġof Ġthe Ġcopyright Ġowners Ġnor Ġthe Ġnames Ġof Ġits Ċ * ĠĠĠĠĠĠĠĠ Ġ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 Ċ * ĠĠĠĠĠĠĠĠ ĠOWNER Ġ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 Ġio . mat the wn el son . to pl _ core . util Ċ Ċ import Ġjava . io .* Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip InputStream Ċ Ċ object ĠFile Utilities Ġ{ ĊĊĠĠĠ Ġ// ĠTODO : Ġsearch Ġcommit Ġhistory Ġto Ġsee Ġwhy Ġthis Ġmethod Ġname Ġdoes Ġnot ĊĠĠĠ Ġ// Ġ Ġproperly Ġrepresent Ġwhat Ġit Ġis Ġdoing . ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġset To ReadOnly Permissions ( file : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile . set Readable ( false , Ġfalse ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . set Writable ( false , Ġfalse ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . set Executable ( false , Ġfalse ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . set Readable ( true , Ġtrue ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . set Writable ( true , Ġtrue ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . set Executable ( true , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġreadable / executable Ġfor Ġall Ġusers Ġand Ġwritable Ġby Ġowner ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġfile Ġto Ġset Ġthe Ġpermissions Ġon ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġset Per ms ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile . set Readable ( true ) ĊĠĠĠĠĠĠĠ Ġfile . set Executable ( true ) ĊĠĠĠĠĠĠĠ Ġfile . set Writable ( false ) ĊĠĠĠĠĠĠĠ Ġfile . set Writable ( true , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCloses Ġboth Ġinput Ġand Ġoutput Ġstreams Ġwhen Ġdone . ĊĠĠĠĠ Ġ* Ġ@ param Ġin ĠStream Ġto Ġread Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param Ġout ĠStream Ġto Ġwrite Ġto ĊĠĠĠĠ Ġ* Ġ@ throws Ġjava . io . IOException Ġ- ĠIf Ġclose Ġon Ġinput Ġor Ġoutput Ġfails ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġcopy (` in `: ĠInputStream , Ġout : ĠOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ` in `. use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy DoNot Close Input ( inputStream , Ġout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠW on 't Ġclose Ġthe Ġinput Ġstream Ġwhen Ġit 's Ġdone , Ġneeded Ġto Ġhandle ĠZip InputStream s ĊĠĠĠĠ Ġ* Ġ@ param Ġin ĠW on 't Ġbe Ġclosed ĊĠĠĠĠ Ġ* Ġ@ param Ġout ĠWill Ġbe Ġclosed ĊĠĠĠĠ Ġ* Ġ@ throws Ġjava . io . IOException ĠIf Ġclose Ġon Ġoutput Ġfails ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġcopy DoNot Close Input (` in `: ĠInputStream , Ġout : ĠOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . use Ġ{ ĠoutputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠByteArray ( 4 0 9 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Ġ= Ġ` in `. read ( buf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Ġ== Ġ- 1 ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . write ( buf , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( Security Exception :: class ) ĊĠĠĠ Ġfun Ġlist Files To Log ( f : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( f . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Files Ġ= Ġf . list Files () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġlist Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist Files To Log ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe Ġinput Ġstream , Ġdeletes Ġfile To WriteTo Ġif Ġit Ġexists Ġand Ġover Ġwrites Ġit Ġwith Ġthe Ġstream . ĊĠĠĠĠ Ġ* Ġ@ param Ġread From ĠStream Ġto Ġread Ġfrom ĊĠĠĠĠ Ġ* Ġ@ param Ġfile To WriteTo ĠFile Ġto Ġwrite Ġto ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws Ġjava . io . IOException Ġ- ĠIf Ġany Ġof Ġthe Ġfile Ġoperations Ġfail ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠSecurity Exception :: class ) ĊĠĠĠ Ġfun Ġclean Install One File ( read From : ĠInputStream , Ġfile To WriteTo : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file To WriteTo . exists () Ġ&& Ġ! file To WriteTo . delete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could Ġnot Ġremove Ġexisting Ġfile Ġ${ file To WriteTo . name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġout : ĠOutputStream Ġ= ĠFileOutputStream ( file To WriteTo ) ĊĠĠĠĠĠĠĠ Ġcopy ( read From , Ġout ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( Security Exception :: class ) ĊĠĠĠ Ġfun Ġrecursive File Delete ( file Or Directory : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file Or Directory . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Files Ġ= Ġfile Or Directory . list Files () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġlist Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecursive File Delete ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( file Or Directory . exists () Ġ&& Ġ! file Or Directory . delete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could Ġnot Ġdelete Ġdirectory Ġ${ file Or Directory . absolute Path }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġhas Ġto Ġexist Ġsomewhere ! ĠWhy Ġisn 't Ġit Ġa Ġpart Ġof Ġthe Ġstandard ĠJava Ġlibrary ? ĊĠĠĠĠ Ġ* Ġ@ param Ġdestination Directory ĠDirectory Ġfiles Ġare Ġto Ġbe Ġextracted Ġto ĊĠĠĠĠ Ġ* Ġ@ param Ġzip FileInputStream ĠStream Ġto Ġunzip ĊĠĠĠĠ Ġ* Ġ@ throws Ġjava . io . IOException Ġ- ĠIf Ġthere Ġare Ġany Ġfile Ġerrors ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠRuntimeException :: class ) ĊĠĠĠ Ġfun Ġextract Content From Zip ( destination Directory : ĠFile , Ġzip FileInputStream : ĠInputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġzip InputStream : ĠZip InputStream ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip InputStream Ġ= ĠZip InputStream ( zip FileInputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġzip Entry : ĠZip Entry ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( zip InputStream . next Entry . also Ġ{ Ġzip Entry Ġ= Ġit Ġ} Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( destination Directory , Ġzip Entry . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( zip Entry . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists () Ġ&& Ġ! file . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could Ġnot Ġcreate Ġdirectory Ġ$ file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists () Ġ&& Ġ! file . delete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġdelete Ġfile Ġin Ġpreparation Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" for Ġover writing Ġit . ĠFile Ġ- Ġ${ file . absolute Path }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . createNew File ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could Ġnot Ġcreate Ġfile Ġ$ file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile OutputStream : ĠOutputStream Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy DoNot Close Input ( zip InputStream , Ġfile OutputStream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip FileInputStream . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }