Only rewrite Replay Files once after Replay is closed, in order to prevent rewriting the Replay multiple times (e.g. if a Thumbnail gets added while viewing it and the Markers are added upon exiting). This also fixes the Windows File System not allowing the Replay Mod to delete the original .mcpr file because it thinks that it's still being edited.

Resolves https://trello.com/c/CmKfRKc0/
This commit is contained in:
CrushedPixel
2015-07-02 14:40:17 +02:00
parent e1c19d7537
commit 4a2c7df25f
2 changed files with 40 additions and 53 deletions

View File

@@ -104,7 +104,6 @@ public class ReplayMod {
replayFileAppender = new ReplayFileAppender();
FMLCommonHandler.instance().bus().register(replayFileAppender);
replayFileAppender.start();
}
@EventHandler

View File

@@ -16,7 +16,7 @@ import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentLinkedQueue;
public class ReplayFileAppender extends Thread {
public class ReplayFileAppender {
private Multimap<File, Pair<File, String>> filesToMove = ArrayListMultimap.create();
private Queue<File> filesToRewrite = new ConcurrentLinkedQueue<File>();
@@ -49,15 +49,6 @@ public class ReplayFileAppender extends Thread {
callListeners();
}
public ReplayFileAppender() {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
ReplayFileAppender.this.shutdown();
}
}, "replaymod-file-appender-shutdown"));
}
public void registerModifiedFile(File toAdd, String name, File replayFile) {
//first, remove any files with the same name assigned to this Replay File
for (Iterator<Pair<File, String>> iter = filesToMove.get(replayFile).iterator(); iter.hasNext(); ) {
@@ -75,10 +66,6 @@ public class ReplayFileAppender extends Thread {
}
}
public void shutdown() {
interrupt();
}
public void addFinishListener(GuiReplaySaving gui) {
listeners.add(gui);
}
@@ -87,53 +74,54 @@ public class ReplayFileAppender extends Thread {
public void onReplayExit(ReplayExitEvent event) {
if(!filesToRewrite.isEmpty()) {
openGuiSavingScreen();
writeFiles();
}
}
@Override
public void run() {
while(!Thread.interrupted() || !filesToRewrite.isEmpty()) {
File replayFile = filesToRewrite.poll();
if(replayFile != null) {
if(replayFile.canWrite()) {
try {
HashMap<String, File> toAdd = new HashMap<String, File>();
for(Pair<File, String> p : filesToMove.get(replayFile)) {
if(p.getLeft() == null || p.getLeft().exists()) {
toAdd.put(p.getRight(), p.getLeft());
}
}
ReplayFileIO.addFilesToZip(replayFile, toAdd);
//delete all written files
for(Pair<File, String> p : filesToMove.get(replayFile)) {
if(p.getLeft() != null) {
try {
FileUtils.forceDelete(p.getLeft());
} catch (IOException e) {
e.printStackTrace();
private void writeFiles() {
new Thread(new Runnable() {
@Override
public void run() {
while(!filesToRewrite.isEmpty()) {
File replayFile = filesToRewrite.poll();
if(replayFile != null) {
if(replayFile.canWrite()) {
try {
HashMap<String, File> toAdd = new HashMap<String, File>();
for(Pair<File, String> p : filesToMove.get(replayFile)) {
if(p.getLeft() == null || p.getLeft().exists()) {
toAdd.put(p.getRight(), p.getLeft());
}
}
ReplayFileIO.addFilesToZip(replayFile, toAdd);
//delete all written files
for(Pair<File, String> p : filesToMove.get(replayFile)) {
if(p.getLeft() != null) {
try {
FileUtils.forceDelete(p.getLeft());
} catch (IOException e) {
e.printStackTrace();
}
}
}
filesToMove.removeAll(replayFile);
} catch(Exception e) {
e.printStackTrace();
filesToRewrite.add(replayFile);
} finally {
callListeners();
}
} else {
filesToRewrite.add(replayFile);
}
filesToMove.removeAll(replayFile);
} catch(Exception e) {
e.printStackTrace();
filesToRewrite.add(replayFile);
} finally {
callListeners();
}
} else {
filesToRewrite.add(replayFile);
}
callListeners();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
interrupt();
}
}
}, "replay-file-appender").start();
}
public void callListeners() {