aboutsummaryrefslogtreecommitdiff
path: root/ShiftOS_TheReturn/Paths.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ShiftOS_TheReturn/Paths.cs')
-rw-r--r--ShiftOS_TheReturn/Paths.cs118
1 files changed, 113 insertions, 5 deletions
diff --git a/ShiftOS_TheReturn/Paths.cs b/ShiftOS_TheReturn/Paths.cs
index 4f535d6..5b75ae6 100644
--- a/ShiftOS_TheReturn/Paths.cs
+++ b/ShiftOS_TheReturn/Paths.cs
@@ -35,12 +35,17 @@ using System.Threading;
namespace ShiftOS.Engine
{
+ /// <summary>
+ /// Management class for ShiftFS path variables.
+ /// </summary>
public static class Paths
{
+ /// <summary>
+ /// Initiate the path system.
+ /// </summary>
public static void Init()
{
Locations = new Dictionary<string, string>();
- Locations.Add("classic", "C:\\ShiftOS");
Locations.Add("root", "0:");
AddPath("root", "system");
@@ -61,6 +66,7 @@ namespace ShiftOS.Engine
AddPath("data", "user.dat");
AddPath("data", "notifications.dat");
AddPath("data", "skin");
+ AddPath("skin", "widgets.dat");
AddPath("system", "programs");
AddPath("system", "kernel.sft");
AddPath("system", "conf.sft");
@@ -88,6 +94,10 @@ namespace ShiftOS.Engine
}
+ /// <summary>
+ /// Gets all full paths without their keynames.
+ /// </summary>
+ /// <returns>A string array representing all paths.</returns>
public static string[] GetAllWithoutKey()
{
List<string> strings = new List<string>();
@@ -99,11 +109,19 @@ namespace ShiftOS.Engine
}
+ /// <summary>
+ /// Get the full path using a path key.
+ /// </summary>
+ /// <param name="id">The path key (folder/filename) for the path.</param>
+ /// <returns>The full path.</returns>
public static string GetPath(string id)
{
return Locations[id];
}
+ /// <summary>
+ /// Checks all directories in the path system to see if they exist, and if not, creates them.
+ /// </summary>
private static void CheckPathExistence()
{
foreach(var path in Locations)
@@ -119,8 +137,14 @@ namespace ShiftOS.Engine
}
}
+ /// <summary>
+ /// Gets or sets a <see cref="Dictionary{string, string}"/> representing all paths in the system.
+ /// </summary>
private static Dictionary<string, string> Locations { get; set; }
+ /// <summary>
+ /// Mounts the ShiftOS shared directory to 1:/, creating the directory if it does not exist.
+ /// </summary>
public static void CreateAndMountSharedFolder()
{
if (!System.IO.Directory.Exists(SharedFolder))
@@ -132,29 +156,113 @@ namespace ShiftOS.Engine
mount.Name = "Shared";
Utils.Mount(JsonConvert.SerializeObject(mount));
ScanForDirectories(SharedFolder, 1);
- }
+ //This event-based system allows us to sync the ramdisk from ShiftOS to the host OS.
+ Utils.DirectoryCreated += (dir) =>
+ {
+ try
+ {
+ if (dir.StartsWith("1:/"))
+ {
+ string real = dir.Replace("/", "\\").Replace("1:", SharedFolder);
+ if (!System.IO.Directory.Exists(real))
+ System.IO.Directory.CreateDirectory(real);
+ }
+ }
+ catch { }
+ };
+ Utils.DirectoryDeleted += (dir) =>
+ {
+ try
+ {
+ if (dir.StartsWith("1:/"))
+ {
+ string real = dir.Replace("/", "\\").Replace("1:", SharedFolder);
+ if (System.IO.Directory.Exists(real))
+ System.IO.Directory.Delete(real, true);
+ }
+ }
+ catch { }
+ };
+ Utils.FileWritten += (dir) =>
+ {
+ try
+ {
+ if (dir.StartsWith("1:/"))
+ {
+ string real = dir.Replace("/", "\\").Replace("1:", SharedFolder);
+ System.IO.File.WriteAllBytes(real, ReadAllBytes(dir));
+ }
+ }
+ catch { }
+ };
+
+ Utils.FileDeleted += (dir) =>
+ {
+ try
+ {
+ if (dir.StartsWith("1:/"))
+ {
+ string real = dir.Replace("/", "\\").Replace("1:", SharedFolder);
+ if (System.IO.File.Exists(real))
+ System.IO.File.Delete(real);
+ }
+ }
+ catch { }
+ };
+
+ //This thread will sync the ramdisk from the host OS to ShiftOS.
+ var t = new Thread(() =>
+ {
+ while (!SaveSystem.ShuttingDown)
+ {
+ Thread.Sleep(15000);
+ ScanForDirectories(SharedFolder, 1);
+ }
+ });
+ t.IsBackground = true;
+ t.Start();
+ }
- public static void ScanForDirectories(string folder, int mount)
+ private static void ScanForDirectories(string folder, int mount)
{
foreach (var file in System.IO.Directory.GetFiles(folder))
{
string mfsDir = file.Replace(SharedFolder, $"{mount}:").Replace("\\", "/");
- WriteAllBytes(mfsDir, System.IO.File.ReadAllBytes(file));
+ if (!FileExists(mfsDir))
+ WriteAllBytes(mfsDir, System.IO.File.ReadAllBytes(file));
}
foreach (var directory in System.IO.Directory.GetDirectories(folder))
{
string mfsDir = directory.Replace(SharedFolder, $"{mount}:").Replace("\\", "/");
- CreateDirectory(mfsDir);
+ if(!DirectoryExists(mfsDir))
+ CreateDirectory(mfsDir);
ScanForDirectories(directory, mount);
}
}
+ /// <summary>
+ /// Gets the ShiftOS shared folder.
+ /// </summary>
public static string SharedFolder { get { return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\ShiftOS_Shared"; } }
+
+ /// <summary>
+ /// Gets the location of the ShiftOS.mfs file.
+ /// </summary>
public static string SaveFile { get { return Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\ShiftOS.mfs"; } }
+
+ /// <summary>
+ /// Gets the path of the inner save file.
+ /// </summary>
+ [Obsolete("Not used.")]
public static string SaveFileInner { get { return Locations["save.json"]; } }
+ /// <summary>
+ /// Add a path to the system.
+ /// </summary>
+ /// <param name="parent">The path's parent directory.</param>
+ /// <param name="path">The filename for the path.</param>
public static void AddPath(string parent, string path)
{
Locations.Add(path, Locations[parent] + "/" + path);