@@ -20,24 +20,16 @@ HidApiBackend::~HidApiBackend()
2020
2121void HidApiBackend::CloseDevice (DeviceInfo& dev)
2222{
23- if (dev.handle != INVALID_HANDLE_VALUE )
23+ if (dev.handle . is_valid () )
2424 {
2525 if (dev.readPending )
26- CancelIo (dev.handle );
27- CloseHandle (dev.handle );
28- dev.handle = INVALID_HANDLE_VALUE ;
29- }
30- if (dev.overlapped .hEvent )
31- {
32- CloseHandle (dev.overlapped .hEvent );
33- dev.overlapped .hEvent = nullptr ;
26+ CancelIo (dev.handle .get ());
27+ dev.handle .reset ();
3428 }
29+ dev.readEvent .reset ();
30+ dev.overlapped .hEvent = nullptr ;
3531 dev.readPending = false ;
36- if (dev.preparsed )
37- {
38- HidD_FreePreparsedData (dev.preparsed );
39- dev.preparsed = nullptr ;
40- }
32+ dev.preparsed .reset ();
4133 dev.readBuf .clear ();
4234 if (dev.slot >= 0 && dev.slot < kMaxDevices )
4335 states_[dev.slot ] = GamepadState{};
@@ -62,7 +54,7 @@ void HidApiBackend::Poll()
6254 for (auto it = devices_.begin (); it != devices_.end ();)
6355 {
6456 auto & dev = **it;
65- if (dev.handle == INVALID_HANDLE_VALUE )
57+ if (! dev.handle . is_valid () )
6658 {
6759 ++it;
6860 continue ;
@@ -76,7 +68,7 @@ void HidApiBackend::Poll()
7668 }
7769
7870 DWORD bytesRead = 0 ;
79- BOOL ok = GetOverlappedResult (dev.handle , &dev.overlapped ,
71+ BOOL ok = GetOverlappedResult (dev.handle . get () , &dev.overlapped ,
8072 &bytesRead, FALSE );
8173 if (ok)
8274 {
@@ -228,40 +220,35 @@ bool HidApiBackend::OpenAndSetup(const wchar_t* path, DeviceInfo& info)
228220 if (h == INVALID_HANDLE_VALUE )
229221 return false ;
230222
231- info.handle = h ;
223+ info.handle . reset (h) ;
232224
233225 HIDD_ATTRIBUTES attrs{};
234226 attrs.Size = sizeof (attrs);
235- if (HidD_GetAttributes (h , &attrs))
227+ if (HidD_GetAttributes (info. handle . get () , &attrs))
236228 {
237229 info.vendorId = attrs.VendorID ;
238230 info.productId = attrs.ProductID ;
239231 }
240232
241233 PHIDP_PREPARSED_DATA pp = nullptr ;
242- if (!HidD_GetPreparsedData (h , &pp))
234+ if (!HidD_GetPreparsedData (info. handle . get () , &pp))
243235 {
244- CloseHandle (h);
245- info.handle = INVALID_HANDLE_VALUE ;
236+ info.handle .reset ();
246237 return false ;
247238 }
248- info.preparsed = pp ;
239+ info.preparsed . reset (pp) ;
249240
250241 if (HidP_GetCaps (pp, &info.caps ) != HIDP_STATUS_SUCCESS )
251242 {
252- HidD_FreePreparsedData (pp);
253- info.preparsed = nullptr ;
254- CloseHandle (h);
255- info.handle = INVALID_HANDLE_VALUE ;
243+ info.preparsed .reset ();
244+ info.handle .reset ();
256245 return false ;
257246 }
258247
259248 if (!IsGamepadOrJoystick (info.caps ))
260249 {
261- HidD_FreePreparsedData (pp);
262- info.preparsed = nullptr ;
263- CloseHandle (h);
264- info.handle = INVALID_HANDLE_VALUE ;
250+ info.preparsed .reset ();
251+ info.handle .reset ();
265252 return false ;
266253 }
267254
@@ -279,10 +266,8 @@ bool HidApiBackend::OpenAndSetup(const wchar_t* path, DeviceInfo& info)
279266 int s = AllocateSlot ();
280267 if (s < 0 )
281268 {
282- HidD_FreePreparsedData (pp);
283- info.preparsed = nullptr ;
284- CloseHandle (h);
285- info.handle = INVALID_HANDLE_VALUE ;
269+ info.preparsed .reset ();
270+ info.handle .reset ();
286271 return false ;
287272 }
288273
@@ -293,7 +278,8 @@ bool HidApiBackend::OpenAndSetup(const wchar_t* path, DeviceInfo& info)
293278 info.readBuf .resize (info.caps .InputReportByteLength );
294279
295280 info.overlapped = {};
296- info.overlapped .hEvent = CreateEventW (nullptr , TRUE , FALSE , nullptr );
281+ info.readEvent .reset (CreateEventW (nullptr , TRUE , FALSE , nullptr ));
282+ info.overlapped .hEvent = info.readEvent .get ();
297283
298284 StartRead (info);
299285 return true ;
@@ -303,14 +289,14 @@ bool HidApiBackend::OpenAndSetup(const wchar_t* path, DeviceInfo& info)
303289
304290void HidApiBackend::StartRead (DeviceInfo& dev)
305291{
306- if (dev.handle == INVALID_HANDLE_VALUE ) return ;
292+ if (! dev.handle . is_valid () ) return ;
307293
308294 constexpr int kMaxSyncReads = 16 ;
309295 for (int attempt = 0 ; attempt < kMaxSyncReads ; ++attempt)
310296 {
311297 ResetEvent (dev.overlapped .hEvent );
312298 DWORD bytesRead = 0 ;
313- BOOL ok = ReadFile (dev.handle , dev.readBuf .data (),
299+ BOOL ok = ReadFile (dev.handle . get () , dev.readBuf .data (),
314300 static_cast <DWORD >(dev.readBuf .size ()),
315301 &bytesRead, &dev.overlapped );
316302 if (ok)
@@ -353,7 +339,7 @@ void HidApiBackend::ParseReport(DeviceInfo& dev, DWORD bytesRead)
353339 if (bytesRead == 0 ) return ;
354340 if (dev.slot < 0 || dev.slot >= kMaxDevices ) return ;
355341
356- PHIDP_PREPARSED_DATA pp = dev.preparsed ;
342+ PHIDP_PREPARSED_DATA pp = dev.preparsed . get () ;
357343 if (!pp) return ;
358344
359345 auto & gs = states_[dev.slot ];
0 commit comments