summaryrefslogtreecommitdiff
path: root/NET/worlds/core/ArchiveMaker.java
diff options
context:
space:
mode:
Diffstat (limited to 'NET/worlds/core/ArchiveMaker.java')
-rw-r--r--NET/worlds/core/ArchiveMaker.java395
1 files changed, 395 insertions, 0 deletions
diff --git a/NET/worlds/core/ArchiveMaker.java b/NET/worlds/core/ArchiveMaker.java
new file mode 100644
index 0000000..811bc38
--- /dev/null
+++ b/NET/worlds/core/ArchiveMaker.java
@@ -0,0 +1,395 @@
+/* */ package NET.worlds.core;
+/* */
+/* */ import NET.worlds.console.Console;
+/* */ import NET.worlds.console.PolledDialog;
+/* */ import NET.worlds.network.ProgressBar;
+/* */ import NET.worlds.network.URL;
+/* */ import NET.worlds.scape.FileList;
+/* */ import NET.worlds.scape.Pilot;
+/* */ import NET.worlds.scape.World;
+/* */ import java.awt.Button;
+/* */ import java.awt.Event;
+/* */ import java.awt.GridBagConstraints;
+/* */ import java.awt.GridBagLayout;
+/* */ import java.awt.Insets;
+/* */ import java.awt.Label;
+/* */ import java.io.File;
+/* */ import java.io.FileInputStream;
+/* */ import java.io.FileOutputStream;
+/* */ import java.io.IOException;
+/* */ import java.text.MessageFormat;
+/* */ import java.util.Enumeration;
+/* */ import java.util.Vector;
+/* */ import java.util.zip.CRC32;
+/* */ import java.util.zip.ZipEntry;
+/* */ import java.util.zip.ZipFile;
+/* */ import java.util.zip.ZipOutputStream;
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */
+/* */ public class ArchiveMaker
+/* */ extends PolledDialog
+/* */ {
+/* */ private static final long serialVersionUID = -7620030251122522576L;
+/* */ private static final String extensions = "cmp;mov";
+/* */ private URL sourceURL;
+/* */ private String path;
+/* 50 */ private Label status = new Label("", 0);
+/* */ private Button goButton;
+/* 52 */ private Button closeButton = new Button(
+/* 53 */ Console.message("Close"));
+/* 54 */ private ProgressBar progress = new ProgressBar(1);
+/* */
+/* */ private boolean start;
+/* */ private boolean stop;
+/* */ private boolean finished;
+/* */ private boolean condense;
+/* */
+/* */ public ArchiveMaker(boolean condense)
+/* */ {
+/* 63 */ super(Console.getFrame(), null, condense ? Console.message("Condense-Files") : Console.message("Expand-Files"), true);
+/* 64 */ this.condense = condense;
+/* 65 */ ready();
+/* */ }
+/* */
+/* */ protected void build() {
+/* 69 */ String errStatus = null;
+/* 70 */ Pilot pilot = Pilot.getActive();
+/* 71 */ if (pilot != null) {
+/* 72 */ World world = pilot.getWorld();
+/* 73 */ if (world != null) {
+/* 74 */ this.sourceURL = world.getSourceURL();
+/* 75 */ this.path = this.sourceURL.unalias();
+/* 76 */ this.path = this.path.substring(0, this.path.lastIndexOf('/'));
+/* 77 */ String home = URL.getHome().unalias();
+/* 78 */ if (this.path.startsWith(home)) {
+/* 79 */ File f = new File(URL.make(this.sourceURL, "content.zip")
+/* 80 */ .unalias());
+/* 81 */ if (this.condense) {
+/* 82 */ if (f.exists()) {
+/* 83 */ errStatus = Console.message("Must-expand");
+/* */ }
+/* 85 */ } else if (!f.exists()) {
+/* 86 */ errStatus = Console.message("Must-condense");
+/* */ }
+/* */ } else {
+/* 89 */ errStatus = Console.message("Not-a-home");
+/* */ }
+/* 91 */ } else { errStatus = Console.message("Cant-access-world");
+/* */ }
+/* 93 */ } else { errStatus = Console.message("Cant-access-pilot");
+/* */ }
+/* 95 */ GridBagLayout gbag = new GridBagLayout();
+/* 96 */ setLayout(gbag);
+/* 97 */ GridBagConstraints c = new GridBagConstraints();
+/* 98 */ c.weightx = 0.0D;
+/* 99 */ c.gridwidth = 1;
+/* 100 */ add(gbag, new Label(Console.message("Status"), 2), c);
+/* 101 */ c.weightx = 1.0D;
+/* 102 */ c.gridwidth = 0;
+/* 103 */ c.fill = 2;
+/* 104 */ add(gbag, this.status, c);
+/* 105 */ c.fill = 0;
+/* 106 */ c.weightx = 0.0D;
+/* 107 */ c.gridwidth = 0;
+/* 108 */ this.goButton = new Button(this.condense ? Console.message("Condense") :
+/* 109 */ Console.message("Expand"));
+/* 110 */ add(gbag, this.goButton, c);
+/* 111 */ c.weightx = 1.0D;
+/* 112 */ c.fill = 2;
+/* 113 */ Insets tmp = c.insets;
+/* 114 */ c.insets = new Insets(5, 5, 5, 5);
+/* 115 */ add(gbag, this.progress, c);
+/* 116 */ c.insets = tmp;
+/* 117 */ c.fill = 0;
+/* 118 */ c.weightx = 0.0D;
+/* 119 */ add(gbag, this.closeButton, c);
+/* */
+/* 121 */ if (errStatus != null) {
+/* 122 */ this.status.setText(errStatus);
+/* 123 */ this.goButton.setEnabled(false);
+/* */ } else {
+/* 125 */ String name = this.sourceURL.getAbsolute();
+/* 126 */ name = name.substring(0, name.lastIndexOf('/'));
+/* */
+/* 128 */ Object[] arguments = { new String(name) };
+/* 129 */ if (this.condense) {
+/* 130 */ this.status.setText(MessageFormat.format(
+/* 131 */ Console.message("condense-name"), arguments));
+/* */ } else {
+/* 133 */ this.status.setText(MessageFormat.format(
+/* 134 */ Console.message("expand-name"), arguments));
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* */ public boolean action(Event event, Object what) {
+/* 140 */ Object target = event.target;
+/* 141 */ if (target == this.goButton) {
+/* 142 */ if (!this.start) {
+/* 143 */ this.start = true;
+/* */ } else
+/* 145 */ this.stop = true;
+/* 146 */ } else if (target == this.closeButton) {
+/* 147 */ if ((!this.start) || (this.finished))
+/* 148 */ done(true);
+/* */ } else
+/* 150 */ return false;
+/* 151 */ return true;
+/* */ }
+/* */
+/* */ protected void activeCallback()
+/* */ {
+/* 156 */ if ((!this.start) || (this.finished))
+/* 157 */ return;
+/* 158 */ this.goButton.setLabel(Console.message("Stop"));
+/* 159 */ if (this.condense) {
+/* 160 */ doCondense();
+/* */ } else
+/* 162 */ doExpand();
+/* */ }
+/* */
+/* */ private void doCondense() {
+/* 166 */ this.status.setText(Console.message("Scanning-dir"));
+/* */
+/* */
+/* 169 */ Vector<String> dirs = new Vector();
+/* 170 */ getDirectories(dirs, this.path);
+/* */
+/* 172 */ if (this.stop) {
+/* 173 */ cancelled();
+/* 174 */ return;
+/* */ }
+/* */
+/* */
+/* 178 */ String d = "";
+/* 179 */ int count = dirs.size();
+/* 180 */ for (int i = 0; i < count; i++) {
+/* 181 */ if (d.length() != 0)
+/* 182 */ d = d + ";";
+/* 183 */ d = d + (String)dirs.elementAt(i);
+/* */ }
+/* */
+/* */
+/* 187 */ Vector<String> files = new FileList(d, "cmp;mov").keepPathInfo().dontSort()
+/* 188 */ .getList();
+/* 189 */ count = files.size();
+/* 190 */ String[] list = new String[count];
+/* 191 */ int start = this.path.length() + 1;
+/* 192 */ for (int i = 0; i < count; i++) {
+/* 193 */ list[i] = ((String)files.elementAt(i)).substring(start)
+/* 194 */ .replace('\\', '/').toLowerCase();
+/* */ }
+/* */
+/* 197 */ this.status.setText(Console.message("Sorting-files"));
+/* 198 */ Sort.sort(list);
+/* */
+/* 200 */ if (this.stop) {
+/* 201 */ cancelled();
+/* 202 */ return;
+/* */ }
+/* */
+/* */
+/* 206 */ this.status.setText(Console.message("Building-archive"));
+/* 207 */ String zipFileName = this.path + "/" + "content.zip";
+/* 208 */ boolean deleteOnError = true;
+/* */ try {
+/* 210 */ FileOutputStream fos = new FileOutputStream(zipFileName);
+/* 211 */ ZipOutputStream zs = new ZipOutputStream(fos);
+/* 212 */ zs.setMethod(0);
+/* 213 */ double dlen = list.length;
+/* 214 */ for (int i = 0; (i < list.length) && (!this.stop); i++) {
+/* 215 */ Object[] arguments = { new String(list[i]) };
+/* 216 */ this.status.setText(MessageFormat.format(
+/* 217 */ Console.message("Reading-list"), arguments));
+/* 218 */ File f = new File(this.path + "/" + list[i]);
+/* 219 */ int length = (int)f.length();
+/* 220 */ byte[] data = new byte[length];
+/* 221 */ FileInputStream fis = new FileInputStream(f);
+/* 222 */ fis.read(data);
+/* 223 */ fis.close();
+/* 224 */ CRC32 crc = new CRC32();
+/* 225 */ crc.update(data);
+/* 226 */ this.status.setText(MessageFormat.format(
+/* 227 */ Console.message("Writing-list"), arguments));
+/* 228 */ ZipEntry ze = new ZipEntry(list[i]);
+/* 229 */ ze.setSize(length);
+/* 230 */ ze.setTime(f.lastModified());
+/* 231 */ ze.setCrc(crc.getValue());
+/* 232 */ zs.putNextEntry(ze);
+/* 233 */ zs.write(data, 0, length);
+/* 234 */ zs.closeEntry();
+/* 235 */ this.progress.setProgress((i + 1) / dlen);
+/* */ }
+/* 237 */ zs.finish();
+/* 238 */ zs.close();
+/* 239 */ if (!this.stop)
+/* */ {
+/* */
+/* 242 */ deleteOnError = false;
+/* 243 */ this.goButton.setEnabled(false);
+/* 244 */ Archive.flushAll();
+/* 245 */ for (int i = 0; i < list.length; i++) {
+/* 246 */ Object[] arguments = { new String(list[i]) };
+/* 247 */ this.status.setText(MessageFormat.format(
+/* 248 */ Console.message("Deleting-list"), arguments));
+/* 249 */ File f = new File(this.path + "/" + list[i]);
+/* 250 */ f.delete();
+/* 251 */ this.progress.setProgress((i + 1) / dlen);
+/* */ }
+/* */
+/* */
+/* 255 */ this.status.setText(Console.message("Removing-empty"));
+/* 256 */ count = dirs.size();
+/* 257 */ for (int i = 0; i < count; i++) {
+/* 258 */ File f = new File((String)dirs.elementAt(i));
+/* 259 */ if (f.list().length == 0) {
+/* 260 */ f.delete();
+/* */ }
+/* */ }
+/* 263 */ this.status.setText(Console.message("Done"));
+/* 264 */ this.finished = true;
+/* 265 */ return;
+/* */ }
+/* */ } catch (IOException ioe) {
+/* 268 */ Object[] arguments = { new String(this.status.getText()) };
+/* 269 */ this.status.setText(MessageFormat.format(Console.message("IO-Error"),
+/* 270 */ arguments));
+/* */
+/* 272 */ if (deleteOnError) {
+/* 273 */ File f = new File(zipFileName);
+/* 274 */ f.delete();
+/* */ }
+/* 276 */ this.finished = true;
+/* 277 */ if (this.stop)
+/* 278 */ cancelled();
+/* */ }
+/* */ }
+/* */
+/* 282 */ private void doExpand() { this.status.setText(Console.message("Scanning-archive"));
+/* 283 */ boolean deleteOnError = true;
+/* 284 */ Vector<File> written = new Vector();
+/* */ try {
+/* 286 */ String zipFileName = this.path + "/" + "content.zip";
+/* 287 */ ZipFile zip = new ZipFile(zipFileName);
+/* 288 */ Enumeration<? extends ZipEntry> ents = zip.entries();
+/* 289 */ int count = 0;
+/* 290 */ while ((ents.hasMoreElements()) && (!this.stop)) {
+/* 291 */ count++;
+/* 292 */ ents.nextElement();
+/* */ }
+/* 294 */ String lastDir = "";
+/* 295 */ ents = zip.entries();
+/* 296 */ int i = 0;
+/* 297 */ double dlen = count;
+/* 298 */ while ((ents.hasMoreElements()) && (!this.stop)) {
+/* 299 */ ZipEntry ent = (ZipEntry)ents.nextElement();
+/* 300 */ String name = ent.getName();
+/* 301 */ Object[] arguments = { new String(name) };
+/* 302 */ this.status.setText(MessageFormat.format(
+/* 303 */ Console.message("Checking-name"), arguments));
+/* 304 */ String filePath = this.path + "/" + name;
+/* 305 */ File f = new File(filePath);
+/* 306 */ if (f.exists()) {
+/* 307 */ this.stop = true;
+/* 308 */ this.finished = true;
+/* 309 */ this.status.setText(MessageFormat.format(
+/* 310 */ Console.message("File-exists"), arguments));
+/* 311 */ break;
+/* */ }
+/* 313 */ int index = filePath.lastIndexOf('/');
+/* 314 */ if (index != -1) {
+/* 315 */ String dir = filePath.substring(0, index);
+/* 316 */ if (!dir.equals(lastDir)) {
+/* 317 */ this.status.setText(Console.message("Creating-dir"));
+/* 318 */ File dirs = new File(dir);
+/* 319 */ dirs.mkdirs();
+/* 320 */ lastDir = dir;
+/* */ }
+/* */ }
+/* 323 */ this.status.setText(MessageFormat.format(
+/* 324 */ Console.message("Reading-list"), arguments));
+/* 325 */ byte[] data = Archive.load(zip, ent);
+/* 326 */ this.status.setText(MessageFormat.format(
+/* 327 */ Console.message("Writing-list"), arguments));
+/* 328 */ FileOutputStream fos = new FileOutputStream(f);
+/* 329 */ written.addElement(f);
+/* 330 */ fos.write(data);
+/* 331 */ fos.close();
+/* */
+/* 333 */ this.progress.setProgress(++i / dlen);
+/* */ }
+/* 335 */ zip.close();
+/* 336 */ if (!this.stop)
+/* */ {
+/* 338 */ this.goButton.setEnabled(false);
+/* 339 */ deleteOnError = false;
+/* 340 */ synchronized (Archive.getMutex()) {
+/* 341 */ Archive.flushAll();
+/* 342 */ new File(zipFileName).delete();
+/* */ }
+/* 344 */ this.status.setText(Console.message("Done"));
+/* 345 */ this.finished = true;
+/* 346 */ return;
+/* */ }
+/* */ } catch (IOException ioe) {
+/* 349 */ Object[] arguments = { new String(this.status.getText()) };
+/* 350 */ this.status.setText(MessageFormat.format(Console.message("IO-Error"),
+/* 351 */ arguments));
+/* */
+/* 353 */ if (deleteOnError) {
+/* 354 */ Enumeration<File> e = written.elements();
+/* 355 */ while (e.hasMoreElements())
+/* 356 */ ((File)e.nextElement()).delete();
+/* */ }
+/* 358 */ if (!this.finished) {
+/* 359 */ this.finished = true;
+/* 360 */ if (this.stop)
+/* 361 */ cancelled();
+/* */ }
+/* */ }
+/* */ }
+/* */
+/* 366 */ private void cancelled() { this.finished = true;
+/* 367 */ this.status.setText(Console.message("Cancelled"));
+/* */ }
+/* */
+/* */ protected boolean done(boolean confirmed)
+/* */ {
+/* 372 */ if ((!this.start) || (this.finished))
+/* 373 */ return super.done(confirmed);
+/* 374 */ return true;
+/* */ }
+/* */
+/* */ private static void getDirectories(Vector<String> dirs, String path) {
+/* 378 */ dirs.addElement(path);
+/* 379 */ File dir = new File(path);
+/* 380 */ String[] files = dir.list();
+/* 381 */ for (int i = 0; i < files.length; i++) {
+/* 382 */ String name = path + '/' + files[i];
+/* 383 */ File f = new File(name);
+/* 384 */ if (f.isDirectory()) {
+/* 385 */ getDirectories(dirs, name);
+/* */ }
+/* */ }
+/* */ }
+/* */ }
+
+
+/* Location: C:\Program Files (x86)\Worlds Inc\WorldsPlayer - Win7\lib\worlds.jar!\NET\worlds\core\ArchiveMaker.class
+ * Java compiler version: 6 (50.0)
+ * JD-Core Version: 0.7.1
+ */ \ No newline at end of file