#include #include #include "kolibrios/kolibri_debug.h" #include "kolibrios/kolibri_gui.h" #include "utils/errors.h" #include "utils/messages.h" #include "utils/filepath.h" #include "utils/nsoption.h" #include "utils/nsurl.h" #include "netsurf/window.h" #include "netsurf/misc.h" #include "netsurf/netsurf.h" #include "netsurf/bitmap.h" #include "netsurf/plot_style.h" #include "utils/file.h" #include "netsurf/utf8.h" #include "netsurf/search.h" #include "content/backing_store.h" #include "kolibrios/kolibri_http.h" #include #include #include #include "utils/utils.h" #include "utils/nsoption.h" #include "utils/filepath.h" #include "utils/log.h" #include "utils/messages.h" #include "desktop/textinput.h" #include "desktop/browser_history.h" #include "kolibrios/fb/gui.h" #include "kolibrios/fb/fbtk.h" #include "kolibrios/fb/framebuffer.h" #include "kolibrios/fb/schedule.h" #include "kolibrios/fb/findfile.h" #include "kolibrios/fb/image_data.h" #include "kolibrios/fb/font.h" #include "kolibrios/fb/clipboard.h" #include "kolibrios/fb/fetch.h" #include "kolibrios/fb/bitmap.h" /************************************************** Make life easier with these path specifiers here. ***************************************************/ /* #define KOLIBRI_FONTFILE "/usbhd0/1/kolibrios/res/sans.ttf" */ /* #define KOLIBRI_RESPATH "/usbhd0/1/kolibrios/res/" */ /* #define FILE_KOLIBRI_RESPATH "file:///usbhd0/1/kolibrios/res/" */ /************************************************/ char **respaths; /** resource search path vector */ extern struct gui_browser_table framebuffer_browser_table; extern struct gui_window_table framebuffer_window_table ; extern struct gui_clipboard_table *framebuffer_clipboard_table ; extern struct gui_fetch_table *framebuffer_fetch_table ; extern struct gui_utf8_table *framebuffer_utf8_table ; extern struct gui_bitmap_table *framebuffer_bitmap_table ; extern const char *fename; extern int febpp; extern int fewidth; extern int feheight; extern const char *feurl; extern bool nslog_stream_configure(FILE *fptr); extern struct fbtk_bitmap pointer_image; extern fbtk_widget_t *fbtk; static void die(const char *error) { debug_board_write_str(error); debug_board_write_str('\n'); exit(1); } /* Inspired from monkey, but without the GTK bloat */ static char **nskolibri_init_resource(const char *resource_path) { char **langv = {"de", "en_US", "en", "C"}; char **pathv; /* resource path string vector */ char **respath; /* resource paths vector */ pathv = filepath_path_to_strvec(resource_path); respath = filepath_generate(pathv, langv); filepath_free_strvec(pathv); return respath; } static nserror set_defaults(struct nsoption_s *defaults) { /* Set defaults for absent option strings */ nsoption_setnull_charp(cookie_file, *respaths); nsoption_setnull_charp(cookie_jar, *respaths); //TODO: This creates an nsoptions error in macro expansion... return NSERROR_OK; } /** * Main entry point from Kolibri OS. */ extern struct http_msg; static struct gui_misc_table framebuffer_misc_table = { .schedule = framebuffer_schedule, .warning = fb_warn_user, .quit = gui_quit, }; int main(int argc, char** argv) { struct browser_window *bw; char *options; char *messages; nsurl *url; nserror ret; nsfb_t *nsfb; struct netsurf_table kolibrios_table = { .misc = &kolibrios_misc_table, .window = &kolibrios_window_table, .clipboard = kolibrios_clipboard_table, .fetch = kolibrios_fetch_table, .utf8 = kolibrios_utf8_table, .bitmap = kolibrios_bitmap_table, .layout = kolibrios_layout_table, }; /* Initialize HTTP Library */ ret = kolibri_http_init(); if (ret == 0) debug_board_write_str("Netsurf: KolibriOS HTTP Library Initialized.\n"); else { debug_board_write_str("Netsurf: HTTP Library initialization failed..\n"); return ret; } /* Initialize BoxLib Library for GUI textboxes, etc */ ret = kolibri_gui_init(); if (ret == 0) debug_board_write_str("Netsurf: KolibriOS BOXLIB Library Initialized.\n"); else { debug_board_write_str("Netsurf: BOXLIB Library initialization failed..\n"); return ret; } /* End of KolibriOS specific libraries initialization phase */ debug_board_write_str("Netsurf: Trying to register nskolibri_table.\n"); ret = netsurf_register(&kolibrios_table); if (ret != NSERROR_OK) { die("NetSurf operation table failed registration"); } /* Drop the last slash if caller provided it. */ char current_dir[100]; int i = 0; for(i = strlen(argv[0]); i>=0; i--) { if(argv[0][i]=='/') { strncpy(current_dir, argv[0], i+1); i++; current_dir[i++] = 'r'; current_dir[i++] = 'e'; current_dir[i++] = 's'; current_dir[i++] = '\0'; break; } } respaths = (char **) malloc(sizeof(char **)); *respaths = malloc(i); strcpy(*respaths, current_dir); debug_board_write_str("\nCWD: "); debug_board_write_str(*respaths); debug_board_write_str("\n"); /* __asm__ __volatile__("int3"); */ /* initialise logging. Not fatal if it fails but not much we * can do about it either. */ nslog_init(nslog_stream_configure, &argc, argv); /* user options setup */ ret = nsoption_init(set_defaults, &nsoptions, &nsoptions_default); if (ret != NSERROR_OK) { die("Options failed to initialise"); } options = filepath_find(respaths, "Choices"); nsoption_read(options, nsoptions); free(options); nsoption_commandline(&argc, argv, nsoptions); /* message init */ messages = filepath_find(respaths, "Messages"); ret = messages_add_from_file(messages); free(messages); if (ret != NSERROR_OK) { debug_board_write_str("Message translations failed to load\n"); } /* common initialisation */ ret = netsurf_init(NULL); if (ret != NSERROR_OK) { die("NetSurf failed to initialise"); } /* Override, since we have no support for non-core SELECT menu */ nsoption_set_bool(core_select_menu, true); /* Do we really need to parse command line in KolibriOS? Most users will use the GUI to trigger NS . TODO: Look at this later. */ /* if (process_cmdline(argc,argv) != true) */ /* die("unable to process command line.\n"); */ /* Move the initialization stuff from process_cmdline() to here */ /* fename = "sdl"; */ extern nsfb_surface_rtns_t kolibri_rtns; _nsfb_register_surface(NSFB_SURFACE_KOLIBRI, &kolibri_rtns, "kolibri"); extern nsfb_surface_rtns_t ram_rtns; _nsfb_register_surface(NSFB_SURFACE_RAM, &ram_rtns, "ram"); /* fewidth = nsoption_int(window_width); */ /* if (fewidth <= 0) { */ /* fewidth = 800; */ /* } */ /* feheight = nsoption_int(window_height); */ /* if (feheight <= 0) { */ /* feheight = 600; */ /* } */ fename = "kolibri"; febpp = 32; fewidth = 800; feheight = 600; // feurl = "board.kolibrios.org/ucp.php?i=pm&mode=compose"; feurl = "ashmew2.me"; /* feurl = "kolibrios.org"; */ /* feurl = "file://usbhd0/1/kolibrios/res/welcome.html"; */ nsfb = framebuffer_initialise(fename, fewidth, feheight, febpp); if (nsfb == NULL) die("Unable to initialise framebuffer"); framebuffer_set_cursor(&pointer_image); if (fb_font_init() == false) die("Unable to initialise the font system"); fbtk = fbtk_init(nsfb); fbtk_enable_oskb(fbtk); urldb_load_cookies(nsoption_charp(cookie_file)); /* create an initial browser window */ debug_board_write_str("calling browser_window_create\n"); ret = nsurl_create(feurl, &url); if (ret == NSERROR_OK) { ret = browser_window_create(BW_CREATE_HISTORY, url, NULL, NULL, &bw); nsurl_unref(url); } if (ret != NSERROR_OK) { warn_user(messages_get_errorcode(ret), 0); } else { debug_board_write_str("calling framebuffer run\n"); framebuffer_run(); debug_board_write_str("framebuffer run returned. \n"); debug_board_write_str("Killing browser window.\n"); browser_window_destroy(bw); } debug_board_write_str("Calling netsurf_exit()\n"); netsurf_exit(); if (fb_font_finalise() == false) LOG("Font finalisation failed."); /* finalise options */ nsoption_finalise(nsoptions, nsoptions_default); free(*respaths); free(respaths); return 0; }