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
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

pub mod blocklist;
pub mod scanfilter;

use ipc_channel::ipc::IpcSender;
use serde::{Deserialize, Serialize};

use crate::scanfilter::{BluetoothScanfilterSequence, RequestDeviceoptions};

#[derive(Debug, Deserialize, Serialize)]
pub enum BluetoothError {
    Type(String),
    Network,
    NotFound,
    NotSupported,
    Security,
    InvalidState,
}

#[derive(Debug, Deserialize, Serialize)]
pub enum GATTType {
    PrimaryService,
    Characteristic,
    IncludedService,
    Descriptor,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct BluetoothDeviceMsg {
    // Bluetooth Device properties
    pub id: String,
    pub name: Option<String>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct BluetoothServiceMsg {
    pub uuid: String,
    pub is_primary: bool,
    pub instance_id: String,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct BluetoothCharacteristicMsg {
    // Characteristic
    pub uuid: String,
    pub instance_id: String,
    // Characteristic properties
    pub broadcast: bool,
    pub read: bool,
    pub write_without_response: bool,
    pub write: bool,
    pub notify: bool,
    pub indicate: bool,
    pub authenticated_signed_writes: bool,
    pub reliable_write: bool,
    pub writable_auxiliaries: bool,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct BluetoothDescriptorMsg {
    pub uuid: String,
    pub instance_id: String,
}

pub type BluetoothServicesMsg = Vec<BluetoothServiceMsg>;

pub type BluetoothCharacteristicsMsg = Vec<BluetoothCharacteristicMsg>;

pub type BluetoothDescriptorsMsg = Vec<BluetoothDescriptorMsg>;

pub type BluetoothResult<T> = Result<T, BluetoothError>;

pub type BluetoothResponseResult = Result<BluetoothResponse, BluetoothError>;

#[derive(Debug, Deserialize, Serialize)]
pub enum BluetoothRequest {
    RequestDevice(RequestDeviceoptions, IpcSender<BluetoothResponseResult>),
    GATTServerConnect(String, IpcSender<BluetoothResponseResult>),
    GATTServerDisconnect(String, IpcSender<BluetoothResult<()>>),
    GetGATTChildren(
        String,
        Option<String>,
        bool,
        GATTType,
        IpcSender<BluetoothResponseResult>,
    ),
    ReadValue(String, IpcSender<BluetoothResponseResult>),
    WriteValue(String, Vec<u8>, IpcSender<BluetoothResponseResult>),
    EnableNotification(String, bool, IpcSender<BluetoothResponseResult>),
    WatchAdvertisements(String, IpcSender<BluetoothResponseResult>),
    SetRepresentedToNull(Vec<String>, Vec<String>, Vec<String>),
    IsRepresentedDeviceNull(String, IpcSender<bool>),
    GetAvailability(IpcSender<BluetoothResponseResult>),
    MatchesFilter(
        String,
        BluetoothScanfilterSequence,
        IpcSender<BluetoothResult<bool>>,
    ),
    Test(String, IpcSender<BluetoothResult<()>>),
    Exit,
}

#[derive(Debug, Deserialize, Serialize)]
pub enum BluetoothResponse {
    RequestDevice(BluetoothDeviceMsg),
    GATTServerConnect(bool),
    GetPrimaryServices(BluetoothServicesMsg, bool),
    GetIncludedServices(BluetoothServicesMsg, bool),
    GetCharacteristics(BluetoothCharacteristicsMsg, bool),
    GetDescriptors(BluetoothDescriptorsMsg, bool),
    ReadValue(Vec<u8>),
    WriteValue(Vec<u8>),
    EnableNotification(()),
    WatchAdvertisements(()),
    GetAvailability(bool),
}