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