mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
204 lines
8.6 KiB
C#
204 lines
8.6 KiB
C#
// /***************************************************************************
|
|
// Aaru Data Preservation Suite
|
|
// ----------------------------------------------------------------------------
|
|
//
|
|
// Filename : BlurayInfoViewModel.cs
|
|
// Author(s) : Natalia Portillo <claunia@claunia.com>
|
|
//
|
|
// Component : GUI view models.
|
|
//
|
|
// --[ Description ] ----------------------------------------------------------
|
|
//
|
|
// View model and code for the Blu-ray information tab.
|
|
//
|
|
// --[ License ] --------------------------------------------------------------
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General public License as
|
|
// published by the Free Software Foundation, either version 3 of the
|
|
// License, or (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
//
|
|
// ----------------------------------------------------------------------------
|
|
// Copyright © 2011-2025 Natalia Portillo
|
|
// ****************************************************************************/
|
|
|
|
using System;
|
|
using System.IO;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Input;
|
|
using Aaru.Decoders.Bluray;
|
|
using Aaru.Decoders.SCSI.MMC;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Platform.Storage;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using JetBrains.Annotations;
|
|
|
|
namespace Aaru.Gui.ViewModels.Tabs;
|
|
|
|
public sealed class BlurayInfoViewModel
|
|
{
|
|
readonly byte[] _burstCuttingArea;
|
|
readonly byte[] _cartridgeStatus;
|
|
readonly byte[] _dds;
|
|
readonly byte[] _discInformation;
|
|
readonly byte[] _pac;
|
|
readonly byte[] _powResources;
|
|
readonly byte[] _rawDfl;
|
|
readonly byte[] _spareAreaInformation;
|
|
readonly byte[] _trackResources;
|
|
readonly Window _view;
|
|
|
|
public BlurayInfoViewModel([CanBeNull] byte[] blurayDiscInformation, [CanBeNull] byte[] blurayBurstCuttingArea,
|
|
[CanBeNull] byte[] blurayDds, [CanBeNull] byte[] blurayCartridgeStatus,
|
|
[CanBeNull] byte[] bluraySpareAreaInformation, [CanBeNull] byte[] blurayPowResources,
|
|
[CanBeNull] byte[] blurayTrackResources, [CanBeNull] byte[] blurayRawDfl,
|
|
[CanBeNull] byte[] blurayPac, Window view)
|
|
{
|
|
_view = view;
|
|
_discInformation = blurayDiscInformation;
|
|
_burstCuttingArea = blurayBurstCuttingArea;
|
|
_dds = blurayDds;
|
|
_cartridgeStatus = blurayCartridgeStatus;
|
|
_spareAreaInformation = bluraySpareAreaInformation;
|
|
_powResources = blurayPowResources;
|
|
_trackResources = blurayTrackResources;
|
|
_rawDfl = blurayRawDfl;
|
|
_pac = blurayPac;
|
|
SaveBlurayDiscInformationCommand = new AsyncRelayCommand(SaveBlurayDiscInformationAsync);
|
|
SaveBlurayBurstCuttingAreaCommand = new AsyncRelayCommand(SaveBlurayBurstCuttingAreaAsync);
|
|
SaveBlurayDdsCommand = new AsyncRelayCommand(SaveBlurayDdsAsync);
|
|
SaveBlurayCartridgeStatusCommand = new AsyncRelayCommand(SaveBlurayCartridgeStatusAsync);
|
|
SaveBluraySpareAreaInformationCommand = new AsyncRelayCommand(SaveBluraySpareAreaInformationAsync);
|
|
SaveBlurayPowResourcesCommand = new AsyncRelayCommand(SaveBlurayPowResourcesAsync);
|
|
SaveBlurayTrackResourcesCommand = new AsyncRelayCommand(SaveBlurayTrackResourcesAsync);
|
|
SaveBlurayRawDflCommand = new AsyncRelayCommand(SaveBlurayRawDflAsync);
|
|
SaveBlurayPacCommand = new AsyncRelayCommand(SaveBlurayPacAsync);
|
|
|
|
if(blurayDiscInformation != null)
|
|
{
|
|
if(blurayDiscInformation.Length == 4096)
|
|
{
|
|
var tmp = new byte[4100];
|
|
Array.Copy(blurayDiscInformation, 0, tmp, 4, 4096);
|
|
blurayDiscInformation = tmp;
|
|
}
|
|
|
|
BlurayDiscInformationText = DI.Prettify(blurayDiscInformation);
|
|
}
|
|
|
|
if(blurayBurstCuttingArea != null)
|
|
{
|
|
if(blurayBurstCuttingArea.Length == 64)
|
|
{
|
|
var tmp = new byte[68];
|
|
Array.Copy(blurayBurstCuttingArea, 0, tmp, 4, 64);
|
|
blurayBurstCuttingArea = tmp;
|
|
}
|
|
|
|
BlurayBurstCuttingAreaText = BCA.Prettify(blurayBurstCuttingArea);
|
|
}
|
|
|
|
if(blurayDds != null)
|
|
{
|
|
if(blurayDds.Length == 96)
|
|
{
|
|
var tmp = new byte[100];
|
|
Array.Copy(blurayDds, 0, tmp, 4, 96);
|
|
blurayDds = tmp;
|
|
}
|
|
|
|
BlurayDdsText = DDS.Prettify(blurayDds);
|
|
}
|
|
|
|
if(blurayCartridgeStatus != null)
|
|
{
|
|
if(blurayCartridgeStatus.Length == 4)
|
|
{
|
|
var tmp = new byte[8];
|
|
Array.Copy(blurayCartridgeStatus, 0, tmp, 4, 4);
|
|
blurayCartridgeStatus = tmp;
|
|
}
|
|
|
|
BlurayCartridgeStatusText = Cartridge.Prettify(blurayCartridgeStatus);
|
|
}
|
|
|
|
if(bluraySpareAreaInformation != null)
|
|
{
|
|
if(bluraySpareAreaInformation.Length == 12)
|
|
{
|
|
var tmp = new byte[16];
|
|
Array.Copy(bluraySpareAreaInformation, 0, tmp, 4, 12);
|
|
bluraySpareAreaInformation = tmp;
|
|
}
|
|
|
|
BluraySpareAreaInformationText = Spare.Prettify(bluraySpareAreaInformation);
|
|
}
|
|
|
|
if(blurayPowResources != null) BlurayPowResourcesText = DiscInformation.Prettify(blurayPowResources);
|
|
|
|
if(blurayTrackResources != null) BlurayTrackResourcesText = DiscInformation.Prettify(blurayTrackResources);
|
|
|
|
SaveBlurayRawDflVisible = blurayRawDfl != null;
|
|
SaveBlurayPacVisible = blurayPac != null;
|
|
}
|
|
|
|
public string BlurayDiscInformationText { get; }
|
|
public string BlurayBurstCuttingAreaText { get; }
|
|
public string BlurayDdsText { get; }
|
|
public string BlurayCartridgeStatusText { get; }
|
|
public string BluraySpareAreaInformationText { get; }
|
|
public string BlurayPowResourcesText { get; }
|
|
public string BlurayTrackResourcesText { get; }
|
|
public ICommand SaveBlurayDiscInformationCommand { get; }
|
|
public ICommand SaveBlurayBurstCuttingAreaCommand { get; }
|
|
public ICommand SaveBlurayDdsCommand { get; }
|
|
public ICommand SaveBlurayCartridgeStatusCommand { get; }
|
|
public ICommand SaveBluraySpareAreaInformationCommand { get; }
|
|
public ICommand SaveBlurayPowResourcesCommand { get; }
|
|
public ICommand SaveBlurayTrackResourcesCommand { get; }
|
|
public ICommand SaveBlurayRawDflCommand { get; }
|
|
public ICommand SaveBlurayPacCommand { get; }
|
|
public bool SaveBlurayRawDflVisible { get; }
|
|
public bool SaveBlurayPacVisible { get; }
|
|
|
|
async Task SaveElementAsync(byte[] data)
|
|
{
|
|
IStorageFile result = await _view.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions
|
|
{
|
|
FileTypeChoices = [FilePickerFileTypes.Binary]
|
|
});
|
|
|
|
if(result is null) return;
|
|
|
|
var saveFs = new FileStream(result.Path.AbsolutePath, FileMode.Create);
|
|
await saveFs.WriteAsync(data, 0, data.Length);
|
|
|
|
saveFs.Close();
|
|
}
|
|
|
|
Task SaveBlurayDiscInformationAsync() => SaveElementAsync(_discInformation);
|
|
|
|
Task SaveBlurayBurstCuttingAreaAsync() => SaveElementAsync(_burstCuttingArea);
|
|
|
|
Task SaveBlurayDdsAsync() => SaveElementAsync(_dds);
|
|
|
|
Task SaveBlurayCartridgeStatusAsync() => SaveElementAsync(_cartridgeStatus);
|
|
|
|
Task SaveBluraySpareAreaInformationAsync() => SaveElementAsync(_spareAreaInformation);
|
|
|
|
Task SaveBlurayPowResourcesAsync() => SaveElementAsync(_powResources);
|
|
|
|
Task SaveBlurayTrackResourcesAsync() => SaveElementAsync(_trackResources);
|
|
|
|
Task SaveBlurayRawDflAsync() => SaveElementAsync(_rawDfl);
|
|
|
|
Task SaveBlurayPacAsync() => SaveElementAsync(_pac);
|
|
} |