#ifndef _HPCBOOT_MENU_H_
#define _HPCBOOT_MENU_H_
#include <hpcdefs.h>
class Console;
class HpcBootApp;
class RootWindow;
class BootButton;
class CancelButton;
class ProgressBar;
class TabWindowBase;
class MainTabWindow;
class OptionTabWindow;
class ConsoleTabWindow;
struct bootinfo;
class HpcBootApp {
public:
HINSTANCE _instance;
HWND _cmdbar;
RootWindow *_root;
Console *_cons;
int _cx_char, _cy_char;
private:
void _get_font_size(void) {
HDC hdc = GetDC(0);
TEXTMETRIC tm;
SelectObject(hdc, GetStockObject(SYSTEM_FONT));
GetTextMetrics(hdc, &tm);
_cx_char = tm.tmAveCharWidth;
_cy_char = tm.tmHeight + tm.tmExternalLeading;
ReleaseDC(0, hdc);
}
public:
explicit HpcBootApp(HINSTANCE instance) : _instance(instance) {
_root = 0;
_cmdbar = 0;
_get_font_size();
}
virtual ~HpcBootApp(void) { }
BOOL registerClass(WNDPROC proc);
int run(void);
};
class HpcMenuInterface
{
public:
struct HpcMenuPreferences {
#define HPCBOOT_MAGIC 0x177d5753
int _magic;
int _version;
size_t _size;
int dir;
BOOL dir_user;
TCHAR dir_user_path[MAX_PATH];
BOOL kernel_user;
TCHAR kernel_user_file[MAX_PATH];
unsigned platid_hi;
unsigned platid_lo;
int rootfs;
TCHAR rootfs_file[MAX_PATH];
BOOL boot_serial;
BOOL boot_verbose;
BOOL boot_single_user;
BOOL boot_ask_for_name;
BOOL boot_debugger;
int auto_boot;
BOOL reverse_video;
BOOL pause_before_boot;
BOOL load_debug_info;
BOOL safety_message;
int serial_speed;
#define MAX_BOOT_STR 256
TCHAR boot_extra[MAX_BOOT_STR];
};
struct support_status {
uint32_t cpu, machine;
const TCHAR *cause;
};
static struct support_status _unsupported[];
RootWindow *_root;
MainTabWindow *_main;
OptionTabWindow *_option;
ConsoleTabWindow *_console;
struct HpcMenuPreferences _pref;
struct boot_hook_args {
void(*func)(void *);
void *arg;
} _boot_hook;
struct cons_hook_args {
void(*func)(void *, unsigned char);
void *arg;
} _cons_hook [4];
int _cons_parameter;
private:
static HpcMenuInterface *_instance;
void _set_default_pref(void);
enum _platform_op {
_PLATFORM_OP_GET,
_PLATFORM_OP_SET,
_PLATFORM_OP_DEFAULT
};
void *_platform(int, enum _platform_op);
protected:
HpcMenuInterface(void);
virtual ~HpcMenuInterface(void) { }
public:
static HpcMenuInterface &Instance(void);
static void Destroy(void);
BOOL load(void);
BOOL save(void);
void get_options(void);
enum { MAX_KERNEL_ARGS = 16 };
int setup_kernel_args(vaddr_t, paddr_t, size_t);
void setup_bootinfo(struct bootinfo &bi);
void register_boot_hook(struct boot_hook_args &arg) {
_boot_hook = arg;
}
void boot(void);
void progress(const char * = NULL);
void unprogress(void);
void print(TCHAR *);
void register_cons_hook(struct cons_hook_args &arg, int id) {
if (id >= 0 && id < 4)
_cons_hook[id] = arg;
}
TCHAR *dir(int);
int dir_default(void);
TCHAR *platform_get(int n) {
return reinterpret_cast <TCHAR *>
(_platform(n, _PLATFORM_OP_GET));
}
int platform_default(void) {
return reinterpret_cast <int>
(_platform(0, _PLATFORM_OP_DEFAULT));
}
void platform_set(int n) { _platform(n, _PLATFORM_OP_SET); }
};
#define HPC_MENU (HpcMenuInterface::Instance())
#define HPC_PREFERENCE (HPC_MENU._pref)
#endif