diff --git a/include/boo/inputdev/DeviceFinder.hpp b/include/boo/inputdev/DeviceFinder.hpp index 3acb551..ede8b11 100644 --- a/include/boo/inputdev/DeviceFinder.hpp +++ b/include/boo/inputdev/DeviceFinder.hpp @@ -1,13 +1,12 @@ #pragma once -#include -#include +#include #include -#include "DeviceToken.hpp" -#include "IHIDListener.hpp" -#include "DeviceSignature.hpp" -#include -#include +#include +#include +#include "boo/inputdev/DeviceSignature.hpp" +#include "boo/inputdev/DeviceToken.hpp" +#include "boo/inputdev/IHIDListener.hpp" #ifdef _WIN32 #ifndef WIN32_LEAN_AND_MEAN @@ -44,28 +43,8 @@ private: bool _hasToken(const std::string& path) const { return m_tokens.find(path) != m_tokens.end(); } - bool _insertToken(std::unique_ptr&& token) { - if (DeviceSignature::DeviceMatchToken(*token, m_types)) { - m_tokensLock.lock(); - TInsertedDeviceToken inseredTok = m_tokens.insert(std::make_pair(token->getDevicePath(), std::move(token))); - m_tokensLock.unlock(); - deviceConnected(*inseredTok.first->second); - return true; - } - return false; - } - void _removeToken(const std::string& path) { - auto preCheck = m_tokens.find(path); - if (preCheck != m_tokens.end()) { - DeviceToken& tok = *preCheck->second; - std::shared_ptr dev = tok.m_connectedDev; - tok._deviceClose(); - deviceDisconnected(tok, dev.get()); - m_tokensLock.lock(); - m_tokens.erase(preCheck); - m_tokensLock.unlock(); - } - } + bool _insertToken(std::unique_ptr&& token); + void _removeToken(const std::string& path); public: class CDeviceTokensHandle { @@ -83,26 +62,8 @@ public: }; /* Application must specify its interested device-types */ - DeviceFinder(std::unordered_set types) { - if (skDevFinder) { - fmt::print(stderr, fmt("only one instance of CDeviceFinder may be constructed")); - abort(); - } - skDevFinder = this; - for (const uint64_t& typeHash : types) { - const DeviceSignature* sigIter = BOO_DEVICE_SIGS; - while (sigIter->m_name) { - if (sigIter->m_typeHash == typeHash) - m_types.push_back(sigIter); - ++sigIter; - } - } - } - virtual ~DeviceFinder() { - if (m_listener) - m_listener->stopScanning(); - skDevFinder = NULL; - } + DeviceFinder(std::unordered_set types); + virtual ~DeviceFinder(); /* Get interested device-type mask */ const DeviceSignature::TDeviceSignatureSet& getTypes() const { return m_types; } @@ -111,29 +72,11 @@ public: CDeviceTokensHandle getTokens() { return CDeviceTokensHandle(*this); } /* Automatic device scanning */ - bool startScanning() { - if (!m_listener) - m_listener = IHIDListenerNew(*this); - if (m_listener) - return m_listener->startScanning(); - return false; - } - bool stopScanning() { - if (!m_listener) - m_listener = IHIDListenerNew(*this); - if (m_listener) - return m_listener->stopScanning(); - return false; - } + bool startScanning(); + bool stopScanning(); /* Manual device scanning */ - bool scanNow() { - if (!m_listener) - m_listener = IHIDListenerNew(*this); - if (m_listener) - return m_listener->scanNow(); - return false; - } + bool scanNow(); virtual void deviceConnected(DeviceToken&) {} virtual void deviceDisconnected(DeviceToken&, DeviceBase*) {} diff --git a/lib/inputdev/DeviceFinder.cpp b/lib/inputdev/DeviceFinder.cpp index 3d0889a..e1d9c03 100644 --- a/lib/inputdev/DeviceFinder.cpp +++ b/lib/inputdev/DeviceFinder.cpp @@ -1,5 +1,8 @@ #include "boo/inputdev/DeviceFinder.hpp" +#include +#include + #if _WIN32 #include #include @@ -10,6 +13,76 @@ namespace boo { DeviceFinder* DeviceFinder::skDevFinder = nullptr; +DeviceFinder::DeviceFinder(std::unordered_set types) { + if (skDevFinder) { + fmt::print(stderr, fmt("only one instance of CDeviceFinder may be constructed")); + std::abort(); + } + skDevFinder = this; + for (const uint64_t& typeHash : types) { + const DeviceSignature* sigIter = BOO_DEVICE_SIGS; + while (sigIter->m_name) { + if (sigIter->m_typeHash == typeHash) + m_types.push_back(sigIter); + ++sigIter; + } + } +} + +DeviceFinder::~DeviceFinder() { + if (m_listener) + m_listener->stopScanning(); + skDevFinder = nullptr; +} + +bool DeviceFinder::_insertToken(std::unique_ptr&& token) { + if (DeviceSignature::DeviceMatchToken(*token, m_types)) { + m_tokensLock.lock(); + TInsertedDeviceToken insertedTok = m_tokens.insert(std::make_pair(token->getDevicePath(), std::move(token))); + m_tokensLock.unlock(); + deviceConnected(*insertedTok.first->second); + return true; + } + return false; +} + +void DeviceFinder::_removeToken(const std::string& path) { + auto preCheck = m_tokens.find(path); + if (preCheck != m_tokens.end()) { + DeviceToken& tok = *preCheck->second; + std::shared_ptr dev = tok.m_connectedDev; + tok._deviceClose(); + deviceDisconnected(tok, dev.get()); + m_tokensLock.lock(); + m_tokens.erase(preCheck); + m_tokensLock.unlock(); + } +} + +bool DeviceFinder::startScanning() { + if (!m_listener) + m_listener = IHIDListenerNew(*this); + if (m_listener) + return m_listener->startScanning(); + return false; +} + +bool DeviceFinder::stopScanning() { + if (!m_listener) + m_listener = IHIDListenerNew(*this); + if (m_listener) + return m_listener->stopScanning(); + return false; +} + +bool DeviceFinder::scanNow() { + if (!m_listener) + m_listener = IHIDListenerNew(*this); + if (m_listener) + return m_listener->scanNow(); + return false; +} + #if _WIN32 && !WINDOWS_STORE /* Windows-specific WM_DEVICECHANGED handler */ LRESULT DeviceFinder::winDevChangedHandler(WPARAM wParam, LPARAM lParam) {