21
21
22
22
class SinricProClass : public EventSender {
23
23
public:
24
- void begin (String socketAuthToken, String signingKey, String serverURL = SERVER_URL);
25
- template <typename DeviceType>
26
- DeviceType& add (const char * deviceId, unsigned long eventWaitTime = 1000 );
27
- void add (SinricProDevice& newDevice);
28
- void add (SinricProDevice* newDevice);
29
- void handle ();
30
- void stop ();
31
- bool isConnected ();
32
-
33
- DynamicJsonDocument prepareResponse (JsonDocument& requestMessage);
34
- DynamicJsonDocument prepareEvent (const char * deviceId, const char * action, const char * cause) override ;
35
- void sendEvent (JsonDocument& event) override ;
24
+ void begin (String socketAuthToken, String signingKey, String serverURL = SERVER_URL);
25
+ template <typename DeviceType>
26
+ DeviceType& add (const char * deviceId, unsigned long eventWaitTime = 1000 );
27
+
28
+ void add (SinricProDevice& newDevice);
29
+ void add (SinricProDevice* newDevice);
30
+ void handle ();
31
+ void stop ();
32
+ bool isConnected ();
33
+
34
+ DynamicJsonDocument prepareResponse (JsonDocument& requestMessage);
35
+ DynamicJsonDocument prepareEvent (const char * deviceId, const char * action, const char * cause) override ;
36
+ void sendEvent (JsonDocument& event) override ;
37
+
38
+ struct proxy {
39
+ proxy (SinricProClass* ptr, String deviceId) : ptr(ptr), deviceId(deviceId) {}
40
+ SinricProClass* ptr;
41
+ String deviceId;
42
+ template <typename DeviceType>
43
+ operator DeviceType&() { return ptr->getDeviceInstance <DeviceType>(deviceId); }
44
+ };
45
+
46
+ proxy operator [](const String deviceId) { return proxy (this , deviceId); }
47
+
36
48
private:
37
- void handleRequest ();
38
- void handleSendQueue ();
39
- void connect ();
40
- void disconnect ();
41
- void reconnect ();
42
-
43
- std::vector<SinricProDevice*> devices;
44
- String socketAuthToken;
45
- String signingKey;
46
- String serverURL;
47
-
48
- websocketListener _websocketListener;
49
- udpListener _udpListener;
50
- myNTP _ntp;
51
- SinricProQueue_t receiveQueue;
52
- SinricProQueue_t sendQueue;
49
+ void handleRequest ();
50
+ void handleSendQueue ();
51
+ void connect ();
52
+ void disconnect ();
53
+ void reconnect ();
54
+ bool checkDeviceId (String deviceId);
55
+
56
+ SinricProDevice* getDevice (String deviceId);
57
+
58
+ template <typename DeviceType>
59
+ DeviceType& getDeviceInstance (String deviceId) { return (DeviceType&) *getDevice (deviceId); }
60
+
61
+ std::vector<SinricProDevice*> devices;
62
+ String socketAuthToken;
63
+ String signingKey;
64
+ String serverURL;
65
+
66
+ websocketListener _websocketListener;
67
+ udpListener _udpListener;
68
+ myNTP _ntp;
69
+ SinricProQueue_t receiveQueue;
70
+ SinricProQueue_t sendQueue;
53
71
};
54
72
73
+ SinricProDevice* SinricProClass::getDevice (String deviceId) {
74
+ for (auto & device : devices) {
75
+ if (deviceId == String (device->getDeviceId ())) return device;
76
+ }
77
+ return nullptr ;
78
+ }
79
+
55
80
void SinricProClass::begin (String socketAuthToken, String signingKey, String serverURL) {
56
81
this ->socketAuthToken = socketAuthToken;
57
82
this ->signingKey = signingKey;
@@ -62,12 +87,15 @@ void SinricProClass::begin(String socketAuthToken, String signingKey, String ser
62
87
template <typename DeviceType>
63
88
DeviceType& SinricProClass::add (const char * deviceId, unsigned long eventWaitTime) {
64
89
DeviceType* newDevice = new DeviceType (deviceId, eventWaitTime);
65
- newDevice->begin (this );
66
- devices.push_back (newDevice);
90
+ if (checkDeviceId (String (deviceId))){
91
+ newDevice->begin (this );
92
+ devices.push_back (newDevice);
93
+ }
67
94
return *newDevice;
68
95
}
69
96
70
97
void SinricProClass::add (SinricProDevice* newDevice) {
98
+ if (!checkDeviceId (String (newDevice->getDeviceId ()))) return ;
71
99
newDevice->begin (this );
72
100
devices.push_back (newDevice);
73
101
}
@@ -186,6 +214,23 @@ void SinricProClass::reconnect() {
186
214
connect ();
187
215
}
188
216
217
+ bool SinricProClass::checkDeviceId (String deviceId) {
218
+ if (deviceId.length () != 24 ) {
219
+ DEBUG_SINRIC (" [SinricPro.add()]: Invalid deviceId \" %s\" ! Device will be ignored!\r\n " , deviceId.c_str ());
220
+ return false ;
221
+ }
222
+
223
+ for (size_t i = 0 ; i < deviceId.length (); i++) {
224
+ char current = deviceId[i];
225
+ if (current >= ' 0' && current <= ' 9' ) continue ;
226
+ if (current >= ' A' && current <= ' F' ) continue ;
227
+ if (current >= ' a' && current <= ' f' ) continue ;
228
+ DEBUG_SINRIC (" [SinricPro.add()]: Invalid deviceId \" %s\" ! Device will be ignored!\r\n " , deviceId.c_str ());
229
+ return false ;
230
+ }
231
+ return true ;
232
+ }
233
+
189
234
190
235
void SinricProClass::sendEvent (JsonDocument& event) {
191
236
String messageString = signMessage (signingKey, event);
0 commit comments