mirror of https://github.com/AxioDL/boo.git
Merge pull request #25 from lioncash/finder
DeviceFinder: Move includes into cpp file where applicable
This commit is contained in:
commit
1e67f49b0b
|
@ -1,13 +1,12 @@
|
|||
#pragma once
|
||||
|
||||
#include <unordered_set>
|
||||
#include <typeindex>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include "DeviceToken.hpp"
|
||||
#include "IHIDListener.hpp"
|
||||
#include "DeviceSignature.hpp"
|
||||
#include <cstring>
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
#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<DeviceToken>&& 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<DeviceBase> 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<DeviceToken>&& 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<uint64_t> 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<uint64_t> 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*) {}
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
#include "boo/inputdev/DeviceFinder.hpp"
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
||||
#if _WIN32
|
||||
#include <Dbt.h>
|
||||
#include <hidclass.h>
|
||||
|
@ -10,6 +13,79 @@ namespace boo {
|
|||
|
||||
DeviceFinder* DeviceFinder::skDevFinder = nullptr;
|
||||
|
||||
DeviceFinder::DeviceFinder(std::unordered_set<uint64_t> 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<DeviceToken>&& token) {
|
||||
if (!DeviceSignature::DeviceMatchToken(*token, m_types)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
m_tokensLock.lock();
|
||||
const TInsertedDeviceToken insertedTok = m_tokens.emplace(token->getDevicePath(), std::move(token));
|
||||
m_tokensLock.unlock();
|
||||
deviceConnected(*insertedTok.first->second);
|
||||
return true;
|
||||
}
|
||||
|
||||
void DeviceFinder::_removeToken(const std::string& path) {
|
||||
const auto preCheck = m_tokens.find(path);
|
||||
if (preCheck == m_tokens.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
DeviceToken& tok = *preCheck->second;
|
||||
std::shared_ptr<DeviceBase> 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) {
|
||||
|
|
Loading…
Reference in New Issue