@@ -28,6 +28,7 @@ class LibusbCommunication(
28
28
private val libUsbHandle: Long
29
29
get() = libUsbHandleArray[0 ]
30
30
private var deviceConnection: UsbDeviceConnection ?
31
+ private var closed = false
31
32
32
33
init {
33
34
System .loadLibrary(" libusbcom" )
@@ -59,6 +60,8 @@ class LibusbCommunication(
59
60
private external fun nativeControlTransfer (handle : Long , requestType : Int , request : Int , value : Int , index : Int , buffer : ByteArray , length : Int , timeout : Int ): Int
60
61
61
62
override fun bulkOutTransfer (src : ByteBuffer ): Int {
63
+ require(! closed) { " device is closed" }
64
+
62
65
val transferred = nativeBulkTransfer(
63
66
libUsbHandle, outEndpoint.address, src.array(), src.position(), src.remaining(),
64
67
TRANSFER_TIMEOUT
@@ -74,6 +77,8 @@ class LibusbCommunication(
74
77
}
75
78
76
79
override fun bulkInTransfer (dest : ByteBuffer ): Int {
80
+ require(! closed) { " device is closed" }
81
+
77
82
val transferred = nativeBulkTransfer(
78
83
libUsbHandle, inEndpoint.address, dest.array(), dest.position(), dest.remaining(),
79
84
TRANSFER_TIMEOUT
@@ -89,6 +94,8 @@ class LibusbCommunication(
89
94
}
90
95
91
96
override fun controlTransfer (requestType : Int , request : Int , value : Int , index : Int , buffer : ByteArray , length : Int ): Int {
97
+ require(! closed) { " device is closed" }
98
+
92
99
val ret = nativeControlTransfer(libUsbHandle, requestType, request, value, index, buffer, length, TRANSFER_TIMEOUT )
93
100
if (ret < 0 ) {
94
101
throw LibusbException (" libusb control transfer failed" , LibusbError .fromCode(ret))
@@ -97,6 +104,8 @@ class LibusbCommunication(
97
104
}
98
105
99
106
override fun resetDevice () {
107
+ require(! closed) { " device is closed" }
108
+
100
109
if (! deviceConnection!! .releaseInterface(usbInterface)) {
101
110
Log .w(TAG , " Failed to release interface, errno: ${ErrNo .errno} ${ErrNo .errstr} " )
102
111
}
@@ -118,14 +127,22 @@ class LibusbCommunication(
118
127
}
119
128
120
129
override fun clearFeatureHalt (endpoint : UsbEndpoint ) {
130
+ require(! closed) { " device is closed" }
131
+
121
132
val ret = nativeClearHalt(libUsbHandle, endpoint.address)
122
133
Log .d(TAG , " libusb clearFeatureHalt returned $ret : ${LibusbError .fromCode(ret).message} " )
123
134
}
124
135
125
136
override fun close () {
126
- deviceConnection!! .releaseInterface(usbInterface)
127
- nativeClose(libUsbHandle, usbInterface.id)
128
- deviceConnection!! .close()
137
+ require(! closed) { " device is already closed" }
138
+
139
+ try {
140
+ deviceConnection!! .releaseInterface(usbInterface)
141
+ nativeClose(libUsbHandle, usbInterface.id)
142
+ deviceConnection!! .close()
143
+ } finally {
144
+ closed = true
145
+ }
129
146
}
130
147
131
148
companion object {
0 commit comments