mirror of https://github.com/gnosygnu/xowa
parent
42c7bc61fb
commit
c9d1193e7f
@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||
<classpathentry combineaccessrules="false" kind="src" path="/100_core"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
</classpath>
|
@ -0,0 +1,26 @@
|
||||
/*
|
||||
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; import gplx.*;
|
||||
public class Xoa_manifest_item {
|
||||
public Xoa_manifest_item(Io_url src, Io_url trg) {
|
||||
this.src = src;
|
||||
this.trg = trg;
|
||||
}
|
||||
public Io_url Src() {return src;} private final Io_url src;
|
||||
public Io_url Trg() {return trg;} private final Io_url trg;
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
/*
|
||||
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; import gplx.*;
|
||||
public class Xoa_manifest_list {
|
||||
private final Ordered_hash hash = Ordered_hash_.New();
|
||||
public int Len() {return hash.Len();}
|
||||
public Xoa_manifest_item Get_at(int i) {return (Xoa_manifest_item)hash.Get_at(i);}
|
||||
public void Del_at(int i) {
|
||||
Xoa_manifest_item item = (Xoa_manifest_item)hash.Get_at(i);
|
||||
hash.Del(item.Src().Raw());
|
||||
}
|
||||
public void Add(Io_url src, Io_url trg) {
|
||||
Xoa_manifest_item item = new Xoa_manifest_item(src, trg);
|
||||
hash.Add(src.Raw(), item);
|
||||
}
|
||||
public void Save(Bry_bfr bfr) {
|
||||
// save as "src\ttrg\n"
|
||||
int len = hash.Len();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Xoa_manifest_item item = (Xoa_manifest_item)hash.Get_at(i);
|
||||
bfr.Add_str_u8(item.Src().Raw());
|
||||
bfr.Add_byte(Byte_ascii.Tab);
|
||||
bfr.Add_str_u8(item.Trg().Raw());
|
||||
bfr.Add_byte(Byte_ascii.Nl);
|
||||
}
|
||||
}
|
||||
public void Load(byte[] src, int src_bgn, int src_end) {
|
||||
int pos = src_bgn;
|
||||
// load by "src\ttrg\n"
|
||||
while (pos < src_end) {
|
||||
// get pos
|
||||
int tab_pos = Bry_find_.Find_fwd(src, Byte_ascii.Tab, pos, src_end);
|
||||
if (tab_pos == Bry_find_.Not_found) throw Err_.new_wo_type("failed to find tab", "excerpt", Bry_.Mid(src, pos, src_end));
|
||||
int nl_pos = Bry_find_.Find_fwd(src, Byte_ascii.Nl, tab_pos + 1, src_end);
|
||||
if (nl_pos == Bry_find_.Not_found) throw Err_.new_wo_type("failed to find nl", "excerpt", Bry_.Mid(src, pos, src_end));
|
||||
|
||||
// create
|
||||
Io_url src_url = Io_url_.new_fil_(String_.new_u8(src, pos, tab_pos));
|
||||
Io_url trg_url = Io_url_.new_fil_(String_.new_u8(src, tab_pos + 1, nl_pos));
|
||||
Xoa_manifest_item item = new Xoa_manifest_item(src_url, trg_url);
|
||||
hash.Add(src_url.Raw(), item);
|
||||
|
||||
pos = nl_pos + 1;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,113 @@
|
||||
/*
|
||||
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; import gplx.*; import gplx.xowa.*;
|
||||
import gplx.core.envs.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.IOException;
|
||||
import java.net.*;
|
||||
import javax.swing.*;
|
||||
import javax.swing.border.Border;
|
||||
public class Xoa_manifest_view extends JFrame implements Gfo_invk {
|
||||
private final Xoa_manifest_wkr wkr;
|
||||
private String run_xowa_cmd;
|
||||
public Xoa_manifest_view(Io_url manifest_url, Io_url update_root) {
|
||||
super("XOWA Application Update");
|
||||
// init window
|
||||
this.setTitle("XOWA Application Update");
|
||||
try {
|
||||
UIManager.setLookAndFeel(
|
||||
UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception e) {System.out.println(e.getMessage());}
|
||||
this.setSize(700, 580);
|
||||
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
this.setLocationRelativeTo(null);
|
||||
this.setBackground(Color.WHITE);
|
||||
|
||||
// init panel
|
||||
JPanel main_panel = new JPanel();
|
||||
main_panel.setSize(700, 580);
|
||||
this.setContentPane(main_panel);
|
||||
New_text_area(main_panel);
|
||||
run_xowa_lbl = New_link_lbl(this, main_panel, Invk__run_xowa, "<html><a href=\"\" style='color:#b9b9b9;'>Run XOWA</a></html>");
|
||||
this.setVisible(true);
|
||||
this.wkr = new Xoa_manifest_wkr(this);
|
||||
wkr.Init(manifest_url, update_root);
|
||||
}
|
||||
private JTextArea text_area;
|
||||
private JLabel run_xowa_lbl;
|
||||
private JScrollPane New_text_area(JPanel owner) {
|
||||
// init textarea
|
||||
text_area = new JTextArea();
|
||||
text_area.setForeground(Color.BLACK);
|
||||
text_area.setBackground(Color.WHITE);
|
||||
text_area.setMargin(new Insets(0, 0, 0,0));
|
||||
text_area.setLineWrap(true);
|
||||
text_area.setWrapStyleWord(true); // else text will wrap in middle of words
|
||||
text_area.setCaretColor(Color.BLACK);
|
||||
text_area.getCaret().setBlinkRate(0);
|
||||
|
||||
// init scrollpane
|
||||
JScrollPane text_scroll_pane = new JScrollPane(text_area);
|
||||
text_scroll_pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
|
||||
owner.add(text_scroll_pane, BorderLayout.CENTER);
|
||||
text_scroll_pane.setPreferredSize(new Dimension(675, 500));
|
||||
return text_scroll_pane;
|
||||
}
|
||||
private static JLabel New_link_lbl(Gfo_invk invk, JPanel owner, String invk_cmd, String text) {
|
||||
JLabel rv = new JLabel();
|
||||
rv.setText(text);
|
||||
rv.setPreferredSize(new Dimension(80, 20));
|
||||
owner.add(rv, BorderLayout.PAGE_END);
|
||||
return rv;
|
||||
}
|
||||
public void Append(String s) {
|
||||
text_area.setText(text_area.getText() + "> " + s + "\n");
|
||||
}
|
||||
public void Mark_done(String s) {
|
||||
this.run_xowa_cmd = s;
|
||||
run_xowa_lbl.setText("<html><a href=\"\"'>Run XOWA</a></html>");
|
||||
run_xowa_lbl.setCursor(new Cursor(Cursor.HAND_CURSOR));
|
||||
run_xowa_lbl.addMouseListener(new Swing_mouse_adapter(Gfo_invk_cmd.New_by_key(this, Invk__run_xowa)));
|
||||
}
|
||||
public void Run_xowa() {
|
||||
Runtime_.Exec(run_xowa_cmd);
|
||||
System_.Exit();
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk__run_xowa)) Run_xowa();
|
||||
else return Gfo_invk_.Rv_unhandled;
|
||||
return this;
|
||||
} private static final String Invk__run_xowa = "run_xowa";
|
||||
|
||||
public static void Run(Io_url manifest_url, Io_url update_root) {
|
||||
new Xoa_manifest_view(manifest_url, update_root);
|
||||
}
|
||||
}
|
||||
class Swing_mouse_adapter extends MouseAdapter {
|
||||
private final Gfo_invk_cmd cmd;
|
||||
public Swing_mouse_adapter(Gfo_invk_cmd cmd) {this.cmd = cmd;}
|
||||
@Override public void mouseClicked(MouseEvent ev) {
|
||||
try {cmd.Exec();}
|
||||
catch (Exception e) {
|
||||
System.out.println(Err_.Message_gplx_full(e));
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,92 @@
|
||||
/*
|
||||
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; import gplx.*;
|
||||
import gplx.core.envs.*;
|
||||
class Xoa_manifest_wkr {
|
||||
private final Xoa_manifest_view view;
|
||||
private final Xoa_manifest_list list = new Xoa_manifest_list();
|
||||
private Io_url manifest_url, update_root;
|
||||
private String run_xowa_cmd;
|
||||
public Xoa_manifest_wkr(Xoa_manifest_view view) {
|
||||
this.view = view;
|
||||
}
|
||||
public void Init(Io_url manifest_url, Io_url update_root) {
|
||||
// load manifest
|
||||
this.manifest_url = manifest_url;
|
||||
this.update_root = update_root;
|
||||
view.Append("loading manifest from: " + manifest_url.Raw());
|
||||
byte[] src = Io_mgr.Instance.LoadFilBry(manifest_url);
|
||||
|
||||
// parse manifest
|
||||
int nl_pos = Bry_find_.Find_fwd(src, Byte_ascii.Nl);
|
||||
if (nl_pos == Bry_find_.Not_found) throw Err_.new_wo_type("could not find nl in manifest", "manifest_url", manifest_url.Raw());
|
||||
this.run_xowa_cmd = String_.new_u8(src, 0, nl_pos);
|
||||
list.Load(src, nl_pos + 1, src.length);
|
||||
|
||||
this.Wait();
|
||||
}
|
||||
private void Wait() {
|
||||
int tries = 0;
|
||||
while (tries++ < 100) {
|
||||
gplx.core.threads.Thread_adp_.Sleep(1000);
|
||||
if (Copy_files())
|
||||
break;
|
||||
else {
|
||||
String topmost = "#error";
|
||||
if (list.Len() > 0) {
|
||||
Xoa_manifest_item item = (Xoa_manifest_item)list.Get_at(0);
|
||||
topmost = item.Src().Raw();
|
||||
}
|
||||
view.Append("waiting for XOWA to release file: " + topmost);
|
||||
}
|
||||
}
|
||||
this.On_exit();
|
||||
}
|
||||
public void On_exit() {
|
||||
// delte update root and manifest_url
|
||||
view.Append("deleting update dir: " + update_root.Raw());
|
||||
Io_mgr.Instance.DeleteDirDeep(update_root);
|
||||
Io_mgr.Instance.DeleteFil(manifest_url);
|
||||
|
||||
view.Mark_done(run_xowa_cmd);
|
||||
view.Run_xowa();
|
||||
}
|
||||
private boolean Copy_files() {
|
||||
// loop list and copy items
|
||||
int len = list.Len();
|
||||
int idx = 0;
|
||||
for (idx = 0; idx < len; idx++) {
|
||||
Xoa_manifest_item item = (Xoa_manifest_item)list.Get_at(idx);
|
||||
try {
|
||||
Io_mgr.Instance.DeleteFil_args(item.Trg()).MissingFails_off().Exec();
|
||||
Io_mgr.Instance.MoveFil_args(item.Src(), item.Trg(), true).Exec();;
|
||||
view.Append(String_.Format("copied file: src={0} trg={1}", item.Src().Raw(), item.Trg().Raw()));
|
||||
}
|
||||
catch (Exception exc) {
|
||||
view.Append(String_.Format("failed to copy file: src={0} trg={1} err={2}", item.Src().Raw(), item.Trg().Raw(), Err_.Message_lang(exc)));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// remove completed items
|
||||
for (int i = 0; i < idx; i++) {
|
||||
list.Del_at(0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
/*
|
||||
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;
|
||||
import gplx.Io_url_;
|
||||
import gplx.core.envs.*;
|
||||
public class Xowa_app_updater {
|
||||
public static void main(String[] args) {
|
||||
Env_.Init_swt(args, Xowa_app_updater.class);
|
||||
if (args.length == 0) {
|
||||
System.out.println("could not run app_updater; must pass 2 arguments: manifest url and update_root");
|
||||
return;
|
||||
}
|
||||
Xoa_manifest_view.Run(Io_url_.new_fil_(args[0]), Io_url_.new_dir_(args[1]));
|
||||
}
|
||||
}
|
Loading…
Reference in new issue