-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathAbstractUsbEnumerator.cpp
More file actions
117 lines (98 loc) · 2.78 KB
/
AbstractUsbEnumerator.cpp
File metadata and controls
117 lines (98 loc) · 2.78 KB
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
#include "StdAfx.h"
#include "AbstractUsbEnumerator.h"
#include "NotifyWindow.h"
#include "EnumDevices.h"
using namespace DeviceDetectLibrary;
using namespace DeviceDetectLibrary::Connection;
CAbstractUsbEnumerator::CAbstractUsbEnumerator(ICollector& collector) : collector_(collector)
{
}
CAbstractUsbEnumerator::~CAbstractUsbEnumerator(void)
{
}
void CAbstractUsbEnumerator::AddCollector(const GUID& guid, IEnumerator::Pointer pEnumerator, const CNotifyWindow& window)
{
GTPair::Pointer pGTPair = GTPair::Create(guid, pEnumerator, window);
table_.push_back(pGTPair);
}
void CAbstractUsbEnumerator::TryThis(const GUID& guid)
{
class GuidEqual
{
public:
explicit GuidEqual(const GUID& guid) : guid_(guid) {}
virtual ~GuidEqual(void) {}
bool operator()(const GTPair::Pointer& pItem) const
{
return memcmp(&(pItem->GetGuid()), &guid_, sizeof(guid_)) == 0;
}
private:
const GUID& guid_;
};
try
{
std::vector<GTPair::Pointer>::const_iterator guidIter = std::find_if(table_.begin(), table_.end(), GuidEqual(guid));
if(guidIter != table_.end())
{
ConnectionInfo_vt vctResult;
GetDevicesByGuid(guid, vctResult);
for(ConnectionInfo_vt::const_iterator iter = vctResult.begin(); iter != vctResult.end(); ++iter)
{
const CConnectionInfo::Pointer &pConnectionInfo = *iter;
CDeviceInfo::Pointer pDeviceInfo = CDeviceInfo::Create(pConnectionInfo->DevicePath, pConnectionInfo->FriendlyName, L"Unknown device", pConnectionInfo);
const GTPair::Pointer & pGTPair = *guidIter;
if(NULL != pGTPair.get())
{
pGTPair->Collect(pDeviceInfo);
}
}
}
}
catch(const std::exception& ex)
{
ex.what();
// ERROR: in detection
}
}
void CAbstractUsbEnumerator::Collect(const CDeviceInfo::Pointer& pDeviceInfo)
{
class Caller
{
public:
explicit Caller(ICollector& collector, CAbstractUsbEnumerator& enumerator)
: collector_(collector), enumerator_(enumerator)
{}
virtual ~Caller(void) {}
void operator() (const std::vector<GTPair::Pointer>::const_iterator::value_type& pair)
{
enumerator_.TryThis(pair->GetGuid());
}
private:
ICollector& collector_;
CAbstractUsbEnumerator& enumerator_;
};
for_each(table_.begin(), table_.end(), Caller(collector_, *this));
}
CAbstractUsbEnumerator::GTPair::GTPair(const GUID& guid, IEnumerator::Pointer pEnumerator, const CNotifyWindow& window)
: Guid_(guid), m_pEnumerator(pEnumerator), devNotify_(RegisterUSBNotify(guid, window.GetHWND()))
{
}
CAbstractUsbEnumerator::GTPair::~GTPair(void)
{
try
{
UnRegisterUSBNotify(devNotify_);
}
catch (const std::exception& ex)
{
ex.what();
// ERROR: GTPair::~GTPair fails (%s)", e.what());
}
}
void CAbstractUsbEnumerator::GTPair::Collect(const CDeviceInfo::Pointer pDeviceInfo)
{
if(NULL != m_pEnumerator.get())
{
m_pEnumerator->Collect(pDeviceInfo);
}
}