Home | History | Annotate | Line # | Download | only in hpcboot
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