Skip to content

Commit c679357

Browse files
committed
Init
1 parent 5816c12 commit c679357

8 files changed

+204
-115
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Diagnostics;
6+
using System.Runtime.CompilerServices;
7+
using System.Runtime.InteropServices;
8+
using Windows.Win32.Foundation;
9+
10+
namespace Windows.Win32.System.WinRT
11+
{
12+
public unsafe struct IStorageProviderQuotaUI : IComIID
13+
{
14+
private void** lpVtbl;
15+
16+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
17+
public HRESULT GetQuotaTotalInBytes(ulong* value)
18+
{
19+
return ((delegate* unmanaged[Stdcall]<IStorageProviderQuotaUI*, ulong*, HRESULT>)(lpVtbl[6]))((IStorageProviderQuotaUI*)Unsafe.AsPointer(ref this), value);
20+
}
21+
22+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
23+
public HRESULT GetQuotaUsedInBytes(ulong* value)
24+
{
25+
return ((delegate* unmanaged[Stdcall]<IStorageProviderQuotaUI*, ulong*, HRESULT>)(lpVtbl[8]))((IStorageProviderQuotaUI*)Unsafe.AsPointer(ref this), value);
26+
}
27+
28+
public static ref readonly Guid Guid
29+
{
30+
get
31+
{
32+
// BA6295C3-312E-544F-9FD5-1F81B21F3649
33+
ReadOnlySpan<byte> data =
34+
[
35+
0xC3, 0x95, 0x62, 0xBA,
36+
0x2E, 0x31,
37+
0x4F, 0x54,
38+
0x9F, 0xD5,
39+
0x1F, 0x81, 0xB2, 0x1F, 0x36, 0x49
40+
];
41+
42+
Debug.Assert(data.Length == sizeof(Guid));
43+
return ref Unsafe.As<byte, Guid>(ref MemoryMarshal.GetReference(data));
44+
}
45+
}
46+
}
47+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Diagnostics;
6+
using System.Runtime.CompilerServices;
7+
using System.Runtime.InteropServices;
8+
using Windows.Win32.Foundation;
9+
10+
namespace Windows.Win32.System.WinRT
11+
{
12+
public unsafe struct IStorageProviderStatusUI : IComIID
13+
{
14+
private void** lpVtbl;
15+
16+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
17+
public HRESULT GetQuotaUI(nint* result)
18+
{
19+
return ((delegate* unmanaged[Stdcall]<IStorageProviderStatusUI*, nint*, HRESULT>)lpVtbl[14])((IStorageProviderStatusUI*)Unsafe.AsPointer(ref this), result);
20+
}
21+
22+
public static ref readonly Guid Guid
23+
{
24+
get
25+
{
26+
// d6b6a758-198d-5b80-977f-5ff73da33118
27+
ReadOnlySpan<byte> data =
28+
[
29+
0x58, 0xa7, 0xb6, 0xd6,
30+
0x8d, 0x19,
31+
0x80, 0x5b,
32+
0x97, 0x7f,
33+
0x5f, 0xf7, 0x3d, 0xa3, 0x31, 0x18
34+
];
35+
36+
Debug.Assert(data.Length == sizeof(Guid));
37+
return ref Unsafe.As<byte, Guid>(ref MemoryMarshal.GetReference(data));
38+
}
39+
}
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Diagnostics;
6+
using System.Runtime.CompilerServices;
7+
using System.Runtime.InteropServices;
8+
using Windows.Win32.Foundation;
9+
10+
namespace Windows.Win32.System.WinRT
11+
{
12+
public unsafe struct IStorageProviderStatusUISource : IComIID
13+
{
14+
private void** lpVtbl;
15+
16+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
17+
public HRESULT GetStatusUI(IStorageProviderStatusUI** result)
18+
{
19+
return ((delegate* unmanaged[Stdcall]<IStorageProviderStatusUISource*, IStorageProviderStatusUI**, HRESULT>)lpVtbl[6])((IStorageProviderStatusUISource*)Unsafe.AsPointer(ref this), result);
20+
}
21+
22+
public static ref readonly Guid Guid
23+
{
24+
get
25+
{
26+
// A306C249-3D66-5E70-9007-E43DF96051FF
27+
ReadOnlySpan<byte> data =
28+
[
29+
0x49, 0xc2, 0x06, 0xa3,
30+
0x66, 0x3d,
31+
0x70, 0x5e,
32+
0x90, 0x07,
33+
0xe4, 0x3d, 0xf9, 0x60, 0x51, 0xff
34+
];
35+
36+
Debug.Assert(data.Length == sizeof(Guid));
37+
return ref Unsafe.As<byte, Guid>(ref MemoryMarshal.GetReference(data));
38+
}
39+
}
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Diagnostics;
6+
using System.Runtime.CompilerServices;
7+
using System.Runtime.InteropServices;
8+
using Windows.Win32.Foundation;
9+
10+
namespace Windows.Win32.System.WinRT
11+
{
12+
public unsafe struct IStorageProviderStatusUISourceFactory : IComIID
13+
{
14+
private void** lpVtbl;
15+
16+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
17+
public HRESULT GetStatusUISource(nint syncRootId, IStorageProviderStatusUISource** result)
18+
{
19+
return ((delegate* unmanaged[Stdcall]<IStorageProviderStatusUISourceFactory*, nint, IStorageProviderStatusUISource**, HRESULT>)lpVtbl[6])((IStorageProviderStatusUISourceFactory*)Unsafe.AsPointer(ref this), syncRootId, result);
20+
}
21+
22+
public static ref readonly Guid Guid
23+
{
24+
get
25+
{
26+
// 12E46B74-4E5A-58D1-A62F-0376E8EE7DD8
27+
ReadOnlySpan<byte> data =
28+
[
29+
0x74, 0x6b, 0xe4, 0x12,
30+
0x5a, 0x4e,
31+
0xd1, 0x58,
32+
0xa6, 0x2f,
33+
0x03, 0x76, 0xe8, 0xee, 0x7d, 0xd8
34+
];
35+
36+
Debug.Assert(data.Length == sizeof(Guid));
37+
return ref Unsafe.As<byte, Guid>(ref MemoryMarshal.GetReference(data));
38+
}
39+
}
40+
}
41+
}

src/Files.App/Utils/Storage/Helpers/SyncRootHelpers.cs

+34-115
Original file line numberDiff line numberDiff line change
@@ -1,144 +1,63 @@
1-
using Microsoft.Win32;
1+
// Copyright (c) Files Community
2+
// Licensed under the MIT License.
3+
4+
using Microsoft.Win32;
25
using System.Runtime.CompilerServices;
36
using System.Runtime.InteropServices;
4-
using Windows.Storage.Provider;
57
using Windows.Win32;
68
using Windows.Win32.Foundation;
9+
using Windows.Win32.System.Com;
10+
using Windows.Win32.System.WinRT;
711
using WinRT;
812

913
namespace Files.App.Utils.Storage
1014
{
1115
internal static class SyncRootHelpers
1216
{
13-
private unsafe struct IStorageProviderStatusUISourceFactory : IComIID
14-
{
15-
private void** vtbl;
16-
17-
[MethodImpl(MethodImplOptions.AggressiveInlining)]
18-
public HRESULT GetStatusUISource(nint syncRootId, IStorageProviderStatusUISource** result)
19-
{
20-
return ((delegate* unmanaged[Stdcall]<IStorageProviderStatusUISourceFactory*, nint, IStorageProviderStatusUISource**, HRESULT>)vtbl[6])((IStorageProviderStatusUISourceFactory*)Unsafe.AsPointer(ref this), syncRootId, result);
21-
}
22-
23-
public static ref readonly Guid Guid
24-
{
25-
get
26-
{
27-
// 12e46b74-4e5a-58d1-a62f-0376e8ee7dd8
28-
ReadOnlySpan<byte> data = new byte[]
29-
{
30-
0x74, 0x6b, 0xe4, 0x12,
31-
0x5a, 0x4e,
32-
0xd1, 0x58,
33-
0xa6, 0x2f,
34-
0x03, 0x76, 0xe8, 0xee, 0x7d, 0xd8
35-
};
36-
Debug.Assert(data.Length == sizeof(Guid));
37-
return ref Unsafe.As<byte, Guid>(ref MemoryMarshal.GetReference(data));
38-
}
39-
}
40-
}
41-
42-
private unsafe struct IStorageProviderStatusUISource : IComIID
17+
private static unsafe (bool Success, ulong Capacity, ulong Used) GetSyncRootQuotaFromSyncRootId(string syncRootId)
4318
{
44-
private void** vtbl;
45-
46-
public HRESULT GetStatusUI(IStorageProviderStatusUI** result)
47-
{
48-
return ((delegate* unmanaged[Stdcall]<IStorageProviderStatusUISource*, IStorageProviderStatusUI**, HRESULT>)vtbl[6])((IStorageProviderStatusUISource*)Unsafe.AsPointer(ref this), result);
49-
}
50-
51-
public static ref readonly Guid Guid
52-
{
53-
get
54-
{
55-
// a306c249-3d66-5e70-9007-e43df96051ff
56-
ReadOnlySpan<byte> data = new byte[]
57-
{
58-
0x49, 0xc2, 0x06, 0xa3,
59-
0x66, 0x3d,
60-
0x70, 0x5e,
61-
0x90, 0x07,
62-
0xe4, 0x3d, 0xf9, 0x60, 0x51, 0xff
63-
};
64-
Debug.Assert(data.Length == sizeof(Guid));
65-
return ref Unsafe.As<byte, Guid>(ref MemoryMarshal.GetReference(data));
66-
}
67-
}
68-
}
19+
using var key = Registry.LocalMachine.OpenSubKey($"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\SyncRootManager\\{syncRootId}");
20+
if (key?.GetValue("StorageProviderStatusUISourceFactory") is not string factoryClsidString ||
21+
!Guid.TryParse(factoryClsidString, out var factoryClsid))
22+
return (false, 0, 0);
6923

70-
private unsafe struct IStorageProviderStatusUI : IComIID
71-
{
72-
public static ref readonly Guid Guid
73-
{
74-
get
75-
{
76-
// d6b6a758-198d-5b80-977f-5ff73da33118
77-
ReadOnlySpan<byte> data = new byte[]
78-
{
79-
0x58, 0xa7, 0xb6, 0xd6,
80-
0x8d, 0x19,
81-
0x80, 0x5b,
82-
0x97, 0x7f,
83-
0x5f, 0xf7, 0x3d, 0xa3, 0x31, 0x18
84-
};
85-
Debug.Assert(data.Length == sizeof(Guid));
86-
return ref Unsafe.As<byte, Guid>(ref MemoryMarshal.GetReference(data));
87-
}
88-
}
89-
}
24+
ulong ulTotalSize = 0ul, ulUsedSize = 0ul;
25+
using ComPtr<IStorageProviderStatusUISourceFactory> pStorageProviderStatusUISourceFactory = default;
26+
using ComPtr<IStorageProviderStatusUISource> pStorageProviderStatusUISource = default;
27+
using ComPtr<IStorageProviderStatusUI> pStorageProviderStatusUI = default;
28+
using ComPtr<IStorageProviderQuotaUI> pStorageProviderQuotaUI = default;
9029

91-
private static unsafe (bool Success, ulong Capacity, ulong Used) GetSyncRootQuotaFromSyncRootId(string syncRootId)
92-
{
93-
RegistryKey? key;
94-
if ((key = Registry.LocalMachine.OpenSubKey($"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\SyncRootManager\\{syncRootId}")) is null)
95-
{
30+
var hr = PInvoke.CoCreateInstance(
31+
&factoryClsid,
32+
null,
33+
CLSCTX.CLSCTX_LOCAL_SERVER,
34+
(Guid*)Unsafe.AsPointer(ref Unsafe.AsRef(in IStorageProviderStatusUISourceFactory.Guid)),
35+
(void**)pStorageProviderStatusUISourceFactory.GetAddressOf()).ThrowOnFailure();
36+
if (hr.Failed)
9637
return (false, 0, 0);
97-
}
9838

99-
using (key)
39+
var syncRootIdHString = new MarshalString.Pinnable(syncRootId);
40+
fixed (char* pSyncRootIdHString = syncRootIdHString)
10041
{
101-
if (key.GetValue("StorageProviderStatusUISourceFactory") is string statusUIclass)
102-
{
103-
StorageProviderStatusUI statusUI;
104-
using (ComPtr<IStorageProviderStatusUISourceFactory> sourceFactoryNative = default)
105-
{
106-
Guid statusUIclassGuid = Guid.Parse(statusUIclass);
107-
if (PInvoke.CoCreateInstance(&statusUIclassGuid, null, Windows.Win32.System.Com.CLSCTX.CLSCTX_LOCAL_SERVER, (Guid*)Unsafe.AsPointer(ref Unsafe.AsRef(in IStorageProviderStatusUISourceFactory.Guid)), (void**)sourceFactoryNative.GetAddressOf()) != 0)
108-
{
109-
return (false, 0, 0);
110-
}
111-
112-
MarshalString.Pinnable syncRootIdHstring = new(syncRootId);
113-
fixed (char* ptr = syncRootIdHstring)
114-
using (ComPtr<IStorageProviderStatusUISource> sourceNative = default)
115-
{
116-
ExceptionHelpers.ThrowExceptionForHR(sourceFactoryNative.Get()->GetStatusUISource(syncRootIdHstring.GetAbi(), sourceNative.GetAddressOf()));
42+
hr = pStorageProviderStatusUISourceFactory.Get()->GetStatusUISource(syncRootIdHString.GetAbi(), pStorageProviderStatusUISource.GetAddressOf()).ThrowOnFailure();
43+
hr = pStorageProviderStatusUISource.Get()->GetStatusUI(pStorageProviderStatusUI.GetAddressOf()).ThrowOnFailure();
44+
hr = pStorageProviderStatusUI.Get()->GetQuotaUI((nint*)pStorageProviderQuotaUI.GetAddressOf()).ThrowOnFailure();
11745

118-
using (ComPtr<IStorageProviderStatusUI> statusNative = default)
119-
{
120-
ExceptionHelpers.ThrowExceptionForHR(sourceNative.Get()->GetStatusUI(statusNative.GetAddressOf()));
121-
statusUI = StorageProviderStatusUI.FromAbi((nint)statusNative.Get());
122-
}
123-
}
124-
}
125-
return (true, statusUI.QuotaUI.QuotaTotalInBytes, statusUI.QuotaUI.QuotaUsedInBytes);
126-
}
127-
else
128-
{
129-
return (false, 0, 0);
130-
}
46+
hr = pStorageProviderQuotaUI.Get()->GetQuotaTotalInBytes(&ulTotalSize);
47+
hr = pStorageProviderQuotaUI.Get()->GetQuotaUsedInBytes(&ulUsedSize);
13148
}
49+
50+
return (true, ulTotalSize, ulUsedSize);
13251
}
13352

13453
public static async Task<(bool Success, ulong Capacity, ulong Used)> GetSyncRootQuotaAsync(string path)
13554
{
13655
Windows.Storage.StorageFolder folder = await Windows.Storage.StorageFolder.GetFolderFromPathAsync(path);
137-
StorageProviderSyncRootInfo? syncRootInfo = null;
56+
Windows.Storage.Provider.StorageProviderSyncRootInfo? syncRootInfo = null;
13857

13958
try
14059
{
141-
syncRootInfo = StorageProviderSyncRootManager.GetSyncRootInformationForFolder(folder);
60+
syncRootInfo = Windows.Storage.Provider.StorageProviderSyncRootManager.GetSyncRootInformationForFolder(folder);
14261
}
14362
catch
14463
{

0 commit comments

Comments
 (0)