diff --git a/400_xowa/src/gplx/xowa/Xoa_app_.java b/400_xowa/src/gplx/xowa/Xoa_app_.java
index 6eb1d35b3..9cf14dd90 100644
--- a/400_xowa/src/gplx/xowa/Xoa_app_.java
+++ b/400_xowa/src/gplx/xowa/Xoa_app_.java
@@ -34,6 +34,7 @@ public class Xoa_app_ {
public static final String Name = "xowa";
public static final String Version = "4.0.0.1701"; // RELEASE:2017-01-03 20:30
public static String Build_date = "2012-12-30 00:00:00";
+ public static String Build_date_fmt = "yyyy-MM-dd HH:mm";
public static String Op_sys_str;
public static String User_agent = "";
diff --git a/400_xowa/src/gplx/xowa/Xoae_app.java b/400_xowa/src/gplx/xowa/Xoae_app.java
index 116b1dd9d..21d0822fe 100644
--- a/400_xowa/src/gplx/xowa/Xoae_app.java
+++ b/400_xowa/src/gplx/xowa/Xoae_app.java
@@ -44,7 +44,7 @@ public class Xoae_app implements Xoa_app, Gfo_invk {
url_cmd_eval = new Xoa_fsys_eval(fsys_mgr, user.Fsys_mgr());
fsys_mgr.Init_by_app(prog_mgr);
log_wtr.Log_dir_(user.Fsys_mgr().App_temp_dir().GenSubDir("log"));
- this.gfs_mgr = new Xoa_gfs_mgr(this, fsys_mgr);
+ this.gfs_mgr = new Xoa_gfs_mgr(user.Key(), this, fsys_mgr);
lang_mgr = new Xoa_lang_mgr(this, gfs_mgr);
wiki_mgr = new Xoae_wiki_mgr(this);
gui_mgr = new Xoa_gui_mgr(this);
@@ -162,13 +162,18 @@ public class Xoae_app implements Xoa_app, Gfo_invk {
special_mgr.Init_by_app(this);
sys_cfg.Init_by_app(this);
}
- public boolean Launch_done() {return stage == Xoa_stage_.Tid_launch;}
public void Launch() {
- if (Launch_done()) return;
- xwiki_mgr__sitelink_mgr.Init_by_app();
+ // guard against circular calls; probably no longer needed
+ if (stage == Xoa_stage_.Tid_launch) return;
stage = Xoa_stage_.Tid_launch;
- gplx.xowa.addons.apps.cfgs.upgrades.Xocfg_upgrade_mgr.Convert(this);
- gplx.xowa.apps.setups.Xoa_setup_mgr.Setup_run_check(this); log_bfr.Add("app.upgrade.done");
+
+ // run app-launch actions
+ gplx.xowa.apps.setups.Xoa_setup_mgr.Launch(this);
+
+ // init "In other langs"
+ xwiki_mgr__sitelink_mgr.Init_by_app();
+
+ // init user wiki
user.Wiki().Init_assert(); // NOTE: must assert wiki and load langs first, else will be asserted during Portal_mgr().Init(), which will cause IndexOutOfBounds; DATE:2014-10-04
gplx.xowa.addons.users.wikis.regys.Xou_regy_addon.Init(this);
}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java
index aa4bb4d03..4a2e23c3d 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/Xocfg_mgr.java
@@ -63,6 +63,10 @@ public class Xocfg_mgr implements Gfo_invk {
String rv = cache_mgr.Get_or(Ctx__app, key, null);
return rv == null ? or : Long_.parse_or(rv, or);
}
+ public DateAdp Get_date_app_or(String key, DateAdp or) {
+ String rv = cache_mgr.Get_or(Ctx__app, key, null);
+ return rv == null ? or : DateAdp_.parse_fmt_or(rv, Fmt__time, or);
+ }
public String[] Get_strary_app_or(String key, String dlm, String... or) {
String rv = cache_mgr.Get_or(Ctx__app, key, null);
return rv == null ? or : String_.Ary_parse(String_.Trim(rv), dlm);
@@ -111,8 +115,11 @@ public class Xocfg_mgr implements Gfo_invk {
public void Set_bool_app(String key, boolean val) {Set_str(Xocfg_mgr.Ctx__app, key, Yn.To_str(val));}
public void Set_float_app(String key, float val) {Set_str(Xocfg_mgr.Ctx__app, key, Float_.To_str(val));}
public void Set_str_app(String key, String val) {Set_str(Xocfg_mgr.Ctx__app, key, val);}
+ public void Set_date_app(String key, DateAdp val) {Set_str(Xocfg_mgr.Ctx__app, key, val.XtoStr_fmt(Fmt__time));}
public void Set_int_app(String key, int val) {Set_str(Xocfg_mgr.Ctx__app, key, Int_.To_str(val));}
public void Set_bry_wiki(Xowe_wiki wiki, String key, byte[] val) {Set_str(wiki.Domain_itm().Abrv_xo_str(), key, String_.new_u8(val));}
+
+
public void Set_str(String ctx, String key, String val) {
cache_mgr.Set(ctx, key, val);
}
@@ -139,4 +146,5 @@ public class Xocfg_mgr implements Gfo_invk {
}
return rv;
}
+ private static final String Fmt__time = "yyyy-MM-dd HH:mm:ss";
}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/dflts/Xocfg_dflt_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/dflts/Xocfg_dflt_mgr.java
index 026412b25..184b591c0 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/dflts/Xocfg_dflt_mgr.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/mgrs/dflts/Xocfg_dflt_mgr.java
@@ -36,8 +36,8 @@ public class Xocfg_dflt_mgr {
hash.Add_if_dupe_use_nth(key, invk);
}
}
- public static void Run_os_gfs(gplx.xowa.apps.gfs.Xoa_gfs_mgr gfs_mgr, gplx.xowa.apps.fsys.Xoa_fsys_mgr fsys_mgr) {
- Io_url url = fsys_mgr.Root_dir().GenSubFil_nest("user", "anonymous", "app", "cfg", "os.gfs");
+ public static void Run_os_gfs(String user_name, gplx.xowa.apps.gfs.Xoa_gfs_mgr gfs_mgr, gplx.xowa.apps.fsys.Xoa_fsys_mgr fsys_mgr) {
+ Io_url url = fsys_mgr.Root_dir().GenSubFil_nest("user", user_name, "app", "cfg", "os.gfs");
if (!Io_mgr.Instance.ExistsFil(url)) {
Io_url dflt_url = fsys_mgr.Bin_plat_dir().GenSubFil_nest("xowa", "cfg", "os.default.gfs");
if (Io_mgr.Instance.ExistsFil(dflt_url)) // TEST: also, DRD
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_bridge.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_bridge.java
index b67190a81..769d58fbf 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_bridge.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/specials/edits/services/Xocfg_edit_bridge.java
@@ -16,8 +16,7 @@ You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
package gplx.xowa.addons.apps.cfgs.specials.edits.services; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.cfgs.specials.*; import gplx.xowa.addons.apps.cfgs.specials.edits.*;
-import gplx.langs.jsons.*;
-import gplx.xowa.htmls.bridges.*;
+import gplx.langs.jsons.*; import gplx.xowa.htmls.bridges.*;
public class Xocfg_edit_bridge implements Bridge_cmd_itm {
private Xocfg_edit_svc svc;
public void Init_by_app(Xoa_app app) {
diff --git a/400_xowa/src/gplx/xowa/addons/apps/cfgs/upgrades/Xocfg_upgrade_mgr.java b/400_xowa/src/gplx/xowa/addons/apps/cfgs/upgrades/Xocfg_upgrade_mgr.java
index 16a6ee1f2..1afb1db05 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/cfgs/upgrades/Xocfg_upgrade_mgr.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/cfgs/upgrades/Xocfg_upgrade_mgr.java
@@ -19,7 +19,7 @@ package gplx.xowa.addons.apps.cfgs.upgrades; import gplx.*; import gplx.xowa.*;
import gplx.dbs.*;
import gplx.langs.gfs.*;
public class Xocfg_upgrade_mgr {
- public static void Convert(Xoae_app app) {
+ public static void Upgrade_cfg_0(Xoae_app app) {
try {
// get cfg_fil; if empty, exit
Io_url cfg_fil = app.Fsys_mgr().Root_dir().GenSubFil_nest("user", "anonymous", "app", "data", "cfg", "xowa_user_cfg.gfs");
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_addon.java b/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_addon.java
index 0d8619c94..ca9fbbc4d 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_addon.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_addon.java
@@ -17,20 +17,17 @@ along with this program. If not, see .
*/
package gplx.xowa.addons.apps.updates; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
import gplx.xowa.specials.*; import gplx.xowa.htmls.bridges.*;
-import gplx.xowa.addons.apps.updates.specials.*;
public class Xoa_update_addon implements Xoax_addon_itm, Xoax_addon_itm__special, Xoax_addon_itm__json {
public Xow_special_page[] Special_pages() {
return new Xow_special_page[]
- { Xoa_update_special.Prototype
+ { gplx.xowa.addons.apps.updates.specials.Xoa_update_special.Prototype
};
}
public Bridge_cmd_itm[] Json_cmds() {
return new Bridge_cmd_itm[]
- { Xoa_update_bridge.Prototype
+ { gplx.xowa.addons.apps.updates.specials.svcs.Xoa_update_bridge.Prototype
};
}
public String Addon__key() {return ADDON__KEY;} private static final String ADDON__KEY = "xowa.app.update";
- public static void Init(Xoae_app app) {
- }
}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_db.java b/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_db.java
new file mode 100644
index 000000000..642486dbc
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_db.java
@@ -0,0 +1,47 @@
+/*
+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 .
+*/
+package gplx.xowa.addons.apps.updates; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
+import gplx.xowa.addons.apps.updates.dbs.*;
+public class Xoa_update_db {
+ public static Io_url Url(Xoa_app app) {return app.Fsys_mgr().Root_dir().GenSubFil_nest("user", "install", "update", "xoa_update.sqlite3");}
+ public static Xoa_app_version_itm[] Select(Io_url db_url, DateAdp cutoff_date) {
+ Xoa_update_db_mgr db_mgr = new Xoa_update_db_mgr(db_url);
+ return db_mgr.Tbl__app_version().Select_by_date(cutoff_date.XtoStr_fmt_yyyy_MM_dd_HH_mm_ss());
+ }
+ public static boolean Download_from_inet(Xoa_app app, Io_url db_url) {
+ // exit if web_access disabled
+ if (!gplx.core.ios.IoEngine_system.Web_access_enabled) return false;
+
+ // check text file to see if version changed
+ Io_url trg_summary_fil = db_url.OwnerDir().GenSubFil("xoa_update.txt");
+ int trg_summary_version = Bry_.To_int_or(Io_mgr.Instance.LoadFilBryOr(trg_summary_fil, Bry_.new_a7("-1")), -1);
+ String src_summary_server = app.Cfg().Get_str_app_or("xowa.app.update.server_url", "http://xowa.org"); // CFG:Cfg__
+ byte[] src_summary_bry = Io_mgr.Instance.DownloadFil_args("", Io_url_.Empty).Exec_as_bry(src_summary_server + "/admin/app_update/xoa_update.txt");
+ if (src_summary_bry == null) return false;
+ int src_summary_version = Bry_.To_int(src_summary_bry);
+
+ // 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 = 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));
+ }
+ return true;
+ }
+}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_startup.java b/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_startup.java
new file mode 100644
index 000000000..3ccf7d363
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/Xoa_update_startup.java
@@ -0,0 +1,55 @@
+/*
+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 .
+*/
+package gplx.xowa.addons.apps.updates; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*;
+import gplx.xowa.addons.apps.cfgs.*;
+public class Xoa_update_startup {
+ public static boolean Show_at_startup(Xoa_app app) {
+ try {
+ // exit if disabled
+ Xocfg_mgr cfg = app.Cfg();
+ if (!cfg.Get_bool_app_or(Cfg__enabled, true)) return false;
+
+ // get inet_interval and date
+ int inet_interval = cfg.Get_int_app_or(Cfg__inet_interval, 7);
+ DateAdp inet_date = cfg.Get_date_app_or(Cfg__inet_date, DateAdp_.MinValue);
+
+ // if enough time has passed, check internet for update_db
+ Io_url db_url = Xoa_update_db.Url(app);
+ if (Datetime_now.Get().Diff_days(inet_date) > inet_interval) {
+ Xoa_update_db.Download_from_inet(app, db_url);
+ cfg.Set_date_app(Cfg__inet_date, Datetime_now.Get());
+ return true;
+ }
+
+ // check if there are versions to update
+ DateAdp cutoff_date = cfg.Get_date_app_or(Cfg__cutoff_date, DateAdp_.parse_fmt(Xoa_app_.Build_date, Xoa_app_.Build_date_fmt));
+ if (Xoa_update_db.Select(db_url, cutoff_date).length > 0)
+ return true;
+ } catch (Exception exc) {Gfo_usr_dlg_.Instance.Warn_many("", "", "starup:fatal error while looking up app-update-reminder; err=~{0}", Err_.Message_gplx_log(exc));}
+ return false;
+ }
+ public static void Set_cutoff_date_to_now(Xoa_app app) {
+ app.Cfg().Set_date_app(Cfg__cutoff_date, Datetime_now.Get());
+ }
+
+ private static final String
+ Cfg__enabled = "xowa.app.update.startup.enabled"
+ , Cfg__inet_interval = "xowa.app.update.startup.inet_interval"
+ , Cfg__inet_date = "xowa.app.update.startup.inet_date"
+ , Cfg__cutoff_date = "xowa.app.update.startup.cutoff_date";
+}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_tbl.java b/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_tbl.java
index 92facdcaf..729d17cb6 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_tbl.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/dbs/Xoa_app_version_tbl.java
@@ -43,7 +43,7 @@ public class Xoa_app_version_tbl implements Db_tbl {
( "SELECT *"
, "FROM app_version"
, "WHERE version_date > '{0}'"
- , "ORDER BY version_date DESC"
+ // , "ORDER BY version_date DESC"
), date);
Db_rdr rdr = conn.Stmt_sql(sql).Exec_select__rls_auto();
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_html.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_html.java
index e6583eeba..cc19daa17 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_html.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_html.java
@@ -18,44 +18,31 @@ along with this program. If not, see .
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.addons.apps.updates.dbs.*;
import gplx.xowa.specials.*; import gplx.langs.mustaches.*; import gplx.xowa.wikis.pages.*; import gplx.xowa.wikis.pages.tags.*;
-class Xoa_update_html extends Xow_special_wtr__base {
+public 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) {
return Load(app);
}
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");
+ Io_url db_url = Xoa_update_db.Url(app);
// get from internet
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 = Bry_.To_int_or(Io_mgr.Instance.LoadFilBryOr(trg_summary_fil, Bry_.new_a7("-1")), -1);
- String src_summary_server = app.Api_root().Addon().App__update__update_db_src(); // "http://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));
- }
- }
+ Xoa_update_db.Download_from_inet(app, db_url);
// 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);
+ Xoa_app_version_itm[] db_itms = Xoa_update_db.Select(db_url, DateAdp_.parse_fmt(Xoa_app_.Build_date, Xoa_app_.Build_date_fmt));
+
+ // build root
+ String check_date = app.Cfg().Get_str_app_or("xowa.app.update.startup.inet_date", null); // CFG:Cfg__
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, web_access_enabled, "", "", Xoa_app_version_itm.Priority__trivial, "", "");
+ String build_date = String_.Mid(Xoa_app_.Build_date, 0, String_.FindFwd(Xoa_app_.Build_date, " ")); // remove time to show date only
+ 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];
- 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());
+ Xoa_update_itm__root root = new Xoa_update_itm__root(Xoa_app_.Version, build_date, check_date, web_access_enabled, db_itm.Name(), db_itm.Date(), db_itm.Priority(), db_itm.Summary(), db_itm.Details(), db_itm.Package_url());
root.Itms_(To_gui_itm(db_itms));
return root;
}
@@ -68,9 +55,8 @@ class Xoa_update_html extends Xow_special_wtr__base {
return rv;
}
private static Xoa_update_itm__leaf To_gui_itm(Xoa_app_version_itm db_itm) {
- return new Xoa_update_itm__leaf(db_itm.Name(), db_itm.Date(), db_itm.Priority(), db_itm.Summary(), db_itm.Details());
+ return new Xoa_update_itm__leaf(db_itm.Name(), db_itm.Date(), db_itm.Priority(), db_itm.Summary(), db_itm.Details(), db_itm.Package_url());
}
-
@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__core (head_tags, app.Fsys_mgr().Http_root());
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm__leaf.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm__leaf.java
index 1374c7027..b41f99616 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm__leaf.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm__leaf.java
@@ -19,14 +19,15 @@ package gplx.xowa.addons.apps.updates.specials; import gplx.*; import gplx.xowa.
import gplx.langs.mustaches.*;
import gplx.xowa.addons.apps.updates.dbs.*;
class Xoa_update_itm__leaf implements Mustache_doc_itm {
- private final String version, date, summary, details;
+ private final String version, date, summary, details, package_url;
private final int priority;
- public Xoa_update_itm__leaf(String version, String date, int priority, String summary, String details) {
+ public Xoa_update_itm__leaf(String version, String date, int priority, String summary, String details, String package_url) {
this.version = version;
this.date = date;
this.priority = priority;
this.summary = summary;
this.details = details;
+ this.package_url = package_url;
}
@gplx.Virtual public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "version")) bfr.Add_str_u8(version);
@@ -34,6 +35,7 @@ class Xoa_update_itm__leaf implements Mustache_doc_itm {
else if (String_.Eq(k, "priority")) bfr.Add_str_u8(Xoa_app_version_itm.Priority__to_name(priority));
else if (String_.Eq(k, "summary")) bfr.Add_str_u8(summary);
else if (String_.Eq(k, "details")) bfr.Add_str_u8(details);
+ else if (String_.Eq(k, "package_url")) bfr.Add_str_u8(package_url);
return true;
}
@gplx.Virtual public Mustache_doc_itm[] Mustache__subs(String key) {
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm__root.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm__root.java
index 7a24bfb90..64b3227c6 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm__root.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_itm__root.java
@@ -17,16 +17,15 @@ along with this program. If not, see .
*/
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;
+class Xoa_update_itm__root extends Xoa_update_itm__leaf { private final String current_version, current_date, 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, boolean web_access_enabled
- , String version, String date, int priority, String summary, String details
- ) {super(version, date, priority, summary, details);
+ ( String current_version, String current_date, String check_date, boolean web_access_enabled
+ , String version, String date, int priority, String summary, String details, String package_url
+ ) {super(version, date, priority, summary, details, package_url);
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;
}
@@ -36,7 +35,6 @@ class Xoa_update_itm__root extends Xoa_update_itm__leaf { private final Stri
@Override public boolean Mustache__write(String k, Mustache_bfr bfr) {
if (String_.Eq(k, "current_version")) bfr.Add_str_u8(current_version);
else if (String_.Eq(k, "current_date")) bfr.Add_str_u8(current_date);
- else if (String_.Eq(k, "download_url")) bfr.Add_str_u8(download_url);
else if (String_.Eq(k, "check_date")) bfr.Add_str_u8(check_date);
return super.Mustache__write (k, bfr);
}
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_bridge.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_bridge.java
similarity index 70%
rename from 400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_bridge.java
rename to 400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_bridge.java
index f0e8c174e..c15603be5 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_bridge.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_bridge.java
@@ -15,7 +15,7 @@ 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 .
*/
-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.*;
+package gplx.xowa.addons.apps.updates.specials.svcs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*; import gplx.xowa.addons.apps.updates.specials.*;
import gplx.langs.jsons.*; import gplx.xowa.htmls.bridges.*;
public class Xoa_update_bridge implements Bridge_cmd_itm {
private Xoa_app app;
@@ -25,19 +25,20 @@ public class Xoa_update_bridge implements Bridge_cmd_itm {
public String Exec(Json_nde data) {
byte proc_id = proc_hash.Get_as_byte_or(data.Get_as_bry_or(Bridge_cmd_mgr.Msg__proc, null), Byte_ascii.Max_7_bit);
Json_nde args = data.Get_kv(Bridge_cmd_mgr.Msg__args).Val_as_nde();
+
+ Xoa_update_svc svc = new Xoa_update_svc(app);
switch (proc_id) {
- case Proc__download:
- Xoa_update_controller controller = new Xoa_update_controller();
- controller.Update_app(app, args.Get_as_str("version"));
- break;
- default: throw Err_.new_unhandled_default(proc_id);
+ case Proc__exec: svc.Exec(args.Get_as_str("version"));break;
+ case Proc__skip: svc.Skip(); break;
+ default: throw Err_.new_unhandled_default(proc_id);
}
return "";
}
- private static final byte Proc__download = 0;
+ private static final byte Proc__exec = 0, Proc__skip = 1;
private static final Hash_adp_bry proc_hash = Hash_adp_bry.cs()
- .Add_str_byte("download" , Proc__download)
+ .Add_str_byte("exec" , Proc__exec)
+ .Add_str_byte("skip" , Proc__skip)
;
public byte[] Key() {return BRIDGE_KEY;} public static final byte[] BRIDGE_KEY = Bry_.new_a7("app.updater");
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_controller.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_svc.java
similarity index 80%
rename from 400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_controller.java
rename to 400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_svc.java
index d5d382ff8..91e11d347 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_controller.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_svc.java
@@ -15,20 +15,20 @@ 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 .
*/
-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.*;
+package gplx.xowa.addons.apps.updates.specials.svcs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*; import gplx.xowa.addons.apps.updates.specials.*;
import gplx.xowa.guis.cbks.*;
import gplx.core.gfobjs.*;
import gplx.xowa.addons.apps.updates.dbs.*; import gplx.xowa.addons.apps.updates.js.*;
import gplx.xowa.addons.apps.updates.apps.*;
import gplx.core.envs.*;
-class Xoa_update_controller implements Gfo_invk {
+class Xoa_update_svc implements Gfo_invk {
private Xoa_app app;
private Io_url app_root_dir, update_dir, update_jar_fil;
- public void Update_app(Xoa_app app, String version_name) {
- this.app = app;
+ public Xoa_update_svc(Xoa_app app) {this.app = app;}
+ public void Exec(String version_name) {
// get app_version from db
this.app_root_dir = app.Fsys_mgr().Root_dir();
- this.update_dir = app_root_dir.GenSubDir_nest("user", "app", "update");
+ this.update_dir = app_root_dir.GenSubDir_nest("user", "install", "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);
@@ -45,6 +45,9 @@ class Xoa_update_controller implements Gfo_invk {
, "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");
}
+ public void Skip() {
+ Xoa_update_startup.Set_cutoff_date_to_now(app);
+ }
private void On_download_done(GfoMsg m) {
Xojs_wkr__download download_wkr = (Xojs_wkr__download)m.ReadObj("v");
Io_url src = download_wkr.Trg();
@@ -59,7 +62,7 @@ class Xoa_update_controller implements Gfo_invk {
// copy update_jar
Io_url src_jar_fil = src.GenSubFil_nest("bin", "any", "xowa", "addon", "app", "update", "xoa_update.jar");
- this.update_jar_fil = app_root_dir.GenSubFil_nest("user", "app", "update", "xoa_update.jar");
+ this.update_jar_fil = app_root_dir.GenSubFil_nest("user", "install", "update", "xoa_update.jar");
Io_mgr.Instance.MoveFil_args(src_jar_fil, update_jar_fil, true).Exec();
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);
@@ -79,12 +82,15 @@ class Xoa_update_controller implements Gfo_invk {
// write failed
Bry_bfr bfr = Bry_bfr_.New();
- bfr.Add_str_u8(App__update__restart_cmd(app.Api_root().Addon().App__update__restart_cmd(), Env_.AppUrl(), Op_sys.Cur().Tid(), Op_sys.Cur().Bitness()) + "\n");
+ String app_update_cfg = app.Cfg().Get_str_app_or("xowa.app.update.restart_cmd", ""); // CFG:Cfg__
+ bfr.Add_str_u8(App__update__restart_cmd(app_update_cfg, Env_.AppUrl(), Op_sys.Cur().Tid(), Op_sys.Cur().Bitness()) + "\n");
list.Save(bfr);
- Io_mgr.Instance.SaveFilBfr(update_dir.GenSubFil("xoa_update.txt"), bfr);
+ Io_url manifest_url = update_dir.GenSubFil("xoa_update_manifest.txt");
+ Io_mgr.Instance.SaveFilBfr(manifest_url, bfr);
replace_wkr.Cbk_mgr().Send_json(replace_wkr.Cbk_trg(), "xo.app_updater.download__prog", Gfobj_nde.New().Add_bool("done", true));
- Runtime_.Exec("java -jar " + update_jar_fil.Raw());
+
+ Runtime_.Exec("java -jar " + update_jar_fil.Raw()+ " " + manifest_url.Raw());
System_.Exit();
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
diff --git a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_controller__tst.java b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_svc__tst.java
similarity index 77%
rename from 400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_controller__tst.java
rename to 400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_svc__tst.java
index 9e67b77be..376002f9a 100644
--- a/400_xowa/src/gplx/xowa/addons/apps/updates/specials/Xoa_update_controller__tst.java
+++ b/400_xowa/src/gplx/xowa/addons/apps/updates/specials/svcs/Xoa_update_svc__tst.java
@@ -15,10 +15,10 @@ 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 .
*/
-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.*;
+package gplx.xowa.addons.apps.updates.specials.svcs; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.updates.*; import gplx.xowa.addons.apps.updates.specials.*;
import org.junit.*; import gplx.core.tests.*; import gplx.core.envs.*;
-public class Xoa_update_controller__tst {
- private final Xoa_update_controller__fxt fxt = new Xoa_update_controller__fxt();
+public class Xoa_update_svc__tst {
+ private final Xoa_update_svc__fxt fxt = new Xoa_update_svc__fxt();
@Test public void Restart_cmd() {
Io_url jar_fil = Io_url_.new_dir_("/home/gnosygnu/xowa/xowa.jar");
fxt.Test__restart_cmd("manual" , jar_fil, Op_sys.Tid_lnx, Op_sys.Bitness_64, "manual");
@@ -30,8 +30,8 @@ public class Xoa_update_controller__tst {
fxt.Test__restart_cmd("" , jar_fil, Op_sys.Tid_wnt, Op_sys.Bitness_32, "/home/gnosygnu/xowa/xowa.exe");
}
}
-class Xoa_update_controller__fxt {
+class Xoa_update_svc__fxt {
public void Test__restart_cmd(String current, Io_url app_url, byte op_sys_tid, byte bitness, String expd) {
- Gftest.Eq__str(expd, Xoa_update_controller.App__update__restart_cmd(current, app_url, op_sys_tid, bitness), "restart_cmd");
+ Gftest.Eq__str(expd, Xoa_update_svc.App__update__restart_cmd(current, app_url, op_sys_tid, bitness), "restart_cmd");
}
}
\ No newline at end of file
diff --git a/400_xowa/src/gplx/xowa/apps/Xoav_app.java b/400_xowa/src/gplx/xowa/apps/Xoav_app.java
index 1ad50cdb7..418005d9c 100644
--- a/400_xowa/src/gplx/xowa/apps/Xoav_app.java
+++ b/400_xowa/src/gplx/xowa/apps/Xoav_app.java
@@ -36,7 +36,7 @@ public class Xoav_app implements Xoa_app, Gfo_invk {
public Xoav_app(Gfo_usr_dlg usr_dlg, Xoa_app_mode mode, Xog_tab_mgr tab_mgr, String plat_name, Io_url root_dir, Io_url file_dir, Io_url css_dir, Io_url http_root) {
Xoa_app_.Usr_dlg_(usr_dlg); this.usr_dlg = usr_dlg; this.mode = mode;
this.fsys_mgr = new Xoa_fsys_mgr(plat_name, root_dir, root_dir.GenSubDir("wiki"), file_dir, css_dir, http_root);
- this.gfs_mgr = new Xoa_gfs_mgr(this, fsys_mgr);
+ this.gfs_mgr = new Xoa_gfs_mgr("anonymous", this, fsys_mgr);
this.lang_mgr = new Xoa_lang_mgr(this, gfs_mgr);
this.meta_mgr = new Xoa_meta_mgr(this);
this.file__cache_mgr = new Xof_cache_mgr(usr_dlg, null, null);
diff --git a/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java
index e38037ea9..daafd6ed4 100644
--- a/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java
+++ b/400_xowa/src/gplx/xowa/apps/apis/xowa/Xoapi_addon.java
@@ -21,22 +21,10 @@ public class Xoapi_addon implements Gfo_invk {
public void Ctor_by_app(Xoa_app app) {}
public Xoapi_addon_search Search() {return search;} private final Xoapi_addon_search search = new Xoapi_addon_search();
public Xoapi_addon_bldr Bldr() {return bldr;} private final Xoapi_addon_bldr bldr = new Xoapi_addon_bldr();
- public String App__update__restart_cmd() {return app__update__restart_cmd;} private String app__update__restart_cmd = "";
- public String App__update__update_db_src() {return app__update__update_db_src;} private String app__update__update_db_src = "http://xowa.org";
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk__search)) return search;
else if (ctx.Match(k, Invk__bldr)) return bldr;
- else if (ctx.Match(k, Invk__app__update__restart_cmd)) return app__update__restart_cmd;
- else if (ctx.Match(k, Invk__app__update__restart_cmd_)) app__update__restart_cmd = m.ReadStr("v");
- else if (ctx.Match(k, Invk__app__update__update_db_src)) return app__update__update_db_src;
- else if (ctx.Match(k, Invk__app__update__update_db_src_)) app__update__update_db_src = m.ReadStr("v");
else return Gfo_invk_.Rv_unhandled;
- return this;
}
- private static final String Invk__search = "search", Invk__bldr = "bldr"
- , Invk__app__update__restart_cmd = "app__update__restart_cmd"
- , Invk__app__update__restart_cmd_ = "app__update__restart_cmd_"
- , Invk__app__update__update_db_src = "app__update__update_db_src"
- , Invk__app__update__update_db_src_ = "app__update__update_db_src_"
- ;
+ private static final String Invk__search = "search", Invk__bldr = "bldr";
}
diff --git a/400_xowa/src/gplx/xowa/apps/boots/Xoa_boot_mgr.java b/400_xowa/src/gplx/xowa/apps/boots/Xoa_boot_mgr.java
index 8be509631..52bfbe455 100644
--- a/400_xowa/src/gplx/xowa/apps/boots/Xoa_boot_mgr.java
+++ b/400_xowa/src/gplx/xowa/apps/boots/Xoa_boot_mgr.java
@@ -43,7 +43,7 @@ public class Xoa_boot_mgr {
log_wtr = usr_dlg.Log_wkr(); log_wtr.Log_to_session_fmt("env.init: version=~{0}", Xoa_app_.Version);
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("yyyy-MM-dd HH:mm");
+ 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());
}
@@ -73,7 +73,7 @@ public class Xoa_boot_mgr {
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;
+ if (launch_url != null) gplx.xowa.guis.views.Xog_startup_tabs.Manual = launch_url;
app.Tcp_server().Rdr_port_(arg_mgr.Tcp__port_recv()).Wtr_port_(arg_mgr.Tcp__port_send());
gplx.xowa.apps.servers.http.Http_server_mgr server_mgr = app.Http_server();
server_mgr.Port_(arg_mgr.Http__port());
@@ -92,7 +92,6 @@ public class Xoa_boot_mgr {
if (app_type_is_gui)
GfuiEnv_.ShowMsg(Err_.Message_gplx_full(e));
}
- gplx.xowa.apps.setups.Xoa_setup_mgr.Delete_old_files(app);
// launch
app.Launch();
diff --git a/400_xowa/src/gplx/xowa/apps/gfs/Xoa_gfs_mgr.java b/400_xowa/src/gplx/xowa/apps/gfs/Xoa_gfs_mgr.java
index db4cd546b..e9790fa0f 100644
--- a/400_xowa/src/gplx/xowa/apps/gfs/Xoa_gfs_mgr.java
+++ b/400_xowa/src/gplx/xowa/apps/gfs/Xoa_gfs_mgr.java
@@ -19,7 +19,9 @@ package gplx.xowa.apps.gfs; import gplx.*; import gplx.xowa.*; import gplx.xowa.
import gplx.langs.gfs.*;
import gplx.xowa.users.*; import gplx.xowa.apps.fsys.*;
public class Xoa_gfs_mgr implements Gfo_invk, Gfo_invk_root_wkr {
- public Xoa_gfs_mgr(Gfo_invk root_invk, Xoa_fsys_mgr app_fsys_mgr) {
+ private final String user_name;
+ public Xoa_gfs_mgr(String user_name, Gfo_invk root_invk, Xoa_fsys_mgr app_fsys_mgr) {
+ this.user_name = user_name;
this.root_invk = root_invk; this.app_fsys_mgr = app_fsys_mgr;
GfsCore.Instance.AddCmd(root_invk, Xoae_app.Invk_app);
GfsCore.Instance.AddCmd(root_invk, Xoae_app.Invk_xowa);
@@ -53,7 +55,7 @@ public class Xoa_gfs_mgr implements Gfo_invk, Gfo_invk_root_wkr {
}
private void Run_url_by_type(String type) {
if (String_.Eq(type, "xowa_cfg_app")) Run_url(app_fsys_mgr.Cfg_app_fil());
- else if (String_.Eq(type, "xowa.user.os")) gplx.xowa.addons.apps.cfgs.mgrs.dflts.Xocfg_dflt_mgr.Run_os_gfs(this, app_fsys_mgr);
+ else if (String_.Eq(type, "xowa.user.os")) gplx.xowa.addons.apps.cfgs.mgrs.dflts.Xocfg_dflt_mgr.Run_os_gfs(user_name, this, app_fsys_mgr);
else throw Err_.new_wo_type("invalid gfs type", "type", type);
}
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
diff --git a/400_xowa/src/gplx/xowa/apps/setups/Xoa_setup_mgr.java b/400_xowa/src/gplx/xowa/apps/setups/Xoa_setup_mgr.java
index b6bc67132..9dab950b4 100644
--- a/400_xowa/src/gplx/xowa/apps/setups/Xoa_setup_mgr.java
+++ b/400_xowa/src/gplx/xowa/apps/setups/Xoa_setup_mgr.java
@@ -18,8 +18,13 @@ along with this program. If not, see .
package gplx.xowa.apps.setups; import gplx.*; import gplx.xowa.*; import gplx.xowa.apps.*;
import gplx.xowa.apps.versions.*; import gplx.core.envs.*;
public class Xoa_setup_mgr {
- public static void Delete_old_files(Xoae_app app) {
- String version_previous = gplx.xowa.guis.views.Xog_startup_tabs_.Version_previous(app);
+ public static void Launch(Xoae_app app) {
+ Delete_old_files(app);
+ gplx.xowa.addons.apps.cfgs.upgrades.Xocfg_upgrade_mgr.Upgrade_cfg_0(app);
+ Run_cfg_for_os(app);
+ }
+ private static void Delete_old_files(Xoae_app app) {
+ String version_previous = gplx.xowa.guis.views.Xog_startup_tabs.Version_previous(app);
Gfo_usr_dlg usr_dlg = app.Usr_dlg();
Io_url root_dir = app.Fsys_mgr().Root_dir();
Delete_old_dir(usr_dlg, version_previous, "1.8.2.1" , root_dir.GenSubDir_nest("user", "anonymous", "lang"));
@@ -27,14 +32,14 @@ public class Xoa_setup_mgr {
Delete_old_dir(usr_dlg, version_previous, "1.10.2.1" , root_dir.GenSubDir_nest("bin", "any", "javascript"));
Delete_old_dir(usr_dlg, version_previous, "1.10.2.1" , root_dir.GenSubDir_nest("bin", "any", "xowa", "html", "modules"));
}
- public static void Delete_old_dir(Gfo_usr_dlg usr_dlg, String version_prv, String version_del, Io_url dir) {
+ public static void Delete_old_dir(Gfo_usr_dlg usr_dlg, String version_prv, String version_del, Io_url dir) { // TEST:
if (Xoa_version_.Compare(version_prv, version_del) != CompareAble_.Less) return;
usr_dlg.Log_many("", "", "setup:checking if dir exists: version_prv=~{0} version_del=~{1} dir=~{2}", version_prv, version_del, dir.Raw());
if (!Io_mgr.Instance.ExistsDir(dir)) return;
usr_dlg.Log_many("", "", "setup:deleting dir", version_prv, version_del, dir.Raw());
Io_mgr.Instance.DeleteDirDeep(dir);
}
- public static void Setup_run_check(Xoae_app app) {
+ private static void Run_cfg_for_os(Xoae_app app) {
// exit if wnt or drd
byte op_sys_tid = Op_sys.Cur().Tid();
switch (op_sys_tid) {
diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java b/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java
index 0b39d1f3d..c6a53a5a7 100644
--- a/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java
+++ b/400_xowa/src/gplx/xowa/guis/views/Xog_launcher_tabs.java
@@ -34,14 +34,15 @@ class Xog_launcher_tabs {
app.Usr_dlg().Log_wkr().Log_to_session_direct(log_bfr.Xto_str());
}
private boolean Restore_tabs(Xoae_app app, Xowe_wiki home_wiki, Xog_win_itm win, Io_fil_marker fil_marker) {
- String[] launch_urls = Xog_startup_tabs_.Calc_startup_strs(app);
+ Xog_startup_tabs startup_tabs = new Xog_startup_tabs().Init_by_app(app).Calc();
+ String[] launch_urls = startup_tabs.Startup_urls();
try {
int launch_urls_len = launch_urls.length;
for (int i = 0; i < launch_urls_len; ++i) {
String launch_url = launch_urls[i];
Launch_tab(win, home_wiki, launch_url);
}
- Xog_startup_tabs_.Select_startup_tab(app);
+ app.Gui_mgr().Browser_win().Tab_mgr().Tabs_select_by_idx(startup_tabs.Startup_idx());
fil_marker.End();
return true;
}
@@ -52,12 +53,8 @@ class Xog_launcher_tabs {
}
}
private void Restore_tab_failover(Xoae_app app, Xowe_wiki home_wiki, Xog_win_itm win) {
- try {
- Launch_tab(win, home_wiki, Xog_startup_tabs_.Page_xowa);
- }
- catch (Exception e) {
- app.Usr_dlg().Warn_many("", "", "failed to launch failover tab: err=~{0}", Err_.Message_gplx_full(e));
- }
+ try {Launch_tab(win, home_wiki, Xog_startup_tabs.Url__home_main);}
+ catch (Exception e) {app.Usr_dlg().Warn_many("", "", "failed to launch failover tab: err=~{0}", Err_.Message_gplx_full(e));}
}
private void Launch_tab(Xog_win_itm win, Xowe_wiki home_wiki, String launch_str) {
Xoae_app app = win.App();
@@ -78,13 +75,13 @@ class Io_fil_marker {
boolean rv = false;
synchronized (this) {
try {
- rv = !Io_mgr.Instance.ExistsFil(url); // exists = fail; !exists = pass;
- if (rv) // pass: file does not exist;
- Io_mgr.Instance.SaveFilStr(url, ""); // create
- else // file exists from previous run
+ rv = !Io_mgr.Instance.ExistsFil(url); // exists = fail; !exists = pass;
+ if (rv) // pass: file does not exist;
+ Io_mgr.Instance.SaveFilStr(url, ""); // create
+ else // file exists from previous run
Io_mgr.Instance.DeleteFil(url); // delete
}
- catch (Exception exc) { // something unexpected happened
+ catch (Exception exc) { // something unexpected happened
usr_dlg.Warn_many("", "", "marker.bgn failed: url=~{0} err=~{1}", url.Raw(), Err_.Message_gplx_full(exc));
Io_mgr.Instance.DeleteFil(url); // try to delete it again
}
diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_startup_tabs.java b/400_xowa/src/gplx/xowa/guis/views/Xog_startup_tabs.java
new file mode 100644
index 000000000..66a38bcde
--- /dev/null
+++ b/400_xowa/src/gplx/xowa/guis/views/Xog_startup_tabs.java
@@ -0,0 +1,123 @@
+/*
+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 .
+*/
+package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
+import gplx.xowa.addons.apps.cfgs.*; import gplx.xowa.addons.apps.updates.specials.*;
+public class Xog_startup_tabs {
+ private String type, custom_list, prev_list, prev_version, curr_version;
+ private boolean show_app_update;
+ public int Startup_idx() {return startup_idx;} private int startup_idx;
+ public String[] Startup_urls() {return startup_urls;} private String[] startup_urls = String_.Ary_empty;
+ public Xog_startup_tabs Init_by_app(Xoae_app app) {
+ Xocfg_mgr cfg = app.Cfg();
+ this.type = cfg.Get_str_app_or(Cfg__startup_type, Opt__startup_type__previous);
+ this.custom_list = cfg.Get_str_app_or(Cfg__custom_list, "");
+ this.prev_list = cfg.Get_str_app_or(Cfg__prev_list, "");
+ this.prev_version = cfg.Get_str_app_or(Cfg__prev_version, "");
+ this.curr_version = Xoa_app_.Version;
+ this.startup_idx = cfg.Get_int_app_or(Cfg__prev_selected, -1);
+ this.show_app_update = gplx.xowa.addons.apps.updates.Xoa_update_startup.Show_at_startup(app);
+ return this;
+ }
+ public Xog_startup_tabs Calc() {
+ List_adp list = List_adp_.New(); // NOTE: do not change to hash; duplicate urls are possible
+
+ // process main types
+ if (Manual == null) {
+ if (String_.Eq(type, "blank")) list.Add(gplx.xowa.specials.Xow_special_meta_.Itm__default_tab.Ttl_str());
+ else if (String_.Eq(type, "xowa")) list.Add(Url__home_main);
+ else if (String_.Eq(type, "custom")) Parse_ary(list, custom_list);
+ else if (String_.Eq(type, Opt__startup_type__previous)) Parse_ary(list, prev_list);
+ else throw Err_.new_unhandled(type);
+ }
+ else
+ list.Add(Manual);
+
+ // if new version, add home/wiki/Main_Page
+ if (gplx.xowa.apps.versions.Xoa_version_.Compare(prev_version, curr_version) == CompareAble_.Less) {
+ startup_idx = Add_if_absent(list, Url__home_main);
+ }
+
+ // if show_app_update, add page
+ if (show_app_update) {
+ startup_idx = Add_if_absent(list, Xoa_update_special.Prototype.Special__meta().Url__home());
+ }
+
+ // generate urls
+ startup_urls = (String[])list.To_ary_and_clear(String.class);
+
+ // do bounds check
+ if (startup_idx < 0 || startup_idx >= startup_urls.length)
+ startup_idx = startup_urls.length - 1;
+ return this;
+ }
+ private static int Add_if_absent(List_adp list, String page) {
+ // check list for page
+ int len = list.Len();
+ for (int i = 0; i < len; i++) {
+ String itm = (String)list.Get_at(i);
+
+ // page found; return its index
+ if (String_.Eq(itm, page)) {
+ return i;
+ }
+ }
+
+ // add if not found
+ list.Add(page);
+ return list.Len();
+ }
+ private static void Parse_ary(List_adp list, String s) {
+ if (String_.Len_eq_0(s)) return;
+ String[] ary = String_.SplitLines_nl(String_.Trim(s));
+ int len = ary.length;
+ for (int i = 0; i < len; i++) {
+ String itm = ary[i];
+ if (String_.Len_eq_0(itm)) continue;
+ list.Add(itm);
+ }
+ }
+ public static String Version_previous(Xoa_app app) {return app.Cfg().Get_str_app_or(Cfg__prev_version, "");}
+ public static void Shutdown(Xoae_app app) {
+ app.Cfg().Set_str_app(Cfg__prev_version, Xoa_app_.Version);
+ if (String_.Eq(app.Cfg().Get_str_app_or(Cfg__startup_type, Opt__startup_type__previous), Opt__startup_type__previous)) {
+ app.Cfg().Set_str_app(Cfg__prev_list , Calc_previous_tabs(app.Gui_mgr().Browser_win().Tab_mgr()));
+ app.Cfg().Set_int_app(Cfg__prev_selected, app.Gui_mgr().Browser_win().Tab_mgr().Active_tab().Tab_idx());
+ }
+ }
+ private static String Calc_previous_tabs(gplx.xowa.guis.views.Xog_tab_mgr tab_mgr) {
+ Bry_bfr bfr = Bry_bfr_.New();
+ int len = tab_mgr.Tabs_len();
+ for (int i = 0; i < len; ++i) {
+ if (i != 0) bfr.Add_byte_nl();
+ gplx.xowa.guis.views.Xog_tab_itm tab = tab_mgr.Tabs_get_at(i);
+ bfr.Add_str_u8(tab.Page().Url().To_str());
+ }
+ return bfr.To_str_and_clear();
+ }
+ public static String Manual = null; // note set by command-line at startup;
+ private static final String
+ Cfg__startup_type = "xowa.app.startup.tabs.type"
+ , Cfg__custom_list = "xowa.app.startup.tabs.custom"
+ , Cfg__prev_list = "xowa.app.startup.tabs.previous_list"
+ , Cfg__prev_selected = "xowa.app.startup.tabs.previous_selected"
+ , Cfg__prev_version = "xowa.app.setup.previous_version"
+ , Opt__startup_type__previous = "previous";
+ public static final String
+ Url__home_main = "home/wiki/Main_Page"
+ ;
+}
diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_startup_tabs_.java b/400_xowa/src/gplx/xowa/guis/views/Xog_startup_tabs_.java
deleted file mode 100644
index 9418e7805..000000000
--- a/400_xowa/src/gplx/xowa/guis/views/Xog_startup_tabs_.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
-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 .
-*/
-package gplx.xowa.guis.views; import gplx.*; import gplx.xowa.*; import gplx.xowa.guis.*;
-import gplx.xowa.addons.apps.cfgs.*;
-public class Xog_startup_tabs_ {
- public static String Manual = null; // note should only be set once, at startup;
- public static void Shutdown(Xoae_app app) {
- if (String_.Eq(app.Cfg().Get_str_app_or(Cfg__tabs_type, Opt__tabs_type__previous), Opt__tabs_type__previous)) {
- app.Cfg().Set_str_app(Cfg__prev_list , Calc_previous_tabs(app.Gui_mgr().Browser_win().Tab_mgr()));
- app.Cfg().Set_int_app(Cfg__prev_selected, app.Gui_mgr().Browser_win().Tab_mgr().Active_tab().Tab_idx());
- }
- }
- private static String Calc_previous_tabs(gplx.xowa.guis.views.Xog_tab_mgr tab_mgr) {
- Bry_bfr bfr = Bry_bfr_.New();
- int len = tab_mgr.Tabs_len();
- for (int i = 0; i < len; ++i) {
- if (i != 0) bfr.Add_byte_nl();
- gplx.xowa.guis.views.Xog_tab_itm tab = tab_mgr.Tabs_get_at(i);
- bfr.Add_str_u8(tab.Page().Url().To_str());
- }
- return bfr.To_str_and_clear();
- }
- public static void Select_startup_tab(Xoae_app app) {
- if (String_.Eq(app.Cfg().Get_str_app_or(Cfg__tabs_type, Opt__tabs_type__previous), Opt__tabs_type__previous)) {
- int selected_tab = app.Cfg().Get_int_app_or(Cfg__prev_selected, -1);
- if (selected_tab != -1) {
- app.Gui_mgr().Browser_win().Tab_mgr().Tabs_select_by_idx(selected_tab);
- }
- }
- }
- public static final String Page_xowa = "home/wiki/Main_Page";
- public static String[] Calc_startup_strs(Xoae_app app) {
- List_adp rv = List_adp_.New();
- Xocfg_mgr cfg = app.Cfg();
- String xowa_home = Page_xowa;
- String type = cfg.Get_str_app_or(Cfg__tabs_type, Opt__tabs_type__previous);
- if (Manual == null) {
- if (String_.Eq(type, "blank")) {rv.Add(gplx.xowa.specials.Xow_special_meta_.Itm__default_tab.Ttl_str());}
- else if (String_.Eq(type, "xowa")) {rv.Add(xowa_home);}
- else if (String_.Eq(type, "custom")) {Add_pages_to_list(rv, cfg.Get_str_app_or(Cfg__tabs_custom, ""));}
- else if (String_.Eq(type, Opt__tabs_type__previous)) {Add_pages_to_list(rv, cfg.Get_str_app_or(Cfg__prev_list, ""));}
- else {throw Err_.new_unhandled(type);}
- }
- else
- rv.Add(Manual);
- Add_xowa_home_if_new_version(rv, app, xowa_home);
- return rv.To_str_ary();
- }
- private static void Add_pages_to_list(List_adp list, String s) {
- if (String_.Len_eq_0(s)) return;
- String[] ary = String_.SplitLines_nl(String_.Trim(s));
- int len = ary.length;
- for (int i = 0; i < len; ++i) {
- String itm = ary[i];
- if (String_.Len_eq_0(itm)) continue;
- list.Add(itm);
- }
- }
- public static String Version_previous(Xoa_app app) {return app.Cfg().Get_str_app_or(Cfg__prev_version, "");}
- private static void Add_xowa_home_if_new_version(List_adp rv, Xoae_app app, String xowa_home) {
- if (gplx.xowa.apps.versions.Xoa_version_.Compare(Version_previous(app), Xoa_app_.Version) == CompareAble_.Less) {
- boolean xowa_home_exists = false;
- int len = rv.Count();
- for (int i = 0; i < len; ++i) {
- String itm = (String)rv.Get_at(i);
- if (String_.Eq(itm, xowa_home)) {
- xowa_home_exists = true;
- break;
- }
- }
- if (!xowa_home_exists) {
- rv.Add(xowa_home);
- app.Cfg().Set_int_app(Cfg__prev_selected, rv.Len());
- }
- }
- }
- private static final String
- Cfg__tabs_type = "xowa.app.startup.tabs.type"
- , Cfg__tabs_custom = "xowa.app.startup.tabs.custom"
- , Cfg__prev_list = "xowa.app.startup.tabs.previous_list"
- , Cfg__prev_selected = "xowa.app.startup.tabs.previous_selected"
- , Opt__tabs_type__previous = "previous"
- ;
- public static final String Cfg__prev_version = "xowa.app.setup.previous_version";
-}
diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_startup_win_.java b/400_xowa/src/gplx/xowa/guis/views/Xog_startup_win_.java
index fa08c5c08..a2d4cb27f 100644
--- a/400_xowa/src/gplx/xowa/guis/views/Xog_startup_win_.java
+++ b/400_xowa/src/gplx/xowa/guis/views/Xog_startup_win_.java
@@ -79,9 +79,7 @@ public class Xog_startup_win_ {
cfg_mgr.Set_str_app(Cfg__prev_rect , win.Rect().Xto_str());
cfg_mgr.Set_str_app(Cfg__prev_maximized , Yn.To_str(win.Maximized()));
}
- Xog_startup_tabs_.Shutdown(app);
-
- cfg_mgr.Set_str_app(gplx.xowa.guis.views.Xog_startup_tabs_.Cfg__prev_version, Xoa_app_.Version);
+ Xog_startup_tabs.Shutdown(app);
}
public static SizeAdp Screen_maximized_calc() {
Op_sys os = Op_sys.Cur();
diff --git a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_mgr.java b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_mgr.java
index fe325fbc0..17fbdc90f 100644
--- a/400_xowa/src/gplx/xowa/guis/views/Xog_tab_mgr.java
+++ b/400_xowa/src/gplx/xowa/guis/views/Xog_tab_mgr.java
@@ -181,7 +181,7 @@ public class Xog_tab_mgr implements Gfo_evt_itm {
tab_mgr.Tabs_select_by_idx(new_idx);
}
public void Tabs_select_by_idx(int v) {
- if (v >= tab_regy.Count()) return;
+ if (v < 0 || v >= tab_regy.Count()) return;
tab_mgr.Tabs_select_by_idx(v);
}
public void Tabs_move(boolean fwd) {
diff --git a/400_xowa/src/gplx/xowa/htmls/bridges/Bridge_cmd_itm.java b/400_xowa/src/gplx/xowa/htmls/bridges/Bridge_cmd_itm.java
index f30104430..631b52947 100644
--- a/400_xowa/src/gplx/xowa/htmls/bridges/Bridge_cmd_itm.java
+++ b/400_xowa/src/gplx/xowa/htmls/bridges/Bridge_cmd_itm.java
@@ -18,7 +18,7 @@ along with this program. If not, see .
package gplx.xowa.htmls.bridges; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*;
import gplx.langs.jsons.*;
public interface Bridge_cmd_itm {
- byte[] Key();
- void Init_by_app(Xoa_app app);
- String Exec(Json_nde data);
+ byte[] Key();
+ void Init_by_app(Xoa_app app);
+ String Exec(Json_nde data);
}
diff --git a/400_xowa/src/gplx/xowa/specials/Xow_special_meta.java b/400_xowa/src/gplx/xowa/specials/Xow_special_meta.java
index 5a577d68c..ce99c55c1 100644
--- a/400_xowa/src/gplx/xowa/specials/Xow_special_meta.java
+++ b/400_xowa/src/gplx/xowa/specials/Xow_special_meta.java
@@ -31,6 +31,9 @@ public class Xow_special_meta {
public byte[] Ttl_bry() {return ttl_bry;} private final byte[] ttl_bry;
public byte[][] Aliases() {return aliases;} private final byte[][] aliases; // EX: Special:RandomPage has Special:Random as alias
public byte[] Display_ttl() {return display_ttl;} private byte[] display_ttl; public Xow_special_meta Display_ttl_(String v) {display_ttl = Bry_.new_u8(v); return this;}
+ public String Url__home() {
+ return String_.Concat(gplx.xowa.wikis.domains.Xow_domain_itm_.Str__home, gplx.xowa.htmls.hrefs.Xoh_href_.Str__wiki, ttl_str);
+ }
public boolean Match_ttl(Xoa_ttl ttl) {
return ttl.Ns().Id_is_special() && Bry_.Eq(ttl.Root_txt(), key_bry);
diff --git a/400_xowa/src/gplx/xowa/wikis/xwikis/sitelinks/Xoa_sitelink_mgr.java b/400_xowa/src/gplx/xowa/wikis/xwikis/sitelinks/Xoa_sitelink_mgr.java
index 653351075..db0a83ec8 100644
--- a/400_xowa/src/gplx/xowa/wikis/xwikis/sitelinks/Xoa_sitelink_mgr.java
+++ b/400_xowa/src/gplx/xowa/wikis/xwikis/sitelinks/Xoa_sitelink_mgr.java
@@ -18,9 +18,9 @@ along with this program. If not, see .
package gplx.xowa.wikis.xwikis.sitelinks; import gplx.*; import gplx.xowa.*; import gplx.xowa.wikis.*; import gplx.xowa.wikis.xwikis.*;
import gplx.xowa.wikis.xwikis.sitelinks.htmls.*; import gplx.xowa.langs.*;
public class Xoa_sitelink_mgr {
- private final Xoa_sitelink_div_wtr div_wtr = new Xoa_sitelink_div_wtr();
- public Xoa_sitelink_itm_mgr Itm_mgr() {return itm_mgr;} private final Xoa_sitelink_itm_mgr itm_mgr;
- public Xoa_sitelink_grp_mgr Grp_mgr() {return grp_mgr;} private final Xoa_sitelink_grp_mgr grp_mgr = new Xoa_sitelink_grp_mgr();
+ private final Xoa_sitelink_div_wtr div_wtr = new Xoa_sitelink_div_wtr();
+ public Xoa_sitelink_itm_mgr Itm_mgr() {return itm_mgr;} private final Xoa_sitelink_itm_mgr itm_mgr;
+ public Xoa_sitelink_grp_mgr Grp_mgr() {return grp_mgr;} private final Xoa_sitelink_grp_mgr grp_mgr = new Xoa_sitelink_grp_mgr();
public Xoa_sitelink_mgr() {
this.itm_mgr = new Xoa_sitelink_itm_mgr(grp_mgr.Default_grp());
}