Skip to content

Commit 1482363

Browse files
authored
Merge pull request #182 from LostLuma/fix-config-file-saving-issues
Fix config file de/serialization issues
2 parents 854cdd9 + d406032 commit 1482363

File tree

2 files changed

+31
-12
lines changed

2 files changed

+31
-12
lines changed

platforms/common/src/main/java/dynamic_fps/impl/config/DynamicFPSConfig.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public final class DynamicFPSConfig {
1414
@SerializedName("states")
1515
private final Map<PowerState, Config> configs;
1616

17-
DynamicFPSConfig(boolean enabled, int abandonTime, boolean uncapMenuFrameRate, Map<PowerState, Config> configs) {
17+
private DynamicFPSConfig(boolean enabled, int abandonTime, boolean uncapMenuFrameRate, Map<PowerState, Config> configs) {
1818
this.enabled = enabled;
1919
this.idleTime = abandonTime;
2020
this.uncapMenuFrameRate = uncapMenuFrameRate;
@@ -28,6 +28,18 @@ public final class DynamicFPSConfig {
2828
}
2929
}
3030

31+
public static DynamicFPSConfig createDefault() {
32+
DynamicFPSConfig instance = new DynamicFPSConfig(
33+
true,
34+
0,
35+
false,
36+
new EnumMap<>(PowerState.class)
37+
);
38+
39+
instance.save();
40+
return instance;
41+
}
42+
3143
public Config get(PowerState state) {
3244
if (state == PowerState.FOCUSED) {
3345
return Config.ACTIVE;

platforms/common/src/main/java/dynamic_fps/impl/config/Serialization.java

+18-11
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import dynamic_fps.impl.GraphicsState;
1717
import dynamic_fps.impl.PowerState;
1818
import dynamic_fps.impl.service.Platform;
19-
import net.minecraft.sounds.SoundSource;
19+
import dynamic_fps.impl.util.Logging;
2020
import org.jetbrains.annotations.Nullable;
2121

2222
import java.io.IOException;
@@ -26,7 +26,6 @@
2626
import java.nio.file.NoSuchFileException;
2727
import java.nio.file.Path;
2828
import java.nio.file.StandardCopyOption;
29-
import java.util.EnumMap;
3029
import java.util.Locale;
3130
import java.util.Map;
3231

@@ -53,13 +52,21 @@ public static void save(DynamicFPSConfig instance) {
5352
Path temp = Files.createTempFile(cache, "config", ".json");
5453

5554
Files.write(temp, data.getBytes(StandardCharsets.UTF_8));
56-
Files.move(temp, config, StandardCopyOption.ATOMIC_MOVE);
55+
Serialization.move(temp, config); // Attempt atomic move, fall back otherwise.
5756
} catch (IOException e) {
5857
// Cloth Config's built-in saving does not support catching exceptions :(
5958
throw new RuntimeException("Failed to save or modify Dynamic FPS config!", e);
6059
}
6160
}
6261

62+
private static void move(Path from, Path to) throws IOException {
63+
try {
64+
Files.move(from, to, StandardCopyOption.ATOMIC_MOVE);
65+
} catch (IOException | UnsupportedOperationException e) {
66+
Files.move(from, to, StandardCopyOption.REPLACE_EXISTING);
67+
}
68+
}
69+
6370
@SuppressWarnings("deprecation")
6471
public static DynamicFPSConfig load() {
6572
byte[] data;
@@ -68,18 +75,18 @@ public static DynamicFPSConfig load() {
6875
try {
6976
data = Files.readAllBytes(config);
7077
} catch (NoSuchFileException e) {
71-
DynamicFPSConfig instance = new DynamicFPSConfig(
72-
true,
73-
0,
74-
false,
75-
new EnumMap<>(PowerState.class)
76-
);
77-
instance.save();
78-
return instance;
78+
return DynamicFPSConfig.createDefault();
7979
} catch (IOException e) {
8080
throw new RuntimeException("Failed to load Dynamic FPS config.", e);
8181
}
8282

83+
// Sometimes when the config failed to save properly it'll end up being only null bytes.
84+
// Since most users don't seem to know how to deal with this we'll just replace the config.
85+
if (data[0] == 0) {
86+
Logging.getLogger().warn("Dynamic FPS config corrupted! Recreating from defaults ...");
87+
return DynamicFPSConfig.createDefault();
88+
}
89+
8390
JsonElement root = new JsonParser().parse(new String(data, StandardCharsets.UTF_8));
8491

8592
upgradeConfig((JsonObject) root);

0 commit comments

Comments
 (0)