forked from roelvandijk/usb-id-database
/
Base.hs
193 lines (163 loc) · 6.66 KB
/
Base.hs
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
{-# LANGUAGE CPP #-}
module System.USB.IDDB.Base
( IDDB(..)
, ProductDB
, ClassDB, SubClassDB, ProtocolDB
, emptyDb
, vendorName
, vendorId
, productName
, productId
, className
, subClassName
, protocolName
, audioClassTerminalTypeName
, videoClassTerminalTypeName
, hidDescTypeName
, hidDescItemName
, hidDescCountryCodeName
, hidUsagePageName
, hidUsageName
, physicalDescBiasName
, physicalDescItemName
, langName
, subLangName
, getDataFileName
)
where
import qualified Data.IntMap as IM
import qualified Data.Map as MP
#ifdef BUILD_WITH_CABAL
import Paths_usb_id_database ( getDataFileName )
#else
getDataFileName :: FilePath -> IO FilePath
getDataFileName = return
#endif
-------------------------------------------------------------------------------
-- Types
-------------------------------------------------------------------------------
type ProductDB = ( MP.Map String Int
, IM.IntMap String
)
type ClassDB = IM.IntMap (String, SubClassDB)
type SubClassDB = IM.IntMap (String, ProtocolDB)
type ProtocolDB = IM.IntMap String
-- |A database of USB identifiers. Contains both vendor identifiers
-- and product identifiers.
data IDDB = IDDB { dbVendorNameId :: MP.Map String Int
, dbVendorIdName :: IM.IntMap String
, dbProducts :: IM.IntMap ProductDB
, dbClasses :: ClassDB
, dbAudioCTType :: IM.IntMap String
, dbVideoCTType :: IM.IntMap String
, dbHIDDescType :: IM.IntMap String
, dbHIDDescItem :: IM.IntMap String
, dbHIDDescCCode :: IM.IntMap String
, dbHIDUsage :: IM.IntMap (String, IM.IntMap String)
, dbPhysDescBias :: IM.IntMap String
, dbPhysDescItem :: IM.IntMap String
, dbLanguages :: IM.IntMap (String, IM.IntMap String)
}
-- |An empty database.
emptyDb :: IDDB
emptyDb = IDDB { dbVendorNameId = MP.empty
, dbVendorIdName = IM.empty
, dbProducts = IM.empty
, dbClasses = IM.empty
, dbAudioCTType = IM.empty
, dbVideoCTType = IM.empty
, dbHIDDescType = IM.empty
, dbHIDDescItem = IM.empty
, dbHIDDescCCode = IM.empty
, dbHIDUsage = IM.empty
, dbPhysDescBias = IM.empty
, dbPhysDescItem = IM.empty
, dbLanguages = IM.empty
}
-------------------------------------------------------------------------------
-- Query database
-------------------------------------------------------------------------------
vendorName :: IDDB -- ^Database
-> Int -- ^Vendor identifier
-> Maybe String
vendorName db vid = IM.lookup vid $ dbVendorIdName db
vendorId :: IDDB -- ^Database
-> String -- ^Vendor name
-> Maybe Int
vendorId db name = MP.lookup name $ dbVendorNameId db
productName :: IDDB -- ^Database
-> Int -- ^Vendor identifier
-> Int -- ^Product identifier
-> Maybe String
productName db vid pid = IM.lookup pid . snd =<< IM.lookup vid (dbProducts db)
productId :: IDDB -- ^Database
-> Int -- ^Vendor identifier
-> String -- ^Product name
-> Maybe Int
productId db vid name = MP.lookup name . fst =<< IM.lookup vid (dbProducts db)
className :: IDDB -- ^Database
-> Int -- ^Class identifier
-> Maybe String
className db cid = fmap fst . IM.lookup cid $ dbClasses db
subClassName :: IDDB -- ^Database
-> Int -- ^Class identifier
-> Int -- ^Sub class identifier
-> Maybe String
subClassName db cid scid = fmap fst $ IM.lookup scid . snd
=<< IM.lookup cid (dbClasses db)
protocolName :: IDDB -- ^Database
-> Int -- ^Class identifier
-> Int -- ^Sub class identifier
-> Int -- ^Protocol identifier
-> Maybe String
protocolName db cid scid protId = IM.lookup protId . snd
=<< IM.lookup scid . snd
=<< IM.lookup cid (dbClasses db)
audioClassTerminalTypeName :: IDDB -- ^Database
-> Int -- ^Audio class terminal type identifier
-> Maybe String
audioClassTerminalTypeName db actid = IM.lookup actid (dbAudioCTType db)
videoClassTerminalTypeName :: IDDB -- ^Database
-> Int -- ^Video class terminal type identifier
-> Maybe String
videoClassTerminalTypeName db actid = IM.lookup actid (dbVideoCTType db)
hidDescTypeName :: IDDB -- ^Database
-> Int -- ^HID descriptor type identifier
-> Maybe String
hidDescTypeName db hidid = IM.lookup hidid (dbHIDDescType db)
hidDescItemName :: IDDB -- ^Database
-> Int -- ^HID descriptor item identifier
-> Maybe String
hidDescItemName db hidid = IM.lookup hidid (dbHIDDescItem db)
hidDescCountryCodeName :: IDDB -- ^Database
-> Int -- ^HID descriptor country code identifier
-> Maybe String
hidDescCountryCodeName db hidid = IM.lookup hidid (dbHIDDescCCode db)
hidUsagePageName :: IDDB -- ^Database
-> Int -- ^HID usage page identifier
-> Maybe String
hidUsagePageName db upid = fmap fst $ IM.lookup upid (dbHIDUsage db)
hidUsageName :: IDDB -- ^Database
-> Int -- ^HID usage page identifier
-> Int -- ^HID usage identifier
-> Maybe String
hidUsageName db upid uid = IM.lookup uid . snd
=<< IM.lookup upid (dbHIDUsage db)
physicalDescBiasName :: IDDB -- ^Database
-> Int -- ^Physical descriptor bias identifier
-> Maybe String
physicalDescBiasName db phyid = IM.lookup phyid (dbPhysDescBias db)
physicalDescItemName :: IDDB -- ^Database
-> Int -- ^Physical descriptor item identifier
-> Maybe String
physicalDescItemName db phyid = IM.lookup phyid (dbPhysDescItem db)
langName :: IDDB -- ^Database
-> Int -- ^Primary language identifier
-> Maybe String
langName db lid = fmap fst . IM.lookup lid $ dbLanguages db
subLangName :: IDDB -- ^Database
-> Int -- ^Primary language identifier
-> Int -- ^Sub language identifier
-> Maybe String
subLangName db lid slid = IM.lookup slid . snd
=<< IM.lookup lid (dbLanguages db)