package Ġcom . github . mj dev . lib a ums . usb Ċ Ċ import Ġandroid . hardware . usb .* Ċ Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . ByteBuffer Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġmagn us ja Ġon Ġ 2 1 / 1 2 / 1 6 . Ċ Ġ*/ Ċ Ċ internal Ġclass ĠU sb Request Communication ( ĊĠĠĠĠĠĠĠ Ġusb Manager : ĠU sb Manager , ĊĠĠĠĠĠĠĠ Ġusb Device : ĠU sb Device , ĊĠĠĠĠĠĠĠ Ġusb Interface : ĠU sb Interface , ĊĠĠĠĠĠĠĠ Ġout Endpoint : ĠU sb Endpoint , ĊĠĠĠĠĠĠĠ Ġin Endpoint : ĠU sb Endpoint Ċ ) Ġ: ĠAndroid Usb Communication ( usb Manager , Ġusb Device , Ġusb Interface , Ġout Endpoint , Ġin Endpoint ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġout Request Ġ= ĠU sb Request (). apply Ġ{ Ġinitialize ( device Connection , Ġout Endpoint ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġin Request Ġ= ĠU sb Request (). apply Ġ{ Ġinitialize ( device Connection , Ġin Endpoint ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġworkaround Buffer Ġ= ĠByteBuffer . allocate ( 1 0 2 4 Ġ* Ġ 3 2 Ġ* Ġ 4 ) ĊĊĠĠĠĠĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġbulk Out Transfer ( src : ĠByteBuffer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġsrc . remaining () ĊĠĠĠĠĠĠĠ Ġval Ġold Position Ġ= Ġsrc . position () ĊĊĠĠĠĠĠĠĠ Ġ// Ġworkaround : ĠU sb Request . queue Ġalways Ġreads Ġat Ġposition Ġ 0 Ġ: / ĊĠĠĠĠĠĠĠ Ġworkaround Buffer . clear () ĊĠĠĠĠĠĠĠ Ġworkaround Buffer . put ( src ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! out Request . queue ( work around Buffer , Ġlength )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Error Ġqueue ing Ġrequest .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġdevice Connection !!. request Wait () ĊĠĠĠĠĠĠĠ Ġif Ġ( request Ġ=== Ġout Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc . position ( old Position Ġ+ Ġworkaround Buffer . position ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġworkaround Buffer . position () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" request Wait Ġfailed ! ĠRequest : Ġ$ request ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġoverride Ġfun Ġbulk In Transfer ( dest : ĠByteBuffer ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġdest . remaining () ĊĊĠĠĠĠĠĠĠ Ġ// Ġworkaround : ĠU sb Request . queue Ġalways Ġwrites Ġat Ġposition Ġ 0 Ġ: / ĊĠĠĠĠĠĠĠ Ġworkaround Buffer . clear () ĊĠĠĠĠĠĠĠ Ġworkaround Buffer . limit ( length ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! in Request . queue ( work around Buffer , Ġlength )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Error Ġqueue ing Ġrequest .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġdevice Connection !!. request Wait () ĊĠĠĠĠĠĠĠ Ġif Ġ( request Ġ=== Ġin Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworkaround Buffer . flip () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest . put ( work around Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġworkaround Buffer . limit () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthrow ĠIOException (" request Wait Ġfailed ! ĠRequest : Ġ$ request ") ĊĠĠĠ Ġ} Ċ } Ċ