quarchpy 2.2.13.dev1__py2.py3-none-any.whl → 2.2.14__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1814) hide show
  1. quarchpy/__pycache__/__init__.cpython-310.pyc +0 -0
  2. quarchpy/__pycache__/_version.cpython-310.pyc +0 -0
  3. quarchpy/__pycache__/connection.cpython-310.pyc +0 -0
  4. quarchpy/__pycache__/install_qps.cpython-310.pyc +0 -0
  5. quarchpy/_version.py +1 -1
  6. quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.qfg +196 -196
  7. quarchpy/config_files/Cable_Modules/QTL1253-01 - Mini SAS Module Config v4.000 c1.3.qfg +198 -198
  8. quarchpy/config_files/Cable_Modules/QTL1253-02 - Mini SAS Module Config v3.5 c1.3.qfg +196 -196
  9. quarchpy/config_files/Cable_Modules/QTL1253-02 - Mini SAS Module Config v4.000 c1.3.qfg +198 -198
  10. quarchpy/config_files/Cable_Modules/QTL1253-xx - Mini SAS Module Config v4.003 c1.6.qfg +197 -197
  11. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v3.5 c1.2.qfg +188 -188
  12. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v4.000 c1.2.qfg +190 -190
  13. quarchpy/config_files/Cable_Modules/QTL1271-xx - Ethernet Module Config v4.100 c1.3.qfg +189 -189
  14. quarchpy/config_files/Cable_Modules/QTL1292-xx - SFP+ Cable Pull Module Config v4.000 c1.1.qfg +154 -154
  15. quarchpy/config_files/Cable_Modules/QTL1309-04 - USB 3.0 Module Config v4.003 c1.2.qfg +187 -187
  16. quarchpy/config_files/Cable_Modules/QTL1309-xx - USB 3.0 Module Config v3.5 c1.1.qfg +187 -187
  17. quarchpy/config_files/Cable_Modules/QTL1309-xx - USB 3.0 Module Config v4.000 c1.1.qfg +188 -188
  18. quarchpy/config_files/Cable_Modules/QTL1366-xx - QSFP Cable Pull Module Config v4.000 c1.1.qfg +209 -209
  19. quarchpy/config_files/Cable_Modules/QTL1383-xx - eSATAp Module Config v4.000 c1.3.qfg +190 -190
  20. quarchpy/config_files/Cable_Modules/QTL1521-02 - Mini SAS HD Module Config v4.000 c1.1.qfg +210 -210
  21. quarchpy/config_files/Cable_Modules/QTL1521-03 - Mini SAS HD Module Config v4.000 c1.1.qfg +210 -210
  22. quarchpy/config_files/Cable_Modules/QTL1521-05 - Mini SAS HD Module Config v4.005 c1.1.qfg +209 -209
  23. quarchpy/config_files/Cable_Modules/QTL1521-05 - Mini SAS HD Module Config v4.007 c1.2.qfg +209 -209
  24. quarchpy/config_files/Cable_Modules/QTL1521-xx - Mini SAS HD Module Config v4.003 c1.5.qfg +209 -209
  25. quarchpy/config_files/Cable_Modules/QTL1663-xx - Quad QSFP Cable Pull Module Config v4.000 c1.1.qfg +308 -308
  26. quarchpy/config_files/Cable_Modules/QTL1675-05 - Mini SAS HD Module w Triggering Config v4.007 c1.3.qfg +211 -211
  27. quarchpy/config_files/Cable_Modules/QTL1675-xx - Mini SAS HD Module w Triggering Config v4.000 c1.1.qfg +210 -210
  28. quarchpy/config_files/Cable_Modules/QTL1917-xx - Dual SFP+ Cable Pull Module Config v4.000 c1.1.qfg +174 -174
  29. quarchpy/config_files/Cable_Modules/QTL1971-01 - USB TypeC Module Config v4.000 c1.1.qfg +203 -203
  30. quarchpy/config_files/Cable_Modules/QTL1971-02 - USB TypeC Module Config v4.000 c1.1.qfg +203 -203
  31. quarchpy/config_files/Cable_Modules/QTL2022-xx - RJ-45 Cable Module Config v4.104 c1.3.QFG +189 -189
  32. quarchpy/config_files/Cable_Modules/QTL2058-xx - External PCIe Module Config v4.001 c1.1.qfg +209 -209
  33. quarchpy/config_files/Cable_Modules/QTL2138-01 - SFP28 Cable Pull Module Config v4.000 c1.1.qfg +154 -154
  34. quarchpy/config_files/Cable_Modules/QTL2146-01 - Gen4 OCuLink Cable Module Config v4.001 c1.1.qfg +212 -212
  35. quarchpy/config_files/Cable_Modules/QTL2162-01 - 24G mini SAS HD Cable Break Module Config v4.000 c1.qfg +209 -209
  36. quarchpy/config_files/Cable_Modules/QTL2171-01 - QSFP28 Cable Module Config v4.000 c1.qfg +198 -198
  37. quarchpy/config_files/Cable_Modules/QTL2171-02 - QSFP28 Cable Module Config v4.000 c1.qfg +198 -198
  38. quarchpy/config_files/Cable_Modules/QTL2341-01 - Gen4 External PCIe Cable Module v4.000.qfg +209 -209
  39. quarchpy/config_files/Cable_Modules/QTL2602-xx - Multiprotocol Link Breaker.qfg +178 -178
  40. quarchpy/config_files/Cable_Modules/QTL2834-xx - -48V DC Breaker Module v5.000 c1.0.qfg +177 -177
  41. quarchpy/config_files/Card_Modules/QTL1069-xx - SBB 2.0 Module Config v3.5 c1.1.qfg +366 -366
  42. quarchpy/config_files/Card_Modules/QTL1630-01 - PCIe Card Module v4.000 c1.0.qfg +280 -280
  43. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.004 c1.2.qfg +283 -283
  44. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.005 c1.2.qfg +283 -283
  45. quarchpy/config_files/Card_Modules/QTL1630-02 - PCIe Card Module Config v4.100 c1.4.qfg +284 -284
  46. quarchpy/config_files/Card_Modules/QTL1630-04 - PCIe Card Module Config v4.001 c1.1.qfg +287 -287
  47. quarchpy/config_files/Card_Modules/QTL1630-04 - PCIe Card Module Config v4.004 c1.2.qfg +287 -287
  48. quarchpy/config_files/Card_Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.004 c1.2.qfg +284 -284
  49. quarchpy/config_files/Card_Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.006 c1.3.qfg +285 -285
  50. quarchpy/config_files/Card_Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.001 c1.1.qfg +286 -286
  51. quarchpy/config_files/Card_Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.004 c1.2.qfg +288 -288
  52. quarchpy/config_files/Card_Modules/QTL1688-04 - PCIe Card Module w Triggering Config v4.005 c1.5.qfg +288 -288
  53. quarchpy/config_files/Card_Modules/QTL1688-05 - PCIe Card Module w Triggering Config v4.005 c1.qfg +288 -288
  54. quarchpy/config_files/Card_Modules/QTL1848-01 - PCIe Lite Card Module Config v4.000.qfg +122 -122
  55. quarchpy/config_files/Card_Modules/QTL1848-02 - PCIe Lite Card Module Config v4.000.qfg +134 -134
  56. quarchpy/config_files/Card_Modules/QTL1919-01 - PCIe x8 Card Module Config v4.001 c1.4.qfg +247 -247
  57. quarchpy/config_files/Card_Modules/QTL1920-01 - PCIe x8 Card Module w Triggering Config v4.000 c1.3.qfg +247 -247
  58. quarchpy/config_files/Card_Modules/QTL2019-xx - M.2 Horizontal Card Module Config v4.002 c1.1.qfg +219 -219
  59. quarchpy/config_files/Card_Modules/QTL2034-xx - M.2 M-Key Vertical Module Config v4.001 c1.1.qfg +221 -221
  60. quarchpy/config_files/Card_Modules/QTL2067-xx - PCIe SFF Module Config v4.000 c1.1.qfg +248 -248
  61. quarchpy/config_files/Card_Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.006 c1.4.qfg +256 -256
  62. quarchpy/config_files/Card_Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.007 c1.4.qfg +256 -256
  63. quarchpy/config_files/Card_Modules/QTL2073-01 - GEN3 PCIe Lite Card Module Config v4.001.qfg +134 -134
  64. quarchpy/config_files/Card_Modules/QTL2073-01 - PCIe Lite Card Module Config v4.000.qfg +134 -134
  65. quarchpy/config_files/Card_Modules/QTL2074-01 - GEN3 PCIe HS Card Module v4.005 c1.4.qfg +287 -287
  66. quarchpy/config_files/Card_Modules/QTL2074-01 - PCIe Card Module Config CurrentLimit v4.004 c1.2.qfg +287 -287
  67. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.1.qfg +287 -287
  68. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.3.qfg +277 -277
  69. quarchpy/config_files/Card_Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v5.000 c1.4.qfg +277 -277
  70. quarchpy/config_files/Card_Modules/QTL2094-01 - Sanblaze Dualport Riser Card Config v4.001 c1.1.qfg +223 -223
  71. quarchpy/config_files/Card_Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.000 c1.1.qfg +287 -287
  72. quarchpy/config_files/Card_Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.4.qfg +277 -277
  73. quarchpy/config_files/Card_Modules/QTL2135-xx - PCIe GEN4 Card Module w Triggering Config - Inrush Limit v4.001 c1.4.qfg +277 -277
  74. quarchpy/config_files/Card_Modules/QTL2161-01 - EDSFF x8 Module Config v4.000 c1.1.qfg +210 -210
  75. quarchpy/config_files/Card_Modules/QTL2171-xx - EDSFF x8 Module w Triggering Config 4.001 c1.1.qfg +213 -213
  76. quarchpy/config_files/Card_Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.000 c1.1.qfg +218 -218
  77. quarchpy/config_files/Card_Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.005 c1.5.qfg +218 -218
  78. quarchpy/config_files/Card_Modules/QTL2272-01 - GEN4 EDSFF x8 Module Config v4.000 c1.1.qfg +211 -211
  79. quarchpy/config_files/Card_Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.000 c1.1.qfg +212 -212
  80. quarchpy/config_files/Card_Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.002 c1.2.qfg +212 -212
  81. quarchpy/config_files/Card_Modules/QTL2318-01 - SANBlaze U.2 Rack Riser Card Config v4.000 c1.1.qfg +218 -218
  82. quarchpy/config_files/Card_Modules/QTL2322-03 - GEN4 M.2 M-Key Vertical Breaker Module Config v5.001 c1.3.qfg +220 -220
  83. quarchpy/config_files/Card_Modules/QTL2322-xx - GEN4 M.2 M-Key Vertical Breaker Module Config v5.000 c1.1.qfg +208 -208
  84. quarchpy/config_files/Card_Modules/QTL2334-xx - Gen4 EDSFF x4 Card Module Config v4.000 c1.1.qfg +187 -187
  85. quarchpy/config_files/Card_Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.000 c1.1.qfg +189 -189
  86. quarchpy/config_files/Card_Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.001 c1.2.qfg +190 -190
  87. quarchpy/config_files/Card_Modules/QTL2357-xx - PCIe GEN5 Card Module Config v5.000 c1.1.qfg +282 -282
  88. quarchpy/config_files/Card_Modules/QTL2358-xx - PCIe GEN5 Card Module w Triggering Config v5.000 c1.1.qfg +283 -283
  89. quarchpy/config_files/Card_Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.000 c1.1.qfg +215 -215
  90. quarchpy/config_files/Card_Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.001 c1.2.qfg +217 -217
  91. quarchpy/config_files/Card_Modules/QTL2395-01 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.000 c1.1.qfg +208 -208
  92. quarchpy/config_files/Card_Modules/QTL2395-02 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.qfg +220 -220
  93. quarchpy/config_files/Card_Modules/QTL2395-03 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.qfg +220 -220
  94. quarchpy/config_files/Card_Modules/QTL2396-xx - PCIe GEN5 Card Module w inrush Config v5.000 c1.1.qfg +282 -282
  95. quarchpy/config_files/Card_Modules/QTL2403-xx - Gen4 PCIe Lite Module Config v4.000.qfg +135 -135
  96. quarchpy/config_files/Card_Modules/QTL2515-xx - PCIe GEN4 Card Module w Triggering - Inrush Limit Config v4.001 c1.3.qfg +277 -277
  97. quarchpy/config_files/Card_Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.000.qfg +130 -130
  98. quarchpy/config_files/Card_Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.003.qfg +137 -137
  99. quarchpy/config_files/Card_Modules/QTL2658-xx - Gen5 PCIe Lite Module w Inrush Config v4.000.qfg +130 -130
  100. quarchpy/config_files/Card_Modules/QTL2661-xx - GEN5 PCIe U.3 Breaker Config w Triggering v5.000 c1.1.qfg +229 -229
  101. quarchpy/config_files/Card_Modules/QTL2662-xx - GEN5 PCIe U.3 Breaker Config v5.000 c1.1.qfg +228 -228
  102. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.000.qfg +230 -230
  103. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.001 c1.2.qfg +233 -233
  104. quarchpy/config_files/Card_Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker v5.000 c1.1.qfg +230 -230
  105. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker +Triggering Config v5.000.qfg +230 -230
  106. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering Config v5.001 c1.2.qfg +233 -233
  107. quarchpy/config_files/Card_Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering v5.000 c1.1.qfg +230 -230
  108. quarchpy/config_files/Card_Modules/QTL2766-xx - GEN4 EDSFF E1 x8 Breaker Config v5.000.qfg +253 -253
  109. quarchpy/config_files/Card_Modules/QTL2767-xx - GEN4 EDSFF E3 x8 Breaker Config v5.000.qfg +253 -253
  110. quarchpy/config_files/Card_Modules/QTL2768-xx - GEN4 EDSFF E3 2T x8 Breaker Config v5.000.qfg +253 -253
  111. quarchpy/config_files/Card_Modules/QTL2776-xx - GEN4 EDSFF E1 x8 Breaker +Triggering Config v5.000.qfg +253 -253
  112. quarchpy/config_files/Card_Modules/QTL2777-xx - GEN4 EDSFF E3 x8 Breaker +Triggering Config v5.000.qfg +253 -253
  113. quarchpy/config_files/Card_Modules/QTL2778-xx - GEN4 EDSFF E3 2T x8 Breaker +Triggering Config v5.000.qfg +253 -253
  114. quarchpy/config_files/Card_Modules/QTL2798-xx - PCIe GEN5 Card Module w Triggering w Inrush Limit Config v5.000 c1.1.qfg +283 -283
  115. quarchpy/config_files/Card_Modules/QTL2804-xx - GEN5 MCIO x4 to U.2 Breaker Config v5.000 c1.1.qfg +234 -234
  116. quarchpy/config_files/Card_Modules/QTL2805-xx - GEN5 MCIO x4 to U.2 Breaker + Triggering Config v5.000 c1.1.qfg +234 -234
  117. quarchpy/config_files/Card_Modules/QTL2814-xx - GEN5 AIC to U.2 Breaker + Triggering Config v5.000 c1.1 .qfg +233 -233
  118. quarchpy/config_files/Card_Modules/QTL2892-xx - GEN5 EDSFF E1 x4 Breaker.qfg +233 -233
  119. quarchpy/config_files/Card_Modules/QTL2925-xx - GEN5 EDSFF E1 x4 Breaker +Triggering.qfg +233 -233
  120. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v3.5 c1.5.qfg +198 -198
  121. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v4.000 c1.5.qfg +200 -200
  122. quarchpy/config_files/Drive_Modules/QTL1177-xx - HS Module Config v4.006 c1.8.qfg +199 -199
  123. quarchpy/config_files/Drive_Modules/QTL1215-xx - Lite Module Config v3.50.qfg +118 -118
  124. quarchpy/config_files/Drive_Modules/QTL1215-xx - Lite Module Config v4.000.qfg +118 -118
  125. quarchpy/config_files/Drive_Modules/QTL1301-xx - HS Lite Module Config v3.50.qfg +129 -129
  126. quarchpy/config_files/Drive_Modules/QTL1301-xx - HS Lite Module Config v4.000.qfg +129 -129
  127. quarchpy/config_files/Drive_Modules/QTL1429-01 - EMC HS Lite Module Config v4.000.qfg +129 -129
  128. quarchpy/config_files/Drive_Modules/QTL1429-02 - EMC HS Lite Module Config v4.002.qfg +120 -120
  129. quarchpy/config_files/Drive_Modules/QTL1623-03 - 12G HS Lite Module Config v4.001.qfg +128 -128
  130. quarchpy/config_files/Drive_Modules/QTL1623-04 - 12G HS Lite Module Config v4.001.qfg +128 -128
  131. quarchpy/config_files/Drive_Modules/QTL1680-xx - SCA2 Lite Module Config v4.001.qfg +135 -135
  132. quarchpy/config_files/Drive_Modules/QTL1689-01 - 12G HS Module Config v4.001 c1.1.qfg +199 -199
  133. quarchpy/config_files/Drive_Modules/QTL1689-04 - 12G HS Module Config v4.002 c1.1.qfg +196 -196
  134. quarchpy/config_files/Drive_Modules/QTL1689-05 - 12G HS Module Config v4.002 c1.1.qfg +196 -196
  135. quarchpy/config_files/Drive_Modules/QTL1743-02 - PCIe SFF Module Config v4.003 c1.3.qfg +222 -222
  136. quarchpy/config_files/Drive_Modules/QTL1743-02 - PCIe SFF Module Config v4.006 c1.4.qfg +213 -213
  137. quarchpy/config_files/Drive_Modules/QTL1743-xx - PCIe SFF Module Config v4.000 c1.1.qfg +221 -221
  138. quarchpy/config_files/Drive_Modules/QTL1753-xx - 12G Lite Module Config v4.000.qfg +116 -116
  139. quarchpy/config_files/Drive_Modules/QTL1921-01 - EMC 12G HS Lite Module Config v4.000.qfg +120 -120
  140. quarchpy/config_files/Drive_Modules/QTL2207-01 - GEN 4 PCIe U.2 Drive Module.qfg +217 -217
  141. quarchpy/config_files/Drive_Modules/QTL2207-02 - GEN 4 PCIe U.2 Drive Module v5.000.qfg +220 -220
  142. quarchpy/config_files/Drive_Modules/QTL2207-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.qfg +221 -221
  143. quarchpy/config_files/Drive_Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module v4.001.qfg +219 -219
  144. quarchpy/config_files/Drive_Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module.qfg +219 -219
  145. quarchpy/config_files/Drive_Modules/QTL2245-01 - GEN 4 PCIe U.3 HS Drive Module v4.000.qfg +223 -223
  146. quarchpy/config_files/Drive_Modules/QTL2245-xx - GEN 4 PCIe U.3 HS Drive Module.qfg +229 -229
  147. quarchpy/config_files/Drive_Modules/QTL2266-01 - GEN 4 PCIe SFF HS Drive Module Triggering.qfg +219 -219
  148. quarchpy/config_files/Drive_Modules/QTL2266-02 - GEN 4 PCIe SFF HS Drive Module Triggering v4.002.qfg +220 -220
  149. quarchpy/config_files/Drive_Modules/QTL2266-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.qfg +221 -221
  150. quarchpy/config_files/Drive_Modules/QTL2266-XX - GEN 4 PCIe SFF HS Drive Module Triggering.qfg +219 -219
  151. quarchpy/config_files/Drive_Modules/QTL2270-01 - GEN 4 PCIe U.3 HS Drive Module Triggering v4.000.qfg +225 -225
  152. quarchpy/config_files/Drive_Modules/QTL2270-xx - GEN 4 PCIe U.3 HS Drive Module Triggering.qfg +230 -230
  153. quarchpy/config_files/Drive_Modules/QTL2542-02 - 24G SAS Drive Breaker Module v5.001.qfg +194 -194
  154. quarchpy/config_files/Drive_Modules/QTL2542-xx - 24G SAS Drive Breaker v5.000 c1.1.qfg +194 -194
  155. quarchpy/config_files/Drive_Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.000 c1.1.qfg +195 -195
  156. quarchpy/config_files/Drive_Modules/QTL2602-xx - Multiprotocol Link Breaker.qfg +178 -178
  157. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.000.qfg +227 -227
  158. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.001.qfg +227 -227
  159. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.003.qfg +227 -227
  160. quarchpy/config_files/Drive_Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.007.qfg +229 -229
  161. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.000.qfg +228 -228
  162. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.001.qfg +228 -228
  163. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.003.qfg +228 -228
  164. quarchpy/config_files/Drive_Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module v5.007.qfg +230 -230
  165. quarchpy/config_files/Drive_Modules/QTL2661-xx - Gen5 U.3 Drive Module + Triggering v5.000.qfg +229 -229
  166. quarchpy/config_files/Drive_Modules/QTL2662-xx - Gen5 PCIe U.3 Drive Module v5.000.qfg +228 -228
  167. quarchpy/config_files/Drive_Modules/QTL2757-xx - Gen5 SFF Lite Breaker Module Config v4.000.qfg +140 -140
  168. quarchpy/config_files/Drive_Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.qfg +253 -253
  169. quarchpy/config_files/Drive_Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker v5.001.qfg +234 -234
  170. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.001.qfg +234 -234
  171. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.002.qfg +253 -253
  172. quarchpy/config_files/Drive_Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.qfg +253 -253
  173. quarchpy/config_files/Drive_Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker v5.001 c1.2.qfg +230 -230
  174. quarchpy/config_files/Drive_Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker with Triggering v5.002 c1.3.qfg +253 -253
  175. quarchpy/config_files/Drive_Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker with Triggering v5.001 c1.2.qfg +230 -230
  176. quarchpy/config_files/Drive_Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker with Triggering v5.002 c1.3.qfg +253 -253
  177. quarchpy/config_files/Drive_Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.001.qfg +233 -233
  178. quarchpy/config_files/Drive_Modules/Standard Drive Module Config v3.5 c1.1.qfg +171 -171
  179. quarchpy/config_files/Power_Margining/HD/QTL1944-xx - HD Power Module v5.000.qfg +123 -123
  180. quarchpy/config_files/Power_Margining/HD/QTL1944-xx - HD Power Module v5.003.qfg +124 -124
  181. quarchpy/config_files/Power_Margining/HD/QTL1995-xx - x6 HD Power Module v5.002.qfg +122 -122
  182. quarchpy/config_files/Power_Margining/HD/QTL1995-xx - x6 HD Power Module v5.003.qfg +123 -123
  183. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v5.002.qfg +122 -122
  184. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v5.003.qfg +123 -123
  185. quarchpy/config_files/Power_Margining/HD/QTL1999-xx - Single HD Power Module v6.000.qfg +124 -124
  186. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.101.qfg +78 -78
  187. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.200.qfg +80 -80
  188. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Power Margining Module v4.201.qfg +82 -82
  189. quarchpy/config_files/Power_Margining/PPM/QTL1455-02 - Test Power Margining Module v4.004.qfg +73 -73
  190. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.101.qfg +78 -78
  191. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.200.qfg +80 -80
  192. quarchpy/config_files/Power_Margining/PPM/QTL1658-01 - Power Margining Module w. Triggering v4.201.qfg +82 -82
  193. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.105.qfg +78 -78
  194. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.200.qfg +80 -80
  195. quarchpy/config_files/Power_Margining/PPM/QTL1727-01 - 3v3 Power Margining Module w. Triggering v4.201.qfg +82 -82
  196. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.105.qfg +78 -78
  197. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.200.qfg +80 -80
  198. quarchpy/config_files/Power_Margining/PPM/QTL1730-01 - 3v3 Power Margining Module v4.201.qfg +82 -82
  199. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.000.qfg +80 -80
  200. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.200.qfg +81 -81
  201. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.202.qfg +87 -87
  202. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.210.qfg +88 -88
  203. quarchpy/config_files/Power_Margining/XLC/QTL1824-01 - Power Margining Module V2 - Triggering v4.211.qfg +121 -121
  204. quarchpy/config_files/Power_Margining/XLC/QTL1824-03 - Power Margining Module V2 - Triggering v4.213.qfg +121 -121
  205. quarchpy/config_files/Power_Margining/XLC/QTL1847-01 - Power Margining Module V2 v4.213.qfg +121 -121
  206. quarchpy/config_files/Switch_Modules/QTL1390-xx - 4-8 SATA MUX Module Config v4.002.qfg +186 -186
  207. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.002.qfg +147 -147
  208. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.003.qfg +147 -147
  209. quarchpy/config_files/Switch_Modules/QTL1443-xx - 1-8 USB3 MUX Module Config v4.100.qfg +147 -147
  210. quarchpy/config_files/Switch_Modules/QTL1449-xx - 1-8 PCIe MUX Module Config v4.000.qfg +145 -145
  211. quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4.003 c1.6.qfg +194 -194
  212. quarchpy/config_files/Switch_Modules/QTL1490-xx - SATA Keyed HS Module Config v4.006 c1.8.qfg +193 -193
  213. quarchpy/config_files/Switch_Modules/QTL1530-xx - 1-8 DP MUX Module Config v4.000.qfg +145 -145
  214. quarchpy/config_files/Switch_Modules/QTL1564-xx - 12 Port Mini SAS HD MUX Module Config v4.000.qfg +184 -184
  215. quarchpy/config_files/Switch_Modules/QTL1584-xx - 1-4 ExpressCard MUX Module Config v4.000.qfg +81 -81
  216. quarchpy/config_files/__pycache__/__init__.cpython-310.pyc +0 -0
  217. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-310.pyc +0 -0
  218. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-310.pyc +0 -0
  219. quarchpy/connection_specific/__pycache__/__init__.cpython-310.pyc +0 -0
  220. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-310.pyc +0 -0
  221. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-310.pyc +0 -0
  222. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-310.pyc +0 -0
  223. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-310.pyc +0 -0
  224. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-310.pyc +0 -0
  225. quarchpy/connection_specific/__pycache__/connection_USB.cpython-310.pyc +0 -0
  226. quarchpy/connection_specific/__pycache__/mDNS.cpython-310.pyc +0 -0
  227. quarchpy/connection_specific/jdk_jres/__pycache__/__init__.cpython-310.pyc +0 -0
  228. quarchpy/connection_specific/jdk_jres/__pycache__/fix_permissions.cpython-310.pyc +0 -0
  229. quarchpy/connection_specific/jdk_jres/fix_permissions.py +69 -69
  230. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-310.pyc +0 -0
  231. quarchpy/connection_specific/serial/__pycache__/serialposix.cpython-310.pyc +0 -0
  232. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-310.pyc +0 -0
  233. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-310.pyc +0 -0
  234. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-310.pyc +0 -0
  235. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-310.pyc +0 -0
  236. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_linux.cpython-310.pyc +0 -0
  237. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_posix.cpython-310.pyc +0 -0
  238. quarchpy/connection_specific/usb_libs/usb1.py +2360 -2360
  239. quarchpy/debug/__pycache__/SystemTest.cpython-310.pyc +0 -0
  240. quarchpy/debug/__pycache__/__init__.cpython-310.pyc +0 -0
  241. quarchpy/debug/__pycache__/versionCompare.cpython-310.pyc +0 -0
  242. quarchpy/device/__pycache__/__init__.cpython-310.pyc +0 -0
  243. quarchpy/device/__pycache__/device.cpython-310.pyc +0 -0
  244. quarchpy/device/__pycache__/device_fixture_idn_info.cpython-310.pyc +0 -0
  245. quarchpy/device/__pycache__/device_idn_info.cpython-310.pyc +0 -0
  246. quarchpy/device/__pycache__/device_network_info.cpython-310.pyc +0 -0
  247. quarchpy/device/__pycache__/discovered_device.cpython-310.pyc +0 -0
  248. quarchpy/device/__pycache__/packet_processing.cpython-310.pyc +0 -0
  249. quarchpy/device/__pycache__/quarchArray.cpython-310.pyc +0 -0
  250. quarchpy/device/__pycache__/quarchPPM.cpython-310.pyc +0 -0
  251. quarchpy/device/__pycache__/quarchQPS.cpython-310.pyc +0 -0
  252. quarchpy/device/__pycache__/scanDevices.cpython-310.pyc +0 -0
  253. quarchpy/device/device_fixture_idn_info.py +8 -8
  254. quarchpy/device/device_idn_info.py +100 -100
  255. quarchpy/device/device_network_info.py +17 -17
  256. quarchpy/device/discovered_device.py +150 -150
  257. quarchpy/device/packet_processing.py +87 -87
  258. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-310.pyc +0 -0
  259. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-310.pyc +0 -0
  260. quarchpy/disk_test/__pycache__/__init__.cpython-310.pyc +0 -0
  261. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-310.pyc +0 -0
  262. quarchpy/docs/CHANGES.rst +470 -466
  263. quarchpy/docs/Makefile +20 -20
  264. quarchpy/docs/_build/doctrees/CHANGES.doctree +0 -0
  265. quarchpy/docs/_build/doctrees/environment.pickle +0 -0
  266. quarchpy/docs/_build/doctrees/index.doctree +0 -0
  267. quarchpy/docs/_build/doctrees/readme.doctree +0 -0
  268. quarchpy/docs/_build/doctrees/source/changelog.doctree +0 -0
  269. quarchpy/docs/_build/doctrees/source/licenses.doctree +0 -0
  270. quarchpy/docs/_build/doctrees/source/modules.doctree +0 -0
  271. quarchpy/docs/_build/doctrees/source/quarchpy.calibration.doctree +0 -0
  272. quarchpy/docs/_build/doctrees/source/quarchpy.config_files.doctree +0 -0
  273. quarchpy/docs/_build/doctrees/source/quarchpy.connection_specific.doctree +0 -0
  274. quarchpy/docs/_build/doctrees/source/quarchpy.debug.doctree +0 -0
  275. quarchpy/docs/_build/doctrees/source/quarchpy.device.doctree +0 -0
  276. quarchpy/docs/_build/doctrees/source/quarchpy.disk_test.doctree +0 -0
  277. quarchpy/docs/_build/doctrees/source/quarchpy.doctree +0 -0
  278. quarchpy/docs/_build/doctrees/source/quarchpy.fio.doctree +0 -0
  279. quarchpy/docs/_build/doctrees/source/quarchpy.iometer.doctree +0 -0
  280. quarchpy/docs/_build/doctrees/source/quarchpy.qis.doctree +0 -0
  281. quarchpy/docs/_build/doctrees/source/quarchpy.qps.doctree +0 -0
  282. quarchpy/docs/_build/doctrees/source/quarchpy.user_interface.doctree +0 -0
  283. quarchpy/docs/_build/doctrees/source/quarchpy.utilities.doctree +0 -0
  284. quarchpy/docs/_build/doctrees/source/readme.doctree +0 -0
  285. quarchpy/docs/_build/html/.buildinfo +4 -4
  286. quarchpy/docs/_build/html/CHANGES.html +703 -660
  287. quarchpy/docs/_build/html/_sources/CHANGES.rst.txt +468 -439
  288. quarchpy/docs/_build/html/_sources/index.rst.txt +23 -23
  289. quarchpy/docs/_build/html/_sources/readme.rst.txt +41 -41
  290. quarchpy/docs/_build/html/_sources/source/modules.rst.txt +7 -7
  291. quarchpy/docs/_build/html/_sources/source/quarchpy.calibration.rst.txt +78 -78
  292. quarchpy/docs/_build/html/_sources/source/quarchpy.config_files.rst.txt +22 -22
  293. quarchpy/docs/_build/html/_sources/source/quarchpy.connection_specific.rst.txt +76 -76
  294. quarchpy/docs/_build/html/_sources/source/quarchpy.debug.rst.txt +38 -38
  295. quarchpy/docs/_build/html/_sources/source/quarchpy.device.rst.txt +54 -54
  296. quarchpy/docs/_build/html/_sources/source/quarchpy.disk_test.rst.txt +126 -126
  297. quarchpy/docs/_build/html/_sources/source/quarchpy.fio.rst.txt +30 -30
  298. quarchpy/docs/_build/html/_sources/source/quarchpy.iometer.rst.txt +22 -22
  299. quarchpy/docs/_build/html/_sources/source/quarchpy.qis.rst.txt +22 -22
  300. quarchpy/docs/_build/html/_sources/source/quarchpy.qps.rst.txt +22 -22
  301. quarchpy/docs/_build/html/_sources/source/quarchpy.rst.txt +50 -50
  302. quarchpy/docs/_build/html/_sources/source/quarchpy.user_interface.rst.txt +22 -22
  303. quarchpy/docs/_build/html/_sources/source/quarchpy.utilities.rst.txt +22 -22
  304. quarchpy/docs/_build/html/_static/alabaster.css +662 -662
  305. quarchpy/docs/_build/html/_static/basic.css +905 -913
  306. quarchpy/docs/_build/html/_static/custom.css +1 -1
  307. quarchpy/docs/_build/html/_static/doctools.js +149 -149
  308. quarchpy/docs/_build/html/_static/documentation_options.js +12 -12
  309. quarchpy/docs/_build/html/_static/jquery-3.4.1.js +10598 -10598
  310. quarchpy/docs/_build/html/_static/jquery.js +2 -2
  311. quarchpy/docs/_build/html/_static/language_data.js +192 -192
  312. quarchpy/docs/_build/html/_static/pygments.css +84 -84
  313. quarchpy/docs/_build/html/_static/searchtools.js +635 -632
  314. quarchpy/docs/_build/html/_static/sphinx_highlight.js +154 -154
  315. quarchpy/docs/_build/html/_static/underscore-1.3.1.js +999 -999
  316. quarchpy/docs/_build/html/_static/underscore.js +5 -5
  317. quarchpy/docs/_build/html/genindex.html +1864 -1626
  318. quarchpy/docs/_build/html/index.html +221 -214
  319. quarchpy/docs/_build/html/objects.inv +0 -0
  320. quarchpy/docs/_build/html/py-modindex.html +300 -300
  321. quarchpy/docs/_build/html/readme.html +137 -137
  322. quarchpy/docs/_build/html/search.html +123 -123
  323. quarchpy/docs/_build/html/searchindex.js +1 -1
  324. quarchpy/docs/_build/html/source/changelog.html +789 -739
  325. quarchpy/docs/_build/html/source/licenses.html +181 -181
  326. quarchpy/docs/_build/html/source/modules.html +222 -222
  327. quarchpy/docs/_build/html/source/quarchpy.calibration.html +147 -147
  328. quarchpy/docs/_build/html/source/quarchpy.config_files.html +136 -136
  329. quarchpy/docs/_build/html/source/quarchpy.connection_specific.html +1063 -729
  330. quarchpy/docs/_build/html/source/quarchpy.debug.html +241 -251
  331. quarchpy/docs/_build/html/source/quarchpy.device.html +4033 -1165
  332. quarchpy/docs/_build/html/source/quarchpy.disk_test.html +220 -220
  333. quarchpy/docs/_build/html/source/quarchpy.fio.html +218 -218
  334. quarchpy/docs/_build/html/source/quarchpy.html +817 -715
  335. quarchpy/docs/_build/html/source/quarchpy.iometer.html +271 -271
  336. quarchpy/docs/_build/html/source/quarchpy.qis.html +976 -640
  337. quarchpy/docs/_build/html/source/quarchpy.qps.html +186 -186
  338. quarchpy/docs/_build/html/source/quarchpy.user_interface.html +278 -278
  339. quarchpy/docs/_build/html/source/quarchpy.utilities.html +228 -211
  340. quarchpy/docs/_build/html/source/readme.html +147 -147
  341. quarchpy/docs/conf.py +56 -56
  342. quarchpy/docs/index.rst +23 -23
  343. quarchpy/docs/make.bat +35 -35
  344. quarchpy/docs/readme.rst +41 -41
  345. quarchpy/docs/source/modules.rst +7 -7
  346. quarchpy/docs/source/quarchpy.calibration.rst +78 -78
  347. quarchpy/docs/source/quarchpy.config_files.rst +22 -22
  348. quarchpy/docs/source/quarchpy.connection_specific.rst +76 -76
  349. quarchpy/docs/source/quarchpy.debug.rst +38 -38
  350. quarchpy/docs/source/quarchpy.device.rst +54 -54
  351. quarchpy/docs/source/quarchpy.disk_test.rst +126 -126
  352. quarchpy/docs/source/quarchpy.fio.rst +30 -30
  353. quarchpy/docs/source/quarchpy.iometer.rst +22 -22
  354. quarchpy/docs/source/quarchpy.qis.rst +22 -22
  355. quarchpy/docs/source/quarchpy.qps.rst +22 -22
  356. quarchpy/docs/source/quarchpy.rst +50 -50
  357. quarchpy/docs/source/quarchpy.user_interface.rst +22 -22
  358. quarchpy/docs/source/quarchpy.utilities.rst +22 -22
  359. quarchpy/fio/HIDEtest_performance_class.py +533 -533
  360. quarchpy/fio/__pycache__/FIO_interface.cpython-310.pyc +0 -0
  361. quarchpy/fio/__pycache__/__init__.cpython-310.pyc +0 -0
  362. quarchpy/install_qps.py +347 -347
  363. quarchpy/iometer/__pycache__/__init__.cpython-310.pyc +0 -0
  364. quarchpy/iometer/__pycache__/{gen_iometer_template.cpython-312.pyc → gen_iometer_template.cpython-310.pyc} +0 -0
  365. quarchpy/iometer/__pycache__/iometerFuncs.cpython-310.pyc +0 -0
  366. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-310.pyc +0 -0
  367. quarchpy/qis/__pycache__/__init__.cpython-310.pyc +0 -0
  368. quarchpy/qis/__pycache__/qisFuncs.cpython-310.pyc +0 -0
  369. quarchpy/qps/__pycache__/__init__.cpython-310.pyc +0 -0
  370. quarchpy/qps/__pycache__/qpsFuncs.cpython-310.pyc +0 -0
  371. quarchpy/qps/qpsFuncs.py +8 -19
  372. quarchpy/user_interface/__pycache__/__init__.cpython-310.pyc +0 -0
  373. quarchpy/user_interface/__pycache__/user_interface.cpython-310.pyc +0 -0
  374. quarchpy/utilities/__pycache__/TestCenter.cpython-310.pyc +0 -0
  375. quarchpy/utilities/__pycache__/TimeValue.cpython-310.pyc +0 -0
  376. quarchpy/utilities/__pycache__/__init__.cpython-310.pyc +0 -0
  377. {quarchpy-2.2.13.dev1.dist-info → quarchpy-2.2.14.dist-info}/METADATA +495 -491
  378. quarchpy-2.2.14.dist-info/RECORD +477 -0
  379. {quarchpy-2.2.13.dev1.dist-info → quarchpy-2.2.14.dist-info}/WHEEL +1 -1
  380. quarchpy/.idea/.gitignore +0 -3
  381. quarchpy/.idea/inspectionProfiles/Project_Default.xml +0 -46
  382. quarchpy/.idea/inspectionProfiles/profiles_settings.xml +0 -6
  383. quarchpy/.idea/misc.xml +0 -7
  384. quarchpy/.idea/quarchpy.iml +0 -7
  385. quarchpy/.idea/vcs.xml +0 -6
  386. quarchpy/.idea/workspace.xml +0 -63
  387. quarchpy/__pycache__/__init__.cpython-311.pyc +0 -0
  388. quarchpy/__pycache__/__init__.cpython-312.pyc +0 -0
  389. quarchpy/__pycache__/__init__.cpython-313.pyc +0 -0
  390. quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
  391. quarchpy/__pycache__/_version.cpython-312.pyc +0 -0
  392. quarchpy/__pycache__/_version.cpython-313.pyc +0 -0
  393. quarchpy/__pycache__/connection.cpython-311.pyc +0 -0
  394. quarchpy/__pycache__/connection.cpython-312.pyc +0 -0
  395. quarchpy/__pycache__/connection.cpython-313.pyc +0 -0
  396. quarchpy/__pycache__/run.cpython-311.pyc +0 -0
  397. quarchpy/__pycache__/run.cpython-312.pyc +0 -0
  398. quarchpy/config_files/__pycache__/__init__.cpython-311.pyc +0 -0
  399. quarchpy/config_files/__pycache__/__init__.cpython-312.pyc +0 -0
  400. quarchpy/config_files/__pycache__/__init__.cpython-313.pyc +0 -0
  401. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-311.pyc +0 -0
  402. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-312.pyc +0 -0
  403. quarchpy/config_files/__pycache__/quarch_config_parser.cpython-313.pyc +0 -0
  404. quarchpy/connection_specific/QPS/3rdPartyLicenses/Material-Icons-license.txt +0 -51
  405. quarchpy/connection_specific/QPS/3rdPartyLicenses/argparse4j-LICENSE.txt +0 -23
  406. quarchpy/connection_specific/QPS/3rdPartyLicenses/com.sun.istack-license.html +0 -59
  407. quarchpy/connection_specific/QPS/3rdPartyLicenses/commons-io-LICENSE-2.0.txt +0 -202
  408. quarchpy/connection_specific/QPS/3rdPartyLicenses/controlsfx-license.txt +0 -29
  409. quarchpy/connection_specific/QPS/3rdPartyLicenses/gson-license.txt +0 -202
  410. quarchpy/connection_specific/QPS/3rdPartyLicenses/guava-license.txt +0 -202
  411. quarchpy/connection_specific/QPS/3rdPartyLicenses/jakarta.activation-license.html +0 -59
  412. quarchpy/connection_specific/QPS/3rdPartyLicenses/jakarta.xml.bind-api-license.html +0 -59
  413. quarchpy/connection_specific/QPS/3rdPartyLicenses/jfx-license.txt +0 -347
  414. quarchpy/connection_specific/QPS/3rdPartyLicenses/log4j-license.txt +0 -202
  415. quarchpy/connection_specific/QPS/3rdPartyLicenses/netty-LICENSE.txt +0 -202
  416. quarchpy/connection_specific/QPS/3rdPartyLicenses/netty-NOTICE.txt +0 -239
  417. quarchpy/connection_specific/QPS/3rdPartyLicenses/nsmenufx-LICENSE.txt +0 -24
  418. quarchpy/connection_specific/QPS/3rdPartyLicenses/slf4j-LICENSE.txt +0 -24
  419. quarchpy/connection_specific/QPS/DeviceConfig/QTL1995-02.xml +0 -280
  420. quarchpy/connection_specific/QPS/DeviceConfig/QTL1999-02.xml +0 -292
  421. quarchpy/connection_specific/QPS/DeviceConfig/QTL2312-01.xml +0 -193
  422. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1253-01 - Mini SAS Module Config v3.5 c1.3.xml +0 -597
  423. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1253-01 - Mini SAS Module Config v4.000 c1.3.xml +0 -597
  424. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1253-02 - Mini SAS Module Config v3.5 c1.3.xml +0 -597
  425. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1253-02 - Mini SAS Module Config v4.000 c1.3.xml +0 -597
  426. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1253-xx - Mini SAS Module Config v4.003 c1.6.xml +0 -599
  427. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v3.5 c1.2.xml +0 -533
  428. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v4.000 c1.2.xml +0 -533
  429. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1271-xx - Ethernet Module Config v4.100 c1.3.xml +0 -535
  430. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1292-xx - SFP+ Cable Pull Module Config v4.000 c1.1.xml +0 -449
  431. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1309-04 - USB 3.0 Module Config v4.003 c1.2.xml +0 -530
  432. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1309-xx - USB 3.0 Module Config v3.5 c1.1.xml +0 -528
  433. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1309-xx - USB 3.0 Module Config v4.000 c1.1.xml +0 -528
  434. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1366-xx - QSFP Cable Pull Module Config v4.000 c1.1.xml +0 -684
  435. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1383-xx - eSATAp Module Config v4.000 c1.3.xml +0 -542
  436. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1521-02 - Mini SAS HD Module Config v4.000 c1.1.xml +0 -670
  437. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1521-03 - Mini SAS HD Module Config v4.000 c1.1.xml +0 -670
  438. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1521-05 - Mini SAS HD Module Config v4.005 c1.1.xml +0 -672
  439. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1521-05 - Mini SAS HD Module Config v4.007 c1.2.xml +0 -672
  440. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1521-xx - Mini SAS HD Module Config v4.003 c1.5.xml +0 -672
  441. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1663-xx - Quad QSFP Cable Pull Module Config v4.000 c1.1.xml +0 -1523
  442. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1675-05 - Mini SAS HD Module w Triggering Config v4.007 c1.3.xml +0 -673
  443. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1675-xx - Mini SAS HD Module w Triggering Config v4.000 c1.1.xml +0 -673
  444. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1917-xx - Dual SFP+ Cable Pull Module Config v4.000 c1.1.xml +0 -614
  445. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1971-01 - USB TypeC Module Config v4.000 c1.1.xml +0 -637
  446. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL1971-02 - USB TypeC Module Config v4.000 c1.1.xml +0 -641
  447. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2022-xx - RJ-45 Cable Module Config v4.104 c1.3.xml +0 -535
  448. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2058-xx - External PCIe Module Config v4.001 c1.1.xml +0 -696
  449. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2138-01 - SFP28 Cable Pull Module Config v4.000 c1.1.xml +0 -449
  450. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2146-01 - Gen4 OCuLink Cable Module Config v4.001 c1.1.xml +0 -718
  451. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2162-01 - 24G mini SAS HD Cable Break Module Config v4.000 c1.xml +0 -672
  452. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2171-01 - QSFP28 Cable Module Config v4.000 c1.xml +0 -583
  453. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2171-02 - QSFP28 Cable Module Config v4.000 c1.xml +0 -583
  454. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2341-01 - Gen4 External PCIe Cable Module v4.000.xml +0 -625
  455. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2602-xx - Multiprotocol Link Breaker.xml +0 -414
  456. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL2834-xx - -48V DC Breaker Module v5.000 c1.0.xml +0 -374
  457. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Cable Modules/QTL3000-xx - RJ-45 Cable Module v5.000 c1.4.xml +0 -539
  458. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1069-xx - SBB 2.0 Module Config v3.5 c1.1.xml +0 -1614
  459. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1630-01 - PCIe Card Module v4.000 c1.0.xml +0 -1271
  460. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.004 c1.2.xml +0 -1289
  461. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.005 c1.2.xml +0 -1289
  462. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1630-02 - PCIe Card Module Config v4.100 c1.4.xml +0 -1290
  463. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1630-04 - PCIe Card Module Config v4.001 c1.1.xml +0 -1297
  464. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1630-04 - PCIe Card Module Config v4.004 c1.2.xml +0 -1301
  465. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.004 c1.2.xml +0 -1290
  466. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1688-01 - PCIe Card Module w Triggering Config v4.006 c1.3.xml +0 -1291
  467. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.001 c1.1.xml +0 -1298
  468. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1688-03 - PCIe Card Module w Triggering Config v4.004 c1.2.xml +0 -1302
  469. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1688-04 - PCIe Card Module w Triggering Config v4.005 c1.5.xml +0 -1307
  470. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1688-05 - PCIe Card Module w Triggering Config v4.005 c1.xml +0 -1307
  471. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1848-01 - PCIe Lite Card Module Config v4.000.xml +0 -219
  472. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1848-02 - PCIe Lite Card Module Config v4.000.xml +0 -286
  473. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1919-01 - PCIe x8 Card Module Config v4.001 c1.4.xml +0 -965
  474. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL1920-01 - PCIe x8 Card Module w Triggering Config v4.000 c1.3.xml +0 -966
  475. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2019-xx - M.2 Horizontal Card Module Config v4.002 c1.1.xml +0 -703
  476. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2034-xx - M.2 M-Key Vertical Module Config v4.001 c1.1.xml +0 -737
  477. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2067-xx - PCIe SFF Module Config v4.000 c1.1.xml +0 -971
  478. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.006 c1.4.xml +0 -1020
  479. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2067-xx - Sanblaze 2 Drive Riser Card Config v4.007 c1.4.xml +0 -1022
  480. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2073-01 - GEN3 PCIe Lite Card Module Config v4.001.xml +0 -286
  481. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2073-01 - PCIe Lite Card Module Config v4.000.xml +0 -286
  482. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2074-01 - GEN3 PCIe HS Card Module v4.005 c1.4.xml +0 -1301
  483. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2074-01 - PCIe Card Module Config CurrentLimit v4.004 c1.2.xml +0 -1301
  484. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.1.xml +0 -1307
  485. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.3.xml +0 -1212
  486. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2087-xx - PCIe GEN4 Card Module w Triggering Config v5.000 c1.4.xml +0 -1212
  487. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2094-01 - Sanblaze Dualport Riser Card Config v4.001 c1.1.xml +0 -773
  488. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.000 c1.1.xml +0 -1306
  489. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2128-xx - PCIe GEN4 Card Module w Triggering Config v4.001 c1.4.xml +0 -1211
  490. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2135-xx - PCIe GEN4 Card Module w Triggering Config - Inrush Limit v4.001 c1.4.xml +0 -1211
  491. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2161-01 - EDSFF x8 Module Config v4.000 c1.1.xml +0 -773
  492. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2171-xx - EDSFF x8 Module w Triggering Config 4.001 c1.1.xml +0 -785
  493. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.000 c1.1.xml +0 -715
  494. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2203-01 - Sanblaze Dualport Rack Riser Card Config v4.005 c1.5.xml +0 -715
  495. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2272-01 - GEN4 EDSFF x8 Module Config v4.000 c1.1.xml +0 -771
  496. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.000 c1.1.xml +0 -666
  497. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2282-01 - Sanblaze Singleport Rack Riser Card Config v4.002 c1.2.xml +0 -666
  498. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2318-01 - SANBlaze U.2 Rack Riser Card Config v4.000 c1.1.xml +0 -715
  499. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2322-03 - GEN4 M.2 M-Key Vertical Breaker Module Config v5.001 c1.3.xml +0 -738
  500. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2322-xx - GEN4 M.2 M-Key Vertical Breaker Module Config v5.000 c1.1.xml +0 -637
  501. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2334-xx - Gen4 EDSFF x4 Card Module Config v4.000 c1.1.xml +0 -615
  502. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.000 c1.1.xml +0 -621
  503. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2351-xx - GEN4 EDSFF x4 Card Module +Triggering Config v4.001 c1.2.xml +0 -624
  504. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2357-xx - PCIe GEN5 Card Module Config v5.000 c1.1.xml +0 -1242
  505. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2358-xx - PCIe GEN5 Card Module w Triggering Config v5.000 c1.1.xml +0 -1250
  506. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.000 c1.1.xml +0 -682
  507. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2378-xx - SANBlaze U.3 Rack Riser Card Config v4.001 c1.2.xml +0 -698
  508. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2395-01 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.000 c1.1.xml +0 -647
  509. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2395-02 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.xml +0 -742
  510. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2395-03 - GEN4 M.2 M-Key Vertical Breaker Module w Triggering Config v5.001 c1.3.xml +0 -742
  511. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2396-xx - PCIe GEN5 Card Module w inrush Config v5.000 c1.1.xml +0 -1242
  512. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2403-xx - Gen4 PCIe Lite Module Config v4.000.xml +0 -293
  513. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2515-xx - PCIe GEN4 Card Module w Triggering - Inrush Limit Config v4.001 c1.3.xml +0 -1212
  514. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.000.xml +0 -259
  515. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2652-xx - Gen5 PCIe Lite Module Config v4.003.xml +0 -288
  516. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2658-xx - Gen5 PCIe Lite Module w Inrush Config v4.000.xml +0 -259
  517. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2661-xx - GEN5 PCIe U.3 Breaker Config w Triggering v5.000 c1.1.xml +0 -813
  518. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2662-xx - GEN5 PCIe U.3 Breaker Config v5.000 c1.1.xml +0 -801
  519. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.000.xml +0 -741
  520. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.001 c1.2.xml +0 -799
  521. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker Config v5.002 c1.4.xml +0 -743
  522. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2686-xx - Gen5 EDSFF E3 x4 Breaker v5.000 c1.1.xml +0 -741
  523. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker +Triggering Config v5.000.xml +0 -742
  524. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering Config v5.001 c1.2.xml +0 -800
  525. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2692-xx - Gen5 EDSFF E3 x4 Breaker w Triggering v5.000 c1.1.xml +0 -742
  526. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2766-xx - GEN4 EDSFF E1 x8 Breaker Config v5.000.xml +0 -982
  527. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2767-xx - GEN4 EDSFF E3 x8 Breaker Config v5.000.xml +0 -982
  528. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2768-xx - GEN4 EDSFF E3 2T x8 Breaker Config v5.000.xml +0 -982
  529. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2776-xx - GEN4 EDSFF E1 x8 Breaker +Triggering Config v5.000.xml +0 -983
  530. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2777-xx - GEN4 EDSFF E3 x8 Breaker +Triggering Config v5.000.xml +0 -983
  531. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2778-xx - GEN4 EDSFF E3 2T x8 Breaker +Triggering Config v5.000.xml +0 -983
  532. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2798-xx - PCIe GEN5 Card Module w Triggering w Inrush Limit Config v5.000 c1.1.xml +0 -1250
  533. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2804-xx - GEN5 MCIO x4 to U.2 Breaker Config v5.000 c1.1.xml +0 -813
  534. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2805-xx - GEN5 MCIO x4 to U.2 Breaker + Triggering Config v5.000 c1.1.xml +0 -814
  535. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2813-xx - Gen5 AIC to U.2 Breaker v5.002 c1.3.xml +0 -871
  536. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2814-xx - GEN5 AIC to U.2 Breaker + Triggering Config v5.000 c1.1 .xml +0 -807
  537. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2814-xx - Gen5 AIC to U.2 Breaker + Triggering Config v5.002 c1.3.xml +0 -872
  538. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2892-xx - GEN5 EDSFF E1 x4 Breaker.xml +0 -799
  539. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2901-xx - GEN5 M.2 M-Key Horizontal Breaker Config v5.000 c1.1.xml +0 -753
  540. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2902-xx - GEN5 M.2 M-Key Horizontal Breaker w Triggering Config v5.000 c1.1.xml +0 -762
  541. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2902-xx- -Gen5 M.2 Horizontal Breaker +Triggering Config 5.000 c1.1.xml +0 -762
  542. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2925-xx - GEN5 EDSFF E1 x4 Breaker +Triggering.xml +0 -800
  543. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Card Modules/QTL2954-01 - fake delete.xml +0 -947
  544. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1177-xx - HS Module Config v3.5 c1.5.xml +0 -592
  545. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1177-xx - HS Module Config v4.000 c1.5.xml +0 -592
  546. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1177-xx - HS Module Config v4.006 c1.8.xml +0 -594
  547. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1215-xx - Lite Module Config v3.50.xml +0 -203
  548. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1215-xx - Lite Module Config v4.000.xml +0 -203
  549. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1301-xx - HS Lite Module Config v3.50.xml +0 -281
  550. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1301-xx - HS Lite Module Config v4.000.xml +0 -281
  551. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1429-01 - EMC HS Lite Module Config v4.000.xml +0 -281
  552. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1429-02 - EMC HS Lite Module Config v4.002.xml +0 -234
  553. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1623-03 - 12G HS Lite Module Config v4.001.xml +0 -266
  554. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1623-04 - 12G HS Lite Module Config v4.001.xml +0 -266
  555. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1680-xx - SCA2 Lite Module Config v4.001.xml +0 -333
  556. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1689-01 - 12G HS Module Config v4.001 c1.1.xml +0 -594
  557. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1689-04 - 12G HS Module Config v4.002 c1.1.xml +0 -580
  558. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1689-05 - 12G HS Module Config v4.002 c1.1.xml +0 -579
  559. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1743-02 - PCIe SFF Module Config v4.003 c1.3.xml +0 -794
  560. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1743-02 - PCIe SFF Module Config v4.006 c1.4.xml +0 -698
  561. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1743-xx - PCIe SFF Module Config v4.000 c1.1.xml +0 -789
  562. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1753-xx - 12G Lite Module Config v4.000.xml +0 -192
  563. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL1921-01 - EMC 12G HS Lite Module Config v4.000.xml +0 -233
  564. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2207-01 - GEN 4 PCIe U.2 Drive Module.xml +0 -733
  565. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2207-02 - GEN 4 PCIe U.2 Drive Module v5.000.xml +0 -753
  566. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2207-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.xml +0 -763
  567. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module v4.001.xml +0 -751
  568. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2207-xx - GEN 4 PCIe U.2 Drive Module.xml +0 -746
  569. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2245-01 - GEN 4 PCIe U.3 HS Drive Module v4.000.xml +0 -789
  570. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2245-xx - GEN 4 PCIe U.3 HS Drive Module.xml +0 -823
  571. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2266-01 - GEN 4 PCIe SFF HS Drive Module Triggering.xml +0 -743
  572. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2266-02 - GEN 4 PCIe SFF HS Drive Module Triggering v4.002.xml +0 -758
  573. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2266-03 - GEN 4 PCIe SFF HS Drive Module Triggering v5.001.xml +0 -764
  574. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2266-XX - GEN 4 PCIe SFF HS Drive Module Triggering.xml +0 -747
  575. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2270-01 - GEN 4 PCIe U.3 HS Drive Module Triggering v4.000.xml +0 -798
  576. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2270-xx - GEN 4 PCIe U.3 HS Drive Module Triggering.xml +0 -835
  577. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2542-02 - 24G SAS Drive Breaker Module v5.001.xml +0 -530
  578. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2542-xx - 24G SAS Drive Breaker v5.000 c1.1.xml +0 -530
  579. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.000 c1.1.xml +0 -539
  580. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2543-xx - 24G SAS Drive Breaker +Triggering v5.001 c1.3.xml +0 -539
  581. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2602-xx - Multiprotocol Link Breaker.xml +0 -414
  582. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.000.xml +0 -792
  583. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.001.xml +0 -792
  584. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.003.xml +0 -793
  585. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.007.xml +0 -816
  586. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2645-xx - Gen5 PCIe U.2 Drive Module v5.008.xml +0 -818
  587. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.000.xml +0 -801
  588. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.001.xml +0 -801
  589. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module + Triggering v5.003.xml +0 -802
  590. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2651-xx - Gen5 PCIe U.2 Drive Module v5.007.xml +0 -825
  591. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2661-xx - Gen5 U.3 Drive Module + Triggering v5.000.xml +0 -813
  592. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2662-xx - Gen5 PCIe U.3 Drive Module v5.000.xml +0 -801
  593. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2757-xx - Gen5 SFF Lite Breaker Module Config v4.000.xml +0 -272
  594. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.xml +0 -818
  595. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2804-xx - Gen5 MCIO to U.2 Breaker v5.001.xml +0 -813
  596. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.001.xml +0 -814
  597. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.002.xml +0 -819
  598. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2805-xx - Gen5 MCIO to U.2 Breaker +Triggering v5.003.xml +0 -819
  599. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.001.xml +0 -799
  600. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2892-xx - Gen5 EDSFF E1 x4 Breaker v5.002.xml +0 -801
  601. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2940-xx - Gen5 EDSFF E3 x8 Breaker v5.000.xml +0 -1105
  602. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/QTL2941-xx - Gen5 EDSFF E3 x8 Breaker +Triggering v5.000.xml +0 -1106
  603. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Drive Modules/Standard Drive Module Config v3.5 c1.1.xml +0 -463
  604. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Switch Modules/QTL1490-xx - SATA Keyed HS Module Config v4.003 c1.6.xml +0 -555
  605. quarchpy/connection_specific/QPS/DeviceConfig/breaker/Switch Modules/QTL1490-xx - SATA Keyed HS Module Config v4.006 c1.8.xml +0 -557
  606. quarchpy/connection_specific/QPS/DeviceConfig/colors/default-colors.properties +0 -64
  607. quarchpy/connection_specific/QPS/DeviceConfig/colors/qtl2789-colors.properties +0 -2
  608. quarchpy/connection_specific/QPS/DeviceConfig/default.xml +0 -292
  609. quarchpy/connection_specific/QPS/InstallType.dat +0 -1
  610. quarchpy/connection_specific/QPS/Power-Studio-QuickStart.pdf +0 -0
  611. quarchpy/connection_specific/QPS/QuarchPowerStudio.properties.xml +0 -1090
  612. quarchpy/connection_specific/QPS/app.jar +0 -0
  613. quarchpy/connection_specific/QPS/app.properties +0 -6
  614. quarchpy/connection_specific/QPS/commandLineOptions.txt +0 -19
  615. quarchpy/connection_specific/QPS/license.txt +0 -1
  616. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/com.sun.istack-license.html +0 -59
  617. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/dorkbox-LICENSE.Apachev2 +0 -218
  618. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/jSerialComm-LICENSE-APACHE-2.0 +0 -202
  619. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/jSerialComm-LICENSE-LGPL-3.0 +0 -165
  620. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/jakarta.activation-license.html +0 -59
  621. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/jakarta.xml.bind-api-license.html +0 -59
  622. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/javassist-License.html +0 -381
  623. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/jmdns-LICENSE.txt +0 -202
  624. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/jna-AL2.0 +0 -177
  625. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/kotlin-stdlib-LICENSE-2.0.txt +0 -202
  626. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/netty-LICENSE.txt +0 -202
  627. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/netty-NOTICE.txt +0 -239
  628. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/slf4j-LICENSE.txt +0 -24
  629. quarchpy/connection_specific/QPS/qis/3rdPartyLicenses/usb4java-LICENSE.md +0 -20
  630. quarchpy/connection_specific/QPS/qis/Comms.properties.xml +0 -102
  631. quarchpy/connection_specific/QPS/qis/QuarchInstrumentServer.properties.xml +0 -13
  632. quarchpy/connection_specific/QPS/qis/README.txt +0 -39
  633. quarchpy/connection_specific/QPS/qis/disableterminal.txt +0 -0
  634. quarchpy/connection_specific/QPS/qis/help.txt +0 -652
  635. quarchpy/connection_specific/QPS/qis/license.txt +0 -1
  636. quarchpy/connection_specific/QPS/qis/qis-NoGUI.bat +0 -3
  637. quarchpy/connection_specific/QPS/qis/qis-NoGUI.sh +0 -6
  638. quarchpy/connection_specific/QPS/qis/qis.bat +0 -3
  639. quarchpy/connection_specific/QPS/qis/qis.jar +0 -0
  640. quarchpy/connection_specific/QPS/qis/qis.sh +0 -2
  641. quarchpy/connection_specific/QPS/qis/qis_lib/Collections-2.4.jar +0 -0
  642. quarchpy/connection_specific/QPS/qis/qis_lib/Desktop-1.1.jar +0 -0
  643. quarchpy/connection_specific/QPS/qis/qis_lib/Executor-3.13.jar +0 -0
  644. quarchpy/connection_specific/QPS/qis/qis_lib/JNA-1.2.jar +0 -0
  645. quarchpy/connection_specific/QPS/qis/qis_lib/OS-1.8.jar +0 -0
  646. quarchpy/connection_specific/QPS/qis/qis_lib/SystemTray-4.4.jar +0 -0
  647. quarchpy/connection_specific/QPS/qis/qis_lib/Updates-1.1.jar +0 -0
  648. quarchpy/connection_specific/QPS/qis/qis_lib/Utilities-1.46.jar +0 -0
  649. quarchpy/connection_specific/QPS/qis/qis_lib/cinterface-2.5.6-20251003.113043-1.jar +0 -0
  650. quarchpy/connection_specific/QPS/qis/qis_lib/gson-2.13.1.jar +0 -0
  651. quarchpy/connection_specific/QPS/qis/qis_lib/istack-commons-runtime-3.0.11.jar +0 -0
  652. quarchpy/connection_specific/QPS/qis/qis_lib/jakarta.activation-api-2.1.0.jar +0 -0
  653. quarchpy/connection_specific/QPS/qis/qis_lib/jakarta.xml.bind-api-4.0.0.jar +0 -0
  654. quarchpy/connection_specific/QPS/qis/qis_lib/javassist-3.29.2-GA.jar +0 -0
  655. quarchpy/connection_specific/QPS/qis/qis_lib/jaxb-core-4.0.0.jar +0 -0
  656. quarchpy/connection_specific/QPS/qis/qis_lib/jaxb-runtime-4.0.0.jar +0 -0
  657. quarchpy/connection_specific/QPS/qis/qis_lib/jmdns-3.6.0.jar +0 -0
  658. quarchpy/connection_specific/QPS/qis/qis_lib/jna-jpms-5.12.1.jar +0 -0
  659. quarchpy/connection_specific/QPS/qis/qis_lib/jna-platform-jpms-5.12.1.jar +0 -0
  660. quarchpy/connection_specific/QPS/qis/qis_lib/jul-to-slf4j-2.0.17.jar +0 -0
  661. quarchpy/connection_specific/QPS/qis/qis_lib/kotlin-stdlib-1.9.21.jar +0 -0
  662. quarchpy/connection_specific/QPS/qis/qis_lib/log4j-api-2.25.0.jar +0 -0
  663. quarchpy/connection_specific/QPS/qis/qis_lib/log4j-core-2.25.0.jar +0 -0
  664. quarchpy/connection_specific/QPS/qis/qis_lib/log4j-layout-template-json-2.25.0.jar +0 -0
  665. quarchpy/connection_specific/QPS/qis/qis_lib/log4j-slf4j2-impl-2.25.0.jar +0 -0
  666. quarchpy/connection_specific/QPS/qis/qis_lib/netty-buffer-4.2.2.Final.jar +0 -0
  667. quarchpy/connection_specific/QPS/qis/qis_lib/netty-codec-base-4.2.2.Final.jar +0 -0
  668. quarchpy/connection_specific/QPS/qis/qis_lib/netty-codec-http-4.2.2.Final.jar +0 -0
  669. quarchpy/connection_specific/QPS/qis/qis_lib/netty-common-4.2.2.Final.jar +0 -0
  670. quarchpy/connection_specific/QPS/qis/qis_lib/netty-handler-4.2.2.Final.jar +0 -0
  671. quarchpy/connection_specific/QPS/qis/qis_lib/netty-transport-4.2.2.Final.jar +0 -0
  672. quarchpy/connection_specific/QPS/qis/qis_lib/quarchcommon-2.1.8-20251003.112807-1.jar +0 -0
  673. quarchpy/connection_specific/QPS/qis/qis_lib/slf4j-api-2.0.17.jar +0 -0
  674. quarchpy/connection_specific/QPS/qis/qis_lib/torridoncommon-1.2.8-20251003.113215-1.jar +0 -0
  675. quarchpy/connection_specific/QPS/qis/qis_lib/usb4java-1.3.1.jar +0 -0
  676. quarchpy/connection_specific/QPS/qis/resources/QuarchIcon_128x128.png +0 -0
  677. quarchpy/connection_specific/QPS/qis/resources/QuarchIcon_16x16.png +0 -0
  678. quarchpy/connection_specific/QPS/qis/resources/QuarchIcon_256x256.png +0 -0
  679. quarchpy/connection_specific/QPS/qis/resources/QuarchIcon_32x32.png +0 -0
  680. quarchpy/connection_specific/QPS/qis/resources/QuarchIcon_64x64.png +0 -0
  681. quarchpy/connection_specific/QPS/qis/resources/filters/Example.txt +0 -36
  682. quarchpy/connection_specific/QPS/qis/resources/filters/iec_filters.xml +0 -17
  683. quarchpy/connection_specific/QPS/qis/resources/org/usb4java/darwin-x86-64/libusb4java.dylib +0 -0
  684. quarchpy/connection_specific/QPS/qis/resources/org/usb4java/linux-aarch64/libusb4java.so +0 -0
  685. quarchpy/connection_specific/QPS/qis/resources/org/usb4java/linux-arm/libusb4java.so +0 -0
  686. quarchpy/connection_specific/QPS/qis/resources/org/usb4java/linux-x86/libusb4java.so +0 -0
  687. quarchpy/connection_specific/QPS/qis/resources/org/usb4java/linux-x86-64/libusb4java.so +0 -0
  688. quarchpy/connection_specific/QPS/qis/resources/org/usb4java/win32-x86/libusb4java.dll +0 -0
  689. quarchpy/connection_specific/QPS/qis/resources/org/usb4java/win32-x86-64/libusb4java.dll +0 -0
  690. quarchpy/connection_specific/QPS/qis.properties.xml +0 -11
  691. quarchpy/connection_specific/QPS/qps-command-reference.html +0 -339
  692. quarchpy/connection_specific/QPS/qps.jar +0 -0
  693. quarchpy/connection_specific/QPS/qps_lib/argparse4j-0.9.0.jar +0 -0
  694. quarchpy/connection_specific/QPS/qps_lib/commons-io-2.19.0.jar +0 -0
  695. quarchpy/connection_specific/QPS/qps_lib/controlsfx-11.2.2.jar +0 -0
  696. quarchpy/connection_specific/QPS/qps_lib/gson-2.13.1.jar +0 -0
  697. quarchpy/connection_specific/QPS/qps_lib/guava-33.4.8-jre.jar +0 -0
  698. quarchpy/connection_specific/QPS/qps_lib/istack-commons-runtime-3.0.11.jar +0 -0
  699. quarchpy/connection_specific/QPS/qps_lib/jakarta.activation-api-2.1.0.jar +0 -0
  700. quarchpy/connection_specific/QPS/qps_lib/jakarta.xml.bind-api-4.0.0.jar +0 -0
  701. quarchpy/connection_specific/QPS/qps_lib/jaxb-core-4.0.0.jar +0 -0
  702. quarchpy/connection_specific/QPS/qps_lib/jaxb-runtime-4.0.0.jar +0 -0
  703. quarchpy/connection_specific/QPS/qps_lib/jfa-1.2.0.jar +0 -0
  704. quarchpy/connection_specific/QPS/qps_lib/jfxutilities-1.0.4-20251002.100356-1.jar +0 -0
  705. quarchpy/connection_specific/QPS/qps_lib/jna-5.17.0.jar +0 -0
  706. quarchpy/connection_specific/QPS/qps_lib/jul-to-slf4j-2.0.17.jar +0 -0
  707. quarchpy/connection_specific/QPS/qps_lib/log4j-api-2.25.0.jar +0 -0
  708. quarchpy/connection_specific/QPS/qps_lib/log4j-core-2.25.0.jar +0 -0
  709. quarchpy/connection_specific/QPS/qps_lib/log4j-layout-template-json-2.25.0.jar +0 -0
  710. quarchpy/connection_specific/QPS/qps_lib/log4j-slf4j2-impl-2.25.0.jar +0 -0
  711. quarchpy/connection_specific/QPS/qps_lib/netty-buffer-4.2.2.Final.jar +0 -0
  712. quarchpy/connection_specific/QPS/qps_lib/netty-codec-base-4.2.2.Final.jar +0 -0
  713. quarchpy/connection_specific/QPS/qps_lib/netty-codec-http-4.2.2.Final.jar +0 -0
  714. quarchpy/connection_specific/QPS/qps_lib/netty-common-4.2.2.Final.jar +0 -0
  715. quarchpy/connection_specific/QPS/qps_lib/netty-handler-4.2.2.Final.jar +0 -0
  716. quarchpy/connection_specific/QPS/qps_lib/netty-transport-4.2.2.Final.jar +0 -0
  717. quarchpy/connection_specific/QPS/qps_lib/nsmenufx-3.1.0.jar +0 -0
  718. quarchpy/connection_specific/QPS/qps_lib/quarchcommon-2.1.8-20251003.112807-1.jar +0 -0
  719. quarchpy/connection_specific/QPS/qps_lib/qutils-1.0.2.jar +0 -0
  720. quarchpy/connection_specific/QPS/qps_lib/slf4j-api-2.0.17.jar +0 -0
  721. quarchpy/connection_specific/QPS/qps_lib/txw2-4.0.0.jar +0 -0
  722. quarchpy/connection_specific/QPS/resources/InstallBanner.bmp +0 -0
  723. quarchpy/connection_specific/QPS/resources/QPS.icns +0 -0
  724. quarchpy/connection_specific/QPS/resources/QPS.ico +0 -0
  725. quarchpy/connection_specific/QPS/resources/QPS.png +0 -0
  726. quarchpy/connection_specific/QPS/resources/QuarchIcon_128x128.png +0 -0
  727. quarchpy/connection_specific/QPS/resources/QuarchIcon_16x16.png +0 -0
  728. quarchpy/connection_specific/QPS/resources/QuarchIcon_256x256.png +0 -0
  729. quarchpy/connection_specific/QPS/resources/QuarchIcon_32x32.png +0 -0
  730. quarchpy/connection_specific/QPS/resources/QuarchIcon_64x64.png +0 -0
  731. quarchpy/connection_specific/QPS/resources/profiles/3_PHASE_PAM_AC_DEFAULT.rcf +0 -533
  732. quarchpy/connection_specific/QPS/resources/profiles/3_PHASE_PAM_AC_DEFAULT.scf +0 -90
  733. quarchpy/connection_specific/QPS/resources/profiles/3_PHASE_PAM_AC_FULL.rcf +0 -830
  734. quarchpy/connection_specific/QPS/resources/profiles/3_PHASE_PAM_AC_FULL.scf +0 -144
  735. quarchpy/connection_specific/QPS/resources/profiles/PAM_EXAMPLE_CONFIG.rcf +0 -193
  736. quarchpy/connection_specific/QPS/scriptCommands.txt +0 -1179
  737. quarchpy/connection_specific/QPS/whats-new.txt +0 -37
  738. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-311.pyc +0 -0
  739. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-312.pyc +0 -0
  740. quarchpy/connection_specific/__pycache__/StreamChannels.cpython-313.pyc +0 -0
  741. quarchpy/connection_specific/__pycache__/__init__.cpython-311.pyc +0 -0
  742. quarchpy/connection_specific/__pycache__/__init__.cpython-312.pyc +0 -0
  743. quarchpy/connection_specific/__pycache__/__init__.cpython-313.pyc +0 -0
  744. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
  745. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-312.pyc +0 -0
  746. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-313.pyc +0 -0
  747. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-311.pyc +0 -0
  748. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-312.pyc +0 -0
  749. quarchpy/connection_specific/__pycache__/connection_QPS.cpython-313.pyc +0 -0
  750. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-311.pyc +0 -0
  751. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-312.pyc +0 -0
  752. quarchpy/connection_specific/__pycache__/connection_ReST.cpython-313.pyc +0 -0
  753. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-311.pyc +0 -0
  754. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-312.pyc +0 -0
  755. quarchpy/connection_specific/__pycache__/connection_Serial.cpython-313.pyc +0 -0
  756. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-311.pyc +0 -0
  757. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-312.pyc +0 -0
  758. quarchpy/connection_specific/__pycache__/connection_TCP.cpython-313.pyc +0 -0
  759. quarchpy/connection_specific/__pycache__/connection_USB.cpython-311.pyc +0 -0
  760. quarchpy/connection_specific/__pycache__/connection_USB.cpython-312.pyc +0 -0
  761. quarchpy/connection_specific/__pycache__/connection_USB.cpython-313.pyc +0 -0
  762. quarchpy/connection_specific/__pycache__/mDNS.cpython-311.pyc +0 -0
  763. quarchpy/connection_specific/__pycache__/mDNS.cpython-312.pyc +0 -0
  764. quarchpy/connection_specific/__pycache__/mDNS.cpython-313.pyc +0 -0
  765. quarchpy/connection_specific/jdk_jres/__pycache__/__init__.cpython-313.pyc +0 -0
  766. quarchpy/connection_specific/jdk_jres/__pycache__/fix_permissions.cpython-313.pyc +0 -0
  767. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/java +0 -0
  768. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jfr +0 -0
  769. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jrunscript +0 -0
  770. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/jwebserver +0 -0
  771. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/keytool +0 -0
  772. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/bin/rmiregistry +0 -0
  773. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/jaxp-strict.properties.template +0 -123
  774. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/jaxp.properties +0 -200
  775. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/logging.properties +0 -63
  776. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/jmxremote.access +0 -79
  777. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/jmxremote.password.template +0 -115
  778. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/management/management.properties +0 -326
  779. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/net.properties +0 -162
  780. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/sdp/sdp.conf.template +0 -30
  781. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/java.security +0 -1517
  782. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/README.txt +0 -54
  783. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +0 -6
  784. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +0 -14
  785. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +0 -13
  786. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +0 -6
  787. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +0 -6
  788. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/conf/sound.properties +0 -39
  789. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +0 -37
  790. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +0 -27
  791. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/LICENSE +0 -347
  792. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/aes.md +0 -36
  793. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/asm.md +0 -36
  794. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/c-libutl.md +0 -35
  795. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/cldr.md +0 -100
  796. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/icu.md +0 -93
  797. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/public_suffix.md +0 -399
  798. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/siphash.md +0 -150
  799. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.base/unicode.md +0 -269
  800. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +0 -37
  801. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +0 -27
  802. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.compiler/LICENSE +0 -347
  803. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +0 -37
  804. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +0 -27
  805. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.datatransfer/LICENSE +0 -347
  806. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +0 -37
  807. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +0 -27
  808. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/LICENSE +0 -347
  809. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/colorimaging.md +0 -7
  810. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/freetype.md +0 -649
  811. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/giflib.md +0 -46
  812. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +0 -104
  813. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/jpeg.md +0 -77
  814. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/lcms.md +0 -103
  815. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/libpng.md +0 -216
  816. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/mesa3d.md +0 -134
  817. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/pipewire.md +0 -46
  818. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.desktop/xwd.md +0 -34
  819. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +0 -37
  820. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +0 -27
  821. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.instrument/LICENSE +0 -347
  822. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +0 -37
  823. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +0 -27
  824. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.logging/LICENSE +0 -347
  825. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +0 -37
  826. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +0 -27
  827. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management/LICENSE +0 -347
  828. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  829. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +0 -27
  830. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.management.rmi/LICENSE +0 -347
  831. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +0 -37
  832. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +0 -27
  833. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.naming/LICENSE +0 -347
  834. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +0 -37
  835. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +0 -27
  836. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.net.http/LICENSE +0 -347
  837. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +0 -37
  838. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +0 -27
  839. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.prefs/LICENSE +0 -347
  840. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  841. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +0 -27
  842. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.rmi/LICENSE +0 -347
  843. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +0 -37
  844. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +0 -27
  845. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.scripting/LICENSE +0 -347
  846. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +0 -37
  847. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +0 -27
  848. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.se/LICENSE +0 -347
  849. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +0 -37
  850. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +0 -27
  851. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.jgss/LICENSE +0 -347
  852. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +0 -37
  853. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +0 -27
  854. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.security.sasl/LICENSE +0 -347
  855. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +0 -37
  856. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +0 -27
  857. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/LICENSE +0 -347
  858. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.smartcardio/pcsclite.md +0 -57
  859. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +0 -37
  860. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +0 -27
  861. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql/LICENSE +0 -347
  862. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +0 -37
  863. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +0 -27
  864. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +0 -347
  865. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +0 -37
  866. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +0 -27
  867. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +0 -347
  868. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +0 -37
  869. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +0 -27
  870. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/LICENSE +0 -347
  871. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/bcel.md +0 -219
  872. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/dom.md +0 -77
  873. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/jcup.md +0 -31
  874. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/schema10part1.md +0 -51
  875. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/schema10part2.md +0 -50
  876. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xalan.md +0 -255
  877. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xerces.md +0 -229
  878. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml10.md +0 -57
  879. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +0 -150
  880. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml11.md +0 -68
  881. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +0 -60
  882. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xmlspec.md +0 -63
  883. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml/xmlxsd.md +0 -43
  884. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +0 -37
  885. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +0 -27
  886. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +0 -347
  887. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +0 -227
  888. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +0 -37
  889. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +0 -27
  890. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.base/LICENSE +0 -347
  891. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +0 -37
  892. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +0 -27
  893. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.controls/LICENSE +0 -347
  894. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +0 -37
  895. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +0 -27
  896. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.fxml/LICENSE +0 -347
  897. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +0 -37
  898. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +0 -27
  899. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/LICENSE +0 -347
  900. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +0 -43
  901. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +0 -134
  902. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +0 -46
  903. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +0 -37
  904. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +0 -27
  905. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/javafx.swing/LICENSE +0 -347
  906. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +0 -37
  907. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +0 -27
  908. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +0 -347
  909. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +0 -37
  910. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +0 -27
  911. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.charsets/LICENSE +0 -347
  912. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +0 -37
  913. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +0 -27
  914. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +0 -347
  915. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +0 -76
  916. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +0 -46
  917. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +0 -37
  918. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +0 -27
  919. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +0 -347
  920. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +0 -37
  921. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +0 -27
  922. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +0 -347
  923. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +0 -32
  924. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +0 -37
  925. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +0 -27
  926. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +0 -347
  927. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +0 -37
  928. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +0 -27
  929. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +0 -347
  930. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.incubator.vector/sleef.md +0 -439
  931. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +0 -37
  932. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +0 -27
  933. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +0 -347
  934. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +0 -37
  935. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +0 -27
  936. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +0 -347
  937. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +0 -37
  938. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +0 -27
  939. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jfr/LICENSE +0 -347
  940. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +0 -37
  941. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +0 -27
  942. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +0 -347
  943. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +0 -37
  944. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +0 -27
  945. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/LICENSE +0 -347
  946. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/cldr.md +0 -100
  947. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +0 -31
  948. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +0 -37
  949. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +0 -27
  950. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management/LICENSE +0 -347
  951. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +0 -37
  952. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +0 -27
  953. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +0 -347
  954. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +0 -37
  955. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +0 -27
  956. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +0 -347
  957. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +0 -37
  958. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +0 -27
  959. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +0 -347
  960. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  961. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +0 -27
  962. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +0 -347
  963. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +0 -37
  964. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +0 -27
  965. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.net/LICENSE +0 -347
  966. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +0 -37
  967. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +0 -27
  968. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +0 -347
  969. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +0 -37
  970. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +0 -27
  971. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.sctp/LICENSE +0 -347
  972. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +0 -37
  973. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +0 -27
  974. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +0 -347
  975. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +0 -37
  976. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +0 -27
  977. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +0 -347
  978. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +0 -37
  979. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +0 -27
  980. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +0 -347
  981. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +0 -37
  982. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +0 -27
  983. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +0 -347
  984. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +0 -37
  985. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +0 -27
  986. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +0 -347
  987. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +0 -37
  988. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +0 -27
  989. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +0 -347
  990. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/classlist +0 -1588
  991. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/client/libjsig.so +0 -0
  992. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/client/libjvm.so +0 -0
  993. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
  994. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx.platform.properties +0 -17
  995. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/javafx.properties +0 -3
  996. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jexec +0 -0
  997. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jfr/default.jfc +0 -1152
  998. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jfr/profile.jfc +0 -1151
  999. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  1000. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jspawnhelper +0 -0
  1001. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/jvm.cfg +0 -3
  1002. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt.so +0 -0
  1003. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt_headless.so +0 -0
  1004. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libawt_xawt.so +0 -0
  1005. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libdecora_sse.so +0 -0
  1006. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libdt_socket.so +0 -0
  1007. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libextnet.so +0 -0
  1008. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libfontmanager.so +0 -0
  1009. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libfreetype.so +0 -0
  1010. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass.so +0 -0
  1011. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass_monocle.so +0 -0
  1012. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglass_monocle_x11.so +0 -0
  1013. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libglassgtk3.so +0 -0
  1014. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libinstrument.so +0 -0
  1015. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2gss.so +0 -0
  1016. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2pcsc.so +0 -0
  1017. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libj2pkcs11.so +0 -0
  1018. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjaas.so +0 -0
  1019. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjava.so +0 -0
  1020. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font.so +0 -0
  1021. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font_freetype.so +0 -0
  1022. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_font_pango.so +0 -0
  1023. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavafx_iio.so +0 -0
  1024. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjavajpeg.so +0 -0
  1025. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjawt.so +0 -0
  1026. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjdwp.so +0 -0
  1027. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjimage.so +0 -0
  1028. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjli.so +0 -0
  1029. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsig.so +0 -0
  1030. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsound.so +0 -0
  1031. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libjsvml.so +0 -0
  1032. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/liblcms.so +0 -0
  1033. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement.so +0 -0
  1034. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement_agent.so +0 -0
  1035. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmanagement_ext.so +0 -0
  1036. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libmlib_image.so +0 -0
  1037. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libnet.so +0 -0
  1038. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libnio.so +0 -0
  1039. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprefs.so +0 -0
  1040. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_common.so +0 -0
  1041. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_es2.so +0 -0
  1042. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_es2_monocle.so +0 -0
  1043. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libprism_sw.so +0 -0
  1044. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/librmi.so +0 -0
  1045. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsctp.so +0 -0
  1046. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsimdsort.so +0 -0
  1047. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsplashscreen.so +0 -0
  1048. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libsyslookup.so +0 -0
  1049. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libverify.so +0 -0
  1050. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/libzip.so +0 -0
  1051. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/minimal/libjsig.so +0 -0
  1052. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/minimal/libjvm.so +0 -0
  1053. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/modules +0 -0
  1054. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/psfont.properties.ja +0 -119
  1055. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/psfontj2d.properties +0 -323
  1056. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/blocked.certs +0 -39
  1057. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/cacerts +0 -0
  1058. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/security/public_suffix_list.dat +0 -0
  1059. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/server/libjsig.so +0 -0
  1060. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/server/libjvm.so +0 -0
  1061. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/lib/tzdb.dat +0 -0
  1062. quarchpy/connection_specific/jdk_jres/lin_amd64_jdk_jre/release +0 -2
  1063. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/java +0 -0
  1064. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jfr +0 -0
  1065. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jrunscript +0 -0
  1066. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/jwebserver +0 -0
  1067. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/keytool +0 -0
  1068. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/bin/rmiregistry +0 -0
  1069. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/jaxp-strict.properties.template +0 -123
  1070. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/jaxp.properties +0 -200
  1071. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/logging.properties +0 -63
  1072. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/jmxremote.access +0 -79
  1073. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/jmxremote.password.template +0 -115
  1074. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/management/management.properties +0 -326
  1075. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/net.properties +0 -162
  1076. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/java.security +0 -1518
  1077. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/README.txt +0 -54
  1078. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +0 -6
  1079. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +0 -14
  1080. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +0 -13
  1081. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +0 -6
  1082. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +0 -6
  1083. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/conf/sound.properties +0 -39
  1084. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +0 -37
  1085. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +0 -27
  1086. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/LICENSE +0 -347
  1087. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/aes.md +0 -36
  1088. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/asm.md +0 -36
  1089. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/c-libutl.md +0 -35
  1090. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/cldr.md +0 -100
  1091. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/icu.md +0 -93
  1092. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/public_suffix.md +0 -399
  1093. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/siphash.md +0 -150
  1094. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.base/unicode.md +0 -269
  1095. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +0 -37
  1096. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +0 -27
  1097. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.compiler/LICENSE +0 -347
  1098. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +0 -37
  1099. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +0 -27
  1100. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.datatransfer/LICENSE +0 -347
  1101. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +0 -37
  1102. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +0 -27
  1103. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/LICENSE +0 -347
  1104. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/colorimaging.md +0 -7
  1105. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/freetype.md +0 -649
  1106. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/giflib.md +0 -46
  1107. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +0 -104
  1108. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/jpeg.md +0 -77
  1109. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/lcms.md +0 -103
  1110. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/libpng.md +0 -216
  1111. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/mesa3d.md +0 -134
  1112. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/pipewire.md +0 -46
  1113. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.desktop/xwd.md +0 -34
  1114. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +0 -37
  1115. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +0 -27
  1116. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.instrument/LICENSE +0 -347
  1117. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +0 -37
  1118. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +0 -27
  1119. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.logging/LICENSE +0 -347
  1120. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +0 -37
  1121. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +0 -27
  1122. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management/LICENSE +0 -347
  1123. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  1124. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +0 -27
  1125. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.management.rmi/LICENSE +0 -347
  1126. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +0 -37
  1127. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +0 -27
  1128. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.naming/LICENSE +0 -347
  1129. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +0 -37
  1130. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +0 -27
  1131. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.net.http/LICENSE +0 -347
  1132. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +0 -37
  1133. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +0 -27
  1134. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.prefs/LICENSE +0 -347
  1135. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  1136. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +0 -27
  1137. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.rmi/LICENSE +0 -347
  1138. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +0 -37
  1139. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +0 -27
  1140. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.scripting/LICENSE +0 -347
  1141. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +0 -37
  1142. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +0 -27
  1143. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.se/LICENSE +0 -347
  1144. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +0 -37
  1145. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +0 -27
  1146. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.jgss/LICENSE +0 -347
  1147. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +0 -37
  1148. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +0 -27
  1149. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.security.sasl/LICENSE +0 -347
  1150. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +0 -37
  1151. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +0 -27
  1152. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/LICENSE +0 -347
  1153. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.smartcardio/pcsclite.md +0 -57
  1154. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +0 -37
  1155. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +0 -27
  1156. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql/LICENSE +0 -347
  1157. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +0 -37
  1158. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +0 -27
  1159. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +0 -347
  1160. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +0 -37
  1161. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +0 -27
  1162. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +0 -347
  1163. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +0 -37
  1164. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +0 -27
  1165. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/LICENSE +0 -347
  1166. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/bcel.md +0 -219
  1167. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/dom.md +0 -77
  1168. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/jcup.md +0 -31
  1169. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/schema10part1.md +0 -51
  1170. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/schema10part2.md +0 -50
  1171. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xalan.md +0 -255
  1172. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xerces.md +0 -229
  1173. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml10.md +0 -57
  1174. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +0 -150
  1175. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml11.md +0 -68
  1176. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +0 -60
  1177. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xmlspec.md +0 -63
  1178. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml/xmlxsd.md +0 -43
  1179. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +0 -37
  1180. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +0 -27
  1181. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +0 -347
  1182. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +0 -227
  1183. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +0 -37
  1184. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +0 -27
  1185. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.base/LICENSE +0 -347
  1186. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +0 -37
  1187. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +0 -27
  1188. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.controls/LICENSE +0 -347
  1189. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +0 -37
  1190. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +0 -27
  1191. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.fxml/LICENSE +0 -347
  1192. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +0 -37
  1193. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +0 -27
  1194. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/LICENSE +0 -347
  1195. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +0 -43
  1196. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +0 -134
  1197. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +0 -46
  1198. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +0 -37
  1199. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +0 -27
  1200. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/javafx.swing/LICENSE +0 -347
  1201. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +0 -37
  1202. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +0 -27
  1203. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +0 -347
  1204. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +0 -37
  1205. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +0 -27
  1206. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.charsets/LICENSE +0 -347
  1207. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +0 -37
  1208. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +0 -27
  1209. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +0 -347
  1210. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +0 -76
  1211. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +0 -46
  1212. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +0 -37
  1213. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +0 -27
  1214. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +0 -347
  1215. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +0 -37
  1216. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +0 -27
  1217. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +0 -347
  1218. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +0 -32
  1219. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +0 -37
  1220. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +0 -27
  1221. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +0 -347
  1222. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +0 -37
  1223. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +0 -27
  1224. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +0 -347
  1225. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +0 -37
  1226. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +0 -27
  1227. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +0 -347
  1228. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +0 -37
  1229. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +0 -27
  1230. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +0 -347
  1231. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +0 -37
  1232. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +0 -27
  1233. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jfr/LICENSE +0 -347
  1234. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +0 -37
  1235. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +0 -27
  1236. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +0 -347
  1237. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +0 -37
  1238. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +0 -27
  1239. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/LICENSE +0 -347
  1240. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/cldr.md +0 -100
  1241. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +0 -31
  1242. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +0 -37
  1243. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +0 -27
  1244. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management/LICENSE +0 -347
  1245. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +0 -37
  1246. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +0 -27
  1247. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +0 -347
  1248. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +0 -37
  1249. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +0 -27
  1250. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +0 -347
  1251. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +0 -37
  1252. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +0 -27
  1253. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +0 -347
  1254. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +0 -37
  1255. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +0 -27
  1256. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +0 -347
  1257. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +0 -37
  1258. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +0 -27
  1259. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.net/LICENSE +0 -347
  1260. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +0 -37
  1261. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +0 -27
  1262. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +0 -347
  1263. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +0 -37
  1264. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +0 -27
  1265. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.sctp/LICENSE +0 -347
  1266. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +0 -37
  1267. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +0 -27
  1268. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +0 -347
  1269. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +0 -37
  1270. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +0 -27
  1271. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +0 -347
  1272. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +0 -37
  1273. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +0 -27
  1274. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +0 -347
  1275. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +0 -37
  1276. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +0 -27
  1277. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +0 -347
  1278. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +0 -37
  1279. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +0 -27
  1280. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +0 -347
  1281. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +0 -37
  1282. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +0 -27
  1283. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +0 -347
  1284. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/classlist +0 -1589
  1285. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/client/libjsig.dylib +0 -0
  1286. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/client/libjvm.dylib +0 -0
  1287. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/fontconfig.bfc +0 -0
  1288. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/fontconfig.properties.src +0 -258
  1289. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
  1290. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/javafx.properties +0 -3
  1291. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jfr/default.jfc +0 -1152
  1292. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jfr/profile.jfc +0 -1151
  1293. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  1294. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jspawnhelper +0 -0
  1295. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/jvm.cfg +0 -2
  1296. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libawt.dylib +0 -0
  1297. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libawt_lwawt.dylib +0 -0
  1298. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libdecora_sse.dylib +0 -0
  1299. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libdt_socket.dylib +0 -0
  1300. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libextnet.dylib +0 -0
  1301. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libfontmanager.dylib +0 -0
  1302. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libfreetype.dylib +0 -0
  1303. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libglass.dylib +0 -0
  1304. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libinstrument.dylib +0 -0
  1305. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2gss.dylib +0 -0
  1306. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2pcsc.dylib +0 -0
  1307. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libj2pkcs11.dylib +0 -0
  1308. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjaas.dylib +0 -0
  1309. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjava.dylib +0 -0
  1310. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavafx_font.dylib +0 -0
  1311. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavafx_iio.dylib +0 -0
  1312. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjavajpeg.dylib +0 -0
  1313. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjawt.dylib +0 -0
  1314. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjdwp.dylib +0 -0
  1315. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjimage.dylib +0 -0
  1316. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjli.dylib +0 -0
  1317. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjsig.dylib +0 -0
  1318. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libjsound.dylib +0 -0
  1319. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/liblcms.dylib +0 -0
  1320. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement.dylib +0 -0
  1321. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement_agent.dylib +0 -0
  1322. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmanagement_ext.dylib +0 -0
  1323. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libmlib_image.dylib +0 -0
  1324. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libnet.dylib +0 -0
  1325. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libnio.dylib +0 -0
  1326. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosx.dylib +0 -0
  1327. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxapp.dylib +0 -0
  1328. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxkrb5.dylib +0 -0
  1329. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxsecurity.dylib +0 -0
  1330. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libosxui.dylib +0 -0
  1331. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprefs.dylib +0 -0
  1332. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_common.dylib +0 -0
  1333. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_es2.dylib +0 -0
  1334. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libprism_sw.dylib +0 -0
  1335. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/librmi.dylib +0 -0
  1336. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libsplashscreen.dylib +0 -0
  1337. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libsyslookup.dylib +0 -0
  1338. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libverify.dylib +0 -0
  1339. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/libzip.dylib +0 -0
  1340. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/modules +0 -0
  1341. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/psfont.properties.ja +0 -119
  1342. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/psfontj2d.properties +0 -323
  1343. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/blocked.certs +0 -39
  1344. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/cacerts +0 -0
  1345. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/security/public_suffix_list.dat +0 -0
  1346. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/server/libjsig.dylib +0 -0
  1347. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/server/libjvm.dylib +0 -0
  1348. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/shaders.metallib +0 -0
  1349. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/lib/tzdb.dat +0 -0
  1350. quarchpy/connection_specific/jdk_jres/mac_amd64_jdk_jre/release +0 -2
  1351. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-console-l1-1-0.dll +0 -0
  1352. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-console-l1-2-0.dll +0 -0
  1353. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-datetime-l1-1-0.dll +0 -0
  1354. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-debug-l1-1-0.dll +0 -0
  1355. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-errorhandling-l1-1-0.dll +0 -0
  1356. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-fibers-l1-1-0.dll +0 -0
  1357. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l1-1-0.dll +0 -0
  1358. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l1-2-0.dll +0 -0
  1359. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-file-l2-1-0.dll +0 -0
  1360. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-handle-l1-1-0.dll +0 -0
  1361. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-heap-l1-1-0.dll +0 -0
  1362. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-interlocked-l1-1-0.dll +0 -0
  1363. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-libraryloader-l1-1-0.dll +0 -0
  1364. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-localization-l1-2-0.dll +0 -0
  1365. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-memory-l1-1-0.dll +0 -0
  1366. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-namedpipe-l1-1-0.dll +0 -0
  1367. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processenvironment-l1-1-0.dll +0 -0
  1368. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processthreads-l1-1-0.dll +0 -0
  1369. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-processthreads-l1-1-1.dll +0 -0
  1370. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-profile-l1-1-0.dll +0 -0
  1371. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-rtlsupport-l1-1-0.dll +0 -0
  1372. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-string-l1-1-0.dll +0 -0
  1373. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-synch-l1-1-0.dll +0 -0
  1374. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-synch-l1-2-0.dll +0 -0
  1375. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-sysinfo-l1-1-0.dll +0 -0
  1376. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-timezone-l1-1-0.dll +0 -0
  1377. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-core-util-l1-1-0.dll +0 -0
  1378. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-conio-l1-1-0.dll +0 -0
  1379. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-convert-l1-1-0.dll +0 -0
  1380. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-environment-l1-1-0.dll +0 -0
  1381. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-filesystem-l1-1-0.dll +0 -0
  1382. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-heap-l1-1-0.dll +0 -0
  1383. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-locale-l1-1-0.dll +0 -0
  1384. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-math-l1-1-0.dll +0 -0
  1385. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-multibyte-l1-1-0.dll +0 -0
  1386. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-private-l1-1-0.dll +0 -0
  1387. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-process-l1-1-0.dll +0 -0
  1388. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-runtime-l1-1-0.dll +0 -0
  1389. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-stdio-l1-1-0.dll +0 -0
  1390. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-string-l1-1-0.dll +0 -0
  1391. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-time-l1-1-0.dll +0 -0
  1392. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/api-ms-win-crt-utility-l1-1-0.dll +0 -0
  1393. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/awt.dll +0 -0
  1394. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/client/jvm.dll +0 -0
  1395. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/decora_sse.dll +0 -0
  1396. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/dt_socket.dll +0 -0
  1397. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/extnet.dll +0 -0
  1398. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/fontmanager.dll +0 -0
  1399. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/freetype.dll +0 -0
  1400. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/glass.dll +0 -0
  1401. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/instrument.dll +0 -0
  1402. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2gss.dll +0 -0
  1403. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2pcsc.dll +0 -0
  1404. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/j2pkcs11.dll +0 -0
  1405. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaas.dll +0 -0
  1406. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jabswitch.exe +0 -0
  1407. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaccessinspector.exe +0 -0
  1408. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jaccesswalker.exe +0 -0
  1409. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/java.dll +0 -0
  1410. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/java.exe +0 -0
  1411. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javaaccessbridge.dll +0 -0
  1412. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javafx_font.dll +0 -0
  1413. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javafx_iio.dll +0 -0
  1414. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javajpeg.dll +0 -0
  1415. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/javaw.exe +0 -0
  1416. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jawt.dll +0 -0
  1417. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jdwp.dll +0 -0
  1418. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jfr.exe +0 -0
  1419. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jimage.dll +0 -0
  1420. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jli.dll +0 -0
  1421. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jrunscript.exe +0 -0
  1422. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jsound.dll +0 -0
  1423. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jsvml.dll +0 -0
  1424. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/jwebserver.exe +0 -0
  1425. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/keytool.exe +0 -0
  1426. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/kinit.exe +0 -0
  1427. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/klist.exe +0 -0
  1428. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/ktab.exe +0 -0
  1429. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/lcms.dll +0 -0
  1430. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management.dll +0 -0
  1431. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management_agent.dll +0 -0
  1432. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/management_ext.dll +0 -0
  1433. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/mlib_image.dll +0 -0
  1434. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140.dll +0 -0
  1435. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140_1.dll +0 -0
  1436. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/msvcp140_2.dll +0 -0
  1437. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/net.dll +0 -0
  1438. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/nio.dll +0 -0
  1439. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prefs.dll +0 -0
  1440. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_common.dll +0 -0
  1441. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_d3d.dll +0 -0
  1442. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/prism_sw.dll +0 -0
  1443. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/rmi.dll +0 -0
  1444. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/rmiregistry.exe +0 -0
  1445. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/server/jvm.dll +0 -0
  1446. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/splashscreen.dll +0 -0
  1447. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/sspi_bridge.dll +0 -0
  1448. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/syslookup.dll +0 -0
  1449. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/ucrtbase.dll +0 -0
  1450. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/vcruntime140.dll +0 -0
  1451. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/vcruntime140_1.dll +0 -0
  1452. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/verify.dll +0 -0
  1453. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/w2k_lsa_auth.dll +0 -0
  1454. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/windowsaccessbridge-64.dll +0 -0
  1455. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/bin/zip.dll +0 -0
  1456. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/jaxp-strict.properties.template +0 -123
  1457. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/jaxp.properties +0 -200
  1458. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/logging.properties +0 -63
  1459. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/jmxremote.access +0 -79
  1460. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/jmxremote.password.template +0 -115
  1461. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/management/management.properties +0 -326
  1462. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/net.properties +0 -166
  1463. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/java.security +0 -1515
  1464. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/README.txt +0 -54
  1465. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/default_US_export.policy +0 -6
  1466. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/default_local.policy +0 -14
  1467. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/limited/exempt_local.policy +0 -13
  1468. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/unlimited/default_US_export.policy +0 -6
  1469. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/security/policy/unlimited/default_local.policy +0 -6
  1470. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/conf/sound.properties +0 -39
  1471. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/ADDITIONAL_LICENSE_INFO +0 -37
  1472. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/ASSEMBLY_EXCEPTION +0 -27
  1473. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/LICENSE +0 -347
  1474. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/aes.md +0 -36
  1475. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/asm.md +0 -36
  1476. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/c-libutl.md +0 -35
  1477. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/cldr.md +0 -100
  1478. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/icu.md +0 -93
  1479. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/public_suffix.md +0 -399
  1480. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/siphash.md +0 -150
  1481. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/unicode.md +0 -269
  1482. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/wepoll.md +0 -34
  1483. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.base/zlib.md +0 -27
  1484. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.compiler/ADDITIONAL_LICENSE_INFO +0 -1
  1485. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.compiler/ASSEMBLY_EXCEPTION +0 -1
  1486. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.compiler/LICENSE +0 -1
  1487. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.datatransfer/ADDITIONAL_LICENSE_INFO +0 -1
  1488. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.datatransfer/ASSEMBLY_EXCEPTION +0 -1
  1489. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.datatransfer/LICENSE +0 -1
  1490. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/ADDITIONAL_LICENSE_INFO +0 -1
  1491. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/ASSEMBLY_EXCEPTION +0 -1
  1492. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/LICENSE +0 -1
  1493. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/colorimaging.md +0 -7
  1494. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/freetype.md +0 -649
  1495. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/giflib.md +0 -46
  1496. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/harfbuzz.md +0 -103
  1497. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/jpeg.md +0 -77
  1498. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/lcms.md +0 -103
  1499. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/libpng.md +0 -215
  1500. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.desktop/mesa3d.md +0 -134
  1501. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.instrument/ADDITIONAL_LICENSE_INFO +0 -1
  1502. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.instrument/ASSEMBLY_EXCEPTION +0 -1
  1503. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.instrument/LICENSE +0 -1
  1504. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.logging/ADDITIONAL_LICENSE_INFO +0 -1
  1505. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.logging/ASSEMBLY_EXCEPTION +0 -1
  1506. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.logging/LICENSE +0 -1
  1507. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management/ADDITIONAL_LICENSE_INFO +0 -1
  1508. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management/ASSEMBLY_EXCEPTION +0 -1
  1509. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management/LICENSE +0 -1
  1510. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management.rmi/ADDITIONAL_LICENSE_INFO +0 -1
  1511. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management.rmi/ASSEMBLY_EXCEPTION +0 -1
  1512. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.management.rmi/LICENSE +0 -1
  1513. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.naming/ADDITIONAL_LICENSE_INFO +0 -1
  1514. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.naming/ASSEMBLY_EXCEPTION +0 -1
  1515. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.naming/LICENSE +0 -1
  1516. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.net.http/ADDITIONAL_LICENSE_INFO +0 -1
  1517. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.net.http/ASSEMBLY_EXCEPTION +0 -1
  1518. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.net.http/LICENSE +0 -1
  1519. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.prefs/ADDITIONAL_LICENSE_INFO +0 -1
  1520. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.prefs/ASSEMBLY_EXCEPTION +0 -1
  1521. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.prefs/LICENSE +0 -1
  1522. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.rmi/ADDITIONAL_LICENSE_INFO +0 -1
  1523. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.rmi/ASSEMBLY_EXCEPTION +0 -1
  1524. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.rmi/LICENSE +0 -1
  1525. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.scripting/ADDITIONAL_LICENSE_INFO +0 -1
  1526. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.scripting/ASSEMBLY_EXCEPTION +0 -1
  1527. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.scripting/LICENSE +0 -1
  1528. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.se/ADDITIONAL_LICENSE_INFO +0 -1
  1529. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.se/ASSEMBLY_EXCEPTION +0 -1
  1530. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.se/LICENSE +0 -1
  1531. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.jgss/ADDITIONAL_LICENSE_INFO +0 -1
  1532. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.jgss/ASSEMBLY_EXCEPTION +0 -1
  1533. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.jgss/LICENSE +0 -1
  1534. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.sasl/ADDITIONAL_LICENSE_INFO +0 -1
  1535. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.sasl/ASSEMBLY_EXCEPTION +0 -1
  1536. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.security.sasl/LICENSE +0 -1
  1537. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.smartcardio/ADDITIONAL_LICENSE_INFO +0 -1
  1538. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.smartcardio/ASSEMBLY_EXCEPTION +0 -1
  1539. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.smartcardio/LICENSE +0 -1
  1540. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql/ADDITIONAL_LICENSE_INFO +0 -1
  1541. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql/ASSEMBLY_EXCEPTION +0 -1
  1542. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql/LICENSE +0 -1
  1543. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql.rowset/ADDITIONAL_LICENSE_INFO +0 -1
  1544. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql.rowset/ASSEMBLY_EXCEPTION +0 -1
  1545. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.sql.rowset/LICENSE +0 -1
  1546. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.transaction.xa/ADDITIONAL_LICENSE_INFO +0 -1
  1547. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.transaction.xa/ASSEMBLY_EXCEPTION +0 -1
  1548. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.transaction.xa/LICENSE +0 -1
  1549. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/ADDITIONAL_LICENSE_INFO +0 -1
  1550. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/ASSEMBLY_EXCEPTION +0 -1
  1551. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/LICENSE +0 -1
  1552. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/bcel.md +0 -219
  1553. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/dom.md +0 -77
  1554. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/jcup.md +0 -31
  1555. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/schema10part1.md +0 -51
  1556. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/schema10part2.md +0 -50
  1557. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xalan.md +0 -255
  1558. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xerces.md +0 -229
  1559. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml10.md +0 -57
  1560. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml10schema.md +0 -150
  1561. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml11.md +0 -68
  1562. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xhtml11schema.md +0 -60
  1563. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xmlspec.md +0 -63
  1564. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml/xmlxsd.md +0 -43
  1565. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/ADDITIONAL_LICENSE_INFO +0 -1
  1566. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/ASSEMBLY_EXCEPTION +0 -1
  1567. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/LICENSE +0 -1
  1568. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/java.xml.crypto/santuario.md +0 -227
  1569. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/ADDITIONAL_LICENSE_INFO +0 -1
  1570. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/ASSEMBLY_EXCEPTION +0 -1
  1571. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.base/LICENSE +0 -1
  1572. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/ADDITIONAL_LICENSE_INFO +0 -1
  1573. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/ASSEMBLY_EXCEPTION +0 -1
  1574. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.controls/LICENSE +0 -1
  1575. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/ADDITIONAL_LICENSE_INFO +0 -1
  1576. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/ASSEMBLY_EXCEPTION +0 -1
  1577. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.fxml/LICENSE +0 -1
  1578. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/ADDITIONAL_LICENSE_INFO +0 -1
  1579. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/ASSEMBLY_EXCEPTION +0 -1
  1580. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/LICENSE +0 -1
  1581. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/jpeg_fx.md +0 -43
  1582. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/mesa3d.md +0 -1
  1583. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.graphics/pipewire.md +0 -41
  1584. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/ADDITIONAL_LICENSE_INFO +0 -1
  1585. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/ASSEMBLY_EXCEPTION +0 -1
  1586. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/javafx.swing/LICENSE +0 -1
  1587. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.accessibility/ADDITIONAL_LICENSE_INFO +0 -1
  1588. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.accessibility/ASSEMBLY_EXCEPTION +0 -1
  1589. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.accessibility/LICENSE +0 -1
  1590. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.charsets/ADDITIONAL_LICENSE_INFO +0 -1
  1591. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.charsets/ASSEMBLY_EXCEPTION +0 -1
  1592. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.charsets/LICENSE +0 -1
  1593. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ADDITIONAL_LICENSE_INFO +0 -1
  1594. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/ASSEMBLY_EXCEPTION +0 -1
  1595. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/LICENSE +0 -1
  1596. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11cryptotoken.md +0 -76
  1597. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.cryptoki/pkcs11wrapper.md +0 -46
  1598. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.ec/ADDITIONAL_LICENSE_INFO +0 -1
  1599. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.ec/ASSEMBLY_EXCEPTION +0 -1
  1600. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.crypto.ec/LICENSE +0 -1
  1601. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/ADDITIONAL_LICENSE_INFO +0 -1
  1602. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/ASSEMBLY_EXCEPTION +0 -1
  1603. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/LICENSE +0 -1
  1604. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.dynalink/dynalink.md +0 -32
  1605. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.httpserver/ADDITIONAL_LICENSE_INFO +0 -1
  1606. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.httpserver/ASSEMBLY_EXCEPTION +0 -1
  1607. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.httpserver/LICENSE +0 -1
  1608. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.incubator.vector/ADDITIONAL_LICENSE_INFO +0 -1
  1609. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.incubator.vector/ASSEMBLY_EXCEPTION +0 -1
  1610. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.incubator.vector/LICENSE +0 -1
  1611. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.internal.vm.ci/ADDITIONAL_LICENSE_INFO +0 -1
  1612. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.internal.vm.ci/ASSEMBLY_EXCEPTION +0 -1
  1613. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.internal.vm.ci/LICENSE +0 -1
  1614. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jdwp.agent/ADDITIONAL_LICENSE_INFO +0 -1
  1615. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jdwp.agent/ASSEMBLY_EXCEPTION +0 -1
  1616. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jdwp.agent/LICENSE +0 -1
  1617. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jfr/ADDITIONAL_LICENSE_INFO +0 -1
  1618. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jfr/ASSEMBLY_EXCEPTION +0 -1
  1619. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jfr/LICENSE +0 -1
  1620. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jsobject/ADDITIONAL_LICENSE_INFO +0 -1
  1621. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jsobject/ASSEMBLY_EXCEPTION +0 -1
  1622. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.jsobject/LICENSE +0 -1
  1623. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/ADDITIONAL_LICENSE_INFO +0 -1
  1624. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/ASSEMBLY_EXCEPTION +0 -1
  1625. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/LICENSE +0 -1
  1626. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/cldr.md +0 -1
  1627. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.localedata/thaidict.md +0 -31
  1628. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management/ADDITIONAL_LICENSE_INFO +0 -1
  1629. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management/ASSEMBLY_EXCEPTION +0 -1
  1630. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management/LICENSE +0 -1
  1631. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.agent/ADDITIONAL_LICENSE_INFO +0 -1
  1632. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.agent/ASSEMBLY_EXCEPTION +0 -1
  1633. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.agent/LICENSE +0 -1
  1634. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.jfr/ADDITIONAL_LICENSE_INFO +0 -1
  1635. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.jfr/ASSEMBLY_EXCEPTION +0 -1
  1636. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.management.jfr/LICENSE +0 -1
  1637. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.dns/ADDITIONAL_LICENSE_INFO +0 -1
  1638. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.dns/ASSEMBLY_EXCEPTION +0 -1
  1639. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.dns/LICENSE +0 -1
  1640. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.rmi/ADDITIONAL_LICENSE_INFO +0 -1
  1641. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.rmi/ASSEMBLY_EXCEPTION +0 -1
  1642. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.naming.rmi/LICENSE +0 -1
  1643. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.net/ADDITIONAL_LICENSE_INFO +0 -1
  1644. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.net/ASSEMBLY_EXCEPTION +0 -1
  1645. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.net/LICENSE +0 -1
  1646. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.nio.mapmode/ADDITIONAL_LICENSE_INFO +0 -1
  1647. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.nio.mapmode/ASSEMBLY_EXCEPTION +0 -1
  1648. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.nio.mapmode/LICENSE +0 -1
  1649. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.sctp/ADDITIONAL_LICENSE_INFO +0 -1
  1650. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.sctp/ASSEMBLY_EXCEPTION +0 -1
  1651. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.sctp/LICENSE +0 -1
  1652. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.auth/ADDITIONAL_LICENSE_INFO +0 -1
  1653. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.auth/ASSEMBLY_EXCEPTION +0 -1
  1654. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.auth/LICENSE +0 -1
  1655. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.jgss/ADDITIONAL_LICENSE_INFO +0 -1
  1656. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.jgss/ASSEMBLY_EXCEPTION +0 -1
  1657. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.security.jgss/LICENSE +0 -1
  1658. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported/ADDITIONAL_LICENSE_INFO +0 -1
  1659. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported/ASSEMBLY_EXCEPTION +0 -1
  1660. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported/LICENSE +0 -1
  1661. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported.desktop/ADDITIONAL_LICENSE_INFO +0 -1
  1662. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported.desktop/ASSEMBLY_EXCEPTION +0 -1
  1663. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.unsupported.desktop/LICENSE +0 -1
  1664. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.xml.dom/ADDITIONAL_LICENSE_INFO +0 -1
  1665. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.xml.dom/ASSEMBLY_EXCEPTION +0 -1
  1666. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.xml.dom/LICENSE +0 -1
  1667. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.zipfs/ADDITIONAL_LICENSE_INFO +0 -1
  1668. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.zipfs/ASSEMBLY_EXCEPTION +0 -1
  1669. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/legal/jdk.zipfs/LICENSE +0 -1
  1670. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/classlist +0 -1602
  1671. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/fontconfig.bfc +0 -0
  1672. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/fontconfig.properties.src +0 -332
  1673. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/javafx-swt.jar +0 -0
  1674. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/javafx.properties +0 -3
  1675. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jawt.lib +0 -0
  1676. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jfr/default.jfc +0 -1152
  1677. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jfr/profile.jfc +0 -1151
  1678. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jrt-fs.jar +0 -0
  1679. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jvm.cfg +0 -2
  1680. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/jvm.lib +0 -0
  1681. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/modules +0 -0
  1682. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/psfont.properties.ja +0 -119
  1683. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/psfontj2d.properties +0 -323
  1684. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/security/blocked.certs +0 -39
  1685. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/security/cacerts +0 -0
  1686. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/security/public_suffix_list.dat +0 -0
  1687. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/tzdb.dat +0 -0
  1688. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/lib/tzmappings +0 -361
  1689. quarchpy/connection_specific/jdk_jres/win_amd64_jdk_jre/release +0 -2
  1690. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-311.pyc +0 -0
  1691. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-312.pyc +0 -0
  1692. quarchpy/connection_specific/serial/__pycache__/__init__.cpython-313.pyc +0 -0
  1693. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-311.pyc +0 -0
  1694. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-312.pyc +0 -0
  1695. quarchpy/connection_specific/serial/__pycache__/serialutil.cpython-313.pyc +0 -0
  1696. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-311.pyc +0 -0
  1697. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-312.pyc +0 -0
  1698. quarchpy/connection_specific/serial/__pycache__/serialwin32.cpython-313.pyc +0 -0
  1699. quarchpy/connection_specific/serial/__pycache__/win32.cpython-311.pyc +0 -0
  1700. quarchpy/connection_specific/serial/__pycache__/win32.cpython-312.pyc +0 -0
  1701. quarchpy/connection_specific/serial/__pycache__/win32.cpython-313.pyc +0 -0
  1702. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-311.pyc +0 -0
  1703. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  1704. quarchpy/connection_specific/serial/tools/__pycache__/__init__.cpython-313.pyc +0 -0
  1705. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-311.pyc +0 -0
  1706. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-312.pyc +0 -0
  1707. quarchpy/connection_specific/serial/tools/__pycache__/list_ports.cpython-313.pyc +0 -0
  1708. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-311.pyc +0 -0
  1709. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-312.pyc +0 -0
  1710. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_common.cpython-313.pyc +0 -0
  1711. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-311.pyc +0 -0
  1712. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-312.pyc +0 -0
  1713. quarchpy/connection_specific/serial/tools/__pycache__/list_ports_windows.cpython-313.pyc +0 -0
  1714. quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-311.pyc +0 -0
  1715. quarchpy/connection_specific/usb_libs/__pycache__/libusb1.cpython-312.pyc +0 -0
  1716. quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-311.pyc +0 -0
  1717. quarchpy/connection_specific/usb_libs/__pycache__/usb1.cpython-312.pyc +0 -0
  1718. quarchpy/debug/__pycache__/SystemTest.cpython-311.pyc +0 -0
  1719. quarchpy/debug/__pycache__/SystemTest.cpython-312.pyc +0 -0
  1720. quarchpy/debug/__pycache__/SystemTest.cpython-313.pyc +0 -0
  1721. quarchpy/debug/__pycache__/__init__.cpython-311.pyc +0 -0
  1722. quarchpy/debug/__pycache__/__init__.cpython-312.pyc +0 -0
  1723. quarchpy/debug/__pycache__/__init__.cpython-313.pyc +0 -0
  1724. quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
  1725. quarchpy/debug/__pycache__/module_debug.cpython-312.pyc +0 -0
  1726. quarchpy/debug/__pycache__/module_debug.cpython-313.pyc +0 -0
  1727. quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
  1728. quarchpy/debug/__pycache__/simple_terminal.cpython-312.pyc +0 -0
  1729. quarchpy/debug/__pycache__/simple_terminal.cpython-313.pyc +0 -0
  1730. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
  1731. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-312.pyc +0 -0
  1732. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-313.pyc +0 -0
  1733. quarchpy/debug/__pycache__/versionCompare.cpython-311.pyc +0 -0
  1734. quarchpy/debug/__pycache__/versionCompare.cpython-312.pyc +0 -0
  1735. quarchpy/debug/__pycache__/versionCompare.cpython-313.pyc +0 -0
  1736. quarchpy/device/__pycache__/__init__.cpython-311.pyc +0 -0
  1737. quarchpy/device/__pycache__/__init__.cpython-312.pyc +0 -0
  1738. quarchpy/device/__pycache__/__init__.cpython-313.pyc +0 -0
  1739. quarchpy/device/__pycache__/device.cpython-311.pyc +0 -0
  1740. quarchpy/device/__pycache__/device.cpython-312.pyc +0 -0
  1741. quarchpy/device/__pycache__/device.cpython-313.pyc +0 -0
  1742. quarchpy/device/__pycache__/quarchArray.cpython-311.pyc +0 -0
  1743. quarchpy/device/__pycache__/quarchArray.cpython-312.pyc +0 -0
  1744. quarchpy/device/__pycache__/quarchArray.cpython-313.pyc +0 -0
  1745. quarchpy/device/__pycache__/quarchPPM.cpython-311.pyc +0 -0
  1746. quarchpy/device/__pycache__/quarchPPM.cpython-312.pyc +0 -0
  1747. quarchpy/device/__pycache__/quarchPPM.cpython-313.pyc +0 -0
  1748. quarchpy/device/__pycache__/quarchQPS.cpython-311.pyc +0 -0
  1749. quarchpy/device/__pycache__/quarchQPS.cpython-312.pyc +0 -0
  1750. quarchpy/device/__pycache__/quarchQPS.cpython-313.pyc +0 -0
  1751. quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
  1752. quarchpy/device/__pycache__/scanDevices.cpython-312.pyc +0 -0
  1753. quarchpy/device/__pycache__/scanDevices.cpython-313.pyc +0 -0
  1754. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-311.pyc +0 -0
  1755. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-312.pyc +0 -0
  1756. quarchpy/disk_test/__pycache__/AbsDiskFinder.cpython-313.pyc +0 -0
  1757. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-311.pyc +0 -0
  1758. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-312.pyc +0 -0
  1759. quarchpy/disk_test/__pycache__/DiskTargetSelection.cpython-313.pyc +0 -0
  1760. quarchpy/disk_test/__pycache__/__init__.cpython-311.pyc +0 -0
  1761. quarchpy/disk_test/__pycache__/__init__.cpython-312.pyc +0 -0
  1762. quarchpy/disk_test/__pycache__/__init__.cpython-313.pyc +0 -0
  1763. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-311.pyc +0 -0
  1764. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-312.pyc +0 -0
  1765. quarchpy/disk_test/__pycache__/iometerDiskFinder.cpython-313.pyc +0 -0
  1766. quarchpy/fio/__pycache__/FIO_interface.cpython-311.pyc +0 -0
  1767. quarchpy/fio/__pycache__/FIO_interface.cpython-312.pyc +0 -0
  1768. quarchpy/fio/__pycache__/FIO_interface.cpython-313.pyc +0 -0
  1769. quarchpy/fio/__pycache__/__init__.cpython-311.pyc +0 -0
  1770. quarchpy/fio/__pycache__/__init__.cpython-312.pyc +0 -0
  1771. quarchpy/fio/__pycache__/__init__.cpython-313.pyc +0 -0
  1772. quarchpy/iometer/__pycache__/__init__.cpython-311.pyc +0 -0
  1773. quarchpy/iometer/__pycache__/__init__.cpython-312.pyc +0 -0
  1774. quarchpy/iometer/__pycache__/__init__.cpython-313.pyc +0 -0
  1775. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-311.pyc +0 -0
  1776. quarchpy/iometer/__pycache__/gen_iometer_template.cpython-313.pyc +0 -0
  1777. quarchpy/iometer/__pycache__/iometerFuncs.cpython-311.pyc +0 -0
  1778. quarchpy/iometer/__pycache__/iometerFuncs.cpython-312.pyc +0 -0
  1779. quarchpy/iometer/__pycache__/iometerFuncs.cpython-313.pyc +0 -0
  1780. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-311.pyc +0 -0
  1781. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-312.pyc +0 -0
  1782. quarchpy/qis/__pycache__/StreamHeaderInfo.cpython-313.pyc +0 -0
  1783. quarchpy/qis/__pycache__/__init__.cpython-311.pyc +0 -0
  1784. quarchpy/qis/__pycache__/__init__.cpython-312.pyc +0 -0
  1785. quarchpy/qis/__pycache__/__init__.cpython-313.pyc +0 -0
  1786. quarchpy/qis/__pycache__/qisFuncs.cpython-311.pyc +0 -0
  1787. quarchpy/qis/__pycache__/qisFuncs.cpython-312.pyc +0 -0
  1788. quarchpy/qis/__pycache__/qisFuncs.cpython-313.pyc +0 -0
  1789. quarchpy/qps/__pycache__/__init__.cpython-311.pyc +0 -0
  1790. quarchpy/qps/__pycache__/__init__.cpython-312.pyc +0 -0
  1791. quarchpy/qps/__pycache__/__init__.cpython-313.pyc +0 -0
  1792. quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
  1793. quarchpy/qps/__pycache__/qpsFuncs.cpython-312.pyc +0 -0
  1794. quarchpy/qps/__pycache__/qpsFuncs.cpython-313.pyc +0 -0
  1795. quarchpy/user_interface/__pycache__/__init__.cpython-311.pyc +0 -0
  1796. quarchpy/user_interface/__pycache__/__init__.cpython-312.pyc +0 -0
  1797. quarchpy/user_interface/__pycache__/__init__.cpython-313.pyc +0 -0
  1798. quarchpy/user_interface/__pycache__/user_interface.cpython-311.pyc +0 -0
  1799. quarchpy/user_interface/__pycache__/user_interface.cpython-312.pyc +0 -0
  1800. quarchpy/user_interface/__pycache__/user_interface.cpython-313.pyc +0 -0
  1801. quarchpy/utilities/__pycache__/TestCenter.cpython-311.pyc +0 -0
  1802. quarchpy/utilities/__pycache__/TestCenter.cpython-312.pyc +0 -0
  1803. quarchpy/utilities/__pycache__/TestCenter.cpython-313.pyc +0 -0
  1804. quarchpy/utilities/__pycache__/TimeValue.cpython-311.pyc +0 -0
  1805. quarchpy/utilities/__pycache__/TimeValue.cpython-312.pyc +0 -0
  1806. quarchpy/utilities/__pycache__/TimeValue.cpython-313.pyc +0 -0
  1807. quarchpy/utilities/__pycache__/Version.cpython-311.pyc +0 -0
  1808. quarchpy/utilities/__pycache__/Version.cpython-312.pyc +0 -0
  1809. quarchpy/utilities/__pycache__/Version.cpython-313.pyc +0 -0
  1810. quarchpy/utilities/__pycache__/__init__.cpython-311.pyc +0 -0
  1811. quarchpy/utilities/__pycache__/__init__.cpython-312.pyc +0 -0
  1812. quarchpy/utilities/__pycache__/__init__.cpython-313.pyc +0 -0
  1813. quarchpy-2.2.13.dev1.dist-info/RECORD +0 -1853
  1814. {quarchpy-2.2.13.dev1.dist-info → quarchpy-2.2.14.dist-info}/top_level.txt +0 -0
@@ -1,2360 +1,2360 @@
1
- # Copyright (C) 2010-2015 Vincent Pelletier <plr.vincent@gmail.com>
2
- #
3
- # This library is free software; you can redistribute it and/or
4
- # modify it under the terms of the GNU Lesser General Public
5
- # License as published by the Free Software Foundation; either
6
- # version 2.1 of the License, or (at your option) any later version.
7
- #
8
- # This library is distributed in the hope that it will be useful,
9
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
- # Lesser General Public License for more details.
12
- #
13
- # You should have received a copy of the GNU Lesser General Public
14
- # License along with this library; if not, write to the Free Software
15
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
-
17
- # pylint: disable=invalid-name, too-many-locals, too-many-arguments
18
- # pylint: disable=too-many-public-methods, too-many-instance-attributes
19
- # pylint: disable=missing-docstring
20
- """
21
- Pythonic wrapper for libusb-1.0.
22
-
23
- The first thing you must do is to get an "USB context". To do so, create an
24
- USBContext instance.
25
- Then, you can use it to browse available USB devices and open the one you want
26
- to talk to.
27
- At this point, you should have a USBDeviceHandle instance (as returned by
28
- USBContext or USBDevice instances), and you can start exchanging with the
29
- device.
30
-
31
- Features:
32
- - Basic device settings (configuration & interface selection, ...)
33
- - String descriptor lookups (ASCII & unicode), and list supported language
34
- codes
35
- - Synchronous I/O (control, bulk, interrupt)
36
- - Asynchronous I/O (control, bulk, interrupt, isochronous)
37
- Note: Isochronous support is not well tested.
38
- See USBPoller, USBTransfer and USBTransferHelper.
39
-
40
- All LIBUSB_* constants are available in this module, without the LIBUSB_
41
- prefix - with one exception: LIBUSB_5GBPS_OPERATION is available as
42
- SUPER_SPEED_OPERATION, so it is a valid python identifier.
43
-
44
- All LIBUSB_ERROR_* constants are available in this module as exception classes,
45
- subclassing USBError.
46
- """
47
-
48
- import libusb1
49
- from ctypes import byref, create_string_buffer, c_int, sizeof, POINTER, \
50
- cast, c_uint8, c_uint16, c_ubyte, string_at, c_void_p, cdll, addressof
51
- import sys
52
- import threading
53
- from ctypes.util import find_library
54
- import warnings
55
- import weakref
56
- import collections
57
- import functools
58
-
59
- __all__ = [
60
- 'USBContext', 'USBDeviceHandle', 'USBDevice', 'hasCapability',
61
- 'USBPoller', 'USBTransfer', 'USBTransferHelper', 'EVENT_CALLBACK_SET',
62
- 'USBPollerThread', 'USBEndpoint', 'USBInterfaceSetting', 'USBInterface',
63
- 'USBConfiguration', 'DoomedTransferError', 'getVersion', 'USBError',
64
- ]
65
- # Bind libusb1 constants and libusb1.USBError to this module, so user does not
66
- # have to import two modules.
67
- USBError = libusb1.USBError
68
- STATUS_TO_EXCEPTION_DICT = {}
69
- def __bindConstants():
70
- global_dict = globals()
71
- PREFIX = 'LIBUSB_'
72
- for name, value in libusb1.__dict__.items():
73
- if name.startswith(PREFIX):
74
- name = name[len(PREFIX):]
75
- # Gah.
76
- if name == '5GBPS_OPERATION':
77
- name = 'SUPER_SPEED_OPERATION'
78
- assert name not in global_dict
79
- global_dict[name] = value
80
- __all__.append(name)
81
- # Finer-grained exceptions.
82
- for name, value in libusb1.libusb_error.forward_dict.items():
83
- if value:
84
- assert name.startswith(PREFIX + 'ERROR_'), name
85
- if name == 'LIBUSB_ERROR_IO':
86
- name = 'ErrorIO'
87
- else:
88
- name = ''.join(x.capitalize() for x in name.split('_')[1:])
89
- name = 'USB' + name
90
- assert name not in global_dict, name
91
- assert value not in STATUS_TO_EXCEPTION_DICT
92
- STATUS_TO_EXCEPTION_DICT[value] = global_dict[name] = type(
93
- name,
94
- (USBError, ),
95
- {'value': value},
96
- )
97
- __all__.append(name)
98
- __bindConstants()
99
- del __bindConstants
100
-
101
- def raiseUSBError(value):
102
- raise STATUS_TO_EXCEPTION_DICT.get(value, USBError)(value)
103
-
104
- def mayRaiseUSBError(value):
105
- if value < 0:
106
- raiseUSBError(value)
107
-
108
- try:
109
- namedtuple = collections.namedtuple
110
- except AttributeError:
111
- Version = lambda *x: x
112
- else:
113
- Version = namedtuple(
114
- 'Version',
115
- ['major', 'minor', 'micro', 'nano', 'rc', 'describe'],
116
- )
117
-
118
- if sys.version_info[0] == 3:
119
- BYTE = bytes([0])
120
- # pylint: disable=redefined-builtin
121
- xrange = range
122
- long = int
123
- # pylint: enable=redefined-builtin
124
- else:
125
- BYTE = '\x00'
126
- # pylint: disable=undefined-variable
127
- CONTROL_SETUP = BYTE * CONTROL_SETUP_SIZE
128
- # pylint: enable=undefined-variable
129
-
130
- if sys.version_info[:2] >= (2, 6):
131
- if sys.platform == 'win32':
132
- from ctypes import get_last_error as get_errno
133
- else:
134
- from ctypes import get_errno
135
- else:
136
- def get_errno():
137
- raise NotImplementedError(
138
- 'Your python version does not support errno/last_error'
139
- )
140
-
141
- __libc_name = find_library('c')
142
- if __libc_name is None:
143
- # Of course, will leak memory.
144
- # Should we warn user ? How ?
145
- _free = lambda x: None
146
- else:
147
- _free = getattr(cdll, __libc_name).free
148
- del __libc_name
149
-
150
- try:
151
- WeakSet = weakref.WeakSet
152
- except AttributeError:
153
- # Python < 2.7: tiny wrapper around WeakKeyDictionary
154
- class WeakSet(object):
155
- def __init__(self):
156
- self.__dict = weakref.WeakKeyDictionary()
157
-
158
- def add(self, item):
159
- self.__dict[item] = None
160
-
161
- def pop(self):
162
- return self.__dict.popitem()[0]
163
-
164
- # Default string length
165
- # From a comment in libusb-1.0: "Some devices choke on size > 255"
166
- STRING_LENGTH = 255
167
-
168
- # As of v3 of USB specs, there cannot be more than 7 hubs from controler to
169
- # device.
170
- PATH_MAX_DEPTH = 7
171
-
172
- EVENT_CALLBACK_SET = frozenset((
173
- # pylint: disable=undefined-variable
174
- TRANSFER_COMPLETED,
175
- TRANSFER_ERROR,
176
- TRANSFER_TIMED_OUT,
177
- TRANSFER_CANCELLED,
178
- TRANSFER_STALL,
179
- TRANSFER_NO_DEVICE,
180
- TRANSFER_OVERFLOW,
181
- # pylint: enable=undefined-variable
182
- ))
183
-
184
- DEFAULT_ASYNC_TRANSFER_ERROR_CALLBACK = lambda x: False
185
-
186
- def create_binary_buffer(init_or_size):
187
- # Prevent ctypes from adding a trailing null char.
188
- if isinstance(init_or_size, (int, long)):
189
- result = create_string_buffer(init_or_size)
190
- else:
191
- result = create_string_buffer(init_or_size, len(init_or_size))
192
- return result
193
-
194
- class DoomedTransferError(Exception):
195
- """Exception raised when altering/submitting a doomed transfer."""
196
- pass
197
-
198
- class USBTransfer(object):
199
- """
200
- USB asynchronous transfer control & data.
201
-
202
- All modification methods will raise if called on a submitted transfer.
203
- Methods noted as "should not be called on a submitted transfer" will not
204
- prevent you from reading, but returned value is unspecified.
205
-
206
- Note on user_data: because of pypy's current ctype restrictions, user_data
207
- is not provided to C level, but is managed purely in python. It should
208
- change nothing for you, unless you are looking at underlying C transfer
209
- structure - which you should never have to.
210
- """
211
- # Prevent garbage collector from freeing the free function before our
212
- # instances, as we need it to property destruct them.
213
- __libusb_free_transfer = libusb1.libusb_free_transfer
214
- __libusb_cancel_transfer = libusb1.libusb_cancel_transfer
215
- __USBError = USBError
216
- # pylint: disable=undefined-variable
217
- __USBErrorNotFound = USBErrorNotFound
218
- # pylint: enable=undefined-variable
219
- __transfer = None
220
- __initialized = False
221
- __submitted = False
222
- __callback = None
223
- __ctypesCallbackWrapper = None
224
- __doomed = False
225
- __user_data = None
226
- __transfer_buffer = None
227
-
228
- def __init__(self, handle, iso_packets, before_submit, after_completion):
229
- """
230
- You should not instanciate this class directly.
231
- Call "getTransfer" method on an USBDeviceHandle instance to get
232
- instances of this class.
233
- """
234
- if iso_packets < 0:
235
- raise ValueError(
236
- 'Cannot request a negative number of iso packets.'
237
- )
238
- self.__handle = handle
239
- self.__before_submit = before_submit
240
- self.__after_completion = after_completion
241
- self.__num_iso_packets = iso_packets
242
- result = libusb1.libusb_alloc_transfer(iso_packets)
243
- if not result:
244
- # pylint: disable=undefined-variable
245
- raise USBErrorNoMem
246
- # pylint: enable=undefined-variable
247
- self.__transfer = result
248
- self.__ctypesCallbackWrapper = libusb1.libusb_transfer_cb_fn_p(
249
- self.__callbackWrapper)
250
-
251
- def close(self):
252
- """
253
- Break reference cycles to allow instance to be garbage-collected.
254
- Raises if called on a submitted transfer.
255
- """
256
- if self.__submitted:
257
- raise ValueError('Cannot close a submitted transfer')
258
- self.doom()
259
- self.__initialized = False
260
- # Break possible external reference cycles
261
- self.__callback = None
262
- self.__user_data = None
263
- # Break libusb_transfer reference cycles
264
- self.__ctypesCallbackWrapper = None
265
- # For some reason, overwriting callback is not enough to remove this
266
- # reference cycle - though sometimes it works:
267
- # self -> self.__dict__ -> libusb_transfer -> dict[x] -> dict[x] ->
268
- # CThunkObject -> __callbackWrapper -> self
269
- # So free transfer altogether.
270
- if self.__transfer is not None:
271
- self.__libusb_free_transfer(self.__transfer)
272
- self.__transfer = None
273
- self.__transfer_buffer = None
274
- # Break USBDeviceHandle reference cycle
275
- self.__before_submit = None
276
- self.__after_completion = None
277
-
278
- def doom(self):
279
- """
280
- Prevent transfer from being submitted again.
281
- """
282
- self.__doomed = True
283
-
284
- def __del__(self):
285
- if self.__transfer is not None:
286
- try:
287
- # If this doesn't raise, we're doomed; transfer was submitted,
288
- # still python decided to garbage-collect this instance.
289
- # Stick to libusb's documentation, and don't free the
290
- # transfer. If interpreter is shutting down, kernel will
291
- # reclaim memory anyway.
292
- # Note: we can't prevent transfer's buffer from being
293
- # garbage-collected as soon as there will be no remaining
294
- # reference to transfer, so a segfault might happen anyway.
295
- # Should we warn user ? How ?
296
- self.cancel()
297
- except self.__USBErrorNotFound:
298
- # Transfer was not submitted, we can free it.
299
- self.__libusb_free_transfer(self.__transfer)
300
-
301
- # pylint: disable=unused-argument
302
- def __callbackWrapper(self, transfer_p):
303
- """
304
- Makes it possible for user-provided callback to alter transfer when
305
- fired (ie, mark transfer as not submitted upon call).
306
- """
307
- self.__submitted = False
308
- self.__after_completion(self)
309
- callback = self.__callback
310
- if callback is not None:
311
- callback(self)
312
- if self.__doomed:
313
- self.close()
314
- # pylint: enable=unused-argument
315
-
316
- def setCallback(self, callback):
317
- """
318
- Change transfer's callback.
319
- """
320
- self.__callback = callback
321
-
322
- def getCallback(self):
323
- """
324
- Get currently set callback.
325
- """
326
- return self.__callback
327
-
328
- def setControl(
329
- self, request_type, request, value, index, buffer_or_len,
330
- callback=None, user_data=None, timeout=0):
331
- """
332
- Setup transfer for control use.
333
-
334
- request_type, request, value, index
335
- See USBDeviceHandle.controlWrite.
336
- request_type defines transfer direction (see
337
- ENDPOINT_OUT and ENDPOINT_IN)).
338
- buffer_or_len
339
- Either a string (when sending data), or expected data length (when
340
- receiving data).
341
- callback
342
- Callback function to be invoked on transfer completion.
343
- Called with transfer as parameter, return value ignored.
344
- user_data
345
- User data to pass to callback function.
346
- timeout
347
- Transfer timeout in milliseconds. 0 to disable.
348
- """
349
- if self.__submitted:
350
- raise ValueError('Cannot alter a submitted transfer')
351
- if self.__doomed:
352
- raise DoomedTransferError('Cannot reuse a doomed transfer')
353
- if isinstance(buffer_or_len, (int, long)):
354
- length = buffer_or_len
355
- # pylint: disable=undefined-variable
356
- string_buffer = create_binary_buffer(length + CONTROL_SETUP_SIZE)
357
- # pylint: enable=undefined-variable
358
- else:
359
- length = len(buffer_or_len)
360
- string_buffer = create_binary_buffer(CONTROL_SETUP + buffer_or_len)
361
- self.__initialized = False
362
- self.__transfer_buffer = string_buffer
363
- self.__user_data = user_data
364
- libusb1.libusb_fill_control_setup(
365
- string_buffer, request_type, request, value, index, length)
366
- libusb1.libusb_fill_control_transfer(
367
- self.__transfer, self.__handle, string_buffer,
368
- self.__ctypesCallbackWrapper, None, timeout)
369
- self.__callback = callback
370
- self.__initialized = True
371
-
372
- def setBulk(
373
- self, endpoint, buffer_or_len, callback=None, user_data=None,
374
- timeout=0):
375
- """
376
- Setup transfer for bulk use.
377
-
378
- endpoint
379
- Endpoint to submit transfer to. Defines transfer direction (see
380
- ENDPOINT_OUT and ENDPOINT_IN)).
381
- buffer_or_len
382
- Either a string (when sending data), or expected data length (when
383
- receiving data)
384
- callback
385
- Callback function to be invoked on transfer completion.
386
- Called with transfer as parameter, return value ignored.
387
- user_data
388
- User data to pass to callback function.
389
- timeout
390
- Transfer timeout in milliseconds. 0 to disable.
391
- """
392
- if self.__submitted:
393
- raise ValueError('Cannot alter a submitted transfer')
394
- if self.__doomed:
395
- raise DoomedTransferError('Cannot reuse a doomed transfer')
396
- string_buffer = create_binary_buffer(buffer_or_len)
397
- self.__initialized = False
398
- self.__transfer_buffer = string_buffer
399
- self.__user_data = user_data
400
- libusb1.libusb_fill_bulk_transfer(
401
- self.__transfer, self.__handle, endpoint, string_buffer,
402
- sizeof(string_buffer), self.__ctypesCallbackWrapper, None, timeout)
403
- self.__callback = callback
404
- self.__initialized = True
405
-
406
- def setInterrupt(
407
- self, endpoint, buffer_or_len, callback=None, user_data=None,
408
- timeout=0):
409
- """
410
- Setup transfer for interrupt use.
411
-
412
- endpoint
413
- Endpoint to submit transfer to. Defines transfer direction (see
414
- ENDPOINT_OUT and ENDPOINT_IN)).
415
- buffer_or_len
416
- Either a string (when sending data), or expected data length (when
417
- receiving data)
418
- callback
419
- Callback function to be invoked on transfer completion.
420
- Called with transfer as parameter, return value ignored.
421
- user_data
422
- User data to pass to callback function.
423
- timeout
424
- Transfer timeout in milliseconds. 0 to disable.
425
- """
426
- if self.__submitted:
427
- raise ValueError('Cannot alter a submitted transfer')
428
- if self.__doomed:
429
- raise DoomedTransferError('Cannot reuse a doomed transfer')
430
- string_buffer = create_binary_buffer(buffer_or_len)
431
- self.__initialized = False
432
- self.__transfer_buffer = string_buffer
433
- self.__user_data = user_data
434
- libusb1.libusb_fill_interrupt_transfer(
435
- self.__transfer, self.__handle, endpoint, string_buffer,
436
- sizeof(string_buffer), self.__ctypesCallbackWrapper, None, timeout)
437
- self.__callback = callback
438
- self.__initialized = True
439
-
440
- def setIsochronous(
441
- self, endpoint, buffer_or_len, callback=None,
442
- user_data=None, timeout=0, iso_transfer_length_list=None):
443
- """
444
- Setup transfer for isochronous use.
445
-
446
- endpoint
447
- Endpoint to submit transfer to. Defines transfer direction (see
448
- ENDPOINT_OUT and ENDPOINT_IN)).
449
- buffer_or_len
450
- Either a string (when sending data), or expected data length (when
451
- receiving data)
452
- callback
453
- Callback function to be invoked on transfer completion.
454
- Called with transfer as parameter, return value ignored.
455
- user_data
456
- User data to pass to callback function.
457
- timeout
458
- Transfer timeout in milliseconds. 0 to disable.
459
- iso_transfer_length_list
460
- List of individual transfer sizes. If not provided, buffer_or_len
461
- will be divided evenly among available transfers if possible, and
462
- raise ValueError otherwise.
463
- """
464
- if self.__submitted:
465
- raise ValueError('Cannot alter a submitted transfer')
466
- num_iso_packets = self.__num_iso_packets
467
- if num_iso_packets == 0:
468
- raise TypeError(
469
- 'This transfer canot be used for isochronous I/O. '
470
- 'You must get another one with a non-zero iso_packets '
471
- 'parameter.'
472
- )
473
- if self.__doomed:
474
- raise DoomedTransferError('Cannot reuse a doomed transfer')
475
- string_buffer = create_binary_buffer(buffer_or_len)
476
- buffer_length = sizeof(string_buffer)
477
- if iso_transfer_length_list is None:
478
- iso_length, remainder = divmod(buffer_length, num_iso_packets)
479
- if remainder:
480
- raise ValueError(
481
- 'Buffer size %i cannot be evenly distributed among %i '
482
- 'transfers' % (
483
- buffer_length,
484
- num_iso_packets,
485
- )
486
- )
487
- iso_transfer_length_list = [iso_length] * num_iso_packets
488
- configured_iso_packets = len(iso_transfer_length_list)
489
- if configured_iso_packets > num_iso_packets:
490
- raise ValueError(
491
- 'Too many ISO transfer lengths (%i), there are '
492
- 'only %i ISO transfers available' % (
493
- configured_iso_packets,
494
- num_iso_packets,
495
- )
496
- )
497
- if sum(iso_transfer_length_list) > buffer_length:
498
- raise ValueError(
499
- 'ISO transfers too long (%i), there are only '
500
- '%i bytes available' % (
501
- sum(iso_transfer_length_list),
502
- buffer_length,
503
- )
504
- )
505
- transfer_p = self.__transfer
506
- self.__initialized = False
507
- self.__transfer_buffer = string_buffer
508
- self.__user_data = user_data
509
- libusb1.libusb_fill_iso_transfer(
510
- transfer_p, self.__handle, endpoint, string_buffer, buffer_length,
511
- configured_iso_packets, self.__ctypesCallbackWrapper, None,
512
- timeout)
513
- for length, iso_packet_desc in zip(
514
- iso_transfer_length_list,
515
- libusb1.get_iso_packet_list(transfer_p)):
516
- if length <= 0:
517
- raise ValueError(
518
- 'Negative/null length transfers are not possible.'
519
- )
520
- iso_packet_desc.length = length
521
- self.__callback = callback
522
- self.__initialized = True
523
-
524
- def getType(self):
525
- """
526
- Get transfer type.
527
-
528
- Returns one of:
529
- TRANSFER_TYPE_CONTROL
530
- TRANSFER_TYPE_ISOCHRONOUS
531
- TRANSFER_TYPE_BULK
532
- TRANSFER_TYPE_INTERRUPT
533
- """
534
- return self.__transfer.contents.type
535
-
536
- def getEndpoint(self):
537
- """
538
- Get endpoint.
539
- """
540
- return self.__transfer.contents.endpoint
541
-
542
- def getStatus(self):
543
- """
544
- Get transfer status.
545
- Should not be called on a submitted transfer.
546
- """
547
- return self.__transfer.contents.status
548
-
549
- def getActualLength(self):
550
- """
551
- Get actually transfered data length.
552
- Should not be called on a submitted transfer.
553
- """
554
- return self.__transfer.contents.actual_length
555
-
556
- def getBuffer(self):
557
- """
558
- Get data buffer content.
559
- Should not be called on a submitted transfer.
560
- """
561
- transfer_p = self.__transfer
562
- transfer = transfer_p.contents
563
- # pylint: disable=undefined-variable
564
- if transfer.type == TRANSFER_TYPE_CONTROL:
565
- # pylint: enable=undefined-variable
566
- result = libusb1.libusb_control_transfer_get_data(transfer_p)
567
- else:
568
- result = string_at(transfer.buffer, transfer.length)
569
- return result
570
-
571
- def getUserData(self):
572
- """
573
- Retrieve user data provided on setup.
574
- """
575
- return self.__user_data
576
-
577
- def setUserData(self, user_data):
578
- """
579
- Change user data.
580
- """
581
- self.__user_data = user_data
582
-
583
- def getISOBufferList(self):
584
- """
585
- Get individual ISO transfer's buffer.
586
- Returns a list with one item per ISO transfer, with their
587
- individually-configured sizes.
588
- Returned list is consistent with getISOSetupList return value.
589
- Should not be called on a submitted transfer.
590
-
591
- See also iterISO.
592
- """
593
- transfer_p = self.__transfer
594
- transfer = transfer_p.contents
595
- # pylint: disable=undefined-variable
596
- if transfer.type != TRANSFER_TYPE_ISOCHRONOUS:
597
- # pylint: enable=undefined-variable
598
- raise TypeError(
599
- 'This method cannot be called on non-iso transfers.'
600
- )
601
- return libusb1.get_iso_packet_buffer_list(transfer_p)
602
-
603
- def getISOSetupList(self):
604
- """
605
- Get individual ISO transfer's setup.
606
- Returns a list of dicts, each containing an individual ISO transfer
607
- parameters:
608
- - length
609
- - actual_length
610
- - status
611
- (see libusb1's API documentation for their signification)
612
- Returned list is consistent with getISOBufferList return value.
613
- Should not be called on a submitted transfer (except for 'length'
614
- values).
615
- """
616
- transfer_p = self.__transfer
617
- transfer = transfer_p.contents
618
- # pylint: disable=undefined-variable
619
- if transfer.type != TRANSFER_TYPE_ISOCHRONOUS:
620
- # pylint: enable=undefined-variable
621
- raise TypeError(
622
- 'This method cannot be called on non-iso transfers.'
623
- )
624
- return [
625
- {
626
- 'length': x.length,
627
- 'actual_length': x.actual_length,
628
- 'status': x.status,
629
- }
630
- for x in libusb1.get_iso_packet_list(transfer_p)
631
- ]
632
-
633
- def iterISO(self):
634
- """
635
- Generator yielding (status, buffer) for each isochornous transfer.
636
- buffer is truncated to actual_length.
637
- This is more efficient than calling both getISOBufferList and
638
- getISOSetupList when receiving data.
639
- Should not be called on a submitted transfer.
640
- """
641
- transfer_p = self.__transfer
642
- transfer = transfer_p.contents
643
- # pylint: disable=undefined-variable
644
- if transfer.type != TRANSFER_TYPE_ISOCHRONOUS:
645
- # pylint: enable=undefined-variable
646
- raise TypeError(
647
- 'This method cannot be called on non-iso transfers.'
648
- )
649
- buffer_position = transfer.buffer
650
- for iso_transfer in libusb1.get_iso_packet_list(transfer_p):
651
- yield (
652
- iso_transfer.status,
653
- string_at(buffer_position, iso_transfer.actual_length),
654
- )
655
- buffer_position += iso_transfer.length
656
-
657
- def setBuffer(self, buffer_or_len):
658
- """
659
- Replace buffer with a new one.
660
- Allows resizing read buffer and replacing data sent.
661
- Note: resizing is not allowed for isochronous buffer (use
662
- setIsochronous).
663
- Note: disallowed on control transfers (use setControl).
664
- """
665
- if self.__submitted:
666
- raise ValueError('Cannot alter a submitted transfer')
667
- transfer = self.__transfer.contents
668
- # pylint: disable=undefined-variable
669
- if transfer.type == TRANSFER_TYPE_CONTROL:
670
- # pylint: enable=undefined-variable
671
- raise ValueError(
672
- 'To alter control transfer buffer, use setControl'
673
- )
674
- buff = create_binary_buffer(buffer_or_len)
675
- # pylint: disable=undefined-variable
676
- if transfer.type == TRANSFER_TYPE_ISOCHRONOUS and \
677
- sizeof(buff) != transfer.length:
678
- # pylint: enable=undefined-variable
679
- raise ValueError(
680
- 'To alter isochronous transfer buffer length, use '
681
- 'setIsochronous'
682
- )
683
- self.__transfer_buffer = buff
684
- transfer.buffer = cast(buff, c_void_p)
685
- transfer.length = sizeof(buff)
686
-
687
- def isSubmitted(self):
688
- """
689
- Tells if this transfer is submitted and still pending.
690
- """
691
- return self.__submitted
692
-
693
- def submit(self):
694
- """
695
- Submit transfer for asynchronous handling.
696
- """
697
- if self.__submitted:
698
- raise ValueError('Cannot submit a submitted transfer')
699
- if not self.__initialized:
700
- raise ValueError(
701
- 'Cannot submit a transfer until it has been initialized'
702
- )
703
- if self.__doomed:
704
- raise DoomedTransferError('Cannot submit doomed transfer')
705
- self.__before_submit(self)
706
- self.__submitted = True
707
- result = libusb1.libusb_submit_transfer(self.__transfer)
708
- if result:
709
- self.__after_completion(self)
710
- self.__submitted = False
711
- raiseUSBError(result)
712
-
713
- def cancel(self):
714
- """
715
- Cancel transfer.
716
- Note: cancellation happens asynchronously, so you must wait for
717
- TRANSFER_CANCELLED.
718
- """
719
- if not self.__submitted:
720
- # XXX: Workaround for a bug reported on libusb 1.0.8: calling
721
- # libusb_cancel_transfer on a non-submitted transfer might
722
- # trigger a segfault.
723
- raise self.__USBErrorNotFound
724
- result = self.__libusb_cancel_transfer(self.__transfer)
725
- if result:
726
- raise self.__USBError(result)
727
-
728
- class USBTransferHelper(object):
729
- """
730
- Simplifies subscribing to the same transfer over and over, and callback
731
- handling:
732
- - no need to read event status to execute apropriate code, just setup
733
- different functions for each status code
734
- - just return True instead of calling submit
735
- - no need to check if transfer is doomed before submitting it again,
736
- DoomedTransferError is caught.
737
-
738
- Callbacks used in this class must follow the callback API described in
739
- USBTransfer, and are expected to return a boolean:
740
- - True if transfer is to be submitted again (to receive/send more data)
741
- - False otherwise
742
-
743
- Note: as per libusb1 specifications, isochronous transfer global state
744
- might be TRANSFER_COMPLETED although some individual packets might
745
- have an error status. You can check individual packet status by calling
746
- getISOSetupList on transfer object in your callback.
747
- """
748
- def __init__(self, transfer=None):
749
- """
750
- Create a transfer callback dispatcher.
751
-
752
- transfer parameter is deprecated. If provided, it will be equivalent
753
- to:
754
- helper = USBTransferHelper()
755
- transfer.setCallback(helper)
756
- and also allows using deprecated methods on this class (otherwise,
757
- they raise AttributeError).
758
- """
759
- if transfer is not None:
760
- # DEPRECATED - to drop
761
- self.__transfer = transfer
762
- transfer.setCallback(self)
763
- self.__event_callback_dict = {}
764
- self.__errorCallback = DEFAULT_ASYNC_TRANSFER_ERROR_CALLBACK
765
-
766
- def submit(self):
767
- """
768
- Submit the asynchronous read request.
769
- Deprecated. Use submit on transfer.
770
- """
771
- # DEPRECATED - to drop
772
- self.__transfer.submit()
773
-
774
- def cancel(self):
775
- """
776
- Cancel a pending read request.
777
- Deprecated. Use cancel on transfer.
778
- """
779
- # DEPRECATED - to drop
780
- self.__transfer.cancel()
781
-
782
- def setEventCallback(self, event, callback):
783
- """
784
- Set a function to call for a given event.
785
- event must be one of:
786
- TRANSFER_COMPLETED
787
- TRANSFER_ERROR
788
- TRANSFER_TIMED_OUT
789
- TRANSFER_CANCELLED
790
- TRANSFER_STALL
791
- TRANSFER_NO_DEVICE
792
- TRANSFER_OVERFLOW
793
- """
794
- if event not in EVENT_CALLBACK_SET:
795
- raise ValueError('Unknown event %r.' % (event, ))
796
- self.__event_callback_dict[event] = callback
797
-
798
- def setDefaultCallback(self, callback):
799
- """
800
- Set the function to call for event which don't have a specific callback
801
- registered.
802
- The initial default callback does nothing and returns False.
803
- """
804
- self.__errorCallback = callback
805
-
806
- def getEventCallback(self, event, default=None):
807
- """
808
- Return the function registered to be called for given event identifier.
809
- """
810
- return self.__event_callback_dict.get(event, default)
811
-
812
- def __call__(self, transfer):
813
- """
814
- Callback to set on transfers.
815
- """
816
- if self.getEventCallback(transfer.getStatus(), self.__errorCallback)(
817
- transfer):
818
- try:
819
- transfer.submit()
820
- except DoomedTransferError:
821
- pass
822
-
823
- def isSubmited(self):
824
- """
825
- Returns whether this reader is currently waiting for an event.
826
- Deprecatd. Use isSubmitted on transfer.
827
- """
828
- # DEPRECATED - to drop
829
- return self.__transfer.isSubmitted()
830
-
831
- class USBPollerThread(threading.Thread):
832
- """
833
- Implements libusb1 documentation about threaded, asynchronous
834
- applications.
835
- In short, instanciate this class once (...per USBContext instance), call
836
- start() on the instance, and do whatever you need.
837
- This thread will be used to execute transfer completion callbacks, and you
838
- are free to use libusb1's synchronous API in another thread, and can forget
839
- about libusb1 file descriptors.
840
-
841
- See http://libusb.sourceforge.net/api-1.0/mtasync.html .
842
- """
843
- def __init__(self, context, poller, exc_callback=None):
844
- """
845
- Create a poller thread for given context.
846
- Warning: it will not check if another poller instance was already
847
- present for that context, and will replace it.
848
-
849
- poller
850
- (same as USBPoller.__init__ "poller" parameter)
851
-
852
- exc_callback (callable)
853
- Called with a libusb_error value as single parameter when event
854
- handling fails.
855
- If not given, an USBError will be raised, interrupting the thread.
856
- """
857
- super(USBPollerThread, self).__init__()
858
- self.daemon = True
859
- self.__context = context
860
- self.__poller = poller
861
- self.__fd_set = set()
862
- context.setPollFDNotifiers(self._registerFD, self._unregisterFD)
863
- for fd, events in context.getPollFDList():
864
- self._registerFD(fd, events, None)
865
- if exc_callback is not None:
866
- self.exceptionHandler = exc_callback
867
-
868
- def __del__(self):
869
- self.__context.setPollFDNotifiers(None, None)
870
-
871
- # pylint: disable=method-hidden
872
- @staticmethod
873
- def exceptionHandler(exc):
874
- raise exc
875
- # pylint: enable=method-hidden
876
-
877
- def run(self):
878
- # We expect quite some spinning in below loop, so move any unneeded
879
- # operation out of it.
880
- context = self.__context
881
- poll = self.__poller.poll
882
- try_lock_events = context.tryLockEvents
883
- lock_event_waiters = context.lockEventWaiters
884
- wait_for_event = context.waitForEvent
885
- unlock_event_waiters = context.unlockEventWaiters
886
- event_handling_ok = context.eventHandlingOK
887
- unlock_events = context.unlockEvents
888
- handle_events_locked = context.handleEventsLocked
889
- event_handler_active = context.eventHandlerActive
890
- getNextTimeout = context.getNextTimeout
891
- exceptionHandler = self.exceptionHandler
892
- fd_set = self.__fd_set
893
- while fd_set:
894
- if try_lock_events():
895
- lock_event_waiters()
896
- while event_handler_active():
897
- wait_for_event()
898
- unlock_event_waiters()
899
- else:
900
- try:
901
- while event_handling_ok():
902
- if poll(getNextTimeout()):
903
- try:
904
- handle_events_locked()
905
- except USBError:
906
- exceptionHandler(sys.exc_info()[1])
907
- finally:
908
- unlock_events()
909
-
910
- def _registerFD(self, fd, events, _):
911
- self.__poller.register(fd, events)
912
- self.__fd_set.add(fd)
913
-
914
- def _unregisterFD(self, fd, _):
915
- self.__fd_set.discard(fd)
916
- self.__poller.unregister(fd)
917
-
918
- class USBPoller(object):
919
- """
920
- Class allowing integration of USB event polling in a file-descriptor
921
- monitoring event loop.
922
-
923
- WARNING: Do not call "poll" from several threads concurently. Do not use
924
- synchronous USB transfers in a thread while "poll" is running. Doing so
925
- will result in unnecessarily long pauses in some threads. Opening and/or
926
- closing devices while polling can cause race conditions to occur.
927
- """
928
- def __init__(self, context, poller):
929
- """
930
- Create a poller for given context.
931
- Warning: it will not check if another poller instance was already
932
- present for that context, and will replace it.
933
-
934
- poller is a polling instance implementing the following methods:
935
- - register(fd, event_flags)
936
- event_flags have the same meaning as in poll API (POLLIN & POLLOUT)
937
- - unregister(fd)
938
- - poll(timeout)
939
- timeout being a float in seconds, or negative/None if there is no
940
- timeout.
941
- It must return a list of (descriptor, event) pairs.
942
- Note: USBPoller is itself a valid poller.
943
- Note2: select.poll uses a timeout in milliseconds, for some reason
944
- (all other select.* classes use seconds for timeout), so you should
945
- wrap it to convert & round/truncate timeout.
946
- """
947
- self.__context = context
948
- self.__poller = poller
949
- self.__fd_set = set()
950
- context.setPollFDNotifiers(self._registerFD, self._unregisterFD)
951
- for fd, events in context.getPollFDList():
952
- self._registerFD(fd, events)
953
-
954
- def __del__(self):
955
- self.__context.setPollFDNotifiers(None, None)
956
-
957
- def poll(self, timeout=None):
958
- """
959
- Poll for events.
960
- timeout can be a float in seconds, or None for no timeout.
961
- Returns a list of (descriptor, event) pairs.
962
- """
963
- next_usb_timeout = self.__context.getNextTimeout()
964
- if timeout is None or timeout < 0:
965
- usb_timeout = next_usb_timeout
966
- elif next_usb_timeout:
967
- usb_timeout = min(next_usb_timeout, timeout)
968
- else:
969
- usb_timeout = timeout
970
- event_list = self.__poller.poll(usb_timeout)
971
- if event_list:
972
- fd_set = self.__fd_set
973
- result = [(x, y) for x, y in event_list if x not in fd_set]
974
- if len(result) != len(event_list):
975
- self.__context.handleEventsTimeout()
976
- else:
977
- result = event_list
978
- self.__context.handleEventsTimeout()
979
- return result
980
-
981
- def register(self, fd, events):
982
- """
983
- Register an USB-unrelated fd to poller.
984
- Convenience method.
985
- """
986
- if fd in self.__fd_set:
987
- raise ValueError(
988
- 'This fd is a special USB event fd, it cannot be polled.'
989
- )
990
- self.__poller.register(fd, events)
991
-
992
- def unregister(self, fd):
993
- """
994
- Unregister an USB-unrelated fd from poller.
995
- Convenience method.
996
- """
997
- if fd in self.__fd_set:
998
- raise ValueError(
999
- 'This fd is a special USB event fd, it must stay registered.'
1000
- )
1001
- self.__poller.unregister(fd)
1002
-
1003
- # pylint: disable=unused-argument
1004
- def _registerFD(self, fd, events, user_data=None):
1005
- self.register(fd, events)
1006
- self.__fd_set.add(fd)
1007
- # pylint: enable=unused-argument
1008
-
1009
- # pylint: disable=unused-argument
1010
- def _unregisterFD(self, fd, user_data=None):
1011
- self.__fd_set.discard(fd)
1012
- self.unregister(fd)
1013
- # pylint: enable=unused-argument
1014
-
1015
- class USBDeviceHandle(object):
1016
- """
1017
- Represents an opened USB device.
1018
- """
1019
- __handle = None
1020
- __libusb_close = libusb1.libusb_close
1021
- __USBError = USBError
1022
- # pylint: disable=undefined-variable
1023
- __USBErrorNoDevice = USBErrorNoDevice
1024
- __USBErrorNotFound = USBErrorNotFound
1025
- __USBErrorInterrupted = USBErrorInterrupted
1026
- # pylint: enable=undefined-variable
1027
- __set = set
1028
- __KeyError = KeyError
1029
- __sys = sys
1030
-
1031
- def __init__(self, context, handle, device):
1032
- """
1033
- You should not instanciate this class directly.
1034
- Call "open" method on an USBDevice instance to get an USBDeviceHandle
1035
- instance.
1036
- """
1037
- self.__context = context
1038
- # Weak reference to transfers about this device so we can clean up
1039
- # before closing device.
1040
- self.__transfer_set = WeakSet()
1041
- # Strong references to inflight transfers so they do not get freed
1042
- # even if user drops all strong references to them. If this instance
1043
- # is garbage-collected, we close all transfers, so it's fine.
1044
- self.__inflight = inflight = set()
1045
- # XXX: For some reason, doing self.__inflight.{add|remove} inside
1046
- # getTransfer causes extra intermediate python objects for each
1047
- # allocated transfer. Storing them as properties solves this. Found
1048
- # with objgraph.
1049
- self.__inflight_add = inflight.add
1050
- self.__inflight_remove = inflight.remove
1051
- self.__handle = handle
1052
- self.__device = device
1053
-
1054
- def __del__(self):
1055
- self.close()
1056
-
1057
- def close(self):
1058
- """
1059
- Close this handle. If not called explicitely, will be called by
1060
- destructor.
1061
-
1062
- This method cancels any in-flight transfer when it is called. As
1063
- cancellation is not immediate, this method needs to let libusb handle
1064
- events until transfers are actually cancelled.
1065
- In multi-threaded programs, this can lead to stalls. To avoid this,
1066
- do not close nor let GC collect a USBDeviceHandle which has in-flight
1067
- transfers.
1068
- """
1069
- handle = self.__handle
1070
- if handle is not None:
1071
- # Build a strong set from weak self.__transfer_set so we can doom
1072
- # and close all contained transfers.
1073
- # Because of backward compatibility, self.__transfer_set might be a
1074
- # wrapper around WeakKeyDictionary. As it might be modified by gc,
1075
- # we must pop until there is not key left instead of iterating over
1076
- # it.
1077
- weak_transfer_set = self.__transfer_set
1078
- transfer_set = self.__set()
1079
- while True:
1080
- try:
1081
- transfer = weak_transfer_set.pop()
1082
- except self.__KeyError:
1083
- break
1084
- transfer_set.add(transfer)
1085
- transfer.doom()
1086
- inflight = self.__inflight
1087
- for transfer in inflight:
1088
- try:
1089
- transfer.cancel()
1090
- except (self.__USBErrorNotFound, self.__USBErrorNoDevice):
1091
- pass
1092
- while inflight:
1093
- try:
1094
- self.__context.handleEvents()
1095
- except self.__USBErrorInterrupted:
1096
- pass
1097
- for transfer in transfer_set:
1098
- transfer.close()
1099
- self.__libusb_close(handle)
1100
- self.__handle = None
1101
-
1102
- def getDevice(self):
1103
- """
1104
- Get an USBDevice instance for the device accessed through this handle.
1105
- Useful for example to query its configurations.
1106
- """
1107
- return self.__device
1108
-
1109
- def getConfiguration(self):
1110
- """
1111
- Get the current configuration number for this device.
1112
- """
1113
- configuration = c_int()
1114
- result = libusb1.libusb_get_configuration(
1115
- self.__handle, byref(configuration),
1116
- )
1117
- mayRaiseUSBError(result)
1118
- return configuration.value
1119
-
1120
- def setConfiguration(self, configuration):
1121
- """
1122
- Set the configuration number for this device.
1123
- """
1124
- result = libusb1.libusb_set_configuration(self.__handle, configuration)
1125
- mayRaiseUSBError(result)
1126
-
1127
- def claimInterface(self, interface):
1128
- """
1129
- Claim (= get exclusive access to) given interface number. Required to
1130
- receive/send data.
1131
- """
1132
- result = libusb1.libusb_claim_interface(self.__handle, interface)
1133
- mayRaiseUSBError(result)
1134
-
1135
- def releaseInterface(self, interface):
1136
- """
1137
- Release interface, allowing another process to use it.
1138
- """
1139
- result = libusb1.libusb_release_interface(self.__handle, interface)
1140
- mayRaiseUSBError(result)
1141
-
1142
- def setInterfaceAltSetting(self, interface, alt_setting):
1143
- """
1144
- Set interface's alternative setting (both parameters are integers).
1145
- """
1146
- result = libusb1.libusb_set_interface_alt_setting(
1147
- self.__handle, interface, alt_setting,
1148
- )
1149
- mayRaiseUSBError(result)
1150
-
1151
- def clearHalt(self, endpoint):
1152
- """
1153
- Clear a halt state on given endpoint number.
1154
- """
1155
- result = libusb1.libusb_clear_halt(self.__handle, endpoint)
1156
- mayRaiseUSBError(result)
1157
-
1158
- def resetDevice(self):
1159
- """
1160
- Reinitialise current device.
1161
- Attempts to restore current configuration & alt settings.
1162
- If this fails, will result in a device disconnect & reconnect, so you
1163
- have to close current device and rediscover it (notified by a
1164
- ERROR_NOT_FOUND error code).
1165
- """
1166
- result = libusb1.libusb_reset_device(self.__handle)
1167
- mayRaiseUSBError(result)
1168
-
1169
- def kernelDriverActive(self, interface):
1170
- """
1171
- Tell whether a kernel driver is active on given interface number.
1172
- """
1173
- result = libusb1.libusb_kernel_driver_active(self.__handle, interface)
1174
- if result == 0:
1175
- return False
1176
- elif result == 1:
1177
- return True
1178
- raiseUSBError(result)
1179
-
1180
- def detachKernelDriver(self, interface):
1181
- """
1182
- Ask kernel driver to detach from given interface number.
1183
- """
1184
- result = libusb1.libusb_detach_kernel_driver(self.__handle, interface)
1185
- mayRaiseUSBError(result)
1186
-
1187
- def attachKernelDriver(self, interface):
1188
- """
1189
- Ask kernel driver to re-attach to given interface number.
1190
- """
1191
- result = libusb1.libusb_attach_kernel_driver(self.__handle, interface)
1192
- mayRaiseUSBError(result)
1193
-
1194
- def setAutoDetachKernelDriver(self, enable):
1195
- """
1196
- Control automatic kernel driver detach.
1197
- enable (bool)
1198
- True to enable auto-detach, False to disable it.
1199
- """
1200
- result = libusb1.libusb_set_auto_detach_kernel_driver(
1201
- self.__handle, bool(enable),
1202
- )
1203
- mayRaiseUSBError(result)
1204
-
1205
- def getSupportedLanguageList(self):
1206
- """
1207
- Return a list of USB language identifiers (as integers) supported by
1208
- current device for its string descriptors.
1209
-
1210
- Note: language identifiers seem (I didn't check them all...) very
1211
- similar to windows language identifiers, so you may want to use
1212
- locales.windows_locale to get an rfc3066 representation. The 5 standard
1213
- HID language codes are missing though.
1214
- """
1215
- descriptor_string = create_binary_buffer(STRING_LENGTH)
1216
- result = libusb1.libusb_get_string_descriptor(
1217
- self.__handle, 0, 0, descriptor_string, sizeof(descriptor_string),
1218
- )
1219
- # pylint: disable=undefined-variable
1220
- if result == ERROR_PIPE:
1221
- # pylint: enable=undefined-variable
1222
- # From libusb_control_transfer doc:
1223
- # control request not supported by the device
1224
- return []
1225
- mayRaiseUSBError(result)
1226
- length = cast(descriptor_string, POINTER(c_ubyte))[0]
1227
- langid_list = cast(descriptor_string, POINTER(c_uint16))
1228
- result = []
1229
- append = result.append
1230
- for offset in xrange(1, length / 2):
1231
- append(libusb1.libusb_le16_to_cpu(langid_list[offset]))
1232
- return result
1233
-
1234
- def getStringDescriptor(self, descriptor, lang_id):
1235
- """
1236
- Fetch description string for given descriptor and in given language.
1237
- Use getSupportedLanguageList to know which languages are available.
1238
- Return value is an unicode string.
1239
- Return None if there is no such descriptor on device.
1240
- """
1241
- descriptor_string = create_binary_buffer(STRING_LENGTH)
1242
- result = libusb1.libusb_get_string_descriptor(
1243
- self.__handle, descriptor, lang_id, descriptor_string,
1244
- sizeof(descriptor_string),
1245
- )
1246
- # pylint: disable=undefined-variable
1247
- if result == ERROR_NOT_FOUND:
1248
- # pylint: enable=undefined-variable
1249
- return None
1250
- mayRaiseUSBError(result)
1251
- return descriptor_string.value.decode('UTF-16-LE')
1252
-
1253
- def getASCIIStringDescriptor(self, descriptor):
1254
- """
1255
- Fetch description string for given descriptor in first available
1256
- language.
1257
- Return value is an ASCII string.
1258
- Return None if there is no such descriptor on device.
1259
- """
1260
- descriptor_string = create_binary_buffer(STRING_LENGTH)
1261
- result = libusb1.libusb_get_string_descriptor_ascii(
1262
- self.__handle, descriptor, descriptor_string,
1263
- sizeof(descriptor_string),
1264
- )
1265
- # pylint: disable=undefined-variable
1266
- if result == ERROR_NOT_FOUND:
1267
- # pylint: enable=undefined-variable
1268
- return None
1269
- mayRaiseUSBError(result)
1270
- return descriptor_string.value.decode('ASCII')
1271
-
1272
- # Sync I/O
1273
-
1274
- def _controlTransfer(
1275
- self, request_type, request, value, index, data, length, timeout):
1276
- result = libusb1.libusb_control_transfer(
1277
- self.__handle, request_type, request, value, index, data, length,
1278
- timeout,
1279
- )
1280
- mayRaiseUSBError(result)
1281
- return result
1282
-
1283
- def controlWrite(
1284
- self, request_type, request, value, index, data, timeout=0):
1285
- """
1286
- Synchronous control write.
1287
- request_type: request type bitmask (bmRequestType), see
1288
- constants TYPE_* and RECIPIENT_*.
1289
- request: request id (some values are standard).
1290
- value, index, data: meaning is request-dependent.
1291
- timeout: in milliseconds, how long to wait for device acknowledgement.
1292
- Set to 0 to disable.
1293
-
1294
- Returns the number of bytes actually sent.
1295
- """
1296
- # pylint: disable=undefined-variable
1297
- request_type = (request_type & ~ENDPOINT_DIR_MASK) | ENDPOINT_OUT
1298
- # pylint: enable=undefined-variable
1299
- data = create_binary_buffer(data)
1300
- return self._controlTransfer(request_type, request, value, index, data,
1301
- sizeof(data), timeout)
1302
-
1303
- def controlRead(
1304
- self, request_type, request, value, index, length, timeout=0):
1305
- """
1306
- Synchronous control read.
1307
- timeout: in milliseconds, how long to wait for data. Set to 0 to
1308
- disable.
1309
- See controlWrite for other parameters description.
1310
-
1311
- Returns received data.
1312
- """
1313
- # pylint: disable=undefined-variable
1314
- request_type = (request_type & ~ENDPOINT_DIR_MASK) | ENDPOINT_IN
1315
- # pylint: enable=undefined-variable
1316
- data = create_binary_buffer(length)
1317
- transferred = self._controlTransfer(
1318
- request_type, request, value, index, data, length, timeout,
1319
- )
1320
- return data.raw[:transferred]
1321
-
1322
- def _bulkTransfer(self, endpoint, data, length, timeout):
1323
- transferred = c_int()
1324
- result = libusb1.libusb_bulk_transfer(
1325
- self.__handle, endpoint, data, length, byref(transferred), timeout,
1326
- )
1327
- mayRaiseUSBError(result)
1328
- return transferred.value
1329
-
1330
- def bulkWrite(self, endpoint, data, timeout=0):
1331
- """
1332
- Synchronous bulk write.
1333
- endpoint: endpoint to send data to.
1334
- data: data to send.
1335
- timeout: in milliseconds, how long to wait for device acknowledgement.
1336
- Set to 0 to disable.
1337
-
1338
- Returns the number of bytes actually sent.
1339
- """
1340
- # pylint: disable=undefined-variable
1341
- endpoint = (endpoint & ~ENDPOINT_DIR_MASK) | ENDPOINT_OUT
1342
- # pylint: enable=undefined-variable
1343
- data = create_binary_buffer(data)
1344
- return self._bulkTransfer(endpoint, data, sizeof(data), timeout)
1345
-
1346
- def bulkRead(self, endpoint, length, timeout=0):
1347
- """
1348
- Synchronous bulk read.
1349
- timeout: in milliseconds, how long to wait for data. Set to 0 to
1350
- disable.
1351
- See bulkWrite for other parameters description.
1352
-
1353
- Returns received data.
1354
- """
1355
- # pylint: disable=undefined-variable
1356
- endpoint = (endpoint & ~ENDPOINT_DIR_MASK) | ENDPOINT_IN
1357
- # pylint: enable=undefined-variable
1358
- data = create_binary_buffer(length)
1359
- transferred = self._bulkTransfer(endpoint, data, length, timeout)
1360
- # pylint: disable=invalid-slice-index
1361
- return data.raw[:transferred]
1362
- # pylint: enable=invalid-slice-index
1363
-
1364
- def _interruptTransfer(self, endpoint, data, length, timeout):
1365
- transferred = c_int()
1366
- result = libusb1.libusb_interrupt_transfer(
1367
- self.__handle, endpoint, data, length, byref(transferred), timeout,
1368
- )
1369
- mayRaiseUSBError(result)
1370
- return transferred.value
1371
-
1372
- def interruptWrite(self, endpoint, data, timeout=0):
1373
- """
1374
- Synchronous interrupt write.
1375
- endpoint: endpoint to send data to.
1376
- data: data to send.
1377
- timeout: in milliseconds, how long to wait for device acknowledgement.
1378
- Set to 0 to disable.
1379
-
1380
- Returns the number of bytes actually sent.
1381
- """
1382
- # pylint: disable=undefined-variable
1383
- endpoint = (endpoint & ~ENDPOINT_DIR_MASK) | ENDPOINT_OUT
1384
- # pylint: enable=undefined-variable
1385
- data = create_binary_buffer(data)
1386
- return self._interruptTransfer(endpoint, data, sizeof(data), timeout)
1387
-
1388
- def interruptRead(self, endpoint, length, timeout=0):
1389
- """
1390
- Synchronous interrupt write.
1391
- timeout: in milliseconds, how long to wait for data. Set to 0 to
1392
- disable.
1393
- See interruptRead for other parameters description.
1394
-
1395
- Returns received data.
1396
- """
1397
- # pylint: disable=undefined-variable
1398
- endpoint = (endpoint & ~ENDPOINT_DIR_MASK) | ENDPOINT_IN
1399
- # pylint: enable=undefined-variable
1400
- data = create_binary_buffer(length)
1401
- transferred = self._interruptTransfer(endpoint, data, length, timeout)
1402
- # pylint: disable=invalid-slice-index
1403
- return data.raw[:transferred]
1404
- # pylint: enable=invalid-slice-index
1405
-
1406
- def getTransfer(self, iso_packets=0):
1407
- """
1408
- Get an USBTransfer instance for asynchronous use.
1409
- iso_packets: the number of isochronous transfer descriptors to
1410
- allocate.
1411
- """
1412
- result = USBTransfer(
1413
- self.__handle, iso_packets,
1414
- self.__inflight_add, self.__inflight_remove,
1415
- )
1416
- self.__transfer_set.add(result)
1417
- return result
1418
-
1419
- class USBConfiguration(object):
1420
- def __init__(self, context, config):
1421
- """
1422
- You should not instanciate this class directly.
1423
- Call USBDevice methods to get instances of this class.
1424
- """
1425
- if not isinstance(config, libusb1.libusb_config_descriptor):
1426
- raise TypeError('Unexpected descriptor type.')
1427
- self.__config = config
1428
- self.__context = context
1429
-
1430
- def getNumInterfaces(self):
1431
- return self.__config.bNumInterfaces
1432
-
1433
- __len__ = getNumInterfaces
1434
-
1435
- def getConfigurationValue(self):
1436
- return self.__config.bConfigurationValue
1437
-
1438
- def getDescriptor(self):
1439
- return self.__config.iConfiguration
1440
-
1441
- def getAttributes(self):
1442
- return self.__config.bmAttributes
1443
-
1444
- def getMaxPower(self):
1445
- """
1446
- Returns device's power consumption in mW.
1447
- Beware of unit: USB descriptor uses 2mW increments, this method
1448
- converts it to mW units.
1449
- """
1450
- return self.__config.MaxPower * 2
1451
-
1452
- def getExtra(self):
1453
- """
1454
- Returns a list of extra (non-basic) descriptors (DFU, HID, ...).
1455
- """
1456
- return libusb1.get_extra(self.__config)
1457
-
1458
- def __iter__(self):
1459
- """
1460
- Iterates over interfaces available in this configuration, yielding
1461
- USBInterface instances.
1462
- """
1463
- context = self.__context
1464
- interface_list = self.__config.interface
1465
- for interface_num in xrange(self.getNumInterfaces()):
1466
- yield USBInterface(context, interface_list[interface_num])
1467
-
1468
- # BBB
1469
- iterInterfaces = __iter__
1470
-
1471
- def __getitem__(self, interface):
1472
- """
1473
- Returns an USBInterface instance.
1474
- """
1475
- if not isinstance(interface, int):
1476
- raise TypeError('interface parameter must be an integer')
1477
- if not 0 <= interface < self.getNumInterfaces():
1478
- raise IndexError('No such interface: %r' % (interface, ))
1479
- return USBInterface(self.__context, self.__config.interface[interface])
1480
-
1481
- # pylint: disable=interface-not-implemented
1482
- class USBInterface(object):
1483
- def __init__(self, context, interface):
1484
- """
1485
- You should not instanciate this class directly.
1486
- Call USBConfiguration methods to get instances of this class.
1487
- """
1488
- if not isinstance(interface, libusb1.libusb_interface):
1489
- raise TypeError('Unexpected descriptor type.')
1490
- self.__interface = interface
1491
- self.__context = context
1492
-
1493
- def getNumSettings(self):
1494
- return self.__interface.num_altsetting
1495
-
1496
- __len__ = getNumSettings
1497
-
1498
- def __iter__(self):
1499
- """
1500
- Iterates over settings in this insterface, yielding
1501
- USBInterfaceSetting instances.
1502
- """
1503
- context = self.__context
1504
- alt_setting_list = self.__interface.altsetting
1505
- for alt_setting_num in xrange(self.getNumSettings()):
1506
- yield USBInterfaceSetting(
1507
- context, alt_setting_list[alt_setting_num])
1508
-
1509
- # BBB
1510
- iterSettings = __iter__
1511
-
1512
- def __getitem__(self, alt_setting):
1513
- """
1514
- Returns an USBInterfaceSetting instance.
1515
- """
1516
- if not isinstance(alt_setting, int):
1517
- raise TypeError('alt_setting parameter must be an integer')
1518
- if not 0 <= alt_setting < self.getNumSettings():
1519
- raise IndexError('No such setting: %r' % (alt_setting, ))
1520
- return USBInterfaceSetting(
1521
- self.__context, self.__interface.altsetting[alt_setting])
1522
- # pylint: enable=interface-not-implemented
1523
-
1524
- class USBInterfaceSetting(object):
1525
- def __init__(self, context, alt_setting):
1526
- """
1527
- You should not instanciate this class directly.
1528
- Call USBDevice or USBInterface methods to get instances of this class.
1529
- """
1530
- if not isinstance(alt_setting, libusb1.libusb_interface_descriptor):
1531
- raise TypeError('Unexpected descriptor type.')
1532
- self.__alt_setting = alt_setting
1533
- self.__context = context
1534
-
1535
- def getNumber(self):
1536
- return self.__alt_setting.bInterfaceNumber
1537
-
1538
- def getAlternateSetting(self):
1539
- return self.__alt_setting.bAlternateSetting
1540
-
1541
- def getNumEndpoints(self):
1542
- return self.__alt_setting.bNumEndpoints
1543
-
1544
- __len__ = getNumEndpoints
1545
-
1546
- def getClass(self):
1547
- return self.__alt_setting.bInterfaceClass
1548
-
1549
- def getSubClass(self):
1550
- return self.__alt_setting.bInterfaceSubClass
1551
-
1552
- def getClassTuple(self):
1553
- """
1554
- For convenience: class and subclass are probably often matched
1555
- simultaneously.
1556
- """
1557
- alt_setting = self.__alt_setting
1558
- return (alt_setting.bInterfaceClass, alt_setting.bInterfaceSubClass)
1559
-
1560
- # BBB
1561
- getClassTupple = getClassTuple
1562
-
1563
- def getProtocol(self):
1564
- return self.__alt_setting.bInterfaceProtocol
1565
-
1566
- def getDescriptor(self):
1567
- return self.__alt_setting.iInterface
1568
-
1569
- def getExtra(self):
1570
- return libusb1.get_extra(self.__alt_setting)
1571
-
1572
- def __iter__(self):
1573
- """
1574
- Iterates over endpoints in this interface setting , yielding
1575
- USBEndpoint instances.
1576
- """
1577
- context = self.__context
1578
- endpoint_list = self.__alt_setting.endpoint
1579
- for endpoint_num in xrange(self.getNumEndpoints()):
1580
- yield USBEndpoint(context, endpoint_list[endpoint_num])
1581
-
1582
- # BBB
1583
- iterEndpoints = __iter__
1584
-
1585
- def __getitem__(self, endpoint):
1586
- """
1587
- Returns an USBEndpoint instance.
1588
- """
1589
- if not isinstance(endpoint, int):
1590
- raise TypeError('endpoint parameter must be an integer')
1591
- if not 0 <= endpoint < self.getNumEndpoints():
1592
- raise ValueError('No such endpoint: %r' % (endpoint, ))
1593
- return USBEndpoint(
1594
- self.__context, self.__alt_setting.endpoint[endpoint])
1595
-
1596
- class USBEndpoint(object):
1597
- def __init__(self, context, endpoint):
1598
- if not isinstance(endpoint, libusb1.libusb_endpoint_descriptor):
1599
- raise TypeError('Unexpected descriptor type.')
1600
- self.__endpoint = endpoint
1601
- self.__context = context
1602
-
1603
- def getAddress(self):
1604
- return self.__endpoint.bEndpointAddress
1605
-
1606
- def getAttributes(self):
1607
- return self.__endpoint.bmAttributes
1608
-
1609
- def getMaxPacketSize(self):
1610
- return self.__endpoint.wMaxPacketSize
1611
-
1612
- def getInterval(self):
1613
- return self.__endpoint.bInterval
1614
-
1615
- def getRefresh(self):
1616
- return self.__endpoint.bRefresh
1617
-
1618
- def getSyncAddress(self):
1619
- return self.__endpoint.bSynchAddress
1620
-
1621
- def getExtra(self):
1622
- return libusb1.get_extra(self.__endpoint)
1623
-
1624
- class USBDevice(object):
1625
- """
1626
- Represents a USB device.
1627
- """
1628
-
1629
- __configuration_descriptor_list = ()
1630
- __libusb_unref_device = libusb1.libusb_unref_device
1631
- __libusb_free_config_descriptor = libusb1.libusb_free_config_descriptor
1632
- __byref = byref
1633
-
1634
- def __init__(self, context, device_p, can_load_configuration=True):
1635
- """
1636
- You should not instanciate this class directly.
1637
- Call USBContext methods to receive instances of this class.
1638
- """
1639
- self.__context = context
1640
- libusb1.libusb_ref_device(device_p)
1641
- self.device_p = device_p
1642
- # Fetch device descriptor
1643
- device_descriptor = libusb1.libusb_device_descriptor()
1644
- result = libusb1.libusb_get_device_descriptor(
1645
- device_p, byref(device_descriptor))
1646
- mayRaiseUSBError(result)
1647
- self.device_descriptor = device_descriptor
1648
- if can_load_configuration:
1649
- self.__configuration_descriptor_list = descriptor_list = []
1650
- append = descriptor_list.append
1651
- device_p = self.device_p
1652
- for configuration_id in xrange(
1653
- self.device_descriptor.bNumConfigurations):
1654
- config = libusb1.libusb_config_descriptor_p()
1655
- result = libusb1.libusb_get_config_descriptor(
1656
- device_p, configuration_id, byref(config))
1657
- # pylint: disable=undefined-variable
1658
- if result == ERROR_NOT_FOUND:
1659
- # pylint: enable=undefined-variable
1660
- # Some devices (ex windows' root hubs) tell they have
1661
- # one configuration, but they have no configuration
1662
- # descriptor.
1663
- continue
1664
- mayRaiseUSBError(result)
1665
- append(config.contents)
1666
-
1667
- def __del__(self):
1668
- self.__libusb_unref_device(self.device_p)
1669
- # pylint: disable=redefined-outer-name
1670
- byref = self.__byref
1671
- # pylint: enable=redefined-outer-name
1672
- for config in self.__configuration_descriptor_list:
1673
- self.__libusb_free_config_descriptor(byref(config))
1674
-
1675
- def __str__(self):
1676
- return 'Bus %03i Device %03i: ID %04x:%04x' % (
1677
- self.getBusNumber(),
1678
- self.getDeviceAddress(),
1679
- self.getVendorID(),
1680
- self.getProductID(),
1681
- )
1682
-
1683
- def __len__(self):
1684
- return len(self.__configuration_descriptor_list)
1685
-
1686
- def __getitem__(self, index):
1687
- return USBConfiguration(
1688
- self.__context, self.__configuration_descriptor_list[index])
1689
-
1690
- def __key(self):
1691
- return (
1692
- id(self.__context), self.getBusNumber(),
1693
- self.getDeviceAddress(), self.getVendorID(),
1694
- self.getProductID(),
1695
- )
1696
-
1697
- def __hash__(self):
1698
- return hash(self.__key())
1699
-
1700
- def __eq__(self, other):
1701
- return type(self) == type(other) and (
1702
- self.device_p == other.device_p or
1703
- # pylint: disable=protected-access
1704
- self.__key() == other.__key()
1705
- # pylint: enable=protected-access
1706
- )
1707
-
1708
- def iterConfigurations(self):
1709
- context = self.__context
1710
- for config in self.__configuration_descriptor_list:
1711
- yield USBConfiguration(context, config)
1712
-
1713
- # BBB
1714
- iterConfiguations = iterConfigurations
1715
-
1716
- def iterSettings(self):
1717
- for config in self.iterConfigurations():
1718
- for interface in config:
1719
- for setting in interface:
1720
- yield setting
1721
-
1722
- def getBusNumber(self):
1723
- """
1724
- Get device's bus number.
1725
- """
1726
- return libusb1.libusb_get_bus_number(self.device_p)
1727
-
1728
- def getPortNumber(self):
1729
- """
1730
- Get device's port number.
1731
- """
1732
- return libusb1.libusb_get_port_number(self.device_p)
1733
-
1734
- def getPortNumberList(self):
1735
- """
1736
- Get the port number of each hub toward device.
1737
- """
1738
- port_list = (c_uint8 * PATH_MAX_DEPTH)()
1739
- result = libusb1.libusb_get_port_numbers(
1740
- self.device_p, port_list, len(port_list))
1741
- mayRaiseUSBError(result)
1742
- return list(port_list[:result])
1743
-
1744
- # TODO: wrap libusb_get_parent when/if libusb removes the need to be inside
1745
- # a libusb_(get|free)_device_list block.
1746
-
1747
- def getDeviceAddress(self):
1748
- """
1749
- Get device's address on its bus.
1750
- """
1751
- return libusb1.libusb_get_device_address(self.device_p)
1752
-
1753
- def getbcdUSB(self):
1754
- """
1755
- Get the USB spec version device complies to, in BCD format.
1756
- """
1757
- return self.device_descriptor.bcdUSB
1758
-
1759
- def getDeviceClass(self):
1760
- """
1761
- Get device's class id.
1762
- """
1763
- return self.device_descriptor.bDeviceClass
1764
-
1765
- def getDeviceSubClass(self):
1766
- """
1767
- Get device's subclass id.
1768
- """
1769
- return self.device_descriptor.bDeviceSubClass
1770
-
1771
- def getDeviceProtocol(self):
1772
- """
1773
- Get device's protocol id.
1774
- """
1775
- return self.device_descriptor.bDeviceProtocol
1776
-
1777
- def getMaxPacketSize0(self):
1778
- """
1779
- Get device's max packet size for endpoint 0 (control).
1780
- """
1781
- return self.device_descriptor.bMaxPacketSize0
1782
-
1783
- def getMaxPacketSize(self, endpoint):
1784
- """
1785
- Get device's max packet size for given endpoint.
1786
-
1787
- Warning: this function will not always give you the expected result.
1788
- See https://libusb.org/ticket/77 . You should instead consult the
1789
- endpoint descriptor of current configuration and alternate setting.
1790
- """
1791
- result = libusb1.libusb_get_max_packet_size(self.device_p, endpoint)
1792
- mayRaiseUSBError(result)
1793
- return result
1794
-
1795
- def getMaxISOPacketSize(self, endpoint):
1796
- """
1797
- Get the maximum size for a single isochronous packet for given
1798
- endpoint.
1799
-
1800
- Warning: this function will not always give you the expected result.
1801
- See https://libusb.org/ticket/77 . You should instead consult the
1802
- endpoint descriptor of current configuration and alternate setting.
1803
- """
1804
- result = libusb1.libusb_get_max_iso_packet_size(self.device_p, endpoint)
1805
- mayRaiseUSBError(result)
1806
- return result
1807
-
1808
- def getVendorID(self):
1809
- """
1810
- Get device's vendor id.
1811
- """
1812
- return self.device_descriptor.idVendor
1813
-
1814
- def getProductID(self):
1815
- """
1816
- Get device's product id.
1817
- """
1818
- return self.device_descriptor.idProduct
1819
-
1820
- def getbcdDevice(self):
1821
- """
1822
- Get device's release number.
1823
- """
1824
- return self.device_descriptor.bcdDevice
1825
-
1826
- def getSupportedLanguageList(self):
1827
- """
1828
- Get the list of language ids device has string descriptors for.
1829
- """
1830
- temp_handle = self.open()
1831
- return temp_handle.getSupportedLanguageList()
1832
-
1833
- def _getStringDescriptor(self, descriptor, lang_id):
1834
- if descriptor == 0:
1835
- result = None
1836
- else:
1837
- temp_handle = self.open()
1838
- result = temp_handle.getStringDescriptor(descriptor, lang_id)
1839
- return result
1840
-
1841
- def _getASCIIStringDescriptor(self, descriptor):
1842
- if descriptor == 0:
1843
- result = None
1844
- else:
1845
- temp_handle = self.open()
1846
- result = temp_handle.getASCIIStringDescriptor(descriptor)
1847
- return result
1848
-
1849
- def getManufacturer(self):
1850
- """
1851
- Get device's manufaturer name.
1852
- Note: opens the device temporarily.
1853
- """
1854
- return self._getASCIIStringDescriptor(
1855
- self.device_descriptor.iManufacturer)
1856
-
1857
- def getProduct(self):
1858
- """
1859
- Get device's product name.
1860
- Note: opens the device temporarily.
1861
- """
1862
- return self._getASCIIStringDescriptor(self.device_descriptor.iProduct)
1863
-
1864
- def getSerialNumber(self):
1865
- """
1866
- Get device's serial number.
1867
- Note: opens the device temporarily.
1868
- """
1869
- return self._getASCIIStringDescriptor(
1870
- self.device_descriptor.iSerialNumber)
1871
-
1872
- def getNumConfigurations(self):
1873
- """
1874
- Get device's number of possible configurations.
1875
- """
1876
- return self.device_descriptor.bNumConfigurations
1877
-
1878
- def getDeviceSpeed(self):
1879
- """
1880
- Get device's speed.
1881
-
1882
- Returns one of:
1883
- SPEED_UNKNOWN
1884
- SPEED_LOW
1885
- SPEED_FULL
1886
- SPEED_HIGH
1887
- SPEED_SUPER
1888
- """
1889
- return libusb1.libusb_get_device_speed(self.device_p)
1890
-
1891
- def open(self):
1892
- """
1893
- Open device.
1894
- Returns an USBDeviceHandle instance.
1895
- """
1896
- handle = libusb1.libusb_device_handle_p()
1897
- result = libusb1.libusb_open(self.device_p, byref(handle))
1898
- mayRaiseUSBError(result)
1899
- return USBDeviceHandle(self.__context, handle, self)
1900
-
1901
- _zero_tv = libusb1.timeval(0, 0)
1902
- _zero_tv_p = byref(_zero_tv)
1903
-
1904
- class USBContext(object):
1905
- """
1906
- libusb1 USB context.
1907
-
1908
- Provides methods to enumerate & look up USB devices.
1909
- Also provides access to global (device-independent) libusb1 functions.
1910
- """
1911
- __libusb_exit = libusb1.libusb_exit
1912
- __context_p = None
1913
- __added_cb = None
1914
- __removed_cb = None
1915
- __libusb_set_pollfd_notifiers = libusb1.libusb_set_pollfd_notifiers
1916
-
1917
- #pylint: disable=no-self-argument
1918
- def _validContext(func):
1919
- # Defined inside USBContext so we can access "self.__*".
1920
- @functools.wraps(func)
1921
- def wrapper(self, *args, **kw):
1922
- # pylint: disable=protected-access
1923
- self.__context_cond.acquire()
1924
- self.__context_refcount += 1
1925
- self.__context_cond.release()
1926
- try:
1927
- if self.__context_p is not None:
1928
- #pylint: disable=not-callable
1929
- return func(self, *args, **kw)
1930
- #pylint: enable=not-callable
1931
- finally:
1932
- self.__context_cond.acquire()
1933
- self.__context_refcount -= 1
1934
- if not self.__context_refcount:
1935
- self.__context_cond.notifyAll()
1936
- self.__context_cond.release()
1937
- # pylint: enable=protected-access
1938
- return wrapper
1939
- #pylint: enable=no-self-argument
1940
-
1941
- def __init__(self):
1942
- """
1943
- Create a new USB context.
1944
- """
1945
- # Used to prevent an exit to cause a segfault if a concurrent thread
1946
- # is still in libusb.
1947
- self.__context_refcount = 0
1948
- self.__context_cond = threading.Condition()
1949
- context_p = libusb1.libusb_context_p()
1950
- result = libusb1.libusb_init(byref(context_p))
1951
- mayRaiseUSBError(result)
1952
- self.__context_p = context_p
1953
- self.__hotplug_callback_dict = {}
1954
-
1955
- def __del__(self):
1956
- # Avoid locking.
1957
- # XXX: Assumes __del__ should not normally be called while any
1958
- # instance's method is being executed. It seems unlikely (they hold a
1959
- # reference to their instance).
1960
- self._exit()
1961
-
1962
- def exit(self):
1963
- """
1964
- Close (destroy) this USB context.
1965
-
1966
- When this method has been called, methods on its instance will
1967
- become mosty no-ops, returning None.
1968
- """
1969
- self.__context_cond.acquire()
1970
- try:
1971
- while self.__context_refcount and self.__context_p is not None:
1972
- self.__context_cond.wait()
1973
- self._exit()
1974
- finally:
1975
- self.__context_cond.notifyAll()
1976
- self.__context_cond.release()
1977
-
1978
- def _exit(self):
1979
- context_p = self.__context_p
1980
- if context_p is not None:
1981
- self.__libusb_exit(context_p)
1982
- self.__context_p = None
1983
- self.__added_cb = None
1984
- self.__removed_cb = None
1985
-
1986
- @_validContext
1987
- def getDeviceList(self, skip_on_access_error=False, skip_on_error=False):
1988
- """
1989
- Return a list of all USB devices currently plugged in, as USBDevice
1990
- instances.
1991
-
1992
- skip_on_error (bool)
1993
- If True, ignore devices which raise USBError.
1994
-
1995
- skip_on_access_error (bool)
1996
- DEPRECATED. Alias for skip_on_error.
1997
- """
1998
- skip_on_error = skip_on_error or skip_on_access_error
1999
- device_p_p = libusb1.libusb_device_p_p()
2000
- libusb_device_p = libusb1.libusb_device_p
2001
- device_list_len = libusb1.libusb_get_device_list(self.__context_p,
2002
- byref(device_p_p))
2003
- mayRaiseUSBError(device_list_len)
2004
- try:
2005
- result = []
2006
- append = result.append
2007
- for device_p in device_p_p[:device_list_len]:
2008
- try:
2009
- # Instanciate our own libusb_device_p object so we can free
2010
- # libusb-provided device list. Is this a bug in ctypes that
2011
- # it doesn't copy pointer value (=pointed memory address) ?
2012
- # At least, it's not so convenient and forces using such
2013
- # weird code.
2014
- device = USBDevice(self, libusb_device_p(device_p.contents))
2015
- except USBError:
2016
- if not skip_on_error:
2017
- raise
2018
- else:
2019
- append(device)
2020
- finally:
2021
- libusb1.libusb_free_device_list(device_p_p, 1)
2022
- return result
2023
-
2024
- def getByVendorIDAndProductID(
2025
- self, vendor_id, product_id,
2026
- skip_on_access_error=False, skip_on_error=False):
2027
- """
2028
- Get the first USB device matching given vendor and product ids.
2029
- Returns an USBDevice instance, or None if no present device match.
2030
- skip_on_error (bool)
2031
- (see getDeviceList)
2032
- skip_on_access_error (bool)
2033
- (see getDeviceList)
2034
- """
2035
- for device in self.getDeviceList(
2036
- skip_on_access_error=skip_on_access_error,
2037
- skip_on_error=skip_on_error):
2038
- if device.getVendorID() == vendor_id and \
2039
- device.getProductID() == product_id:
2040
- return device
2041
-
2042
- def openByVendorIDAndProductID(
2043
- self, vendor_id, product_id,
2044
- skip_on_access_error=False, skip_on_error=False):
2045
- """
2046
- Get the first USB device matching given vendor and product ids.
2047
- Returns an USBDeviceHandle instance, or None if no present device
2048
- match.
2049
- skip_on_error (bool)
2050
- (see getDeviceList)
2051
- skip_on_access_error (bool)
2052
- (see getDeviceList)
2053
- """
2054
- result = self.getByVendorIDAndProductID(
2055
- vendor_id, product_id,
2056
- skip_on_access_error=skip_on_access_error,
2057
- skip_on_error=skip_on_error)
2058
- if result is not None:
2059
- return result.open()
2060
-
2061
- @_validContext
2062
- def getPollFDList(self):
2063
- """
2064
- Return file descriptors to be used to poll USB events.
2065
- You should not have to call this method, unless you are integrating
2066
- this class with a polling mechanism.
2067
- """
2068
- pollfd_p_p = libusb1.libusb_get_pollfds(self.__context_p)
2069
- if not pollfd_p_p:
2070
- errno = get_errno()
2071
- if errno:
2072
- raise OSError(errno)
2073
- else:
2074
- # Assume not implemented
2075
- raise NotImplementedError(
2076
- 'Your libusb does not seem to implement pollable FDs')
2077
- try:
2078
- result = []
2079
- append = result.append
2080
- fd_index = 0
2081
- while pollfd_p_p[fd_index]:
2082
- append((
2083
- pollfd_p_p[fd_index].contents.fd,
2084
- pollfd_p_p[fd_index].contents.events,
2085
- ))
2086
- fd_index += 1
2087
- finally:
2088
- _free(pollfd_p_p)
2089
- return result
2090
-
2091
- @_validContext
2092
- def handleEvents(self):
2093
- """
2094
- Handle any pending event (blocking).
2095
- See libusb1 documentation for details (there is a timeout, so it's
2096
- not "really" blocking).
2097
- """
2098
- result = libusb1.libusb_handle_events(self.__context_p)
2099
- mayRaiseUSBError(result)
2100
-
2101
- # TODO: handleEventsCompleted
2102
-
2103
- @_validContext
2104
- def handleEventsTimeout(self, tv=0):
2105
- """
2106
- Handle any pending event.
2107
- If tv is 0, will return immediately after handling already-pending
2108
- events.
2109
- Otherwise, defines the maximum amount of time to wait for events, in
2110
- seconds.
2111
- """
2112
- if tv is None:
2113
- tv = 0
2114
- tv_s = int(tv)
2115
- tv = libusb1.timeval(tv_s, int((tv - tv_s) * 1000000))
2116
- result = libusb1.libusb_handle_events_timeout(
2117
- self.__context_p, byref(tv))
2118
- mayRaiseUSBError(result)
2119
-
2120
- # TODO: handleEventsTimeoutCompleted
2121
-
2122
- @_validContext
2123
- def setPollFDNotifiers(
2124
- self, added_cb=None, removed_cb=None, user_data=None):
2125
- """
2126
- Give libusb1 methods to call when it should add/remove file descriptor
2127
- for polling.
2128
- You should not have to call this method, unless you are integrating
2129
- this class with a polling mechanism.
2130
- """
2131
- if added_cb is None:
2132
- added_cb = POINTER(None)
2133
- else:
2134
- added_cb = libusb1.libusb_pollfd_added_cb_p(added_cb)
2135
- if removed_cb is None:
2136
- removed_cb = POINTER(None)
2137
- else:
2138
- removed_cb = libusb1.libusb_pollfd_removed_cb_p(removed_cb)
2139
- self.__added_cb = added_cb
2140
- self.__removed_cb = removed_cb
2141
- self.__libusb_set_pollfd_notifiers(
2142
- self.__context_p, added_cb, removed_cb, user_data)
2143
-
2144
- @_validContext
2145
- def getNextTimeout(self):
2146
- """
2147
- Returns the next internal timeout that libusb needs to handle, in
2148
- seconds, or None if no timeout is needed.
2149
- You should not have to call this method, unless you are integrating
2150
- this class with a polling mechanism.
2151
- """
2152
- timeval = libusb1.timeval()
2153
- result = libusb1.libusb_get_next_timeout(
2154
- self.__context_p, byref(timeval))
2155
- if result == 0:
2156
- return None
2157
- elif result == 1:
2158
- return timeval.tv_sec + (timeval.tv_usec * 0.000001)
2159
- raiseUSBError(result)
2160
-
2161
- @_validContext
2162
- def setDebug(self, level):
2163
- """
2164
- Set debugging level.
2165
- Note: depending on libusb compilation settings, this might have no
2166
- effect.
2167
- """
2168
- libusb1.libusb_set_debug(self.__context_p, level)
2169
-
2170
- @_validContext
2171
- def tryLockEvents(self):
2172
- """
2173
- See libusb_try_lock_events doc.
2174
- """
2175
- return libusb1.libusb_try_lock_events(self.__context_p)
2176
-
2177
- @_validContext
2178
- def lockEvents(self):
2179
- """
2180
- See libusb_lock_events doc.
2181
- """
2182
- libusb1.libusb_lock_events(self.__context_p)
2183
-
2184
- @_validContext
2185
- def lockEventWaiters(self):
2186
- """
2187
- See libusb_lock_event_waiters doc.
2188
- """
2189
- libusb1.libusb_lock_event_waiters(self.__context_p)
2190
-
2191
- @_validContext
2192
- def waitForEvent(self, tv=0):
2193
- """
2194
- See libusb_wait_for_event doc.
2195
- """
2196
- if tv is None:
2197
- tv = 0
2198
- tv_s = int(tv)
2199
- tv = libusb1.timeval(tv_s, int((tv - tv_s) * 1000000))
2200
- libusb1.libusb_wait_for_event(self.__context_p, byref(tv))
2201
-
2202
- @_validContext
2203
- def unlockEventWaiters(self):
2204
- """
2205
- See libusb_unlock_event_waiters doc.
2206
- """
2207
- libusb1.libusb_unlock_event_waiters(self.__context_p)
2208
-
2209
- @_validContext
2210
- def eventHandlingOK(self):
2211
- """
2212
- See libusb_event_handling_ok doc.
2213
- """
2214
- return libusb1.libusb_event_handling_ok(self.__context_p)
2215
-
2216
- @_validContext
2217
- def unlockEvents(self):
2218
- """
2219
- See libusb_unlock_events doc.
2220
- """
2221
- libusb1.libusb_unlock_events(self.__context_p)
2222
-
2223
- @_validContext
2224
- def handleEventsLocked(self):
2225
- """
2226
- See libusb_handle_events_locked doc.
2227
- """
2228
- # XXX: does tv parameter need to be exposed ?
2229
- result = libusb1.libusb_handle_events_locked(
2230
- self.__context_p, _zero_tv_p)
2231
- mayRaiseUSBError(result)
2232
-
2233
- @_validContext
2234
- def eventHandlerActive(self):
2235
- """
2236
- See libusb_event_handler_active doc.
2237
- """
2238
- return libusb1.libusb_event_handler_active(self.__context_p)
2239
-
2240
- @staticmethod
2241
- def hasCapability(capability):
2242
- """
2243
- Backward-compatibility alias for module-level hasCapability.
2244
- """
2245
- return hasCapability(capability)
2246
-
2247
- @_validContext
2248
- def hotplugRegisterCallback(
2249
- self, callback,
2250
- # pylint: disable=undefined-variable
2251
- events=HOTPLUG_EVENT_DEVICE_ARRIVED | HOTPLUG_EVENT_DEVICE_LEFT,
2252
- flags=HOTPLUG_ENUMERATE,
2253
- vendor_id=HOTPLUG_MATCH_ANY,
2254
- product_id=HOTPLUG_MATCH_ANY,
2255
- dev_class=HOTPLUG_MATCH_ANY,
2256
- # pylint: enable=undefined-variable
2257
- ):
2258
- """
2259
- Registers an hotplug callback.
2260
- On success, returns an opaque value which can be passed to
2261
- hotplugDeregisterCallback.
2262
- Callback must accept the following positional arguments:
2263
- - this USBContext instance
2264
- - an USBDevice instance
2265
- If device has left, configuration descriptors may not be
2266
- available. Its device descriptor will be available.
2267
- - event type, one of:
2268
- HOTPLUG_EVENT_DEVICE_ARRIVED
2269
- HOTPLUG_EVENT_DEVICE_LEFT
2270
- Callback must return whether it must be unregistered (any true value
2271
- to be unregistered, any false value to be kept registered).
2272
- """
2273
- def wrapped_callback(context_p, device_p, event, _):
2274
- assert addressof(context_p.contents) == addressof(
2275
- self.__context_p.contents), (context_p, self.__context_p)
2276
- unregister = bool(callback(
2277
- self,
2278
- USBDevice(
2279
- self,
2280
- device_p,
2281
- # pylint: disable=undefined-variable
2282
- event != HOTPLUG_EVENT_DEVICE_LEFT,
2283
- # pylint: enable=undefined-variable
2284
- ),
2285
- event,
2286
- ))
2287
- if unregister:
2288
- del self.__hotplug_callback_dict[handle]
2289
- return unregister
2290
- handle = c_int()
2291
- callback_p = libusb1.libusb_hotplug_callback_fn_p(wrapped_callback)
2292
- result = libusb1.libusb_hotplug_register_callback(
2293
- self.__context_p, events, flags, vendor_id, product_id, dev_class,
2294
- callback_p, None, byref(handle))
2295
- mayRaiseUSBError(result)
2296
- handle = handle.value
2297
- # Keep strong references
2298
- assert handle not in self.__hotplug_callback_dict, (
2299
- handle,
2300
- self.__hotplug_callback_dict,
2301
- )
2302
- self.__hotplug_callback_dict[handle] = (callback_p, wrapped_callback)
2303
- return handle
2304
-
2305
- @_validContext
2306
- def hotplugDeregisterCallback(self, handle):
2307
- """
2308
- Deregisters an hotplug callback.
2309
- handle (opaque)
2310
- Return value of a former hotplugRegisterCallback call.
2311
- """
2312
- del self.__hotplug_callback_dict[handle]
2313
- libusb1.libusb_hotplug_deregister_callback(self.__context_p, handle)
2314
-
2315
- del USBContext._validContext
2316
-
2317
- def getVersion():
2318
- """
2319
- Returns underlying libusb's version information as a 6-namedtuple (or
2320
- 6-tuple if namedtuples are not avaiable):
2321
- - major
2322
- - minor
2323
- - micro
2324
- - nano
2325
- - rc
2326
- - describe
2327
- Returns (0, 0, 0, 0, '', '') if libusb doesn't have required entry point.
2328
- """
2329
- version = libusb1.libusb_get_version().contents
2330
- return Version(
2331
- version.major,
2332
- version.minor,
2333
- version.micro,
2334
- version.nano,
2335
- version.rc,
2336
- version.describe,
2337
- )
2338
-
2339
- def hasCapability(capability):
2340
- """
2341
- Tests feature presence.
2342
-
2343
- capability should be one of:
2344
- CAP_HAS_CAPABILITY
2345
- CAP_HAS_HOTPLUG
2346
- CAP_HAS_HID_ACCESS
2347
- CAP_SUPPORTS_DETACH_KERNEL_DRIVER
2348
- """
2349
- return libusb1.libusb_has_capability(capability)
2350
-
2351
- class LibUSBContext(USBContext):
2352
- """
2353
- Backward-compatibility alias for USBContext.
2354
- """
2355
- def __init__(self):
2356
- warnings.warn(
2357
- 'LibUSBContext is being renamed to USBContext',
2358
- DeprecationWarning,
2359
- )
2360
- super(LibUSBContext, self).__init__()
1
+ # Copyright (C) 2010-2015 Vincent Pelletier <plr.vincent@gmail.com>
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ # pylint: disable=invalid-name, too-many-locals, too-many-arguments
18
+ # pylint: disable=too-many-public-methods, too-many-instance-attributes
19
+ # pylint: disable=missing-docstring
20
+ """
21
+ Pythonic wrapper for libusb-1.0.
22
+
23
+ The first thing you must do is to get an "USB context". To do so, create an
24
+ USBContext instance.
25
+ Then, you can use it to browse available USB devices and open the one you want
26
+ to talk to.
27
+ At this point, you should have a USBDeviceHandle instance (as returned by
28
+ USBContext or USBDevice instances), and you can start exchanging with the
29
+ device.
30
+
31
+ Features:
32
+ - Basic device settings (configuration & interface selection, ...)
33
+ - String descriptor lookups (ASCII & unicode), and list supported language
34
+ codes
35
+ - Synchronous I/O (control, bulk, interrupt)
36
+ - Asynchronous I/O (control, bulk, interrupt, isochronous)
37
+ Note: Isochronous support is not well tested.
38
+ See USBPoller, USBTransfer and USBTransferHelper.
39
+
40
+ All LIBUSB_* constants are available in this module, without the LIBUSB_
41
+ prefix - with one exception: LIBUSB_5GBPS_OPERATION is available as
42
+ SUPER_SPEED_OPERATION, so it is a valid python identifier.
43
+
44
+ All LIBUSB_ERROR_* constants are available in this module as exception classes,
45
+ subclassing USBError.
46
+ """
47
+
48
+ import libusb1
49
+ from ctypes import byref, create_string_buffer, c_int, sizeof, POINTER, \
50
+ cast, c_uint8, c_uint16, c_ubyte, string_at, c_void_p, cdll, addressof
51
+ import sys
52
+ import threading
53
+ from ctypes.util import find_library
54
+ import warnings
55
+ import weakref
56
+ import collections
57
+ import functools
58
+
59
+ __all__ = [
60
+ 'USBContext', 'USBDeviceHandle', 'USBDevice', 'hasCapability',
61
+ 'USBPoller', 'USBTransfer', 'USBTransferHelper', 'EVENT_CALLBACK_SET',
62
+ 'USBPollerThread', 'USBEndpoint', 'USBInterfaceSetting', 'USBInterface',
63
+ 'USBConfiguration', 'DoomedTransferError', 'getVersion', 'USBError',
64
+ ]
65
+ # Bind libusb1 constants and libusb1.USBError to this module, so user does not
66
+ # have to import two modules.
67
+ USBError = libusb1.USBError
68
+ STATUS_TO_EXCEPTION_DICT = {}
69
+ def __bindConstants():
70
+ global_dict = globals()
71
+ PREFIX = 'LIBUSB_'
72
+ for name, value in libusb1.__dict__.items():
73
+ if name.startswith(PREFIX):
74
+ name = name[len(PREFIX):]
75
+ # Gah.
76
+ if name == '5GBPS_OPERATION':
77
+ name = 'SUPER_SPEED_OPERATION'
78
+ assert name not in global_dict
79
+ global_dict[name] = value
80
+ __all__.append(name)
81
+ # Finer-grained exceptions.
82
+ for name, value in libusb1.libusb_error.forward_dict.items():
83
+ if value:
84
+ assert name.startswith(PREFIX + 'ERROR_'), name
85
+ if name == 'LIBUSB_ERROR_IO':
86
+ name = 'ErrorIO'
87
+ else:
88
+ name = ''.join(x.capitalize() for x in name.split('_')[1:])
89
+ name = 'USB' + name
90
+ assert name not in global_dict, name
91
+ assert value not in STATUS_TO_EXCEPTION_DICT
92
+ STATUS_TO_EXCEPTION_DICT[value] = global_dict[name] = type(
93
+ name,
94
+ (USBError, ),
95
+ {'value': value},
96
+ )
97
+ __all__.append(name)
98
+ __bindConstants()
99
+ del __bindConstants
100
+
101
+ def raiseUSBError(value):
102
+ raise STATUS_TO_EXCEPTION_DICT.get(value, USBError)(value)
103
+
104
+ def mayRaiseUSBError(value):
105
+ if value < 0:
106
+ raiseUSBError(value)
107
+
108
+ try:
109
+ namedtuple = collections.namedtuple
110
+ except AttributeError:
111
+ Version = lambda *x: x
112
+ else:
113
+ Version = namedtuple(
114
+ 'Version',
115
+ ['major', 'minor', 'micro', 'nano', 'rc', 'describe'],
116
+ )
117
+
118
+ if sys.version_info[0] == 3:
119
+ BYTE = bytes([0])
120
+ # pylint: disable=redefined-builtin
121
+ xrange = range
122
+ long = int
123
+ # pylint: enable=redefined-builtin
124
+ else:
125
+ BYTE = '\x00'
126
+ # pylint: disable=undefined-variable
127
+ CONTROL_SETUP = BYTE * CONTROL_SETUP_SIZE
128
+ # pylint: enable=undefined-variable
129
+
130
+ if sys.version_info[:2] >= (2, 6):
131
+ if sys.platform == 'win32':
132
+ from ctypes import get_last_error as get_errno
133
+ else:
134
+ from ctypes import get_errno
135
+ else:
136
+ def get_errno():
137
+ raise NotImplementedError(
138
+ 'Your python version does not support errno/last_error'
139
+ )
140
+
141
+ __libc_name = find_library('c')
142
+ if __libc_name is None:
143
+ # Of course, will leak memory.
144
+ # Should we warn user ? How ?
145
+ _free = lambda x: None
146
+ else:
147
+ _free = getattr(cdll, __libc_name).free
148
+ del __libc_name
149
+
150
+ try:
151
+ WeakSet = weakref.WeakSet
152
+ except AttributeError:
153
+ # Python < 2.7: tiny wrapper around WeakKeyDictionary
154
+ class WeakSet(object):
155
+ def __init__(self):
156
+ self.__dict = weakref.WeakKeyDictionary()
157
+
158
+ def add(self, item):
159
+ self.__dict[item] = None
160
+
161
+ def pop(self):
162
+ return self.__dict.popitem()[0]
163
+
164
+ # Default string length
165
+ # From a comment in libusb-1.0: "Some devices choke on size > 255"
166
+ STRING_LENGTH = 255
167
+
168
+ # As of v3 of USB specs, there cannot be more than 7 hubs from controler to
169
+ # device.
170
+ PATH_MAX_DEPTH = 7
171
+
172
+ EVENT_CALLBACK_SET = frozenset((
173
+ # pylint: disable=undefined-variable
174
+ TRANSFER_COMPLETED,
175
+ TRANSFER_ERROR,
176
+ TRANSFER_TIMED_OUT,
177
+ TRANSFER_CANCELLED,
178
+ TRANSFER_STALL,
179
+ TRANSFER_NO_DEVICE,
180
+ TRANSFER_OVERFLOW,
181
+ # pylint: enable=undefined-variable
182
+ ))
183
+
184
+ DEFAULT_ASYNC_TRANSFER_ERROR_CALLBACK = lambda x: False
185
+
186
+ def create_binary_buffer(init_or_size):
187
+ # Prevent ctypes from adding a trailing null char.
188
+ if isinstance(init_or_size, (int, long)):
189
+ result = create_string_buffer(init_or_size)
190
+ else:
191
+ result = create_string_buffer(init_or_size, len(init_or_size))
192
+ return result
193
+
194
+ class DoomedTransferError(Exception):
195
+ """Exception raised when altering/submitting a doomed transfer."""
196
+ pass
197
+
198
+ class USBTransfer(object):
199
+ """
200
+ USB asynchronous transfer control & data.
201
+
202
+ All modification methods will raise if called on a submitted transfer.
203
+ Methods noted as "should not be called on a submitted transfer" will not
204
+ prevent you from reading, but returned value is unspecified.
205
+
206
+ Note on user_data: because of pypy's current ctype restrictions, user_data
207
+ is not provided to C level, but is managed purely in python. It should
208
+ change nothing for you, unless you are looking at underlying C transfer
209
+ structure - which you should never have to.
210
+ """
211
+ # Prevent garbage collector from freeing the free function before our
212
+ # instances, as we need it to property destruct them.
213
+ __libusb_free_transfer = libusb1.libusb_free_transfer
214
+ __libusb_cancel_transfer = libusb1.libusb_cancel_transfer
215
+ __USBError = USBError
216
+ # pylint: disable=undefined-variable
217
+ __USBErrorNotFound = USBErrorNotFound
218
+ # pylint: enable=undefined-variable
219
+ __transfer = None
220
+ __initialized = False
221
+ __submitted = False
222
+ __callback = None
223
+ __ctypesCallbackWrapper = None
224
+ __doomed = False
225
+ __user_data = None
226
+ __transfer_buffer = None
227
+
228
+ def __init__(self, handle, iso_packets, before_submit, after_completion):
229
+ """
230
+ You should not instanciate this class directly.
231
+ Call "getTransfer" method on an USBDeviceHandle instance to get
232
+ instances of this class.
233
+ """
234
+ if iso_packets < 0:
235
+ raise ValueError(
236
+ 'Cannot request a negative number of iso packets.'
237
+ )
238
+ self.__handle = handle
239
+ self.__before_submit = before_submit
240
+ self.__after_completion = after_completion
241
+ self.__num_iso_packets = iso_packets
242
+ result = libusb1.libusb_alloc_transfer(iso_packets)
243
+ if not result:
244
+ # pylint: disable=undefined-variable
245
+ raise USBErrorNoMem
246
+ # pylint: enable=undefined-variable
247
+ self.__transfer = result
248
+ self.__ctypesCallbackWrapper = libusb1.libusb_transfer_cb_fn_p(
249
+ self.__callbackWrapper)
250
+
251
+ def close(self):
252
+ """
253
+ Break reference cycles to allow instance to be garbage-collected.
254
+ Raises if called on a submitted transfer.
255
+ """
256
+ if self.__submitted:
257
+ raise ValueError('Cannot close a submitted transfer')
258
+ self.doom()
259
+ self.__initialized = False
260
+ # Break possible external reference cycles
261
+ self.__callback = None
262
+ self.__user_data = None
263
+ # Break libusb_transfer reference cycles
264
+ self.__ctypesCallbackWrapper = None
265
+ # For some reason, overwriting callback is not enough to remove this
266
+ # reference cycle - though sometimes it works:
267
+ # self -> self.__dict__ -> libusb_transfer -> dict[x] -> dict[x] ->
268
+ # CThunkObject -> __callbackWrapper -> self
269
+ # So free transfer altogether.
270
+ if self.__transfer is not None:
271
+ self.__libusb_free_transfer(self.__transfer)
272
+ self.__transfer = None
273
+ self.__transfer_buffer = None
274
+ # Break USBDeviceHandle reference cycle
275
+ self.__before_submit = None
276
+ self.__after_completion = None
277
+
278
+ def doom(self):
279
+ """
280
+ Prevent transfer from being submitted again.
281
+ """
282
+ self.__doomed = True
283
+
284
+ def __del__(self):
285
+ if self.__transfer is not None:
286
+ try:
287
+ # If this doesn't raise, we're doomed; transfer was submitted,
288
+ # still python decided to garbage-collect this instance.
289
+ # Stick to libusb's documentation, and don't free the
290
+ # transfer. If interpreter is shutting down, kernel will
291
+ # reclaim memory anyway.
292
+ # Note: we can't prevent transfer's buffer from being
293
+ # garbage-collected as soon as there will be no remaining
294
+ # reference to transfer, so a segfault might happen anyway.
295
+ # Should we warn user ? How ?
296
+ self.cancel()
297
+ except self.__USBErrorNotFound:
298
+ # Transfer was not submitted, we can free it.
299
+ self.__libusb_free_transfer(self.__transfer)
300
+
301
+ # pylint: disable=unused-argument
302
+ def __callbackWrapper(self, transfer_p):
303
+ """
304
+ Makes it possible for user-provided callback to alter transfer when
305
+ fired (ie, mark transfer as not submitted upon call).
306
+ """
307
+ self.__submitted = False
308
+ self.__after_completion(self)
309
+ callback = self.__callback
310
+ if callback is not None:
311
+ callback(self)
312
+ if self.__doomed:
313
+ self.close()
314
+ # pylint: enable=unused-argument
315
+
316
+ def setCallback(self, callback):
317
+ """
318
+ Change transfer's callback.
319
+ """
320
+ self.__callback = callback
321
+
322
+ def getCallback(self):
323
+ """
324
+ Get currently set callback.
325
+ """
326
+ return self.__callback
327
+
328
+ def setControl(
329
+ self, request_type, request, value, index, buffer_or_len,
330
+ callback=None, user_data=None, timeout=0):
331
+ """
332
+ Setup transfer for control use.
333
+
334
+ request_type, request, value, index
335
+ See USBDeviceHandle.controlWrite.
336
+ request_type defines transfer direction (see
337
+ ENDPOINT_OUT and ENDPOINT_IN)).
338
+ buffer_or_len
339
+ Either a string (when sending data), or expected data length (when
340
+ receiving data).
341
+ callback
342
+ Callback function to be invoked on transfer completion.
343
+ Called with transfer as parameter, return value ignored.
344
+ user_data
345
+ User data to pass to callback function.
346
+ timeout
347
+ Transfer timeout in milliseconds. 0 to disable.
348
+ """
349
+ if self.__submitted:
350
+ raise ValueError('Cannot alter a submitted transfer')
351
+ if self.__doomed:
352
+ raise DoomedTransferError('Cannot reuse a doomed transfer')
353
+ if isinstance(buffer_or_len, (int, long)):
354
+ length = buffer_or_len
355
+ # pylint: disable=undefined-variable
356
+ string_buffer = create_binary_buffer(length + CONTROL_SETUP_SIZE)
357
+ # pylint: enable=undefined-variable
358
+ else:
359
+ length = len(buffer_or_len)
360
+ string_buffer = create_binary_buffer(CONTROL_SETUP + buffer_or_len)
361
+ self.__initialized = False
362
+ self.__transfer_buffer = string_buffer
363
+ self.__user_data = user_data
364
+ libusb1.libusb_fill_control_setup(
365
+ string_buffer, request_type, request, value, index, length)
366
+ libusb1.libusb_fill_control_transfer(
367
+ self.__transfer, self.__handle, string_buffer,
368
+ self.__ctypesCallbackWrapper, None, timeout)
369
+ self.__callback = callback
370
+ self.__initialized = True
371
+
372
+ def setBulk(
373
+ self, endpoint, buffer_or_len, callback=None, user_data=None,
374
+ timeout=0):
375
+ """
376
+ Setup transfer for bulk use.
377
+
378
+ endpoint
379
+ Endpoint to submit transfer to. Defines transfer direction (see
380
+ ENDPOINT_OUT and ENDPOINT_IN)).
381
+ buffer_or_len
382
+ Either a string (when sending data), or expected data length (when
383
+ receiving data)
384
+ callback
385
+ Callback function to be invoked on transfer completion.
386
+ Called with transfer as parameter, return value ignored.
387
+ user_data
388
+ User data to pass to callback function.
389
+ timeout
390
+ Transfer timeout in milliseconds. 0 to disable.
391
+ """
392
+ if self.__submitted:
393
+ raise ValueError('Cannot alter a submitted transfer')
394
+ if self.__doomed:
395
+ raise DoomedTransferError('Cannot reuse a doomed transfer')
396
+ string_buffer = create_binary_buffer(buffer_or_len)
397
+ self.__initialized = False
398
+ self.__transfer_buffer = string_buffer
399
+ self.__user_data = user_data
400
+ libusb1.libusb_fill_bulk_transfer(
401
+ self.__transfer, self.__handle, endpoint, string_buffer,
402
+ sizeof(string_buffer), self.__ctypesCallbackWrapper, None, timeout)
403
+ self.__callback = callback
404
+ self.__initialized = True
405
+
406
+ def setInterrupt(
407
+ self, endpoint, buffer_or_len, callback=None, user_data=None,
408
+ timeout=0):
409
+ """
410
+ Setup transfer for interrupt use.
411
+
412
+ endpoint
413
+ Endpoint to submit transfer to. Defines transfer direction (see
414
+ ENDPOINT_OUT and ENDPOINT_IN)).
415
+ buffer_or_len
416
+ Either a string (when sending data), or expected data length (when
417
+ receiving data)
418
+ callback
419
+ Callback function to be invoked on transfer completion.
420
+ Called with transfer as parameter, return value ignored.
421
+ user_data
422
+ User data to pass to callback function.
423
+ timeout
424
+ Transfer timeout in milliseconds. 0 to disable.
425
+ """
426
+ if self.__submitted:
427
+ raise ValueError('Cannot alter a submitted transfer')
428
+ if self.__doomed:
429
+ raise DoomedTransferError('Cannot reuse a doomed transfer')
430
+ string_buffer = create_binary_buffer(buffer_or_len)
431
+ self.__initialized = False
432
+ self.__transfer_buffer = string_buffer
433
+ self.__user_data = user_data
434
+ libusb1.libusb_fill_interrupt_transfer(
435
+ self.__transfer, self.__handle, endpoint, string_buffer,
436
+ sizeof(string_buffer), self.__ctypesCallbackWrapper, None, timeout)
437
+ self.__callback = callback
438
+ self.__initialized = True
439
+
440
+ def setIsochronous(
441
+ self, endpoint, buffer_or_len, callback=None,
442
+ user_data=None, timeout=0, iso_transfer_length_list=None):
443
+ """
444
+ Setup transfer for isochronous use.
445
+
446
+ endpoint
447
+ Endpoint to submit transfer to. Defines transfer direction (see
448
+ ENDPOINT_OUT and ENDPOINT_IN)).
449
+ buffer_or_len
450
+ Either a string (when sending data), or expected data length (when
451
+ receiving data)
452
+ callback
453
+ Callback function to be invoked on transfer completion.
454
+ Called with transfer as parameter, return value ignored.
455
+ user_data
456
+ User data to pass to callback function.
457
+ timeout
458
+ Transfer timeout in milliseconds. 0 to disable.
459
+ iso_transfer_length_list
460
+ List of individual transfer sizes. If not provided, buffer_or_len
461
+ will be divided evenly among available transfers if possible, and
462
+ raise ValueError otherwise.
463
+ """
464
+ if self.__submitted:
465
+ raise ValueError('Cannot alter a submitted transfer')
466
+ num_iso_packets = self.__num_iso_packets
467
+ if num_iso_packets == 0:
468
+ raise TypeError(
469
+ 'This transfer canot be used for isochronous I/O. '
470
+ 'You must get another one with a non-zero iso_packets '
471
+ 'parameter.'
472
+ )
473
+ if self.__doomed:
474
+ raise DoomedTransferError('Cannot reuse a doomed transfer')
475
+ string_buffer = create_binary_buffer(buffer_or_len)
476
+ buffer_length = sizeof(string_buffer)
477
+ if iso_transfer_length_list is None:
478
+ iso_length, remainder = divmod(buffer_length, num_iso_packets)
479
+ if remainder:
480
+ raise ValueError(
481
+ 'Buffer size %i cannot be evenly distributed among %i '
482
+ 'transfers' % (
483
+ buffer_length,
484
+ num_iso_packets,
485
+ )
486
+ )
487
+ iso_transfer_length_list = [iso_length] * num_iso_packets
488
+ configured_iso_packets = len(iso_transfer_length_list)
489
+ if configured_iso_packets > num_iso_packets:
490
+ raise ValueError(
491
+ 'Too many ISO transfer lengths (%i), there are '
492
+ 'only %i ISO transfers available' % (
493
+ configured_iso_packets,
494
+ num_iso_packets,
495
+ )
496
+ )
497
+ if sum(iso_transfer_length_list) > buffer_length:
498
+ raise ValueError(
499
+ 'ISO transfers too long (%i), there are only '
500
+ '%i bytes available' % (
501
+ sum(iso_transfer_length_list),
502
+ buffer_length,
503
+ )
504
+ )
505
+ transfer_p = self.__transfer
506
+ self.__initialized = False
507
+ self.__transfer_buffer = string_buffer
508
+ self.__user_data = user_data
509
+ libusb1.libusb_fill_iso_transfer(
510
+ transfer_p, self.__handle, endpoint, string_buffer, buffer_length,
511
+ configured_iso_packets, self.__ctypesCallbackWrapper, None,
512
+ timeout)
513
+ for length, iso_packet_desc in zip(
514
+ iso_transfer_length_list,
515
+ libusb1.get_iso_packet_list(transfer_p)):
516
+ if length <= 0:
517
+ raise ValueError(
518
+ 'Negative/null length transfers are not possible.'
519
+ )
520
+ iso_packet_desc.length = length
521
+ self.__callback = callback
522
+ self.__initialized = True
523
+
524
+ def getType(self):
525
+ """
526
+ Get transfer type.
527
+
528
+ Returns one of:
529
+ TRANSFER_TYPE_CONTROL
530
+ TRANSFER_TYPE_ISOCHRONOUS
531
+ TRANSFER_TYPE_BULK
532
+ TRANSFER_TYPE_INTERRUPT
533
+ """
534
+ return self.__transfer.contents.type
535
+
536
+ def getEndpoint(self):
537
+ """
538
+ Get endpoint.
539
+ """
540
+ return self.__transfer.contents.endpoint
541
+
542
+ def getStatus(self):
543
+ """
544
+ Get transfer status.
545
+ Should not be called on a submitted transfer.
546
+ """
547
+ return self.__transfer.contents.status
548
+
549
+ def getActualLength(self):
550
+ """
551
+ Get actually transfered data length.
552
+ Should not be called on a submitted transfer.
553
+ """
554
+ return self.__transfer.contents.actual_length
555
+
556
+ def getBuffer(self):
557
+ """
558
+ Get data buffer content.
559
+ Should not be called on a submitted transfer.
560
+ """
561
+ transfer_p = self.__transfer
562
+ transfer = transfer_p.contents
563
+ # pylint: disable=undefined-variable
564
+ if transfer.type == TRANSFER_TYPE_CONTROL:
565
+ # pylint: enable=undefined-variable
566
+ result = libusb1.libusb_control_transfer_get_data(transfer_p)
567
+ else:
568
+ result = string_at(transfer.buffer, transfer.length)
569
+ return result
570
+
571
+ def getUserData(self):
572
+ """
573
+ Retrieve user data provided on setup.
574
+ """
575
+ return self.__user_data
576
+
577
+ def setUserData(self, user_data):
578
+ """
579
+ Change user data.
580
+ """
581
+ self.__user_data = user_data
582
+
583
+ def getISOBufferList(self):
584
+ """
585
+ Get individual ISO transfer's buffer.
586
+ Returns a list with one item per ISO transfer, with their
587
+ individually-configured sizes.
588
+ Returned list is consistent with getISOSetupList return value.
589
+ Should not be called on a submitted transfer.
590
+
591
+ See also iterISO.
592
+ """
593
+ transfer_p = self.__transfer
594
+ transfer = transfer_p.contents
595
+ # pylint: disable=undefined-variable
596
+ if transfer.type != TRANSFER_TYPE_ISOCHRONOUS:
597
+ # pylint: enable=undefined-variable
598
+ raise TypeError(
599
+ 'This method cannot be called on non-iso transfers.'
600
+ )
601
+ return libusb1.get_iso_packet_buffer_list(transfer_p)
602
+
603
+ def getISOSetupList(self):
604
+ """
605
+ Get individual ISO transfer's setup.
606
+ Returns a list of dicts, each containing an individual ISO transfer
607
+ parameters:
608
+ - length
609
+ - actual_length
610
+ - status
611
+ (see libusb1's API documentation for their signification)
612
+ Returned list is consistent with getISOBufferList return value.
613
+ Should not be called on a submitted transfer (except for 'length'
614
+ values).
615
+ """
616
+ transfer_p = self.__transfer
617
+ transfer = transfer_p.contents
618
+ # pylint: disable=undefined-variable
619
+ if transfer.type != TRANSFER_TYPE_ISOCHRONOUS:
620
+ # pylint: enable=undefined-variable
621
+ raise TypeError(
622
+ 'This method cannot be called on non-iso transfers.'
623
+ )
624
+ return [
625
+ {
626
+ 'length': x.length,
627
+ 'actual_length': x.actual_length,
628
+ 'status': x.status,
629
+ }
630
+ for x in libusb1.get_iso_packet_list(transfer_p)
631
+ ]
632
+
633
+ def iterISO(self):
634
+ """
635
+ Generator yielding (status, buffer) for each isochornous transfer.
636
+ buffer is truncated to actual_length.
637
+ This is more efficient than calling both getISOBufferList and
638
+ getISOSetupList when receiving data.
639
+ Should not be called on a submitted transfer.
640
+ """
641
+ transfer_p = self.__transfer
642
+ transfer = transfer_p.contents
643
+ # pylint: disable=undefined-variable
644
+ if transfer.type != TRANSFER_TYPE_ISOCHRONOUS:
645
+ # pylint: enable=undefined-variable
646
+ raise TypeError(
647
+ 'This method cannot be called on non-iso transfers.'
648
+ )
649
+ buffer_position = transfer.buffer
650
+ for iso_transfer in libusb1.get_iso_packet_list(transfer_p):
651
+ yield (
652
+ iso_transfer.status,
653
+ string_at(buffer_position, iso_transfer.actual_length),
654
+ )
655
+ buffer_position += iso_transfer.length
656
+
657
+ def setBuffer(self, buffer_or_len):
658
+ """
659
+ Replace buffer with a new one.
660
+ Allows resizing read buffer and replacing data sent.
661
+ Note: resizing is not allowed for isochronous buffer (use
662
+ setIsochronous).
663
+ Note: disallowed on control transfers (use setControl).
664
+ """
665
+ if self.__submitted:
666
+ raise ValueError('Cannot alter a submitted transfer')
667
+ transfer = self.__transfer.contents
668
+ # pylint: disable=undefined-variable
669
+ if transfer.type == TRANSFER_TYPE_CONTROL:
670
+ # pylint: enable=undefined-variable
671
+ raise ValueError(
672
+ 'To alter control transfer buffer, use setControl'
673
+ )
674
+ buff = create_binary_buffer(buffer_or_len)
675
+ # pylint: disable=undefined-variable
676
+ if transfer.type == TRANSFER_TYPE_ISOCHRONOUS and \
677
+ sizeof(buff) != transfer.length:
678
+ # pylint: enable=undefined-variable
679
+ raise ValueError(
680
+ 'To alter isochronous transfer buffer length, use '
681
+ 'setIsochronous'
682
+ )
683
+ self.__transfer_buffer = buff
684
+ transfer.buffer = cast(buff, c_void_p)
685
+ transfer.length = sizeof(buff)
686
+
687
+ def isSubmitted(self):
688
+ """
689
+ Tells if this transfer is submitted and still pending.
690
+ """
691
+ return self.__submitted
692
+
693
+ def submit(self):
694
+ """
695
+ Submit transfer for asynchronous handling.
696
+ """
697
+ if self.__submitted:
698
+ raise ValueError('Cannot submit a submitted transfer')
699
+ if not self.__initialized:
700
+ raise ValueError(
701
+ 'Cannot submit a transfer until it has been initialized'
702
+ )
703
+ if self.__doomed:
704
+ raise DoomedTransferError('Cannot submit doomed transfer')
705
+ self.__before_submit(self)
706
+ self.__submitted = True
707
+ result = libusb1.libusb_submit_transfer(self.__transfer)
708
+ if result:
709
+ self.__after_completion(self)
710
+ self.__submitted = False
711
+ raiseUSBError(result)
712
+
713
+ def cancel(self):
714
+ """
715
+ Cancel transfer.
716
+ Note: cancellation happens asynchronously, so you must wait for
717
+ TRANSFER_CANCELLED.
718
+ """
719
+ if not self.__submitted:
720
+ # XXX: Workaround for a bug reported on libusb 1.0.8: calling
721
+ # libusb_cancel_transfer on a non-submitted transfer might
722
+ # trigger a segfault.
723
+ raise self.__USBErrorNotFound
724
+ result = self.__libusb_cancel_transfer(self.__transfer)
725
+ if result:
726
+ raise self.__USBError(result)
727
+
728
+ class USBTransferHelper(object):
729
+ """
730
+ Simplifies subscribing to the same transfer over and over, and callback
731
+ handling:
732
+ - no need to read event status to execute apropriate code, just setup
733
+ different functions for each status code
734
+ - just return True instead of calling submit
735
+ - no need to check if transfer is doomed before submitting it again,
736
+ DoomedTransferError is caught.
737
+
738
+ Callbacks used in this class must follow the callback API described in
739
+ USBTransfer, and are expected to return a boolean:
740
+ - True if transfer is to be submitted again (to receive/send more data)
741
+ - False otherwise
742
+
743
+ Note: as per libusb1 specifications, isochronous transfer global state
744
+ might be TRANSFER_COMPLETED although some individual packets might
745
+ have an error status. You can check individual packet status by calling
746
+ getISOSetupList on transfer object in your callback.
747
+ """
748
+ def __init__(self, transfer=None):
749
+ """
750
+ Create a transfer callback dispatcher.
751
+
752
+ transfer parameter is deprecated. If provided, it will be equivalent
753
+ to:
754
+ helper = USBTransferHelper()
755
+ transfer.setCallback(helper)
756
+ and also allows using deprecated methods on this class (otherwise,
757
+ they raise AttributeError).
758
+ """
759
+ if transfer is not None:
760
+ # DEPRECATED - to drop
761
+ self.__transfer = transfer
762
+ transfer.setCallback(self)
763
+ self.__event_callback_dict = {}
764
+ self.__errorCallback = DEFAULT_ASYNC_TRANSFER_ERROR_CALLBACK
765
+
766
+ def submit(self):
767
+ """
768
+ Submit the asynchronous read request.
769
+ Deprecated. Use submit on transfer.
770
+ """
771
+ # DEPRECATED - to drop
772
+ self.__transfer.submit()
773
+
774
+ def cancel(self):
775
+ """
776
+ Cancel a pending read request.
777
+ Deprecated. Use cancel on transfer.
778
+ """
779
+ # DEPRECATED - to drop
780
+ self.__transfer.cancel()
781
+
782
+ def setEventCallback(self, event, callback):
783
+ """
784
+ Set a function to call for a given event.
785
+ event must be one of:
786
+ TRANSFER_COMPLETED
787
+ TRANSFER_ERROR
788
+ TRANSFER_TIMED_OUT
789
+ TRANSFER_CANCELLED
790
+ TRANSFER_STALL
791
+ TRANSFER_NO_DEVICE
792
+ TRANSFER_OVERFLOW
793
+ """
794
+ if event not in EVENT_CALLBACK_SET:
795
+ raise ValueError('Unknown event %r.' % (event, ))
796
+ self.__event_callback_dict[event] = callback
797
+
798
+ def setDefaultCallback(self, callback):
799
+ """
800
+ Set the function to call for event which don't have a specific callback
801
+ registered.
802
+ The initial default callback does nothing and returns False.
803
+ """
804
+ self.__errorCallback = callback
805
+
806
+ def getEventCallback(self, event, default=None):
807
+ """
808
+ Return the function registered to be called for given event identifier.
809
+ """
810
+ return self.__event_callback_dict.get(event, default)
811
+
812
+ def __call__(self, transfer):
813
+ """
814
+ Callback to set on transfers.
815
+ """
816
+ if self.getEventCallback(transfer.getStatus(), self.__errorCallback)(
817
+ transfer):
818
+ try:
819
+ transfer.submit()
820
+ except DoomedTransferError:
821
+ pass
822
+
823
+ def isSubmited(self):
824
+ """
825
+ Returns whether this reader is currently waiting for an event.
826
+ Deprecatd. Use isSubmitted on transfer.
827
+ """
828
+ # DEPRECATED - to drop
829
+ return self.__transfer.isSubmitted()
830
+
831
+ class USBPollerThread(threading.Thread):
832
+ """
833
+ Implements libusb1 documentation about threaded, asynchronous
834
+ applications.
835
+ In short, instanciate this class once (...per USBContext instance), call
836
+ start() on the instance, and do whatever you need.
837
+ This thread will be used to execute transfer completion callbacks, and you
838
+ are free to use libusb1's synchronous API in another thread, and can forget
839
+ about libusb1 file descriptors.
840
+
841
+ See http://libusb.sourceforge.net/api-1.0/mtasync.html .
842
+ """
843
+ def __init__(self, context, poller, exc_callback=None):
844
+ """
845
+ Create a poller thread for given context.
846
+ Warning: it will not check if another poller instance was already
847
+ present for that context, and will replace it.
848
+
849
+ poller
850
+ (same as USBPoller.__init__ "poller" parameter)
851
+
852
+ exc_callback (callable)
853
+ Called with a libusb_error value as single parameter when event
854
+ handling fails.
855
+ If not given, an USBError will be raised, interrupting the thread.
856
+ """
857
+ super(USBPollerThread, self).__init__()
858
+ self.daemon = True
859
+ self.__context = context
860
+ self.__poller = poller
861
+ self.__fd_set = set()
862
+ context.setPollFDNotifiers(self._registerFD, self._unregisterFD)
863
+ for fd, events in context.getPollFDList():
864
+ self._registerFD(fd, events, None)
865
+ if exc_callback is not None:
866
+ self.exceptionHandler = exc_callback
867
+
868
+ def __del__(self):
869
+ self.__context.setPollFDNotifiers(None, None)
870
+
871
+ # pylint: disable=method-hidden
872
+ @staticmethod
873
+ def exceptionHandler(exc):
874
+ raise exc
875
+ # pylint: enable=method-hidden
876
+
877
+ def run(self):
878
+ # We expect quite some spinning in below loop, so move any unneeded
879
+ # operation out of it.
880
+ context = self.__context
881
+ poll = self.__poller.poll
882
+ try_lock_events = context.tryLockEvents
883
+ lock_event_waiters = context.lockEventWaiters
884
+ wait_for_event = context.waitForEvent
885
+ unlock_event_waiters = context.unlockEventWaiters
886
+ event_handling_ok = context.eventHandlingOK
887
+ unlock_events = context.unlockEvents
888
+ handle_events_locked = context.handleEventsLocked
889
+ event_handler_active = context.eventHandlerActive
890
+ getNextTimeout = context.getNextTimeout
891
+ exceptionHandler = self.exceptionHandler
892
+ fd_set = self.__fd_set
893
+ while fd_set:
894
+ if try_lock_events():
895
+ lock_event_waiters()
896
+ while event_handler_active():
897
+ wait_for_event()
898
+ unlock_event_waiters()
899
+ else:
900
+ try:
901
+ while event_handling_ok():
902
+ if poll(getNextTimeout()):
903
+ try:
904
+ handle_events_locked()
905
+ except USBError:
906
+ exceptionHandler(sys.exc_info()[1])
907
+ finally:
908
+ unlock_events()
909
+
910
+ def _registerFD(self, fd, events, _):
911
+ self.__poller.register(fd, events)
912
+ self.__fd_set.add(fd)
913
+
914
+ def _unregisterFD(self, fd, _):
915
+ self.__fd_set.discard(fd)
916
+ self.__poller.unregister(fd)
917
+
918
+ class USBPoller(object):
919
+ """
920
+ Class allowing integration of USB event polling in a file-descriptor
921
+ monitoring event loop.
922
+
923
+ WARNING: Do not call "poll" from several threads concurently. Do not use
924
+ synchronous USB transfers in a thread while "poll" is running. Doing so
925
+ will result in unnecessarily long pauses in some threads. Opening and/or
926
+ closing devices while polling can cause race conditions to occur.
927
+ """
928
+ def __init__(self, context, poller):
929
+ """
930
+ Create a poller for given context.
931
+ Warning: it will not check if another poller instance was already
932
+ present for that context, and will replace it.
933
+
934
+ poller is a polling instance implementing the following methods:
935
+ - register(fd, event_flags)
936
+ event_flags have the same meaning as in poll API (POLLIN & POLLOUT)
937
+ - unregister(fd)
938
+ - poll(timeout)
939
+ timeout being a float in seconds, or negative/None if there is no
940
+ timeout.
941
+ It must return a list of (descriptor, event) pairs.
942
+ Note: USBPoller is itself a valid poller.
943
+ Note2: select.poll uses a timeout in milliseconds, for some reason
944
+ (all other select.* classes use seconds for timeout), so you should
945
+ wrap it to convert & round/truncate timeout.
946
+ """
947
+ self.__context = context
948
+ self.__poller = poller
949
+ self.__fd_set = set()
950
+ context.setPollFDNotifiers(self._registerFD, self._unregisterFD)
951
+ for fd, events in context.getPollFDList():
952
+ self._registerFD(fd, events)
953
+
954
+ def __del__(self):
955
+ self.__context.setPollFDNotifiers(None, None)
956
+
957
+ def poll(self, timeout=None):
958
+ """
959
+ Poll for events.
960
+ timeout can be a float in seconds, or None for no timeout.
961
+ Returns a list of (descriptor, event) pairs.
962
+ """
963
+ next_usb_timeout = self.__context.getNextTimeout()
964
+ if timeout is None or timeout < 0:
965
+ usb_timeout = next_usb_timeout
966
+ elif next_usb_timeout:
967
+ usb_timeout = min(next_usb_timeout, timeout)
968
+ else:
969
+ usb_timeout = timeout
970
+ event_list = self.__poller.poll(usb_timeout)
971
+ if event_list:
972
+ fd_set = self.__fd_set
973
+ result = [(x, y) for x, y in event_list if x not in fd_set]
974
+ if len(result) != len(event_list):
975
+ self.__context.handleEventsTimeout()
976
+ else:
977
+ result = event_list
978
+ self.__context.handleEventsTimeout()
979
+ return result
980
+
981
+ def register(self, fd, events):
982
+ """
983
+ Register an USB-unrelated fd to poller.
984
+ Convenience method.
985
+ """
986
+ if fd in self.__fd_set:
987
+ raise ValueError(
988
+ 'This fd is a special USB event fd, it cannot be polled.'
989
+ )
990
+ self.__poller.register(fd, events)
991
+
992
+ def unregister(self, fd):
993
+ """
994
+ Unregister an USB-unrelated fd from poller.
995
+ Convenience method.
996
+ """
997
+ if fd in self.__fd_set:
998
+ raise ValueError(
999
+ 'This fd is a special USB event fd, it must stay registered.'
1000
+ )
1001
+ self.__poller.unregister(fd)
1002
+
1003
+ # pylint: disable=unused-argument
1004
+ def _registerFD(self, fd, events, user_data=None):
1005
+ self.register(fd, events)
1006
+ self.__fd_set.add(fd)
1007
+ # pylint: enable=unused-argument
1008
+
1009
+ # pylint: disable=unused-argument
1010
+ def _unregisterFD(self, fd, user_data=None):
1011
+ self.__fd_set.discard(fd)
1012
+ self.unregister(fd)
1013
+ # pylint: enable=unused-argument
1014
+
1015
+ class USBDeviceHandle(object):
1016
+ """
1017
+ Represents an opened USB device.
1018
+ """
1019
+ __handle = None
1020
+ __libusb_close = libusb1.libusb_close
1021
+ __USBError = USBError
1022
+ # pylint: disable=undefined-variable
1023
+ __USBErrorNoDevice = USBErrorNoDevice
1024
+ __USBErrorNotFound = USBErrorNotFound
1025
+ __USBErrorInterrupted = USBErrorInterrupted
1026
+ # pylint: enable=undefined-variable
1027
+ __set = set
1028
+ __KeyError = KeyError
1029
+ __sys = sys
1030
+
1031
+ def __init__(self, context, handle, device):
1032
+ """
1033
+ You should not instanciate this class directly.
1034
+ Call "open" method on an USBDevice instance to get an USBDeviceHandle
1035
+ instance.
1036
+ """
1037
+ self.__context = context
1038
+ # Weak reference to transfers about this device so we can clean up
1039
+ # before closing device.
1040
+ self.__transfer_set = WeakSet()
1041
+ # Strong references to inflight transfers so they do not get freed
1042
+ # even if user drops all strong references to them. If this instance
1043
+ # is garbage-collected, we close all transfers, so it's fine.
1044
+ self.__inflight = inflight = set()
1045
+ # XXX: For some reason, doing self.__inflight.{add|remove} inside
1046
+ # getTransfer causes extra intermediate python objects for each
1047
+ # allocated transfer. Storing them as properties solves this. Found
1048
+ # with objgraph.
1049
+ self.__inflight_add = inflight.add
1050
+ self.__inflight_remove = inflight.remove
1051
+ self.__handle = handle
1052
+ self.__device = device
1053
+
1054
+ def __del__(self):
1055
+ self.close()
1056
+
1057
+ def close(self):
1058
+ """
1059
+ Close this handle. If not called explicitely, will be called by
1060
+ destructor.
1061
+
1062
+ This method cancels any in-flight transfer when it is called. As
1063
+ cancellation is not immediate, this method needs to let libusb handle
1064
+ events until transfers are actually cancelled.
1065
+ In multi-threaded programs, this can lead to stalls. To avoid this,
1066
+ do not close nor let GC collect a USBDeviceHandle which has in-flight
1067
+ transfers.
1068
+ """
1069
+ handle = self.__handle
1070
+ if handle is not None:
1071
+ # Build a strong set from weak self.__transfer_set so we can doom
1072
+ # and close all contained transfers.
1073
+ # Because of backward compatibility, self.__transfer_set might be a
1074
+ # wrapper around WeakKeyDictionary. As it might be modified by gc,
1075
+ # we must pop until there is not key left instead of iterating over
1076
+ # it.
1077
+ weak_transfer_set = self.__transfer_set
1078
+ transfer_set = self.__set()
1079
+ while True:
1080
+ try:
1081
+ transfer = weak_transfer_set.pop()
1082
+ except self.__KeyError:
1083
+ break
1084
+ transfer_set.add(transfer)
1085
+ transfer.doom()
1086
+ inflight = self.__inflight
1087
+ for transfer in inflight:
1088
+ try:
1089
+ transfer.cancel()
1090
+ except (self.__USBErrorNotFound, self.__USBErrorNoDevice):
1091
+ pass
1092
+ while inflight:
1093
+ try:
1094
+ self.__context.handleEvents()
1095
+ except self.__USBErrorInterrupted:
1096
+ pass
1097
+ for transfer in transfer_set:
1098
+ transfer.close()
1099
+ self.__libusb_close(handle)
1100
+ self.__handle = None
1101
+
1102
+ def getDevice(self):
1103
+ """
1104
+ Get an USBDevice instance for the device accessed through this handle.
1105
+ Useful for example to query its configurations.
1106
+ """
1107
+ return self.__device
1108
+
1109
+ def getConfiguration(self):
1110
+ """
1111
+ Get the current configuration number for this device.
1112
+ """
1113
+ configuration = c_int()
1114
+ result = libusb1.libusb_get_configuration(
1115
+ self.__handle, byref(configuration),
1116
+ )
1117
+ mayRaiseUSBError(result)
1118
+ return configuration.value
1119
+
1120
+ def setConfiguration(self, configuration):
1121
+ """
1122
+ Set the configuration number for this device.
1123
+ """
1124
+ result = libusb1.libusb_set_configuration(self.__handle, configuration)
1125
+ mayRaiseUSBError(result)
1126
+
1127
+ def claimInterface(self, interface):
1128
+ """
1129
+ Claim (= get exclusive access to) given interface number. Required to
1130
+ receive/send data.
1131
+ """
1132
+ result = libusb1.libusb_claim_interface(self.__handle, interface)
1133
+ mayRaiseUSBError(result)
1134
+
1135
+ def releaseInterface(self, interface):
1136
+ """
1137
+ Release interface, allowing another process to use it.
1138
+ """
1139
+ result = libusb1.libusb_release_interface(self.__handle, interface)
1140
+ mayRaiseUSBError(result)
1141
+
1142
+ def setInterfaceAltSetting(self, interface, alt_setting):
1143
+ """
1144
+ Set interface's alternative setting (both parameters are integers).
1145
+ """
1146
+ result = libusb1.libusb_set_interface_alt_setting(
1147
+ self.__handle, interface, alt_setting,
1148
+ )
1149
+ mayRaiseUSBError(result)
1150
+
1151
+ def clearHalt(self, endpoint):
1152
+ """
1153
+ Clear a halt state on given endpoint number.
1154
+ """
1155
+ result = libusb1.libusb_clear_halt(self.__handle, endpoint)
1156
+ mayRaiseUSBError(result)
1157
+
1158
+ def resetDevice(self):
1159
+ """
1160
+ Reinitialise current device.
1161
+ Attempts to restore current configuration & alt settings.
1162
+ If this fails, will result in a device disconnect & reconnect, so you
1163
+ have to close current device and rediscover it (notified by a
1164
+ ERROR_NOT_FOUND error code).
1165
+ """
1166
+ result = libusb1.libusb_reset_device(self.__handle)
1167
+ mayRaiseUSBError(result)
1168
+
1169
+ def kernelDriverActive(self, interface):
1170
+ """
1171
+ Tell whether a kernel driver is active on given interface number.
1172
+ """
1173
+ result = libusb1.libusb_kernel_driver_active(self.__handle, interface)
1174
+ if result == 0:
1175
+ return False
1176
+ elif result == 1:
1177
+ return True
1178
+ raiseUSBError(result)
1179
+
1180
+ def detachKernelDriver(self, interface):
1181
+ """
1182
+ Ask kernel driver to detach from given interface number.
1183
+ """
1184
+ result = libusb1.libusb_detach_kernel_driver(self.__handle, interface)
1185
+ mayRaiseUSBError(result)
1186
+
1187
+ def attachKernelDriver(self, interface):
1188
+ """
1189
+ Ask kernel driver to re-attach to given interface number.
1190
+ """
1191
+ result = libusb1.libusb_attach_kernel_driver(self.__handle, interface)
1192
+ mayRaiseUSBError(result)
1193
+
1194
+ def setAutoDetachKernelDriver(self, enable):
1195
+ """
1196
+ Control automatic kernel driver detach.
1197
+ enable (bool)
1198
+ True to enable auto-detach, False to disable it.
1199
+ """
1200
+ result = libusb1.libusb_set_auto_detach_kernel_driver(
1201
+ self.__handle, bool(enable),
1202
+ )
1203
+ mayRaiseUSBError(result)
1204
+
1205
+ def getSupportedLanguageList(self):
1206
+ """
1207
+ Return a list of USB language identifiers (as integers) supported by
1208
+ current device for its string descriptors.
1209
+
1210
+ Note: language identifiers seem (I didn't check them all...) very
1211
+ similar to windows language identifiers, so you may want to use
1212
+ locales.windows_locale to get an rfc3066 representation. The 5 standard
1213
+ HID language codes are missing though.
1214
+ """
1215
+ descriptor_string = create_binary_buffer(STRING_LENGTH)
1216
+ result = libusb1.libusb_get_string_descriptor(
1217
+ self.__handle, 0, 0, descriptor_string, sizeof(descriptor_string),
1218
+ )
1219
+ # pylint: disable=undefined-variable
1220
+ if result == ERROR_PIPE:
1221
+ # pylint: enable=undefined-variable
1222
+ # From libusb_control_transfer doc:
1223
+ # control request not supported by the device
1224
+ return []
1225
+ mayRaiseUSBError(result)
1226
+ length = cast(descriptor_string, POINTER(c_ubyte))[0]
1227
+ langid_list = cast(descriptor_string, POINTER(c_uint16))
1228
+ result = []
1229
+ append = result.append
1230
+ for offset in xrange(1, length / 2):
1231
+ append(libusb1.libusb_le16_to_cpu(langid_list[offset]))
1232
+ return result
1233
+
1234
+ def getStringDescriptor(self, descriptor, lang_id):
1235
+ """
1236
+ Fetch description string for given descriptor and in given language.
1237
+ Use getSupportedLanguageList to know which languages are available.
1238
+ Return value is an unicode string.
1239
+ Return None if there is no such descriptor on device.
1240
+ """
1241
+ descriptor_string = create_binary_buffer(STRING_LENGTH)
1242
+ result = libusb1.libusb_get_string_descriptor(
1243
+ self.__handle, descriptor, lang_id, descriptor_string,
1244
+ sizeof(descriptor_string),
1245
+ )
1246
+ # pylint: disable=undefined-variable
1247
+ if result == ERROR_NOT_FOUND:
1248
+ # pylint: enable=undefined-variable
1249
+ return None
1250
+ mayRaiseUSBError(result)
1251
+ return descriptor_string.value.decode('UTF-16-LE')
1252
+
1253
+ def getASCIIStringDescriptor(self, descriptor):
1254
+ """
1255
+ Fetch description string for given descriptor in first available
1256
+ language.
1257
+ Return value is an ASCII string.
1258
+ Return None if there is no such descriptor on device.
1259
+ """
1260
+ descriptor_string = create_binary_buffer(STRING_LENGTH)
1261
+ result = libusb1.libusb_get_string_descriptor_ascii(
1262
+ self.__handle, descriptor, descriptor_string,
1263
+ sizeof(descriptor_string),
1264
+ )
1265
+ # pylint: disable=undefined-variable
1266
+ if result == ERROR_NOT_FOUND:
1267
+ # pylint: enable=undefined-variable
1268
+ return None
1269
+ mayRaiseUSBError(result)
1270
+ return descriptor_string.value.decode('ASCII')
1271
+
1272
+ # Sync I/O
1273
+
1274
+ def _controlTransfer(
1275
+ self, request_type, request, value, index, data, length, timeout):
1276
+ result = libusb1.libusb_control_transfer(
1277
+ self.__handle, request_type, request, value, index, data, length,
1278
+ timeout,
1279
+ )
1280
+ mayRaiseUSBError(result)
1281
+ return result
1282
+
1283
+ def controlWrite(
1284
+ self, request_type, request, value, index, data, timeout=0):
1285
+ """
1286
+ Synchronous control write.
1287
+ request_type: request type bitmask (bmRequestType), see
1288
+ constants TYPE_* and RECIPIENT_*.
1289
+ request: request id (some values are standard).
1290
+ value, index, data: meaning is request-dependent.
1291
+ timeout: in milliseconds, how long to wait for device acknowledgement.
1292
+ Set to 0 to disable.
1293
+
1294
+ Returns the number of bytes actually sent.
1295
+ """
1296
+ # pylint: disable=undefined-variable
1297
+ request_type = (request_type & ~ENDPOINT_DIR_MASK) | ENDPOINT_OUT
1298
+ # pylint: enable=undefined-variable
1299
+ data = create_binary_buffer(data)
1300
+ return self._controlTransfer(request_type, request, value, index, data,
1301
+ sizeof(data), timeout)
1302
+
1303
+ def controlRead(
1304
+ self, request_type, request, value, index, length, timeout=0):
1305
+ """
1306
+ Synchronous control read.
1307
+ timeout: in milliseconds, how long to wait for data. Set to 0 to
1308
+ disable.
1309
+ See controlWrite for other parameters description.
1310
+
1311
+ Returns received data.
1312
+ """
1313
+ # pylint: disable=undefined-variable
1314
+ request_type = (request_type & ~ENDPOINT_DIR_MASK) | ENDPOINT_IN
1315
+ # pylint: enable=undefined-variable
1316
+ data = create_binary_buffer(length)
1317
+ transferred = self._controlTransfer(
1318
+ request_type, request, value, index, data, length, timeout,
1319
+ )
1320
+ return data.raw[:transferred]
1321
+
1322
+ def _bulkTransfer(self, endpoint, data, length, timeout):
1323
+ transferred = c_int()
1324
+ result = libusb1.libusb_bulk_transfer(
1325
+ self.__handle, endpoint, data, length, byref(transferred), timeout,
1326
+ )
1327
+ mayRaiseUSBError(result)
1328
+ return transferred.value
1329
+
1330
+ def bulkWrite(self, endpoint, data, timeout=0):
1331
+ """
1332
+ Synchronous bulk write.
1333
+ endpoint: endpoint to send data to.
1334
+ data: data to send.
1335
+ timeout: in milliseconds, how long to wait for device acknowledgement.
1336
+ Set to 0 to disable.
1337
+
1338
+ Returns the number of bytes actually sent.
1339
+ """
1340
+ # pylint: disable=undefined-variable
1341
+ endpoint = (endpoint & ~ENDPOINT_DIR_MASK) | ENDPOINT_OUT
1342
+ # pylint: enable=undefined-variable
1343
+ data = create_binary_buffer(data)
1344
+ return self._bulkTransfer(endpoint, data, sizeof(data), timeout)
1345
+
1346
+ def bulkRead(self, endpoint, length, timeout=0):
1347
+ """
1348
+ Synchronous bulk read.
1349
+ timeout: in milliseconds, how long to wait for data. Set to 0 to
1350
+ disable.
1351
+ See bulkWrite for other parameters description.
1352
+
1353
+ Returns received data.
1354
+ """
1355
+ # pylint: disable=undefined-variable
1356
+ endpoint = (endpoint & ~ENDPOINT_DIR_MASK) | ENDPOINT_IN
1357
+ # pylint: enable=undefined-variable
1358
+ data = create_binary_buffer(length)
1359
+ transferred = self._bulkTransfer(endpoint, data, length, timeout)
1360
+ # pylint: disable=invalid-slice-index
1361
+ return data.raw[:transferred]
1362
+ # pylint: enable=invalid-slice-index
1363
+
1364
+ def _interruptTransfer(self, endpoint, data, length, timeout):
1365
+ transferred = c_int()
1366
+ result = libusb1.libusb_interrupt_transfer(
1367
+ self.__handle, endpoint, data, length, byref(transferred), timeout,
1368
+ )
1369
+ mayRaiseUSBError(result)
1370
+ return transferred.value
1371
+
1372
+ def interruptWrite(self, endpoint, data, timeout=0):
1373
+ """
1374
+ Synchronous interrupt write.
1375
+ endpoint: endpoint to send data to.
1376
+ data: data to send.
1377
+ timeout: in milliseconds, how long to wait for device acknowledgement.
1378
+ Set to 0 to disable.
1379
+
1380
+ Returns the number of bytes actually sent.
1381
+ """
1382
+ # pylint: disable=undefined-variable
1383
+ endpoint = (endpoint & ~ENDPOINT_DIR_MASK) | ENDPOINT_OUT
1384
+ # pylint: enable=undefined-variable
1385
+ data = create_binary_buffer(data)
1386
+ return self._interruptTransfer(endpoint, data, sizeof(data), timeout)
1387
+
1388
+ def interruptRead(self, endpoint, length, timeout=0):
1389
+ """
1390
+ Synchronous interrupt write.
1391
+ timeout: in milliseconds, how long to wait for data. Set to 0 to
1392
+ disable.
1393
+ See interruptRead for other parameters description.
1394
+
1395
+ Returns received data.
1396
+ """
1397
+ # pylint: disable=undefined-variable
1398
+ endpoint = (endpoint & ~ENDPOINT_DIR_MASK) | ENDPOINT_IN
1399
+ # pylint: enable=undefined-variable
1400
+ data = create_binary_buffer(length)
1401
+ transferred = self._interruptTransfer(endpoint, data, length, timeout)
1402
+ # pylint: disable=invalid-slice-index
1403
+ return data.raw[:transferred]
1404
+ # pylint: enable=invalid-slice-index
1405
+
1406
+ def getTransfer(self, iso_packets=0):
1407
+ """
1408
+ Get an USBTransfer instance for asynchronous use.
1409
+ iso_packets: the number of isochronous transfer descriptors to
1410
+ allocate.
1411
+ """
1412
+ result = USBTransfer(
1413
+ self.__handle, iso_packets,
1414
+ self.__inflight_add, self.__inflight_remove,
1415
+ )
1416
+ self.__transfer_set.add(result)
1417
+ return result
1418
+
1419
+ class USBConfiguration(object):
1420
+ def __init__(self, context, config):
1421
+ """
1422
+ You should not instanciate this class directly.
1423
+ Call USBDevice methods to get instances of this class.
1424
+ """
1425
+ if not isinstance(config, libusb1.libusb_config_descriptor):
1426
+ raise TypeError('Unexpected descriptor type.')
1427
+ self.__config = config
1428
+ self.__context = context
1429
+
1430
+ def getNumInterfaces(self):
1431
+ return self.__config.bNumInterfaces
1432
+
1433
+ __len__ = getNumInterfaces
1434
+
1435
+ def getConfigurationValue(self):
1436
+ return self.__config.bConfigurationValue
1437
+
1438
+ def getDescriptor(self):
1439
+ return self.__config.iConfiguration
1440
+
1441
+ def getAttributes(self):
1442
+ return self.__config.bmAttributes
1443
+
1444
+ def getMaxPower(self):
1445
+ """
1446
+ Returns device's power consumption in mW.
1447
+ Beware of unit: USB descriptor uses 2mW increments, this method
1448
+ converts it to mW units.
1449
+ """
1450
+ return self.__config.MaxPower * 2
1451
+
1452
+ def getExtra(self):
1453
+ """
1454
+ Returns a list of extra (non-basic) descriptors (DFU, HID, ...).
1455
+ """
1456
+ return libusb1.get_extra(self.__config)
1457
+
1458
+ def __iter__(self):
1459
+ """
1460
+ Iterates over interfaces available in this configuration, yielding
1461
+ USBInterface instances.
1462
+ """
1463
+ context = self.__context
1464
+ interface_list = self.__config.interface
1465
+ for interface_num in xrange(self.getNumInterfaces()):
1466
+ yield USBInterface(context, interface_list[interface_num])
1467
+
1468
+ # BBB
1469
+ iterInterfaces = __iter__
1470
+
1471
+ def __getitem__(self, interface):
1472
+ """
1473
+ Returns an USBInterface instance.
1474
+ """
1475
+ if not isinstance(interface, int):
1476
+ raise TypeError('interface parameter must be an integer')
1477
+ if not 0 <= interface < self.getNumInterfaces():
1478
+ raise IndexError('No such interface: %r' % (interface, ))
1479
+ return USBInterface(self.__context, self.__config.interface[interface])
1480
+
1481
+ # pylint: disable=interface-not-implemented
1482
+ class USBInterface(object):
1483
+ def __init__(self, context, interface):
1484
+ """
1485
+ You should not instanciate this class directly.
1486
+ Call USBConfiguration methods to get instances of this class.
1487
+ """
1488
+ if not isinstance(interface, libusb1.libusb_interface):
1489
+ raise TypeError('Unexpected descriptor type.')
1490
+ self.__interface = interface
1491
+ self.__context = context
1492
+
1493
+ def getNumSettings(self):
1494
+ return self.__interface.num_altsetting
1495
+
1496
+ __len__ = getNumSettings
1497
+
1498
+ def __iter__(self):
1499
+ """
1500
+ Iterates over settings in this insterface, yielding
1501
+ USBInterfaceSetting instances.
1502
+ """
1503
+ context = self.__context
1504
+ alt_setting_list = self.__interface.altsetting
1505
+ for alt_setting_num in xrange(self.getNumSettings()):
1506
+ yield USBInterfaceSetting(
1507
+ context, alt_setting_list[alt_setting_num])
1508
+
1509
+ # BBB
1510
+ iterSettings = __iter__
1511
+
1512
+ def __getitem__(self, alt_setting):
1513
+ """
1514
+ Returns an USBInterfaceSetting instance.
1515
+ """
1516
+ if not isinstance(alt_setting, int):
1517
+ raise TypeError('alt_setting parameter must be an integer')
1518
+ if not 0 <= alt_setting < self.getNumSettings():
1519
+ raise IndexError('No such setting: %r' % (alt_setting, ))
1520
+ return USBInterfaceSetting(
1521
+ self.__context, self.__interface.altsetting[alt_setting])
1522
+ # pylint: enable=interface-not-implemented
1523
+
1524
+ class USBInterfaceSetting(object):
1525
+ def __init__(self, context, alt_setting):
1526
+ """
1527
+ You should not instanciate this class directly.
1528
+ Call USBDevice or USBInterface methods to get instances of this class.
1529
+ """
1530
+ if not isinstance(alt_setting, libusb1.libusb_interface_descriptor):
1531
+ raise TypeError('Unexpected descriptor type.')
1532
+ self.__alt_setting = alt_setting
1533
+ self.__context = context
1534
+
1535
+ def getNumber(self):
1536
+ return self.__alt_setting.bInterfaceNumber
1537
+
1538
+ def getAlternateSetting(self):
1539
+ return self.__alt_setting.bAlternateSetting
1540
+
1541
+ def getNumEndpoints(self):
1542
+ return self.__alt_setting.bNumEndpoints
1543
+
1544
+ __len__ = getNumEndpoints
1545
+
1546
+ def getClass(self):
1547
+ return self.__alt_setting.bInterfaceClass
1548
+
1549
+ def getSubClass(self):
1550
+ return self.__alt_setting.bInterfaceSubClass
1551
+
1552
+ def getClassTuple(self):
1553
+ """
1554
+ For convenience: class and subclass are probably often matched
1555
+ simultaneously.
1556
+ """
1557
+ alt_setting = self.__alt_setting
1558
+ return (alt_setting.bInterfaceClass, alt_setting.bInterfaceSubClass)
1559
+
1560
+ # BBB
1561
+ getClassTupple = getClassTuple
1562
+
1563
+ def getProtocol(self):
1564
+ return self.__alt_setting.bInterfaceProtocol
1565
+
1566
+ def getDescriptor(self):
1567
+ return self.__alt_setting.iInterface
1568
+
1569
+ def getExtra(self):
1570
+ return libusb1.get_extra(self.__alt_setting)
1571
+
1572
+ def __iter__(self):
1573
+ """
1574
+ Iterates over endpoints in this interface setting , yielding
1575
+ USBEndpoint instances.
1576
+ """
1577
+ context = self.__context
1578
+ endpoint_list = self.__alt_setting.endpoint
1579
+ for endpoint_num in xrange(self.getNumEndpoints()):
1580
+ yield USBEndpoint(context, endpoint_list[endpoint_num])
1581
+
1582
+ # BBB
1583
+ iterEndpoints = __iter__
1584
+
1585
+ def __getitem__(self, endpoint):
1586
+ """
1587
+ Returns an USBEndpoint instance.
1588
+ """
1589
+ if not isinstance(endpoint, int):
1590
+ raise TypeError('endpoint parameter must be an integer')
1591
+ if not 0 <= endpoint < self.getNumEndpoints():
1592
+ raise ValueError('No such endpoint: %r' % (endpoint, ))
1593
+ return USBEndpoint(
1594
+ self.__context, self.__alt_setting.endpoint[endpoint])
1595
+
1596
+ class USBEndpoint(object):
1597
+ def __init__(self, context, endpoint):
1598
+ if not isinstance(endpoint, libusb1.libusb_endpoint_descriptor):
1599
+ raise TypeError('Unexpected descriptor type.')
1600
+ self.__endpoint = endpoint
1601
+ self.__context = context
1602
+
1603
+ def getAddress(self):
1604
+ return self.__endpoint.bEndpointAddress
1605
+
1606
+ def getAttributes(self):
1607
+ return self.__endpoint.bmAttributes
1608
+
1609
+ def getMaxPacketSize(self):
1610
+ return self.__endpoint.wMaxPacketSize
1611
+
1612
+ def getInterval(self):
1613
+ return self.__endpoint.bInterval
1614
+
1615
+ def getRefresh(self):
1616
+ return self.__endpoint.bRefresh
1617
+
1618
+ def getSyncAddress(self):
1619
+ return self.__endpoint.bSynchAddress
1620
+
1621
+ def getExtra(self):
1622
+ return libusb1.get_extra(self.__endpoint)
1623
+
1624
+ class USBDevice(object):
1625
+ """
1626
+ Represents a USB device.
1627
+ """
1628
+
1629
+ __configuration_descriptor_list = ()
1630
+ __libusb_unref_device = libusb1.libusb_unref_device
1631
+ __libusb_free_config_descriptor = libusb1.libusb_free_config_descriptor
1632
+ __byref = byref
1633
+
1634
+ def __init__(self, context, device_p, can_load_configuration=True):
1635
+ """
1636
+ You should not instanciate this class directly.
1637
+ Call USBContext methods to receive instances of this class.
1638
+ """
1639
+ self.__context = context
1640
+ libusb1.libusb_ref_device(device_p)
1641
+ self.device_p = device_p
1642
+ # Fetch device descriptor
1643
+ device_descriptor = libusb1.libusb_device_descriptor()
1644
+ result = libusb1.libusb_get_device_descriptor(
1645
+ device_p, byref(device_descriptor))
1646
+ mayRaiseUSBError(result)
1647
+ self.device_descriptor = device_descriptor
1648
+ if can_load_configuration:
1649
+ self.__configuration_descriptor_list = descriptor_list = []
1650
+ append = descriptor_list.append
1651
+ device_p = self.device_p
1652
+ for configuration_id in xrange(
1653
+ self.device_descriptor.bNumConfigurations):
1654
+ config = libusb1.libusb_config_descriptor_p()
1655
+ result = libusb1.libusb_get_config_descriptor(
1656
+ device_p, configuration_id, byref(config))
1657
+ # pylint: disable=undefined-variable
1658
+ if result == ERROR_NOT_FOUND:
1659
+ # pylint: enable=undefined-variable
1660
+ # Some devices (ex windows' root hubs) tell they have
1661
+ # one configuration, but they have no configuration
1662
+ # descriptor.
1663
+ continue
1664
+ mayRaiseUSBError(result)
1665
+ append(config.contents)
1666
+
1667
+ def __del__(self):
1668
+ self.__libusb_unref_device(self.device_p)
1669
+ # pylint: disable=redefined-outer-name
1670
+ byref = self.__byref
1671
+ # pylint: enable=redefined-outer-name
1672
+ for config in self.__configuration_descriptor_list:
1673
+ self.__libusb_free_config_descriptor(byref(config))
1674
+
1675
+ def __str__(self):
1676
+ return 'Bus %03i Device %03i: ID %04x:%04x' % (
1677
+ self.getBusNumber(),
1678
+ self.getDeviceAddress(),
1679
+ self.getVendorID(),
1680
+ self.getProductID(),
1681
+ )
1682
+
1683
+ def __len__(self):
1684
+ return len(self.__configuration_descriptor_list)
1685
+
1686
+ def __getitem__(self, index):
1687
+ return USBConfiguration(
1688
+ self.__context, self.__configuration_descriptor_list[index])
1689
+
1690
+ def __key(self):
1691
+ return (
1692
+ id(self.__context), self.getBusNumber(),
1693
+ self.getDeviceAddress(), self.getVendorID(),
1694
+ self.getProductID(),
1695
+ )
1696
+
1697
+ def __hash__(self):
1698
+ return hash(self.__key())
1699
+
1700
+ def __eq__(self, other):
1701
+ return type(self) == type(other) and (
1702
+ self.device_p == other.device_p or
1703
+ # pylint: disable=protected-access
1704
+ self.__key() == other.__key()
1705
+ # pylint: enable=protected-access
1706
+ )
1707
+
1708
+ def iterConfigurations(self):
1709
+ context = self.__context
1710
+ for config in self.__configuration_descriptor_list:
1711
+ yield USBConfiguration(context, config)
1712
+
1713
+ # BBB
1714
+ iterConfiguations = iterConfigurations
1715
+
1716
+ def iterSettings(self):
1717
+ for config in self.iterConfigurations():
1718
+ for interface in config:
1719
+ for setting in interface:
1720
+ yield setting
1721
+
1722
+ def getBusNumber(self):
1723
+ """
1724
+ Get device's bus number.
1725
+ """
1726
+ return libusb1.libusb_get_bus_number(self.device_p)
1727
+
1728
+ def getPortNumber(self):
1729
+ """
1730
+ Get device's port number.
1731
+ """
1732
+ return libusb1.libusb_get_port_number(self.device_p)
1733
+
1734
+ def getPortNumberList(self):
1735
+ """
1736
+ Get the port number of each hub toward device.
1737
+ """
1738
+ port_list = (c_uint8 * PATH_MAX_DEPTH)()
1739
+ result = libusb1.libusb_get_port_numbers(
1740
+ self.device_p, port_list, len(port_list))
1741
+ mayRaiseUSBError(result)
1742
+ return list(port_list[:result])
1743
+
1744
+ # TODO: wrap libusb_get_parent when/if libusb removes the need to be inside
1745
+ # a libusb_(get|free)_device_list block.
1746
+
1747
+ def getDeviceAddress(self):
1748
+ """
1749
+ Get device's address on its bus.
1750
+ """
1751
+ return libusb1.libusb_get_device_address(self.device_p)
1752
+
1753
+ def getbcdUSB(self):
1754
+ """
1755
+ Get the USB spec version device complies to, in BCD format.
1756
+ """
1757
+ return self.device_descriptor.bcdUSB
1758
+
1759
+ def getDeviceClass(self):
1760
+ """
1761
+ Get device's class id.
1762
+ """
1763
+ return self.device_descriptor.bDeviceClass
1764
+
1765
+ def getDeviceSubClass(self):
1766
+ """
1767
+ Get device's subclass id.
1768
+ """
1769
+ return self.device_descriptor.bDeviceSubClass
1770
+
1771
+ def getDeviceProtocol(self):
1772
+ """
1773
+ Get device's protocol id.
1774
+ """
1775
+ return self.device_descriptor.bDeviceProtocol
1776
+
1777
+ def getMaxPacketSize0(self):
1778
+ """
1779
+ Get device's max packet size for endpoint 0 (control).
1780
+ """
1781
+ return self.device_descriptor.bMaxPacketSize0
1782
+
1783
+ def getMaxPacketSize(self, endpoint):
1784
+ """
1785
+ Get device's max packet size for given endpoint.
1786
+
1787
+ Warning: this function will not always give you the expected result.
1788
+ See https://libusb.org/ticket/77 . You should instead consult the
1789
+ endpoint descriptor of current configuration and alternate setting.
1790
+ """
1791
+ result = libusb1.libusb_get_max_packet_size(self.device_p, endpoint)
1792
+ mayRaiseUSBError(result)
1793
+ return result
1794
+
1795
+ def getMaxISOPacketSize(self, endpoint):
1796
+ """
1797
+ Get the maximum size for a single isochronous packet for given
1798
+ endpoint.
1799
+
1800
+ Warning: this function will not always give you the expected result.
1801
+ See https://libusb.org/ticket/77 . You should instead consult the
1802
+ endpoint descriptor of current configuration and alternate setting.
1803
+ """
1804
+ result = libusb1.libusb_get_max_iso_packet_size(self.device_p, endpoint)
1805
+ mayRaiseUSBError(result)
1806
+ return result
1807
+
1808
+ def getVendorID(self):
1809
+ """
1810
+ Get device's vendor id.
1811
+ """
1812
+ return self.device_descriptor.idVendor
1813
+
1814
+ def getProductID(self):
1815
+ """
1816
+ Get device's product id.
1817
+ """
1818
+ return self.device_descriptor.idProduct
1819
+
1820
+ def getbcdDevice(self):
1821
+ """
1822
+ Get device's release number.
1823
+ """
1824
+ return self.device_descriptor.bcdDevice
1825
+
1826
+ def getSupportedLanguageList(self):
1827
+ """
1828
+ Get the list of language ids device has string descriptors for.
1829
+ """
1830
+ temp_handle = self.open()
1831
+ return temp_handle.getSupportedLanguageList()
1832
+
1833
+ def _getStringDescriptor(self, descriptor, lang_id):
1834
+ if descriptor == 0:
1835
+ result = None
1836
+ else:
1837
+ temp_handle = self.open()
1838
+ result = temp_handle.getStringDescriptor(descriptor, lang_id)
1839
+ return result
1840
+
1841
+ def _getASCIIStringDescriptor(self, descriptor):
1842
+ if descriptor == 0:
1843
+ result = None
1844
+ else:
1845
+ temp_handle = self.open()
1846
+ result = temp_handle.getASCIIStringDescriptor(descriptor)
1847
+ return result
1848
+
1849
+ def getManufacturer(self):
1850
+ """
1851
+ Get device's manufaturer name.
1852
+ Note: opens the device temporarily.
1853
+ """
1854
+ return self._getASCIIStringDescriptor(
1855
+ self.device_descriptor.iManufacturer)
1856
+
1857
+ def getProduct(self):
1858
+ """
1859
+ Get device's product name.
1860
+ Note: opens the device temporarily.
1861
+ """
1862
+ return self._getASCIIStringDescriptor(self.device_descriptor.iProduct)
1863
+
1864
+ def getSerialNumber(self):
1865
+ """
1866
+ Get device's serial number.
1867
+ Note: opens the device temporarily.
1868
+ """
1869
+ return self._getASCIIStringDescriptor(
1870
+ self.device_descriptor.iSerialNumber)
1871
+
1872
+ def getNumConfigurations(self):
1873
+ """
1874
+ Get device's number of possible configurations.
1875
+ """
1876
+ return self.device_descriptor.bNumConfigurations
1877
+
1878
+ def getDeviceSpeed(self):
1879
+ """
1880
+ Get device's speed.
1881
+
1882
+ Returns one of:
1883
+ SPEED_UNKNOWN
1884
+ SPEED_LOW
1885
+ SPEED_FULL
1886
+ SPEED_HIGH
1887
+ SPEED_SUPER
1888
+ """
1889
+ return libusb1.libusb_get_device_speed(self.device_p)
1890
+
1891
+ def open(self):
1892
+ """
1893
+ Open device.
1894
+ Returns an USBDeviceHandle instance.
1895
+ """
1896
+ handle = libusb1.libusb_device_handle_p()
1897
+ result = libusb1.libusb_open(self.device_p, byref(handle))
1898
+ mayRaiseUSBError(result)
1899
+ return USBDeviceHandle(self.__context, handle, self)
1900
+
1901
+ _zero_tv = libusb1.timeval(0, 0)
1902
+ _zero_tv_p = byref(_zero_tv)
1903
+
1904
+ class USBContext(object):
1905
+ """
1906
+ libusb1 USB context.
1907
+
1908
+ Provides methods to enumerate & look up USB devices.
1909
+ Also provides access to global (device-independent) libusb1 functions.
1910
+ """
1911
+ __libusb_exit = libusb1.libusb_exit
1912
+ __context_p = None
1913
+ __added_cb = None
1914
+ __removed_cb = None
1915
+ __libusb_set_pollfd_notifiers = libusb1.libusb_set_pollfd_notifiers
1916
+
1917
+ #pylint: disable=no-self-argument
1918
+ def _validContext(func):
1919
+ # Defined inside USBContext so we can access "self.__*".
1920
+ @functools.wraps(func)
1921
+ def wrapper(self, *args, **kw):
1922
+ # pylint: disable=protected-access
1923
+ self.__context_cond.acquire()
1924
+ self.__context_refcount += 1
1925
+ self.__context_cond.release()
1926
+ try:
1927
+ if self.__context_p is not None:
1928
+ #pylint: disable=not-callable
1929
+ return func(self, *args, **kw)
1930
+ #pylint: enable=not-callable
1931
+ finally:
1932
+ self.__context_cond.acquire()
1933
+ self.__context_refcount -= 1
1934
+ if not self.__context_refcount:
1935
+ self.__context_cond.notifyAll()
1936
+ self.__context_cond.release()
1937
+ # pylint: enable=protected-access
1938
+ return wrapper
1939
+ #pylint: enable=no-self-argument
1940
+
1941
+ def __init__(self):
1942
+ """
1943
+ Create a new USB context.
1944
+ """
1945
+ # Used to prevent an exit to cause a segfault if a concurrent thread
1946
+ # is still in libusb.
1947
+ self.__context_refcount = 0
1948
+ self.__context_cond = threading.Condition()
1949
+ context_p = libusb1.libusb_context_p()
1950
+ result = libusb1.libusb_init(byref(context_p))
1951
+ mayRaiseUSBError(result)
1952
+ self.__context_p = context_p
1953
+ self.__hotplug_callback_dict = {}
1954
+
1955
+ def __del__(self):
1956
+ # Avoid locking.
1957
+ # XXX: Assumes __del__ should not normally be called while any
1958
+ # instance's method is being executed. It seems unlikely (they hold a
1959
+ # reference to their instance).
1960
+ self._exit()
1961
+
1962
+ def exit(self):
1963
+ """
1964
+ Close (destroy) this USB context.
1965
+
1966
+ When this method has been called, methods on its instance will
1967
+ become mosty no-ops, returning None.
1968
+ """
1969
+ self.__context_cond.acquire()
1970
+ try:
1971
+ while self.__context_refcount and self.__context_p is not None:
1972
+ self.__context_cond.wait()
1973
+ self._exit()
1974
+ finally:
1975
+ self.__context_cond.notifyAll()
1976
+ self.__context_cond.release()
1977
+
1978
+ def _exit(self):
1979
+ context_p = self.__context_p
1980
+ if context_p is not None:
1981
+ self.__libusb_exit(context_p)
1982
+ self.__context_p = None
1983
+ self.__added_cb = None
1984
+ self.__removed_cb = None
1985
+
1986
+ @_validContext
1987
+ def getDeviceList(self, skip_on_access_error=False, skip_on_error=False):
1988
+ """
1989
+ Return a list of all USB devices currently plugged in, as USBDevice
1990
+ instances.
1991
+
1992
+ skip_on_error (bool)
1993
+ If True, ignore devices which raise USBError.
1994
+
1995
+ skip_on_access_error (bool)
1996
+ DEPRECATED. Alias for skip_on_error.
1997
+ """
1998
+ skip_on_error = skip_on_error or skip_on_access_error
1999
+ device_p_p = libusb1.libusb_device_p_p()
2000
+ libusb_device_p = libusb1.libusb_device_p
2001
+ device_list_len = libusb1.libusb_get_device_list(self.__context_p,
2002
+ byref(device_p_p))
2003
+ mayRaiseUSBError(device_list_len)
2004
+ try:
2005
+ result = []
2006
+ append = result.append
2007
+ for device_p in device_p_p[:device_list_len]:
2008
+ try:
2009
+ # Instanciate our own libusb_device_p object so we can free
2010
+ # libusb-provided device list. Is this a bug in ctypes that
2011
+ # it doesn't copy pointer value (=pointed memory address) ?
2012
+ # At least, it's not so convenient and forces using such
2013
+ # weird code.
2014
+ device = USBDevice(self, libusb_device_p(device_p.contents))
2015
+ except USBError:
2016
+ if not skip_on_error:
2017
+ raise
2018
+ else:
2019
+ append(device)
2020
+ finally:
2021
+ libusb1.libusb_free_device_list(device_p_p, 1)
2022
+ return result
2023
+
2024
+ def getByVendorIDAndProductID(
2025
+ self, vendor_id, product_id,
2026
+ skip_on_access_error=False, skip_on_error=False):
2027
+ """
2028
+ Get the first USB device matching given vendor and product ids.
2029
+ Returns an USBDevice instance, or None if no present device match.
2030
+ skip_on_error (bool)
2031
+ (see getDeviceList)
2032
+ skip_on_access_error (bool)
2033
+ (see getDeviceList)
2034
+ """
2035
+ for device in self.getDeviceList(
2036
+ skip_on_access_error=skip_on_access_error,
2037
+ skip_on_error=skip_on_error):
2038
+ if device.getVendorID() == vendor_id and \
2039
+ device.getProductID() == product_id:
2040
+ return device
2041
+
2042
+ def openByVendorIDAndProductID(
2043
+ self, vendor_id, product_id,
2044
+ skip_on_access_error=False, skip_on_error=False):
2045
+ """
2046
+ Get the first USB device matching given vendor and product ids.
2047
+ Returns an USBDeviceHandle instance, or None if no present device
2048
+ match.
2049
+ skip_on_error (bool)
2050
+ (see getDeviceList)
2051
+ skip_on_access_error (bool)
2052
+ (see getDeviceList)
2053
+ """
2054
+ result = self.getByVendorIDAndProductID(
2055
+ vendor_id, product_id,
2056
+ skip_on_access_error=skip_on_access_error,
2057
+ skip_on_error=skip_on_error)
2058
+ if result is not None:
2059
+ return result.open()
2060
+
2061
+ @_validContext
2062
+ def getPollFDList(self):
2063
+ """
2064
+ Return file descriptors to be used to poll USB events.
2065
+ You should not have to call this method, unless you are integrating
2066
+ this class with a polling mechanism.
2067
+ """
2068
+ pollfd_p_p = libusb1.libusb_get_pollfds(self.__context_p)
2069
+ if not pollfd_p_p:
2070
+ errno = get_errno()
2071
+ if errno:
2072
+ raise OSError(errno)
2073
+ else:
2074
+ # Assume not implemented
2075
+ raise NotImplementedError(
2076
+ 'Your libusb does not seem to implement pollable FDs')
2077
+ try:
2078
+ result = []
2079
+ append = result.append
2080
+ fd_index = 0
2081
+ while pollfd_p_p[fd_index]:
2082
+ append((
2083
+ pollfd_p_p[fd_index].contents.fd,
2084
+ pollfd_p_p[fd_index].contents.events,
2085
+ ))
2086
+ fd_index += 1
2087
+ finally:
2088
+ _free(pollfd_p_p)
2089
+ return result
2090
+
2091
+ @_validContext
2092
+ def handleEvents(self):
2093
+ """
2094
+ Handle any pending event (blocking).
2095
+ See libusb1 documentation for details (there is a timeout, so it's
2096
+ not "really" blocking).
2097
+ """
2098
+ result = libusb1.libusb_handle_events(self.__context_p)
2099
+ mayRaiseUSBError(result)
2100
+
2101
+ # TODO: handleEventsCompleted
2102
+
2103
+ @_validContext
2104
+ def handleEventsTimeout(self, tv=0):
2105
+ """
2106
+ Handle any pending event.
2107
+ If tv is 0, will return immediately after handling already-pending
2108
+ events.
2109
+ Otherwise, defines the maximum amount of time to wait for events, in
2110
+ seconds.
2111
+ """
2112
+ if tv is None:
2113
+ tv = 0
2114
+ tv_s = int(tv)
2115
+ tv = libusb1.timeval(tv_s, int((tv - tv_s) * 1000000))
2116
+ result = libusb1.libusb_handle_events_timeout(
2117
+ self.__context_p, byref(tv))
2118
+ mayRaiseUSBError(result)
2119
+
2120
+ # TODO: handleEventsTimeoutCompleted
2121
+
2122
+ @_validContext
2123
+ def setPollFDNotifiers(
2124
+ self, added_cb=None, removed_cb=None, user_data=None):
2125
+ """
2126
+ Give libusb1 methods to call when it should add/remove file descriptor
2127
+ for polling.
2128
+ You should not have to call this method, unless you are integrating
2129
+ this class with a polling mechanism.
2130
+ """
2131
+ if added_cb is None:
2132
+ added_cb = POINTER(None)
2133
+ else:
2134
+ added_cb = libusb1.libusb_pollfd_added_cb_p(added_cb)
2135
+ if removed_cb is None:
2136
+ removed_cb = POINTER(None)
2137
+ else:
2138
+ removed_cb = libusb1.libusb_pollfd_removed_cb_p(removed_cb)
2139
+ self.__added_cb = added_cb
2140
+ self.__removed_cb = removed_cb
2141
+ self.__libusb_set_pollfd_notifiers(
2142
+ self.__context_p, added_cb, removed_cb, user_data)
2143
+
2144
+ @_validContext
2145
+ def getNextTimeout(self):
2146
+ """
2147
+ Returns the next internal timeout that libusb needs to handle, in
2148
+ seconds, or None if no timeout is needed.
2149
+ You should not have to call this method, unless you are integrating
2150
+ this class with a polling mechanism.
2151
+ """
2152
+ timeval = libusb1.timeval()
2153
+ result = libusb1.libusb_get_next_timeout(
2154
+ self.__context_p, byref(timeval))
2155
+ if result == 0:
2156
+ return None
2157
+ elif result == 1:
2158
+ return timeval.tv_sec + (timeval.tv_usec * 0.000001)
2159
+ raiseUSBError(result)
2160
+
2161
+ @_validContext
2162
+ def setDebug(self, level):
2163
+ """
2164
+ Set debugging level.
2165
+ Note: depending on libusb compilation settings, this might have no
2166
+ effect.
2167
+ """
2168
+ libusb1.libusb_set_debug(self.__context_p, level)
2169
+
2170
+ @_validContext
2171
+ def tryLockEvents(self):
2172
+ """
2173
+ See libusb_try_lock_events doc.
2174
+ """
2175
+ return libusb1.libusb_try_lock_events(self.__context_p)
2176
+
2177
+ @_validContext
2178
+ def lockEvents(self):
2179
+ """
2180
+ See libusb_lock_events doc.
2181
+ """
2182
+ libusb1.libusb_lock_events(self.__context_p)
2183
+
2184
+ @_validContext
2185
+ def lockEventWaiters(self):
2186
+ """
2187
+ See libusb_lock_event_waiters doc.
2188
+ """
2189
+ libusb1.libusb_lock_event_waiters(self.__context_p)
2190
+
2191
+ @_validContext
2192
+ def waitForEvent(self, tv=0):
2193
+ """
2194
+ See libusb_wait_for_event doc.
2195
+ """
2196
+ if tv is None:
2197
+ tv = 0
2198
+ tv_s = int(tv)
2199
+ tv = libusb1.timeval(tv_s, int((tv - tv_s) * 1000000))
2200
+ libusb1.libusb_wait_for_event(self.__context_p, byref(tv))
2201
+
2202
+ @_validContext
2203
+ def unlockEventWaiters(self):
2204
+ """
2205
+ See libusb_unlock_event_waiters doc.
2206
+ """
2207
+ libusb1.libusb_unlock_event_waiters(self.__context_p)
2208
+
2209
+ @_validContext
2210
+ def eventHandlingOK(self):
2211
+ """
2212
+ See libusb_event_handling_ok doc.
2213
+ """
2214
+ return libusb1.libusb_event_handling_ok(self.__context_p)
2215
+
2216
+ @_validContext
2217
+ def unlockEvents(self):
2218
+ """
2219
+ See libusb_unlock_events doc.
2220
+ """
2221
+ libusb1.libusb_unlock_events(self.__context_p)
2222
+
2223
+ @_validContext
2224
+ def handleEventsLocked(self):
2225
+ """
2226
+ See libusb_handle_events_locked doc.
2227
+ """
2228
+ # XXX: does tv parameter need to be exposed ?
2229
+ result = libusb1.libusb_handle_events_locked(
2230
+ self.__context_p, _zero_tv_p)
2231
+ mayRaiseUSBError(result)
2232
+
2233
+ @_validContext
2234
+ def eventHandlerActive(self):
2235
+ """
2236
+ See libusb_event_handler_active doc.
2237
+ """
2238
+ return libusb1.libusb_event_handler_active(self.__context_p)
2239
+
2240
+ @staticmethod
2241
+ def hasCapability(capability):
2242
+ """
2243
+ Backward-compatibility alias for module-level hasCapability.
2244
+ """
2245
+ return hasCapability(capability)
2246
+
2247
+ @_validContext
2248
+ def hotplugRegisterCallback(
2249
+ self, callback,
2250
+ # pylint: disable=undefined-variable
2251
+ events=HOTPLUG_EVENT_DEVICE_ARRIVED | HOTPLUG_EVENT_DEVICE_LEFT,
2252
+ flags=HOTPLUG_ENUMERATE,
2253
+ vendor_id=HOTPLUG_MATCH_ANY,
2254
+ product_id=HOTPLUG_MATCH_ANY,
2255
+ dev_class=HOTPLUG_MATCH_ANY,
2256
+ # pylint: enable=undefined-variable
2257
+ ):
2258
+ """
2259
+ Registers an hotplug callback.
2260
+ On success, returns an opaque value which can be passed to
2261
+ hotplugDeregisterCallback.
2262
+ Callback must accept the following positional arguments:
2263
+ - this USBContext instance
2264
+ - an USBDevice instance
2265
+ If device has left, configuration descriptors may not be
2266
+ available. Its device descriptor will be available.
2267
+ - event type, one of:
2268
+ HOTPLUG_EVENT_DEVICE_ARRIVED
2269
+ HOTPLUG_EVENT_DEVICE_LEFT
2270
+ Callback must return whether it must be unregistered (any true value
2271
+ to be unregistered, any false value to be kept registered).
2272
+ """
2273
+ def wrapped_callback(context_p, device_p, event, _):
2274
+ assert addressof(context_p.contents) == addressof(
2275
+ self.__context_p.contents), (context_p, self.__context_p)
2276
+ unregister = bool(callback(
2277
+ self,
2278
+ USBDevice(
2279
+ self,
2280
+ device_p,
2281
+ # pylint: disable=undefined-variable
2282
+ event != HOTPLUG_EVENT_DEVICE_LEFT,
2283
+ # pylint: enable=undefined-variable
2284
+ ),
2285
+ event,
2286
+ ))
2287
+ if unregister:
2288
+ del self.__hotplug_callback_dict[handle]
2289
+ return unregister
2290
+ handle = c_int()
2291
+ callback_p = libusb1.libusb_hotplug_callback_fn_p(wrapped_callback)
2292
+ result = libusb1.libusb_hotplug_register_callback(
2293
+ self.__context_p, events, flags, vendor_id, product_id, dev_class,
2294
+ callback_p, None, byref(handle))
2295
+ mayRaiseUSBError(result)
2296
+ handle = handle.value
2297
+ # Keep strong references
2298
+ assert handle not in self.__hotplug_callback_dict, (
2299
+ handle,
2300
+ self.__hotplug_callback_dict,
2301
+ )
2302
+ self.__hotplug_callback_dict[handle] = (callback_p, wrapped_callback)
2303
+ return handle
2304
+
2305
+ @_validContext
2306
+ def hotplugDeregisterCallback(self, handle):
2307
+ """
2308
+ Deregisters an hotplug callback.
2309
+ handle (opaque)
2310
+ Return value of a former hotplugRegisterCallback call.
2311
+ """
2312
+ del self.__hotplug_callback_dict[handle]
2313
+ libusb1.libusb_hotplug_deregister_callback(self.__context_p, handle)
2314
+
2315
+ del USBContext._validContext
2316
+
2317
+ def getVersion():
2318
+ """
2319
+ Returns underlying libusb's version information as a 6-namedtuple (or
2320
+ 6-tuple if namedtuples are not avaiable):
2321
+ - major
2322
+ - minor
2323
+ - micro
2324
+ - nano
2325
+ - rc
2326
+ - describe
2327
+ Returns (0, 0, 0, 0, '', '') if libusb doesn't have required entry point.
2328
+ """
2329
+ version = libusb1.libusb_get_version().contents
2330
+ return Version(
2331
+ version.major,
2332
+ version.minor,
2333
+ version.micro,
2334
+ version.nano,
2335
+ version.rc,
2336
+ version.describe,
2337
+ )
2338
+
2339
+ def hasCapability(capability):
2340
+ """
2341
+ Tests feature presence.
2342
+
2343
+ capability should be one of:
2344
+ CAP_HAS_CAPABILITY
2345
+ CAP_HAS_HOTPLUG
2346
+ CAP_HAS_HID_ACCESS
2347
+ CAP_SUPPORTS_DETACH_KERNEL_DRIVER
2348
+ """
2349
+ return libusb1.libusb_has_capability(capability)
2350
+
2351
+ class LibUSBContext(USBContext):
2352
+ """
2353
+ Backward-compatibility alias for USBContext.
2354
+ """
2355
+ def __init__(self):
2356
+ warnings.warn(
2357
+ 'LibUSBContext is being renamed to USBContext',
2358
+ DeprecationWarning,
2359
+ )
2360
+ super(LibUSBContext, self).__init__()