summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibUSBDB/Database.h
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibUSBDB/Database.h')
-rw-r--r--Userland/Libraries/LibUSBDB/Database.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/Userland/Libraries/LibUSBDB/Database.h b/Userland/Libraries/LibUSBDB/Database.h
new file mode 100644
index 0000000000..c1fa0cc9f1
--- /dev/null
+++ b/Userland/Libraries/LibUSBDB/Database.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/HashMap.h>
+#include <AK/MappedFile.h>
+#include <AK/NonnullOwnPtr.h>
+#include <AK/RefCounted.h>
+#include <AK/RefPtr.h>
+#include <AK/String.h>
+#include <AK/StringView.h>
+
+namespace USBDB {
+
+struct Interface {
+ u16 interface;
+ StringView name;
+};
+
+struct Device {
+ u16 id;
+ StringView name;
+ HashMap<int, NonnullOwnPtr<Interface>> interfaces;
+};
+
+struct Vendor {
+ u16 id;
+ StringView name;
+ HashMap<int, NonnullOwnPtr<Device>> devices;
+};
+
+struct Protocol {
+ u8 id { 0 };
+ StringView name {};
+};
+
+struct Subclass {
+ u8 id { 0 };
+ StringView name {};
+ HashMap<int, NonnullOwnPtr<Protocol>> protocols;
+};
+
+struct Class {
+ u8 id { 0 };
+ StringView name {};
+ HashMap<int, NonnullOwnPtr<Subclass>> subclasses;
+};
+
+class Database : public RefCounted<Database> {
+public:
+ static RefPtr<Database> open(const String& filename);
+ static RefPtr<Database> open() { return open("/res/usb.ids"); };
+
+ const StringView get_vendor(u16 vendor_id) const;
+ const StringView get_device(u16 vendor_id, u16 device_id) const;
+ const StringView get_interface(u16 vendor_id, u16 device_id, u16 interface_id) const;
+ const StringView get_class(u8 class_id) const;
+ const StringView get_subclass(u8 class_id, u8 subclass_id) const;
+ const StringView get_protocol(u8 class_id, u8 subclass_id, u8 protocol_id) const;
+
+private:
+ explicit Database(NonnullRefPtr<MappedFile> file)
+ : m_file(move(file))
+ {
+ }
+
+ int init();
+
+ enum ParseMode {
+ UnknownMode,
+ VendorMode,
+ ClassMode,
+ };
+
+ NonnullRefPtr<MappedFile> m_file;
+ StringView m_view {};
+ HashMap<int, NonnullOwnPtr<Vendor>> m_vendors;
+ HashMap<int, NonnullOwnPtr<Class>> m_classes;
+ bool m_ready { false };
+};
+
+}