1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
//! This file has been automatically generated by `objc2`'s `header-translator`.
//! DO NOT EDIT
use core::ffi::*;
use core::ptr::NonNull;
use objc2::__framework_prelude::*;
use crate::*;
extern_protocol!(
/// [Apple's documentation](https://developer.apple.com/documentation/iobluetooth/iobluetoothdevicepairdelegate?language=objc)
pub unsafe trait IOBluetoothDevicePairDelegate: NSObjectProtocol {
/// Indicates that the pairing has started.
///
/// Parameter `sender`: The IOBluetoothDevicePair object.
///
/// # Safety
///
/// - `sender` should be of the correct type.
/// - `sender` might not allow `None`.
#[optional]
#[unsafe(method(devicePairingStarted:))]
#[unsafe(method_family = none)]
unsafe fn devicePairingStarted(&self, sender: Option<&AnyObject>);
/// Indicates to the delegate that the pairing object is making the device (baseband) connection.
///
/// Parameter `sender`: The IOBluetoothDevicePair object.
///
/// # Safety
///
/// - `sender` should be of the correct type.
/// - `sender` might not allow `None`.
#[optional]
#[unsafe(method(devicePairingConnecting:))]
#[unsafe(method_family = none)]
unsafe fn devicePairingConnecting(&self, sender: Option<&AnyObject>);
/// Indicates to the delegate that the pairing object is connected the device (baseband).
///
/// Parameter `sender`: The IOBluetoothDevicePair object.
///
/// # Safety
///
/// - `sender` should be of the correct type.
/// - `sender` might not allow `None`.
#[optional]
#[unsafe(method(devicePairingConnected:))]
#[unsafe(method_family = none)]
unsafe fn devicePairingConnected(&self, sender: Option<&AnyObject>);
/// Indicates to the delegate that the pairing object has made the device (baseband) connection and is
/// awaiting the PIN code (if specified) to be entered on the device. Thus, when you recieve this message,
/// you should display to the user that they should enter the PIN code on the device.
/// The method replyPINCode must be invoked in response and happen before the timeout period of the device.
///
/// Parameter `sender`: The IOBluetoothDevicePair object.
///
/// # Safety
///
/// - `sender` should be of the correct type.
/// - `sender` might not allow `None`.
#[optional]
#[unsafe(method(devicePairingPINCodeRequest:))]
#[unsafe(method_family = none)]
unsafe fn devicePairingPINCodeRequest(&self, sender: Option<&AnyObject>);
#[cfg(feature = "Bluetooth")]
/// Indicates to the delegate that the pairing object has made the device (baseband) connection and is
/// awaiting the a yes/no answer for the Simple Secure Pairing numeric comparison. Thus, when you recieve this message,
/// you should display to the user the numeric value and then accept the yes/no answer if it matches the value
/// on the other device.
/// The method replyUserConfirmation must be invoked in response and happen before the timeout period of the device.
///
/// Parameter `sender`: The IOBluetoothDevicePair object.
///
/// Parameter `numericValue`: Numeric value to be displayed.
///
/// # Safety
///
/// - `sender` should be of the correct type.
/// - `sender` might not allow `None`.
#[optional]
#[unsafe(method(devicePairingUserConfirmationRequest:numericValue:))]
#[unsafe(method_family = none)]
unsafe fn devicePairingUserConfirmationRequest_numericValue(
&self,
sender: Option<&AnyObject>,
numeric_value: BluetoothNumericValue,
);
#[cfg(feature = "Bluetooth")]
/// Indicates to the delegate that the pairing object has made the device (baseband) connection and is
/// awaiting the passkey (if specified) to be entered on the device for the Secure Simple Pairing.
/// Thus, when you recieve this message, you should display to the user that they should enter
/// the passkey on the device.
///
/// Parameter `sender`: The IOBluetoothDevicePair object.
///
/// Parameter `passkey`: Passkey to be displayed.
///
/// # Safety
///
/// - `sender` should be of the correct type.
/// - `sender` might not allow `None`.
#[optional]
#[unsafe(method(devicePairingUserPasskeyNotification:passkey:))]
#[unsafe(method_family = none)]
unsafe fn devicePairingUserPasskeyNotification_passkey(
&self,
sender: Option<&AnyObject>,
passkey: BluetoothPasskey,
);
/// Indicates to the delegate that the pairing object has fully completed the process. Can tell the delegate
/// when and error occurred during the attempt to pair with the device.
///
/// The error passed to your delegate could be kBluetoothHCIErrorAuthenticationFailure,
/// kBluetoothHCIErrorLMPResponseTimeout, etc. See Bluetooth.h for all the possibilities.
///
/// Parameter `sender`: The IOBluetoothDevicePair object.
///
/// Parameter `error`: An IOReturn or Bluetooth error code.
///
/// # Safety
///
/// - `sender` should be of the correct type.
/// - `sender` might not allow `None`.
#[optional]
#[unsafe(method(devicePairingFinished:error:))]
#[unsafe(method_family = none)]
unsafe fn devicePairingFinished_error(&self, sender: Option<&AnyObject>, error: IOReturn);
#[cfg(feature = "Bluetooth")]
/// Indicates to the delegate that the pairing object has fully completed the simple pairing process. Can tell the delegate
/// when and error occurred during the attempt to pair with the device.
///
/// The status passed to your delegate could be BluetoothHCIEventStatus, etc. See Bluetooth.h for all the possibilities.
///
/// Parameter `sender`: The IOBluetoothDevicePair object.
///
/// Parameter `status`: A simple pairing complete error code.
///
/// # Safety
///
/// - `sender` should be of the correct type.
/// - `sender` might not allow `None`.
#[optional]
#[unsafe(method(deviceSimplePairingComplete:status:))]
#[unsafe(method_family = none)]
unsafe fn deviceSimplePairingComplete_status(
&self,
sender: Option<&AnyObject>,
status: BluetoothHCIEventStatus,
);
}
);
extern_class!(
/// An instance of IOBluetoothDevicePair represents a pairing attempt to a remote Bluetooth device.
///
/// Use the IOBluetoothDevicePair object to attempt to pair with any Bluetooth device. Once -start is invoked
/// on it, progress is returned to the delegate via the messages defined below. This object enables you to
/// pair with devices within your application without having to use the standard panels provided by the
/// IOBluetoothUI framework, allowing you to write custom UI to select devices, and still handle the ability
/// to perform device pairings.
///
/// Of note is that this object MAY attempt to perform two low-level pairings, depending on the type of device
/// you are attempting to pair. This is inconsequential to your code, however, as it occurs automatically and
/// does not change the messaging.
///
/// Once started, the pairing can be stopped. This will set the delegate to nil and then attempt to disconnect
/// from the device if already connected.
///
/// See also [Apple's documentation](https://developer.apple.com/documentation/iobluetooth/iobluetoothdevicepair?language=objc)
#[unsafe(super(NSObject))]
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct IOBluetoothDevicePair;
);
extern_conformance!(
unsafe impl NSObjectProtocol for IOBluetoothDevicePair {}
);
impl IOBluetoothDevicePair {
extern_methods!(
#[unsafe(method(delegate))]
#[unsafe(method_family = none)]
pub unsafe fn delegate(&self) -> Option<Retained<AnyObject>>;
/// Setter for [`delegate`][Self::delegate].
///
/// This is a [weak property][objc2::topics::weak_property].
///
/// # Safety
///
/// - `delegate` should be of the correct type.
/// - `delegate` might not allow `None`.
#[unsafe(method(setDelegate:))]
#[unsafe(method_family = none)]
pub unsafe fn setDelegate(&self, delegate: Option<&AnyObject>);
#[cfg(all(feature = "IOBluetoothDevice", feature = "IOBluetoothObject"))]
/// Creates an autorelease IOBluetoothDevicePair object with a device as the pairing target.
///
/// Parameter `device`: An IOBluetoothDevice to attept to pair with. The device is retained.
///
/// Returns: Returns an IOReturn or Bluetooth error code, if the pairing could not be started.
///
/// # Safety
///
/// `device` might not allow `None`.
#[unsafe(method(pairWithDevice:))]
#[unsafe(method_family = none)]
pub unsafe fn pairWithDevice(device: Option<&IOBluetoothDevice>) -> Option<Retained<Self>>;
/// Kicks off the pairing with the device.
///
/// Returns: Returns an IOReturn or Bluetooth error code, if the pairing could not be started.
#[unsafe(method(start))]
#[unsafe(method_family = none)]
pub unsafe fn start(&self) -> IOReturn;
/// Stops the current pairing. Removes the delegate and disconnects if device was connected.
#[unsafe(method(stop))]
#[unsafe(method_family = none)]
pub unsafe fn stop(&self);
#[cfg(all(feature = "IOBluetoothDevice", feature = "IOBluetoothObject"))]
/// Get the IOBluetoothDevice being used by the object.
///
/// Returns: device The IOBluetoothDevice object that the IOBluetoothDevicePair object is pairing with, as
/// specified in -setDevice: or pairWithDevice:
#[unsafe(method(device))]
#[unsafe(method_family = none)]
pub unsafe fn device(&self) -> Option<Retained<IOBluetoothDevice>>;
#[cfg(all(feature = "IOBluetoothDevice", feature = "IOBluetoothObject"))]
/// Set the device object to pair with. It is retained by the object.
///
/// Parameter `device`: The IOBluetoothDevice object that the IOBluetoothDevicePair object with which to perform a pairing.
///
/// # Safety
///
/// `in_device` might not allow `None`.
#[unsafe(method(setDevice:))]
#[unsafe(method_family = none)]
pub unsafe fn setDevice(&self, in_device: Option<&IOBluetoothDevice>);
#[cfg(feature = "Bluetooth")]
/// This is the required reply to the devicePairingPINCodeRequest delegate message.
/// Set the PIN code to use during pairing if required.
///
/// Parameter `PINCodeSize`: The PIN code length in octets (8 bits).
///
/// Parameter `PINcode`: PIN code for the device. Can be up to a maximum of 128 bits.
///
/// # Safety
///
/// `pin_code` must be a valid pointer.
#[unsafe(method(replyPINCode:PINCode:))]
#[unsafe(method_family = none)]
pub unsafe fn replyPINCode_PINCode(
&self,
pin_code_size: ByteCount,
pin_code: *mut BluetoothPINCode,
);
/// This is the required reply to the devicePairingUserConfirmationRequest delegate message.
///
/// Parameter `reply`: A yes/no answer provide by the user to the numeric comparison presented.
#[unsafe(method(replyUserConfirmation:))]
#[unsafe(method_family = none)]
pub unsafe fn replyUserConfirmation(&self, reply: bool);
);
}
/// Methods declared on superclass `NSObject`.
impl IOBluetoothDevicePair {
extern_methods!(
#[unsafe(method(init))]
#[unsafe(method_family = init)]
pub unsafe fn init(this: Allocated<Self>) -> Retained<Self>;
#[unsafe(method(new))]
#[unsafe(method_family = new)]
pub unsafe fn new() -> Retained<Self>;
);
}