Home | History | Annotate | Line # | Download | only in hpcboot
hpcmenu.h revision 1.4
      1 /* -*-C++-*-	$NetBSD: hpcmenu.h,v 1.4 2001/03/25 17:13:16 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 *, struct HpcMenuPreferences &);
    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 		// set default.
    149 		_pref._magic		= HPCBOOT_MAGIC;
    150 		_pref.dir			= 0;
    151 		_pref.dir_user		= FALSE;
    152 		_pref.kernel_user		= FALSE;
    153 		_pref.platid_hi		= 0;
    154 		_pref.platid_lo		= 0;
    155 		_pref.rootfs		= 0;
    156 		wsprintf(_pref.rootfs_file, TEXT("miniroot.fs"));
    157 		_pref.boot_serial	= FALSE;
    158 		_pref.boot_verbose	= FALSE;
    159 		_pref.boot_single_user	= FALSE;
    160 		_pref.boot_ask_for_name	= FALSE;
    161 		_pref.auto_boot		= 0;
    162 		_pref.reverse_video	= FALSE;
    163 		_pref.pause_before_boot	= TRUE;
    164 		_pref.safety_message	= TRUE;
    165 #ifdef MIPS
    166 		_pref.serial_speed	= 9600; // historical reason.
    167 #else
    168 		_pref.serial_speed	= 19200;
    169 #endif
    170 	}
    171 	enum _platform_op {
    172 		_PLATFORM_OP_GET,
    173 		_PLATFORM_OP_SET,
    174 		_PLATFORM_OP_DEFAULT
    175 	};
    176 	void *_platform(int, enum _platform_op);
    177 
    178 protected:
    179 	HpcMenuInterface(void) {
    180 		if (!load())
    181 			_set_default_pref();
    182 		_pref._version		= HPCBOOT_VERSION;
    183 		_pref._size			= sizeof(HpcMenuPreferences);
    184 
    185 		_cons_parameter = 0;
    186 		memset(_cons_hook, 0, sizeof(struct cons_hook_args) * 4);
    187 		memset(&_boot_hook, 0, sizeof(struct boot_hook_args));
    188 	}
    189 	virtual ~HpcMenuInterface(void) { /* NO-OP */ }
    190 
    191 public:
    192 	static HpcMenuInterface &Instance(void);
    193 	static void Destroy(void);
    194 
    195 	// preferences.
    196 	BOOL load(void);
    197 	BOOL save(void);
    198 
    199 	// Boot button
    200 	// when user click `boot button' inquires all options.
    201 	void get_options(void);
    202 	enum { MAX_KERNEL_ARGS = 16 };
    203 	int setup_kernel_args(vaddr_t, paddr_t);
    204 	void setup_bootinfo(struct bootinfo &bi);
    205 	void register_boot_hook(struct boot_hook_args &arg) {
    206 		_boot_hook = arg;
    207 	}
    208 	// call architecture dependent boot function.
    209 	void boot(void);
    210 	// Progress bar.
    211 	void progress(void);
    212 
    213 	// Console window interface.
    214 	void print(TCHAR *);
    215 	void register_cons_hook(struct cons_hook_args &arg, int id) {
    216 		if (id >= 0 && id < 4)
    217 			_cons_hook[id] = arg;
    218 	}
    219 
    220 	// Main window options
    221 	TCHAR *dir(int);
    222 	int dir_default(void);
    223 
    224 	// platform
    225 	TCHAR *platform_get(int n) {
    226 		return reinterpret_cast <TCHAR *>
    227 			(_platform(n, _PLATFORM_OP_GET));
    228 	}
    229 	int platform_default(void) {
    230 		return reinterpret_cast <int>
    231 			(_platform(0, _PLATFORM_OP_DEFAULT));
    232 	}
    233 	void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); }
    234 };
    235 
    236 #endif // _HPCBOOT_MENU_H_
    237