/* Ċ Ġ* Ġ( C ) ĠCopyright Ġ 2 0 1 4 Ġm j ah nen Ġ< j ah nen @ in . tum . de > Ċ Ġ* Ċ Ġ* Ġ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 Ġeu . dep au . etch d roid . lib de pa ums Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . hardware . usb .* Ċ import Ġandroid . os . Parcel Ċ import Ġandroid . util . Log Ċ import Ġeu . dep au . commons . android . kotlin . K Parcelable Ċ import Ġeu . dep au . commons . android . kotlin . parcel able Creator Ċ import Ġeu . dep au . commons . android . kotlin . read Typed Object Compat Ċ import Ġeu . dep au . commons . android . kotlin . write Typed Object Compat Ċ import Ġeu . dep au . etch d roid . lib de pa ums . driver . Block Device Driver Ċ import Ġeu . dep au . etch d roid . lib de pa ums . driver . Block Device Driver Factory Ċ import Ġeu . dep au . etch d roid . lib de pa ums . partition . Partition Ċ import Ġeu . dep au . etch d roid . lib de pa ums . partition . Partition Table Ċ import Ġeu . dep au . etch d roid . lib de pa ums . partition . Partition Table Factory Ċ import Ġeu . dep au . etch d roid . lib de pa ums . usb . Usb Communication Ċ import Ġeu . dep au . etch d roid . lib de pa ums . usb . Usb Communication Factory Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠClass Ġrepresenting Ġa Ġconnected ĠUSB Ġmass Ġstorage Ġdevice . ĠYou Ġcan Ġenumerate Ċ Ġ* Ġthrough Ġall Ġconnected Ġmass Ġstorage Ġdevices Ġvia Ċ Ġ* Ġ[. get Mass Storage Devices ]. ĠThis Ġmethod Ġonly Ġreturns Ġsupported Ċ Ġ* Ġdevices Ġor Ġif Ġno Ġdevice Ġis Ġconnected Ġan Ġempty Ġarray . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠAfter Ġchoosing Ġa Ġdevice Ġyou Ġhave Ġto Ġget Ġthe Ġpermission Ġfor Ġthe Ġunderlying Ċ Ġ* Ġ[ android . hardware . usb . Usb Device ]. ĠThe Ġunderlying Ċ Ġ* Ġ[ android . hardware . usb . Usb Device ] Ġcan Ġbe Ġaccessed Ġvia Ċ Ġ* Ġ[. get Usb Device ]. Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠAfter Ġthat Ġyou Ġneed Ġto Ġcall Ġ[. setup Device ]. ĠThis Ġwill Ġinitialize Ġthe Ċ Ġ* Ġmass Ġstorage Ġdevice Ġand Ġread Ġthe Ġpartitions Ġ( Ċ Ġ* Ġ[ eu . dep au . etch d roid . lib de pa ums . partition . Partition ]). Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThe Ġsupported Ġpartitions Ġcan Ġthen Ġbe Ġaccessed Ġvia Ġ[. get Partitions ] Ċ Ġ* Ġand Ġyou Ġcan Ġbegin Ġto Ġread Ġdirectories Ġand Ġfiles . Ċ Ġ* Ċ Ġ* ĠThis Ġclass Ġimplements ĠParcel able , Ġso Ġit Ġcan Ġbe Ġpacked Ġinto Ġan ĠIntent . Ċ Ġ* ĠHowever Ġbew are Ġthat Ġ. init () Ġneeds Ġto Ġbe Ġcalled Ġagain Ġwhen Ġthe Ġobject Ġis Ċ Ġ* Ġun par ce led , Ġso Ġremember Ġto Ġalso Ġclose Ġit Ġwhen Ġpassing Ġit Ġto Ġanother Ċ Ġ* Ġcomponent . Ċ Ġ* Ċ Ġ* ĠAlso Ġnote Ġthat Ġthis Ġmeans Ġthat Ġthe Ġother Ġcomponent Ġmay Ġhave Ġto Ġre - request Ċ Ġ* Ġthe ĠUSB Ġdevice Ġpermission Ġif Ġit 's Ġnot Ġthe Ġsame Ġapp . Ċ Ġ* Ċ Ġ* Ġ@ author Ġm j ah nen Ċ Ġ*/ Ċ class ĠU sb Mass Storage Device Ċ private Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġreturns Ġthe Ġ[ android . hardware . usb . Usb Device ] Ġwhich Ġcan Ġbe Ġused ĊĠĠĠĠĠĠĠĠ Ġ* Ġto Ġrequest Ġpermission Ġfor Ġcommunication . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠUnder lying Ġ[ android . hardware . usb . Usb Device ] Ġused Ġfor ĊĠĠĠĠĠĠĠĠ Ġ* Ġcommunication . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġusb Device : ĠU sb Device , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġusb Interface : ĠU sb Interface , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġin Endpoint : ĠU sb Endpoint , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġout Endpoint : ĠU sb Endpoint Ċ ) Ġ: ĠClose able , ĠK Parcelable Ġ{ ĊĊĠĠĠ Ġconstructor ( parcel : ĠParcel ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusb Device Ġ= Ġparcel . read Typed Object Compat ( Usb Device . CRE ATOR ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusb Interface Ġ= Ġparcel . read Typed Object Compat ( Usb Interface . CRE ATOR ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin Endpoint Ġ= Ġparcel . read Typed Object Compat ( Usb Endpoint . CRE ATOR ) !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Endpoint Ġ= Ġparcel . read Typed Object Compat ( Usb Endpoint . CRE ATOR ) !! ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠwriteTo Parcel ( parcel : ĠParcel , Ġflags : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparcel . write Typed Object Compat ( usb Device , Ġflags ) ĊĠĠĠĠĠĠĠ Ġparcel . write Typed Object Compat ( usb Interface , Ġflags ) ĊĠĠĠĠĠĠĠ Ġparcel . write Typed Object Compat ( in Endpoint , Ġflags ) ĊĠĠĠĠĠĠĠ Ġparcel . write Typed Object Compat ( out Endpoint , Ġflags ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdevice Connection : ĠU sb Device Connection ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġblock Ġdevice Ġinterface Ġfor Ġthis Ġdevice . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠBlock Device Driver Ġimplementation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġlateinit Ġvar Ġblock Device : ĠBlock Device Driver ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpartition Table : ĠPartition Table ĊĠĠĠ Ġprivate Ġval Ġpartitions Ġ= ĠArrayList < Partition >() ĊĠĠĠ Ġprivate Ġvar Ġinitialized Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitializes Ġthe Ġmass Ġstorage Ġdevice Ġand Ġdetermines Ġdifferent Ġthings Ġlike ĊĠĠĠĠ Ġ* Ġfor Ġexample Ġthe ĠM BR Ġor Ġthe Ġfile Ġsystems Ġfor Ġthe Ġdifferent Ġpartitions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ* ĠIf Ġreading Ġfrom Ġthe Ġphysical Ġdevice Ġfails . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException ĊĠĠĠĠ Ġ* ĠIf Ġpermission Ġto Ġcommunicate Ġwith Ġthe Ġunderlying ĊĠĠĠĠ Ġ* Ġ[ Usb Device ] Ġis Ġmissing . ĊĠĠĠĠ Ġ* Ġ@ see Ġ. get Usb Device ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġinit ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġusb Manager Ġ= Ġcontext . getSystem Service ( Context . USB _ SERVICE ) Ġas ĠU sb Manager ĊĊĠĠĠĠĠĠĠ Ġif Ġ( usb Manager . has Permission ( usb Device )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Device ( context ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Missing Ġpermission Ġto Ġaccess Ġusb Ġdevice : Ġ$ usb Device ") ĊĊĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġdevice Ġup . ĠCla ims Ġinterface Ġand Ġiniti ates Ġthe Ġdevice Ġconnection . ĊĠĠĠĠ Ġ* ĠCh oo ses Ġthe Ġright [ Usb Communication ] ĊĠĠĠĠ Ġ* Ġdepending Ġon Ġthe ĠAndroid Ġversion Ġ( ĊĠĠĠĠ Ġ* Ġ[ eu . dep au . etch d roid . lib de pa ums . usb . H oney Com b Mr 1 Communication ] ĊĠĠĠĠ Ġ* Ġor Ġ( ĊĠĠĠĠ Ġ* Ġ[ eu . dep au . etch d roid . lib de pa ums . usb . J el ly Bean Mr 2 Communication ] ĊĠĠĠĠ Ġ* Ġ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠInitializes Ġthe Ġ[. block Device ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ* ĠIf Ġreading Ġfrom Ġthe Ġphysical Ġdevice Ġfails . ĊĠĠĠĠ Ġ* Ġ@ see Ġ. init ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġsetup Device ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" setup Ġdevice ") ĊĠĠĠĠĠĠĠ Ġval Ġusb Manager Ġ= Ġcontext . getSystem Service ( Context . USB _ SERVICE ) Ġas ĠU sb Manager ĊĊĠĠĠĠĠĠĠ Ġdevice Connection Ġ= Ġusb Manager . open Device ( usb Device ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIOException (" Unable Ġto Ġopen ĠUSB Ġdevice ") ĊĊĠĠĠĠĠĠĠ Ġval Ġclaimed Ġ= Ġdevice Connection . claim Interface ( usb Interface , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! claimed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Could Ġnot Ġclaim ĠUSB Ġinterface ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġusb Communication Ġ= ĠU sb Communication Factory . create Usb Communication ( device Connection , Ġout Endpoint , Ġin Endpoint ) ĊĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠByteArray ( 1 ) ĊĠĠĠĠĠĠĠ Ġdevice Connection . control Transfer ( 1 6 1 , Ġ 2 5 4 , Ġ 0 , Ġusb Interface . id , Ġb , Ġ 1 , Ġ 5 0 0 0 ) ĊĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" MAX ĠL UN Ġ" Ġ+ Ġb [ 0 ]. toInt ()) ĊĊĠĠĠĠĠĠĠ Ġblock Device Ġ= ĠBlock Device Driver Factory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create Block Device ( usb Communication ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF ills Ġ[. partitions ] Ġwith Ġthe Ġinformation Ġreceived Ġby Ġthe ĊĠĠĠĠ Ġ* Ġ[. partition Table ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ* ĠIf Ġreading Ġfrom Ġthe Ġ[. block Device ] Ġfails . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġinit Partitions () Ġ{ ĊĠĠĠĠĠĠĠ Ġpartition Table Ġ= ĠPartition Table Factory . create Partition Table ( block Device ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġpartition Table . partition Table Entries ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPartition . create Partition ( entry , Ġblock Device ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpartitions . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRelease s Ġthe Ġ[ android . hardware . usb . Usb Interface ] Ġand Ġcloses Ġthe ĊĠĠĠĠ Ġ* Ġ[ android . hardware . usb . Usb Device Connection ]. ĠAfter Ġcalling Ġthis ĊĠĠĠĠ Ġ* Ġmethod Ġno Ġfurther Ġcommunication Ġis Ġpossible . ĠThat Ġmeans Ġyou Ġcan Ġnot Ġread ĊĠĠĠĠ Ġ* Ġor Ġwrite Ġfrom Ġor Ġto Ġthe Ġpartitions Ġreturned Ġby Ġ[. get Partitions ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Closing Ġdevice ") ĊĊĠĠĠĠĠĠĠ Ġval Ġinterface Released Ġ= Ġdevice Connection . release Interface ( usb Interface ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! interface Released ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Could Ġnot Ġrelease Ġinterface ") ĊĊĠĠĠĠĠĠĠ Ġdevice Connection . close () ĊĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġavailable Ġpartitions Ġof Ġthe Ġmass Ġstorage Ġdevice . ĠYou Ġhave Ġto ĊĠĠĠĠ Ġ* Ġcall Ġ[. init ] Ġbefore Ġcalling Ġthis Ġmethod ! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠList Ġof Ġpartitions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Partitions (): ĠList < Partition > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpartitions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġval ĠCRE ATOR Ġ= Ġparcel able Creator (:: Usb Mass Storage Device ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠU sb Mass Storage Device :: class . java . simple Name ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġsubclass Ġ 6 Ġmeans Ġthat Ġthe Ġusb Ġmass Ġstorage Ġdevice Ġimplements Ġthe ĠSC SI ĊĠĠĠĠĠĠĠĠ Ġ* Ġtransparent Ġcommand Ġset ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTER FACE _ SUB CLASS Ġ= Ġ 6 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġprotocol Ġ 8 0 Ġmeans Ġthe Ġcommunication Ġhappens Ġonly Ġvia Ġbulk Ġtransfers ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠINTER FACE _ PROTOCOL Ġ= Ġ 8 0 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġmethod Ġiter ates Ġthrough Ġall Ġconnected ĠUSB Ġdevices Ġand Ġsearches Ġfor ĊĠĠĠĠĠĠĠĠ Ġ* Ġmass Ġstorage Ġdevices . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġcontext ĊĠĠĠĠĠĠĠĠ Ġ* ĠContext Ġto Ġget Ġthe Ġ[ Usb Manager ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠAn Ġarray Ġof Ġsuitable Ġmass Ġstorage Ġdevices Ġor Ġan Ġempty Ġarray Ġif ĊĠĠĠĠĠĠĠĠ Ġ* Ġnone Ġcould Ġbe Ġfound . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Mass Storage Devices ( context : ĠContext ): ĠArray < Usb Mass Storage Device > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusb Manager Ġ= Ġcontext . getSystem Service ( Context . USB _ SERVICE ) Ġas ĠU sb Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Usb Mass Storage Device >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( device Ġin Ġusb Manager . device List . values ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Found ĠUSB Ġdevice : Ġ$ device ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdevice . interface Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusb Interface Ġ= Ġdevice . get Interface ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Found ĠUSB Ġinterface : Ġ$ usb Interface ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcurrently Ġonly Ġsupport ĠSC SI Ġtransparent Ġcommand Ġset Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbulk Ġtransfers Ġonly ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( usb Interface . interface Class Ġ!= ĠU sb Constants . USB _ CLASS _ M ASS _ STORAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġusb Interface . interface Subclass Ġ!= ĠINTER FACE _ SUB CLASS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġusb Interface . interface Protocol Ġ!= ĠINTER FACE _ PROTOCOL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Device Ġinterface Ġnot Ġsuitable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEvery Ġmass Ġstorage Ġdevice Ġhas Ġexactly Ġtwo Ġendpoints ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOne ĠIN Ġand Ġone ĠOUT Ġendpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( usb Interface . endpoint Count Ġ!= Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( TAG , Ġ" Inte face Ġendpoint Ġcount Ġ!= Ġ 2 ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġout Endpoint : ĠU sb Endpoint ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġin Endpoint : ĠU sb Endpoint ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġusb Interface . endpoint Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġendpoint Ġ= Ġusb Interface . get Endpoint ( j ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Found Ġusb Ġendpoint : Ġ$ endpoint ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( endpoint . type Ġ== ĠU sb Constants . USB _ ENDPOINT _ X FER _ B UL K ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( endpoint . direction Ġ== ĠU sb Constants . USB _ DIR _ OUT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Endpoint Ġ= Ġendpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Endpoint Ġ= Ġendpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( out Endpoint Ġ== Ġnull Ġ|| Ġin Endpoint Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Not Ġall Ġneeded Ġendpoints Ġfound !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠU sb Mass Storage Device ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice , Ġusb Interface , Ġin Endpoint , Ġout Endpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult . to Typed Array () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ