master
1const std = @import("std");
2const uefi = std.os.uefi;
3const Guid = uefi.Guid;
4const Status = uefi.Status;
5const hii = uefi.hii;
6const cc = uefi.cc;
7const Error = Status.Error;
8
9/// Database manager for HII-related data structures.
10pub const HiiDatabase = extern struct {
11 _new_package_list: Status, // TODO
12 _remove_package_list: *const fn (*HiiDatabase, hii.Handle) callconv(cc) Status,
13 _update_package_list: *const fn (*HiiDatabase, hii.Handle, *const hii.PackageList) callconv(cc) Status,
14 _list_package_lists: *const fn (*const HiiDatabase, u8, ?*const Guid, *usize, [*]hii.Handle) callconv(cc) Status,
15 _export_package_lists: *const fn (*const HiiDatabase, ?hii.Handle, *usize, [*]hii.PackageList) callconv(cc) Status,
16 _register_package_notify: Status, // TODO
17 _unregister_package_notify: Status, // TODO
18 _find_keyboard_layouts: Status, // TODO
19 _get_keyboard_layout: Status, // TODO
20 _set_keyboard_layout: Status, // TODO
21 _get_package_list_handle: Status, // TODO
22
23 pub const RemovePackageListError = uefi.UnexpectedError || error{NotFound};
24 pub const UpdatePackageListError = uefi.UnexpectedError || error{
25 OutOfResources,
26 InvalidParameter,
27 NotFound,
28 };
29 pub const ListPackageListsError = uefi.UnexpectedError || error{
30 BufferTooSmall,
31 InvalidParameter,
32 NotFound,
33 };
34 pub const ExportPackageListError = uefi.UnexpectedError || error{
35 BufferTooSmall,
36 InvalidParameter,
37 NotFound,
38 };
39
40 /// Removes a package list from the HII database.
41 pub fn removePackageList(self: *HiiDatabase, handle: hii.Handle) !void {
42 switch (self._remove_package_list(self, handle)) {
43 .success => {},
44 .not_found => return Error.NotFound,
45 else => |status| return uefi.unexpectedStatus(status),
46 }
47 }
48
49 /// Update a package list in the HII database.
50 pub fn updatePackageList(
51 self: *HiiDatabase,
52 handle: hii.Handle,
53 buffer: *const hii.PackageList,
54 ) UpdatePackageListError!void {
55 switch (self._update_package_list(self, handle, buffer)) {
56 .success => {},
57 .out_of_resources => return Error.OutOfResources,
58 .invalid_parameter => return Error.InvalidParameter,
59 .not_found => return Error.NotFound,
60 else => |status| return uefi.unexpectedStatus(status),
61 }
62 }
63
64 /// Determines the handles that are currently active in the database.
65 pub fn listPackageLists(
66 self: *const HiiDatabase,
67 package_type: u8,
68 package_guid: ?*const Guid,
69 handles: []hii.Handle,
70 ) ListPackageListsError![]hii.Handle {
71 var len: usize = handles.len;
72 switch (self._list_package_lists(
73 self,
74 package_type,
75 package_guid,
76 &len,
77 handles.ptr,
78 )) {
79 .success => return handles[0..len],
80 .buffer_too_small => return Error.BufferTooSmall,
81 .invalid_parameter => return Error.InvalidParameter,
82 .not_found => return Error.NotFound,
83 else => |status| return uefi.unexpectedStatus(status),
84 }
85 }
86
87 /// Exports the contents of one or all package lists in the HII database into a buffer.
88 pub fn exportPackageLists(
89 self: *const HiiDatabase,
90 handle: ?hii.Handle,
91 buffer: []hii.PackageList,
92 ) ExportPackageListError![]hii.PackageList {
93 var len = buffer.len;
94 switch (self._export_package_lists(self, handle, &len, buffer.ptr)) {
95 .success => return buffer[0..len],
96 .buffer_too_small => return Error.BufferTooSmall,
97 .invalid_parameter => return Error.InvalidParameter,
98 .not_found => return Error.NotFound,
99 else => |status| return uefi.unexpectedStatus(status),
100 }
101 }
102
103 pub const guid align(8) = Guid{
104 .time_low = 0xef9fc172,
105 .time_mid = 0xa1b2,
106 .time_high_and_version = 0x4693,
107 .clock_seq_high_and_reserved = 0xb3,
108 .clock_seq_low = 0x27,
109 .node = [_]u8{ 0x6d, 0x32, 0xfc, 0x41, 0x60, 0x42 },
110 };
111};