/*
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.addons.apps.cfgs.upgrades; import gplx.*; import gplx.xowa.*; import gplx.xowa.addons.*; import gplx.xowa.addons.apps.*; import gplx.xowa.addons.apps.cfgs.*;
import gplx.dbs.*;
import gplx.langs.gfs.*;
public class Xocfg_upgrade_mgr {
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");
byte[] cfg_raw = Io_mgr.Instance.LoadFilBryOrNull(cfg_fil);
if (cfg_raw == null) return;
// log and rename file
Gfo_usr_dlg_.Instance.Log_many("", "", "cfg.convert:old cfg found; converting");
Io_mgr.Instance.MoveFil_args(cfg_fil, cfg_fil.GenNewExt(".bak"), true).Exec();
// parse, remap, and update
Keyval[] kvs = Parse(cfg_raw);
// get mappings
Ordered_hash mappings = Ordered_hash_.New();
Db_conn conn = app.Cfg().Cache_mgr().Db_app().Conn();
Db_rdr rdr = conn.Stmt_sql("SELECT * FROM cfg_upgrade").Exec_select__rls_auto();
try {
while (rdr.Move_next()) {
String cfg_old = rdr.Read_str("cfg_old");
String cfg_new = rdr.Read_str("cfg_new");
mappings.Add(cfg_old, Keyval_.new_(cfg_old, cfg_new));
}
}
finally {rdr.Rls();}
// remap
for (Keyval kv : kvs) {
Keyval mapping = (Keyval)mappings.Get_by(kv.Key());
if (mapping == null) {
Gfo_usr_dlg_.Instance.Log_many("", "", "cfg.convert:could not find mapping; key=~{0} val=~{1}", kv.Key(), kv.Val());
kv.Key_("");
continue;
}
kv.Key_(mapping.Val());
}
// apply
app.Cfg().Cache_mgr().Db_usr().Conn().Txn_bgn("convert");
for (Keyval kv : kvs) {
if (String_.Eq(kv.Key(), "")) continue;
Gfo_usr_dlg_.Instance.Log_many("", "", "cfg.convert:converting; key=~{0} val=~{1}", kv.Key(), kv.Val());
app.Cfg().Set_str_app(kv.Key(), kv.Val_to_str_or_empty());
}
app.Cfg().Cache_mgr().Db_usr().Conn().Txn_end();
} catch (Exception exc) {
Gfo_usr_dlg_.Instance.Warn_many("", "", "failed to convert old cfg; err=~{0}", Err_.Message_gplx_log(exc));
}
}
public static Keyval[] Parse(byte[] src) {
// main parse
Gfs_parser parser = new Gfs_parser();
Ordered_hash hash = Ordered_hash_.New();
Gfs_nde root = parser.Parse(src);
int root_len = root.Subs_len();
for (int i = 0; i < root_len; i++) {
Gfs_nde app_nde = root.Subs_get_at(i);
Gfs_nde cfgs_nde = app_nde.Subs_get_at(0);
Gfs_nde get_nde = cfgs_nde.Subs_get_at(0);
Gfs_nde key_atr = get_nde.Atrs_get_at(0);
Gfs_nde val_nde = get_nde.Subs_get_at(0);
Gfs_nde val_atr = val_nde.Atrs_get_at(0);
String key = String_.new_u8(key_atr.Name_bry(src));
hash.Add(key, Keyval_.new_(key, String_.new_u8(val_atr.Name_bry(src))));
}
// consolidate io.cmd
List_adp deleted = List_adp_.New();
int len = hash.Len();
for (int i = 0; i < len; i++) {
Keyval args_kv = (Keyval)hash.Get_at(i);
String args_kv_key = args_kv.Key();
String args_kv_val = args_kv.Val_to_str_or_empty();
if (String_.Has_at_end(args_kv_key, ".args")) {
Keyval cmd_kv = (Keyval)hash.Get_by(String_.Replace(args_kv_key, ".args", ".cmd"));
if (cmd_kv == null) {
Gfo_usr_dlg_.Instance.Log_many("", "", "cfg.convert:could not find cmd; key=~{0} val=~{1}", args_kv_key, args_kv.Val());
continue;
}
String cmd_kv_val = cmd_kv.Val_to_str_or_empty();
if (!String_.Has_at_end(cmd_kv_val, "|")) cmd_kv_val += "|";
cmd_kv.Val_(cmd_kv_val + args_kv_val);
deleted.Add(args_kv_key);
}
else if (String_.Has_at_bgn(args_kv_key, "app.cfg.get.gui.bnds.init('")) {
args_kv_key = String_.Replace(args_kv_key, "app.cfg.get.gui.bnds.init('", "");
args_kv_key = String_.Replace(args_kv_key, "').src", "");
args_kv_key = "xowa.gui.shortcuts." + args_kv_key;
args_kv.Key_(args_kv_key);
args_kv_val = String_.Replace(args_kv_val, "box='", "");
args_kv_val = String_.Replace(args_kv_val, "';ipt='", "|");
args_kv_val = String_.Replace(args_kv_val, "';", "");
args_kv.Val_(args_kv_val);
}
}
// delete args
len = deleted.Len();
for (int i = 0; i < len; i++) {
String deleted_key = (String)deleted.Get_at(i);
hash.Del(deleted_key);
}
return (Keyval[])hash.To_ary_and_clear(Keyval.class);
}
}