Exemplo n.º 1
0
            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);
                }
            }
Exemplo n.º 2
0
            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);
            }
Exemplo n.º 3
0
 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);
                 }
             }
         }
     }
 }
Exemplo n.º 4
0
 protected PartitionFileSystemItemViewModel(PartitionFileSystemItemBase partitionFileSystemItem, IServiceProvider serviceProvider)
     : base(partitionFileSystemItem, serviceProvider)
 {
     _partitionFileSystemItem = partitionFileSystemItem;
 }
Exemplo n.º 5
0
        public static NcaItem?FindNcaItem(this PartitionFileSystemItemBase partitionItem, string ncaId)
        {
            var expectedFileName = ncaId;

            return(partitionItem.NcaChildItems.FirstOrDefault(ncaItem => string.Equals(ncaItem.Id, expectedFileName, StringComparison.OrdinalIgnoreCase)));
        }
Exemplo n.º 6
0
        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);
            }
        }