Skip to content

Commit 8282ae1

Browse files
committed
add EnvironmentUtilities, replace all directory calls with GetEnvironmentDirectory
1 parent 8a48975 commit 8282ae1

7 files changed

Lines changed: 118 additions & 24 deletions

File tree

Volatility/CLI/Commands/ExportResourceCommand.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
using Volatility.Resources;
44
using Volatility.Utilities;
55

6+
using static Volatility.Utilities.EnvironmentUtilities;
7+
68
namespace Volatility.CLI.Commands;
79

810
internal partial class ExportResourceCommand : ICommand
@@ -35,7 +37,13 @@ public async Task Execute()
3537
return;
3638
}
3739

38-
string filePath = $"{Path.Combine("data", "Resources", ResourcePath)}";
40+
string filePath = $"" +
41+
$"{ Path.Combine
42+
(
43+
GetEnvironmentDirectory(EnvironmentDirectory.Resources),
44+
ResourcePath
45+
)
46+
}";
3947

4048
string[] sourceFiles = ICommand.GetFilePathsInDirectory(filePath, ICommand.TargetFileType.Any, Recursive);
4149

Volatility/CLI/Commands/ImportResourceCommand.cs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
using System.Text;
21
using System.Diagnostics;
3-
using System.Security.Cryptography;
42
using System.Text.RegularExpressions;
53

64
using YamlDotNet.Serialization;
75

86
using Volatility.Resources;
97
using Volatility.Utilities;
108

9+
using static Volatility.Utilities.EnvironmentUtilities;
10+
1111
namespace Volatility.CLI.Commands;
1212

1313
internal partial class ImportResourceCommand : ICommand
@@ -99,16 +99,13 @@ public async Task Execute()
9999

100100
var resourceClass = resource.GetType();
101101
var resourceType = resource.GetResourceType();
102-
103-
string dataPath = Path.Combine
102+
103+
string filePath = Path.Combine
104104
(
105-
Directory.GetCurrentDirectory(),
106-
"data",
107-
"Resources"
105+
GetEnvironmentDirectory(EnvironmentDirectory.Resources),
106+
$"{DBToFileRegex().Replace(resource.AssetName, "")}.{resourceType}"
108107
);
109108

110-
string filePath = Path.Combine(dataPath, $"{DBToFileRegex().Replace(resource.AssetName, "")}.{resourceType}");
111-
112109
string? directoryPath = Path.GetDirectoryName(filePath);
113110

114111
Directory.CreateDirectory(directoryPath);
@@ -153,15 +150,24 @@ public async Task Execute()
153150
// Splicer-specific logic. Will need to refactor this pipeline
154151
if (resourceType == ResourceType.Splicer)
155152
{
156-
string sxPath = Path.Combine("tools", $"sx.exe");
157-
bool sxExists = File.Exists(sxPath);
153+
string sxPath = Path.Combine
154+
(
155+
GetEnvironmentDirectory(EnvironmentDirectory.Tools),
156+
"sx.exe"
157+
);
158+
159+
bool sxExists = File.Exists(sxPath);
158160

159161
Splicer? splicer = resource as Splicer;
160162

161163
List<Splicer.Sample>? samples = splicer?.GetLoadedSamples();
162164
for (int i = 0; i < samples?.Count; i++)
163165
{
164-
string sampleDirectory = Path.Combine("data", "Splicer", "Samples");
166+
string sampleDirectory = Path.Combine
167+
(
168+
GetEnvironmentDirectory(EnvironmentDirectory.Splicer),
169+
"Samples"
170+
);
165171

166172
Directory.CreateDirectory(sampleDirectory);
167173

Volatility/CLI/Commands/ImportStringTableCommand.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using YamlDotNet.Serialization;
55
using YamlDotNet.Serialization.NamingConventions;
66

7+
using static Volatility.Utilities.EnvironmentUtilities;
78
using static Volatility.Utilities.ResourceIDUtilities;
89
using static Volatility.Utilities.DictUtilities;
910

@@ -44,7 +45,7 @@ public async Task Execute()
4445

4546
Console.WriteLine($"Importing data from ResourceStringTables into the ResourceDB... this may take a while!");
4647

47-
string directoryPath = Path.Combine(Directory.GetCurrentDirectory(), "data", "ResourceDB");
48+
string directoryPath = GetEnvironmentDirectory(EnvironmentDirectory.ResourceDB);
4849
Directory.CreateDirectory(directoryPath);
4950
string yamlFile = Path.Combine(directoryPath, "ResourceDB.yaml");
5051

Volatility/Resources/Splicer/Splicer.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.Runtime.InteropServices;
22

3-
using Volatility.Utilities;
3+
using static Volatility.Utilities.EnvironmentUtilities;
44

55
namespace Volatility.Resources;
66

@@ -241,7 +241,12 @@ public void LoadDependentSamples(bool recurse = false)
241241
.Distinct()
242242
.ToList();
243243

244-
string dir = Path.Combine(AppContext.BaseDirectory, "data", "Splicer", "Samples");
244+
string dir = Path.Combine
245+
(
246+
GetEnvironmentDirectory(EnvironmentDirectory.Splicer),
247+
"Samples"
248+
);
249+
245250
var files = Directory.GetFiles(dir, "*.snr", recurse ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
246251

247252
var map = new Dictionary<SnrID, byte[]>(needed.Count);
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System.Diagnostics;
2+
using System.Reflection;
3+
4+
namespace Volatility.Utilities;
5+
6+
public static class EnvironmentUtilities
7+
{
8+
public enum EnvironmentDirectory
9+
{
10+
Executable,
11+
Tools,
12+
Data,
13+
ResourceDB,
14+
Resources,
15+
Splicer,
16+
}
17+
18+
private static readonly IReadOnlyDictionary<EnvironmentDirectory, string[]> _relativePaths
19+
= new Dictionary<EnvironmentDirectory, string[]>
20+
{
21+
[EnvironmentDirectory.Executable] = [],
22+
[EnvironmentDirectory.Tools] = ["tools"],
23+
[EnvironmentDirectory.Data] = ["data"],
24+
[EnvironmentDirectory.ResourceDB] = ["data", "ResourceDB"],
25+
[EnvironmentDirectory.Resources] = ["data", "Resources"],
26+
[EnvironmentDirectory.Splicer] = ["data", "Splicer"],
27+
};
28+
29+
public static string GetEnvironmentDirectory(EnvironmentDirectory dir)
30+
{
31+
var baseDir = GetExecutableDirectory();
32+
33+
if (!_relativePaths.TryGetValue(dir, out var segments))
34+
throw new ArgumentOutOfRangeException(nameof(dir), dir, "Unknown environment directory type!");
35+
36+
return segments.Length == 0
37+
? baseDir
38+
: Path.Combine(new[] { baseDir }.Concat(segments).ToArray());
39+
}
40+
41+
public static string GetExecutableDirectory()
42+
{
43+
string? processPath = null;
44+
var ppProp = typeof(Environment).GetProperty("ProcessPath", BindingFlags.Static | BindingFlags.Public);
45+
if (ppProp != null)
46+
{
47+
processPath = ppProp.GetValue(null) as string;
48+
}
49+
50+
if (string.IsNullOrEmpty(processPath) &&
51+
Assembly.GetEntryAssembly()?.Location is string entryLoc &&
52+
!string.IsNullOrEmpty(entryLoc))
53+
{
54+
processPath = entryLoc;
55+
}
56+
57+
if (string.IsNullOrEmpty(processPath))
58+
{
59+
processPath = Process.GetCurrentProcess().MainModule?.FileName;
60+
}
61+
62+
if (string.IsNullOrEmpty(processPath))
63+
throw new InvalidOperationException("Unable to determine the process executable path.");
64+
65+
var exeDir = Path.GetDirectoryName(processPath);
66+
if (string.IsNullOrEmpty(exeDir))
67+
throw new InvalidOperationException($"Cannot determine directory of executable: {processPath}");
68+
69+
return exeDir;
70+
}
71+
}

Volatility/Utilities/PS3TextureUtilities.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
using Volatility.Resources;
44

5+
using static Volatility.Utilities.EnvironmentUtilities;
6+
57
namespace Volatility.Utilities;
68

79
public static class PS3TextureUtilities
@@ -61,7 +63,11 @@ public static void PS3GTFToDDS(byte[] ps3Header, string sourceBitmapPath, string
6163

6264
File.WriteAllBytes($"{destinationBitmapPath}.gtf", gtf);
6365

64-
string gtf2ddsPath = $"tools{Path.DirectorySeparatorChar}gtf2dds.exe";
66+
string gtf2ddsPath = Path.Combine
67+
(
68+
GetEnvironmentDirectory(EnvironmentDirectory.Tools),
69+
"gtf2dds.exe"
70+
);
6571

6672
if (!File.Exists(gtf2ddsPath))
6773
{
@@ -78,7 +84,7 @@ public static void PS3GTFToDDS(byte[] ps3Header, string sourceBitmapPath, string
7884
CreateNoWindow = true
7985
};
8086

81-
if (verbose) Console.WriteLine($"Running: tools{Path.DirectorySeparatorChar}gtf2dds.exe -o \"{destinationBitmapPath}.dds\" \"{destinationBitmapPath}.gtf\"");
87+
if (verbose) Console.WriteLine($"Running: {gtf2ddsPath} -o \"{destinationBitmapPath}.dds\" \"{destinationBitmapPath}.gtf\"");
8288

8389
using (Process process = new Process())
8490
{

Volatility/Utilities/ResourceIDUtilities.cs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Newtonsoft.Json;
66

77
using static Volatility.Utilities.DataUtilities;
8+
using static Volatility.Utilities.EnvironmentUtilities;
89

910
namespace Volatility.Utilities;
1011

@@ -93,9 +94,7 @@ public static string GetNameByResourceID(string id)
9394
{
9495
string path = Path.Combine
9596
(
96-
Directory.GetCurrentDirectory(),
97-
"data",
98-
"ResourceDB",
97+
GetEnvironmentDirectory(EnvironmentDirectory.ResourceDB),
9998
"ResourceDB.json"
10099
);
101100

@@ -113,9 +112,7 @@ public static string GetNameByResourceID(ResourceID id)
113112
{
114113
string path = Path.Combine
115114
(
116-
Directory.GetCurrentDirectory(),
117-
"data",
118-
"ResourceDB",
115+
GetEnvironmentDirectory(EnvironmentDirectory.ResourceDB),
119116
"ResourceDB.json"
120117
);
121118

0 commit comments

Comments
 (0)