mirror of https://github.com/gnosygnu/xowa
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
177 lines
10 KiB
177 lines
10 KiB
/*
|
|
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;
|
|
import gplx.core.primitives.*; import gplx.core.ios.*; /*IoItmFil, IoItmDir..*/ import gplx.core.ios.streams.*; import gplx.core.ios.loaders.*;
|
|
public class Io_mgr implements Gfo_evt_mgr_owner { // exists primarily to gather all cmds under gplx namespace; otherwise need to use gplx.core.ios whenever copying/deleting file
|
|
public Io_mgr() {evt_mgr = new Gfo_evt_mgr(this);}
|
|
public Gfo_evt_mgr Evt_mgr() {return evt_mgr;} private final Gfo_evt_mgr evt_mgr;
|
|
public boolean Exists(Io_url url) {return url.Type_dir() ? ExistsDir(url) : ExistsFil(url);}
|
|
public boolean ExistsFil(Io_url url) {return IoEnginePool.Instance.Get_by(url.Info().EngineKey()).ExistsFil_api(url);}
|
|
public void ExistsFilOrFail(Io_url url) {if (!ExistsFil(url)) throw Err_.new_wo_type("could not find file", "url", url);}
|
|
public void SaveFilStr(String url, String text) {SaveFilStr_args(Io_url_.new_fil_(url), text).Exec();}
|
|
public void SaveFilStr(Io_url url, String text) {SaveFilStr_args(url, text).Exec();}
|
|
public IoEngine_xrg_saveFilStr SaveFilStr_args(Io_url url, String text) {return IoEngine_xrg_saveFilStr.new_(url, text);}
|
|
public void AppendFilStr(String url, String text) {AppendFilStr(Io_url_.new_fil_(url), text);}
|
|
public void AppendFilStr(Io_url url, String text) {SaveFilStr_args(url, text).Append_(true).Exec();}
|
|
public void DeleteFil(Io_url url) {DeleteFil_args(url).Exec();}
|
|
public IoEngine_xrg_deleteFil DeleteFil_args(Io_url url) {return IoEngine_xrg_deleteFil.new_(url);}
|
|
public void MoveFil(Io_url src, Io_url trg) {IoEngine_xrg_xferFil.move_(src, trg).Exec();}
|
|
public IoEngine_xrg_xferFil MoveFil_args(Io_url src, Io_url trg, boolean overwrite) {return IoEngine_xrg_xferFil.move_(src, trg).Overwrite_(overwrite);}
|
|
public void CopyFil(Io_url src, Io_url trg, boolean overwrite) {IoEngine_xrg_xferFil.copy_(src, trg).Overwrite_(overwrite).Exec();}
|
|
public IoEngine_xrg_xferFil CopyFil_args(Io_url src, Io_url trg, boolean overwrite) {return IoEngine_xrg_xferFil.copy_(src, trg).Overwrite_(overwrite);}
|
|
public IoRecycleBin RecycleBin() {return recycleBin;} private IoRecycleBin recycleBin = IoRecycleBin.Instance;
|
|
public Io_loader Loader() {return loader;} public void Loader_(Io_loader v) {this.loader = v;} private Io_loader loader;
|
|
|
|
public IoStream OpenStreamWrite(Io_url url) {return OpenStreamWrite_args(url).Exec();}
|
|
public IoEngine_xrg_openWrite OpenStreamWrite_args(Io_url url) {return IoEngine_xrg_openWrite.new_(url);}
|
|
public IoItmFil QueryFil(Io_url url) {return IoEnginePool.Instance.Get_by(url.Info().EngineKey()).QueryFil(url);}
|
|
public void UpdateFilAttrib(Io_url url, IoItmAttrib attrib) {IoEnginePool.Instance.Get_by(url.Info().EngineKey()).UpdateFilAttrib(url, attrib);}
|
|
public void UpdateFilModifiedTime(Io_url url, DateAdp modified) {IoEnginePool.Instance.Get_by(url.Info().EngineKey()).UpdateFilModifiedTime(url, modified);}
|
|
|
|
public boolean ExistsDir(Io_url url) {return IoEnginePool.Instance.Get_by(url.Info().EngineKey()).ExistsDir(url);}
|
|
public void CreateDir(Io_url url) {IoEnginePool.Instance.Get_by(url.Info().EngineKey()).CreateDir(url);}
|
|
public boolean CreateDirIfAbsent(Io_url url) {
|
|
boolean exists = ExistsDir(url);
|
|
if (!exists) {
|
|
CreateDir(url);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
public void Create_fil_ary(Io_fil[] fil_ary) {
|
|
for (Io_fil fil : fil_ary)
|
|
SaveFilStr(fil.Url(), fil.Data());
|
|
}
|
|
public Io_url[] QueryDir_fils(Io_url dir) {return QueryDir_args(dir).ExecAsUrlAry();}
|
|
public IoEngine_xrg_queryDir QueryDir_args(Io_url dir) {return IoEngine_xrg_queryDir.new_(dir);}
|
|
public void DeleteDirSubs(Io_url url) {IoEngine_xrg_deleteDir.new_(url).Exec();}
|
|
public IoEngine_xrg_deleteDir DeleteDir_cmd(Io_url url) {return IoEngine_xrg_deleteDir.new_(url);}
|
|
public void DeleteDirDeep(Io_url url) {IoEngine_xrg_deleteDir.new_(url).Recur_().Exec();}
|
|
public void DeleteDirDeep_ary(Io_url... urls) {for (Io_url url : urls) IoEngine_xrg_deleteDir.new_(url).Recur_().Exec();}
|
|
public int Delete_dir_empty(Io_url url) {return Io_mgr_.Delete_dir_empty(url);}
|
|
public void Delete_sub_by_wildcard() {
|
|
}
|
|
public boolean Truncate_fil(Io_url url, long size) {return IoEnginePool.Instance.Get_by(url.Info().EngineKey()).Truncate_fil(url, size);}
|
|
public void MoveDirDeep(Io_url src, Io_url trg) {IoEngine_xrg_xferDir.move_(src, trg).Recur_().Exec();}
|
|
public IoEngine_xrg_xferDir CopyDir_cmd(Io_url src, Io_url trg) {return IoEngine_xrg_xferDir.copy_(src, trg);}
|
|
public void CopyDirSubs(Io_url src, Io_url trg) {IoEngine_xrg_xferDir.copy_(src, trg).Exec();}
|
|
public void CopyDirDeep(Io_url src, Io_url trg) {IoEngine_xrg_xferDir.copy_(src, trg).Recur_().Exec();}
|
|
public void DeleteDirIfEmpty(Io_url url) {
|
|
if (Array_.Len(QueryDir_fils(url)) == 0)
|
|
this.DeleteDirDeep(url);
|
|
}
|
|
public void AliasDir_sysEngine(String srcRoot, String trgRoot) {AliasDir(srcRoot, trgRoot, IoEngine_.SysKey);}
|
|
public void AliasDir(String srcRoot, String trgRoot, String engineKey) {IoUrlInfoRegy.Instance.Reg(IoUrlInfo_.alias_(srcRoot, trgRoot, engineKey));}
|
|
public IoStream OpenStreamRead(Io_url url) {return OpenStreamRead_args(url).ExecAsIoStreamOrFail();}
|
|
public IoEngine_xrg_openRead OpenStreamRead_args(Io_url url) {return IoEngine_xrg_openRead.new_(url);}
|
|
public String LoadFilStr(String url) {return LoadFilStr_args(Io_url_.new_fil_(url)).Exec();}
|
|
public String LoadFilStr(Io_url url) {return LoadFilStr_args(url).Exec();}
|
|
public IoEngine_xrg_loadFilStr LoadFilStr_args(Io_url url) {return IoEngine_xrg_loadFilStr.new_(url);}
|
|
public byte[] LoadFilBryOrNull(Io_url url) {return LoadFilBryOr(url, null);}
|
|
public byte[] LoadFilBryOr(Io_url url, byte[] or) {return ExistsFil(url) ? LoadFilBry(url) : or;}
|
|
public byte[] LoadFilBry(String url) {return LoadFilBry_reuse(Io_url_.new_fil_(url), Bry_.Empty, Int_obj_ref.New_zero());}
|
|
public byte[] LoadFilBry(Io_url url) {return LoadFilBry_reuse(url, Bry_.Empty, Int_obj_ref.New_zero());}
|
|
public void LoadFilBryByBfr(Io_url url, Bry_bfr bfr) {
|
|
Int_obj_ref len = Int_obj_ref.New_zero();
|
|
byte[] bry = LoadFilBry_reuse(url, Bry_.Empty, len);
|
|
bfr.Bfr_init(bry, len.Val());
|
|
}
|
|
public static final byte[] LoadFilBry_fail = Bry_.Empty;
|
|
public byte[] LoadFilBry_reuse(Io_url url, byte[] ary, Int_obj_ref ary_len) {
|
|
if (loader != null) {
|
|
byte[] rv = loader.Load_fil_as_bry(url);
|
|
if (rv != null) return rv;
|
|
}
|
|
if (!ExistsFil(url)) {
|
|
ary_len.Val_(0);
|
|
return LoadFilBry_fail;
|
|
}
|
|
IoStream stream = IoStream_.Null;
|
|
try {
|
|
stream = OpenStreamRead(url);
|
|
int stream_len = (int)stream.Len();
|
|
ary_len.Val_(stream_len);
|
|
if (stream_len > ary.length)
|
|
ary = new byte[stream_len];
|
|
stream.ReadAry(ary);
|
|
return ary;
|
|
}
|
|
catch (Exception e) {throw Err_.new_wo_type("failed to load file", "url", url.Xto_api(), "e", Err_.Message_lang(e));}
|
|
finally {stream.Rls();}
|
|
}
|
|
public byte[] LoadFilBry_loose(Io_url url) {return Bry_.new_u8(LoadFilStr_loose(url));}
|
|
public String LoadFilStr_loose(Io_url url) {
|
|
String rv = LoadFilStr_args(url).BomUtf8Convert_(Bool_.Y).MissingIgnored_(Bool_.Y).Exec();
|
|
if (String_.Has(rv, "\r\n"))
|
|
rv = String_.Replace(rv, "\r\n", "\n");
|
|
return rv;
|
|
}
|
|
public void AppendFilBfr(Io_url url, Bry_bfr bfr) {AppendFilByt(url, bfr.Bfr(), 0, bfr.Len()); bfr.ClearAndReset();}
|
|
public void AppendFilByt(Io_url url, byte[] val) {AppendFilByt(url, val, 0, val.length);}
|
|
public void AppendFilByt(Io_url url, byte[] val, int len) {AppendFilByt(url, val, 0, len);}
|
|
public void AppendFilByt(Io_url url, byte[] val, int bgn, int len) {
|
|
IoStream stream = IoStream_.Null;
|
|
try {
|
|
stream = OpenStreamWrite_args(url).Mode_(IoStream_.Mode_wtr_append).Exec();
|
|
stream.Write(val, bgn, len);
|
|
} finally {stream.Rls();}
|
|
}
|
|
public void SaveFilBfr(Io_url url, Bry_bfr bfr) {SaveFilBry(url, bfr.Bfr(), bfr.Len()); bfr.Clear();}
|
|
public void SaveFilBry(String urlStr, byte[] val) {SaveFilBry(Io_url_.new_fil_(urlStr), val);}
|
|
public void SaveFilBry(Io_url url, byte[] val) {SaveFilBry(url, val, val.length);}
|
|
public void SaveFilBry(Io_url url, byte[] val, int len) {SaveFilBry(url, val, 0, len);}
|
|
public void SaveFilBry(Io_url url, byte[] val, int bgn, int len) {
|
|
IoStream stream = IoStream_.Null;
|
|
try {
|
|
stream = OpenStreamWrite(url);
|
|
stream.Write(val, bgn, len);
|
|
} finally {stream.Rls();}
|
|
}
|
|
public IoEngine InitEngine_mem() {return IoEngine_.Mem_init_();}
|
|
public IoEngine InitEngine_mem_(String key) {
|
|
IoEngine engine = IoEngine_.mem_new_(key);
|
|
IoEnginePool.Instance.Add_if_dupe_use_nth(engine);
|
|
IoUrlInfoRegy.Instance.Reg(IoUrlInfo_.mem_(key, key));
|
|
return engine;
|
|
}
|
|
public boolean DownloadFil(String src, Io_url trg) {return IoEngine_xrg_downloadFil.new_(src, trg).Exec();}
|
|
public IoEngine_xrg_downloadFil DownloadFil_args(String src, Io_url trg) {return IoEngine_xrg_downloadFil.new_(src, trg);}
|
|
public static final Io_mgr Instance = new Io_mgr();
|
|
public static final int Len_kb = 1024, Len_mb = 1048576, Len_gb = 1073741824, Len_gb_2 = 2147483647;
|
|
public static final long Len_mb_long = Len_mb;
|
|
public static final long Len_null = -1;
|
|
public static final String Evt__fil_created = "fil_created";
|
|
}
|
|
class Io_mgr_ {
|
|
public static int Delete_dir_empty(Io_url url) {
|
|
IoItmDir dir = Io_mgr.Instance.QueryDir_args(url).ExecAsDir();
|
|
int sub_dirs_len = dir.SubDirs().Count();
|
|
int deleted_dirs = 0;
|
|
for (int i = 0; i < sub_dirs_len; ++i) {
|
|
IoItmDir sub_dir = (IoItmDir)dir.SubDirs().Get_at(i);
|
|
deleted_dirs += Io_mgr.Instance.Delete_dir_empty(sub_dir.Url());
|
|
}
|
|
if ( dir.SubFils().Count() == 0
|
|
&& deleted_dirs == sub_dirs_len
|
|
) {
|
|
Io_mgr.Instance.DeleteDirIfEmpty(url);
|
|
return 1;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
}
|