hpcmenu.h revision 1.7 1 /* -*-C++-*- $NetBSD: hpcmenu.h,v 1.7 2001/05/17 01:50:35 enami Exp $ */
2
3 /*-
4 * Copyright (c) 2001 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by UCHIYAMA Yasushi.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39 #ifndef _HPCBOOT_MENU_H_
40 #define _HPCBOOT_MENU_H_
41
42 #include <hpcdefs.h>
43
44 // forward declaration.
45 class Console;
46 class HpcBootApp;
47 class RootWindow;
48 class BootButton;
49 class CancelButton;
50 class ProgressBar;
51 class TabWindowBase;
52 class MainTabWindow;
53 class OptionTabWindow;
54 class ConsoleTabWindow;
55 struct bootinfo;
56
57 // Application
58 class HpcBootApp {
59 public:
60 HINSTANCE _instance;
61 HWND _cmdbar;
62 RootWindow *_root;
63 Console *_cons;
64 int _cx_char, _cy_char; // 5, 14
65
66 private:
67 void _get_font_size(void) {
68 HDC hdc = GetDC(0);
69 TEXTMETRIC tm;
70 SelectObject(hdc, GetStockObject(SYSTEM_FONT));
71 GetTextMetrics(hdc, &tm);
72 _cx_char = tm.tmAveCharWidth;
73 _cy_char = tm.tmHeight + tm.tmExternalLeading;
74 ReleaseDC(0, hdc);
75 }
76
77 public:
78 explicit HpcBootApp(HINSTANCE instance) : _instance(instance) {
79 _root = 0;
80 _cmdbar = 0;
81 _get_font_size();
82 }
83 virtual ~HpcBootApp(void) { /* NO-OP */ }
84
85 BOOL registerClass(WNDPROC proc);
86 int run(void);
87 };
88
89 // internal representation of user input.
90 class HpcMenuInterface
91 {
92 public:
93 struct HpcMenuPreferences {
94 #define HPCBOOT_MAGIC 0x177d5753
95 int _magic;
96 int _version;
97 size_t _size; // size of HpcMenuPreferences structure.
98 int dir;
99 BOOL dir_user;
100 TCHAR dir_user_path[MAX_PATH];
101 BOOL kernel_user;
102 TCHAR kernel_user_file[MAX_PATH];
103 unsigned platid_hi;
104 unsigned platid_lo;
105 int rootfs;
106 TCHAR rootfs_file[MAX_PATH];
107 // kernel options.
108 BOOL boot_serial;
109 BOOL boot_verbose;
110 BOOL boot_single_user;
111 BOOL boot_ask_for_name;
112 BOOL boot_debugger;
113 // boot loader options.
114 int auto_boot;
115 BOOL reverse_video;
116 BOOL pause_before_boot;
117 BOOL load_debug_info;
118 BOOL safety_message;
119 // serial console speed
120 int serial_speed;
121 };
122 struct support_status {
123 u_int32_t cpu, machine;
124 const TCHAR *cause;
125 };
126 static struct support_status _unsupported[];
127
128 RootWindow *_root;
129 MainTabWindow *_main;
130 OptionTabWindow *_option;
131 ConsoleTabWindow *_console;
132 struct HpcMenuPreferences _pref;
133
134 struct boot_hook_args {
135 void(*func)(void *);
136 void *arg;
137 } _boot_hook;
138
139 struct cons_hook_args {
140 void(*func)(void *, unsigned char);
141 void *arg;
142 } _cons_hook [4];
143 int _cons_parameter; // Console tab window check buttons.
144
145 private:
146 static HpcMenuInterface *_instance;
147
148 void _set_default_pref(void);
149 enum _platform_op {
150 _PLATFORM_OP_GET,
151 _PLATFORM_OP_SET,
152 _PLATFORM_OP_DEFAULT
153 };
154 void *_platform(int, enum _platform_op);
155
156 protected:
157 HpcMenuInterface(void);
158 virtual ~HpcMenuInterface(void) { /* NO-OP */ }
159
160 public:
161 static HpcMenuInterface &Instance(void);
162 static void Destroy(void);
163
164 // preferences.
165 BOOL load(void);
166 BOOL save(void);
167
168 // Boot button
169 // when user click `boot button' inquires all options.
170 void get_options(void);
171 enum { MAX_KERNEL_ARGS = 16 };
172 int setup_kernel_args(vaddr_t, paddr_t);
173 void setup_bootinfo(struct bootinfo &bi);
174 void register_boot_hook(struct boot_hook_args &arg) {
175 _boot_hook = arg;
176 }
177 // call architecture dependent boot function.
178 void boot(void);
179 // Progress bar.
180 void progress(void);
181
182 // Console window interface.
183 void print(TCHAR *);
184 void register_cons_hook(struct cons_hook_args &arg, int id) {
185 if (id >= 0 && id < 4)
186 _cons_hook[id] = arg;
187 }
188
189 // Main window options
190 TCHAR *dir(int);
191 int dir_default(void);
192
193 // platform
194 TCHAR *platform_get(int n) {
195 return reinterpret_cast <TCHAR *>
196 (_platform(n, _PLATFORM_OP_GET));
197 }
198 int platform_default(void) {
199 return reinterpret_cast <int>
200 (_platform(0, _PLATFORM_OP_DEFAULT));
201 }
202 void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); }
203 };
204
205 /* Global access macro */
206 #define HPC_MENU (HpcMenuInterface::Instance())
207 #define HPC_PREFERENCE (HPC_MENU._pref)
208
209 #endif // _HPCBOOT_MENU_H_
210