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