1
0
mirror of https://github.com/gnosygnu/xowa.git synced 2024-09-28 22:40:50 +00:00

App_update: Add replace worker; add db auto-update

This commit is contained in:
gnosygnu 2016-11-23 09:35:26 -05:00
parent 103d005e62
commit fc55d0e2f9
13 changed files with 160 additions and 50 deletions

View File

@ -32,6 +32,12 @@ class Io_zip_decompress_cmd__jre extends Io_zip_decompress_cmd__base {
boolean resumed = resume_name != null;
long file_cur_in_raw = resumed ? resume_file : 0;
long file_max_in_raw = prog_ui.Prog_data_end();
// if no size provided, guess length as 5x orig
if (file_max_in_raw == -1) {
file_max_in_raw = 4 * Io_mgr.Instance.QueryFil(src_fil).Size();
}
ZipEntry entry = null;
byte[] buffer = new byte[4096];
Io_mgr.Instance.CreateDirIfAbsent(trg_dir); // NOTE: assert that trg_dir exists

View File

@ -33,6 +33,12 @@ public class Xoa_app_version_itm {
public String Url() {return url;} private final String url;
public String Summary() {return summary;} private final String summary;
public String Details() {return details;} private final String details;
public String Package_url() {
String folder = url;
if (String_.Len_eq_0(folder))
folder = "https://github.com/gnosygnu/xowa/releases/releases/tag";
return String_.Format("{0}/v{1}/xowa_app_{2}_v{1}.zip", folder, name, Xoa_app_.Op_sys_str);
}
public static final int Priority__major = 7, Priority__minor = 5, Priority__trivial = 3;
public static String Priority__to_name(int v) {

View File

@ -55,6 +55,12 @@ public class Xoa_app_version_tbl implements Db_tbl {
return (Xoa_app_version_itm[])list.To_ary_and_clear(Xoa_app_version_itm.class);
} finally {rdr.Rls();}
}
public Xoa_app_version_itm Select_by_version_or_null(String name) {
Db_rdr rdr = conn.Stmt_select(tbl_name, flds, fld__version_name).Crt_str(fld__version_name, name).Exec_select__rls_auto();
try {
return rdr.Move_next() ? Load(rdr) : null;
} finally {rdr.Rls();}
}
private Xoa_app_version_itm Load(Db_rdr rdr) {
return new Xoa_app_version_itm
( rdr.Read_int(fld__version_id)

View File

@ -20,7 +20,7 @@ import gplx.dbs.*; import gplx.dbs.utls.*;
public class Xoa_update_db_mgr {
public Xoa_update_db_mgr(Io_url url) {
this.url = url;
this.conn = Db_conn_bldr.Instance.Get_or_fail(url);
this.conn = Db_conn_bldr.Instance.Get_or_autocreate(true, url);
this.tbl__app_version = new Xoa_app_version_tbl(conn);
conn.Meta_tbl_assert(tbl__app_version);
}

View File

@ -19,19 +19,19 @@ package gplx.xowa.addons.apps.updates.js; import gplx.*; import gplx.xowa.*; imp
import gplx.core.gfobjs.*; import gplx.core.progs.*; import gplx.core.progs.rates.*;
import gplx.xowa.guis.cbks.*;
public class Xojs_wkr__base implements Gfo_prog_ui, Gfo_invk {
private long time_prv;
private double rate_cur;
private final Gfo_invk_cmd done_cbk;
private final Gfo_rate_list rate_list = new Gfo_rate_list(32);
private final long notify_delay = 1000;
private final double delta_threshold = .25d; // allow variance of up to 25% before updating rate
private final String js_cbk;
private final Gfo_invk_cmd done_cbk;
public Xojs_wkr__base(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk) {
private final String js_cbk, task_type;
private long time_prv;
private double rate_cur;
public Xojs_wkr__base(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, String task_type) {
this.cbk_mgr = cbk_mgr;
this.cbk_trg = cbk_trg;
this.js_cbk = js_cbk;
this.done_cbk = done_cbk;
this.task_type = task_type;
rate_list.Add(1024 * 1024, 1); // add default rate of 1 MB per second;
}
public void Exec() {
@ -79,7 +79,8 @@ public class Xojs_wkr__base implements Gfo_prog_ui, Gfo_invk {
this.data_cur = new_data_cur;
this.data_end = new_data_end;
cbk_mgr.Send_json(cbk_trg, js_cbk, Gfobj_nde.New().Add_long("prog_data_cur", data_cur).Add_long("prog_data_end", data_end).Add_int("prog_rate", (int)rate_cur));
cbk_mgr.Send_json(cbk_trg, js_cbk
, Gfobj_nde.New().Add_str("task_type", task_type).Add_long("prog_data_cur", data_cur).Add_long("prog_data_end", data_end).Add_int("prog_rate", (int)rate_cur));
return false;
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {

View File

@ -19,7 +19,7 @@ package gplx.xowa.addons.apps.updates.js; import gplx.*; import gplx.xowa.*; imp
import gplx.xowa.guis.cbks.*;
import gplx.core.net.downloads.*;
public class Xojs_wkr__download extends Xojs_wkr__base {
public Xojs_wkr__download(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, String src, Io_url trg, long src_len) {super(cbk_mgr, cbk_trg, js_cbk, done_cbk);
public Xojs_wkr__download(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, String src, Io_url trg, long src_len) {super(cbk_mgr, cbk_trg, js_cbk, done_cbk, "downloading");
this.src = src;
this.src_len = src_len;
this.trg = trg;

View File

@ -0,0 +1,45 @@
/*
XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012 gnosygnu@gmail.com
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.updates.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.xowa.guis.cbks.*;
public class Xojs_wkr__replace extends Xojs_wkr__base {
private final Io_url src_dir, trg_dir;
private final Io_url[] src_fils;
public Xojs_wkr__replace(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, Io_url src_dir, Io_url trg_dir) {super(cbk_mgr, cbk_trg, js_cbk, done_cbk, "unzipping");
this.src_dir = src_dir;
this.trg_dir = trg_dir;
this.src_fils = Io_mgr.Instance.QueryDir_args(src_dir).Recur_().ExecAsUrlAry();
this.Prog_data_end_(src_fils.length);
}
@Override protected void Exec_run() {
int len = src_fils.length;
for (int i = 0; i < len; i++) {
Io_url src_fil = src_fils[i];
Io_url trg_fil = trg_dir.GenSubFil(src_fil.GenRelUrl_orEmpty(src_dir));
// Io_url trg_fil_del = trg_fil.GenNewNameAndExt(trg_fil.NameAndExt() + ".del");
try {
// Io_mgr.Instance.DeleteFil(trg_fil);
// Io_mgr.Instance.MoveFil_args(src_fil, trg_fil, true).Exec();
Io_mgr.Instance.CopyFil(src_fil, trg_fil, true);
} catch (Exception exc) {
Tfds.Write(src_fil, Err_.Message_lang(exc));
}
}
}
}

View File

@ -19,11 +19,12 @@ package gplx.xowa.addons.apps.updates.js; import gplx.*; import gplx.xowa.*; imp
import gplx.xowa.guis.cbks.*;
import gplx.core.ios.zips.*;
public class Xojs_wkr__unzip extends Xojs_wkr__base {
private final Io_url src, trg;
public Xojs_wkr__unzip(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, Io_url src, Io_url trg, long prog_data_end) {super(cbk_mgr, cbk_trg, js_cbk, done_cbk);
public Xojs_wkr__unzip(Xog_cbk_mgr cbk_mgr, Xog_cbk_trg cbk_trg, String js_cbk, Gfo_invk_cmd done_cbk, Io_url src, Io_url trg, long prog_data_end) {super(cbk_mgr, cbk_trg, js_cbk, done_cbk, "unzipping");
this.src = src; this.trg = trg;
this.Prog_data_end_(prog_data_end);
}
public Io_url Src() {return src;} private final Io_url src;
public Io_url Trg() {return trg;} private final Io_url trg;
@Override protected void Exec_run() {
Io_zip_decompress_cmd decompress = Io_zip_decompress_cmd_.Proto.Make_new();
List_adp unzip_urls = List_adp_.New();

View File

@ -28,7 +28,7 @@ public class Xoa_update_bridge implements Bridge_cmd_itm {
switch (proc_id) {
case Proc__download:
Xoa_update_controller controller = new Xoa_update_controller();
controller.Update_app(app, args.Get_as_str("src"), args.Get_as_str("trg"), args.Get_as_long("src_len"));
controller.Update_app(app, args.Get_as_str("version"));
break;
default: throw Err_.new_unhandled_default(proc_id);
}

View File

@ -17,27 +17,51 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.addons.apps.updates.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.xowa.guis.cbks.*;
import gplx.xowa.addons.apps.updates.js.*;
import gplx.core.gfobjs.*;
import gplx.xowa.addons.apps.updates.dbs.*; import gplx.xowa.addons.apps.updates.js.*;
class Xoa_update_controller implements Gfo_invk {
public void Update_app(Xoa_app app, String src, String trg_str, long src_len) {
Io_url trg = Io_url_.new_any_(trg_str);
Xog_cbk_mgr cbk_mgr = app.Gui__cbk_mgr();
Xog_cbk_trg cbk_trg = Xog_cbk_trg.New(Xoa_update_special.Prototype.Special__meta().Ttl_bry());
Xojs_wkr__download download_wkr = new Xojs_wkr__download(cbk_mgr, cbk_trg, "xo.app_updater.download__prog", Gfo_invk_cmd.New_by_key(this, Invk__download_done), src, trg, src_len);
public void Update_app(Xoa_app app, String version_name) {
// get app_version from db
Io_url update_dir = app.Fsys_mgr().Root_dir().GenSubDir_nest("user", "app", "update");
Io_url update_db_fil = update_dir.GenSubFil_nest("xoa_update.sqlite3");
Xoa_update_db_mgr db_mgr = new Xoa_update_db_mgr(update_db_fil);
Xoa_app_version_itm version_itm = db_mgr.Tbl__app_version().Select_by_version_or_null(version_name);
// get src, trg, etc..
String src = version_itm.Package_url();
Io_url trg = update_dir.GenSubFil_nest("temp", version_itm.Name(), version_itm.Name() + ".zip");
Io_mgr.Instance.DeleteDirDeep(trg.OwnerDir());
long src_len = -1;
// start download
Xojs_wkr__download download_wkr = new Xojs_wkr__download
( app.Gui__cbk_mgr(), Xog_cbk_trg.New(Xoa_update_special.Prototype.Special__meta().Ttl_bry())
, "xo.app_updater.download__prog", Gfo_invk_cmd.New_by_key(this, Invk__download_done), src, trg, src_len);
download_wkr.Exec_async("app_updater");
}
private void On_download_done(GfoMsg m) {
Xojs_wkr__download download_wkr = (Xojs_wkr__download)m.ReadObj("v");
Io_url trg = download_wkr.Trg();
Xojs_wkr__unzip unzip_wkr = new Xojs_wkr__unzip(download_wkr.Cbk_mgr(), download_wkr.Cbk_trg(), "xo.app_updater.download__prog", Gfo_invk_cmd.New_by_key(this, Invk__unzip_done), trg, trg.OwnerDir().GenSubDir(trg.NameOnly()), download_wkr.Prog_data_end());
Io_url src = download_wkr.Trg();
Io_url trg = src.OwnerDir().GenSubDir(src.NameOnly() + "_unzip");
Xojs_wkr__unzip unzip_wkr = new Xojs_wkr__unzip(download_wkr.Cbk_mgr(), download_wkr.Cbk_trg(), "xo.app_updater.download__prog", Gfo_invk_cmd.New_by_key(this, Invk__unzip_done), src, trg, -1);
unzip_wkr.Exec_async("app_updater");
}
private void On_unzip_done(GfoMsg m) {
Xojs_wkr__unzip unzip_wkr = (Xojs_wkr__unzip)m.ReadObj("v");
Io_url src = unzip_wkr.Trg();
Io_url trg = Io_url_.new_dir_("D:\\xowa_temp\\");
Xojs_wkr__replace replace_wkr = new Xojs_wkr__replace(unzip_wkr.Cbk_mgr(), unzip_wkr.Cbk_trg(), "xo.app_updater.download__prog", Gfo_invk_cmd.New_by_key(this, Invk__replace_done), src, trg);
replace_wkr.Exec_async("app_updater");
}
private void On_replace_done(GfoMsg m) {
Xojs_wkr__replace replace_wkr = (Xojs_wkr__replace)m.ReadObj("v");
replace_wkr.Cbk_mgr().Send_json(replace_wkr.Cbk_trg(), "xo.app_updater.download__prog", Gfobj_nde.New().Add_bool("done", true));
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__download_done)) On_download_done(m);
else if (ctx.Match(k, Invk__unzip_done)) On_unzip_done(m);
else if (ctx.Match(k, Invk__replace_done)) On_replace_done(m);
else return Gfo_invk_.Rv_unhandled;
return this;
} private static final String Invk__download_done = "download_done", Invk__unzip_done = "unzip_done";
} private static final String Invk__download_done = "download_done", Invk__unzip_done = "unzip_done", Invk__replace_done = "replace_done";
}

View File

@ -22,38 +22,44 @@ class Xoa_update_html extends Xow_special_wtr__base {
@Override protected Io_url Get_addon_dir(Xoa_app app) {return app.Fsys_mgr().Http_root().GenSubDir_nest("bin", "any", "xowa", "addon", "app", "update");}
@Override protected Io_url Get_mustache_fil(Io_url addon_dir) {return addon_dir.GenSubFil_nest("bin", "xoa_update.mustache.html");}
@Override protected Mustache_doc_itm Bld_mustache_root(Xoa_app app) {
Io_url update_db_url = Get_addon_dir(app).GenSubFil("xoa_update.sqlite3");
Xoa_update_db_mgr db_mgr = new Xoa_update_db_mgr(update_db_url);
return Load(app, db_mgr);
return Load(app);
}
private static Mustache_doc_itm Load(Xoa_app app, Xoa_update_db_mgr db_mgr) {
private static Mustache_doc_itm Load(Xoa_app app) {
Io_url update_db_url = app.Fsys_mgr().Root_dir().GenSubFil_nest("user", "app", "update", "xoa_update.sqlite3");
// get from internet
if (gplx.core.ios.IoEngine_system.Web_access_enabled) {
Io_url trg_url = db_mgr.Url();
String src_url = "http://xowa.org/admin/app_update/xoa_update.sqlite3";
Io_mgr.Instance.DownloadFil(src_url, trg_url);
boolean web_access_enabled = gplx.core.ios.IoEngine_system.Web_access_enabled;
if (web_access_enabled) {
// check text file to see if version changed
Io_url trg_summary_fil = update_db_url.OwnerDir().GenSubFil("xoa_update.txt");
int trg_summary_version = Int_.parse_or(Io_mgr.Instance.LoadFilStr(trg_summary_fil), -1);
// String src_summary_server = "http://xowa.org";
String src_summary_server = "http://localhost/xowa.org";
int src_summary_version = Bry_.To_int(Io_mgr.Instance.DownloadFil_args("", Io_url_.Empty).Exec_as_bry(src_summary_server + "/admin/app_update/xoa_update.txt"));
// download database
if (src_summary_version > trg_summary_version) {
String src_details_url = src_summary_server + "/admin/app_update/xoa_update.sqlite3";
Io_url trg_details_url = update_db_url;
Io_mgr.Instance.DownloadFil(src_details_url, trg_details_url);
Io_mgr.Instance.SaveFilStr(trg_summary_fil, Int_.To_str(src_summary_version));
}
}
// load from db
Xoa_update_db_mgr db_mgr = new Xoa_update_db_mgr(update_db_url);
String check_date = app.User().User_db_mgr().Cfg().Get_app_str_or("app.updater.last_check", null);
if (check_date == null) check_date = Datetime_now.Get().XtoStr_fmt_yyyy_MM_dd_HH_mm_ss();
Xoa_app_version_itm[] db_itms = db_mgr.Tbl__app_version().Select_by_date(Xoa_app_.Build_date);
String build_date = String_.Mid(Xoa_app_.Build_date, 0, String_.FindFwd(Xoa_app_.Build_date, " "));
if (db_itms.length == 0) return new Xoa_update_itm__root(Xoa_app_.Version, build_date, check_date, "", "", "", Xoa_app_version_itm.Priority__trivial, "", "");
if (db_itms.length == 0) return new Xoa_update_itm__root(Xoa_app_.Version, build_date, "", check_date, web_access_enabled, "", "", Xoa_app_version_itm.Priority__trivial, "", "");
// convert to gui itm
Xoa_app_version_itm db_itm = db_itms[0];
String download_url = Gen_download_url(db_itm.Url(), db_itm.Name());
Xoa_update_itm__root root = new Xoa_update_itm__root(Xoa_app_.Version, build_date, download_url, check_date, db_itm.Name(), db_itm.Date(), db_itm.Priority(), db_itm.Summary(), db_itm.Details());
Xoa_update_itm__root root = new Xoa_update_itm__root(Xoa_app_.Version, build_date, db_itm.Package_url(), check_date, web_access_enabled, db_itm.Name(), db_itm.Date(), db_itm.Priority(), db_itm.Summary(), db_itm.Details());
root.Itms_(To_gui_itm(db_itms));
return root;
}
private static String Gen_download_url(String version_url, String version_name) {
String folder = version_url;
if (String_.Len_eq_0(folder))
folder = "https://github.com/gnosygnu/xowa/releases/download/v"; // + 3.11.2.1/xowa_app_windows_64_v3.11.2.1.zip";
return String_.Format("{0}{1}/xowa_app_{2}_v{2}.zip", folder, version_name, Xoa_app_.Op_sys_str);
}
private static Xoa_update_itm__leaf[] To_gui_itm(Xoa_app_version_itm[] db_itms) {
int len = db_itms.length;
Xoa_update_itm__leaf[] rv = new Xoa_update_itm__leaf[len];
@ -68,12 +74,13 @@ class Xoa_update_html extends Xow_special_wtr__base {
@Override protected void Bld_tags(Xoa_app app, Io_url addon_dir, Xopage_html_data page_data) {
Xopg_tag_mgr head_tags = page_data.Head_tags();
Xopg_tag_wtr_.Add__xocss (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xohelp (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xolog (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xoajax (head_tags, app.Fsys_mgr().Http_root(), app);
Xopg_alertify_.Add_tags (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xoajax (head_tags, app.Fsys_mgr().Http_root(), app);
Xopg_tag_wtr_.Add__core (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xocss (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xohelp (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xolog (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__gui__progbars (head_tags, app.Fsys_mgr().Http_root());
Xopg_tag_wtr_.Add__xoajax (head_tags, app.Fsys_mgr().Http_root(), app);
Xopg_alertify_.Add_tags (head_tags, app.Fsys_mgr().Http_root());
head_tags.Add(Xopg_tag_itm.New_css_file(addon_dir.GenSubFil_nest("bin", "xoa_update.css")));
head_tags.Add(Xopg_tag_itm.New_js_file(addon_dir.GenSubFil_nest("bin", "xoa_update.js")));

View File

@ -18,15 +18,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
package gplx.xowa.addons.apps.updates.specials; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*;
import gplx.langs.mustaches.*;
class Xoa_update_itm__root extends Xoa_update_itm__leaf { private final String current_version, current_date, download_url, check_date;
private final boolean web_access_enabled;
private Xoa_update_itm__leaf[] itms = Xoa_update_itm__leaf.Ary__empty;
public Xoa_update_itm__root
( String current_version, String current_date, String download_url, String check_date
( String current_version, String current_date, String download_url, String check_date, boolean web_access_enabled
, String version, String date, int priority, String summary, String details
) {super(version, date, priority, summary, details);
this.current_version = current_version;
this.current_date = current_date;
this.download_url = download_url;
this.check_date = check_date;
this.web_access_enabled = web_access_enabled;
}
public void Itms_(Xoa_update_itm__leaf[] v) {
this.itms = v;
@ -38,9 +40,10 @@ class Xoa_update_itm__root extends Xoa_update_itm__leaf { private final Stri
else if (String_.Eq(k, "check_date")) bfr.Add_str_u8(check_date);
return super.Mustache__write (k, bfr);
}
@Override public Mustache_doc_itm[] Mustache__subs(String key) {
if (String_.Eq(key, "itms")) return itms;
else if (String_.Eq(key, "itms_exist")) return Mustache_doc_itm_.Ary__bool(itms.length > 0);
return super.Mustache__subs(key);
@Override public Mustache_doc_itm[] Mustache__subs(String k) {
if (String_.Eq(k, "itms")) return itms;
else if (String_.Eq(k, "itms_exist")) return Mustache_doc_itm_.Ary__bool(itms.length > 0);
else if (String_.Eq(k, "web_access_enabled")) return Mustache_doc_itm_.Ary__bool(web_access_enabled);
return super.Mustache__subs(k);
}
}

View File

@ -16,7 +16,12 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gplx.xowa.wikis.pages.tags; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.pages.*;
public class Xopg_tag_wtr_{
public class Xopg_tag_wtr_ {
public static void Add__core(Xopg_tag_mgr head_tags, Io_url http_root) {
Io_url css_dir = http_root.GenSubDir_nest("bin", "any", "xowa", "html", "res", "src", "xowa", "core");
head_tags.Add(Xopg_tag_itm.New_js_file(css_dir.GenSubFil_nest("Namespace_.js")));
head_tags.Add(Xopg_tag_itm.New_js_file(css_dir.GenSubFil_nest("String_.js")));
}
public static void Add__xocss(Xopg_tag_mgr head_tags, Io_url http_root) {
Io_url css_dir = http_root.GenSubDir_nest("bin", "any", "xowa", "html", "res", "src", "xowa", "xocss", "core");
head_tags.Add(Xopg_tag_itm.New_css_file(css_dir.GenSubFil_nest("xocss_core-0.0.1.css")));
@ -38,6 +43,12 @@ public class Xopg_tag_wtr_{
head_tags.Add(Xopg_tag_itm.New_js_file(dir.GenSubFil_nest(Get_app_js_file(app))));
head_tags.Add(Xopg_tag_itm.New_js_file(dir.GenSubFil_nest("xo.server.js")));
}
public static void Add__gui__progbars(Xopg_tag_mgr head_tags, Io_url http_root) {
Io_url dir = http_root.GenSubDir_nest("bin", "any", "xowa", "html", "res", "src", "xowa", "gui", "progbars");
head_tags.Add(Xopg_tag_itm.New_css_file(dir.GenSubFil_nest("Progbar.css")));
head_tags.Add(Xopg_tag_itm.New_js_file(dir.GenSubFil_nest("Progbar.js")));
head_tags.Add(Xopg_tag_itm.New_js_file(dir.GenSubFil_nest("Progbar_util.js")));
}
private static String Get_app_js_file(Xoa_app app) {
if (app.Mode().Tid_is_http()) return "xo.app.http_server.js";
return gplx.core.envs.Op_sys.Cur().Tid_is_drd() ? "xo.app.drd.js" : "xo.app.swt.js";