simplejsble 0.0.4 → 0.0.6

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 (273) hide show
  1. package/VERSION +1 -0
  2. package/android/CMakeLists.txt +62 -20
  3. package/cmake/epilogue.cmake +81 -0
  4. package/cmake/find/FindDBus1.cmake +20 -0
  5. package/cmake/find/Findfmt.cmake +41 -0
  6. package/cmake/find/Findgoogletest.cmake +18 -0
  7. package/cmake/parse_version.cmake +45 -0
  8. package/cmake/prelude.cmake +8 -0
  9. package/dependencies/README +4 -0
  10. package/dependencies/external/kvn/kvn_bytearray.h +297 -0
  11. package/dependencies/external/kvn/kvn_safe_callback.hpp +66 -0
  12. package/dependencies/external/kvn/logfwd.hpp +35 -0
  13. package/dependencies/internal/include/fmt/LICENSE +27 -0
  14. package/dependencies/internal/include/fmt/args.h +220 -0
  15. package/dependencies/internal/include/fmt/base.h +2962 -0
  16. package/dependencies/internal/include/fmt/chrono.h +2338 -0
  17. package/dependencies/internal/include/fmt/color.h +610 -0
  18. package/dependencies/internal/include/fmt/compile.h +539 -0
  19. package/dependencies/internal/include/fmt/core.h +5 -0
  20. package/dependencies/internal/include/fmt/format-inl.h +1949 -0
  21. package/dependencies/internal/include/fmt/format.h +4244 -0
  22. package/dependencies/internal/include/fmt/os.h +427 -0
  23. package/dependencies/internal/include/fmt/ostream.h +166 -0
  24. package/dependencies/internal/include/fmt/printf.h +633 -0
  25. package/dependencies/internal/include/fmt/ranges.h +850 -0
  26. package/dependencies/internal/include/fmt/std.h +726 -0
  27. package/dependencies/internal/include/fmt/xchar.h +373 -0
  28. package/dependencies/internal/include/nanopb/pb.h +948 -0
  29. package/dependencies/internal/include/nanopb/pb_common.h +49 -0
  30. package/dependencies/internal/include/nanopb/pb_decode.h +204 -0
  31. package/dependencies/internal/include/nanopb/pb_encode.h +195 -0
  32. package/dependencies/internal/include/simplejni/Common.hpp +598 -0
  33. package/dependencies/internal/include/simplejni/References.hpp +151 -0
  34. package/dependencies/internal/include/simplejni/Registry.hpp +249 -0
  35. package/dependencies/internal/include/simplejni/VM.hpp +93 -0
  36. package/dependencies/internal/src/nanopb/pb_common.c +388 -0
  37. package/dependencies/internal/src/nanopb/pb_decode.c +1763 -0
  38. package/dependencies/internal/src/nanopb/pb_encode.c +1009 -0
  39. package/dependencies/internal/src/simplejni/Common.cpp +4 -0
  40. package/package.json +5 -1
  41. package/simpleble/CMakeLists.txt +519 -0
  42. package/simpleble/cmake/simpleble.pc.in +11 -0
  43. package/simpleble/include/simpleble/Adapter.h +102 -0
  44. package/simpleble/include/simpleble/AdapterSafe.h +58 -0
  45. package/simpleble/include/simpleble/Advanced.h +50 -0
  46. package/simpleble/include/simpleble/Characteristic.h +39 -0
  47. package/simpleble/include/simpleble/Config.h +64 -0
  48. package/simpleble/include/simpleble/Descriptor.h +30 -0
  49. package/simpleble/include/simpleble/Exceptions.h +72 -0
  50. package/simpleble/include/simpleble/Logging.h +73 -0
  51. package/simpleble/include/simpleble/Peripheral.h +82 -0
  52. package/simpleble/include/simpleble/PeripheralSafe.h +64 -0
  53. package/simpleble/include/simpleble/Service.h +34 -0
  54. package/simpleble/include/simpleble/SimpleBLE.h +8 -0
  55. package/simpleble/include/simpleble/Types.h +49 -0
  56. package/simpleble/include/simpleble/Utils.h +13 -0
  57. package/simpleble/include/simpleble_c/DEPRECATED +2 -0
  58. package/simpleble/include/simpleble_c/adapter.h +188 -0
  59. package/simpleble/include/simpleble_c/logging.h +37 -0
  60. package/simpleble/include/simpleble_c/peripheral.h +304 -0
  61. package/simpleble/include/simpleble_c/simpleble.h +21 -0
  62. package/simpleble/include/simpleble_c/types.h +73 -0
  63. package/simpleble/include/simpleble_c/utils.h +27 -0
  64. package/simpleble/src/CommonUtils.h +63 -0
  65. package/simpleble/src/Config.cpp +25 -0
  66. package/simpleble/src/Exceptions.cpp +31 -0
  67. package/simpleble/src/Logging.cpp +136 -0
  68. package/simpleble/src/LoggingInternal.h +85 -0
  69. package/simpleble/src/Utils.cpp +24 -0
  70. package/simpleble/src/backends/android/AdapterAndroid.cpp +101 -0
  71. package/simpleble/src/backends/android/AdapterAndroid.h +67 -0
  72. package/simpleble/src/backends/android/BackendAndroid.cpp +41 -0
  73. package/simpleble/src/backends/android/BackendAndroid.h +26 -0
  74. package/simpleble/src/backends/android/PeripheralAndroid.cpp +365 -0
  75. package/simpleble/src/backends/android/PeripheralAndroid.h +90 -0
  76. package/simpleble/src/backends/android/bridge/BluetoothGattCallback.cpp +432 -0
  77. package/simpleble/src/backends/android/bridge/BluetoothGattCallback.h +102 -0
  78. package/simpleble/src/backends/android/bridge/ScanCallback.cpp +142 -0
  79. package/simpleble/src/backends/android/bridge/ScanCallback.h +55 -0
  80. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothAdapter.cpp +107 -0
  81. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothAdapter.h +55 -0
  82. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothDevice.cpp +68 -0
  83. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothDevice.h +54 -0
  84. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothGatt.cpp +115 -0
  85. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothGatt.h +75 -0
  86. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattCharacteristic.cpp +142 -0
  87. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattCharacteristic.h +66 -0
  88. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattDescriptor.cpp +67 -0
  89. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattDescriptor.h +46 -0
  90. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattService.cpp +106 -0
  91. package/simpleble/src/backends/android/types/android/bluetooth/BluetoothGattService.h +47 -0
  92. package/simpleble/src/backends/android/types/android/bluetooth/le/BluetoothScanner.cpp +47 -0
  93. package/simpleble/src/backends/android/types/android/bluetooth/le/BluetoothScanner.h +37 -0
  94. package/simpleble/src/backends/android/types/android/bluetooth/le/ScanRecord.cpp +69 -0
  95. package/simpleble/src/backends/android/types/android/bluetooth/le/ScanRecord.h +41 -0
  96. package/simpleble/src/backends/android/types/android/bluetooth/le/ScanResult.cpp +63 -0
  97. package/simpleble/src/backends/android/types/android/bluetooth/le/ScanResult.h +42 -0
  98. package/simpleble/src/backends/android/types/android/os/ParcelUUID.cpp +32 -0
  99. package/simpleble/src/backends/android/types/android/os/ParcelUUID.h +30 -0
  100. package/simpleble/src/backends/android/types/android/util/SparseArray.cpp +54 -0
  101. package/simpleble/src/backends/android/types/android/util/SparseArray.h +37 -0
  102. package/simpleble/src/backends/android/types/java/util/Iterator.cpp +36 -0
  103. package/simpleble/src/backends/android/types/java/util/Iterator.h +28 -0
  104. package/simpleble/src/backends/android/types/java/util/List.cpp +29 -0
  105. package/simpleble/src/backends/android/types/java/util/List.h +27 -0
  106. package/simpleble/src/backends/android/types/java/util/Set.cpp +33 -0
  107. package/simpleble/src/backends/android/types/java/util/Set.h +28 -0
  108. package/simpleble/src/backends/android/types/java/util/UUID.cpp +26 -0
  109. package/simpleble/src/backends/android/types/java/util/UUID.h +29 -0
  110. package/simpleble/src/backends/common/AdapterBase.cpp +53 -0
  111. package/simpleble/src/backends/common/AdapterBase.h +81 -0
  112. package/simpleble/src/backends/common/AdapterBaseTypes.h +22 -0
  113. package/simpleble/src/backends/common/BackendBase.h +20 -0
  114. package/simpleble/src/backends/common/BackendUtils.h +33 -0
  115. package/simpleble/src/backends/common/CharacteristicBase.cpp +28 -0
  116. package/simpleble/src/backends/common/CharacteristicBase.h +38 -0
  117. package/simpleble/src/backends/common/DescriptorBase.cpp +7 -0
  118. package/simpleble/src/backends/common/DescriptorBase.h +19 -0
  119. package/simpleble/src/backends/common/PeripheralBase.h +82 -0
  120. package/simpleble/src/backends/common/ServiceBase.cpp +18 -0
  121. package/simpleble/src/backends/common/ServiceBase.h +28 -0
  122. package/simpleble/src/backends/dongl/AdapterBaseTypes.h +22 -0
  123. package/simpleble/src/backends/dongl/AdapterDongl.cpp +369 -0
  124. package/simpleble/src/backends/dongl/AdapterDongl.h +60 -0
  125. package/simpleble/src/backends/dongl/BackendDongl.cpp +35 -0
  126. package/simpleble/src/backends/dongl/PeripheralDongl.cpp +562 -0
  127. package/simpleble/src/backends/dongl/PeripheralDongl.h +136 -0
  128. package/simpleble/src/backends/dongl/protocol/basic.pb.c +33 -0
  129. package/simpleble/src/backends/dongl/protocol/basic.pb.h +172 -0
  130. package/simpleble/src/backends/dongl/protocol/d2h.pb.c +18 -0
  131. package/simpleble/src/backends/dongl/protocol/d2h.pb.h +118 -0
  132. package/simpleble/src/backends/dongl/protocol/h2d.pb.c +12 -0
  133. package/simpleble/src/backends/dongl/protocol/h2d.pb.h +69 -0
  134. package/simpleble/src/backends/dongl/protocol/simpleble.pb.c +123 -0
  135. package/simpleble/src/backends/dongl/protocol/simpleble.pb.h +908 -0
  136. package/simpleble/src/backends/dongl/protocol/softdevice.pb.c +18 -0
  137. package/simpleble/src/backends/dongl/protocol/softdevice.pb.h +815 -0
  138. package/simpleble/src/backends/dongl/protocol/softdevice_gap.pb.c +339 -0
  139. package/simpleble/src/backends/dongl/protocol/softdevice_gap.pb.h +2086 -0
  140. package/simpleble/src/backends/dongl/protocol/softdevice_gattc.pb.c +114 -0
  141. package/simpleble/src/backends/dongl/protocol/softdevice_gattc.pb.h +772 -0
  142. package/simpleble/src/backends/dongl/protocol/softdevice_gatts.pb.c +117 -0
  143. package/simpleble/src/backends/dongl/protocol/softdevice_gatts.pb.h +766 -0
  144. package/simpleble/src/backends/dongl/protocol/softdevice_types.pb.c +207 -0
  145. package/simpleble/src/backends/dongl/protocol/softdevice_types.pb.h +1686 -0
  146. package/simpleble/src/backends/dongl/serial/Protocol.cpp +887 -0
  147. package/simpleble/src/backends/dongl/serial/Protocol.h +117 -0
  148. package/simpleble/src/backends/dongl/serial/ProtocolBase.cpp +95 -0
  149. package/simpleble/src/backends/dongl/serial/ProtocolBase.h +54 -0
  150. package/simpleble/src/backends/dongl/serial/Wire.cpp +133 -0
  151. package/simpleble/src/backends/dongl/serial/Wire.h +116 -0
  152. package/simpleble/src/backends/dongl/usb/UsbHelper.cpp +53 -0
  153. package/simpleble/src/backends/dongl/usb/UsbHelper.h +32 -0
  154. package/simpleble/src/backends/dongl/usb/UsbHelperApple.cpp +266 -0
  155. package/simpleble/src/backends/dongl/usb/UsbHelperApple.h +34 -0
  156. package/simpleble/src/backends/dongl/usb/UsbHelperImpl.h +29 -0
  157. package/simpleble/src/backends/dongl/usb/UsbHelperLinux.cpp +21 -0
  158. package/simpleble/src/backends/dongl/usb/UsbHelperLinux.h +22 -0
  159. package/simpleble/src/backends/dongl/usb/UsbHelperNull.cpp +21 -0
  160. package/simpleble/src/backends/dongl/usb/UsbHelperNull.h +22 -0
  161. package/simpleble/src/backends/dongl/usb/UsbHelperWindows.cpp +21 -0
  162. package/simpleble/src/backends/dongl/usb/UsbHelperWindows.h +22 -0
  163. package/simpleble/src/backends/linux/AdapterLinux.cpp +102 -0
  164. package/simpleble/src/backends/linux/AdapterLinux.h +55 -0
  165. package/simpleble/src/backends/linux/BackendBluez.cpp +90 -0
  166. package/simpleble/src/backends/linux/PeripheralLinux.cpp +394 -0
  167. package/simpleble/src/backends/linux/PeripheralLinux.h +90 -0
  168. package/simpleble/src/backends/linux_legacy/AdapterLinuxLegacy.cpp +102 -0
  169. package/simpleble/src/backends/linux_legacy/AdapterLinuxLegacy.h +55 -0
  170. package/simpleble/src/backends/linux_legacy/BackendBluezLegacy.cpp +87 -0
  171. package/simpleble/src/backends/linux_legacy/PeripheralLinuxLegacy.cpp +376 -0
  172. package/simpleble/src/backends/linux_legacy/PeripheralLinuxLegacy.h +90 -0
  173. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Adapter.h +46 -0
  174. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Agent.h +52 -0
  175. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Bluez.h +37 -0
  176. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/BluezOrg.h +22 -0
  177. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/BluezOrgBluez.h +26 -0
  178. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/BluezRoot.h +32 -0
  179. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Characteristic.h +47 -0
  180. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Descriptor.h +33 -0
  181. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Device.h +64 -0
  182. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Exceptions.h +43 -0
  183. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Service.h +27 -0
  184. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/Types.h +9 -0
  185. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/interfaces/Adapter1.h +49 -0
  186. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/interfaces/Agent1.h +100 -0
  187. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/interfaces/AgentManager1.h +24 -0
  188. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/interfaces/Battery1.h +32 -0
  189. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/interfaces/Device1.h +62 -0
  190. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/interfaces/GattCharacteristic1.h +48 -0
  191. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/interfaces/GattDescriptor1.h +41 -0
  192. package/simpleble/src/backends/linux_legacy/include/simplebluezlegacy/interfaces/GattService1.h +28 -0
  193. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/advanced/Interface.h +67 -0
  194. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/advanced/InterfaceRegistry.h +62 -0
  195. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/advanced/Proxy.h +117 -0
  196. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/base/Connection.h +50 -0
  197. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/base/Exceptions.h +56 -0
  198. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/base/Holder.h +147 -0
  199. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/base/Logging.h +57 -0
  200. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/base/Message.h +89 -0
  201. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/base/Path.h +24 -0
  202. package/simpleble/src/backends/linux_legacy/include/simpledbuslegacy/interfaces/ObjectManager.h +26 -0
  203. package/simpleble/src/backends/linux_legacy/src/Adapter.cpp +78 -0
  204. package/simpleble/src/backends/linux_legacy/src/Agent.cpp +72 -0
  205. package/simpleble/src/backends/linux_legacy/src/Bluez.cpp +45 -0
  206. package/simpleble/src/backends/linux_legacy/src/BluezOrg.cpp +20 -0
  207. package/simpleble/src/backends/linux_legacy/src/BluezOrgBluez.cpp +23 -0
  208. package/simpleble/src/backends/linux_legacy/src/BluezRoot.cpp +44 -0
  209. package/simpleble/src/backends/linux_legacy/src/Characteristic.cpp +64 -0
  210. package/simpleble/src/backends/linux_legacy/src/Descriptor.cpp +27 -0
  211. package/simpleble/src/backends/linux_legacy/src/Device.cpp +104 -0
  212. package/simpleble/src/backends/linux_legacy/src/Exceptions.cpp +29 -0
  213. package/simpleble/src/backends/linux_legacy/src/Service.cpp +33 -0
  214. package/simpleble/src/backends/linux_legacy/src/advanced/Interface.cpp +155 -0
  215. package/simpleble/src/backends/linux_legacy/src/advanced/Proxy.cpp +374 -0
  216. package/simpleble/src/backends/linux_legacy/src/base/Connection.cpp +219 -0
  217. package/simpleble/src/backends/linux_legacy/src/base/Exceptions.cpp +39 -0
  218. package/simpleble/src/backends/linux_legacy/src/base/Holder.cpp +739 -0
  219. package/simpleble/src/backends/linux_legacy/src/base/Message.cpp +622 -0
  220. package/simpleble/src/backends/linux_legacy/src/base/Path.cpp +129 -0
  221. package/simpleble/src/backends/linux_legacy/src/interfaces/Adapter1.cpp +123 -0
  222. package/simpleble/src/backends/linux_legacy/src/interfaces/Agent1.cpp +143 -0
  223. package/simpleble/src/backends/linux_legacy/src/interfaces/AgentManager1.cpp +34 -0
  224. package/simpleble/src/backends/linux_legacy/src/interfaces/Battery1.cpp +30 -0
  225. package/simpleble/src/backends/linux_legacy/src/interfaces/Device1.cpp +170 -0
  226. package/simpleble/src/backends/linux_legacy/src/interfaces/GattCharacteristic1.cpp +118 -0
  227. package/simpleble/src/backends/linux_legacy/src/interfaces/GattDescriptor1.cpp +78 -0
  228. package/simpleble/src/backends/linux_legacy/src/interfaces/GattService1.cpp +28 -0
  229. package/simpleble/src/backends/linux_legacy/src/interfaces/ObjectManager.cpp +58 -0
  230. package/simpleble/src/backends/macos/AdapterBaseMacOS.h +29 -0
  231. package/simpleble/src/backends/macos/AdapterBaseMacOS.mm +235 -0
  232. package/simpleble/src/backends/macos/AdapterMac.h +78 -0
  233. package/simpleble/src/backends/macos/AdapterMac.mm +156 -0
  234. package/simpleble/src/backends/macos/BackendCoreBluetooth.mm +45 -0
  235. package/simpleble/src/backends/macos/PeripheralBaseMacOS.h +49 -0
  236. package/simpleble/src/backends/macos/PeripheralBaseMacOS.mm +714 -0
  237. package/simpleble/src/backends/macos/PeripheralMac.h +81 -0
  238. package/simpleble/src/backends/macos/PeripheralMac.mm +229 -0
  239. package/simpleble/src/backends/macos/Utils.h +9 -0
  240. package/simpleble/src/backends/macos/Utils.mm +23 -0
  241. package/simpleble/src/backends/plain/AdapterPlain.cpp +65 -0
  242. package/simpleble/src/backends/plain/AdapterPlain.h +49 -0
  243. package/simpleble/src/backends/plain/BackendPlain.cpp +30 -0
  244. package/simpleble/src/backends/plain/PeripheralPlain.cpp +159 -0
  245. package/simpleble/src/backends/plain/PeripheralPlain.h +72 -0
  246. package/simpleble/src/backends/windows/AdapterWindows.cpp +338 -0
  247. package/simpleble/src/backends/windows/AdapterWindows.h +89 -0
  248. package/simpleble/src/backends/windows/BackendWinRT.cpp +67 -0
  249. package/simpleble/src/backends/windows/BackendWinRT.h +18 -0
  250. package/simpleble/src/backends/windows/MtaManager.cpp +49 -0
  251. package/simpleble/src/backends/windows/MtaManager.h +90 -0
  252. package/simpleble/src/backends/windows/PeripheralWindows.cpp +487 -0
  253. package/simpleble/src/backends/windows/PeripheralWindows.h +129 -0
  254. package/simpleble/src/backends/windows/Utils.cpp +146 -0
  255. package/simpleble/src/backends/windows/Utils.h +47 -0
  256. package/simpleble/src/builders/BuildVec.h +32 -0
  257. package/simpleble/src/builders/BuilderBase.h +87 -0
  258. package/simpleble/src/external/TaskRunner.hpp +99 -0
  259. package/simpleble/src/external/ThreadRunner.h +52 -0
  260. package/simpleble/src/external/kvn_safe_callback.hpp +66 -0
  261. package/simpleble/src/external/kvn_safe_map.hpp +94 -0
  262. package/simpleble/src/external/kvn_threadrunner.hpp +70 -0
  263. package/simpleble/src/external/logfwd.hpp +35 -0
  264. package/simpleble/src/frontends/base/Adapter.cpp +111 -0
  265. package/simpleble/src/frontends/base/Advanced.cpp +34 -0
  266. package/simpleble/src/frontends/base/Backend.cpp +95 -0
  267. package/simpleble/src/frontends/base/Backend.h +76 -0
  268. package/simpleble/src/frontends/base/Characteristic.cpp +56 -0
  269. package/simpleble/src/frontends/base/Descriptor.cpp +21 -0
  270. package/simpleble/src/frontends/base/Peripheral.cpp +113 -0
  271. package/simpleble/src/frontends/base/Service.cpp +26 -0
  272. package/simpleble/src/frontends/safe/AdapterSafe.cpp +158 -0
  273. package/simpleble/src/frontends/safe/PeripheralSafe.cpp +219 -0
@@ -0,0 +1,89 @@
1
+ #pragma once
2
+
3
+ #include <dbus/dbus.h>
4
+ #include <atomic>
5
+ #include <string>
6
+ #include <vector>
7
+ #include "Holder.h"
8
+
9
+ namespace SimpleDBusLegacy {
10
+
11
+ class Message {
12
+ public:
13
+ enum class Type {
14
+ INVALID = DBUS_MESSAGE_TYPE_INVALID,
15
+ METHOD_CALL = DBUS_MESSAGE_TYPE_METHOD_CALL,
16
+ METHOD_RETURN = DBUS_MESSAGE_TYPE_METHOD_RETURN,
17
+ ERROR = DBUS_MESSAGE_TYPE_ERROR,
18
+ SIGNAL = DBUS_MESSAGE_TYPE_SIGNAL,
19
+ };
20
+
21
+ static constexpr int INVALID_UNIQUE_ID = -1;
22
+
23
+ Message();
24
+ Message(Message&& other) noexcept;
25
+ Message(const Message& other);
26
+ Message& operator=(Message&& other) noexcept;
27
+ Message& operator=(const Message& other);
28
+ ~Message();
29
+
30
+ operator DBusMessage*() const;
31
+
32
+ bool is_valid() const;
33
+ void append_argument(const Holder& argument, const std::string& signature);
34
+ Holder extract();
35
+ void extract_reset();
36
+ bool extract_has_next();
37
+ void extract_next();
38
+ std::string to_string(bool append_arguments = false) const;
39
+
40
+ uint32_t get_ref_count() const;
41
+ int32_t get_unique_id() const;
42
+ uint32_t get_serial() const;
43
+ std::string get_signature();
44
+ std::string get_interface() const;
45
+ std::string get_path() const;
46
+ std::string get_member() const;
47
+ Type get_type() const;
48
+
49
+ bool is_signal(const std::string& interface, const std::string& signal_name) const;
50
+ bool is_method_call(const std::string& interface, const std::string& method) const;
51
+
52
+ static Message from_retained(DBusMessage* msg);
53
+ static Message from_acquired(DBusMessage* msg);
54
+ static Message create_method_call(const std::string& bus_name, const std::string& path,
55
+ const std::string& interface, const std::string& method);
56
+ static Message create_method_return(const Message& msg);
57
+ static Message create_error(const Message& msg, const std::string& error_name, const std::string& error_message);
58
+ static Message create_signal(const std::string& path, const std::string& interface, const std::string& signal);
59
+
60
+ private:
61
+ static std::atomic_int32_t _creation_counter;
62
+
63
+ int _indent = 0;
64
+ int32_t _unique_id = INVALID_UNIQUE_ID;
65
+ DBusMessageIter _iter;
66
+ bool _iter_initialized = false;
67
+ bool _is_extracted = false;
68
+ Holder _extracted;
69
+ DBusMessage* _msg = nullptr;
70
+ std::vector<Holder> _arguments;
71
+
72
+ Holder _extract_bytearray(DBusMessageIter* iter);
73
+ Holder _extract_array(DBusMessageIter* iter);
74
+ Holder _extract_dict(DBusMessageIter* iter);
75
+ Holder _extract_generic(DBusMessageIter* iter);
76
+
77
+ /**
78
+ * @brief Append argument to the DBus message iterator.
79
+ * @param iter DBus message iterator.
80
+ * @param argument Argument to append.
81
+ * @param signature Signature of the argument.
82
+ */
83
+ void _append_argument(DBusMessageIter* iter, const Holder& argument, const std::string& signature);
84
+
85
+ void _invalidate();
86
+ void _safe_delete();
87
+ };
88
+
89
+ } // namespace SimpleDBusLegacy
@@ -0,0 +1,24 @@
1
+ #pragma once
2
+
3
+ #include <string>
4
+ #include <vector>
5
+
6
+ namespace SimpleDBusLegacy {
7
+
8
+ class Path {
9
+ public:
10
+ static size_t count_elements(const std::string& path);
11
+ static std::string fetch_elements(const std::string& path, size_t count);
12
+ static std::vector<std::string> split_elements(const std::string& path);
13
+
14
+ static bool is_descendant(const std::string& base, const std::string& path);
15
+ static bool is_ascendant(const std::string& base, const std::string& path);
16
+
17
+ static bool is_child(const std::string& base, const std::string& path);
18
+ static bool is_parent(const std::string& base, const std::string& path);
19
+
20
+ static std::string next_child(const std::string& base, const std::string& path);
21
+ static std::string next_child_strip(const std::string& base, const std::string& path);
22
+ };
23
+
24
+ } // namespace SimpleDBusLegacy
@@ -0,0 +1,26 @@
1
+ #pragma once
2
+
3
+ #include <simpledbuslegacy/advanced/Interface.h>
4
+ #include <simpledbuslegacy/advanced/InterfaceRegistry.h>
5
+
6
+ #include <functional>
7
+
8
+ namespace SimpleDBusLegacy {
9
+
10
+ class ObjectManager : public Interface {
11
+ public:
12
+ ObjectManager(std::shared_ptr<Connection> conn, std::string bus_name, std::string path);
13
+ virtual ~ObjectManager() = default;
14
+
15
+ // Names are made matching the ones from the DBus specification
16
+ Holder GetManagedObjects(bool use_callbacks = false);
17
+ std::function<void(std::string path, Holder options)> InterfacesAdded;
18
+ std::function<void(std::string path, Holder options)> InterfacesRemoved;
19
+
20
+ void message_handle(Message& msg) override;
21
+
22
+ private:
23
+ static const SimpleDBusLegacy::AutoRegisterInterface<ObjectManager> registry;
24
+ };
25
+
26
+ } // namespace SimpleDBusLegacy
@@ -0,0 +1,78 @@
1
+ #include <simplebluezlegacy/Adapter.h>
2
+ #include <simplebluezlegacy/Device.h>
3
+
4
+ #include <simplebluezlegacy/interfaces/Adapter1.h>
5
+
6
+ using namespace SimpleBluezLegacy;
7
+
8
+ Adapter::Adapter(std::shared_ptr<SimpleDBusLegacy::Connection> conn, const std::string& bus_name, const std::string& path)
9
+ : Proxy(conn, bus_name, path) {}
10
+
11
+ Adapter::~Adapter() {}
12
+
13
+ std::shared_ptr<SimpleDBusLegacy::Proxy> Adapter::path_create(const std::string& path) {
14
+ auto child = std::make_shared<Device>(_conn, _bus_name, path);
15
+ child->on_signal_received.load([this, child]() { _on_device_updated(child); });
16
+ return std::static_pointer_cast<SimpleDBusLegacy::Proxy>(child);
17
+ }
18
+
19
+ std::shared_ptr<Adapter1> Adapter::adapter1() {
20
+ return std::dynamic_pointer_cast<Adapter1>(interface_get("org.bluez.Adapter1"));
21
+ }
22
+
23
+ std::string Adapter::identifier() const {
24
+ std::size_t start = _path.find_last_of("/");
25
+ return _path.substr(start + 1);
26
+ }
27
+
28
+ std::string Adapter::address() { return adapter1()->Address(); }
29
+
30
+ bool Adapter::discovering() { return adapter1()->Discovering(); }
31
+
32
+ bool Adapter::powered() { return adapter1()->Powered(); }
33
+
34
+ void Adapter::discovery_filter(const DiscoveryFilter& filter) { adapter1()->SetDiscoveryFilter(filter); }
35
+
36
+ void Adapter::discovery_start() { adapter1()->StartDiscovery(); }
37
+
38
+ void Adapter::discovery_stop() { adapter1()->StopDiscovery(); }
39
+
40
+ std::shared_ptr<Device> Adapter::device_get(const std::string& path) {
41
+ return std::dynamic_pointer_cast<Device>(path_get(path));
42
+ }
43
+
44
+ void Adapter::device_remove(const std::string& path) { adapter1()->RemoveDevice(path); }
45
+
46
+ void Adapter::device_remove(const std::shared_ptr<Device>& device) { adapter1()->RemoveDevice(device->path()); }
47
+
48
+ std::vector<std::shared_ptr<Device>> Adapter::device_paired_get() {
49
+ // Traverse all child paths and return only those that are paired.
50
+ std::vector<std::shared_ptr<Device>> paired_devices;
51
+
52
+ for (auto& [path, child] : _children) {
53
+ if (!child->valid()) continue;
54
+
55
+ std::shared_ptr<Device> device = std::dynamic_pointer_cast<Device>(child);
56
+ if (device->paired()) {
57
+ paired_devices.push_back(device);
58
+ }
59
+ }
60
+
61
+ return paired_devices;
62
+ }
63
+
64
+ void Adapter::set_on_device_updated(std::function<void(std::shared_ptr<Device> device)> callback) {
65
+ _on_device_updated.load(callback);
66
+
67
+ on_child_created.load([this, callback](std::string child_path) {
68
+ auto device = device_get(child_path);
69
+ if (device) {
70
+ _on_device_updated(device);
71
+ }
72
+ });
73
+ }
74
+
75
+ void Adapter::clear_on_device_updated() {
76
+ _on_device_updated.unload();
77
+ on_child_created.unload();
78
+ }
@@ -0,0 +1,72 @@
1
+ #include <simplebluezlegacy/Agent.h>
2
+
3
+ #include <iostream>
4
+
5
+ using namespace SimpleBluezLegacy;
6
+
7
+ Agent::Agent(std::shared_ptr<SimpleDBusLegacy::Connection> conn, const std::string& bus_name, const std::string& path)
8
+ : Proxy(conn, bus_name, path) {
9
+ _interfaces.emplace(std::make_pair(
10
+ "org.bluez.Agent1", std::static_pointer_cast<SimpleDBusLegacy::Interface>(std::make_shared<Agent1>(_conn, _path))));
11
+ }
12
+
13
+ std::string Agent::capabilities() const {
14
+ switch (_capabilities) {
15
+ case DisplayOnly:
16
+ return "DisplayOnly";
17
+ case DisplayYesNo:
18
+ return "DisplayYesNo";
19
+ case KeyboardOnly:
20
+ return "KeyboardOnly";
21
+ case NoInputNoOutput:
22
+ return "NoInputNoOutput";
23
+ case KeyboardDisplay:
24
+ return "KeyboardDisplay";
25
+ default:
26
+ return "";
27
+ }
28
+ }
29
+
30
+ void Agent::set_capabilities(Agent::Capabilities capabilities) { _capabilities = capabilities; }
31
+
32
+ void Agent::set_on_request_pin_code(std::function<std::string()> callback) {
33
+ agent1()->OnRequestPinCode.load(callback);
34
+ }
35
+
36
+ void Agent::clear_on_request_pin_code() { agent1()->OnRequestPinCode.unload(); }
37
+
38
+ void Agent::set_on_display_pin_code(std::function<bool(const std::string&)> callback) {
39
+ agent1()->OnDisplayPinCode.load(callback);
40
+ }
41
+
42
+ void Agent::clear_on_display_pin_code() { agent1()->OnDisplayPinCode.unload(); }
43
+
44
+ void Agent::set_on_request_passkey(std::function<uint32_t()> callback) { agent1()->OnRequestPasskey.load(callback); }
45
+
46
+ void Agent::clear_on_request_passkey() { agent1()->OnRequestPasskey.unload(); }
47
+
48
+ void Agent::set_on_display_passkey(std::function<void(uint32_t, uint16_t)> callback) {
49
+ agent1()->OnDisplayPasskey.load(callback);
50
+ }
51
+
52
+ void Agent::clear_on_display_passkey() { agent1()->OnDisplayPasskey.unload(); }
53
+
54
+ void Agent::set_on_request_confirmation(std::function<bool(uint32_t)> callback) {
55
+ agent1()->OnRequestConfirmation.load(callback);
56
+ }
57
+
58
+ void Agent::clear_on_request_confirmation() { agent1()->OnRequestConfirmation.unload(); }
59
+
60
+ void Agent::set_on_request_authorization(std::function<bool()> callback) {
61
+ agent1()->OnRequestAuthorization.load(callback);
62
+ }
63
+
64
+ void Agent::clear_on_request_authorization() { agent1()->OnRequestAuthorization.unload(); }
65
+
66
+ void Agent::set_on_authorize_service(std::function<bool(const std::string&)> callback) {
67
+ agent1()->OnAuthorizeService.load(callback);
68
+ }
69
+
70
+ void Agent::clear_on_authorize_service() { agent1()->OnAuthorizeService.unload(); }
71
+
72
+ std::shared_ptr<Agent1> Agent::agent1() { return std::dynamic_pointer_cast<Agent1>(interface_get("org.bluez.Agent1")); }
@@ -0,0 +1,45 @@
1
+ #include <simplebluezlegacy/Bluez.h>
2
+ #include <simpledbuslegacy/interfaces/ObjectManager.h>
3
+
4
+ using namespace SimpleBluezLegacy;
5
+
6
+ #ifdef SIMPLEBLUEZ_USE_SESSION_DBUS
7
+ #define DBUS_BUS DBUS_BUS_SESSION
8
+ #else
9
+ #define DBUS_BUS DBUS_BUS_SYSTEM
10
+ #endif
11
+
12
+ Bluez::Bluez() : _conn(std::make_shared<SimpleDBusLegacy::Connection>(DBUS_BUS)) {}
13
+
14
+ Bluez::~Bluez() {
15
+ if (_conn->is_initialized()) {
16
+ _conn->remove_match("type='signal',sender='org.bluez'");
17
+ }
18
+ }
19
+
20
+ void Bluez::init() {
21
+ _conn->init();
22
+ _conn->add_match("type='signal',sender='org.bluez'");
23
+
24
+ _bluez_root = std::make_shared<BluezRoot>(_conn, "org.bluez", "/");
25
+ _bluez_root->load_managed_objects();
26
+ }
27
+
28
+ void Bluez::run_async() {
29
+ // TODO: UNCOMMENT THIS WHEN MIGRATING TO NEW PROXY FORWARDING LOGIC
30
+ //_conn->read_write_dispatch();
31
+
32
+ // BELOW IS THE LEGACY LOGIC
33
+ _conn->read_write();
34
+ SimpleDBusLegacy::Message message = _conn->pop_message();
35
+ while (message.is_valid()) {
36
+ _bluez_root->message_forward(message);
37
+ message = _conn->pop_message();
38
+ }
39
+ }
40
+
41
+ std::vector<std::shared_ptr<Adapter>> Bluez::get_adapters() { return _bluez_root->get_adapters(); }
42
+
43
+ std::shared_ptr<Agent> Bluez::get_agent() { return _bluez_root->get_agent(); }
44
+
45
+ void Bluez::register_agent() { _bluez_root->register_agent(); }
@@ -0,0 +1,20 @@
1
+ #include <simplebluezlegacy/BluezOrg.h>
2
+ #include <simplebluezlegacy/BluezOrgBluez.h>
3
+
4
+ using namespace SimpleBluezLegacy;
5
+
6
+ BluezOrg::BluezOrg(std::shared_ptr<SimpleDBusLegacy::Connection> conn, const std::string& bus_name, const std::string& path)
7
+ : Proxy(conn, bus_name, path) {}
8
+
9
+ std::vector<std::shared_ptr<Adapter>> BluezOrg::get_adapters() {
10
+ return std::dynamic_pointer_cast<BluezOrgBluez>(path_get("/org/bluez"))->get_adapters();
11
+ }
12
+
13
+ void BluezOrg::register_agent(std::shared_ptr<Agent> agent) {
14
+ std::dynamic_pointer_cast<BluezOrgBluez>(path_get("/org/bluez"))->register_agent(agent);
15
+ }
16
+
17
+ std::shared_ptr<SimpleDBusLegacy::Proxy> BluezOrg::path_create(const std::string& path) {
18
+ auto child = std::make_shared<BluezOrgBluez>(_conn, _bus_name, path);
19
+ return std::static_pointer_cast<SimpleDBusLegacy::Proxy>(child);
20
+ }
@@ -0,0 +1,23 @@
1
+ #include <simplebluezlegacy/Adapter.h>
2
+ #include <simplebluezlegacy/BluezOrgBluez.h>
3
+
4
+ using namespace SimpleBluezLegacy;
5
+
6
+ BluezOrgBluez::BluezOrgBluez(std::shared_ptr<SimpleDBusLegacy::Connection> conn, const std::string& bus_name,
7
+ const std::string& path)
8
+ : Proxy(conn, bus_name, path) {}
9
+
10
+ std::shared_ptr<SimpleDBusLegacy::Proxy> BluezOrgBluez::path_create(const std::string& path) {
11
+ auto child = std::make_shared<Adapter>(_conn, _bus_name, path);
12
+ return std::static_pointer_cast<SimpleDBusLegacy::Proxy>(child);
13
+ }
14
+
15
+ std::shared_ptr<AgentManager1> BluezOrgBluez::agentmanager1() {
16
+ return std::dynamic_pointer_cast<AgentManager1>(interface_get("org.bluez.AgentManager1"));
17
+ }
18
+
19
+ void BluezOrgBluez::register_agent(std::shared_ptr<Agent> agent) {
20
+ agentmanager1()->RegisterAgent(agent->path(), agent->capabilities());
21
+ }
22
+
23
+ std::vector<std::shared_ptr<Adapter>> BluezOrgBluez::get_adapters() { return children_casted<Adapter>(); }
@@ -0,0 +1,44 @@
1
+ #include <simplebluezlegacy/BluezRoot.h>
2
+ #include <simplebluezlegacy/BluezOrg.h>
3
+ #include <simpledbuslegacy/interfaces/ObjectManager.h>
4
+
5
+ using namespace SimpleBluezLegacy;
6
+
7
+ BluezRoot::BluezRoot(std::shared_ptr<SimpleDBusLegacy::Connection> conn, const std::string& bus_name, const std::string& path)
8
+ : Proxy(conn, bus_name, path) {
9
+
10
+ _interfaces.emplace(std::make_pair("org.freedesktop.DBus.ObjectManager", std::make_shared<SimpleDBusLegacy::ObjectManager>(conn, _bus_name, _path)));
11
+
12
+ object_manager()->InterfacesAdded = [&](std::string path, SimpleDBusLegacy::Holder options) { path_add(path, options); };
13
+ object_manager()->InterfacesRemoved = [&](std::string path, SimpleDBusLegacy::Holder options) {
14
+ path_remove(path, options);
15
+ };
16
+
17
+ // Create the agent that will handle pairing.
18
+ _agent = std::make_shared<Agent>(_conn, "org.bluez", "/agent");
19
+ path_append_child("/agent", std::static_pointer_cast<SimpleDBusLegacy::Proxy>(_agent));
20
+ }
21
+
22
+ void BluezRoot::load_managed_objects() {
23
+ SimpleDBusLegacy::Holder managed_objects = object_manager()->GetManagedObjects();
24
+ for (auto& [path, managed_interfaces] : managed_objects.get_dict_object_path()) {
25
+ path_add(path, managed_interfaces);
26
+ }
27
+ }
28
+
29
+ std::vector<std::shared_ptr<Adapter>> BluezRoot::get_adapters() {
30
+ return std::dynamic_pointer_cast<BluezOrg>(path_get("/org"))->get_adapters();
31
+ }
32
+
33
+ std::shared_ptr<Agent> BluezRoot::get_agent() { return std::dynamic_pointer_cast<Agent>(path_get("/agent")); }
34
+
35
+ void BluezRoot::register_agent() { std::dynamic_pointer_cast<BluezOrg>(path_get("/org"))->register_agent(_agent); }
36
+
37
+ std::shared_ptr<SimpleDBusLegacy::Proxy> BluezRoot::path_create(const std::string& path) {
38
+ auto child = std::make_shared<BluezOrg>(_conn, _bus_name, path);
39
+ return std::static_pointer_cast<SimpleDBusLegacy::Proxy>(child);
40
+ }
41
+
42
+ std::shared_ptr<SimpleDBusLegacy::ObjectManager> BluezRoot::object_manager() {
43
+ return std::dynamic_pointer_cast<SimpleDBusLegacy::ObjectManager>(interface_get("org.freedesktop.DBus.ObjectManager"));
44
+ }
@@ -0,0 +1,64 @@
1
+ #include <simplebluezlegacy/Characteristic.h>
2
+ #include <simplebluezlegacy/Descriptor.h>
3
+ #include <simplebluezlegacy/Exceptions.h>
4
+
5
+ using namespace SimpleBluezLegacy;
6
+
7
+ Characteristic::Characteristic(std::shared_ptr<SimpleDBusLegacy::Connection> conn, const std::string& bus_name,
8
+ const std::string& path)
9
+ : Proxy(conn, bus_name, path) {}
10
+
11
+ Characteristic::~Characteristic() {}
12
+
13
+ std::shared_ptr<SimpleDBusLegacy::Proxy> Characteristic::path_create(const std::string& path) {
14
+ auto child = std::make_shared<Descriptor>(_conn, _bus_name, path);
15
+ return std::static_pointer_cast<SimpleDBusLegacy::Proxy>(child);
16
+ }
17
+
18
+ std::vector<std::shared_ptr<Descriptor>> Characteristic::descriptors() { return children_casted<Descriptor>(); }
19
+
20
+ std::shared_ptr<GattCharacteristic1> Characteristic::gattcharacteristic1() {
21
+ return std::dynamic_pointer_cast<GattCharacteristic1>(interface_get("org.bluez.GattCharacteristic1"));
22
+ }
23
+
24
+ bool Characteristic::notifying() { return gattcharacteristic1()->Notifying(); }
25
+
26
+ std::string Characteristic::uuid() { return gattcharacteristic1()->UUID(); }
27
+
28
+ ByteArray Characteristic::value() { return gattcharacteristic1()->Value(); }
29
+
30
+ std::vector<std::string> Characteristic::flags() { return gattcharacteristic1()->Flags(); }
31
+
32
+ uint16_t Characteristic::mtu() { return gattcharacteristic1()->MTU(); }
33
+
34
+ ByteArray Characteristic::read() { return gattcharacteristic1()->ReadValue(); }
35
+
36
+ void Characteristic::write_request(ByteArray value) {
37
+ gattcharacteristic1()->WriteValue(value, GattCharacteristic1::WriteType::REQUEST);
38
+ }
39
+
40
+ void Characteristic::write_command(ByteArray value) {
41
+ gattcharacteristic1()->WriteValue(value, GattCharacteristic1::WriteType::COMMAND);
42
+ }
43
+
44
+ void Characteristic::start_notify() { gattcharacteristic1()->StartNotify(); }
45
+
46
+ void Characteristic::stop_notify() { gattcharacteristic1()->StopNotify(); }
47
+
48
+ std::shared_ptr<Descriptor> Characteristic::get_descriptor(const std::string& uuid) {
49
+ auto descriptors_all = descriptors();
50
+
51
+ for (auto& descriptor : descriptors_all) {
52
+ if (descriptor->uuid() == uuid) {
53
+ return descriptor;
54
+ }
55
+ }
56
+
57
+ throw Exception::DescriptorNotFoundException(uuid);
58
+ }
59
+
60
+ void Characteristic::set_on_value_changed(std::function<void(ByteArray new_value)> callback) {
61
+ gattcharacteristic1()->OnValueChanged.load([this, callback]() { callback(gattcharacteristic1()->Value()); });
62
+ }
63
+
64
+ void Characteristic::clear_on_value_changed() { gattcharacteristic1()->OnValueChanged.unload(); }
@@ -0,0 +1,27 @@
1
+ #include <simplebluezlegacy/Descriptor.h>
2
+
3
+ using namespace SimpleBluezLegacy;
4
+
5
+ Descriptor::Descriptor(std::shared_ptr<SimpleDBusLegacy::Connection> conn, const std::string& bus_name,
6
+ const std::string& path)
7
+ : Proxy(conn, bus_name, path) {}
8
+
9
+ Descriptor::~Descriptor() {}
10
+
11
+ std::shared_ptr<GattDescriptor1> Descriptor::gattdescriptor1() {
12
+ return std::dynamic_pointer_cast<GattDescriptor1>(interface_get("org.bluez.GattDescriptor1"));
13
+ }
14
+
15
+ std::string Descriptor::uuid() { return gattdescriptor1()->UUID(); }
16
+
17
+ ByteArray Descriptor::value() { return gattdescriptor1()->Value(); }
18
+
19
+ ByteArray Descriptor::read() { return gattdescriptor1()->ReadValue(); }
20
+
21
+ void Descriptor::write(ByteArray value) { gattdescriptor1()->WriteValue(value); }
22
+
23
+ void Descriptor::set_on_value_changed(std::function<void(ByteArray new_value)> callback) {
24
+ gattdescriptor1()->OnValueChanged.load([this, callback]() { callback(gattdescriptor1()->Value()); });
25
+ }
26
+
27
+ void Descriptor::clear_on_value_changed() { gattdescriptor1()->OnValueChanged.unload(); }
@@ -0,0 +1,104 @@
1
+ #include <simplebluezlegacy/Device.h>
2
+ #include <simplebluezlegacy/Exceptions.h>
3
+ #include <simplebluezlegacy/Service.h>
4
+
5
+ #include <simpledbuslegacy/base/Path.h>
6
+
7
+ using namespace SimpleBluezLegacy;
8
+
9
+ Device::Device(std::shared_ptr<SimpleDBusLegacy::Connection> conn, const std::string& bus_name, const std::string& path)
10
+ : Proxy(conn, bus_name, path) {}
11
+
12
+ Device::~Device() {}
13
+
14
+ std::shared_ptr<SimpleDBusLegacy::Proxy> Device::path_create(const std::string& path) {
15
+ const std::string next_child = SimpleDBusLegacy::Path::next_child_strip(_path, path);
16
+
17
+ if (next_child.find("service") == 0) {
18
+ auto child = std::make_shared<Service>(_conn, _bus_name, path);
19
+ return std::static_pointer_cast<SimpleDBusLegacy::Proxy>(child);
20
+ } else {
21
+ return std::make_shared<Proxy>(_conn, _bus_name, path);
22
+ }
23
+ }
24
+
25
+ std::shared_ptr<Device1> Device::device1() {
26
+ return std::dynamic_pointer_cast<Device1>(interface_get("org.bluez.Device1"));
27
+ }
28
+
29
+ std::shared_ptr<Battery1> Device::battery1() {
30
+ return std::dynamic_pointer_cast<Battery1>(interface_get("org.bluez.Battery1"));
31
+ }
32
+
33
+ std::vector<std::shared_ptr<Service>> Device::services() { return children_casted_with_prefix<Service>("service"); }
34
+
35
+ std::shared_ptr<Service> Device::get_service(const std::string& uuid) {
36
+ auto services_all = services();
37
+
38
+ for (auto& service : services_all) {
39
+ if (service->uuid() == uuid) {
40
+ return service;
41
+ }
42
+ }
43
+
44
+ throw Exception::ServiceNotFoundException(uuid);
45
+ }
46
+
47
+ std::shared_ptr<Characteristic> Device::get_characteristic(const std::string& service_uuid,
48
+ const std::string& characteristic_uuid) {
49
+ auto service = get_service(service_uuid);
50
+ return service->get_characteristic(characteristic_uuid);
51
+ }
52
+
53
+ void Device::pair() { device1()->Pair(); }
54
+
55
+ void Device::cancel_pairing() { device1()->CancelPairing(); }
56
+
57
+ void Device::connect() { device1()->Connect(); }
58
+
59
+ void Device::disconnect() { device1()->Disconnect(); }
60
+
61
+ std::string Device::address() { return device1()->Address(); }
62
+
63
+ std::string Device::address_type() { return device1()->AddressType(); }
64
+
65
+ std::string Device::name() { return device1()->Name(); }
66
+
67
+ std::string Device::alias() { return device1()->Alias(); }
68
+
69
+ int16_t Device::rssi() { return device1()->RSSI(); }
70
+
71
+ int16_t Device::tx_power() { return device1()->TxPower(); }
72
+
73
+ std::vector<std::string> Device::uuids() { return device1()->UUIDs(); }
74
+
75
+ std::map<uint16_t, ByteArray> Device::manufacturer_data() { return device1()->ManufacturerData(); }
76
+
77
+ std::map<std::string, ByteArray> Device::service_data() { return device1()->ServiceData(); }
78
+
79
+ bool Device::paired() { return device1()->Paired(); }
80
+
81
+ bool Device::connected() { return device1()->Connected(); }
82
+
83
+ bool Device::services_resolved() { return device1()->ServicesResolved(); }
84
+
85
+ void Device::set_on_disconnected(std::function<void()> callback) { device1()->OnDisconnected.load(callback); }
86
+
87
+ void Device::clear_on_disconnected() { device1()->OnDisconnected.unload(); }
88
+
89
+ void Device::set_on_services_resolved(std::function<void()> callback) { device1()->OnServicesResolved.load(callback); }
90
+
91
+ void Device::clear_on_services_resolved() { device1()->OnServicesResolved.unload(); }
92
+
93
+ bool Device::has_battery_interface() { return interface_exists("org.bluez.Battery1"); }
94
+
95
+ uint8_t Device::battery_percentage() { return battery1()->Percentage(); }
96
+
97
+ void Device::set_on_battery_percentage_changed(std::function<void(uint8_t new_value)> callback) {
98
+ battery1()->OnPercentageChanged.load([this, callback]() { callback(battery1()->Percentage()); });
99
+ // As the `property_changed` callback only occurs when the property is changed, we need to manually
100
+ // call the callback once to make sure the callback is called with the current value.
101
+ battery1()->OnPercentageChanged();
102
+ }
103
+
104
+ void Device::clear_on_battery_percentage_changed() { battery1()->OnPercentageChanged.unload(); }
@@ -0,0 +1,29 @@
1
+ #include <simplebluezlegacy/Exceptions.h>
2
+
3
+ #include <fmt/core.h>
4
+
5
+ namespace SimpleBluezLegacy {
6
+
7
+ namespace Exception {
8
+
9
+ ServiceNotFoundException::ServiceNotFoundException(const std::string& service) {
10
+ _message = fmt::format("Service {} not found.", service);
11
+ }
12
+
13
+ const char* ServiceNotFoundException::what() const noexcept { return _message.c_str(); }
14
+
15
+ CharacteristicNotFoundException::CharacteristicNotFoundException(const std::string& characteristic) {
16
+ _message = fmt::format("Characteristic {} not found.", characteristic);
17
+ }
18
+
19
+ const char* CharacteristicNotFoundException::what() const noexcept { return _message.c_str(); }
20
+
21
+ DescriptorNotFoundException::DescriptorNotFoundException(const std::string& descriptor) {
22
+ _message = fmt::format("Descriptor {} not found.", descriptor);
23
+ }
24
+
25
+ const char* DescriptorNotFoundException::what() const noexcept { return _message.c_str(); }
26
+
27
+ } // namespace Exception
28
+
29
+ } // namespace SimpleBluezLegacy