예제 #1
0
        public Task <ImageSource> FindTitleIcon(Title title)
        {
            if (title.ControlNca != null)
            {
                IFileSystem      controlFS = title.ControlNca.OpenFileSystem(NcaSectionType.Data, IntegrityCheckLevel.ErrorOnInvalid);
                DirectoryEntryEx file      = controlFS.EnumerateEntries("/", "icon_*.dat").FirstOrDefault();

                if (file != null)
                {
                    return(new Task <ImageSource>(() =>
                    {
                        try
                        {
                            controlFS.OpenFile(out IFile jpegFile, file.FullPath.ToU8Span(), OpenMode.Read);
                            JpegBitmapDecoder decoder = new JpegBitmapDecoder(jpegFile.AsStream(), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                            decoder.Frames[0].Freeze();
                            return decoder.Frames[0];
                        } catch (Exception)
                        {
                            return null;
                        }
                    }));
                }
            }
            return(null);
        }
예제 #2
0
        public NtStatus FindFilesWithPattern(string fileName, string searchPattern, out IList <FileInformation> files, IDokanFileInfo info)
        {
            IDirectory directory = GetDirectory(fileName, OpenDirectoryMode.All);

            searchPattern = WildcardToRegex(searchPattern);

            files = new List <FileInformation>();
            //if (searchPattern.EndsWith("\"*")) // thanks windows
            //     searchPattern = searchPattern.Replace("\"*", "*");
            try
            {
                directory.GetEntryCount(out long entryCount);
                DirectoryEntry[] entries = new DirectoryEntry[entryCount];

                directory.Read(out entryCount, entries);
                for (int i = 0; i < entryCount; i++)
                {
                    string name = StringUtils.Utf8ZToString(entries[i].Name);
                    if (Regex.IsMatch(name, searchPattern))
                    {
                        DirectoryEntryEx entry = new DirectoryEntryEx(name, FilterPath(fileName) + "/" + name, entries[i].Type, entries[i].Size);
                        files.Add(CreateInfo(entry, FilterPath(entry.FullPath)));
                    }
                }
            } catch (Exception e)
            {
                Console.WriteLine("Exception raised when iterating through directory:\n" + e.Message + "\n" + e.StackTrace);
            }
            return(NtStatus.Success);
        }
예제 #3
0
 public NacpItem(ApplicationControlProperty nacp, SectionItem parentItem, DirectoryEntryEx directoryEntry)
     : base(parentItem, directoryEntry)
 {
     Nacp               = nacp;
     ParentItem         = parentItem ?? throw new ArgumentNullException(nameof(parentItem));
     AddOnContentBaseId = Nacp.AddOnContentBaseId.ToStrId();
 }
예제 #4
0
 private DirectoryEntryItem(IItem parentItem, SectionItem containerSectionItem, DirectoryEntryEx directoryEntry)
 {
     DirectoryEntry       = directoryEntry;
     ContainerSectionItem = containerSectionItem ?? throw new ArgumentNullException(nameof(containerSectionItem));
     ParentItem           = parentItem ?? throw new ArgumentNullException(nameof(parentItem));
     Size = directoryEntry.Size;
 }
예제 #5
0
        internal static DirectoryEntryEx GetDirectoryEntryEx(ref DirectoryEntry entry, string parentPath)
        {
            string name = StringUtils.Utf8ZToString(entry.Name);
            string path = PathTools.Combine(parentPath, name);

            var entryEx = new DirectoryEntryEx(name, path, entry.Type, entry.Size);

            entryEx.Attributes = entry.Attributes;

            return(entryEx);
        }
예제 #6
0
        public CnmtItem(Cnmt cnmt, SectionItem parentSectionItem, DirectoryEntryEx directoryEntry)
            : base(parentSectionItem, directoryEntry)
        {
            Cnmt = cnmt ?? throw new ArgumentNullException(nameof(cnmt));

            ParentItem         = parentSectionItem;
            PatchLevel         = GetPatchLevel(Cnmt.TitleVersion);
            TitleId            = Cnmt.TitleId.ToStrId();
            ApplicationTitleId = Cnmt.ApplicationTitleId.ToStrId();
            PatchTitleId       = Cnmt.PatchTitleId.ToStrId();
            TitleVersion       = Cnmt.TitleVersion?.Version.ToString();
        }
예제 #7
0
        private FileInformation CreateInfo(DirectoryEntryEx entry, string path)
        {
            switch (entry.Type)
            {
            case DirectoryEntryType.File:
                return(CreateInfo(path));

            case DirectoryEntryType.Directory:
                return(CreateInfo(GetDirectory(path, OpenDirectoryMode.All), path));
            }
            return(new FileInformation());
        }
예제 #8
0
        public static IEnumerable <DirectoryEntryEx> EnumerateEntries(this FileSystemClient fs, string path, string searchPattern, SearchOptions searchOptions)
        {
            bool ignoreCase = searchOptions.HasFlag(SearchOptions.CaseInsensitive);
            bool recurse    = searchOptions.HasFlag(SearchOptions.RecurseSubdirectories);

            Result rc = fs.OpenDirectory(out DirectoryHandle sourceHandle, path, OpenDirectoryMode.All);

            if (rc.IsFailure())
            {
                yield break;
            }

            using (sourceHandle)
            {
                while (true)
                {
                    DirectoryEntry dirEntry = default;

                    fs.ReadDirectory(out long entriesRead, SpanHelpers.AsSpan(ref dirEntry), sourceHandle);
                    if (entriesRead == 0)
                    {
                        break;
                    }

                    DirectoryEntryEx entry = GetDirectoryEntryEx(ref dirEntry, path);

                    if (PathTools.MatchesPattern(searchPattern, entry.Name, ignoreCase))
                    {
                        yield return(entry);
                    }

                    if (entry.Type != DirectoryEntryType.Directory || !recurse)
                    {
                        continue;
                    }

                    IEnumerable <DirectoryEntryEx> subEntries =
                        fs.EnumerateEntries(PathTools.Combine(path, entry.Name), searchPattern, searchOptions);

                    foreach (DirectoryEntryEx subEntry in subEntries)
                    {
                        yield return(subEntry);
                    }
                }
            }
        }
예제 #9
0
        public static IEnumerable <DirectoryEntryEx> EnumerateEntries(this IFileSystem fileSystem, string path, string searchPattern, SearchOptions searchOptions)
        {
            bool ignoreCase = searchOptions.HasFlag(SearchOptions.CaseInsensitive);
            bool recurse    = searchOptions.HasFlag(SearchOptions.RecurseSubdirectories);

            IFileSystem fs = fileSystem;

            fileSystem.OpenDirectory(out IDirectory directory, path.ToU8Span(), OpenDirectoryMode.All).ThrowIfFailure();

            while (true)
            {
                DirectoryEntry dirEntry = default;

                directory.Read(out long entriesRead, SpanHelpers.AsSpan(ref dirEntry)).ThrowIfFailure();
                if (entriesRead == 0)
                {
                    break;
                }

                DirectoryEntryEx entry = GetDirectoryEntryEx(ref dirEntry, path);

                if (PathTools.MatchesPattern(searchPattern, entry.Name, ignoreCase))
                {
                    yield return(entry);
                }

                if (entry.Type != DirectoryEntryType.Directory || !recurse)
                {
                    continue;
                }

                IEnumerable <DirectoryEntryEx> subEntries =
                    fs.EnumerateEntries(PathTools.Combine(path, entry.Name), searchPattern,
                                        searchOptions);

                foreach (DirectoryEntryEx subEntry in subEntries)
                {
                    yield return(subEntry);
                }
            }
        }
예제 #10
0
 public MainItem(NsoHeader nsoHeader, SectionItem parentItem, DirectoryEntryEx directoryEntry)
     : base(parentItem, directoryEntry)
 {
     ParentItem = parentItem ?? throw new ArgumentNullException(nameof(parentItem));
     NsoHeader  = nsoHeader;
 }
예제 #11
0
 /// <summary>
 /// Constructor when entry is direct child of another <see cref="DirectoryEntryItem"/>
 /// </summary>
 /// <param name="containerSectionItem"></param>
 /// <param name="directoryEntry"></param>
 /// <param name="parentItem"></param>
 public DirectoryEntryItem(SectionItem containerSectionItem, DirectoryEntryEx directoryEntry, DirectoryEntryItem parentItem)
     : this(parentItem, containerSectionItem, directoryEntry)
 {
     ParentDirectoryEntryItem = parentItem;
 }
예제 #12
0
 /// <summary>
 /// Constructor when entry is direct child of a <see cref="SectionItem"/>
 /// </summary>
 /// <param name="parentItem"></param>
 /// <param name="directoryEntry"></param>
 public DirectoryEntryItem(SectionItem parentItem, DirectoryEntryEx directoryEntry)
     : this(parentItem, parentItem, directoryEntry)
 {
     ParentSectionItem = parentItem;
 }