Add mount and umount functions for winfsp implementation.

This commit is contained in:
2020-09-02 16:53:21 +01:00
parent b1dd940d00
commit 1f869f34ad
2 changed files with 46 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ namespace RomRepoMgr.Core.Filesystem
public class Vfs : IDisposable public class Vfs : IDisposable
{ {
Fuse _fuse; Fuse _fuse;
Winfsp _winfsp;
public static bool IsAvailable => Winfsp.IsAvailable || Fuse.IsAvailable; public static bool IsAvailable => Winfsp.IsAvailable || Fuse.IsAvailable;
@@ -13,13 +14,13 @@ namespace RomRepoMgr.Core.Filesystem
public event EventHandler<System.EventArgs> Umounted; public event EventHandler<System.EventArgs> Umounted;
public void MountTo(string result) public void MountTo(string mountPoint)
{ {
if(Fuse.IsAvailable) if(Fuse.IsAvailable)
{ {
_fuse = new Fuse _fuse = new Fuse
{ {
MountPoint = result MountPoint = mountPoint
}; };
Task.Run(() => Task.Run(() =>
@@ -29,12 +30,29 @@ namespace RomRepoMgr.Core.Filesystem
Umounted?.Invoke(this, System.EventArgs.Empty); Umounted?.Invoke(this, System.EventArgs.Empty);
}); });
} }
else if(Winfsp.IsAvailable)
{
_winfsp = new Winfsp();
bool ret = _winfsp.Mount(mountPoint);
if(ret)
return;
_winfsp = null;
Umounted?.Invoke(this, System.EventArgs.Empty);
}
else
Umounted?.Invoke(this, System.EventArgs.Empty);
} }
public void Umount() public void Umount()
{ {
_fuse?.Umount(); _fuse?.Umount();
_fuse = null; _fuse = null;
_winfsp?.Umount();
_winfsp = null;
Umounted?.Invoke(this, System.EventArgs.Empty);
} }
} }
} }

View File

@@ -1,10 +1,13 @@
using System; using System;
using Fsp; using Fsp;
using Fsp.Interop;
namespace RomRepoMgr.Core.Filesystem namespace RomRepoMgr.Core.Filesystem
{ {
public class Winfsp : FileSystemBase public class Winfsp : FileSystemBase
{ {
FileSystemHost _host;
public static bool IsAvailable public static bool IsAvailable
{ {
get get
@@ -24,5 +27,27 @@ namespace RomRepoMgr.Core.Filesystem
} }
} }
} }
internal bool Mount(string mountPoint)
{
_host = new FileSystemHost(this);
int ret = _host.Mount(mountPoint);
if(ret == STATUS_SUCCESS)
return true;
_host = null;
return false;
}
internal void Umount() => _host?.Unmount();
public override int SetVolumeLabel(string VolumeLabel, out VolumeInfo VolumeInfo)
{
VolumeInfo = default;
return STATUS_MEDIA_WRITE_PROTECTED;
}
} }
} }