diff options
Diffstat (limited to 'Userland/Libraries/LibUSBDB/Database.h')
-rw-r--r-- | Userland/Libraries/LibUSBDB/Database.h | 86 |
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 }; +}; + +} |