-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathPreparationViewModel.cs
More file actions
145 lines (117 loc) · 4.31 KB
/
Copy pathPreparationViewModel.cs
File metadata and controls
145 lines (117 loc) · 4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System.Reactive;
using System.Reactive.Linq;
using System.Reactive.Threading.Tasks;
using PackageInstaller.Core.Services;
using ReactiveUI;
using Sextant;
using Shared.Misc;
using Shared.Services;
namespace PackageInstaller.Core.ModelViews;
public class PreparationViewModel : ReactiveObject, IViewModel, INavigable
{
private readonly IEnumerable<IPlatformDependentPackageManager> _packagesManagers;
private readonly IPath _path;
private readonly IIconThemeManager _iconThemeManager;
private readonly IFile _file;
private readonly IDisposableFiles _disposableFiles;
public readonly struct NavigationParameter
{
public string[] Arguments { get; init; }
}
private readonly IParameterViewStackService _viewStackService;
public string Id { get; } = nameof(PreparationViewModel);
public PreparationViewModel(
IParameterViewStackService viewStackService,
IEnumerable<IPlatformDependentPackageManager> packagesManagers,
IPath path,
IIconThemeManager iconThemeManager,
IFile file,
IDisposableFiles disposableFiles
)
{
_viewStackService = viewStackService;
_packagesManagers = packagesManagers;
_path = path;
_iconThemeManager = iconThemeManager;
_file = file;
_disposableFiles = disposableFiles;
}
public IObservable<Unit> WhenNavigatedTo(INavigationParameter parameter)
{
return Observable.Return(Unit.Default);
}
public IObservable<Unit> WhenNavigatedFrom(INavigationParameter parameter)
{
return Observable.Return(Unit.Default);
}
public IObservable<Unit> WhenNavigatingTo(INavigationParameter parameter)
{
var navParms = parameter.FromNavigationParameter<NavigationParameter>();
return ProcessAsync(navParms.Arguments).ToObservable(RxApp.MainThreadScheduler);
}
public async Task ProcessAsync(string[] arguments)
{
await Task.Delay(10).ConfigureAwait(true);
try
{
if (arguments.Length == 0)
{
NavigateToGettingStarted();
return;
}
await _iconThemeManager.LoadThemesAsync().ConfigureAwait(true);
var packageFilePath = ParseArguments(arguments);
var packageManager = await _packagesManagers
.GetSupportedManagerAsync(packageFilePath)
.ConfigureAwait(true);
var data = await packageManager
.ExtractPackageMetaDataAsync(packageFilePath)
.ConfigureAwait(true);
var navParms = new PackageActionsViewModel.NavigationParameter()
{
PackageFilePath = packageFilePath,
PackageMetaData = data
};
_viewStackService
.PushPage<PackageActionsViewModel>(navParms.ToNavigationParameter())
.Subscribe();
}
catch (Exception e)
{
var navParms = new ErrorViewModel.NavigationParameter() { Exception = e };
_viewStackService
.PushPage<ErrorViewModel>(navParms.ToNavigationParameter())
.Subscribe();
}
}
private void NavigateToGettingStarted()
{
_viewStackService
.PushPage<GettingStartedModelView>(new Sextant.NavigationParameter())
.Subscribe();
}
private FileSystemPath ParseArguments(string[] arguments)
{
if (arguments.Length > 1)
{
throw new Exception(
"Too many arguments passed in. The first argument must be the file path to the debian package."
);
}
var filePath = arguments[0];
if (!_file.Exists(filePath))
{
throw new FileNotFoundException("The file doesn't exist", filePath);
}
var fullPath = _path.GetFullPath(filePath);
if (_path.IsWslNetworkShare(fullPath) || _path.IsNetworkShare(fullPath))
{
// copy the original file to a temp location if it's on a network path
var tempFile = _file.GetTemporaryFilePath(Path.GetExtension(fullPath));
_disposableFiles.AddFiles(tempFile);
_file.CopyFile(fullPath, tempFile);
filePath = tempFile;
}
return _path.ToFileSystemPath(filePath);
}
}