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