/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠAnt on ĠMal in sk iy Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . mal in sk iy . adam . request . sync . base Ċ Ċ import Ġcom . mal in sk iy . adam . Const Ċ import Ġcom . mal in sk iy . adam . exception . Push FailedException Ċ import Ġcom . mal in sk iy . adam . extension . copy To Ċ import Ġcom . mal in sk iy . adam . extension . read Transport Response Ċ import Ġcom . mal in sk iy . adam . extension . toByteArray Ċ import Ġcom . mal in sk iy . adam . extension . write Ċ import Ġcom . mal in sk iy . adam . request . Async Channel Request Ċ import Ġcom . mal in sk iy . adam . request . Validation Response Ċ import Ġcom . mal in sk iy . adam . transport . Socket Ċ import Ġcom . mal in sk iy . adam . transport . with Max File Packet Buffer Ċ import Ġio . ktor . util . c io .* Ċ import Ġio . ktor . utils . io .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . channels . Send Channel Ċ import Ġjava . io . File Ċ import Ġkotlin . coroutines . Coroutine Context Ċ Ċ abstract Ġclass ĠBase Push File Request ( ĊĠĠĠ Ġprivate Ġval Ġlocal : ĠFile , ĊĠĠĠ Ġprotected Ġval Ġremote Path : ĠString , ĊĠĠĠ Ġprotected Ġval Ġmode : ĠString Ġ= Ġ" 0 7 7 7 ", ĊĠĠĠ Ġcoroutine Context : ĠCor outine Context Ġ= ĠDispatch ers . IO Ċ ) Ġ: ĠAsync Channel Request < Double , ĠUnit >() Ġ{ ĊĠĠĠ Ġprotected Ġval Ġfile Read Channel Ġ= Ġlocal . read Channel ( coroutine Context Ġ= Ġcoroutine Context ) ĊĠĠĠ Ġprotected Ġvar Ġtotal Bytes Ġ= Ġlocal . length () ĊĠĠĠ Ġprotected Ġvar Ġcurrent Position Ġ= Ġ 0 L ĊĠĠĠ Ġprotected Ġval Ġmode Value : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmode . toInt ( 8 ) Ġand Ġ" 0 7 7 7 ". toInt ( 8 ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġread Element ( socket : ĠSocket , Ġsend Channel : ĠSend Channel < Double >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Max File Packet Buffer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġarray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġavailable Ġ= Ġfile Read Channel . copy To ( data , Ġ 8 , Ġdata . size Ġ- Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ< Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConst . Message . DONE . copy Into ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( local . lastModified () Ġ/ Ġ 1 0 0 0 ). toInt (). toByteArray (). copy Into ( data , Ġdestination Offset Ġ= Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . write ( request Ġ= Ġdata , Ġlength Ġ= Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransport Response Ġ= Ġsocket . read Transport Response () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Read Channel . cancel () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transport Response . ok ay ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Channel . send ( 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPush FailedException (" adb Ġdidn 't Ġacknowledge Ġthe Ġfile Ġtransfer : Ġ${ transport Response . message Ġ?: Ġ"" }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConst . Message . DATA . copy Into ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable . toByteArray (). reversed Array (). copy Into ( data , Ġdestination Offset Ġ= Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠUSB Ġdevices Ġare Ġvery Ġpick y Ġabout Ġthe Ġsize Ġof Ġthe ĠDATA Ġbuffer . ĠUsing Ġthe Ġa db 's Ġdefault ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . write Fully ( data , Ġ 0 , Ġavailable Ġ+ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position Ġ+= Ġavailable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend Channel . send ( current Position . toDouble () Ġ/ Ġtotal Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize () Ġ= Ġcreate Base Request (" sync :") ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġclose ( channel : ĠSend Channel < Double >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Read Channel . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġwrite Element ( element : ĠUnit , Ġsocket : ĠSocket ) Ġ= ĠUnit ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate (): ĠValidation Response Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġsuper . validate () ĊĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġremote Path . toByteArray ( Const . DEFAULT _ TRANSPORT _ ENCODING ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! response . success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! local . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValidation Response ( false , Ġ" Local Ġfile Ġ$ local Ġdoesn 't Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! local . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValidation Response ( false , Ġ"$ local Ġis Ġnot Ġa Ġfile ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( bytes . size Ġ> ĠConst . MAX _ REMOTE _ PATH _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValidation Response ( false , Ġ" Remote Ġpath Ġshould Ġbe Ġless Ġthat Ġ${ Const . MAX _ REMOTE _ PATH _ LENGTH } Ġbytes ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠValidation Response . Success ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ