CompositeStorageProvider.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #nullable enable
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Threading.Tasks;
  5. using Avalonia.Platform.Storage;
  6. namespace Avalonia.X11.NativeDialogs;
  7. internal class CompositeStorageProvider : IStorageProvider
  8. {
  9. private readonly IEnumerable<Func<Task<IStorageProvider?>>> _factories;
  10. public CompositeStorageProvider(IEnumerable<Func<Task<IStorageProvider?>>> factories)
  11. {
  12. _factories = factories;
  13. }
  14. public bool CanOpen => true;
  15. public bool CanSave => true;
  16. public bool CanPickFolder => true;
  17. private async Task<IStorageProvider> EnsureStorageProvider()
  18. {
  19. foreach (var factory in _factories)
  20. {
  21. var provider = await factory();
  22. if (provider is not null)
  23. {
  24. return provider;
  25. }
  26. }
  27. throw new InvalidOperationException("Neither DBus nor GTK are available on the system");
  28. }
  29. public async Task<IReadOnlyList<IStorageFile>> OpenFilePickerAsync(FilePickerOpenOptions options)
  30. {
  31. var provider = await EnsureStorageProvider().ConfigureAwait(false);
  32. return await provider.OpenFilePickerAsync(options).ConfigureAwait(false);
  33. }
  34. public async Task<IStorageFile?> SaveFilePickerAsync(FilePickerSaveOptions options)
  35. {
  36. var provider = await EnsureStorageProvider().ConfigureAwait(false);
  37. return await provider.SaveFilePickerAsync(options).ConfigureAwait(false);
  38. }
  39. public async Task<IReadOnlyList<IStorageFolder>> OpenFolderPickerAsync(FolderPickerOpenOptions options)
  40. {
  41. var provider = await EnsureStorageProvider().ConfigureAwait(false);
  42. return await provider.OpenFolderPickerAsync(options).ConfigureAwait(false);
  43. }
  44. public async Task<IStorageBookmarkFile?> OpenFileBookmarkAsync(string bookmark)
  45. {
  46. var provider = await EnsureStorageProvider().ConfigureAwait(false);
  47. return await provider.OpenFileBookmarkAsync(bookmark).ConfigureAwait(false);
  48. }
  49. public async Task<IStorageBookmarkFolder?> OpenFolderBookmarkAsync(string bookmark)
  50. {
  51. var provider = await EnsureStorageProvider().ConfigureAwait(false);
  52. return await provider.OpenFolderBookmarkAsync(bookmark).ConfigureAwait(false);
  53. }
  54. public async Task<IStorageFile?> TryGetFileFromPathAsync(Uri filePath)
  55. {
  56. var provider = await EnsureStorageProvider().ConfigureAwait(false);
  57. return await provider.TryGetFileFromPathAsync(filePath).ConfigureAwait(false);
  58. }
  59. public async Task<IStorageFolder?> TryGetFolderFromPathAsync(Uri folderPath)
  60. {
  61. var provider = await EnsureStorageProvider().ConfigureAwait(false);
  62. return await provider.TryGetFolderFromPathAsync(folderPath).ConfigureAwait(false);
  63. }
  64. public async Task<IStorageFolder?> TryGetWellKnownFolderAsync(WellKnownFolder wellKnownFolder)
  65. {
  66. var provider = await EnsureStorageProvider().ConfigureAwait(false);
  67. return await provider.TryGetWellKnownFolderAsync(wellKnownFolder).ConfigureAwait(false);
  68. }
  69. }