mirror of
https://github.com/rbalsleyMSFT/FFU.git
synced 2026-06-14 02:09:35 -06:00
Refactors application management to a new module
Moves ListView manipulation, BYO application import/export, and copy task logic from the main UI script and core UI module into a new `FFUUI.Core.Applications` module. This improves code organization and modularity for application-related features.
This commit is contained in:
@@ -482,159 +482,6 @@ function Get-USBDrives {
|
||||
}
|
||||
}
|
||||
|
||||
# Function to copy a single BYO application (Modified for ForEach-Object -Parallel)
|
||||
function Start-CopyBYOApplicationTask {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
[PSCustomObject]$ApplicationItemData, # Pass data, not the UI object
|
||||
[Parameter(Mandatory)]
|
||||
[string]$AppsPath, # Pass necessary path
|
||||
[Parameter(Mandatory = $true)]
|
||||
[System.Collections.Concurrent.ConcurrentQueue[hashtable]]$ProgressQueue # Add queue parameter
|
||||
# REMOVED: UI-related parameters
|
||||
)
|
||||
|
||||
$priority = $ApplicationItemData.Priority
|
||||
$appName = $ApplicationItemData.Name
|
||||
$commandLine = $ApplicationItemData.CommandLine
|
||||
$arguments = $ApplicationItemData.Arguments
|
||||
$sourcePath = $ApplicationItemData.Source
|
||||
$status = "Starting..." # Initial local status
|
||||
$success = $false
|
||||
|
||||
# Initial status update
|
||||
Invoke-ProgressUpdate -ProgressQueue $ProgressQueue -Identifier $appName -Status $status
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($AppsPath)) {
|
||||
$status = "Error: Apps Path not set"
|
||||
Invoke-ProgressUpdate -ProgressQueue $ProgressQueue -Identifier $appName -Status $status
|
||||
WriteLog "Copy error for $($appName): Apps Path not set."
|
||||
return [PSCustomObject]@{ Name = $appName; Status = $status; Success = $success }
|
||||
}
|
||||
|
||||
if ([string]::IsNullOrWhiteSpace($sourcePath)) {
|
||||
$status = "No source specified"
|
||||
Invoke-ProgressUpdate -ProgressQueue $ProgressQueue -Identifier $appName -Status $status
|
||||
# This isn't an error, just nothing to do. Consider it success.
|
||||
$success = $true
|
||||
return [PSCustomObject]@{ Name = $appName; Status = $status; Success = $success }
|
||||
}
|
||||
|
||||
if (-not (Test-Path -Path $sourcePath -PathType Container)) {
|
||||
$status = "Error: Source path not found"
|
||||
Invoke-ProgressUpdate -ProgressQueue $ProgressQueue -Identifier $appName -Status $status
|
||||
WriteLog "Copy error for $($appName): Source path '$sourcePath' not found."
|
||||
return [PSCustomObject]@{ Name = $appName; Status = $status; Success = $success }
|
||||
}
|
||||
|
||||
$win32BasePath = Join-Path -Path $AppsPath -ChildPath "Win32"
|
||||
$destinationPath = Join-Path -Path $win32BasePath -ChildPath $appName
|
||||
|
||||
try {
|
||||
# Check destination
|
||||
if (Test-Path -Path $destinationPath -PathType Container) {
|
||||
$folderSize = (Get-ChildItem -Path $destinationPath -Recurse | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum
|
||||
if ($folderSize -gt 1MB) {
|
||||
$status = "Already copied"
|
||||
Invoke-ProgressUpdate -ProgressQueue $ProgressQueue -Identifier $appName -Status $status
|
||||
WriteLog "Skipping copy for $($appName): Destination '$destinationPath' exists and has content."
|
||||
$success = $true
|
||||
return [PSCustomObject]@{ Name = $appName; Status = $status; Success = $success }
|
||||
}
|
||||
else {
|
||||
WriteLog "Destination '$destinationPath' exists but is empty/small. Proceeding with copy."
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure base directory exists
|
||||
if (-not (Test-Path -Path $win32BasePath -PathType Container)) {
|
||||
New-Item -Path $win32BasePath -ItemType Directory -Force | Out-Null
|
||||
WriteLog "Created directory: $win32BasePath"
|
||||
}
|
||||
|
||||
# Perform the copy
|
||||
$status = "Copying..."
|
||||
Invoke-ProgressUpdate -ProgressQueue $ProgressQueue -Identifier $appName -Status $status
|
||||
WriteLog "Copying '$sourcePath' to '$destinationPath'..."
|
||||
Copy-Item -Path $sourcePath -Destination $destinationPath -Recurse -Force -ErrorAction Stop
|
||||
$status = "Copied successfully"
|
||||
$success = $true
|
||||
WriteLog "Successfully copied '$appName' to '$destinationPath'."
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Update (or create) UserAppList.json with the copied application
|
||||
# ------------------------------------------------------------------
|
||||
try {
|
||||
WriteLog "Updating UserAppList.json for '$appName'..."
|
||||
$userAppListPath = Join-Path -Path $AppsPath -ChildPath 'UserAppList.json'
|
||||
|
||||
# Build the new entry
|
||||
$newEntry = [pscustomobject]@{
|
||||
Priority = $priority
|
||||
Name = $appName
|
||||
CommandLine = $commandLine
|
||||
Arguments = $arguments
|
||||
Source = $sourcePath
|
||||
}
|
||||
|
||||
# Load existing list if present, ensuring it's always an array
|
||||
if (Test-Path -Path $userAppListPath) {
|
||||
try {
|
||||
# Attempt to load and ensure it's an array
|
||||
$appList = @(Get-Content -Path $userAppListPath -Raw | ConvertFrom-Json -ErrorAction Stop)
|
||||
}
|
||||
catch {
|
||||
WriteLog "Warning: Could not parse '$userAppListPath' or it's not a valid JSON array. Initializing as empty array. Error: $($_.Exception.Message)"
|
||||
$appList = @() # Initialize as empty array on error
|
||||
}
|
||||
}
|
||||
else {
|
||||
$appList = @() # Initialize as empty array if file doesn't exist
|
||||
}
|
||||
|
||||
# Ensure $appList is an array even if ConvertFrom-Json returned $null or a single object somehow
|
||||
if ($null -eq $appList -or $appList -isnot [array]) {
|
||||
# If it was a single object, wrap it in an array. Otherwise, start fresh.
|
||||
$appList = if ($null -ne $appList) { @($appList) } else { @() }
|
||||
}
|
||||
|
||||
# Skip adding if an entry with the same Name already exists
|
||||
if (-not ($appList | Where-Object { $_.Name -eq $newEntry.Name })) {
|
||||
# Now $appList is guaranteed to be an array, so += is safe
|
||||
$appList += $newEntry
|
||||
# Sort by Priority before saving
|
||||
$sortedAppList = $appList | Sort-Object Priority
|
||||
$sortedAppList | ConvertTo-Json -Depth 10 | Set-Content -Path $userAppListPath -Encoding UTF8
|
||||
WriteLog "Added '$($newEntry.Name)' to '$userAppListPath'."
|
||||
}
|
||||
else {
|
||||
WriteLog "'$appName' already exists in '$userAppListPath'."
|
||||
}
|
||||
}
|
||||
catch {
|
||||
WriteLog "Failed to update UserAppList.json for '$appName': $($_.Exception.Message)"
|
||||
}
|
||||
|
||||
}
|
||||
catch {
|
||||
$errorMessage = $_.Exception.Message
|
||||
$status = "Error: $($errorMessage)"
|
||||
WriteLog "Copy error for $($appName): $($errorMessage)"
|
||||
$success = $false
|
||||
# Enqueue error status
|
||||
Invoke-ProgressUpdate -ProgressQueue $ProgressQueue -Identifier $appName -Status $status
|
||||
}
|
||||
|
||||
# Enqueue final success status if applicable
|
||||
if ($success) {
|
||||
Invoke-ProgressUpdate -ProgressQueue $ProgressQueue -Identifier $appName -Status $status
|
||||
}
|
||||
|
||||
# Return the final status
|
||||
return [PSCustomObject]@{ Name = $appName; Status = $status; Success = $success }
|
||||
}
|
||||
|
||||
# --------------------------------------------------------------------------
|
||||
# SECTION: UI Configuration
|
||||
# --------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user