private IEnumerable <CnmtContainer> BuildCnmtContainers(PartitionFileSystemItemBase partitionItem) { // Find all Cnmt (kind of manifest containing contents information such a base title, a patch, etc.) var cnmtItems = partitionItem.FindAllCnmtItems().ToArray(); if (cnmtItems.Length <= 0) { var message = LocalizationManager.Instance.Current.Keys.LoadingError_NoCnmtFound; partitionItem.Errors.Add(message); _logger.LogError(message); } foreach (var cnmtItem in cnmtItems) { var cnmtContainer = new CnmtContainer(cnmtItem); foreach (var cnmtContentEntry in cnmtItem.Cnmt.ContentEntries) { var ncaId = cnmtContentEntry.NcaId.ToStrId(); var parentPartitionFileSystemItem = cnmtItem.ContainerSectionItem.ParentItem.ParentItem; var ncaItem = parentPartitionFileSystemItem.FindNcaItem(ncaId); if (ncaItem == null) { if (cnmtContentEntry.Type == ContentType.DeltaFragment) { _logger.LogWarning(LocalizationManager.Instance.Current.Keys.LoadingError_NcaFileMissing.SafeFormat(ncaId, cnmtContentEntry.Type)); } else { var message = LocalizationManager.Instance.Current.Keys.LoadingError_NcaFileMissing.SafeFormat(ncaId, cnmtContentEntry.Type); parentPartitionFileSystemItem.Errors.Add(message); _logger.LogError(message); } continue; } if (cnmtContentEntry.Type == ContentType.Control) { var nacpItem = ncaItem.FindNacpItem(); if (nacpItem == null) { var message = LocalizationManager.Instance.Current.Keys.LoadingError_NacpFileMissing.SafeFormat(NacpItem.NacpFileName); ncaItem.Errors.Add(message); _logger.LogError(message); } else { cnmtContainer.NacpContainer = LoadContentDetails(nacpItem); } } } yield return(cnmtContainer); } }
private FileOverview FillOverview(FileOverview fileOverview, PartitionFileSystemItemBase partitionItem) { var cnmtContainers = BuildCnmtContainers(partitionItem).ToArray(); var packageType = DeterminePackageType(fileOverview, cnmtContainers); fileOverview.PackageType = packageType; fileOverview.CnmtContainers.AddRange(cnmtContainers); return(fileOverview); }
public static IEnumerable <CnmtItem> FindAllCnmtItems(this PartitionFileSystemItemBase partitionItem) { foreach (var ncaItem in partitionItem.NcaChildItems) { if (ncaItem.ContentType != NcaContentType.Meta) { continue; } foreach (var sectionItem in ncaItem.ChildItems) { foreach (var child in sectionItem.ChildItems) { if (child is CnmtItem cnmtItem) { yield return(cnmtItem); } } } } }
protected PartitionFileSystemItemViewModel(PartitionFileSystemItemBase partitionFileSystemItem, IServiceProvider serviceProvider) : base(partitionFileSystemItem, serviceProvider) { _partitionFileSystemItem = partitionFileSystemItem; }
public static NcaItem?FindNcaItem(this PartitionFileSystemItemBase partitionItem, string ncaId) { var expectedFileName = ncaId; return(partitionItem.NcaChildItems.FirstOrDefault(ncaItem => string.Equals(ncaItem.Id, expectedFileName, StringComparison.OrdinalIgnoreCase))); }
private void BuildChildItems(PartitionFileSystemItemBase parentItem) { try { var partitionFileSystem = parentItem.PartitionFileSystem; var remainingEntries = new List <PartitionFileEntry>(); // First loop on *.tik files to inject title keys in KeySet foreach (var partitionFileEntry in partitionFileSystem.Files) { var fileName = partitionFileEntry.Name; if (!fileName.EndsWith(".tik", StringComparison.OrdinalIgnoreCase)) { remainingEntries.Add(partitionFileEntry); continue; } IFile file; try { file = partitionFileSystem.OpenFile(partitionFileEntry, OpenMode.Read); } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToOpenPartitionFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } Ticket ticket; try { using var asStream = file.AsStream(); ticket = new Ticket(asStream); } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToLoadTicketFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } var ticketItem = new TicketItem(ticket, partitionFileEntry, file, parentItem); try { var rightsId = new RightsId(ticket.RightsId); var accessKey = new AccessKey(ticket.TitleKeyBlock); ticketItem.RightsId = rightsId; ticketItem.AccessKey = accessKey; if (parentItem.KeySet.ExternalKeySet.Get(rightsId, out var existingAccessKey) == Result.Success) { // Here RightID key is already defined if (existingAccessKey != accessKey) { // Replaces the RightID key with the one defined in the ticket parentItem.KeySet.ExternalKeySet.Remove(rightsId); parentItem.KeySet.ExternalKeySet.Add(rightsId, accessKey).ThrowIfFailure(); _logger.LogWarning(LocalizationManager.Instance.Current.Keys.LoadingWarning_TitleIdKeyReplaced.SafeFormat(rightsId.ToString(), accessKey.ToString(), fileName, existingAccessKey)); } else { _logger.LogDebug(LocalizationManager.Instance.Current.Keys.LoadingDebug_TitleIdKeyAlreadyExists.SafeFormat(rightsId.ToString(), accessKey.ToString(), fileName)); } } else { parentItem.KeySet.ExternalKeySet.Add(rightsId, accessKey).ThrowIfFailure(); _logger.LogInformation(LocalizationManager.Instance.Current.Keys.LoadingInfo_TitleIdKeySuccessfullyInjected.SafeFormat(rightsId.ToString(), accessKey.ToString(), fileName)); } } catch (Exception ex) { _logger.LogError(ex, LocalizationManager.Instance.Current.Keys.LoadingError_FailedToLoadTitleIdKey.SafeFormat(fileName, ex.Message)); } parentItem.TicketChildItems.Add(ticketItem); } foreach (var partitionFileEntry in remainingEntries) { IFile file; try { file = partitionFileSystem.OpenFile(partitionFileEntry, OpenMode.Read); } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToOpenPartitionFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } var fileName = partitionFileEntry.Name; if (fileName.EndsWith(".nca", StringComparison.OrdinalIgnoreCase) || fileName.EndsWith(".ncz", StringComparison.OrdinalIgnoreCase)) { Nca nca; try { nca = new Nca(parentItem.KeySet, new FileStorage(file)); } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToLoadNcaFile.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); continue; } var ncaItem = new NcaItem(nca, partitionFileEntry, file, parentItem); BuildChildItems(ncaItem); parentItem.NcaChildItems.Add(ncaItem); } else { var partitionFileEntryItem = new PartitionFileEntryItem(partitionFileEntry, file, parentItem); parentItem.PartitionFileEntryChildItems.Add(partitionFileEntryItem); } } } catch (Exception ex) { OnLoadingException(ex, parentItem); var message = LocalizationManager.Instance.Current.Keys.LoadingError_FailedToLoadPartitionFileSystemContent.SafeFormat(ex.Message); parentItem.Errors.Add(TREE_LOADING_CATEGORY, message); _logger.LogError(ex, message); } }