/* XOWA: the XOWA Offline Wiki Application Copyright (C) 2012-2017 gnosygnu@gmail.com XOWA is licensed under the terms of the General Public License (GPL) Version 3, or alternatively under the terms of the Apache License Version 2.0. You may use XOWA according to either of these licenses as is most appropriate for your project on a case-by-case basis. The terms of each license can be found in the source code repository: GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt */ package gplx.xowa.apps.boots; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*; import gplx.core.consoles.*; import gplx.core.envs.*; import gplx.dbs.*; import gplx.gfui.*; import gplx.gfui.kits.core.*; import gplx.xowa.guis.views.boots.*; import gplx.xowa.langs.*; import gplx.xowa.users.*; public class Xoa_boot_mgr { private Gfo_usr_dlg usr_dlg; private Gfo_usr_dlg__log log_wtr; public void Run(String[] args, Xoa_cmd_arg_mgr arg_mgr) { try { Init_env(args); if (arg_mgr.Process(usr_dlg, args, Env_.AppUrl().OwnerDir())) Run_app(arg_mgr); } catch (Exception e) { String err_str = Err_.Message_gplx_full(e); log_wtr.Log_to_err(err_str); Console_adp__sys.Instance.Write_str_w_nl(err_str); if (log_wtr.Log_dir() == null) log_wtr.Log_dir_(Env_.AppUrl().OwnerDir().GenSubFil("xowa.log")); log_wtr.Queue_enabled_(false); } } private void Init_env(String[] args) { // add global loggers Gfo_usr_dlg_.Instance = usr_dlg = Xoa_app_.New__usr_dlg__console(); Gfo_log_.Instance__set(new gplx.xowa.apps.shells.Gfo_log__console()); log_wtr = usr_dlg.Log_wkr(); log_wtr.Log_to_session_fmt("env.init: version=~{0}", Xoa_app_.Version); // init env GfuiEnv_.Init_swt(args, Xoa_app_.class); Io_url jar_url = Env_.AppUrl(); Xoa_app_.Build_date = Io_mgr.Instance.QueryFil(jar_url).ModifiedTime().XtoUtc().XtoStr_fmt(Xoa_app_.Build_date_fmt); log_wtr.Log_to_session_fmt("env.init: jar_url=~{0}; build_date=~{1}", jar_url.NameAndExt(), Xoa_app_.Build_date); log_wtr.Log_to_session_fmt("env.init: op_sys=~{0}", Op_sys.Cur().To_str()); } private void Run_app(Xoa_cmd_arg_mgr arg_mgr) { boolean app_type_is_gui = false; Xoae_app app = null; try { // pull vars from command-line args Io_url root_dir = arg_mgr.Fsys__root_dir(); Xoa_app_.Op_sys_str = arg_mgr.Fsys__bin_dir(); Xoa_app_.User_agent = String_.Format("XOWA/{0} ({1}) [gnosygnu@gmail.com]", Xoa_app_.Version, Xoa_app_.Op_sys_str); // prep splash window Xoa_app_mode app_type = arg_mgr.App_type(); app_type_is_gui = app_type.Tid_is_gui(); Xog_splash_win splash_win = new Xog_splash_win(app_type_is_gui); // change default db from mock to sqlite Db_conn_bldr.Instance.Reg_default_sqlite(); // ctor app app = new Xoae_app(usr_dlg, app_type , root_dir , arg_mgr.Fsys__wiki_dir() , root_dir.GenSubDir("file") , arg_mgr.Fsys__user_dir() , root_dir.GenSubDir_nest("user", "anonymous", "wiki") , Xoa_app_.Op_sys_str); usr_dlg.Log_wkr().Queue_enabled_(false); // NOTE: needs to be called after new Xoae_app app.Addon_mgr().Add_dflts_by_app(app).Run_by_app(app); try { app.Sys_cfg().Lang_(System_lang()); String launch_url = arg_mgr.Gui__home_page(); if (launch_url != null) gplx.xowa.guis.views.Xog_startup_tabs.Manual = launch_url; // prep tcp-server Gfo_usr_dlg_.Instance.Log_wkr().Log_to_session_fmt("app.boot:servers"); app.Tcp_server().Rdr_port_(arg_mgr.Tcp__port_recv()).Wtr_port_(arg_mgr.Tcp__port_send()); // prep http-server gplx.xowa.apps.servers.http.Http_server_mgr server_mgr = app.Http_server(); server_mgr.Port_(arg_mgr.Http__port()); server_mgr.Home_(Bry_.new_u8(arg_mgr.Http__home_page())); server_mgr.Wkr_pool().Init(arg_mgr.Http__max_clients(), arg_mgr.Http__max_clients_timeout()); Gfo_usr_dlg_.Instance.Log_wkr().Log_to_session_fmt("app.boot:app.init"); app.Init_by_app(); } catch (Exception e) {usr_dlg.Warn_many("", "", "app init failed: ~{0}", Err_.Message_gplx_full(e));} app.Usr_dlg().Log_wkr_(app.Log_wtr()); // NOTE: log_wtr must be set for cmd-line (else process will fail); // run gfs; prefs.gfs and app.gfs Gfo_usr_dlg_.Instance.Log_wkr().Log_to_session_fmt("app.boot:gfs.run"); Io_url cmd_file = arg_mgr.Cmd__file(); try {app.Gfs_mgr().Run_url(cmd_file);} catch (Exception e) { usr_dlg.Warn_many("", "", "script file failed: ~{0} ~{1}", cmd_file.Raw(), Err_.Message_gplx_full(e)); if (app_type_is_gui) GfuiEnv_.ShowMsg(Err_.Message_gplx_full(e)); } // launch Gfo_usr_dlg_.Instance.Log_wkr().Log_to_session_fmt("app.boot:app.launch"); app.Launch(); if (app_type.Tid_is_tcp()) app.Tcp_server().Run(); else if (app_type.Tid_is_http()) app.Http_server().Run(); else { String cmd_text = arg_mgr.Cmd__text(); if (cmd_text != null) { gplx.xowa.apps.servers.Gxw_html_server.Init_gui_for_server(app, null); // NOTE: must init kit else "app.shell.fetch_page" will fail; DATE:2015-04-30 Console_adp__sys.Instance.Write_str_w_nl_utf8(Object_.Xto_str_strict_or_empty(app.Gfs_mgr().Run_str(cmd_text))); } if (app_type_is_gui) app.Gui_mgr().Run(splash_win); else // teardown app, else lua will keep process running gplx.xowa.xtns.scribunto.Scrib_core_mgr.Term_all(app); } } catch (Exception e) {usr_dlg.Warn_many("", "", "app launch failed: ~{0}", Err_.Message_gplx_full(e));} finally { if (app != null && app_type_is_gui) // only cancel if app_type_is_gui is true; (force cmd_line to end process) app.Setup_mgr().Cmd_mgr().Canceled_y_(); } } private static byte[] System_lang() { String lang_code = System_.Prop__user_language(); byte[] lang_code_bry = Bry_.new_a7(lang_code); Xol_lang_stub lang_itm = Xol_lang_stub_.Get_by_key_or_null(lang_code_bry); return lang_itm == null ? Xol_lang_itm_.Key_en : lang_itm.Key(); } }