hpcmenu.h revision 1.6 1 /* -*-C++-*- $NetBSD: hpcmenu.h,v 1.6 2001/05/08 18:51:22 uch 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 // boot loader options.
113 int auto_boot;
114 BOOL reverse_video;
115 BOOL pause_before_boot;
116 BOOL load_debug_info;
117 BOOL safety_message;
118 // serial console speed
119 int serial_speed;
120 };
121 struct support_status {
122 u_int32_t cpu, machine;
123 const TCHAR *cause;
124 };
125 static struct support_status _unsupported[];
126
127 RootWindow *_root;
128 MainTabWindow *_main;
129 OptionTabWindow *_option;
130 ConsoleTabWindow *_console;
131 struct HpcMenuPreferences _pref;
132
133 struct boot_hook_args {
134 void(*func)(void *);
135 void *arg;
136 } _boot_hook;
137
138 struct cons_hook_args {
139 void(*func)(void *, unsigned char);
140 void *arg;
141 } _cons_hook [4];
142 int _cons_parameter; // Console tab window check buttons.
143
144 private:
145 static HpcMenuInterface *_instance;
146
147 void _set_default_pref(void);
148 enum _platform_op {
149 _PLATFORM_OP_GET,
150 _PLATFORM_OP_SET,
151 _PLATFORM_OP_DEFAULT
152 };
153 void *_platform(int, enum _platform_op);
154
155 protected:
156 HpcMenuInterface(void);
157 virtual ~HpcMenuInterface(void) { /* NO-OP */ }
158
159 public:
160 static HpcMenuInterface &Instance(void);
161 static void Destroy(void);
162
163 // preferences.
164 BOOL load(void);
165 BOOL save(void);
166
167 // Boot button
168 // when user click `boot button' inquires all options.
169 void get_options(void);
170 enum { MAX_KERNEL_ARGS = 16 };
171 int setup_kernel_args(vaddr_t, paddr_t);
172 void setup_bootinfo(struct bootinfo &bi);
173 void register_boot_hook(struct boot_hook_args &arg) {
174 _boot_hook = arg;
175 }
176 // call architecture dependent boot function.
177 void boot(void);
178 // Progress bar.
179 void progress(void);
180
181 // Console window interface.
182 void print(TCHAR *);
183 void register_cons_hook(struct cons_hook_args &arg, int id) {
184 if (id >= 0 && id < 4)
185 _cons_hook[id] = arg;
186 }
187
188 // Main window options
189 TCHAR *dir(int);
190 int dir_default(void);
191
192 // platform
193 TCHAR *platform_get(int n) {
194 return reinterpret_cast <TCHAR *>
195 (_platform(n, _PLATFORM_OP_GET));
196 }
197 int platform_default(void) {
198 return reinterpret_cast <int>
199 (_platform(0, _PLATFORM_OP_DEFAULT));
200 }
201 void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); }
202 };
203
204 /* Global access macro */
205 #define HPC_MENU (HpcMenuInterface::Instance())
206 #define HPC_PREFERENCE (HPC_MENU._pref)
207
208 #endif // _HPCBOOT_MENU_H_
209