xref: /netbsd-src/sys/arch/hpc/stand/hpcboot/hpcmenu.h (revision 3cec974c61d7fac0a37c0377723a33214a458c8b)
1 /* -*-C++-*-	$NetBSD: hpcmenu.h,v 1.2 2001/03/02 18:26:37 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 	};
119 
120 	RootWindow		*_root;
121 	MainTabWindow		*_main;
122 	OptionTabWindow	*_option;
123 	ConsoleTabWindow	*_console;
124 	struct HpcMenuPreferences _pref;
125 
126 	struct boot_hook_args {
127 		void(*func)(void *, struct HpcMenuPreferences &);
128 		void *arg;
129 	} _boot_hook;
130 
131 	struct cons_hook_args {
132 		void(*func)(void *, unsigned char);
133 		void *arg;
134 	} _cons_hook [4];
135 	int _cons_parameter; // Console tab window check buttons.
136 
137 private:
138 	static HpcMenuInterface *_instance;
139 
140 	BOOL _find_pref_dir(TCHAR *);
141 	void _set_default_pref(void) {
142 		// set default.
143 		_pref._magic		= HPCBOOT_MAGIC;
144 		_pref.dir			= 0;
145 		_pref.dir_user		= FALSE;
146 		_pref.kernel_user		= FALSE;
147 		_pref.platid_hi		= 0;
148 		_pref.platid_lo		= 0;
149 		_pref.rootfs		= 0;
150 
151 		_pref.boot_serial	= FALSE;
152 		_pref.boot_verbose	= FALSE;
153 		_pref.boot_single_user	= FALSE;
154 		_pref.boot_ask_for_name	= FALSE;
155 		_pref.auto_boot		= 0;
156 		_pref.reverse_video	= FALSE;
157 		_pref.pause_before_boot	= TRUE;
158 		_pref.safety_message	= TRUE;
159 	}
160 	enum _platform_op {
161 		_PLATFORM_OP_GET,
162 		_PLATFORM_OP_SET,
163 		_PLATFORM_OP_DEFAULT
164 	};
165 	void *_platform(int, enum _platform_op);
166 
167 protected:
168 	HpcMenuInterface(void) {
169 		if (!load())
170 			_set_default_pref();
171 		_pref._version		= HPCBOOT_VERSION;
172 		_pref._size			= sizeof(HpcMenuPreferences);
173 
174 		_cons_parameter = 0;
175 		memset(_cons_hook, 0, sizeof(struct cons_hook_args) * 4);
176 		memset(&_boot_hook, 0, sizeof(struct boot_hook_args));
177 	}
178 	virtual ~HpcMenuInterface(void) { /* NO-OP */ }
179 
180 public:
181 	static HpcMenuInterface &Instance(void);
182 	static void Destroy(void);
183 
184 	// preferences.
185 	BOOL load(void);
186 	BOOL save(void);
187 
188 	// Boot button
189 	// when user click `boot button' inquires all options.
190 	void get_options(void);
191 	enum { MAX_KERNEL_ARGS = 16 };
192 	int setup_kernel_args(vaddr_t, paddr_t);
193 	void setup_bootinfo(struct bootinfo &bi);
194 	void register_boot_hook(struct boot_hook_args &arg) {
195 		_boot_hook = arg;
196 	}
197 	// call architecture dependent boot function.
198 	void boot(void) {
199 		if (_boot_hook.func)
200 			_boot_hook.func(_boot_hook.arg, _pref);
201 	}
202 	// Progress bar.
203 	void progress(void);
204 
205 	// Console window interface.
206 	void print(TCHAR *);
207 	void register_cons_hook(struct cons_hook_args &arg, int id) {
208 		if (id >= 0 && id < 4)
209 			_cons_hook[id] = arg;
210 	}
211 
212 	// Main window options
213 	TCHAR *dir(int);
214 	int dir_default(void);
215 
216 	// platform
217 	TCHAR *platform_get(int n) {
218 		return reinterpret_cast <TCHAR *>
219 			(_platform(n, _PLATFORM_OP_GET));
220 	}
221 	int platform_default(void) {
222 		return reinterpret_cast <int>
223 			(_platform(0, _PLATFORM_OP_DEFAULT));
224 	}
225 	void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); }
226 };
227 
228 #endif // _HPCBOOT_MENU_H_
229